PERFORCE change 126699 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Sep 22 10:42:16 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126699
Change 126699 by hselasky at 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);
}
More information about the p4-projects
mailing list