Changeset 3569


Ignore:
Timestamp:
Feb 25, 2013, 8:34:36 AM (3 years 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.