Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Feb 2009 02:04:24 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r187974 - in user/thompsa/usb/sys/dev/usb2: bluetooth core ethernet serial storage
Message-ID:  <200902010204.n1124O9m039927@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Sun Feb  1 02:04:24 2009
New Revision: 187974
URL: http://svn.freebsd.org/changeset/base/187974

Log:
  - Resubmit the xfer when pipe_stall is set, this removes the need for gotos.
  - Use usb2_clear_endpoint_stall() throughout.

Modified:
  user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c
  user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c
  user/thompsa/usb/sys/dev/usb2/core/usb2_core.h
  user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c
  user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c
  user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c
  user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c
  user/thompsa/usb/sys/dev/usb2/serial/u3g2.c
  user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c

Modified: user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -742,8 +742,8 @@ submit_next:
 				usb2_errstr(xfer->error));
 
 			/* Try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto submit_next;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 			/* transfer cancelled */
 		break;
@@ -838,8 +838,8 @@ submit_next:
 				usb2_errstr(xfer->error));
 
 			/* Try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto submit_next;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 			/* transfer cancelled */
 		break;
@@ -866,7 +866,6 @@ ubt_bulk_write_callback(struct usb2_xfer
 		/* FALLTHROUGH */
 
 	case USB_ST_SETUP:
-send_next:
 		/* Get next mbuf, if any */
 		UBT_NG_LOCK(sc);
 		NG_BT_MBUFQ_DEQUEUE(&sc->sc_aclq, m);
@@ -901,8 +900,8 @@ send_next:
 			UBT_STAT_OERROR(sc);
 
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto send_next;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 			/* transfer cancelled */
 		break;

Modified: user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -265,7 +265,6 @@ ubtbcmfw_write_callback(struct usb2_xfer
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_SETUP:
 	case USB_ST_TRANSFERRED:
-setup_next:
 		if (usb2_fifo_get_data(f, xfer->frbuffers, 0,
 				xfer->max_data_length, &actlen, 0)) {
 			xfer->frlengths[0] = actlen;
@@ -276,8 +275,8 @@ setup_next:
 	default: /* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto setup_next;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
@@ -299,7 +298,6 @@ ubtbcmfw_read_callback(struct usb2_xfer 
 		/* FALLTHROUGH */
 
 	case USB_ST_SETUP:
-setup_next:
 		if (usb2_fifo_put_bytes_max(fifo) > 0) {
 			xfer->frlengths[0] = xfer->max_data_length;
 			usb2_start_hardware(xfer);
@@ -309,8 +307,8 @@ setup_next:
 	default: /* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto setup_next;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}

Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_core.h
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_core.h	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_core.h	Sun Feb  1 02:04:24 2009	(r187974)
@@ -445,9 +445,8 @@ void	usb2_set_frame_data(struct usb2_xfe
 void	usb2_set_frame_offset(struct usb2_xfer *xfer, uint32_t offset,
 	    uint32_t frindex);
 void	usb2_start_hardware(struct usb2_xfer *xfer);
-void	usb2_transfer_clear_stall(struct usb2_xfer *xfer);
 void	usb2_transfer_drain(struct usb2_xfer *xfer);
-void	usb2_transfer_set_stall(struct usb2_xfer *xfer);
+void	usb2_clear_endpoint_stall(struct usb2_xfer *xfer);
 void	usb2_transfer_start(struct usb2_xfer *xfer);
 void	usb2_transfer_stop(struct usb2_xfer *xfer);
 void	usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup);

Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -93,7 +93,11 @@ usb2_handle_request_callback(struct usb2
 		         * If no control transfer is active,
 		         * receive the next SETUP message:
 		         */
-			goto tr_restart;
+			xfer->frlengths[0] = sizeof(struct usb2_device_request);
+			xfer->nframes = 1;
+			xfer->flags.manual_status = 1;
+			xfer->flags.force_short_xfer = 0;
+			xfer->flags.stall_pipe = 1;	/* cancel previous transfer, if any */
 		}
 		usb2_start_hardware(xfer);
 		break;
@@ -101,19 +105,11 @@ usb2_handle_request_callback(struct usb2
 	default:
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* should not happen - try stalling */
-			goto tr_restart;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
-	return;
-
-tr_restart:
-	xfer->frlengths[0] = sizeof(struct usb2_device_request);
-	xfer->nframes = 1;
-	xfer->flags.manual_status = 1;
-	xfer->flags.force_short_xfer = 0;
-	xfer->flags.stall_pipe = 1;	/* cancel previous transfer, if any */
-	usb2_start_hardware(xfer);
 }
 
 /*------------------------------------------------------------------------*

Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -170,14 +170,9 @@ uhub_intr_callback(struct usb2_xfer *xfe
 
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
-			/*
-			 * Do a clear-stall. The "stall_pipe" flag
-			 * will get cleared before next callback by
-			 * the USB stack.
-			 */
-			xfer->flags.stall_pipe = 1;
-			xfer->frlengths[0] = xfer->max_data_length;
-			usb2_start_hardware(xfer);
+			/* Do a clear-stall. */
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}

Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -1909,6 +1909,11 @@ usb2_callback_wrapper(struct usb2_xfer_q
 	/* call processing routine */
 	(xfer->callback) (xfer);
 
+	if (xfer->usb2_state == USB_ST_ERROR && xfer->flags.stall_pipe) {
+		/* resubmit xfer */
+		xfer->usb2_state = USB_ST_SETUP;
+		(xfer->callback) (xfer);
+	}
 	/* pickup the USB mutex again */
 	USB_BUS_LOCK(xfer->xroot->bus);
 
@@ -2108,7 +2113,7 @@ usb2_transfer_start_cb(void *arg)
  * callback. This function is NULL safe.
  *------------------------------------------------------------------------*/
 void
-usb2_transfer_set_stall(struct usb2_xfer *xfer)
+usb2_clear_endpoint_stall(struct usb2_xfer *xfer)
 {
 	if (xfer == NULL) {
 		/* tearing down */
@@ -2125,29 +2130,6 @@ usb2_transfer_set_stall(struct usb2_xfer
 }
 
 /*------------------------------------------------------------------------*
- *	usb2_transfer_clear_stall
- *
- * This function is used to clear the stall flag outside the
- * callback. This function is NULL safe.
- *------------------------------------------------------------------------*/
-void
-usb2_transfer_clear_stall(struct usb2_xfer *xfer)
-{
-	if (xfer == NULL) {
-		/* tearing down */
-		return;
-	}
-	USB_XFER_LOCK_ASSERT(xfer, MA_OWNED);
-
-	/* avoid any races by locking the USB mutex */
-	USB_BUS_LOCK(xfer->xroot->bus);
-
-	xfer->flags.stall_pipe = 0;
-
-	USB_BUS_UNLOCK(xfer->xroot->bus);
-}
-
-/*------------------------------------------------------------------------*
  *	usb2_pipe_start
  *
  * This function is used to add an USB transfer to the pipe transfer list.

Modified: user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -598,7 +598,6 @@ cdce_bulk_write_512x4_callback(struct us
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-tr_setup:
 		x = 0;			/* number of frames */
 		y = 1;			/* number of fragments */
 
@@ -683,8 +682,8 @@ tr_setup:
 
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
@@ -772,8 +771,8 @@ tr_setup:
 
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
@@ -906,8 +905,8 @@ cdce_init_locked(struct cdce_softc *sc)
 	if (sc->sc_flags & CDCE_FLAG_DETACH)
 		return;
 
-	usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_A]);
-	usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_B]);
+	usb2_clear_endpoint_stall(sc->sc_xfer[CDCE_BULK_A]);
+	usb2_clear_endpoint_stall(sc->sc_xfer[CDCE_BULK_B]);
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	cdce_start_transfers(sc);
@@ -947,8 +946,8 @@ cdce_bulk_read_512x4_callback(struct usb
 			    (sc->sc_rx.hdr.bSig[0] != 'F') ||
 			    (sc->sc_rx.hdr.bSig[1] != 'L')) {
 				/* try to clear stall first */
-				xfer->flags.stall_pipe = 1;
-				goto tr_setup;
+				usb2_clear_endpoint_stall(xfer);
+				return;
 			}
 			rx_frags = (xfer->actlen -
 			    CDCE_512X4_FRAG_LENGTH_OFFSET) / 2;
@@ -966,7 +965,6 @@ cdce_bulk_read_512x4_callback(struct usb
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-tr_setup:
 		if (xfer->flags.stall_pipe) {
 			/* we are done */
 			sc->sc_flags &= ~CDCE_FLAG_RX_DATA;
@@ -985,8 +983,8 @@ tr_setup:
 		/* verify number of fragments */
 		if (rx_frags > CDCE_512X4_FRAGS_MAX) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		/* check if the last fragment does not complete a frame */
 		x = rx_frags - 1;
@@ -994,8 +992,8 @@ tr_setup:
 		if (!(flen & CDCE_512X4_FRAG_LAST_MASK)) {
 			DPRINTF("no last frag mask\n");
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		/*
 		 * Setup a new USB transfer chain to receive all the
@@ -1025,8 +1023,8 @@ tr_setup:
 				 */
 				if (offset > (MCLBYTES - ETHER_ALIGN)) {
 					/* try to clear stall first */
-					xfer->flags.stall_pipe = 1;
-					goto tr_setup;
+					usb2_clear_endpoint_stall(xfer);
+					return;
 				} if (offset > (MHLEN - ETHER_ALIGN)) {
 					m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
 				} else {
@@ -1085,8 +1083,8 @@ tr_setup:
 			}
 			if (y == CDCE_512X4_FRAMES_MAX) {
 				/* try to clear stall first */
-				xfer->flags.stall_pipe = 1;
-				goto tr_setup;
+				usb2_clear_endpoint_stall(xfer);
+				return;
 			}
 		}
 
@@ -1103,8 +1101,8 @@ tr_setup:
 
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		free_mq = 1;
 		break;
@@ -1192,8 +1190,8 @@ tr_setup:
 
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		return;
 	}
@@ -1257,7 +1255,6 @@ cdce_intr_read_callback(struct usb2_xfer
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-tr_setup:
 		xfer->frlengths[0] = xfer->max_data_length;
 		usb2_start_hardware(xfer);
 		break;
@@ -1265,8 +1262,8 @@ tr_setup:
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* start clear stall */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
@@ -1283,7 +1280,6 @@ cdce_intr_write_callback(struct usb2_xfe
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
-tr_setup:
 #if 0
 		xfer->frlengths[0] = XXX;
 		usb2_start_hardware(xfer);
@@ -1293,8 +1289,8 @@ tr_setup:
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* start clear stall */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}

Modified: user/thompsa/usb/sys/dev/usb2/serial/u3g2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/serial/u3g2.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/serial/u3g2.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -420,8 +420,8 @@ u3g_attach(device_t dev)
 			goto detach;
 		}
 		/* set stall by default */
-		usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_WR]);
-		usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_RD]);
+		usb2_clear_endpoint_stall(sc->sc_xfer[m][U3G_BULK_WR]);
+		usb2_clear_endpoint_stall(sc->sc_xfer[m][U3G_BULK_RD]);
 	}
 
 	sc->sc_numports = m;
