Changeset 3536


Ignore:
Timestamp:
Feb 6, 2013, 6:48:16 AM (3 years 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.