PERFORCE change 157136 for review

Hans Petter Selasky hselasky at FreeBSD.org
Wed Feb 4 05:49:46 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=157136

Change 157136 by hselasky at hselasky_laptop001 on 2009/02/04 13:49:30

	
	USB serial drivers cleanup by me.
	
	- factor out all clear stall handling
	- factor out all usb2_do_request() calls.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#22 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ucycom2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ufoma2.c#22 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2_reg.h#5 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ugensa2.c#23 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uipaq2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#15 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umct2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umodem2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umoscom2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uplcom2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#24 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.h#13 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uvisor2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uvscom2.c#19 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#10 (text+ko) ====

@@ -88,7 +88,7 @@
 enum {
 	U3G_BULK_WR,
 	U3G_BULK_RD,
-	U3G_N_TRANSFER = 2,
+	U3G_N_TRANSFER,
 };
 
 struct u3g_softc {

==== //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#16 (text+ko) ====

@@ -64,9 +64,7 @@
 enum {
 	UARK_BULK_DT_WR,
 	UARK_BULK_DT_RD,
-	UARK_BULK_CS_WR,
-	UARK_BULK_CS_RD,
-	UARK_N_TRANSFER = 4,
+	UARK_N_TRANSFER,
 };
 
 struct uark_softc {
@@ -76,9 +74,6 @@
 	struct usb2_xfer *sc_xfer[UARK_N_TRANSFER];
 	struct usb2_device *sc_udev;
 
-	uint8_t	sc_flags;
-#define	UARK_FLAG_BULK_READ_STALL	0x01
-#define	UARK_FLAG_BULK_WRITE_STALL	0x02
 	uint8_t	sc_msr;
 	uint8_t	sc_lsr;
 };
@@ -90,9 +85,7 @@
 static device_detach_t uark_detach;
 
 static usb2_callback_t uark_bulk_write_callback;
-static usb2_callback_t uark_bulk_write_clear_stall_callback;
 static usb2_callback_t uark_bulk_read_callback;
-static usb2_callback_t uark_bulk_read_clear_stall_callback;
 
 static void	uark_start_read(struct usb2_com_softc *);
 static void	uark_stop_read(struct usb2_com_softc *);
@@ -125,28 +118,6 @@
 		.mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
 		.mh.callback = &uark_bulk_read_callback,
 	},
-
-	[UARK_BULK_CS_WR] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = &uark_bulk_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[UARK_BULK_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = &uark_bulk_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static const struct usb2_com_callback uark_callback = {
@@ -224,8 +195,8 @@
 		goto detach;
 	}
 	/* clear stall at first run */
-	sc->sc_flags |= (UARK_FLAG_BULK_WRITE_STALL |
-	    UARK_FLAG_BULK_READ_STALL);
+	usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_WR]);
+	usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_RD]);
 
 	error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
 	    &uark_callback, &Giant);
@@ -261,10 +232,7 @@
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_SETUP:
 	case USB_ST_TRANSFERRED:
-		if (sc->sc_flags & UARK_FLAG_BULK_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_WR]);
-			return;
-		}
+tr_setup:
 		if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
 		    UARK_BUF_SIZE, &actlen)) {
 			xfer->frlengths[0] = actlen;
@@ -274,8 +242,9 @@
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flags |= UARK_FLAG_BULK_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_WR]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -283,19 +252,6 @@
 }
 
 static void
-uark_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct uark_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UARK_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~UARK_FLAG_BULK_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 uark_bulk_read_callback(struct usb2_xfer *xfer)
 {
 	struct uark_softc *sc = xfer->priv_sc;
@@ -306,34 +262,18 @@
 		    xfer->actlen);
 
 	case USB_ST_SETUP:
-		if (sc->sc_flags & UARK_FLAG_BULK_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+tr_setup:
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		return;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flags |= UARK_FLAG_BULK_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
-
-	}
-}
-
-static void
-uark_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct uark_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UARK_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~UARK_FLAG_BULK_READ_STALL;
-		usb2_transfer_start(xfer_other);
 	}
 }
 
@@ -350,7 +290,6 @@
 {
 	struct uark_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UARK_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[UARK_BULK_DT_RD]);
 }
 
@@ -367,7 +306,6 @@
 {
 	struct uark_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UARK_BULK_CS_WR]);
 	usb2_transfer_stop(sc->sc_xfer[UARK_BULK_DT_WR]);
 }
 
