PERFORCE change 157131 for review

Hans Petter Selasky hselasky at FreeBSD.org
Wed Feb 4 03:26:12 PST 2009


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

Change 157131 by hselasky at hselasky_laptop001 on 2009/02/04 11:26:09

	
	USB Ethernet cleanup patches by me:
	
	- use factored out clear stall code instead of
	  having per-driver clear stall transfers. Remove
	  unused clear stall flags.
	- only clear stall data write transfers
	  at startup.
	- fix one or two comments
	- add new global function to USB core:
	  usb2_get_mode() which returns the current
	  USB device mode.
	- some minor nits

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#34 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.c#51 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_aue2.c#21 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_auereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_axe2.c#21 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_axereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cdce2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cdcereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cue2.c#20 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cuereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_kue2.c#20 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_kuereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_rue2.c#20 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_ruereg.h#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_udav2.c#20 edit
.. //depot/projects/usb/src/sys/dev/usb2/ethernet/if_udavreg.h#4 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#34 (text+ko) ====

@@ -434,6 +434,7 @@
 uint8_t	usb2_get_interface_altindex(struct usb2_interface *iface);
 usb2_error_t usb2_set_alt_interface_index(struct usb2_device *udev,
 	    uint8_t iface_index, uint8_t alt_index);
+uint8_t	usb2_get_mode(struct usb2_device *udev);
 uint8_t	usb2_get_speed(struct usb2_device *udev);
 uint32_t usb2_get_isoc_fps(struct usb2_device *udev);
 usb2_error_t usb2_transfer_setup(struct usb2_device *udev,

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.c#51 (text+ko) ====

@@ -1952,6 +1952,20 @@
 	}
 }
 
+/*
+ * Returns:
+ * See: USB_MODE_XXX
+ */
+uint8_t
+usb2_get_mode(struct usb2_device *udev)
+{
+	return (udev->flags.usb2_mode);
+}
+
+/*
+ * Returns:
+ * See: USB_SPEED_XXX
+ */
 uint8_t
 usb2_get_speed(struct usb2_device *udev)
 {

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_aue2.c#21 (text+ko) ====

@@ -178,11 +178,8 @@
 static miibus_writereg_t aue_miibus_writereg;
 static miibus_statchg_t aue_miibus_statchg;
 
-static usb2_callback_t aue_intr_clear_stall_callback;
 static usb2_callback_t aue_intr_callback;
-static usb2_callback_t aue_bulk_read_clear_stall_callback;
 static usb2_callback_t aue_bulk_read_callback;
-static usb2_callback_t aue_bulk_write_clear_stall_callback;
 static usb2_callback_t aue_bulk_write_callback;
 
 static usb2_ether_fn_t aue_attach_post;
@@ -227,28 +224,6 @@
 		.mh.callback = aue_bulk_read_callback,
 	},
 
