svn commit: r269586 - head/sys/dev/usb/controller
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Aug 5 13:36:27 UTC 2014
Author: hselasky
Date: Tue Aug 5 13:36:26 2014
New Revision: 269586
URL: http://svnweb.freebsd.org/changeset/base/269586
Log:
- Ensure code which only applies to the control endpoint is not run
for other endpoints in the data transfer path.
- Ensure all bits of the "EPCON" register is written during
initialisation.
MFC after: 3 days
Modified:
head/sys/dev/usb/controller/uss820dci.c
Modified: head/sys/dev/usb/controller/uss820dci.c
==============================================================================
--- head/sys/dev/usb/controller/uss820dci.c Tue Aug 5 13:01:21 2014 (r269585)
+++ head/sys/dev/usb/controller/uss820dci.c Tue Aug 5 13:36:26 2014 (r269586)
@@ -400,7 +400,7 @@ repeat:
if (rx_stat & (USS820_RXSTAT_RXSETUP |
USS820_RXSTAT_RXSOVW |
USS820_RXSTAT_EDOVW)) {
- if (td->remainder == 0) {
+ if (td->remainder == 0 && td->ep_index == 0) {
/*
* We are actually complete and have
* received the next SETUP
@@ -515,21 +515,24 @@ repeat:
/* read out TX FIFO flags */
tx_flag = USS820_READ_1(sc, USS820_TXFLG);
- /* read out RX FIFO status last */
- rx_stat = USS820_READ_1(sc, USS820_RXSTAT);
+ DPRINTFN(5, "tx_flag=0x%02x rem=%u\n", tx_flag, td->remainder);
- DPRINTFN(5, "rx_stat=0x%02x tx_flag=0x%02x rem=%u\n",
- rx_stat, tx_flag, td->remainder);
+ if (td->ep_index == 0) {
+ /* read out RX FIFO status last */
+ rx_stat = USS820_READ_1(sc, USS820_RXSTAT);
- if (rx_stat & (USS820_RXSTAT_RXSETUP |
- USS820_RXSTAT_RXSOVW |
- USS820_RXSTAT_EDOVW)) {
- /*
- * The current transfer was aborted
- * by the USB Host
- */
- td->error = 1;
- return (0); /* complete */
+ DPRINTFN(5, "rx_stat=0x%02x\n", rx_stat);
+
+ if (rx_stat & (USS820_RXSTAT_RXSETUP |
+ USS820_RXSTAT_RXSOVW |
+ USS820_RXSTAT_EDOVW)) {
+ /*
+ * The current transfer was aborted by the USB
+ * Host:
+ */
+ td->error = 1;
+ return (0); /* complete */
+ }
}
if (tx_flag & (USS820_TXFLG_TXOVF |
USS820_TXFLG_TXURF)) {
@@ -611,20 +614,21 @@ uss820dci_data_tx_sync(struct uss820dci_
/* read out TX FIFO flag */
tx_flag = USS820_READ_1(sc, USS820_TXFLG);
- /* read out RX FIFO status last */
- rx_stat = USS820_READ_1(sc, USS820_RXSTAT);
-
- DPRINTFN(5, "rx_stat=0x%02x rem=%u\n", rx_stat, td->remainder);
-
- if (rx_stat & (USS820_RXSTAT_RXSETUP |
- USS820_RXSTAT_RXSOVW |
- USS820_RXSTAT_EDOVW)) {
- DPRINTFN(5, "faking complete\n");
- /* Race condition */
- return (0); /* complete */
+ if (td->ep_index == 0) {
+ /* read out RX FIFO status last */
+ rx_stat = USS820_READ_1(sc, USS820_RXSTAT);
+
+ DPRINTFN(5, "rx_stat=0x%02x rem=%u\n", rx_stat, td->remainder);
+
+ if (rx_stat & (USS820_RXSTAT_RXSETUP |
+ USS820_RXSTAT_RXSOVW |
+ USS820_RXSTAT_EDOVW)) {
+ DPRINTFN(5, "faking complete\n");
+ /* Race condition */
+ return (0); /* complete */
+ }
}
- DPRINTFN(5, "tx_flag=0x%02x rem=%u\n",
- tx_flag, td->remainder);
+ DPRINTFN(5, "tx_flag=0x%02x rem=%u\n", tx_flag, td->remainder);
if (tx_flag & (USS820_TXFLG_TXOVF |
USS820_TXFLG_TXURF)) {
@@ -635,7 +639,7 @@ uss820dci_data_tx_sync(struct uss820dci_
USS820_TXFLG_TXFIF1)) {
return (1); /* not complete */
}
- if (sc->sc_dv_addr != 0xFF) {
+ if (td->ep_index == 0 && sc->sc_dv_addr != 0xFF) {
/* write function address */
uss820dci_set_address(sc, sc->sc_dv_addr);
}
@@ -1528,7 +1532,7 @@ uss820dci_init(struct uss820dci_softc *s
temp = USS820_EPCON_RXEPEN | USS820_EPCON_TXEPEN;
}
- uss820dci_update_shared_1(sc, USS820_EPCON, 0xFF, temp);
+ uss820dci_update_shared_1(sc, USS820_EPCON, 0, temp);
}
USB_BUS_UNLOCK(&sc->sc_bus);
More information about the svn-src-head
mailing list