Date: Sat, 16 Sep 2006 18:36:25 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 106216 for review Message-ID: <200609161836.k8GIaPee086105@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=106216 Change 106216 by hselasky@hselasky_mini_itx on 2006/09/16 18:35:25 Make "ums" use the new USB-cdev API. This saves some code. Also parenthesis two unclear expressions, where "complement" and "and" was involved. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/ums.c#12 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/ums.c#12 (text+ko) ==== @@ -84,12 +84,10 @@ #define UMS_BUT(i) ((i) < 3 ? (((i) + 2) % 3) : (i)) struct ums_softc { + struct usb_cdev sc_cdev; struct mtx sc_mtx; - struct usbd_ifqueue sc_rdq_free; - struct usbd_ifqueue sc_rdq_used; struct __callout sc_callout; struct usbd_memory_wait sc_mem_wait; - struct selinfo sc_read_sel; struct hid_location sc_loc_x; struct hid_location sc_loc_y; struct hid_location sc_loc_z; @@ -100,8 +98,6 @@ mousestatus_t sc_status; struct usbd_xfer * sc_xfer[UMS_N_TRANSFER]; - void * sc_mem_ptr_1; - struct cdev * sc_cdev_1; u_int32_t sc_flags; #define UMS_FLAG_X_AXIS 0x0001 @@ -109,31 +105,41 @@ #define UMS_FLAG_Z_AXIS 0x0004 #define UMS_FLAG_T_AXIS 0x0008 #define UMS_FLAG_SBU 0x0010 /* spurious button up events */ -#define UMS_FLAG_SELECT 0x0020 /* select is waiting */ -#define UMS_FLAG_INTR_STALL 0x0040 /* set if transfer error */ -#define UMS_FLAG_GONE 0x0080 /* device is gone */ -#define UMS_FLAG_RD_WUP 0x0100 /* device is waiting for wakeup */ -#define UMS_FLAG_RD_SLP 0x0200 /* device is sleeping */ -#define UMS_FLAG_CLOSING 0x0400 /* device is closing */ -#define UMS_FLAG_DEV_OPEN 0x0800 /* device is open */ +#define UMS_FLAG_INTR_STALL 0x0020 /* set if transfer error */ u_int8_t sc_buttons; u_int8_t sc_iid; - u_int8_t sc_wakeup_read; /* dummy */ - u_int8_t sc_wakeup_sync_1; /* dummy */ }; +static void +ums_put_queue_timeout(void *__sc); + +static void +ums_clear_stall_callback(struct usbd_xfer *xfer); + +static void +ums_intr_callback(struct usbd_xfer *xfer); + static device_probe_t ums_probe; static device_attach_t ums_attach; static device_detach_t ums_detach; -static d_close_t ums_close; + +static void +ums_start_read(struct usb_cdev *cdev); + +static void +ums_stop_read(struct usb_cdev *cdev); +static int32_t +ums_open(struct usb_cdev *cdev, int32_t fflags, + int32_t devtype, struct thread *td); +static int32_t +ums_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t addr, + int32_t fflags, struct thread *td); static void ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy, int32_t dz, int32_t dt, int32_t buttons); -extern cdevsw_t ums_cdevsw; - static void ums_put_queue_timeout(void *__sc) { @@ -283,7 +289,7 @@ if (sc->sc_flags & UMS_FLAG_INTR_STALL) { usbd_transfer_start(sc->sc_xfer[1]); } else { - USBD_IF_POLL(&sc->sc_rdq_free, m); + USBD_IF_POLL(&(sc->sc_cdev.sc_rdq_free), m); if (m) { usbd_start_hardware(xfer); @@ -366,18 +372,17 @@ struct usb_attach_arg *uaa = device_get_ivars(dev); struct ums_softc *sc = device_get_softc(dev); void *d_ptr = NULL; + const char * p_buf[2]; int32_t unit = device_get_unit(dev); int32_t d_len; int32_t isize; u_int32_t flags; - usbd_status err; + int32_t err; u_int8_t i; + char buf_1[16]; DPRINTF(10, "sc=%p\n", sc); - sc->sc_rdq_free.ifq_maxlen = UMS_IFQ_MAXLEN; - sc->sc_rdq_used.ifq_maxlen = UMS_IFQ_MAXLEN; - usbd_set_desc(dev, uaa->device); mtx_init(&(sc->sc_mtx), "ums lock", NULL, MTX_DEF|MTX_RECURSE); @@ -385,14 +390,6 @@ __callout_init_mtx(&(sc->sc_callout), &(sc->sc_mtx), CALLOUT_RETURNUNLOCKED); - sc->sc_mem_ptr_1 = - usbd_alloc_mbufs(M_DEVBUF, &(sc->sc_rdq_free), - UMS_BUF_SIZE, UMS_IFQ_MAXLEN); - - if (sc->sc_mem_ptr_1 == NULL) { - goto detach; - } - err = usbd_transfer_setup(uaa->device, uaa->iface_index, sc->sc_xfer, ums_config, UMS_N_TRANSFER, sc, &(sc->sc_mtx), &(sc->sc_mem_wait)); @@ -481,6 +478,7 @@ } free(d_ptr, M_TEMP); + d_ptr = NULL; #ifdef USB_DEBUG DPRINTF(0, "sc=%p\n", sc); @@ -522,11 +520,25 @@ sc->sc_status.dy = 0; sc->sc_status.dz = 0; - sc->sc_cdev_1 = make_dev - (&ums_cdevsw, unit, UID_ROOT, GID_OPERATOR, 0644, "ums%d", unit); + snprintf(buf_1, sizeof(buf_1), "ums%d", unit); + + p_buf[0] = buf_1; + p_buf[1] = NULL; + + sc->sc_cdev.sc_start_read = &ums_start_read; + sc->sc_cdev.sc_stop_read = &ums_stop_read; + sc->sc_cdev.sc_open = &ums_open; + sc->sc_cdev.sc_ioctl = &ums_ioctl; + sc->sc_cdev.sc_flags |= (USB_CDEV_FLAG_FWD_SHORT| + USB_CDEV_FLAG_WAKEUP_RD_IMMED| + USB_CDEV_FLAG_WAKEUP_WR_IMMED); - if (sc->sc_cdev_1) { - DEV2SC(sc->sc_cdev_1) = sc; + err = usb_cdev_attach(&(sc->sc_cdev), sc, &(sc->sc_mtx), p_buf, + UID_ROOT, GID_OPERATOR, 0644, + UMS_BUF_SIZE, UMS_IFQ_MAXLEN, + 1, 1 /* dummy write buffer */); + if (err) { + goto detach; } return 0; @@ -546,31 +558,10 @@ DPRINTF(0, "sc=%p\n", sc); - mtx_lock(&(sc->sc_mtx)); - sc->sc_flags |= UMS_FLAG_GONE; - mtx_unlock(&(sc->sc_mtx)); - - if (sc->sc_cdev_1) { - - ums_close(sc->sc_cdev_1, 0, 0, 0); - - DEV2SC(sc->sc_cdev_1) = NULL; - - destroy_dev(sc->sc_cdev_1); - } - - mtx_lock(&(sc->sc_mtx)); - - __callout_stop(&(sc->sc_callout)); + usb_cdev_detach(&(sc->sc_cdev)); - mtx_unlock(&(sc->sc_mtx)); - usbd_transfer_unsetup(sc->sc_xfer, UMS_N_TRANSFER); - if (sc->sc_mem_ptr_1) { - free(sc->sc_mem_ptr_1, M_DEVBUF); - } - usbd_transfer_drain(&(sc->sc_mem_wait), &(sc->sc_mtx)); __callout_drain(&(sc->sc_callout)); @@ -580,6 +571,25 @@ return 0; } +static void +ums_start_read(struct usb_cdev *cdev) +{ + struct ums_softc *sc = cdev->sc_priv_ptr; + usbd_transfer_start(sc->sc_xfer[0]); + return; +} + +static void +ums_stop_read(struct usb_cdev *cdev) +{ + struct ums_softc *sc = cdev->sc_priv_ptr; + usbd_transfer_stop(sc->sc_xfer[1]); + usbd_transfer_stop(sc->sc_xfer[0]); + __callout_stop(&(sc->sc_callout)); + return; +} + + #if ((MOUSE_SYS_PACKETSIZE != 8) || \ (MOUSE_MSC_PACKETSIZE != 5)) #error "Software assumptions are not met. Please update code." @@ -589,14 +599,10 @@ ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy, int32_t dz, int32_t dt, int32_t buttons) { - struct usbd_mbuf *m; - u_int8_t *buf; + u_int8_t buf[8]; - USBD_IF_DEQUEUE(&sc->sc_rdq_free, m); + if (1) { - if (m) { - USBD_MBUF_RESET(m); - if (dx > 254) dx = 254; if (dx < -256) dx = -256; if (dy > 254) dy = 254; @@ -606,11 +612,8 @@ if (dt > 126) dt = 126; if (dt < -128) dt = -128; - buf = m->cur_data_ptr; - m->cur_data_len = sc->sc_mode.packetsize; - buf[0] = sc->sc_mode.syncmask[1]; - buf[0] |= ~buttons & MOUSE_MSC_BUTTONS; + buf[0] |= (~buttons) & MOUSE_MSC_BUTTONS; buf[1] = dx >> 1; buf[2] = dy >> 1; buf[3] = dx - (dx >> 1); @@ -619,21 +622,12 @@ if (sc->sc_mode.level == 1) { buf[5] = dz >> 1; buf[6] = dz - (dz >> 1); - buf[7] = ((~buttons >> 3) & MOUSE_SYS_EXTBUTTONS); + buf[7] = (((~buttons) >> 3) & MOUSE_SYS_EXTBUTTONS); } - USBD_IF_ENQUEUE(&(sc->sc_rdq_used), m); - - if (sc->sc_flags & UMS_FLAG_RD_WUP) { - sc->sc_flags &= ~UMS_FLAG_RD_WUP; - wakeup(&(sc->sc_wakeup_read)); - } + usb_cdev_put_data(&(sc->sc_cdev), buf, + sc->sc_mode.packetsize, 1); - if (sc->sc_flags & UMS_FLAG_SELECT) { - sc->sc_flags &= ~UMS_FLAG_SELECT; - selwakeup(&(sc->sc_read_sel)); - } - } else { DPRINTF(0, "Buffer full, discarded packet\n"); } @@ -641,47 +635,6 @@ return; } -static int -ums_uiomove(struct ums_softc *sc, u_int32_t context_bit, - void *cp, int n, struct uio *uio) -{ - int error; - - sc->sc_flags |= context_bit; - - mtx_unlock(&(sc->sc_mtx)); - - error = uiomove(cp, n, uio); - - mtx_lock(&(sc->sc_mtx)); - - sc->sc_flags &= ~context_bit; - - if (sc->sc_flags & UMS_FLAG_CLOSING) { - wakeup(&(sc->sc_wakeup_sync_1)); - error = EINTR; - } - return error; -} - -static int -ums_msleep(struct ums_softc *sc, u_int32_t context_bit, void *ident) -{ - int error; - - sc->sc_flags |= context_bit; - - error = msleep(ident, &(sc->sc_mtx), PRIBIO|PCATCH, "ums_sleep", 0); - - sc->sc_flags &= ~context_bit; - - if (sc->sc_flags & UMS_FLAG_CLOSING) { - wakeup(&(sc->sc_wakeup_sync_1)); - error = EINTR; - } - return error; -} - static void ums_reset_buf(struct ums_softc *sc) { @@ -690,10 +643,10 @@ /* reset read queue */ while(1) { - USBD_IF_DEQUEUE(&(sc->sc_rdq_used), m); + USBD_IF_DEQUEUE(&(sc->sc_cdev.sc_rdq_used), m); if (m) { - USBD_IF_ENQUEUE(&(sc->sc_rdq_free), m); + USBD_IF_ENQUEUE(&(sc->sc_cdev.sc_rdq_free), m); } else { break; } @@ -701,32 +654,14 @@ return; } -static int -ums_open(struct cdev *dev, int flag, int fmt, struct thread *td) +static int32_t +ums_open(struct usb_cdev *cdev, int32_t fflags, + int32_t devtype, struct thread *td) { - struct ums_softc *sc = DEV2SC(dev); - int error = 0; + struct ums_softc *sc = cdev->sc_priv_ptr; DPRINTF(1, "\n"); - if (sc == NULL) { - return EIO; - } - - mtx_lock(&(sc->sc_mtx)); - - /* check flags */ - - if (sc->sc_flags & - (UMS_FLAG_DEV_OPEN|UMS_FLAG_GONE)) { - error = EBUSY; - goto done; - } - - /* reset buffer */ - - ums_reset_buf(sc); - /* reset status */ sc->sc_status.flags = 0; @@ -737,215 +672,19 @@ sc->sc_status.dz = 0; /* sc->sc_status.dt = 0; */ - /* start interrupt transfer */ - - usbd_transfer_start(sc->sc_xfer[0]); - - sc->sc_flags |= UMS_FLAG_DEV_OPEN; - - done: - mtx_unlock(&(sc->sc_mtx)); - - return error; -} - -static int -ums_close(struct cdev *dev, int flag, int fmt, struct thread *td) -{ - struct ums_softc *sc = DEV2SC(dev); - int error; - - DPRINTF(1, "\n"); - - if (sc == NULL) { - return EIO; - } - - mtx_lock(&(sc->sc_mtx)); - - if (sc->sc_flags & UMS_FLAG_CLOSING) { - goto done; - } - - if (sc->sc_flags & UMS_FLAG_DEV_OPEN) { - - sc->sc_flags |= UMS_FLAG_CLOSING; - - /* stop transfers */ - - if (sc->sc_xfer[0]) { - usbd_transfer_stop(sc->sc_xfer[0]); - } - - if (sc->sc_xfer[1]) { - usbd_transfer_stop(sc->sc_xfer[1]); - } - - /* stop callout */ - - __callout_stop(&(sc->sc_callout)); - - while (sc->sc_flags & - (UMS_FLAG_RD_SLP|UMS_FLAG_RD_WUP)) { - - if (sc->sc_flags & UMS_FLAG_RD_WUP) { - sc->sc_flags &= ~UMS_FLAG_RD_WUP; - wakeup(&(sc->sc_wakeup_read)); - } - - error = msleep(&(sc->sc_wakeup_sync_1), &(sc->sc_mtx), - PRIBIO, "ums_sync_1", 0); - } - - if (sc->sc_flags & UMS_FLAG_SELECT) { - sc->sc_flags &= ~UMS_FLAG_SELECT; - selwakeup(&(sc->sc_read_sel)); - } - - sc->sc_flags &= ~(UMS_FLAG_DEV_OPEN| - UMS_FLAG_CLOSING); - } - - done: - mtx_unlock(&(sc->sc_mtx)); - - DPRINTF(0, "closed\n"); - return 0; } -static int -ums_read(struct cdev *dev, struct uio *uio, int flag) +static int32_t +ums_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t addr, + int32_t fflags, struct thread *td) { - struct ums_softc *sc = DEV2SC(dev); - struct usbd_mbuf *m; - int error = 0; - int io_len; - - if (sc == NULL) { - return EIO; - } - - DPRINTF(1, "\n"); - - mtx_lock(&(sc->sc_mtx)); - - if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE| - UMS_FLAG_RD_SLP)) { - error = EIO; - goto done; - } - - while (uio->uio_resid) { - - USBD_IF_DEQUEUE(&(sc->sc_rdq_used), m); - - if (m == NULL) { - - /* start reader thread */ - - usbd_transfer_start(sc->sc_xfer[0]); - - if (flag & O_NONBLOCK) { - error = EWOULDBLOCK; - goto done; - } - - error = ums_msleep(sc, (UMS_FLAG_RD_SLP|UMS_FLAG_RD_WUP), - &(sc->sc_wakeup_read)); - if (error) { - break; - } else { - continue; - } - } - - io_len = min(m->cur_data_len, uio->uio_resid); - - DPRINTF(1, "transfer %d bytes from %p\n", - io_len, m->cur_data_ptr); - - error = ums_uiomove(sc, UMS_FLAG_RD_SLP, m->cur_data_ptr, - io_len, uio); - - m->cur_data_len -= io_len; - m->cur_data_ptr += io_len; - - if (m->cur_data_len == 0) { - USBD_IF_ENQUEUE(&sc->sc_rdq_free, m); - } else { - USBD_IF_PREPEND(&sc->sc_rdq_used, m); - } - - if (error) { - break; - } - } - - done: - mtx_unlock(&(sc->sc_mtx)); - - return error; -} - -static int -ums_poll(struct cdev *dev, int events, struct thread *td) -{ - struct ums_softc *sc = DEV2SC(dev); - struct usbd_mbuf *m; - int32_t revents = 0; - - if (sc == NULL) { - return POLLNVAL; - } - - DPRINTF(1, "\n"); - - mtx_lock(&(sc->sc_mtx)); - - if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE)) { - revents = POLLNVAL; - goto done; - } - - if (events & (POLLIN | POLLRDNORM)) { - - USBD_IF_POLL(&(sc->sc_rdq_used), m); - - if (m) { - revents = events & (POLLIN | POLLRDNORM); - } else { - sc->sc_flags |= UMS_FLAG_SELECT; - selrecord(td, &(sc->sc_read_sel)); - } - } - - done: - mtx_unlock(&(sc->sc_mtx)); - - return revents; -} - -static int -ums_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td) -{ - struct ums_softc *sc = DEV2SC(dev); + struct ums_softc *sc = cdev->sc_priv_ptr; mousemode_t mode; int error = 0; - if (sc == NULL) { - return EIO; - } - DPRINTF(1, "\n"); - mtx_lock(&(sc->sc_mtx)); - - if (sc->sc_flags & (UMS_FLAG_CLOSING|UMS_FLAG_GONE)) { - error = EIO; - goto done; - } - switch(cmd) { case MOUSE_GETHWINFO: *(mousehw_t *)addr = sc->sc_hw; @@ -1048,21 +787,9 @@ } done: - mtx_unlock(&(sc->sc_mtx)); - return error; } -cdevsw_t ums_cdevsw = { - .d_version = D_VERSION, - .d_open = ums_open, - .d_close = ums_close, - .d_read = ums_read, - .d_ioctl = ums_ioctl, - .d_poll = ums_poll, - .d_name = "ums", -}; - static devclass_t ums_devclass; static device_method_t ums_methods[] = {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200609161836.k8GIaPee086105>