@@ -454,18 +392,14 @@
 	struct usb2_device_request req;
 	usb2_error_t err;
 
-	if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
-		return;
-	}
 	req.bmRequestType = UARK_WRITE;
 	req.bRequest = UARK_REQUEST;
 	USETW(req.wValue, value);
 	USETW(req.wIndex, index);
 	USETW(req.wLength, 0);
 
-	err = usb2_do_request_flags
-	    (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+	err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
+	    &req, NULL, 0, 1000);
 	if (err) {
 		DPRINTFN(0, "device request failed, err=%s "
 		    "(ignored)\n", usb2_errstr(err));

==== //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#22 (text+ko) ====

@@ -143,11 +143,8 @@
 enum {
 	UBSA_BULK_DT_WR,
 	UBSA_BULK_DT_RD,
-	UBSA_BULK_CS_WR,
-	UBSA_BULK_CS_RD,
 	UBSA_INTR_DT_RD,
-	UBSA_INTR_CS_RD,
-	UBSA_N_TRANSFER = 6,
+	UBSA_N_TRANSFER,
 };
 
 struct ubsa_softc {
@@ -157,11 +154,6 @@
 	struct usb2_xfer *sc_xfer[UBSA_N_TRANSFER];
 	struct usb2_device *sc_udev;
 
-	uint16_t sc_flag;
-#define	UBSA_FLAG_WRITE_STALL   0x0001
-#define	UBSA_FLAG_READ_STALL    0x0002
-#define	UBSA_FLAG_INTR_STALL    0x0004
-
 	uint8_t	sc_iface_no;		/* interface number */
 	uint8_t	sc_iface_index;		/* interface index */
 	uint8_t	sc_lsr;			/* local status register */
@@ -173,11 +165,8 @@
 static device_detach_t ubsa_detach;
 
 static usb2_callback_t ubsa_write_callback;
-static usb2_callback_t ubsa_write_clear_stall_callback;
 static usb2_callback_t ubsa_read_callback;
-static usb2_callback_t ubsa_read_clear_stall_callback;
 static usb2_callback_t ubsa_intr_callback;
-static usb2_callback_t ubsa_intr_clear_stall_callback;
 
 static void	ubsa_cfg_request(struct ubsa_softc *, uint8_t, uint16_t);
 static void	ubsa_cfg_set_dtr(struct usb2_com_softc *, uint8_t);
@@ -212,26 +201,6 @@
 		.mh.callback = &ubsa_read_callback,
 	},
 
-	[UBSA_BULK_CS_WR] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &ubsa_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[UBSA_BULK_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &ubsa_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
 	[UBSA_INTR_DT_RD] = {
 		.type = UE_INTERRUPT,
 		.endpoint = UE_ADDR_ANY,
@@ -240,16 +209,6 @@
 		.mh.bufsize = 0,	/* use wMaxPacketSize */
 		.mh.callback = &ubsa_intr_callback,
 	},
-
-	[UBSA_INTR_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &ubsa_intr_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static const struct usb2_com_callback ubsa_callback = {
@@ -343,8 +302,8 @@
 		goto detach;
 	}
 	/* clear stall at first run */
-	sc->sc_flag |= (UBSA_FLAG_WRITE_STALL |
-	    UBSA_FLAG_READ_STALL);
+	usb2_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_WR]);
+	usb2_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_RD]);
 
 	error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
 	    &ubsa_callback, &Giant);
@@ -379,9 +338,6 @@
 	struct usb2_device_request req;
 	usb2_error_t err;
 
-	if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
-		return;
-	}
 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
 	req.bRequest = index;
 	USETW(req.wValue, value);
@@ -389,9 +345,8 @@
 	req.wIndex[1] = 0;
 	USETW(req.wLength, 0);
 
-	err = usb2_do_request_flags
-	    (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+	err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
+	    &req, NULL, 0, 1000);
 	if (err) {
 		DPRINTFN(0, "device request failed, err=%s "
 		    "(ignored)\n", usb2_errstr(err));
@@ -544,11 +499,9 @@
 	struct ubsa_softc *sc = ucom->sc_parent;
 
 	/* stop interrupt endpoint */
-	usb2_transfer_stop(sc->sc_xfer[UBSA_INTR_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[UBSA_INTR_DT_RD]);
 
 	/* stop read endpoint */
-	usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_DT_RD]);
 }
 