-	[AUE_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 = aue_bulk_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[AUE_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 = aue_bulk_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
 	[AUE_INTR_DT_RD] = {
 		.type = UE_INTERRUPT,
 		.endpoint = UE_ADDR_ANY,
@@ -257,17 +232,6 @@
 		.mh.bufsize = 0,	/* use wMaxPacketSize */
 		.mh.callback = aue_intr_callback,
 	},
-
-	[AUE_INTR_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = aue_intr_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static device_method_t aue_methods[] = {
@@ -749,19 +713,6 @@
 }
 
 static void
-aue_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct aue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AUE_INTR_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AUE_FLAG_INTR_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 aue_intr_callback(struct usb2_xfer *xfer)
 {
 	struct aue_softc *sc = xfer->priv_sc;
@@ -784,38 +735,22 @@
 		}
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-		if (sc->sc_flags & AUE_FLAG_INTR_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AUE_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) {
-			/* start clear stall */
-			sc->sc_flags |= AUE_FLAG_INTR_STALL;
-			usb2_transfer_start(sc->sc_xfer[AUE_INTR_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 	}
 }
 
 static void
-aue_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct aue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AUE_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AUE_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 aue_bulk_read_callback(struct usb2_xfer *xfer)
 {
 	struct aue_softc *sc = xfer->priv_sc;
@@ -859,43 +794,25 @@
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-
-		if (sc->sc_flags & AUE_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AUE_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);
 		usb2_ether_rxflush(ue);
 		return;
 
 	default:			/* Error */
+		DPRINTF("bulk read error, %s\n",
+		    usb2_errstr(xfer->error));
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= AUE_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[AUE_BULK_CS_RD]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		DPRINTF("bulk read error, %s\n",
-		    usb2_errstr(xfer->error));
 		return;
-
 	}
 }
 
 static void
-aue_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct aue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AUE_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AUE_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 aue_bulk_write_callback(struct usb2_xfer *xfer)
 {
 	struct aue_softc *sc = xfer->priv_sc;
@@ -910,25 +827,19 @@
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-
-		if (sc->sc_flags & AUE_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AUE_BULK_CS_WR]);
-			goto done;
-		}
+tr_setup:
 		if ((sc->sc_flags & AUE_FLAG_LINK) == 0) {
 			/*
 			 * don't send anything if there is no link !
 			 */
-			goto done;
+			return;
 		}
 		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
 
-		if (m == NULL) {
-			goto done;
-		}
-		if (m->m_pkthdr.len > MCLBYTES) {
+		if (m == NULL)
+			return;
+		if (m->m_pkthdr.len > MCLBYTES)
 			m->m_pkthdr.len = MCLBYTES;
-		}
 		if (sc->sc_flags & AUE_FLAG_VER_2) {
 
 			xfer->frlengths[0] = m->m_pkthdr.len;
@@ -941,10 +852,12 @@
 			xfer->frlengths[0] = (m->m_pkthdr.len + 2);
 
 			/*
-		         * The ADMtek documentation says that the packet length is
-		         * supposed to be specified in the first two bytes of the
-		         * transfer, however it actually seems to ignore this info
-		         * and base the frame size on the bulk transfer length.
+		         * The ADMtek documentation says that the
+		         * packet length is supposed to be specified
+		         * in the first two bytes of the transfer,
+		         * however it actually seems to ignore this
+		         * info and base the frame size on the bulk
+		         * transfer length.
 		         */
 			buf[0] = (uint8_t)(m->m_pkthdr.len);
 			buf[1] = (uint8_t)(m->m_pkthdr.len >> 8);
@@ -964,22 +877,20 @@
 		m_freem(m);
 
 		usb2_start_hardware(xfer);
-
-done:
 		return;
 
 	default:			/* Error */
 		DPRINTFN(11, "transfer error, %s\n",
 		    usb2_errstr(xfer->error));
 
+		ifp->if_oerrors++;
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= AUE_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[AUE_BULK_CS_WR]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		ifp->if_oerrors++;
 		return;
-
 	}
 }
 
@@ -1042,7 +953,7 @@
 	AUE_SETBIT(sc, AUE_CTL0, AUE_CTL0_TX_ENB);
 	AUE_SETBIT(sc, AUE_CTL2, AUE_CTL2_EP3_CLR);
 
-	sc->sc_flags |= AUE_FLAG_READ_STALL | AUE_FLAG_WRITE_STALL;
+	usb2_transfer_set_stall(sc->sc_xfer[AUE_BULK_DT_WR]);
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	aue_start(ue);
@@ -1121,10 +1032,7 @@
 	 */
 	usb2_transfer_stop(sc->sc_xfer[AUE_BULK_DT_WR]);
 	usb2_transfer_stop(sc->sc_xfer[AUE_BULK_DT_RD]);
-	usb2_transfer_stop(sc->sc_xfer[AUE_BULK_CS_WR]);
-	usb2_transfer_stop(sc->sc_xfer[AUE_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[AUE_INTR_DT_RD]);
-	usb2_transfer_stop(sc->sc_xfer[AUE_INTR_CS_RD]);
 
 	aue_csr_write_1(sc, AUE_CTL0, 0);
 	aue_csr_write_1(sc, AUE_CTL1, 0);

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_auereg.h#4 (text+ko) ====

@@ -63,11 +63,8 @@
 enum {
 	AUE_BULK_DT_WR,
 	AUE_BULK_DT_RD,
-	AUE_BULK_CS_WR,
-	AUE_BULK_CS_RD,
 	AUE_INTR_DT_RD,
-	AUE_INTR_CS_RD,
-	AUE_N_TRANSFER = 6,
+	AUE_N_TRANSFER,
 };
 
 #define	AUE_INTR_PKTLEN		0x8
@@ -214,9 +211,6 @@
 #define	AUE_FLAG_PNA		0x0002	/* has Home PNA */
 #define	AUE_FLAG_PII		0x0004	/* Pegasus II chip */
 #define	AUE_FLAG_LINK		0x0008	/* wait for link to come up */
-#define	AUE_FLAG_READ_STALL	0x0010	/* wait for clearing of stall */
-#define	AUE_FLAG_WRITE_STALL	0x0020	/* wait for clearing of stall */
-#define	AUE_FLAG_INTR_STALL	0x0040	/* wait for clearing of stall */
 #define	AUE_FLAG_VER_2		0x0200	/* chip is version 2 */
 #define	AUE_FLAG_DUAL_PHY	0x0400	/* chip has two transcivers */
 };

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_axe2.c#21 (text+ko) ====

@@ -101,7 +101,7 @@
  *	1	4096 bytes
  *	2	8192 bytes
  *	3	16384 bytes
- * use the largest your system can handle without usb stalling.
+ * use the largest your system can handle without USB stalling.
  *
  * NB: 88772 parts appear to generate lots of input errors with
  * a 2K rx buffer and 8K is only slightly faster than 4K on an
@@ -153,11 +153,8 @@
 static device_detach_t axe_detach;
 static device_shutdown_t axe_shutdown;
 
-static usb2_callback_t axe_intr_clear_stall_callback;
 static usb2_callback_t axe_intr_callback;
-static usb2_callback_t axe_bulk_read_clear_stall_callback;
 static usb2_callback_t axe_bulk_read_callback;
-static usb2_callback_t axe_bulk_write_clear_stall_callback;
 static usb2_callback_t axe_bulk_write_callback;
 
 static miibus_readreg_t axe_miibus_readreg;
@@ -204,28 +201,6 @@
 		.mh.timeout = 0,	/* no timeout */
 	},
 
