Author: hselasky
Date: Fri Jan 24 07:43:46 2014
New Revision: 261104
URL: http://svnweb.freebsd.org/changeset/base/261104

Log:
  MFC r260563:
  Make sure reserved fields of the EHCI DMA descriptors are not dirty
  after previous transfers.

Modified:
  stable/10/sys/dev/usb/controller/ehci.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/usb/controller/ehci.c
==============================================================================
--- stable/10/sys/dev/usb/controller/ehci.c     Fri Jan 24 07:42:26 2014        
(r261103)
+++ stable/10/sys/dev/usb/controller/ehci.c     Fri Jan 24 07:43:46 2014        
(r261104)
@@ -1654,12 +1654,17 @@ restart:
                        }
                        td->len = 0;
 
+                       /* properly reset reserved fields */
                        td->qtd_buffer[0] = 0;
-                       td->qtd_buffer_hi[0] = 0;
-
                        td->qtd_buffer[1] = 0;
+                       td->qtd_buffer[2] = 0;
+                       td->qtd_buffer[3] = 0;
+                       td->qtd_buffer[4] = 0;
+                       td->qtd_buffer_hi[0] = 0;
                        td->qtd_buffer_hi[1] = 0;
-
+                       td->qtd_buffer_hi[2] = 0;
+                       td->qtd_buffer_hi[3] = 0;
+                       td->qtd_buffer_hi[4] = 0;
                } else {
 
                        uint8_t x;
@@ -1714,6 +1719,12 @@ restart:
                            htohc32(temp->sc,
                            buf_res.physaddr & (~0xFFF));
                        td->qtd_buffer_hi[x] = 0;
+
+                       /* properly reset reserved fields */
+                       while (++x < EHCI_QTD_NBUFFERS) {
+                               td->qtd_buffer[x] = 0;
+                               td->qtd_buffer_hi[x] = 0;
+                       }
                }
 
                if (td_next) {
@@ -2001,6 +2012,18 @@ ehci_setup_standard_chain(struct usb_xfe
        qh->qh_qtd.qtd_altnext =
            htohc32(temp.sc, EHCI_LINK_TERMINATE);
 
+       /* properly reset reserved fields */
+       qh->qh_qtd.qtd_buffer[0] = 0;
+       qh->qh_qtd.qtd_buffer[1] = 0;
+       qh->qh_qtd.qtd_buffer[2] = 0;
+       qh->qh_qtd.qtd_buffer[3] = 0;
+       qh->qh_qtd.qtd_buffer[4] = 0;
+       qh->qh_qtd.qtd_buffer_hi[0] = 0;
+       qh->qh_qtd.qtd_buffer_hi[1] = 0;
+       qh->qh_qtd.qtd_buffer_hi[2] = 0;
+       qh->qh_qtd.qtd_buffer_hi[3] = 0;
+       qh->qh_qtd.qtd_buffer_hi[4] = 0;
+
        usb_pc_cpu_flush(qh->page_cache);
 
        if (xfer->xroot->udev->flags.self_suspended == 0) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to