Changeset 3569


Ignore:
Timestamp:
Feb 25, 2013, 9:34:36 AM (21 months ago)
Author:
wmb
Message:

Marvell WLAN driver - Omnibus checkin of changes to the SDIO layer to
make it easier to share code with the Bluetooth driver. The particular
advantage is to eliminate duplication of firmware downloading between
the WLAN and BT drivers.

Location:
dev
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • dev/libertas.fth

    r3560 r3569  
    44headers 
    55hex 
     6 
     7false instance value debug? 
     8 
     9: debug-on  ( -- )  true to debug?  ; 
     10: vdump  ( adr len -- )  debug?  if  " dump"  evaluate  else  2drop  then  ; 
     11 
     12create mac-adr 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 
     136 constant /mac-adr 
     14: mac-adr$  ( -- adr len )  mac-adr /mac-adr  ; 
     15 
     16: max-frame-size  ( -- size )  d# 1514  ; 
     17 
     18external 
     19defer get-mac-address  ( -- adr len )           ' mac-adr$ to get-mac-address 
     20headers 
     21 
    622 
    723\ **************** WPA and WPA2 are not functional yet ****************** 
     
    2238: .ssids  ( adr len -- )  " .ssids" $call-supplicant  ; 
    2339 
    24 defer load-all-fw  ( -- error? )   ' false to load-all-fw 
    2540defer ?process-eapol            ['] 2drop to ?process-eapol 
    2641 
     
    3348 
    3449: init-buf  ( -- ) 
    35    outbuf 0=  if  /outbuf dma-alloc to outbuf  then 
     50   outbuf 0=  if  /outbuf " alloc-buffer" $call-parent to outbuf  then 
    3651; 
    3752: free-buf  ( -- ) 
    38    outbuf  if  outbuf /outbuf dma-free  0 to outbuf  then 
     53   outbuf  if  outbuf /outbuf " free-buffer" $call-parent  0 to outbuf  then 
    3954; 
    4055 
     
    144159headers 
    145160 
    146 : marvel-link-up?  ( -- flag )  driver-state ds-ready >  ; 
    147  
    148 ' marvel-link-up? to link-up? 
     161: link-up?  ( -- flag )  driver-state ds-ready >  ; 
    149162 
    150163\ ========================================================================= 
     
    153166 
    154167struct 
    155    /fw-transport + 
    156168   2 field >fw-cmd              \ Start of command header 
    157169   2 field >fw-len 
     
    159171   2 field >fw-result 
    160172dup constant /fw-cmd 
    161 dup /fw-transport - constant /fw-cmd-hdr        \ Command header len (less /fw-transport) 
     173dup constant /fw-cmd-hdr        \ Command header len (less /fw-transport) 
    162174   0 field >fw-data             \ Command payload starts here 
    163175drop 
    164176 
    165177: outbuf-out  ( -- error? ) 
    166    outbuf  dup >fw-len le-w@ /fw-transport +  cmd-out 
     178   outbuf  dup >fw-len le-w@ " cmd-out" $call-parent 
    167179; 
    168180 
     
    192204 
    193205struct 
    194    /fw-transport + 
    195206   4 field >tx-stat 
    196207   4 field >tx-ctrl 
     
    212223 
    213224struct 
    214    /fw-transport + 
    215225   1 field >tx14-bsstype 
    216226   1 field >tx14-bss# 
     
    242252   tuck  outbuf >tx-pkt-no-mesh  swap  move             ( len ) 
    243253 
    244    /tx-hdr-no-mesh /fw-transport -  outbuf >tx-offset le-l!     ( len )  \ Offset from >tx-stat field 
     254   /tx-hdr-no-mesh outbuf >tx-offset le-l!      ( len )  \ Offset from >tx-stat field 
    245255   tx-ctrl        outbuf >tx-ctrl   le-l!       ( len ) 
    246256 
     
    254264   tuck  outbuf >tx-pkt  swap  move             ( len ) 
    255265 
    256    /tx-hdr /fw-transport - outbuf >tx-offset le-l!      ( len )  \ Offset from >tx-stat field 
     266   /tx-hdr outbuf >tx-offset le-l!              ( len )  \ Offset from >tx-stat field 
    257267   tx-ctrl        outbuf >tx-ctrl   le-l!       ( len ) 
    258268 
     
    271281   tuck  outbuf >tx14-pkt  swap  move           ( len ) 
    272282 
    273    /tx14-hdr /fw-transport - outbuf >tx14-offset le-w!  ( len )  \ Offset from >tx14-bsstype field 
     283   /tx14-hdr outbuf >tx14-offset le-w!          ( len )  \ Offset from >tx14-bsstype field 
    274284   tx-ctrl       outbuf >tx14-ctrl   le-l!      ( len ) 
    275285 
     
    288298\ Receive packet descriptor 
    289299struct 
    290    /fw-transport + 
    291300   2 field >rx-stat 
    292301   1 field >rx-snr 
     
    311320 
    312321struct 
    313    /fw-transport + 
    314322   1 field >rx14-bsstype 
    315323   1 field >rx14-bss# 
     
    359367 
    360368   \ Go to the payload, skipping the descriptor header 
    361    dup  dup >rx-offset le-l@ + /fw-transport +  ( adr data-adr ) 
     369   dup  dup >rx-offset le-l@ +          ( adr data-adr ) 
    362370   swap >rx-len le-w@                   ( data-adr data-len ) 
    363371 
     
    375383   \ Go to the payload, skipping the descriptor header 
    376384   >r                                                   ( r: adr ) 
    377    r@  r@ >rx14-offset le-w@ +  /fw-transport +         ( data-adr r: adr ) 
     385   r@  r@ >rx14-offset le-w@ +                          ( data-adr r: adr ) 
    378386   r@ >rx14-len le-w@                                   ( data-adr data-len  r: adr ) 
    379387 
     
    506514   resp-wait-short to resp-wait          ( len cmd ) 
    507515   outbuf /outbuf erase                  ( len cmd ) 
    508    outbuf /fw-transport + to x  0 to /x  ( len cmd ) 
     516   outbuf to x  0 to /x                  ( len cmd ) 
    509517   ( len cmd )      +xw    \ fw-cmd      ( len ) 
    510518   /fw-cmd-hdr +    +xw    \ fw-len      ( )   
     
    5315390 value debug-tx-feedback? 
    532540: process-ind  ( adr len -- ) 
    533    drop 
    534    true to got-indicator? 
    535    4 + le-l@  dup to last-event 
     541   drop                              ( adr ) 
     542   true to got-indicator?            ( adr ) 
     543   le-l@  dup to last-event          ( event-code ) 
    536544   dup h# 10000 u>=  if              ( event-code ) 
    537545      \ TX feedback from thin firmware 
     
    591599; 
    592600 
    593 : process-rx  ( adr len -- ) 
    594    over packet-type  case 
    595       \ Encoding must agree with packet-type 
     601: process-rx  ( adr len type -- ) 
     602   case 
    596603      0  of  process-request  endof     \ Response & request 
    597604      1  of  process-data     endof     \ Data 
     
    602609 
    603610: check-for-rx  ( -- ) 
    604    got-packet?  if              ( error | buf len 0 ) 
    605       0= if  2dup vdump process-rx      then   ( ) 
    606       recycle-packet            ( ) 
     611   " got-packet?" $call-parent  if      ( error | buf len type 0 ) 
     612      0= if  process-rx then   ( ) 
     613      " recycle-packet" $call-parent            ( ) 
    607614   then                         ( ) 
    608615; 
     
    691698 
    692699: reset-wlan  ( -- ) 
    693    " wlan-reset" evaluate 
    694700   driver-is-not-ready 
    695    reset-host-bus 
     701   " reset-host-bus" $call-parent 
    696702; 
    697703: sleep  ( -- )  reset-wlan  ; 
     
    16931699   driver-state ds-disconnected and  if  do-associate drop  then 
    16941700; 
    1695 ' ?reassociate to start-nic 
    16961701 
    16971702: disassociate  ( mac$ -- ) 
     
    17951800   h# 0002  0 +pkt-data  le-w!  \ Reason code: auth no longer valid 
    17961801   packet-buf  /802.11-header 2 +   wrap-802.11    ( adr len ) 
    1797    data-out 
     1802   " data-out" $call-parent 
    17981803   r> set-tx-ctrl 
    17991804; 
     
    21012106; 
    21022107 
    2103 : ?load-fw  ( -- error? ) 
    2104    driver-state ds-not-ready =  if 
    2105       load-all-fw  if 
    2106          ." Failed to download firmware" cr 
    2107          true exit 
    2108       then 
    2109       ds-ready to driver-state 
    2110    then 
    2111    multifunction?  if  init-function  then 
    2112    ?make-mac-address-property 
    2113 ; 
    2114  
    21152108false instance value use-promiscuous? 
    21162109 
     
    21352128; 
    21362129 
     2130\ Maybe handle this in parent's close method 
     2131: release-bus-resources  ( -- )  " release-bus-resources" $call-parent  ; 
     2132 
    21372133: open  ( -- ok? ) 
    21382134   my-args parse-args 
    2139    set-parent-channel 
    21402135   " " set-ssid  \ Instance buffers aren't necessarily initially 0 
     2136   my-space " set-address" $call-parent \ Set SDIO function number if necessary 
    21412137   opencount @ 0=  if 
    21422138      init-buf 
    2143       driver-is-not-ready 
    2144       /inbuf /outbuf setup-bus-io  if  free-buf false exit  then 
    2145       ?load-fw  if  release-bus-resources free-buf false exit  then 
     2139      ds-ready to driver-state 
     2140      " multifunction?" $call-parent  if  init-function  then 
     2141      ?make-mac-address-property  if  release-bus-resources free-buf false exit  then 
    21462142      set-fw-params 
    21472143      my-args " supplicant" $open-package to supplicant-ih 
     
    21532149            do-associate 0=  if  free-buf false exit  then 
    21542150         then 
    2155          start-nic 
     2151         ?reassociate 
    21562152      then 
    21572153   then 
     
    21722168      link-up?  if  target-mac$ deauthenticate  then 
    21732169      ['] 2drop to ?process-eapol 
    2174       stop-nic 
    21752170      mac-off 
    21762171      supplicant-ih ?dup  if  close-package 0 to supplicant-ih  then 
    2177       multifunction?  if  shutdown-function  then 
     2172      " multifunction?" $call-parent  if  shutdown-function  then 
    21782173      release-bus-resources 
    21792174      driver-is-not-ready 
     
    21862181   tuck                                 ( actual adr len ) 
    21872182   wrap-ethernet                        ( actual adr' len' ) 
    2188    data-out                             ( actual ) 
     2183   " data-out" $call-parent             ( actual ) 
    21892184; 
    21902185 
    21912186: read-force  ( adr len -- actual ) 
    2192    got-packet?  0=  if                  ( adr len ) 
     2187   " got-packet?" $call-parent  0=  if  ( adr len ) 
    21932188      2drop  -2  exit 
    2194    then                                 ( adr len [ error | buf actual 0 ] ) 
     2189   then                                 ( adr len [ error | buf actual type 0 ] ) 
    21952190 
    21962191   if   \ receive error                 ( adr len ) 
    2197       recycle-packet                    ( adr len ) 
     2192      " recycle-packet" $call-parent    ( adr len ) 
    21982193      2drop  -1  exit 
    2199    then                                 ( adr len buf actual ) 
    2200  
    2201    false to got-data?                   ( adr len buf actual ) 
     2194   then                                 ( adr len buf actual type ) 
     2195 
     2196   false to got-data?                   ( adr len buf actual type ) 
    22022197   process-rx                           ( adr len ) 
    22032198 
     
    22082203   then                                 ( actual ) 
    22092204 
    2210    recycle-packet                       ( actual ) 
     2205   " recycle-packet" $call-parent       ( actual ) 
    22112206; 
    22122207 
     
    22412236   tuck   6 +pkt-data  swap  move                          ( tags-size ) 
    22422237   packet-buf  swap /802.11-header +  6 +   wrap-802.11    ( adr len ) 
    2243    data-out 
     2238   " data-out" $call-parent 
    22442239; 
    22452240 
     
    22512246    
    22522247   packet-buf  /802.11-header 6 +   wrap-802.11    ( adr len ) 
    2253    data-out 
     2248   " data-out" $call-parent 
    22542249; 
    22552250 
     
    22982293   begin  backlog 8 >=  while  process-mgmt-frame  repeat 
    22992294   backlog 1+ to backlog 
    2300    data-out                                             ( len ) 
     2295   " data-out" " $call-parent                           ( len ) 
    23012296   throttle 
    23022297; 
     
    23402335   then                                 ( adr ihandle|0 ) 
    23412336 
    2342    dup  0=  if  ." Can't open obp-tftp support package" stop-nic abort  then 
     2337   dup  0=  if  ." Can't open obp-tftp support package" abort  then 
    23432338                                        ( adr ihandle ) 
    23442339 
     
    23492344; 
    23502345 
    2351 : reset  ( -- flag )  reset-nic  ; 
     2346: reset  ( -- flag )  true  ; 
    23522347 
    23532348: do-disassociate  ( -- ) 
  • dev/mmc/sdhci/mv8686/common.fth

    r3336 r3569  
    2929: /string  ( adr len cnt -- adr+n len-n )  tuck - -rot + swap  ; 
    3030 
    31 create mac-adr 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 
    32 6 constant /mac-adr 
    33 : mac-adr$  ( -- adr len )  mac-adr /mac-adr  ; 
    34  
    3531: null$  ( -- adr len )  " "  ; 
    3632 
     
    5854: vldump ( adr len -- )  debug?  if  " ldump" evaluate  else  2drop  then  ; 
    5955: vtype  ( adr len -- )  debug?  if  type cr  else  2drop  then  ; 
    60  
    61  
    62 defer link-up?         ( -- up? )               ' true to link-up? 
    63 defer reset-nic        ( -- )                   ' noop to reset-nic 
    64 defer start-nic        ( -- )                   ' noop to start-nic 
    65 defer stop-nic         ( -- )                   ' noop to stop-nic 
    66  
    67 external 
    68 defer get-mac-address  ( -- adr len )           ' mac-adr$ to get-mac-address 
    69 headers 
    70  
    71 : max-frame-size  ( -- size )  d# 1514  ; 
    72  
    73 : property-or-abort  ( name$ -- n ) 
    74    2dup get-my-property  if          ( name$ ) 
    75       ." Can't find property " type cr  stop-nic abort 
    76    then                              ( name$ value$ ) 
    77    2swap 2drop  decode-int  nip nip  ( n ) 
    78 ; 
    7956 
    8057: find-fw  ( $ -- adr len ) 
  • dev/mmc/sdhci/mv8686/fw8686.fth

    r3487 r3569  
    66\ Firmware download data structures 
    77\ ======================================================================= 
     8 
     90 value fw-buf 
    810 
    911h# fedc constant FIRMWARE_READY 
     
    22240 value dn-retry 
    2325 
    24 : fw-dn-blksz  ( -- blksz )  host-f1-rd-base-0-reg 1 sdio-reg-w@  ; 
     26: fw-dn-blksz  ( -- blksz )  host-f1-rd-base-0-reg sdio-w@  ; 
    2527: wait-for-fw-dn-blksz  ( -- blksz ) 
    2628   \ Wait for the first non-zero value 
     
    4244   begin 
    4345      fw-len dn-idx - fw-tx-len min             ( len ) 
    44       fw-adr dn-idx + outbuf 2 pick move        ( len ) 
    45       outbuf over sdio-fw! <>  if 
    46          4 config-reg 1 sdio-reg!               \ FN1 CFG = write iomem fail 
     46      fw-adr dn-idx + fw-buf 2 pick move        ( len ) 
     47      fw-buf over sdio-fw! <>  if 
     48         4 config-reg sdio-b!           \ FN1 CFG = write iomem fail 
    4749      then 
    4850      sdio-poll-dl-ready 0=  if  ." Download fw died" cr true exit  then 
     
    7476 
    7577   mv8787?  if 
    76       2 config-reg 1 sdio-reg!             \ Host power up 
     78      2 config-reg sdio-b!             \ Host power up 
    7779   then 
    7880   false 
     
    8587      sdio-poll-dl-ready 0=  if  true exit  then 
    8688      fw-len dn-idx - /fw-tx min                ( len ) 
    87       dup outbuf le-l!                          ( len ) 
    88       fw-adr dn-idx + outbuf 4 + 2 pick move    ( len ) 
     89      dup fw-buf le-l!                          ( len ) 
     90      fw-adr dn-idx + fw-buf 4 + 2 pick move    ( len ) 
    8991      dn-idx over + to dn-idx                   ( len ) 
    90       outbuf swap 4 + sdio-fw! drop             ( ) 
     92      fw-buf swap 4 + sdio-fw! drop             ( ) 
    9193   dn-idx fw-len >=  until 
    9294   \ Write last EOF data 
    93    outbuf fw-blksz erase 
    94    outbuf fw-blksz sdio-fw! drop 
     95   fw-buf fw-blksz erase 
     96   fw-buf fw-blksz sdio-fw! drop 
    9597   false 
    9698; 
     
    102104; 
    103105 
    104 : load-sdio-fw  ( -- error? ) 
     106: free-fw-buf  ( -- )  fw-buf d# 2048 dma-free  ; 
     107: load-all-fw  ( -- error? ) 
     108   d# 2048 dma-alloc to fw-buf 
    105109   helper?  if 
    106110      wlan-helper find-fw dup  if  ( adr len ) 
    107111         2dup download-helper      ( adr len error? ) 
    108112         -rot free-mem             ( error? ) 
    109          if  true exit  then       ( ) 
     113         if  free-fw-buf true exit  then       ( ) 
    110114      else                         ( adr len ) 
    111115         2drop                     ( ) 
     
    119123      2drop  true           ( error? ) 
    120124   then                     ( error? ) 
     125   free-fw-buf              ( error? ) 
    121126; 
    122 ' load-sdio-fw to load-all-fw 
     127 
     128false value fw-active? 
     129: set-address  ( function# -- ) 
     130   init-function 
     131   fw-active? 0=  if 
     132      load-all-fw  if 
     133         ." Marvell WLAN module firmware load failed" cr 
     134         abort 
     135      then 
     136      true to fw-active? 
     137   then 
     138   mv8787?  if 
     139      card-rx-unit-reg sdio-b@ to rx-shift 
     140   then 
     141; 
     142: reset-host-bus  ( -- )  " wlan-reset" evaluate  false to fw-active?  ; 
     143 
     1440 value open-count 
     145: open  ( -- flag ) 
     146   set-parent-channel 
     147   open-count  if 
     148      true 
     149   else 
     150      setup-bus-io  0= 
     151   then  ( okay? ) 
     152   dup  if  open-count 1+ to open-count  then 
     153; 
     154: close  ( -- ) 
     155   open-count 1 =  if  false to fw-active?  then 
     156   open-count 1-  0 max  to open-count 
     157; 
    123158 
    124159\ LICENSE_BEGIN 
  • dev/mmc/sdhci/mv8686/loadpkg.fth

    r2004 r3569  
     1" sdio" name 
    12fload ${BP}/dev/mmc/sdhci/mv8686/common.fth     \ Ethernet common variables and routines 
    23fload ${BP}/dev/mmc/sdhci/mv8686/ring.fth       \ Receive ring management 
    34fload ${BP}/dev/mmc/sdhci/mv8686/sdio.fth       \ SDIO interface routines 
    45fload ${BP}/dev/mmc/sdhci/mv8686/mv8686.fth     \ SDIO I/O interface for Marvell 8686 
     6fload ${BP}/dev/mmc/sdhci/mv8686/fw8686.fth     \ Marvell firmware download for SDIO 
     7 
     81 " #size-cells" integer-property 
     91 " #address-cells" integer-property 
     10: decode-unit  ( adr len -- phys )  push-hex $number if  0  then  pop-base  ; 
     11: encode-unit  ( phys -- adr len )  push-hex (u.) pop-base  ; 
     12 
     13new-device 
     141 to my-space 
     15my-space 1 reg 
    516fload ${BP}/dev/libertas.fth                    \ Marvell "Libertas" common code 
    6 fload ${BP}/dev/mmc/sdhci/mv8686/fw8686.fth     \ Marvell firmware download for SDIO 
    7 \ fload ${BP}/dev/mmc/sdhci/mv8686/wlan.fth     \ External interface methods 
     17finish-device 
     18 
     19new-device 
     202 to my-space 
     21my-space 1 reg 
     22" bluetooth" name 
     23fload ${BP}/dev/bluetooth/marvell-hci.fth       \ Bluetooth driver 
     24finish-device 
  • dev/mmc/sdhci/mv8686/mv8686.fth

    r3337 r3569  
    44headers 
    55hex 
    6  
    7 0 0 encode-bytes  " fullmac" property 
    86 
    97\ ======================================================================= 
     
    3028constant /fw-transport 
    3129 
    32 : packet-type  ( adr -- type ) 
    33    >fw-type le-w@  case 
    34       CMD_TYPE_CMD    of  0  endof 
    35       CMD_TYPE_DATA   of  1  endof 
    36       CMD_TYPE_EVENT  of  2  endof 
    37    endcase 
     30: bt-packet-len&type  ( adr -- len type ) 
     31   /fw-transport -  dup le-l@  h# ffffff and  /fw-transport -   swap 3 + c@ 
    3832; 
    3933 
    4034: cmd-out  ( adr len -- error? ) 
    41    read-poll 
     35   /fw-transport negate /string         ( adr' len' ) 
     36   read-poll                            ( len ) 
    4237   2dup swap >fw-plen le-w!             ( len ) 
    4338   CMD_TYPE_CMD 2 pick >fw-type le-w!   ( len ) 
    44  
    45    2dup vdump                           ( adr len ) 
    4639   packet-out                           ( error? ) 
    4740; 
    4841 
    4942: data-out  ( adr len -- ) 
    50    read-poll 
     43   /fw-transport negate /string         ( adr' len' ) 
     44   read-poll                            ( adr len ) 
    5145   2dup swap >fw-plen le-w!             ( adr len ) 
    5246   CMD_TYPE_DATA 2 pick >fw-type le-w!  ( adr len ) 
     
    5448; 
    5549 
    56 : got-packet?  ( -- false | error true | buf len 0 true ) 
    57    read-poll            ( ) 
     50: decode-header  ( buf len -- dadr dlen 8686-type ) 
     51   drop                              ( buf ) 
     52   dup /fw-transport + swap          ( dadr buf ) 
     53   dup >fw-plen le-w@  swap          ( dadr dlen ) 
     54   >fw-type le-w@  case 
     55      CMD_TYPE_CMD    of  0  endof 
     56      CMD_TYPE_DATA   of  1  endof 
     57      CMD_TYPE_EVENT  of  2  endof 
     58   endcase                           ( dadr dlen 8686-type ) 
     59; 
     60: got-packet?  ( -- false | error true | buf len type 0 true ) 
     61   read-poll                 ( ) 
    5862 
    59    get-queued?  if      ( buf len ) 
    60       0  true           ( buf len 0 true ) 
    61    else                 ( ) 
    62       false             ( false ) 
     63   get-queued?  if           ( buf len ) 
     64      decode-header          ( dadr dlen type ) 
     65      0  true                ( buf len 0 true ) 
     66   else                      ( ) 
     67      false                  ( false ) 
     68   then 
     69; 
     70: decode-bt-header  ( buf len -- dadr dlen type ) 
     71   drop                      ( buf ) 
     72   \ SDIO specific header - length: byte[2:0], type: byte[3] 
     73   \ (HCI_COMMAND = 1, ACL_DATA = 2, SCO_DATA = 3, EVENT=4, 0xFE = Vendor) 
     74   dup /fw-transport + swap       ( dadr buf ) 
     75   dup le-l@  h# ffffff and swap  ( dadr dlen buf ) 
     76   3 + c@                         ( dadr dlen type ) 
     77; 
     78 
     79: got-bt-packet?  ( -- false | dadr dlen type true ) 
     80   read-poll                    ( ) 
     81 
     82   get-queued?  if              ( buf len ) 
     83      decode-bt-header true     ( dadr dlen type true ) 
     84   else                         ( ) 
     85      false                     ( false ) 
    6386   then 
    6487; 
     
    67900 value rca   \ Relative card address 
    6891 
    69 : set-parent-channel  ( -- )  rca my-unit set-address  ; 
     92: set-parent-channel  ( -- )  rca my-unit " set-address" $call-parent  ; 
    7093 
    7194: release-bus-resources  ( -- )  drain-queue detach-card  ; 
     
    7699 
    77100: make-my-properties  ( -- ) 
    78    get-address dup to rca 
     101   " get-address" $call-parent dup to rca 
    79102   encode-int " assigned-address" property 
    80103; 
    81104 
    82 : setup-bus-io  ( /inbuf /outbuf -- error? ) 
    83    2drop 
     105: setup-bus-io  ( -- error? ) 
    84106   init-queue 
    85107   ?attach-card 0=  if  ." Failed to attach card" cr true exit  then 
    86108   make-my-properties 
    87    init-device 
    88109   false 
    89110; 
    90111 
    91 : reset-host-bus  ( -- )  ; 
     112: alloc-buffer  ( len -- adr )  /fw-transport +  dma-alloc  ; 
     113: free-buffer  ( adr len -- )  /fw-transport negate /string  dma-free  ; 
    92114 
    93115\ LICENSE_BEGIN 
  • dev/mmc/sdhci/mv8686/sdio.fth

    r3487 r3569  
    55headers 
    66 
    7 : sdio-reg@  ( reg# function# -- value )  " sdio-reg@" $call-parent  ; 
    8 : sdio-reg!  ( value reg# function# -- )  " sdio-reg!" $call-parent  ; 
    9 : sdio-reg-w@  ( reg# function# -- w.value ) 
    10    2dup sdio-reg@  -rot      ( low  reg# function# ) 
    11    swap 1+ swap  sdio-reg@   ( low high ) 
    12    bwjoin                    ( w.value ) 
    13 ; 
    14 : sdio-w@  ( reg# -- w.value )  1 sdio-reg-w@  ; 
     70 instance value function# 
     80 instance value rx-shift 
     9 
     10: sdio-b@  ( reg# function# -- value )  function# " sdio-reg@" $call-parent  ; 
     11: sdio-b!  ( value reg# function# -- )  function# " sdio-reg!" $call-parent  ; 
     12: sdio-w@  ( reg# -- w.value ) 
     13   dup sdio-b@        ( reg# low  ) 
     14   swap 1+ sdio-b@    ( low high ) 
     15   bwjoin             ( w.value ) 
     16; 
    1517 
    1618false instance value multifunction? 
     
    2729: set-default-fw$  ( adr len -- )  to fw-name-len  to fw-name-adr  ; 
    2830 
    29 0 value ioport 
     310 instance value ioport 
    3032d# 256 constant blksz                   \ Block size for data tx/rx 
    3133d# 256 constant fw-blksz 
     
    5153h# 60 constant card-fw-status0-reg 
    5254\ h# 61 constant card-fw-status1-reg 
    53 \ h# 62 constant card-rx-len-reg 
    54 \ h# 63 constant card-rx-unit-reg 
     55h# 62 constant card-rx-len-reg 
     56h# 63 constant card-rx-unit-reg 
    5557h# 78 constant ioport-reg 
    5658 
     
    6870 
    6971: mv8686-rx-ready?  ( -- len ) 
    70    host-intstatus-reg 1 sdio-reg@ 
     72   host-intstatus-reg sdio-b@ 
    7173   dup 0=  if  exit  then 
    72    dup invert 3 and host-intstatus-reg 1 sdio-reg!  \ Clear UP_LD bit 
     74   dup invert 3 and host-intstatus-reg sdio-b!  \ Clear UP_LD bit 
    7375   1 and  if 
    7476      sdio-fw-status@ 
     
    107109    then 
    108110; 
     111 
    1091120 instance value rx-port# 
    1101130 instance value wr-bitmap 
    1111140 instance value rd-bitmap 
     115: bt-update-bitmaps  ( -- len ) 
     116   card-status-reg sdio-b@ 
     117   dup  1 and  if  1 to wr-bitmap  then 
     118   2 and   if  1 to rd-bitmap  then 
     119; 
     120: mv8787-bt-rx-ready?  ( -- len ) 
     121   rd-bitmap  if                                ( ) 
     122      0 to rd-bitmap                            ( ) 
     123      card-rx-len-reg sdio-b@  rx-shift lshift  ( len ) 
     124      \ XXX round up to multiple of blocksize ?  Maybe sdhci already does it 
     125   else                                         ( ) 
     126      bt-update-bitmaps                         ( ) 
     127      0                                         ( len ) 
     128   then                                         ( len ) 
     129; 
     130 
    112131: update-bitmaps  ( -- ) 
    113    host-intstatus-reg 1 sdio-reg@ 
     132   host-intstatus-reg sdio-b@ 
    114133   dup 2 and  if  wr-bitmap-reg sdio-w@ to wr-bitmap  then 
    115134   1 and  if  rd-bitmap-reg sdio-w@ to rd-bitmap  then 
    116135; 
    117 : mv8787-rx-ready?  ( -- len ) 
     136: mv8787-wlan-rx-ready?  ( -- len ) 
    118137   rd-bitmap  dup  if          ( bitmap ) 
    119138      d# 16 0  do              ( bitmap ) 
     
    129148      update-bitmaps           ( 0 ) 
    130149   then 
     150; 
     151: mv8787-rx-ready?  ( -- len ) 
     152   function# 1 =  if  mv8787-wlan-rx-ready?  else  mv8787-bt-rx-ready?  then 
    131153; 
    132154 
     
    169191    h# 60 to card-fw-status0-reg 
    170192\   h# 61 to card-fw-status1-reg 
    171 \   h# 62 to card-rx-len-reg 
    172 \   h# 63 to card-rx-unit-reg 
     193    h# 62 to card-rx-len-reg 
     194    h# 63 to card-rx-unit-reg 
    173195    h# 78 to ioport-reg 
    174196    d# 256 to blksz 
     
    184206; 
    185207 
     208: set-block-size  ( n -- )  to blksz  ; 
     209 
    186210: set-version  ( -- error? ) 
    187211   " sdio-card-id" $call-parent  case 
     
    196220: roundup-blksz  ( n -- n' )  blksz 1- + blksz / blksz *  ; 
    197221 
    198 : set-address  ( rca slot -- )  " set-address" $call-parent  ; 
    199222: get-address  ( -- rca )       " get-address" $call-parent  ; 
    200223: attach-card  ( -- ok?  )  " attach-sdio-card" $call-parent  ; 
     
    203226: sdio-poll-dl-ready  ( -- ready? ) 
    204227   false d# 100 0  do 
    205       card-status-reg 1 sdio-reg@ 
     228      card-status-reg sdio-b@ 
    206229      h# 9 tuck and =  if  drop true leave  then 
    207230      d# 100 usec 
     
    211234 
    212235: sdio-fw!  ( adr len -- actual ) 
    213    >r >r ioport 1 true r> r> fw-blksz false " r/w-ioblocks" $call-parent 
    214 ; 
    215  
    216 : init-device  ( -- ) 
    217    ioport-reg 3 bounds  do  i 1 sdio-reg@  loop         \ Read the IO port 
     236   >r >r ioport function# true r> r> fw-blksz false " r/w-ioblocks" $call-parent 
     237; 
     238 
     239: init-function  ( function# -- ) 
     240   0 to function#                ( function# ) 
     241 
     242   1 over lshift      2 sdio-b!  ( function# ) \ Enable IO function 
     243   1 over lshift 1 or 4 sdio-b!  ( function# ) \ Enable interrupts for function and card 
     244 
     245   7 sdio-b@  h# 20 or  7 sdio-b!  ( function# )        \ Enable async interrupt mode 
     246 
     247   to function# 
     248 
     249   ioport-reg 3 bounds  do  i sdio-b@  loop             \ Read the IO port 
    218250   0 bljoin to ioport 
    219  
    220    7 0 sdio-reg@  h# 20 or  7 0 sdio-reg!       \ Enable async interrupt mode 
    221  
    222    2 2 0 sdio-reg!      \ Enable IO function 1 (2 = 1 << 1) 
    223    3 4 0 sdio-reg!      \ Enable interrupts (1) for function 1 (1 << 1) 
    224251 
    225252   mv8787?  if 
    226253      \ Set host interrupt reset to "read to clear" 
    227       host-int-rsr-reg 1 sdio-reg@  h# 3f or  host-int-rsr-reg 1 sdio-reg! 
     254      host-int-rsr-reg sdio-b@  h# 3f or  host-int-rsr-reg sdio-b! 
    228255 
    229256      \ Set Dnld/upld to "auto reset" 
    230       card-misc-cfg-reg 1 sdio-reg@   h# 10 or  card-misc-cfg-reg 1 sdio-reg! 
     257      card-misc-cfg-reg sdio-b@   h# 10 or  card-misc-cfg-reg sdio-b! 
    231258   then 
    232259   \ Newer revisions of the 8787 firmware empirically require that this 
     
    234261   \ 8686 firmware, appear to be content with it either here or after 
    235262   \ firmware startup. 
    236    3  host-int-mask-reg 1 sdio-reg!  \ Enable upload (1) and download (2) 
     263   3  host-int-mask-reg sdio-b!  \ Enable upload (1) and download (2) 
    237264; 
    238265 
    239266: sdio-blocks@  ( adr len -- actual ) 
    240267   >r >r 
    241    rx-port# ioport +  1 true  r> r>  blksz true  " r/w-ioblocks" $call-parent  ( actual ) 
     268   rx-port# ioport +  function# true  r> r>  blksz true  " r/w-ioblocks" $call-parent  ( actual ) 
    242269; 
    243270 
    244271\ : sdio-blocks!  ( adr len -- actual ) 
    245 \    >r >r x-get-write-port ioport + 1 true r> r> blksz false " r/w-ioblocks" $call-parent 
     272\    >r >r x-get-write-port ioport + function# true r> r> blksz false " r/w-ioblocks" $call-parent 
    246273\ ; 
    247274 
    248 \ 1 is the function number 
    249275: (sdio-blocks!)  ( adr len port# -- actual ) 
    250    ioport +  -rot    ( port#  adr len ) 
    251    1 true  2swap     ( port#  function# inc?  adr len ) 
     276   ioport +  -rot          ( port#  adr len ) 
     277   function# true  2swap   ( port#  function# inc?  adr len ) 
    252278   blksz false " r/w-ioblocks" $call-parent 
    253279; 
     280: sdio-blocks!  ( adr len -- actual )  0 (sdio-blocks!)  ; 
    254281 
    255282\ 0 is the control port number 
  • dev/mmc/sdhci/sdhci.fth

    r3337 r3569  
    10911091      dup h# ff <> 
    10921092   while                       ( offset tuple-code ) 
    1093       \ Another potentially interesting tuples si h# 15 from which 
     1093      \ Another potentially interesting tuple is h# 15 from which 
    10941094      \ you can get strings naming the product. 
    10951095      case 
  • dev/usb2/device/wlan/fw8388.fth

    r1735 r3569  
    8585: wait-cmd-fw-dl-ack  ( -- acked? ) 
    8686   d# 100 0  do                 ( ) 
    87       got-packet?  if           ( error | buf len 0 ) 
     87      got-packet?  if           ( error | buf len type 0 ) 
    8888         if                     ( ) 
    8989            false               ( acked? ) 
    90          else                   ( buf len ) 
    91             cmd-fw-dl-ok?       ( acked? ) 
     90         else                   ( buf len type ) 
     91            drop cmd-fw-dl-ok?  ( acked? ) 
    9292         then                   ( acked? ) 
    9393         recycle-packet         ( acked? ) 
     
    100100 
    101101: download-fw-init  ( -- ) 
    102    outbuf /boot-cmd erase 
    103    boot-magic outbuf >boot-magic le-l! 
    104    cmd-fw-dl  outbuf >boot-cmd   c! 
     102   fw-buf /boot-cmd erase 
     103   boot-magic fw-buf >boot-magic le-l! 
     104   cmd-fw-dl  fw-buf >boot-cmd   c! 
    105105 
    106106   5 0  do 
    107       outbuf /boot-cmd packet-out drop 
     107      fw-buf /boot-cmd packet-out drop 
    108108      wait-cmd-fw-dl-ack  if  leave  then 
    109109   loop 
     
    119119: wait-fw-dl-ack  ( -- ) 
    120120   d# 500 0  do                         ( ) 
    121       got-packet?  if                   ( error | buf len 0 ) 
    122          0= if  process-dl-resp  then   ( ) 
     121      got-packet?  if                   ( error | buf len tupe 0 ) 
     122         0= if  drop process-dl-resp  then      ( ) 
    123123         recycle-packet                 ( ) 
    124124         leave 
     
    131131   bounds  begin                ( end start ) 
    132132      dl-seq++                          \ Increment sequence number 
    133       dup outbuf /dl-header move        \ Move header to outbuf 
    134       dl-seq outbuf >dl-seq le-l!       \ Add sequence number to outbuf 
    135       dup /dl-header + outbuf >dl-data 2 pick >dl-len le-l@ dup >r move 
    136                                         \ Move payload to outbuf 
    137       outbuf r@ /dl-header + 4 + packet-out drop 
     133      dup fw-buf /dl-header move        \ Move header to outbuf 
     134      dl-seq fw-buf >dl-seq le-l!       \ Add sequence number to outbuf 
     135      dup /dl-header + fw-buf >dl-data 2 pick >dl-len le-l@ dup >r move 
     136                                        \ Move payload to fw-buf 
     137      fw-buf r@ /dl-header + 4 + packet-out drop 
    138138                                        \ Send command 
    139139      wait-fw-dl-ack                    \ Wait for ACK 
     
    180180; 
    181181 
    182 : load-8388-fw  ( -- error? ) 
     182: load-all-fw  ( -- error? ) 
     183   d# 2048 dma-alloc to fw-buf    
    183184   wlan-fw find-fw  ( adr len ) 
    184185   dup  if  download-fw  else  2drop true  then 
    185 ; 
    186  
    187 ' load-8388-fw to load-all-fw 
     186   fw-buf d# 2048 dma-free 
     187; 
    188188 
    189189\ LICENSE_BEGIN 
  • dev/usb2/device/wlan/usb8388.bth

    r1179 r3569  
    1414fload ${BP}/dev/usb2/device/wlan/common.fth     \ Ethernet common variables and routines 
    1515fload ${BP}/dev/usb2/device/wlan/usb8388.fth    \ USB I/O interface for Marvell 8388 
     16fload ${BP}/dev/usb2/device/wlan/fw8388.fth     \ Marvell firmware download for USB 
    1617fload ${BP}/dev/libertas.fth                    \ Marvell "Libertas" common code 
    1718\ fload ${BP}/dev/usb2/device/wlan/wlan.fth     \ External interface methods 
    18 fload ${BP}/dev/usb2/device/wlan/fw8388.fth     \ Marvell firmware download for USB 
    1919 
    2020end0 
  • dev/usb2/device/wlan/usb8388.fth

    r3448 r3569  
    4343 
    4444: cmd-out  ( adr len -- error? ) 
     45   /fw-transport negate /string                 ( adr' len' ) 
    4546   TYPE_USB_REQUEST 2 pick >fw-transport le-l!  ( adr len ) 
    4647   2dup vdump                                   ( adr len ) 
     
    4950 
    5051: data-out  ( adr len -- ) 
     52   /fw-transport negate /string                 ( adr' len' ) 
    5153   TYPE_USB_DATA 2 pick >fw-transport le-l!     ( adr len ) 
    5254   packet-out-async 
    5355; 
    5456 
    55 \ Translate the USB/8388 type codes into more abstract codes, which 
    56 \ happen to be the codes used by the 8686 
    57 : packet-type  ( adr -- type ) 
    58    >fw-transport le-l@  case 
     57\ Translate the USB/8388 type codes into uniform code numbers 
     58: decode-header  ( buf len -- dadr dlen type ) 
     59   over le-l@ >r                   ( buf len  r: usb-type ) 
     60   /fw-transport /string           ( dadr dlen  r: usb-type ) 
     61   r>  case                         
    5962      TYPE_USB_REQUEST     of  0  endof 
    6063      TYPE_USB_DATA        of  1  endof 
    6164      TYPE_USB_INDICATION  of  2  endof 
    62    endcase 
     65   endcase                         ( dadr dlen type ) 
    6366; 
    6467 
    65 : got-packet?  ( -- false | error true | buf len 0 true )  bulk-in-ready?  ; 
     68: got-packet?  ( -- false | error true | buf len type 0 true ) 
     69   bulk-in-ready?  if           ( error | buf len 0 ) 
     70      ?dup 0=   if              ( dadr dlen ) 
     71         decode-header  0       ( dadr dlen type 0 ) 
     72      then                      ( error | buf len 0 ) 
     73   else                         ( ) 
     74      false                     ( false ) 
     75   then    ( false | error true | buf len 0 true ) 
     76; 
    6677: recycle-packet  ( -- )  restart-bulk-in  ; 
    6778 
     
    7081: set-parent-channel  ( -- )  set-device  device set-target  ; 
    7182 
    72 : setup-bus-io  ( /inbuf /outbuf -- error? ) 
     83: setup-bus-io  ( -- error? ) 
    7384   reset?  if 
    7485      configuration set-config  if 
     
    7889      bulk-in-pipe bulk-out-pipe reset-bulk-toggles 
    7990   then 
    80    4 bulk-out-pipe " begin-out-ring" $call-parent   ( /inbuf ) 
    81    h# 40 bulk-in-pipe  " begin-in-ring"  $call-parent 
     91   d# 2048     4 bulk-out-pipe " begin-out-ring" $call-parent 
     92   d# 2048 h# 40 bulk-in-pipe  " begin-in-ring"  $call-parent 
    8293   false 
    8394; 
     
    8596: release-bus-resources  ( -- )  end-bulk-in end-out-ring  ; 
    8697 
    87 : reset-host-bus  ( -- )  ; 
     98: reset-host-bus  ( -- )  " wlan-reset" evaluate  ; 
    8899 
    891000 value vid 
     
    98109 
    99110init 
     111XXX need open and close methods and open needs to call setup-bus-io 
     112XXX need alloc-buffer and free-buffer method 
    100113 
    101114\ LICENSE_BEGIN 
  • dev/usb2/device/wlan/wlan.fth

    r1704 r3569  
    125125   got-packet?  0=  if                  ( adr len ) 
    126126      2drop  -2  exit 
    127    then                                 ( adr len [ error | buf actual 0 ] ) 
     127   then                                 ( adr len [ error | buf actual type 0 ] ) 
    128128 
    129129   if   \ receive error                 ( adr len ) 
    130130      recycle-packet                    ( adr len ) 
    131131      2drop  -1  exit 
    132    then                                 ( adr len buf actual ) 
    133  
    134    false to got-data?                   ( adr len buf actual ) 
     132   then                                 ( adr len buf actual type ) 
     133 
     134   false to got-data?                   ( adr len buf actual type ) 
    135135   process-rx                           ( adr len ) 
    136136   recycle-packet                       ( adr len ) 
Note: See TracChangeset for help on using the changeset viewer.