@@ -565,7 +518,6 @@
 {
 	struct ubsa_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_CS_WR]);
 	usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_DT_WR]);
 }
 
@@ -589,10 +541,7 @@
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_SETUP:
 	case USB_ST_TRANSFERRED:
-		if (sc->sc_flag & UBSA_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_WR]);
-			return;
-		}
+tr_setup:
 		if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
 		    UBSA_BSIZE, &actlen)) {
 
@@ -603,8 +552,9 @@
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UBSA_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_WR]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -612,19 +562,6 @@
 }
 
 static void
-ubsa_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct ubsa_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flag &= ~UBSA_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 ubsa_read_callback(struct usb2_xfer *xfer)
 {
 	struct ubsa_softc *sc = xfer->priv_sc;
@@ -634,18 +571,16 @@
 		usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
 
 	case USB_ST_SETUP:
-		if (sc->sc_flag & UBSA_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+tr_setup:
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		return;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UBSA_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -653,19 +588,6 @@
 }
 
 static void
-ubsa_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct ubsa_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flag &= ~UBSA_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 ubsa_intr_callback(struct usb2_xfer *xfer)
 {
 	struct ubsa_softc *sc = xfer->priv_sc;
@@ -695,33 +617,18 @@
 		}
 
 	case USB_ST_SETUP:
-		if (sc->sc_flag & UBSA_FLAG_INTR_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UBSA_INTR_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+tr_setup:
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		return;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UBSA_FLAG_INTR_STALL;
-			usb2_transfer_start(sc->sc_xfer[UBSA_INTR_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
 	}
 }
-
-static void
-ubsa_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct ubsa_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_INTR_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flag &= ~UBSA_FLAG_INTR_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}

==== //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#16 (text+ko) ====

@@ -113,9 +113,7 @@
 enum {
 	UBSER_BULK_DT_WR,
 	UBSER_BULK_DT_RD,
-	UBSER_BULK_CS_WR,
-	UBSER_BULK_CS_RD,
-	UBSER_N_TRANSFER = 4,
+	UBSER_N_TRANSFER,
 };
 
 struct ubser_softc {
@@ -128,10 +126,6 @@
 	uint16_t sc_tx_size;
 
 	uint8_t	sc_numser;
-	uint8_t	sc_flags;
-#define	UBSER_FLAG_READ_STALL  0x01
-#define	UBSER_FLAG_WRITE_STALL 0x02
-
 	uint8_t	sc_iface_no;
 	uint8_t	sc_iface_index;
 	uint8_t	sc_curr_tx_unit;
@@ -144,9 +138,7 @@
 static device_attach_t ubser_attach;
 static device_detach_t ubser_detach;
 
-static usb2_callback_t ubser_write_clear_stall_callback;
 static usb2_callback_t ubser_write_callback;
-static usb2_callback_t ubser_read_clear_stall_callback;
 static usb2_callback_t ubser_read_callback;
 
 static int	ubser_pre_param(struct usb2_com_softc *, struct termios *);
@@ -177,28 +169,6 @@
 		.mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
 		.mh.callback = &ubser_read_callback,
 	},
-
-	[UBSER_BULK_CS_WR] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = &ubser_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[UBSER_BULK_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = &ubser_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static const struct usb2_com_callback ubser_callback = {
@@ -311,8 +281,8 @@
 	}
 	mtx_lock(&Giant);
 
-	sc->sc_flags |= (UBSER_FLAG_READ_STALL |
-	    UBSER_FLAG_WRITE_STALL);
+	usb2_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_WR]);
+	usb2_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_RD]);
 
 	usb2_transfer_start(sc->sc_xfer[UBSER_BULK_DT_RD]);
 
@@ -329,22 +299,11 @@
 ubser_detach(device_t dev)
 {
 	struct ubser_softc *sc = device_get_softc(dev);
-	uint8_t n;
 
 	DPRINTF("\n");
 
 	usb2_com_detach(&sc->sc_super_ucom, sc->sc_ucom, sc->sc_numser);
 
-	/*
-	 * need to stop all transfers atomically, hence when clear stall
-	 * completes, it might start other transfers !
-	 */
-	mtx_lock(&Giant);
-	for (n = 0; n < UBSER_N_TRANSFER; n++) {
-		usb2_transfer_stop(sc->sc_xfer[n]);
-	}
-	mtx_unlock(&Giant);
-
 	usb2_transfer_unsetup(sc->sc_xfer, UBSER_N_TRANSFER);
 
 	return (0);
@@ -409,19 +368,6 @@
 }
 
 static void