@@ -508,7 +508,6 @@ u3g_write_callback(struct usb2_xfer *xfe
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 	case USB_ST_SETUP:
-tr_setup:
 		if (usb2_com_get_data(ucom, xfer->frbuffers, 0,
 		    U3G_BSIZE, &actlen)) {
 			xfer->frlengths[0] = actlen;
@@ -519,8 +518,8 @@ tr_setup:
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* do a builtin clear-stall */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}
@@ -537,7 +536,6 @@ u3g_read_callback(struct usb2_xfer *xfer
 		usb2_com_put_data(ucom, xfer->frbuffers, 0, xfer->actlen);
 
 	case USB_ST_SETUP:
-tr_setup:
 		xfer->frlengths[0] = xfer->max_data_length;
 		usb2_start_hardware(xfer);
 		break;
@@ -545,8 +543,8 @@ tr_setup:
 	default:			/* Error */
 		if (xfer->error != USB_ERR_CANCELLED) {
 			/* do a builtin clear-stall */
-			xfer->flags.stall_pipe = 1;
-			goto tr_setup;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
 		break;
 	}

Modified: user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c	Sun Feb  1 01:50:09 2009	(r187973)
+++ user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c	Sun Feb  1 02:04:24 2009	(r187974)
@@ -560,15 +560,7 @@ ustorage_fs_t_bbb_command_callback(struc
 		break;
 
 	case USB_ST_SETUP:
-tr_setup:
-		if (sc->sc_transfer.data_error) {
-			sc->sc_transfer.data_error = 0;
-			xfer->flags.stall_pipe = 1;
-			DPRINTF("stall pipe\n");
-		} else {
-			xfer->flags.stall_pipe = 0;
-		}
-
+		sc->sc_transfer.data_error = 0;
 		xfer->frlengths[0] = sizeof(sc->sc_cbw);
 		usb2_set_frame_data(xfer, &sc->sc_cbw, 0);
 		usb2_start_hardware(xfer);
@@ -581,10 +573,10 @@ tr_setup:
 		}
 		/* If the pipe is already stalled, don't do another stall */
 		if (!xfer->pipe->is_stalled) {
-			sc->sc_transfer.data_error = 1;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
-		/* try again */
-		goto tr_setup;
+		break;
 	}
 	if (error) {
 		if (sc->sc_csw.bCSWStatus == 0) {
@@ -628,16 +620,10 @@ ustorage_fs_t_bbb_data_dump_callback(str
 		/* Fallthrough */
 
 	case USB_ST_SETUP:
-tr_setup:
 		if (max_bulk > sc->sc_transfer.data_rem) {
 			max_bulk = sc->sc_transfer.data_rem;
 		}
-		if (sc->sc_transfer.data_error) {
-			sc->sc_transfer.data_error = 0;
-			xfer->flags.stall_pipe = 1;
-		} else {
-			xfer->flags.stall_pipe = 0;
-		}
+		sc->sc_transfer.data_error = 0;
 		xfer->frlengths[0] = max_bulk;
 		usb2_start_hardware(xfer);
 		break;
@@ -650,10 +636,10 @@ tr_setup:
 		 * If the pipe is already stalled, don't do another stall:
 		 */
 		if (!xfer->pipe->is_stalled) {
-			sc->sc_transfer.data_error = 1;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
-		/* try again */
-		goto tr_setup;
+		break;
 	}
 }
 
@@ -681,17 +667,10 @@ ustorage_fs_t_bbb_data_read_callback(str
 		/* Fallthrough */
 
 	case USB_ST_SETUP:
-tr_setup:
 		if (max_bulk > sc->sc_transfer.data_rem) {
 			max_bulk = sc->sc_transfer.data_rem;
 		}
-		if (sc->sc_transfer.data_error) {
-			sc->sc_transfer.data_error = 0;
-			xfer->flags.stall_pipe = 1;
-		} else {
-			xfer->flags.stall_pipe = 0;
-		}
-
+		sc->sc_transfer.data_error = 0;
 		xfer->frlengths[0] = max_bulk;
 		usb2_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
 		usb2_start_hardware(xfer);
@@ -703,10 +682,10 @@ tr_setup:
 		}
 		/* If the pipe is already stalled, don't do another stall */
 		if (!xfer->pipe->is_stalled) {
-			sc->sc_transfer.data_error = 1;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
-		/* try again */
-		goto tr_setup;
+		break;
 	}
 }
 
@@ -732,7 +711,6 @@ ustorage_fs_t_bbb_data_write_callback(st
 			break;
 		}
 	case USB_ST_SETUP:
-tr_setup:
 		if (max_bulk >= sc->sc_transfer.data_rem) {
 			max_bulk = sc->sc_transfer.data_rem;
 			if (sc->sc_transfer.data_short) {
@@ -744,13 +722,7 @@ tr_setup:
 			xfer->flags.force_short_xfer = 0;
 		}
 
-		if (sc->sc_transfer.data_error) {
-			sc->sc_transfer.data_error = 0;
-			xfer->flags.stall_pipe = 1;
-		} else {
-			xfer->flags.stall_pipe = 0;
-		}
-
+		sc->sc_transfer.data_error = 0;
 		xfer->frlengths[0] = max_bulk;
 		usb2_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
 		usb2_start_hardware(xfer);
@@ -765,10 +737,10 @@ tr_setup:
 		 * stall
 		 */
 		if (!xfer->pipe->is_stalled) {
-			sc->sc_transfer.data_error = 1;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
-		/* try again */
-		goto tr_setup;
+		break;
 	}
 }
 
@@ -785,17 +757,10 @@ ustorage_fs_t_bbb_status_callback(struct
 		break;
 
 	case USB_ST_SETUP:
-tr_setup:
 		USETDW(sc->sc_csw.dCSWSignature, CSWSIGNATURE);
 		USETDW(sc->sc_csw.dCSWDataResidue, sc->sc_transfer.data_rem);
 
-		if (sc->sc_transfer.data_error) {
-			sc->sc_transfer.data_error = 0;
-			xfer->flags.stall_pipe = 1;
-		} else {
-			xfer->flags.stall_pipe = 0;
-		}
-
+		sc->sc_transfer.data_error = 0;
 		xfer->frlengths[0] = sizeof(sc->sc_csw);
 		usb2_set_frame_data(xfer, &sc->sc_csw, 0);
 		usb2_start_hardware(xfer);
@@ -807,10 +772,10 @@ tr_setup:
 		}
 		/* If the pipe is already stalled, don't do another stall */
 		if (!xfer->pipe->is_stalled) {
-			sc->sc_transfer.data_error = 1;
+			usb2_clear_endpoint_stall(xfer);
+			return;
 		}
-		/* try again */
-		goto tr_setup;
+		break;
 	}
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902010204.n1124O9m039927>