svn commit: r191401 - head/sys/dev/usb/controller

Andrew Thompson thompsa at FreeBSD.org
Wed Apr 22 17:08:14 UTC 2009


Author: thompsa
Date: Wed Apr 22 17:08:13 2009
New Revision: 191401
URL: http://svn.freebsd.org/changeset/base/191401

Log:
  MFp4 //depot/projects/usb at 160708
  
  Need to check Read/Write allowed before writing any data for non-control
  transfers.
  
  Submitted by:	Hans Petter Selasky

Modified:
  head/sys/dev/usb/controller/atmegadci.c

Modified: head/sys/dev/usb/controller/atmegadci.c
==============================================================================
--- head/sys/dev/usb/controller/atmegadci.c	Wed Apr 22 17:08:10 2009	(r191400)
+++ head/sys/dev/usb/controller/atmegadci.c	Wed Apr 22 17:08:13 2009	(r191401)
@@ -103,7 +103,6 @@ static const struct usb2_hw_ep_profile
 		.max_in_frame_size = 64,
 		.max_out_frame_size = 64,
 		.is_simplex = 1,
-		.support_multi_buffer = 1,
 		.support_bulk = 1,
 		.support_interrupt = 1,
 		.support_isochronous = 1,
@@ -451,11 +450,13 @@ repeat:
 		td->error = 1;
 		return (0);		/* complete */
 	}
-	if (!(temp & (ATMEGA_UEINTX_FIFOCON |
-	    ATMEGA_UEINTX_TXINI))) {
-		/* cannot write any data */
+
+	temp = ATMEGA_READ_1(sc, ATMEGA_UESTA0X);
+	if (temp & 3) {
+		/* cannot write any data - a bank is busy */
 		goto not_complete;
 	}
+
 	count = td->max_packet_size;
 	if (td->remainder < count) {
 		/* we have a short packet */
@@ -529,9 +530,9 @@ atmegadci_data_tx_sync(struct atmegadci_
 	 * The control endpoint has only got one bank, so if that bank
 	 * is free the packet has been transferred!
 	 */
-	if (!(temp & (ATMEGA_UEINTX_FIFOCON |
-	    ATMEGA_UEINTX_TXINI))) {
-		/* cannot write any data */
+	temp = ATMEGA_READ_1(sc, ATMEGA_UESTA0X);
+	if (temp & 3) {
+		/* cannot write any data - a bank is busy */
 		goto not_complete;
 	}
 	if (sc->sc_dv_addr != 0xFF) {
@@ -1166,7 +1167,7 @@ atmegadci_clear_stall_sub(struct atmegad
 		ATMEGA_WRITE_1(sc, ATMEGA_UECFG0X, temp);
 		ATMEGA_WRITE_1(sc, ATMEGA_UECFG1X,
 		    ATMEGA_UECFG1X_ALLOC |
-		    ATMEGA_UECFG1X_EPBK1 |
+		    ATMEGA_UECFG1X_EPBK0 |	/* one bank */
 		    ATMEGA_UECFG1X_EPSIZE(3));
 
 		temp = ATMEGA_READ_1(sc, ATMEGA_UESTA0X);


More information about the svn-src-all mailing list