-ubser_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct ubser_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UBSER_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~UBSER_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 ubser_write_callback(struct usb2_xfer *xfer)
 {
 	struct ubser_softc *sc = xfer->priv_sc;
@@ -432,10 +378,7 @@
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_SETUP:
 	case USB_ST_TRANSFERRED:
-		if (sc->sc_flags & UBSER_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_WR]);
-			return;
-		}
+tr_setup:
 		do {
 			if (usb2_com_get_data(sc->sc_ucom + sc->sc_curr_tx_unit,
 			    xfer->frbuffers, 1, sc->sc_tx_size - 1,
@@ -460,8 +403,9 @@
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flags |= UBSER_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_WR]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -469,19 +413,6 @@
 }
 
 static void
-ubser_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct ubser_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UBSER_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~UBSER_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 ubser_read_callback(struct usb2_xfer *xfer)
 {
 	struct ubser_softc *sc = xfer->priv_sc;
@@ -504,18 +435,15 @@
 
 	case USB_ST_SETUP:
 tr_setup:
-		if (sc->sc_flags & UBSER_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		return;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flags |= UBSER_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -540,9 +468,8 @@
 		req.wIndex[1] = 0;
 		USETW(req.wLength, 0);
 
-		err = usb2_do_request_flags
-		    (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+		err = usb2_com_cfg_do_request(sc->sc_udev, ucom, 
+		    &req, NULL, 0, 1000);
 		if (err) {
 			DPRINTFN(0, "send break failed, error=%s\n",
 			    usb2_errstr(err));
@@ -571,7 +498,6 @@
 {
 	struct ubser_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_DT_RD]);
 }
 
@@ -588,6 +514,5 @@
 {
 	struct ubser_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_CS_WR]);
 	usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_DT_WR]);
 }

==== //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#19 (text+ko) ====