-	[AXE_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 = axe_bulk_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[AXE_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 = axe_bulk_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
 	[AXE_INTR_DT_RD] = {
 		.type = UE_INTERRUPT,
 		.endpoint = UE_ADDR_ANY,
@@ -234,17 +209,6 @@
 		.mh.bufsize = 0,	/* use wMaxPacketSize */
 		.mh.callback = axe_intr_callback,
 	},
-
-	[AXE_INTR_CS_RD] = {
-		.type = UE_CONTROL,
-		.endpoint = 0x00,	/* Control pipe */
-		.direction = UE_DIR_ANY,
-		.mh.bufsize = sizeof(struct usb2_device_request),
-		.mh.flags = {},
-		.mh.callback = axe_intr_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static device_method_t axe_methods[] = {
@@ -739,57 +703,26 @@
 }
 
 static void
-axe_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct axe_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AXE_INTR_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AXE_FLAG_INTR_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 axe_intr_callback(struct usb2_xfer *xfer)
 {
-	struct axe_softc *sc = xfer->priv_sc;
-
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 	case USB_ST_SETUP:
-		if (sc->sc_flags & AXE_FLAG_INTR_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AXE_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) {
-			/* start clear stall */
-			sc->sc_flags |= AXE_FLAG_INTR_STALL;
-			usb2_transfer_start(sc->sc_xfer[AXE_INTR_CS_RD]);
+			/* try to clear stall first */
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
 		return;
 	}
 }
 
-static void
-axe_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct axe_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AXE_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AXE_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
 #if (AXE_BULK_BUF_SIZE >= 0x10000)
 #error "Please update axe_bulk_read_callback()!"
 #endif
@@ -853,40 +786,25 @@
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-		if (sc->sc_flags & AXE_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AXE_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);
 		usb2_ether_rxflush(ue);
 		return;
 
 	default:			/* Error */
+		DPRINTF("bulk read error, %s\n", 
+		    usb2_errstr(xfer->error));
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= AXE_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[AXE_BULK_CS_RD]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		DPRINTF("bulk read error, %s\n", usb2_errstr(xfer->error));
 		return;
 
 	}
 }
 
-static void
-axe_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct axe_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[AXE_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~AXE_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
 #if ((AXE_BULK_BUF_SIZE >= 0x10000) || (AXE_BULK_BUF_SIZE < (MCLBYTES+4)))
 #error "Please update axe_bulk_write_callback()!"
 #endif
@@ -906,16 +824,12 @@
 		ifp->if_opackets++;
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-
-		if (sc->sc_flags & AXE_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[AXE_BULK_CS_WR]);
-			goto done;
-		}
+tr_setup:
 		if ((sc->sc_flags & AXE_FLAG_LINK) == 0) {
 			/*
 			 * don't send anything if there is no link !
 			 */
-			goto done;
+			return;
 		}
 		pos = 0;
 
@@ -926,8 +840,7 @@
 			if (m == NULL) {
 				if (pos > 0)
 					break;	/* send out data */
-				else
-					goto done;
+				return;
 			}
 			if (m->m_pkthdr.len > MCLBYTES) {
 				m->m_pkthdr.len = MCLBYTES;
@@ -975,20 +888,19 @@
 
 		xfer->frlengths[0] = pos;
 		usb2_start_hardware(xfer);
-
-done:
 		return;
 
 	default:			/* Error */
 		DPRINTFN(11, "transfer error, %s\n",
 		    usb2_errstr(xfer->error));
 
+		ifp->if_oerrors++;
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= AXE_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[AXE_BULK_CS_WR]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		ifp->if_oerrors++;
 		return;
 
 	}
@@ -1071,7 +983,7 @@
 	/* Load the multicast filter. */
 	axe_setmulti(ue);
 
-	sc->sc_flags |= AXE_FLAG_READ_STALL | AXE_FLAG_WRITE_STALL;
+	usb2_transfer_set_stall(sc->sc_xfer[AXE_BULK_DT_WR]);
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	axe_start(ue);
@@ -1115,10 +1027,7 @@
 	 */
 	usb2_transfer_stop(sc->sc_xfer[AXE_BULK_DT_WR]);
 	usb2_transfer_stop(sc->sc_xfer[AXE_BULK_DT_RD]);
-	usb2_transfer_stop(sc->sc_xfer[AXE_BULK_CS_WR]);
-	usb2_transfer_stop(sc->sc_xfer[AXE_BULK_CS_RD]);
 	usb2_transfer_stop(sc->sc_xfer[AXE_INTR_DT_RD]);
-	usb2_transfer_stop(sc->sc_xfer[AXE_INTR_CS_RD]);
 
 	axe_reset(sc);
 }

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_axereg.h#4 (text+ko) ====

