Changeset 3557


Ignore:
Timestamp:
Feb 18, 2013, 7:31:19 AM (3 years ago)
Author:
quozl
Message:

OLPC - libertas, add support for 802.11n 5 GHz networks on 8787. Due to a firmware limit of 14 channels in a scan request, the scan logic was heavily changed. During association a specific channel scan order is followed, and the first match stops further scanning. The LEDs test was also changed to reduce the time taken. #12552.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpu/arm/olpc/cl4/leds.fth

    r3451 r3557  
    3131   d# 100 ms
    3232   hdd-led-on
    33    " /wlan:quiet" test-dev
     33   " led-blink" $call-wlan
    3434   d# 100 ms
    3535   ols-led-off
     
    4343
    4444: (selftest)
     45   0 to wlan-ih
     46   " /wlan:force" open-dev ?dup  if  to wlan-ih  then
    4547   get-msecs d# 10000 +                 ( limit )
    4648   begin
    4749      (cycle)
    48       key?  if  drop exit  then
     50      key?  if  drop  wlan-ih close-dev  exit  then
    4951      dup get-msecs -  0<               ( limit timeout? )
    5052   until                                ( limit )
    5153   drop                                 ( )
     54   wlan-ih close-dev
    5255;
    5356
  • dev/libertas.fth

    r3480 r3557  
    106106
    1071070 value channel
     1080 value 802.11n?                \ Hardware is 802.11n capable
     109: channel-is-5ghz?  ( chan# -- )  d# 14 >  ;
    108110
    109111d# 80 buffer: wpa-ie            \ WPA IE saved for EAPOL phases
     
    708710   get-hw-spec  0=  if   ( adr )
    709711
     712      \ is 802.11n capable?
     713      dup d# 34 + le-l@ h# 800 and  if
     714         true to 802.11n?
     715      then ( adr )
     716
    710717      \ The 4-byte FWReleaseNumber field starts at offset d# 18.
    711718      \ Firmware version 2.3.4.p1 is represented in that field
     
    11391146h# 7ffe instance value channel-mask
    11401147
    1141 : +chan-list-tlv  ( -- )
     1148: +chan-tlv  ( channel# -- )
    11421149   h# 101 +xw
    1143    0 +xw  'x >r       ( r: 'payload )
    1144    #channels 1+  1  do
    1145       1 i lshift  channel-mask  and  if
    1146          0 +xb            \ Radio type
    1147          i +xb            \ Channel #
    1148          scan-type +xb    \ Scan type - 0:active  or  1:passive
    1149          d# 100 +xw       \ Min scan time
    1150          d# 100 +xw       \ Max scan time
    1151       then
    1152    loop
    1153    'x r@ -  r> 2- le-w!
     1150   0 +xw  'x >r                                 ( channel#  r: payload' )
     1151   dup channel-is-5ghz?  if 1 else 0 then       ( channel# band# )
     1152   +xb                          \ Band #
     1153   +xb                          \ Channel #
     1154   scan-type +xb                \ Scan type - 0:active  or  1:passive
     1155   d# 100 +xw                   \ Min scan time
     1156   d# 100 +xw                   \ Max scan time ( r: payload' )
     1157   'x r@ -  r> 2- le-w!                         ( )
    11541158;
    11551159
     
    11681172;
    11691173
    1170 : (scan)  ( -- error? | adr len 0 )
     1174: (scan)  ( chan -- error? | adr len 0 )
     1175
     1176   \ forge success for 2.4 ghz channels disabled in the channel-mask
     1177   dup channel-is-5ghz?  0=  if                 ( chan )
     1178      1 over lshift channel-mask and  0=  if    ( chan )
     1179         drop respbuf 0 0 exit
     1180      then
     1181   then                                         ( chan )
     1182
     1183   \ forge success for 5 ghz channels if the device lacks support
     1184   dup channel-is-5ghz?  802.11n?  0=  and  if
     1185      drop respbuf 0 0 exit
     1186   then
     1187
    11711188   6 ( CMD_802_11_SCAN ) start-cmd
    11721189   resp-wait-long to resp-wait
     
    11751192   6 +xerase           \ BSS ID
    11761193
    1177    +chan-list-tlv
     1194   +chan-tlv
    11781195   +probes-tlv
    11791196   +ssid-tlv
    11801197
    1181    finish-cmd outbuf-wait  dup  0=  if         ( error? )
    1182       respbuf /respbuf /fw-cmd /string  rot    ( adr len 0 )
     1198   finish-cmd outbuf-wait  dup  0=  if          ( error? )
     1199      respbuf /respbuf /fw-cmd /string  rot     ( adr len 0 )
    11831200   then
    11841201;
     
    12011218;
    12021219
    1203 : scan  ( adr len -- actual )
    1204 \   (scan)
    1205    begin  (scan)  dup 1 =  while  drop d# 1000 ms  repeat  \ Retry while busy
    1206    if  2drop 0 exit  then               ( adr len scan-adr scan-len )
    1207    rot min >r                           ( adr scan-adr r: len )
    1208    swap r@ move                         ( r: len )
    1209    r>
    1210 ;
     1220: scan  ( adr len chan -- actual )
     1221   dup channel-is-5ghz?  802.11n?  0=  and  if  3drop 0 exit  then
     1222   >r                           ( adr len r: chan )
     1223   begin
     1224      r@ (scan)  dup 1 =
     1225   while
     1226      drop d# 1000 ms           \ retry while busy
     1227   repeat                       ( adr len scan-adr scan-len err? r: chan )
     1228   r> drop                      ( adr len scan-adr scan-len err? )
     1229   if  2drop 0 exit  then       ( adr len scan-adr scan-len )
     1230   rot min >r                   ( adr scan-adr r: actual )
     1231   swap r@ move                 ( r: actual )
     1232   r>                           ( actual )
     1233;
     1234
    12111235headers
    12121236
     
    15511575   3      +xw                           \ element ID = DS param set
    15521576   1      +xw                           \ len
    1553    ( ch ) +xb                           \ channel
     1577   dup    +xb                           \ channel
    15541578
    15551579   \ CF param
     
    15991623      /x save-wpa-ie                    \ Save IE in wpa-ie
    16001624   then
     1625
     1626   \ associating with a 5 GHz channel requires the band to be specified
     1627   802.11n?  if  +chan-tlv  else  drop  then   ( )
    16011628
    16021629   \ XXX power (optional)
     
    23282355;
    23292356
    2330 \ adr len  is the result of (scan) - a list of APs and their characteristics
    2331 : test-association  ( adr len -- error? )
    2332    " OLPCOFW" " select-ssid?" $call-supplicant  if   ( )
    2333       " (do-associate)" $call-supplicant  if         ( )
    2334          \ Success
    2335          do-disassociate
    2336          " true to ssid-reset?" ['] evaluate catch  if  2drop  then
    2337          false
    2338       else
    2339          true
    2340       then
    2341    else
    2342       \ There is no OLPCOFW access point, so we don't try associating
    2343       false
    2344    then
    2345 ;
    2346 
    23472357: (scan-wifi)  ( -- error? )
    23482358   true to force-open?
     
    23502360   false to force-open?
    23512361   0=  if  ." Can't open Marvell wireless" cr true close  exit  then
    2352 
    2353    (scan)  if
    2354       ." Failed to scan" true cr
    2355    else    ( adr len )
    2356 \     drop .scan false
    2357       diagnostic-mode?  if  ( adr len )
    2358          drop 2+ c@  if     ( )
    2359             false
    2360          else
    2361             ." ERROR: No access points seen" cr
    2362             true
    2363          then
    2364       else                    ( adr len )
    2365          \ Quiet mode is for the benefit of the LEDs test, so we can flash
    2366          \ the WLAN LEDS without distracting messages appearing on the screen
    2367          quiet?  if           ( adr len )
    2368             2drop false       ( error? )
    2369          else
    2370             2dup .ssids       ( adr len )
    2371             test-association  ( error? )
    2372          then                 ( error? )
    2373       then
    2374    then
    2375 
     2362   " scan-all" $call-supplicant  ( error? )
    23762363   close
    23772364;
    23782365
    23792366: scan-wifi  ( -- )  (scan-wifi) drop  ;
     2367
     2368: led-blink  ( -- )
     2369   d# 6  (scan)  0=  if 2drop then
     2370;
    23802371
    23812372: reassociate  ( -- )
     
    24552446: ta-scan  ( -- )
    24562447   ." scan"  cr
    2457    (scan)                               ( adr len error? )
    2458    0=  if  .ssids cr  then              ( )
     2448   (scan-all) drop
    24592449;
    24602450
  • ofw/wifi/data.fth

    r2917 r3557  
    99: write-force  ( adr len -- actual )  " write-force" $call-parent  ;
    1010: read-force   ( adr len -- actual )  " read-force"  $call-parent  ;
    11 : scan   ( adr len -- actual )  " scan"  $call-parent  ;
     11: scan  ( adr len chan -- actual )  " scan"  $call-parent  ;
    1212: enable-rsn   ( -- )  " enable-rsn"  $call-parent drop  ;
    1313: disable-rsn  ( -- )  " disable-rsn" $call-parent drop  ;
  • ofw/wifi/eapol.fth

    r3374 r3557  
    923923;
    924924
     925create scan-order
     926   d#  6 c, d#  1 c, d# 11 c,
     927
     928   d#  2 c, d#  3 c, d#  4 c, d#  5 c, d#  7 c, d#  8 c,
     929   d#  9 c, d# 10 c, d# 12 c, d# 13 c, d# 14 c,
     930
     931   d# 36 c, d# 40 c, d# 44 c, d# 48 c,
     932   d# 52 c, d# 56 c, d# 60 c, d# 64 c,
     933
     934   d# 100 c, d# 104 c, d# 108 c,
     935   d# 112 c, d# 116 c, d# 132 c, d# 136 c,
     936
     937   d# 140 c, d# 149 c, d# 153 c,
     938   d# 157 c, d# 161 c, d# 165 c,
     939here scan-order - constant /scan-order
     940
     941: test-association  ( adr len -- error? )
     942   " OLPCOFW" select-ssid?  if
     943      (do-associate)  if
     944         target-mac$ " disassociate" $call-parent
     945         true to ssid-reset?
     946      then
     947   then
     948;
     949
     950: scan-all  ( -- error? )
     951   scan-order /scan-order bounds do           ( )
     952      scanbuf /buf  i c@                      ( adr len chan )
     953      scan  dup if                            ( actual )
     954         scanbuf swap                         ( adr len )
     955         2dup .ssids                          ( adr len )
     956         test-association
     957      else                                    ( actual )
     958         drop unloop true exit
     959      then
     960   loop
     961   false
     962;
     963
    925964: scan-ssid?  ( ssid$ -- found? )
    926965   dup 0=  if  2drop false exit  then         ( ssid$ )
     
    928967   ssid$  " set-ssid" $call-parent            ( )
    929968   ??cr ." Scan for: " ssid$ type space       ( )
    930    scanbuf /buf scan  if                      ( )
    931       debug?  if  scanbuf .scan  then         ( )
    932       ssid$ (select-ssid?)                    ( found? )
    933       dup  if  ." found"  else  ." failed"  then  cr
    934    else                                       ( )
    935       ." not found"  cr  false                ( found? )
    936    then                                       ( found? )
    937 ;
     969
     970   scan-order /scan-order bounds do           ( )
     971      scanbuf /buf  i c@                      ( adr len chan )
     972      scan  if                                ( )
     973         debug?  if  scanbuf .scan  then      ( )
     974         ssid$ (select-ssid?)                 ( found? )
     975         if  ." found"  cr unloop true exit  then
     976      then
     977   loop
     978   ." not found"  cr  false                  ( found? )
     979;
     980
    938981: try-scan  ( -- okay? )
    939982   wifi-ssid$  scan-ssid?  if  true exit  then
Note: See TracChangeset for help on using the changeset viewer.