From owner-p4-projects@FreeBSD.ORG Sat Sep 22 17:42:16 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4966316A469; Sat, 22 Sep 2007 17:42:16 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CE8EA16A41B for ; Sat, 22 Sep 2007 17:42:15 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id B39EF13C48A for ; Sat, 22 Sep 2007 17:42:15 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8MHgFTm036084 for ; Sat, 22 Sep 2007 17:42:15 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8MHgF6A036081 for perforce@freebsd.org; Sat, 22 Sep 2007 17:42:15 GMT (envelope-from hselasky@FreeBSD.org) Date: Sat, 22 Sep 2007 17:42:15 GMT Message-Id: <200709221742.l8MHgF6A036081@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 126699 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Sep 2007 17:42:16 -0000 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); }