@@ -172,11 +172,8 @@
 enum {
 	AXE_BULK_DT_WR,
 	AXE_BULK_DT_RD,
-	AXE_BULK_CS_WR,
-	AXE_BULK_CS_RD,
 	AXE_INTR_DT_RD,
-	AXE_INTR_CS_RD,
-	AXE_N_TRANSFER = 6,
+	AXE_N_TRANSFER,
 };
 
 struct axe_softc {
@@ -187,9 +184,6 @@
 
 	int			sc_flags;
 #define	AXE_FLAG_LINK		0x0001
-#define	AXE_FLAG_INTR_STALL	0x0002
-#define	AXE_FLAG_READ_STALL	0x0004
-#define	AXE_FLAG_WRITE_STALL	0x0008
 #define	AXE_FLAG_772		0x1000	/* AX88772 */
 #define	AXE_FLAG_178		0x2000	/* AX88178 */
 

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

@@ -557,11 +557,17 @@
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 
-	/*
-	 * start all the transfers
-	 */
+	/* start interrupt transfer */
+	usb2_transfer_start(sc->sc_xfer[CDCE_INTR]);
+
+	/* stall data write direction, which depends on USB mode */
+	if (usb2_get_mode(sc->sc_ue.ue_udev) == USB_MODE_HOST)
+		usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_A]);
+	else
+		usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_B]);
+
+	/* start data transfers */
 	cdce_start(ue);
-	usb2_transfer_start(sc->sc_xfer[CDCE_INTR]);
 }
 
 static void

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cdcereg.h#4 (text+ko) ====

