Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Mar 2009 14:33:24 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 159674 for review
Message-ID:  <200903231433.n2NEXOkX020789@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=159674

Change 159674 by hselasky@hselasky_laptop001 on 2009/03/23 14:32:55

	
	USB controller (Device Side Mode):
	- fix more corner cases around reception of SETUP packets.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/controller/at91dci.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb/controller/atmegadci.c#14 edit
.. //depot/projects/usb/src/sys/dev/usb/controller/musb_otg.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/controller/uss820dci.c#9 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/controller/at91dci.c#10 (text+ko) ====


==== //depot/projects/usb/src/sys/dev/usb/controller/atmegadci.c#14 (text+ko) ====

@@ -306,7 +306,10 @@
 		    ATMEGA_UECONX_STALLRQ);
 		td->did_stall = 1;
 	}
-
+	if (temp & ATMEGA_UEINTX_RXSTPI) {
+		/* clear SETUP packet interrupt */
+		ATMEGA_WRITE_1(sc, ATMEGA_UEINTX, ~ATMEGA_UEINTX_RXSTPI);
+	}
 	/* we only want to know if there is a SETUP packet */
 	ATMEGA_WRITE_1(sc, ATMEGA_UEIENX, ATMEGA_UEIENX_RXSTPE);
 	return (1);			/* not complete */

==== //depot/projects/usb/src/sys/dev/usb/controller/musb_otg.c#8 (text+ko) ====

@@ -292,11 +292,15 @@
 	if (count != td->remainder) {
 		DPRINTFN(0, "Invalid SETUP packet "
 		    "length, %d bytes\n", count);
+		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+		      MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
 		goto not_complete;
 	}
 	if (count != sizeof(req)) {
 		DPRINTFN(0, "Unsupported SETUP packet "
 		    "length, %d bytes\n", count);
+		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+		      MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
 		goto not_complete;
 	}
 	/* receive data */

==== //depot/projects/usb/src/sys/dev/usb/controller/uss820dci.c#9 (text+ko) ====

@@ -275,12 +275,12 @@
 	if (count != td->remainder) {
 		DPRINTFN(0, "Invalid SETUP packet "
 		    "length, %d bytes\n", count);
-		goto not_complete;
+		goto setup_not_complete;
 	}
 	if (count != sizeof(req)) {
 		DPRINTFN(0, "Unsupported SETUP packet "
 		    "length, %d bytes\n", count);
-		goto not_complete;
+		goto setup_not_complete;
 	}
 	/* receive data */
 	bus_space_read_multi_1(td->io_tag, td->io_hdl,
@@ -323,13 +323,22 @@
 	}
 	return (0);			/* complete */
 
+setup_not_complete:
+
+	/* set RXFFRC bit */
+	temp = bus_space_read_1(td->io_tag, td->io_hdl,
+	    td->rx_cntl_reg);
+	temp |= USS820_RXCON_RXFFRC;
+	bus_space_write_1(td->io_tag, td->io_hdl,
+	    td->rx_cntl_reg, temp);
+
+	/* FALLTHROUGH */
+
 not_complete:
 	/* abort any ongoing transfer */
 	if (!td->did_stall) {
 		DPRINTFN(5, "stalling\n");
-
 		/* set stall */
-
 		uss820dci_update_shared_1(sc, USS820_EPCON, 0xFF,
 		    (USS820_EPCON_TXSTL | USS820_EPCON_RXSTL));
 



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