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