@@ -42,7 +42,7 @@
 	CDCE_BULK_A,
 	CDCE_BULK_B,
 	CDCE_INTR,
-	CDCE_N_TRANSFER = 3,
+	CDCE_N_TRANSFER,
 };
 
 struct cdce_softc {
@@ -52,7 +52,7 @@
 	struct mbuf		*sc_rx_buf[CDCE_FRAMES_MAX];
 	struct mbuf		*sc_tx_buf[CDCE_FRAMES_MAX];
 
-	uint16_t sc_flags;
+	int 			sc_flags;
 #define	CDCE_FLAG_ZAURUS	0x0001
 #define	CDCE_FLAG_NO_UNION	0x0002
 #define	CDCE_FLAG_RX_DATA	0x0010

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cue2.c#20 (text+ko) ====

@@ -88,9 +88,7 @@
 static device_detach_t cue_detach;
 static device_shutdown_t cue_shutdown;
 
-static usb2_callback_t cue_bulk_read_clear_stall_callback;
 static usb2_callback_t cue_bulk_read_callback;
-static usb2_callback_t cue_bulk_write_clear_stall_callback;
 static usb2_callback_t cue_bulk_write_callback;
 
 static usb2_ether_fn_t cue_attach_post;
@@ -137,28 +135,6 @@
 		.mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
 		.mh.callback = cue_bulk_read_callback,
 	},
