Changeset 3536


Ignore:
Timestamp:
Feb 6, 2013, 7:48:16 AM (21 months ago)
Author:
quozl
Message:

USB - add an interrupt lockout for the keyboard alarm handler, so that it is skipped if the non-interrupt context is in the middle of a bulk or interrupt pipe method. A fix for OLPC #12516. Actual cause still unknown.

Location:
dev/usb2
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • dev/usb2/device/keyboard/request.fth

    r747 r3536  
    7878 
    7979: get-data?  ( adr len -- actual ) 
     80   locked?  if  nip nip 0 exit  then  \ bulk or interrupt methods are active 
    8081   intr-in?  if  nip nip restart-intr-in exit  then     \ USB error; restart 
    8182   ?dup  if                             ( adr len actual ) 
  • dev/usb2/hcd/ehci/bulk.fth

    r2591 r3536  
    422422 
    423423: bulk-in?  ( -- actual usberr ) 
     424   lock 
    424425   bulk-in-ready?  if           ( usberr | buf actual 0 ) 
    425426      ?dup  if                  ( usberr ) 
     
    433434      0 0                       ( actual usberr ) 
    434435   then 
     436   unlock 
    435437; 
    436438 
     
    461463: bulk-in  ( buf len pipe -- actual usberr ) 
    462464   debug?  if  ." bulk-in" cr  then 
     465   lock 
    463466   dup to bulk-in-pipe 
    464467   process-bulk-args 
     
    481484   my-bulk-qh dup fixup-bulk-in-data            ( actual usberr qh ) 
    482485   remove-qh                                    ( actual usberr ) 
     486   unlock 
    483487; 
    484488 
    4854890 instance value bulk-out-busy? 
    486490: done-bulk-out  ( -- error? ) 
     491   lock 
    487492   \ Process results 
    488493   my-bulk-qh done-error?               ( usberr ) 
     
    491496   my-bulk-qh remove-qh                 ( usberr ) 
    492497   false to bulk-out-busy?              ( usberr ) 
     498   unlock 
    493499; 
    494500: start-bulk-out  ( buf len pipe -- usberr ) 
     
    498504 
    499505   debug?  if  ." bulk-out" cr  then 
     506   lock 
    500507   dup to bulk-out-pipe                 ( buf len pipe ) 
    501508   process-bulk-args                    ( ) 
     
    508515   true to bulk-out-busy?               ( ) 
    509516   0                                    ( usberr ) 
     517   unlock 
    510518; 
    511519: bulk-out  ( buf len pipe -- usberr ) 
  • dev/usb2/hcd/ehci/intr.fth

    r2814 r3536  
    5252   intr-in-qh  if  4drop exit  then             \ Already started 
    5353 
     54   lock 
    5455   to intr-in-interval 
    5556   dup to intr-in-pipe 
     
    6465   intr-in-qh pt-intr fill-qh 
    6566   intr-in-qh my-speed intr-in-interval insert-intr-qh 
     67   unlock 
    6668; 
    6769 
    6870: intr-in?  ( -- actual usberr ) 
    6971   intr-in-qh 0=  if  0 USB_ERR_INV_OP exit  then  ( ) 
     72   lock 
    7073   clear-usb-error                   ( ) 
    7174   \ Ironically, we can't use Interrupt-On-Completion for interrupt pipes, 
     
    9295      intr-in-qh fixup-intr-in-data  ( actual usberr ) 
    9396   then                              ( actual usberr ) 
     97   unlock 
    9498; 
    9599 
     
    112116   intr-in-qh 0=  if  exit  then 
    113117 
     118   lock 
    114119   \ Setup qTD again 
    115120   intr-in-qtd restart-intr-in-qtd 
     
    120125   intr-in-qtd >qtd-phys l@ intr-in-qh >hcqh-overlay >hcqtd-next le-l! 
    121126   intr-in-qh push-qhqtds 
     127   unlock 
    122128; 
    123129 
     
    125131   debug?  if  ." end-intr-in" cr  then 
    126132   intr-in-qh 0=  if  exit  then 
     133   lock 
    127134   intr-in-qh dup fixup-intr-in-data 
    128135   intr-in-qtd map-out-bptrs 
    129136   dup remove-intr-qh  free-qh 
    130137   0 to intr-in-qh  0 to intr-in-qtd 
     138   unlock 
    131139; 
    132140 
  • dev/usb2/hcd/hcd-call.fth

    r2446 r3536  
    1010: dma-alloc    ( size -- virt )              " dma-alloc" $call-parent    ; 
    1111: dma-free     ( virt size -- )              " dma-free" $call-parent     ; 
     12 
     13: locked?  ( -- flag ) 
     14   " locked?" $call-parent 
     15; 
    1216 
    1317\ Probing support 
  • dev/usb2/hcd/hcd.fth

    r3444 r3536  
    5454   then 
    5555; 
     56 
     570 value locked?  \ Interrupt lockout for USB keyboard get-data? 
     58: lock    ( -- )  true  to locked?  ; 
     59: unlock  ( -- )  false to locked?  ; 
    5660 
    5761\ --------------------------------------------------------------------------- 
  • dev/usb2/hcd/ohci/bulk.fth

    r2591 r3536  
    125125: bulk-in?  ( -- actual usberr ) 
    126126   bulk-in-ed 0=  if  0 USB_ERR_INV_OP exit  then 
     127   lock 
    127128   clear-usb-error                              ( ) 
    128129   process-hc-status                            ( ) 
     
    140141      0 usb-error                               ( actual usberr ) 
    141142   then 
     143   unlock 
    142144; 
    143145 
     
    158160: restart-bulk-in  ( -- ) 
    159161   debug?  if  ." restart-bulk-in" cr  then 
     162   lock 
    160163   bulk-in-ed 0=  if  exit  then 
    161164   bulk-in-ed ed-set-skip 
     
    169172   ed-unset-skip 
    170173   enable-bulk 
     174   unlock 
    171175; 
    172176 
    173177: end-bulk-in  ( -- ) 
    174178   debug?  if  ." end-bulk-in" cr  then 
     179   lock 
    175180   bulk-in-ed 0=  if  exit  then 
    176181   bulk-in-td map-out-cbp 
    177182   bulk-in-ed remove-my-bulk 
    178183   0 to bulk-in-ed  0 to bulk-in-td 
     184   unlock 
    179185; 
    180186 
    181187: bulk-in  ( buf len pipe -- actual usberr ) 
    182188   debug?  if  ." bulk-in" cr  then 
     189   lock 
    183190   dup to bulk-in-pipe 
    184191   bulk-in-timeout process-bulk-args            ( ) 
     
    207214   my-ed dup fixup-bulk-in-data                 ( actual usberr ed ) 
    208215   remove-my-bulk                               ( actual usberr ) 
     216   unlock 
    209217; 
    210218 
    211219: bulk-out  ( buf len pipe -- usberr ) 
    212220   debug?  if  ." bulk-out" cr  then 
     221   lock 
    213222   dup to bulk-out-pipe 
    214223   bulk-out-timeout process-bulk-args 
     
    228237   my-ed dup fixup-bulk-out-data 
    229238   remove-my-bulk 
     239   unlock 
    230240; 
    231241 
  • dev/usb2/hcd/ohci/intr.fth

    r2591 r3536  
    6262   debug?  if  ." begin-intr-in" cr  then 
    6363   intr-in-ed  if  4drop exit  then             \ Already started 
     64   lock 
    6465   #intr-in++ 
    6566 
     
    7576   intr-in-ed dup fill-intr-in-ed 
    7677   insert-in-intr 
     78   unlock 
    7779; 
    7880 
    7981: intr-in?  ( -- actual usberr ) 
    8082   intr-in-ed 0=  if  0 USB_ERR_INV_OP exit  then 
     83   lock 
    8184   clear-usb-error                              ( ) 
    8285   process-hc-status                            ( ) 
     
    9497      0 usb-error                               ( actual usberr ) 
    9598   then 
     99   unlock 
    96100; 
    97101 
     
    112116: restart-intr-in  ( -- ) 
    113117   intr-in-ed 0=  if  exit  then 
     118   lock 
    114119   intr-in-ed ed-set-skip 
    115120 
     
    121126   intr-in-ed dup push-edtds 
    122127   ed-unset-skip 
     128   unlock 
    123129; 
    124130 
     
    126132   debug?  if  ." end-intr-in" cr  then 
    127133   intr-in-ed 0=  if  exit  then 
     134   lock 
    128135   #intr-in-- 
    129136   intr-in-td map-out-cbp 
    130137   intr-in-ed remove-my-intr 
    131138   0 to intr-in-ed  0 to intr-in-td 
     139   unlock 
    132140; 
    133141 
  • dev/usb2/hcd/uhci/bulk.fth

    r2591 r3536  
    112112: bulk-in?  ( -- actual usberr ) 
    113113   bulk-in-qh 0=  if  0 USB_ERR_INV_OP exit  then 
     114   lock 
    114115   clear-usb-error 
    115116   process-hc-status 
     
    130131      bulk-in-td dup >td-buf l@ swap >td-pbuf l@ 2 pick dma-pull 
    131132   then 
     133   unlock 
    132134; 
    133135 
     
    171173: bulk-in  ( buf len pipe -- actual usberr ) 
    172174   debug?  if  ." bulk-in" cr  then 
     175   lock 
    173176   dup to bulk-in-pipe 
    174177   bulk-in-timeout process-bulk-args 
     
    198201   my-#tds fixup-bulk-in-data                   ( actual usberr qh ) 
    199202   dup  remove-qh  free-qhtds                   ( actual usberr ) 
     203   unlock 
    200204; 
    201205 
    202206: bulk-out  ( buf len pipe -- usberr ) 
    203207   debug?  if  ." bulk-out" cr  then 
     208   lock 
    204209   dup to bulk-out-pipe 
    205210   bulk-out-timeout process-bulk-args 
     
    220225   my-#tds fixup-bulk-out-data                  ( actual usberr qh ) 
    221226   dup  remove-qh  free-qhtds                   ( actual usberr ) 
     227   unlock 
    222228; 
    223229 
  • dev/usb2/hcd/uhci/intr.fth

    r2714 r3536  
    6161   intr-in-qh  if  4drop exit  then             \ Already started 
    6262 
     63   lock 
    6364   to intr-in-interval 
    6465   dup to intr-in-pipe 
     
    7172   \ Start intr in transaction 
    7273   intr-in-qh intr-in-interval insert-intr-qh 
     74   unlock 
    7375; 
    7476 
    7577: intr-in?  ( -- actual usberr ) 
    7678   intr-in-qh 0=  if  0 USB_ERR_INV_OP exit  then 
     79   lock 
    7780   clear-usb-error 
    7881   process-hc-status 
     
    8689      0 usb-error                                       ( actual usberr ) 
    8790   then 
     91   unlock 
    8892; 
    8993 
     
    105109   intr-in-qh 0=  if  exit  then 
    106110 
     111   lock 
    107112   \ Setup TD again 
    108113   intr-in-td restart-intr-in-td 
     
    111116   intr-in-td >td-phys l@ intr-in-qh >hcqh-elem le-l! 
    112117   intr-in-qh push-qhtds 
     118   unlock 
    113119; 
    114120 
     
    117123   intr-in-qh 0=  if  exit  then 
    118124 
     125   lock 
    119126   intr-in-td intr-in-qh >qh-#tds l@ fixup-intr-in-data 
    120127   intr-in-td map-out-buf 
    121128   intr-in-qh dup  remove-qh  free-qhtds 
    122129   0 to intr-in-qh  0 to intr-in-td 
     130   unlock 
    123131; 
    124132 
Note: See TracChangeset for help on using the changeset viewer.