@@ -148,11 +148,8 @@
 enum {
 	UCHCOM_BULK_DT_WR,
 	UCHCOM_BULK_DT_RD,
-	UCHCOM_BULK_CS_WR,
-	UCHCOM_BULK_CS_RD,
 	UCHCOM_INTR_DT_RD,
-	UCHCOM_INTR_CS_RD,
-	UCHCOM_N_TRANSFER = 6,
+	UCHCOM_N_TRANSFER,
 };
 
 struct uchcom_softc {
@@ -167,10 +164,6 @@
 	uint8_t	sc_version;
 	uint8_t	sc_msr;
 	uint8_t	sc_lsr;			/* local status register */
-	uint8_t	sc_flag;
-#define	UCHCOM_FLAG_INTR_STALL  0x01
-#define	UCHCOM_FLAG_READ_STALL  0x02
-#define	UCHCOM_FLAG_WRITE_STALL 0x04
 };
 
 struct uchcom_divider {
@@ -230,11 +223,8 @@
 static device_detach_t uchcom_detach;
 
 static usb2_callback_t uchcom_intr_callback;
-static usb2_callback_t uchcom_intr_clear_stall_callback;
 static usb2_callback_t uchcom_write_callback;
-static usb2_callback_t uchcom_write_clear_stall_callback;
 static usb2_callback_t uchcom_read_callback;
-static usb2_callback_t uchcom_read_clear_stall_callback;
 
 static const struct usb2_config uchcom_config_data[UCHCOM_N_TRANSFER] = {
 
@@ -256,26 +246,6 @@
 		.mh.callback = &uchcom_read_callback,
 	},
 
-	[UCHCOM_BULK_CS_WR] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &uchcom_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[UCHCOM_BULK_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &uchcom_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
 	[UCHCOM_INTR_DT_RD] = {
 		.type = UE_INTERRUPT,
 		.endpoint = UE_ADDR_ANY,
@@ -284,16 +254,6 @@
 		.mh.bufsize = 0,	/* use wMaxPacketSize */
 		.mh.callback = &uchcom_intr_callback,
 	},
-
-	[UCHCOM_INTR_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.callback = &uchcom_intr_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 struct usb2_com_callback uchcom_callback = {
@@ -378,8 +338,8 @@
 	sc->sc_rts = 1;
 
 	/* clear stall at first run */
-	sc->sc_flag |= (UCHCOM_FLAG_READ_STALL |
-	    UCHCOM_FLAG_WRITE_STALL);
+	usb2_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
+	usb2_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
 
 	error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
 	    &uchcom_callback, &Giant);
@@ -412,35 +372,6 @@
  */
 
 static void
-uchcom_do_request(struct uchcom_softc *sc,
-    struct usb2_device_request *req, void *data)
-{
-	uint16_t length;
-	uint16_t actlen;
-	usb2_error_t err;
-
-	length = UGETW(req->wLength);
-	actlen = 0;
-
-	if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
-		goto done;
-	}
-	err = usb2_do_request_flags(sc->sc_udev, &Giant, req,
-	    data, USB_SHORT_XFER_OK, &actlen, 1000);
-
-	if (err) {
-		DPRINTFN(0, "device request failed, err=%s "
-		    "(ignored)\n", usb2_errstr(err));
-	}
-done:
-	if (length != actlen) {
-		if (req->bmRequestType & UT_READ) {
-			bzero(USB_ADD_BYTES(data, actlen), length - actlen);
-		}
-	}
-}
-
-static void
 uchcom_ctrl_write(struct uchcom_softc *sc, uint8_t reqno,
     uint16_t value, uint16_t index)
 {
@@ -452,7 +383,8 @@
 	USETW(req.wIndex, index);
 	USETW(req.wLength, 0);
 
-	uchcom_do_request(sc, &req, NULL);
+	usb2_com_cfg_do_request(sc->sc_udev,
+	    &sc->sc_ucom, &req, NULL, 0, 1000);
 }
 
 static void
@@ -467,7 +399,8 @@
 	USETW(req.wIndex, index);
 	USETW(req.wLength, buflen);
 
-	uchcom_do_request(sc, &req, buf);
+	usb2_com_cfg_do_request(sc->sc_udev,
+	    &sc->sc_ucom, &req, buf, USB_SHORT_XFER_OK, 1000);
 }
 
 static void
@@ -812,7 +745,6 @@
 	usb2_transfer_stop(sc->sc_xfer[UCHCOM_INTR_DT_RD]);
 
 	/* stop read endpoint */
-	usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
 }
 
@@ -829,7 +761,6 @@
 {
 	struct uchcom_softc *sc = ucom->sc_parent;
 
-	usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
 	usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
 }
 
@@ -859,37 +790,22 @@
 			usb2_com_status_change(&sc->sc_ucom);
 		}
 	case USB_ST_SETUP:
-		if (sc->sc_flag & UCHCOM_FLAG_INTR_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_INTR_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+tr_setup:
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		break;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UCHCOM_FLAG_INTR_STALL;
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_INTR_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		break;
 	}
 }
 
 static void
-uchcom_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct uchcom_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UCHCOM_INTR_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flag &= ~UCHCOM_FLAG_INTR_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 uchcom_write_callback(struct usb2_xfer *xfer)
 {
 	struct uchcom_softc *sc = xfer->priv_sc;
@@ -898,10 +814,7 @@
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_SETUP:
 	case USB_ST_TRANSFERRED:
-		if (sc->sc_flag & UCHCOM_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
-			return;
-		}
+tr_setup:
 		if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
 		    UCHCOM_BULK_BUF_SIZE, &actlen)) {
 
@@ -914,8 +827,9 @@
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UCHCOM_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 
@@ -923,19 +837,6 @@
 }
 
 static void
-uchcom_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct uchcom_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[UCHCOM_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flag &= ~UCHCOM_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 uchcom_read_callback(struct usb2_xfer *xfer)
 {
 	struct uchcom_softc *sc = xfer->priv_sc;
@@ -945,34 +846,18 @@
 		usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
 
 	case USB_ST_SETUP:
-		if (sc->sc_flag & UCHCOM_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
-		} else {
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
-		}
+tr_setup:
+		xfer->frlengths[0] = xfer->max_data_length;
+		usb2_start_hardware(xfer);
 		return;
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			sc->sc_flag |= UCHCOM_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
-
-	}
-}

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list