-
-	[CUE_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 = cue_bulk_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[CUE_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 = cue_bulk_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static device_method_t cue_methods[] = {
@@ -452,19 +428,6 @@
 }
 
 static void
-cue_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct cue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[CUE_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~CUE_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 cue_bulk_read_callback(struct usb2_xfer *xfer)
 {
 	struct cue_softc *sc = xfer->priv_sc;
@@ -489,43 +452,26 @@
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-
-		if (sc->sc_flags & CUE_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[CUE_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);
 		usb2_ether_rxflush(ue);
 		return;
 
 	default:			/* Error */
+		DPRINTF("bulk read error, %s\n",
+		    usb2_errstr(xfer->error));
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= CUE_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[CUE_BULK_CS_RD]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		DPRINTF("bulk read error, %s\n",
-		    usb2_errstr(xfer->error));
 		return;
 
 	}
 }
 
 static void
-cue_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct cue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[CUE_BULK_DT_WR];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~CUE_FLAG_WRITE_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 cue_bulk_write_callback(struct usb2_xfer *xfer)
 {
 	struct cue_softc *sc = xfer->priv_sc;
@@ -540,19 +486,13 @@
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-
-		if (sc->sc_flags & CUE_FLAG_WRITE_STALL) {
-			usb2_transfer_start(sc->sc_xfer[CUE_BULK_CS_WR]);
-			goto done;
-		}
+tr_setup:
 		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
 
-		if (m == NULL) {
-			goto done;
-		}
-		if (m->m_pkthdr.len > MCLBYTES) {
+		if (m == NULL)
+			return;
+		if (m->m_pkthdr.len > MCLBYTES)
 			m->m_pkthdr.len = MCLBYTES;
-		}
 		xfer->frlengths[0] = (m->m_pkthdr.len + 2);
 
 		/* the first two bytes are the frame length */
@@ -575,21 +515,20 @@
 
 		usb2_start_hardware(xfer);
 
-done:
 		return;
 
 	default:			/* Error */
 		DPRINTFN(11, "transfer error, %s\n",
 		    usb2_errstr(xfer->error));
 
+		ifp->if_oerrors++;
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= CUE_FLAG_WRITE_STALL;
-			usb2_transfer_start(sc->sc_xfer[CUE_BULK_CS_WR]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		ifp->if_oerrors++;
 		return;
-
 	}
 }
 
@@ -661,7 +600,7 @@
 	/* Program the LED operation. */
 	cue_csr_write_1(sc, CUE_LEDCTL, CUE_LEDCTL_FOLLOW_LINK);
 
-	sc->sc_flags |= CUE_FLAG_READ_STALL | CUE_FLAG_WRITE_STALL;
+	usb2_transfer_set_stall(sc->sc_xfer[CUE_BULK_DT_WR]);
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	cue_start(ue);
@@ -686,8 +625,6 @@
 	 */
 	usb2_transfer_stop(sc->sc_xfer[CUE_BULK_DT_WR]);
 	usb2_transfer_stop(sc->sc_xfer[CUE_BULK_DT_RD]);
-	usb2_transfer_stop(sc->sc_xfer[CUE_BULK_CS_WR]);
-	usb2_transfer_stop(sc->sc_xfer[CUE_BULK_CS_RD]);
 
 	cue_csr_write_1(sc, CUE_ETHCTL, 0);
 	cue_reset(sc);

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_cuereg.h#4 (text+ko) ====

@@ -115,9 +115,7 @@
 enum {
 	CUE_BULK_DT_WR,
 	CUE_BULK_DT_RD,
-	CUE_BULK_CS_WR,
-	CUE_BULK_CS_RD,
-	CUE_N_TRANSFER = 4,
+	CUE_N_TRANSFER,
 };
 
 struct cue_softc {
@@ -126,11 +124,7 @@
 	struct usb2_xfer	*sc_xfer[CUE_N_TRANSFER];
 
 	int			sc_flags;
-#define	CUE_FLAG_READ_STALL	0x0010	/* wait for clearing of stall */
-#define	CUE_FLAG_WRITE_STALL	0x0020	/* wait for clearing of stall */
-#define	CUE_FLAG_LINK		0x0040	/* got a link */
-#define	CUE_FLAG_DETACH		0x0080	/* card gone */
-#define	CUE_FLAG_INTR_STALL	0x0100	/* wait for clearing of stall */
+#define	CUE_FLAG_LINK		0x0001	/* got a link */
 };
 
 #define	CUE_LOCK(_sc)		mtx_lock(&(_sc)->sc_mtx)

==== //depot/projects/usb/src/sys/dev/usb2/ethernet/if_kue2.c#20 (text+ko) ====

@@ -131,9 +131,7 @@
 static device_detach_t kue_detach;
 static device_shutdown_t kue_shutdown;
 
-static usb2_callback_t kue_bulk_read_clear_stall_callback;
 static usb2_callback_t kue_bulk_read_callback;
-static usb2_callback_t kue_bulk_write_clear_stall_callback;
 static usb2_callback_t kue_bulk_write_callback;
 
 static usb2_ether_fn_t kue_attach_post;
@@ -180,28 +178,6 @@
 		.mh.callback = kue_bulk_read_callback,
 		.mh.timeout = 0,	/* no timeout */
 	},
-
-	[KUE_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 = kue_bulk_write_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
-
-	[KUE_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 = kue_bulk_read_clear_stall_callback,
-		.mh.timeout = 1000,	/* 1 second */
-		.mh.interval = 50,	/* 50ms */
-	},
 };
 
 static device_method_t kue_methods[] = {
@@ -540,19 +516,6 @@
  * the higher level protocols.
  */
 static void
-kue_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
-	struct kue_softc *sc = xfer->priv_sc;
-	struct usb2_xfer *xfer_other = sc->sc_xfer[KUE_BULK_DT_RD];
-
-	if (usb2_clear_stall_callback(xfer, xfer_other)) {
-		DPRINTF("stall cleared\n");
-		sc->sc_flags &= ~KUE_FLAG_READ_STALL;
-		usb2_transfer_start(xfer_other);
-	}
-}
-
-static void
 kue_bulk_read_callback(struct usb2_xfer *xfer)
 {
 	struct kue_softc *sc = xfer->priv_sc;
@@ -577,43 +540,26 @@
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-
-		if (sc->sc_flags & KUE_FLAG_READ_STALL) {
-			usb2_transfer_start(sc->sc_xfer[KUE_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);
 		usb2_ether_rxflush(ue);
 		return;
 
 	default:			/* Error */
+		DPRINTF("bulk read error, %s\n",
+		    usb2_errstr(xfer->error));
+
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			sc->sc_flags |= KUE_FLAG_READ_STALL;
-			usb2_transfer_start(sc->sc_xfer[KUE_BULK_CS_RD]);
+			xfer->flags.stall_pipe = 1;
+			goto tr_setup;
 		}
-		DPRINTF("bulk read error, %s\n",
-		    usb2_errstr(xfer->error));
 		return;
 

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


More information about the p4-projects mailing list