[openfirmware] r1459 - dev/usb2/hcd/ehci

svn at openfirmware.info svn at openfirmware.info
Thu Nov 5 01:55:52 CET 2009


Author: wmb
Date: 2009-11-05 00:55:52 +0000 (Thu, 05 Nov 2009)
New Revision: 1459

Modified:
   dev/usb2/hcd/ehci/bulk.fth
Log:
OLPC trac 9611 - EHCI USB 2.0 driver - When a pipe has to be unstalled,
the execution of control-set from inside a bulk-out transaction killed
the "my-qh" value, leading to erratic behavior such as page faults.


Modified: dev/usb2/hcd/ehci/bulk.fth
===================================================================
--- dev/usb2/hcd/ehci/bulk.fth	2009-11-04 11:02:54 UTC (rev 1458)
+++ dev/usb2/hcd/ehci/bulk.fth	2009-11-05 00:55:52 UTC (rev 1459)
@@ -20,6 +20,9 @@
 0 instance value bulk-out-qh		\ For begin-bulk-out-ring ...
 0 instance value bulk-out-qtd		\ For begin-bulk-out-ring ...
 
+0 instance value my-bulk-qh             \ Cannot use my-qh because unstall-pipe kills it
+0 instance value my-bulk-qtd
+
 : bulk-in-data@         ( -- n )  bulk-in-pipe  target di-in-data@   di-data>td-data  ;
 : bulk-out-data@        ( -- n )  bulk-out-pipe target di-out-data@  di-data>td-data  ;
 : bulk-in-data!         ( n -- )  td-data>di-data bulk-in-pipe  target di-in-data!   ;
@@ -443,43 +446,43 @@
    debug?  if  ." bulk-in" cr  then
    dup to bulk-in-pipe
    process-bulk-args
-   ?alloc-bulk-qhqtds  to my-qtd  to  my-qh
-   bulk-in-timeout my-qh >qh-timeout l!
+   ?alloc-bulk-qhqtds  to my-bulk-qtd  to  my-bulk-qh
+   bulk-in-timeout my-bulk-qh >qh-timeout l!
 
    \ IN qTDs
-   TD_PID_IN my-qtd fill-bulk-io-qtds
+   TD_PID_IN my-bulk-qtd fill-bulk-io-qtds
 
    \ Start bulk in transaction
-   my-qh pt-bulk fill-qh
-   my-qh insert-qh
+   my-bulk-qh pt-bulk fill-qh
+   my-bulk-qh insert-qh
 
    \ Process results
-   my-qh done?  if
+   my-bulk-qh done?  if				( )
       0						( actual )	\ System error, timeout
-   else
-      my-qh error?  if
+   else						( )
+      my-bulk-qh error?  if			( )
          0					( actual )	\ USB error
-      else
-         my-qtd dup my-#qtds get-actual				( qtd actual )
+      else					( )
+         my-bulk-qtd dup my-#qtds get-actual	( qtd actual )
          over >qtd-buf l@ rot >qtd-pbuf l@ 2 pick dma-sync	( actual )
-      then
-   then
+      then					( actual )
+   then						( actual )
 
    usb-error					( actual usberr )
-   my-qtd map-out-bptrs
-   my-qh dup fixup-bulk-in-data
-   remove-qh
+   my-bulk-qtd map-out-bptrs			( actual usberr )
+   my-bulk-qh dup fixup-bulk-in-data		( actual usberr )
+   remove-qh					( actual usberr )
 ;
 
 0 instance value bulk-out-busy?
 : done-bulk-out  ( -- error? )
    \ Process results
-   my-qh done? 0=  if  my-qh error? drop  then
+   my-bulk-qh done? 0=  if  my-bulk-qh error? drop  then
 
    usb-error				( usberr )
-   my-qtd map-out-bptrs			( usberr )
-   my-qh fixup-bulk-out-data		( usberr )
-   my-qh remove-qh			( usberr )
+   my-bulk-qtd map-out-bptrs		( usberr )
+   my-bulk-qh fixup-bulk-out-data	( usberr )
+   my-bulk-qh remove-qh			( usberr )
    false to bulk-out-busy?		( usberr )
 ;
 : start-bulk-out  ( buf len pipe -- usberr )
@@ -490,16 +493,16 @@
    debug?  if  ." bulk-out" cr  then
    dup to bulk-out-pipe			( buf len pipe )
    process-bulk-args			( )
-   ?alloc-bulk-qhqtds  to my-qtd  to my-qh	( )
-   bulk-out-timeout my-qh >qh-timeout l!	( )
-   my-qh >hcqh-overlay >hcqtd-token dup le-l@ TD_STAT_PING or swap le-l!
+   ?alloc-bulk-qhqtds  to my-bulk-qtd  to my-bulk-qh	( )
+   bulk-out-timeout my-bulk-qh >qh-timeout l!		( )
+   my-bulk-qh >hcqh-overlay >hcqtd-token dup le-l@ TD_STAT_PING or swap le-l!
 
    \ OUT qTDs
-   TD_PID_OUT my-qtd fill-bulk-io-qtds	( )
+   TD_PID_OUT my-bulk-qtd fill-bulk-io-qtds		( )
 
    \ Start bulk out transaction
-   my-qh pt-bulk fill-qh		( )
-   my-qh insert-qh			( )
+   my-bulk-qh pt-bulk fill-qh		( )
+   my-bulk-qh insert-qh			( )
    true to bulk-out-busy?		( )
    0					( usberr )
 ;




More information about the openfirmware mailing list