Date: Sat, 22 Sep 2007 17:42:15 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 126699 for review Message-ID: <200709221742.l8MHgF6A036081@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=126699 Change 126699 by hselasky@hselasky_laptop001 on 2007/09/22 17:41:46 - use "usbd_do_request()" to perform USB control requests instead of a custom allocated USB transfer. This makes the driver more identical to the origin and saves some code. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/ufm.c#13 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/ufm.c#13 (text+ko) ==== @@ -63,8 +63,6 @@ #define DPRINTF(...) do { } while (0) #endif -#define UFM_N_TRANSFER 1 /* units */ -#define UFM_BUF_SIZE (sizeof(usb_device_request_t) + 1) /* bytes */ #define UFM_CMD0 0x00 #define UFM_CMD_SET_FREQ 0x01 #define UFM_CMD2 0x02 @@ -74,15 +72,10 @@ struct mtx sc_mtx; struct usbd_device *sc_udev; - struct usbd_xfer *sc_xfer[UFM_N_TRANSFER]; u_int32_t sc_unit; u_int32_t sc_freq; - u_int16_t sc_flags; -#define UFM_FLAG_COMMAND_ERR 0x0001 - - u_int8_t sc_transfer_buf[UFM_BUF_SIZE]; u_int8_t sc_name[16]; }; @@ -96,9 +89,6 @@ ufm_open(struct usb_cdev *dev, int32_t fflags, int32_t devtype, struct thread *td); -static void -ufm_ioctl_callback(struct usbd_xfer *xfer); - static int ufm_do_req(struct ufm_softc *sc, int32_t fflags, u_int8_t request, u_int16_t value, u_int16_t index, u_int8_t *retbuf); @@ -121,18 +111,6 @@ ufm_ioctl(struct usb_cdev *dev, u_long cmd, caddr_t addr, int32_t fflags, struct thread *td); -static const struct usbd_config ufm_config[UFM_N_TRANSFER] = { - [0] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = UFM_BUF_SIZE, - .flags = USBD_USE_DMA, - .callback = &ufm_ioctl_callback, - .timeout = 1000, /* 1 second */ - }, -}; - static devclass_t ufm_devclass; static device_method_t ufm_methods[] = { @@ -190,14 +168,6 @@ usbd_set_desc(dev, uaa->device); - error = usbd_transfer_setup(uaa->device, uaa->iface_index, - sc->sc_xfer, ufm_config, UFM_N_TRANSFER, - sc, &(sc->sc_mtx)); - if (error) { - DPRINTF(sc, 0, "error=%s\n", usbd_errstr(error)) ; - goto detach; - } - snprintf(buf, sizeof(buf), "ufm%d", sc->sc_unit); p_buf[0] = buf; @@ -225,8 +195,6 @@ usb_cdev_detach(&(sc->sc_cdev)); - usbd_transfer_unsetup(sc->sc_xfer, UFM_N_TRANSFER); - mtx_destroy(&(sc->sc_mtx)); return 0; @@ -242,65 +210,28 @@ return 0; } -static void -ufm_ioctl_callback(struct usbd_xfer *xfer) -{ - struct ufm_softc *sc = xfer->priv_sc; - - USBD_CHECK_STATUS(xfer); - - tr_transferred: - usbd_copy_out(&(xfer->buf_data), 0, - sc->sc_transfer_buf, UFM_BUF_SIZE); - sc->sc_flags &= ~UFM_FLAG_COMMAND_ERR; - usb_cdev_wakeup(&(sc->sc_cdev)); - return; - - tr_error: - DPRINTF(sc, 0, "error=%s\n", usbd_errstr(xfer->error)); - sc->sc_flags |= UFM_FLAG_COMMAND_ERR; - usb_cdev_wakeup(&(sc->sc_cdev)); - return; - - tr_setup: - usbd_copy_in(&(xfer->buf_data), 0, - sc->sc_transfer_buf, UFM_BUF_SIZE); - xfer->length = UFM_BUF_SIZE; - usbd_start_hardware(xfer); - return; -} - static int ufm_do_req(struct ufm_softc *sc, int32_t fflags, u_int8_t request, u_int16_t value, u_int16_t index, u_int8_t *retbuf) { int32_t error; - usb_device_request_t *req = (void *)(sc->sc_transfer_buf); + usb_device_request_t req; + uint8_t buf[1]; - req->bmRequestType = UT_READ_VENDOR_DEVICE; - req->bRequest = request; - USETW(req->wValue, value); - USETW(req->wIndex, index); - USETW(req->wLength, 1); + req.bmRequestType = UT_READ_VENDOR_DEVICE; + req.bRequest = request; + USETW(req.wValue, value); + USETW(req.wIndex, index); + USETW(req.wLength, 1); - sc->sc_flags |= UFM_FLAG_COMMAND_ERR; - - usbd_transfer_start(sc->sc_xfer[0]); - - error = usb_cdev_sleep(&(sc->sc_cdev), fflags, 0); + error = usbd_do_request(sc->sc_udev, NULL, &req, buf); - usbd_transfer_stop(sc->sc_xfer[0]); - if (retbuf) { - *retbuf = req->bData[0]; + *retbuf = buf[0]; } if (error) { - return error; - } - - if (sc->sc_flags & UFM_FLAG_COMMAND_ERR) { return ENXIO; } return 0; @@ -318,7 +249,10 @@ * units of 12.5kHz. We add one to the IFM to make rounding * easier. */ + mtx_lock(&(sc->sc_mtx)); sc->sc_freq = freq; + mtx_unlock(&(sc->sc_mtx)); + freq = (freq + 10700001) / 12500; /* This appears to set the frequency */ @@ -339,7 +273,9 @@ ufm_get_freq(struct ufm_softc *sc, caddr_t addr, int32_t fflags) { int *valp = (int *)addr; + mtx_lock(&(sc->sc_mtx)); *valp = sc->sc_freq; + mtx_unlock(&(sc->sc_mtx)); return (0); } @@ -380,21 +316,13 @@ ufm_get_stat(struct ufm_softc *sc, caddr_t addr, int32_t fflags) { u_int8_t ret; - u_int32_t timeout = (hz / 4); - - if (timeout == 0) { - timeout = 1; - } /* * Note, there's a 240ms settle time before the status - * will be valid, so sleep that amount. hz/4 is a good - * approximation of that. + * will be valid, so sleep that amount. */ - if (usb_cdev_sleep(&(sc->sc_cdev), fflags, timeout)) { - return EIO; - } + usbd_pause_mtx(NULL, 250); if (ufm_do_req(sc, fflags, UFM_CMD0, 0x00, 0x24, &ret)) { @@ -413,6 +341,8 @@ struct ufm_softc *sc = dev->sc_priv_ptr; int error = 0; + usb_cdev_unlock(dev, fflags); + switch (cmd) { case FM_SET_FREQ: error = ufm_set_freq(sc, addr, fflags); @@ -430,8 +360,8 @@ error = ufm_get_stat(sc, addr, fflags); break; default: - return ENOTTY; + error = ENOTTY; break; } - return error; + return usb_cdev_lock(dev, fflags, error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200709221742.l8MHgF6A036081>
