[openfirmware] [commit] r2760 - in dev/ath9k: . build
repository service
svn at openfirmware.info
Fri Dec 9 21:31:15 CET 2011
Author: lwalter
Date: Fri Dec 9 21:31:14 2011
New Revision: 2760
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2760
Log:
First version of atheros 9382 driver
Added:
dev/ath9k/
dev/ath9k/ani.fth
dev/ath9k/ar9382.bth
dev/ath9k/ath9k.fth
dev/ath9k/build/
dev/ath9k/calib.fth
dev/ath9k/debug.fth
dev/ath9k/domain.fth
dev/ath9k/eep9382.fth
dev/ath9k/eepdump.fth
dev/ath9k/eeprom.fth
dev/ath9k/global.fth
dev/ath9k/ini9382.fth
dev/ath9k/init.fth
dev/ath9k/key.fth
dev/ath9k/mac.fth
dev/ath9k/paprd.fth
dev/ath9k/phy.fth
dev/ath9k/reg.fth
dev/ath9k/rx.fth
dev/ath9k/tx.fth
Added: dev/ath9k/ani.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/ani.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,292 @@
+purpose: ATH9K Adaptive Noise Immunity (ANI) code
+\ See license at end of file
+
+headers
+hex
+
+\ SI: Spur immunity
+\ FS: FIR Step
+\ WS: OFDM / CCK Weak Signal detection
+\ MRC: Maximal Ratio Combining for CCK
+
+d# 10 constant #ofdm-lvl
+create ofdm-spur-immunity 0 c, 1 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 7 c, 7 c,
+create ofdm-fir-step 0 c, 1 c, 2 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 8 c,
+create ofdm-weak-sig-det 1 c, 1 c, 1 c, 1 c, 1 c, 1 c, 1 c, 1 c, 1 c, 0 c,
+
+: ofdm-spur-immunity@ ( lvl -- val ) ofdm-spur-immunity + c@ ;
+: ofdm-fir-step@ ( lvl -- val ) ofdm-fir-step + c@ ;
+: ofdm-weak-sig-det@ ( lvl -- val ) ofdm-weak-sig-det + c@ ;
+
+9 constant #cck-lvl
+7 constant #cck-lvl-low-rssi
+create cck-fir-step 0 c, 1 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 8 c,
+create cck-mrc 1 c, 1 c, 1 c, 1 c, 0 c, 0 c, 0 c, 0 c, 0 c,
+
+: cck-fir-step@ ( lvl -- val ) cck-fir-step + c@ ;
+: cck-mrc@ ( lvl -- val ) cck-mrc + c@ ;
+
+: firstep@ ( lvl -- val ) 2 - 2* ;
+: cycpwrThr1@ ( lvl -- val ) 3 - 2* ;
+
+: clear-mib-counters ( -- ) 809c 8088 do i reg@ drop 4 +loop ;
+
+: restart-ani ( -- )
+ 0 curchan >ani-listenTime !
+ 0 curchan >ani-ofdmPhyErrCnt !
+ 0 curchan >ani-cckPhyErrCnt !
+
+ \ Restart PHY error counters
+ 0 812c reg! \ Clear PHY error counter 1
+ 0 8134 reg! \ Clear PHY error counter 2
+ 0002.0000 8130 reg! \ PHY error counter 1 mask AR_PHY_ERR_OFDM_TIMING
+ 0200.0000 8138 reg! \ PHY error counter 2 mask AR_PHY_ERR_CCK_TIMING
+
+ clear-mib-counters
+;
+
+: cache-ani-ini-regs ( -- )
+ curchan >r
+ 9828 reg@ 0fff.ff00 and r@ >ani-ini-sfcorr-low !
+ 9824 reg@ 7ffe.001f and r@ >ani-ini-sfcorr !
+ 982c reg@ 0fff.ffff and r@ >ani-ini-sfcorr-ext !
+ 9e10 reg@ 3.f000 and d# 12 >> r@ >ani-ini-firstep !
+ 9820 reg@ fc0 and 6 >> r@ >ani-ini-firstepLow !
+ 9810 reg@ fe and 1 >> r@ >ani-ini-cycpwrThr1 !
+ 9830 reg@ fe00 and 9 >> r@ >ani-ini-cycpwrThr1Ext !
+ 3 r@ >ani-spurImmunityLevel !
+ 2 r@ >ani-firstepLevel !
+ 0 r@ >ani-ofdmWeakSigDetectOff !
+ 0 r> >ani-mrcCCKOff !
+;
+
+: set-firstep-lvl ( lvl -- )
+ dup firstep@ 2 firstep@ - curchan >ani-ini-firstep @ + 0 max d# 20 min d# 12 <<
+ 3.f000 9e10 reg@!
+ dup firstep@ 2 firstep@ - curchan >ani-ini-firstepLow @ + 0 max d# 20 min 6 <<
+ fc0 9820 reg@!
+ curchan >ani-firstepLevel !
+;
+: set-ofdm-weak-signal-detect ( on? -- )
+ 0fff.ff00 over if curchan >ani-ini-sfcorr-low @ swap else dup then 9828 reg@!
+ 7ffe.001f over if curchan >ani-ini-sfcorr @ swap else dup then 9824 reg@!
+ 0fff.ffff over if curchan >ani-ini-sfcorr-ext @ swap else dup then 982c reg@!
+ dup if 1 else 0 then 1 9828 reg@!
+ 1 xor curchan >ani-ofdmWeakSigDetectOff !
+;
+: set-spur-immunity-lvl ( lvl -- )
+ dup cycpwrThr1@ 3 cycpwrThr1@ - curchan >ani-ini-cycpwrThr1 @ + 0 max d# 22 min 1 <<
+ fe 9810 reg@!
+ dup cycpwrThr1@ 3 cycpwrThr1@ - curchan >ani-ini-cycpwrThr1Ext @ + 0 max d# 22 min 9 <<
+ fe00 9830 reg@!
+ curchan >ani-spurImmunityLevel !
+;
+: set-mrcCCKoff ( on? -- )
+ 1 and dup 3 * 3 9fd0 reg@!
+ 1 xor curchan >ani-mrcCCKOff !
+;
+
+: set-ofdm-nil ( lvl -- ) \ OFDM Noise Immunity Level
+ dup curchan >ani-ofdmNoiseImmunityLevel ! ( lvl )
+ avgbrssi curchan >ani-noiseFloor ! ( lvl )
+
+ dup ofdm-spur-immunity@ curchan >ani-spurImmunityLevel @ over <> ( lvl SI )
+ if set-spur-immunity-lvl else drop then ( lvl )
+
+ dup ofdm-fir-step@ curchan >ani-firstepLevel @ over <> ( lvl FS flag )
+ over 3 pick cck-fir-step@ >= and ( lvl FS )
+ if set-firstep-lvl else drop then ( lvl )
+
+ opmode IFTYPE_STATION <> opmode IFTYPE_ADHOC <> and
+ curchan >ani-noiseFloor @ curchan >ani-rssiThrHigh @ <= or if
+ curchan >ani-ofdmWeakSigDetectOff @ if
+ 1 set-ofdm-weak-signal-detect
+ else
+ dup ofdm-weak-sig-det@ curchan >ani-ofdmWeakSigDetectOff @ over =
+ if set-ofdm-weak-signal-detect else drop then
+ then
+ then drop
+;
+
+: set-cck-nil ( lvl -- ) \ CCK Noise Immunity Level
+ avgbrssi curchan >ani-noiseFloor !
+ opmode IFTYPE_STATION = opmode IFTYPE_ADHOC = or if
+ curchan >ani-noiseFloor @ curchan >ani-rssiThrLow @ <=
+ if #cck-lvl-low-rssi min then ( lvl' )
+ then
+ dup curchan >ani-cckNoiseImmunityLevel ! ( lvl )
+
+ dup cck-fir-step@ curchan >ani-firstepLevel @ over <> ( lvl FS flag )
+ over 3 pick ofdm-fir-step@ >= and if set-firstep-lvl else drop then
+
+ cck-mrc@ curchan >ani-mrcCCKOff @ over = if set-mrcCCKoff else drop then
+;
+
+: reset-ani ( scanning? -- )
+ opmode IFTYPE_STATION <> opmode IFTYPE_ADHOC <> and or if
+ curchan >ani-ofdmNoiseImmunityLevel @ 3 <>
+ curchan >ani-cckNoiseImmunityLevel @ 2 <> or if
+ 3 set-ofdm-nil
+ 2 set-cck-nil
+ then
+ else
+ curchan >ani-ofdmNoiseImmunityLevel @ set-ofdm-nil
+ curchan >ani-cckNoiseImmunityLevel @ set-cck-nil
+ then
+ restart-ani
+;
+
+[ifdef] notyet
+d# 1000 value aniperiod
+
+\ Cycle counters for computing listen time
+0 value ani-cycles
+0 value ani-rx-busy
+0 value ani-rx-frames
+0 value ani-tx-frames
+
+\ Cycle counters for computing busy time
+0 value survey-cycles
+0 value survey-rx-busy
+0 value survey-rx-frames
+0 value survey-tx-frames
+
+: ofdm-err-trigger ( -- )
+ curchan >ani-ofdmNoiseImmunityLevel @ 1+ dup #ofdm-lvl <
+ if set-ofdm-nil else drop then
+;
+: cck-err-trigger ( -- )
+ curchan >ani-cckNoiseImmunityLevel @ 1+ dup #cck-lvl <
+ if set-cck-nil else drop then
+;
+: ani-lower-immunity ( -- )
+ curchan >ani-ofdmNoiseImmunityLevel @ dup 0> if
+ curchan >ani-ofdmsTurn @ curchan >ani-cckNoiseImmunityLevel @ 0= or if
+ 1- set-ofdm-nil
+ exit
+ then
+ then drop
+
+ curchan >ani-cckNoiseImmunityLevel @ dup 0> if 1- set-cck-nil else drop then
+;
+: update-cycle-cnts ( -- )
+ 2 40 reg! \ freeze
+ 80f8 reg@ dup ani-cycles + to ani-cycles
+ survey-cycles + to survey-cycles
+ 80f4 reg@ dup ani-rx-busy + to ani-rx-busy
+ survey-rx-busy + to survey-rx-busy
+ 80f0 reg@ dup ani-rx-frames + to ani-rx-frames
+ survey-rx-frames + to survey-rx-frames
+ 80ec reg@ dup ani-tx-frames + to ani-tx-frames
+ survey-tx-frames + to survey-tx-frames
+ 80fc 80ec do 0 i reg! 4 +loop
+ 0 40 reg! \ unfreeze
+;
+: listen-time ( -- time )
+ ani-cycles ani-rx-frames - ani-tx-frames - clockrate d# 1000 * /
+ 0 to ani-cycles 0 to ani-rx-busy 0 to ani-rx-frames 0 to ani-tx-frames
+;
+: ani-read-cnts ( -- ok? )
+ update-cycle-cnts
+ listen-time dup 0<= if drop restart-ani false exit then
+ curchan >ani-listenTime tuck @ + swap !
+ clear-mib-counters
+
+ 812c reg@ curchan >ani-ofdmPhyErrCnt !
+ 8134 reg@ curchan >ani-cckPhyErrCnt !
+ true
+;
+: monitor-ani ( -- )
+ ani-read-cnts 0= if exit then
+ curchan >ani-ofdmPhyErrCnt @ d# 1000 * curchan >ani-listenTime @ / \ ofdmPhyErrRate
+ curchan >ani-cckPhyErrCnt @ d# 1000 * curchan >ani-listenTime @ / \ cckPhyErrRate
+
+ curchan >ani-listenTime @ aniperiod 5 * > if
+ 2dup d# 300 <= swap d# 400 <= and if
+ ani-lower-immunity
+ curchan >ani-ofdmsTurn dup @ -1 xor swap !
+ then
+ restart-ani
+ else
+ curchan >ani-listenTime @ aniperiod > if
+ 2dup d# 600 <= curchan >ani-ofdmsTurn @ or swap d# 1000 > and if
+ ofdm-err-trigger
+ restart-ani
+ false curchan >ani-ofdmsTurn !
+ else
+ dup d# 600 > if
+ cck-err-trigger
+ restart-ani
+ true curchan >ani-ofdmsTurn !
+ then then
+ then then 2drop
+;
+: proc-mib-event ( -- )
+ 0 8124 reg! \ Filtered OFDM counter
+ 0 8128 reg! \ Filtered CCK counter
+ 8258 reg@ 2 and if 1 8248 reg! then
+ clear-mib-counters
+ 812c reg@ c0.0000 and 8134 reg@ c0.0000 and or if
+ restart-ani
+ then
+;
+[then]
+
+: enable-mib-counters ( -- )
+ clear-mib-counters
+ 0 8124 reg! \ Filtered OFDM counter
+ 0 8128 reg! \ Filtered CCK counter
+ 0 40 reg! \ MIB control
+ 0002.0000 8130 reg! \ PHY error counter 1 mask AR_PHY_ERR_OFDM_TIMING
+ 0200.0000 8138 reg! \ PHY error counter 2 mask AR_PHY_ERR_CCK_TIMING
+;
+
+: disable-mib-counters ( -- )
+ 2 40 reg!
+ clear-mib-counters
+ 4 40 reg!
+ 0 8124 reg! \ Filtered OFDM counter
+ 0 8128 reg! \ Filtered CCK counter
+;
+
+: init-ani ( -- )
+ #channels 0 do
+ i 'channel >r
+ 3 r@ >ani-spurImmunityLevel !
+ 2 r@ >ani-firstepLevel !
+ 0 r@ >ani-mrcCCKOff !
+ true r@ >ani-ofdmsTurn !
+ d# 40 r@ >ani-rssiThrHigh !
+ 7 r@ >ani-rssiThrLow !
+ false r@ >ani-ofdmWeakSigDetectOff !
+ 2 r> >ani-cckNoiseImmunityLevel !
+ loop
+
+ restart-ani
+ enable-mib-counters
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/ar9382.bth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/ar9382.bth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,59 @@
+purpose: Load file for Atheros 9382 WIFI Driver
+\ See license at end of file
+
+command: &tokenize &this
+build-now
+
+silent on
+
+begin-tokenizing ar9382.fc
+
+FCode-version2
+
+fload ${BP}/dev/ath9k/reg.fth \ Misc words, variables, constants
+fload ${BP}/dev/ath9k/ini9382.fth \ Chip specific initial values
+fload ${BP}/dev/ath9k/eep9382.fth \ Chip specific "EEPROM" initial values
+fload ${BP}/dev/ath9k/eeprom.fth \ "EEPROM" manipulation
+\ fload ${BP}/dev/ath9k/domain.fth \ Country code, domain code, mapping
+fload ${BP}/dev/ath9k/global.fth \ Global variables
+fload ${BP}/dev/ath9k/ani.fth
+fload ${BP}/dev/ath9k/phy.fth
+fload ${BP}/dev/ath9k/paprd.fth
+fload ${BP}/dev/ath9k/calib.fth
+fload ${BP}/dev/ath9k/key.fth
+fload ${BP}/dev/ath9k/init.fth
+fload ${BP}/dev/ath9k/mac.fth
+fload ${BP}/dev/ath9k/rx.fth
+fload ${BP}/dev/ath9k/tx.fth
+fload ${BP}/dev/ath9k/ath9k.fth
+fload ${BP}/dev/ath9k/debug.fth
+fload ${BP}/dev/ath9k/eepdump.fth
+
+end0
+
+end-tokenizing
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/ath9k.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/ath9k.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,394 @@
+purpose: ATH9K driver
+\ See license at end of file
+
+hex
+external
+
+: enable-rsn ( -- ok? ) true ;
+: disable-rsn ( -- ok? ) false to gkey-enabled?
+ false to pkey-enabled? true ;
+: disable-wep ( -- ok? ) false to wep-enabled? true ;
+: set-ptk ( ptk$ -- )
+ /aes = if p-aes /aes else p-tkip /tkip then move
+ set-key-cache
+ true to pkey-enabled?
+;
+: set-gtk-idx ( idx -- ) debug? if dup ." GTK idx = " . cr then to grp-idx ;
+: set-gtk ( gtk$ -- )
+ /aes = if g-aes /aes else g-tkip /tkip then move
+ set-key-cache
+ true to gkey-enabled?
+;
+: enforce-protection ( -- ) ;
+: disable-protection ( -- )
+ reset-key-cache
+ false to gkey-enabled?
+ false to pkey-enabled?
+ false to wep-enabled?
+;
+: ?set-wep ( -- ) ;
+
+headers
+: make-mac-address-property ( -- )
+ " mac-address" get-my-property if ( )
+ mac-adr$ encode-bytes " local-mac-address" property
+ mac-address encode-bytes " mac-address" property
+ else ( adr len )
+ 2drop
+ then
+;
+
+d# 200 constant rx-detect-time-limit
+0 value last-rx-time
+: timeout-wait-for-resp? ( -- timeout? )
+ get-msecs last-rx-time - rx-detect-time-limit >=
+;
+\ 0 = got response
+\ -1 = timeout waiting for response or disconnected
+\ -2 = timeout waiting for transmit after retries
+: wait-for-resp ( resp-type -- -2|-1|0 )
+ to resp-type get-msecs to last-rx-time
+ wait-tx-done 0= if -2 exit then \ Fail to transmit
+ false to got-response?
+ resp-wait 0 do
+ queue-rx
+ deque-rx if ( node adr len )
+ 2 pick >r ( node adr len ) ( R: node )
+ process-rx ( node ) ( R: node )
+ r> over <> if debug-me then
+ free-rx ( )
+ got-response? if leave then
+ disconnected? if leave then
+ get-msecs to last-rx-time
+ else
+ timeout-wait-for-resp? if leave then
+ then
+ 1 ms
+ loop
+ got-response? if 0 else -1 then
+;
+
+defer process-resp ' noop to process-resp
+: wait-for-more ( resp-type -- )
+ to resp-type
+ resp-wait-xlong 0 do
+ queue-rx
+ deque-rx if
+ process-rx
+ free-rx
+ got-response? if process-resp then
+ disconnected? if leave then
+ then
+ 1 ms
+ loop
+;
+
+: (probe-ssid) ( -- found? )
+ debug? if ." Scan channel: " curchan >ch-hw-val @ .d cr then
+ scan-ssid count broadcast-mac$ make-probe-req
+ xmit-data 50 wait-for-resp 0= if add-scan-response then
+ get-scan-actual 3 >
+;
+: probe-ssid-chs ( ch hi lo -- found? )
+ false -rot ?do ( ch flag )
+ over i <> if \ Not the default channel
+ i re-set-channel ( ch flag )
+ (probe-ssid) if drop true leave then
+ then ( ch flag )
+ loop nip ( flag )
+;
+\ XXX Channel range depends on the domain
+: probe-ssid-2GHz ( ch -- found? ) d# 11 0 probe-ssid-chs ;
+: probe-ssid-5GHz ( ch -- found? )
+ dup d# 18 d# 14 probe-ssid-chs if drop true exit then
+ dup d# 22 d# 18 probe-ssid-chs if drop true exit then
+\ dup d# 33 d# 22 probe-ssid-chs if drop true exit then
+ d# 38 d# 33 probe-ssid-chs
+;
+: probe-ssid ( adr len -- actual )
+ " ---- probe-ssid ----" vtype
+ start-scan-response
+ (probe-ssid) if get-scan-actual exit then
+ curchan >ch-hw-val @
+ dup probe-ssid-2GHz if drop get-scan-actual exit then
+ probe-ssid-5GHz drop get-scan-actual
+;
+
+\ Probe with broadcast ssid
+: probe-broadcast-ssid ( adr len -- actual ) \ Gather all responses within channel
+ start-scan-response
+ ['] add-scan-response to process-resp
+ 0 0 broadcast-mac$ make-probe-req
+ xmit-data 50 wait-for-resp case
+ 0 of add-scan-response
+ 50 wait-for-more endof \ Got one already, maybe more
+ -1 of 50 wait-for-more endof \ Didn't get one last time, maybe more
+ ( otherwise ) \ Didn't even manage to send the request
+ endcase
+ get-scan-actual
+;
+: authenticate ( target-mac$ -- ok? )
+ " ---- authenticate ----" vtype
+ 2dup 1 -rot make-authenticate-req
+ xmit-data b0 wait-for-resp 0<> if ." auth 1 failed to get response" cr 2drop false exit then
+ respbuf dup /802.11n-data-hdr + 4 + le-w@ 0<> if ." auth 1 rejected" cr 2drop false exit then
+
+ /respbuf respbuf /802.11n-data-hdr 88 + >= if
+ key-wep? not if ." Shared key expected by the AP" cr 2drop false exit then
+ respbuf dup /802.11n-data-hdr + 6 + dup c@ d# 16 <> if ." auth 2 challenge missing" cr 3drop false exit then
+ " ---- authenticate 3 ----" vtype
+ dup 2 + swap 1+ c@ ( target-mac$ challenge$ )
+ 2swap 3 -rot make-authenticate-req ( adr len )
+ xmit-data b0 wait-for-resp 0<> if ." auth 3 failed to get response" cr false false to wep-enabled? exit then
+ respbuf dup /802.11n-data-hdr + 4 + le-w@ 0=
+ dup 0= if ." auth 3 rejected" cr false to wep-enabled? then
+ else
+ 2drop true
+ then
+;
+
+: deauthenticate ( target-mac$ -- )
+ " ---- deauthenticate ----" vtype
+ make-deauthenticate-req
+ xmit-data wait-tx-done drop
+ reset-driver-state
+;
+: (associate) ( ch ssid$ target-mac$ -- ok? )
+ " ---- (associate) ----" vtype
+ make-associate-req ( adr len )
+ xmit-data 10 wait-for-resp 0= dup if
+ respbuf dup /802.11n-data-hdr 4 + + le-w@ 3fff and to curaid
+ dummy-rssi dup to last-rssi to avgbrssi
+ then
+;
+
+external
+: get-mac-address ( -- adr len ) mac-adr$ ;
+
+: associate ( ch ssid$ target-mac$ -- ok? )
+ " ---- associate ----" vtype
+ 4 pick 1- curchan >ch-hw-val @ <> if
+ 4 pick debug? if ." Set to channel: " dup .d cr then
+ 1- dup to defch \ Save for next open
+ re-set-channel
+ then
+
+ ?set-wep
+ 2dup authenticate 0= if 2drop 3drop false exit then
+ ( ch ssid$ target-mac$ )
+ d# 10 0 do ( ch ssid$ target-mac$ )
+ 4 pick 4 pick 4 pick 4 pick 4 pick ( ch ssid$ target-mac$ ch ssid$ target-mac$ )
+ (associate) ( ch ssid$ target-mac$ ok? )
+ if 2drop 3drop true unloop exit then
+ loop
+ 2drop 3drop
+ false
+;
+
+: scan ( adr len -- actual )
+ passive-scan? ap-mode? or if
+ scan-passive
+ else
+ scan-ssid c@ if probe-ssid else probe-broadcast-ssid then
+ then
+;
+
+headers
+
+: do-associate ( -- ok? )
+ reset-driver-state
+ ['] 2drop to ?process-eapol \ Don't reenter the supplicant while associating
+ supplicant-associate dup if
+ ds-associated set-driver-state
+ target-mac curbssid /mac-adr move
+ write-associd
+ key-wep? if
+ set-key-cache
+ true to wep-enabled?
+ then
+ then
+ ['] do-process-eapol to ?process-eapol
+;
+
+: ?reassociate ( -- ok? )
+ link-up? 0= if do-associate else true then
+;
+
+: disassociate ( mac$ -- )
+ " ---- disassociate ----" vtype
+ make-disassociate-req
+ xmit-data wait-tx-done
+ reset-driver-state
+;
+
+external
+: write-force ( adr len -- actual )
+ queue-rx
+ tuck make-data-frame ( len adr' len' )
+ xmit-data wait-tx-done 0= if drop 0 then
+ queue-rx
+;
+
+: write ( adr len -- actual )
+ " ---- write ---- " vtype
+ ap-mode? if
+ write-force
+ else
+ queue-rx
+ ?reassociate 0= if 2drop 0 exit then \ In case if the connection is dropped
+ write-force
+ then
+;
+
+: read-force ( adr len -- actual )
+ queue-rx
+ deque-rx if ( adr len node buf blen )
+ process-rx -rot ( node adr len )
+ got-data? if
+ debug? if ." Got data" cr data 20 cdump cr then
+ /data min tuck data -rot move ( node actual )
+ else 2drop 0 then ( node actual )
+ swap free-rx ( actual )
+ else
+ 2drop 0 ( actual )
+ then
+ queue-rx
+;
+
+: read ( adr len -- actual )
+ \ If a good receive packet is ready, copy it out and return actual length
+ \ If a bad packet came in, discard it and return -1
+ \ If no packet is currently available, return -2
+
+ queue-rx
+ ?reassociate 0= if 2drop 0 exit then \ In case if the connection is dropped
+ read-force
+;
+
+headers
+
+\ Set to true to force open the driver without association.
+\ Normal operation should have force-open? be false.
+false instance value force-open?
+: debug-on ( -- ) true to debug? enable-emit ;
+
+: parse-args ( $ -- )
+ false to use-promiscuous?
+ begin ?dup while
+ ascii , left-parse-string
+ 2dup " debug" $= if debug-on then
+ 2dup " promiscuous" $= if true to use-promiscuous? then
+ " force" $= if true to force-open? then
+ repeat drop
+;
+: init-buf ( -- )
+ init-buf
+ alloc-packet init-rx-bufs init-tx-bufs
+ broadcast-mac$ bssidmask swap move
+;
+: free-buf ( -- ) free-packet free-tx-bufs free-rx-bufs ;
+
+\ Enable non-beacon broadcast plus other people's unicast packets
+: set-bssid-regs ( -- )
+ \ Enable non-beacon broadcast from the AP
+ target-mac le-l@ 8008 reg!
+ target-mac 4 + le-w@ curaid 10 << or 800c reg!
+;
+
+external
+: open ( -- ok? )
+ my-args parse-args
+ map-regs
+ " " set-ssid
+ opencount @ 0= if
+ init-buf init-device
+ make-mac-address-property
+ start d# 100 ms
+ my-args " supplicant" $open-package to supplicant-ih
+ supplicant-ih 0= if free-buf false exit then
+ force-open? if
+ reset-driver-state
+ else
+ link-up? 0= if
+ do-associate 0= if
+ supplicant-ih close-package 0 to supplicant-ih
+ free-buf false exit
+ then
+ then
+ then
+ then
+ opencount @ 1+ opencount !
+ true
+;
+: close ( -- )
+ opencount @ 1- 0 max opencount !
+ opencount @ 0= if
+ link-up? if target-mac$ deauthenticate then
+ reset-driver-state
+ ['] 2drop to ?process-eapol
+ stop
+ supplicant-ih ?dup if close-package 0 to supplicant-ih then
+ free-buf
+ unmap-regs
+ then
+;
+
+: load ( adr -- len )
+ link-up? 0= if drop 0 exit then \ Not associated yet.
+
+ " obp-tftp" find-package if ( adr phandle )
+ my-args rot open-package ( adr ihandle|0 )
+ else ( adr )
+ 0 ( adr 0 )
+ then ( adr ihandle|0 )
+
+ dup 0= if ." Can't open obp-tftp support package" stop abort then
+ ( adr ihandle )
+
+ >r
+ " load" r@ ['] $call-method catch ( len false | x x x true )
+ r> close-package
+ throw
+;
+
+800 constant /tmp-buf
+0 value tmp-buf
+: (scan-wifi) ( -- error? )
+ true to force-open?
+ open
+ false to force-open?
+ 0= if ." Can't open Atheros wireless" cr true close exit then
+
+ /tmp-buf alloc-mem to tmp-buf
+ tmp-buf /tmp-buf scan-passive
+ tmp-buf /tmp-buf free-mem
+
+ close false
+;
+: scan-wifi ( -- ) (scan-wifi) drop ;
+: selftest ( -- error? ) (scan-wifi) ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/calib.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/calib.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,545 @@
+purpose: ATH9K Calibration
+\ See license at end of file
+
+headers
+hex
+
+struct
+ 5 /n* field >nfCalBuffer
+ /n field >currIndex
+ /n field >privNF
+ /n field >invalidNFcount
+constant /nfCalHist
+
+struct
+ /n field >cd-ch
+ /n field >cd-chFlags
+ /n field >calValid
+ /n field >iCoff
+ /n field >Coff
+ /n field >paprd-done?
+ /n field >nfcal-pending?
+ /n field >nfcal-interference?
+ 3 /n* field >small-signal-gain
+ d# 24 3 * /n* field >pa-table
+ /nfCalHist 6 * field >nfCalHist
+constant /caldata
+
+/caldata buffer: caldata
+: init-buf ( -- ) caldata /caldata erase ;
+
+\ iq-calState definitions
+0 constant CAL_INACTIVE
+1 constant CAL_WAITING
+2 constant CAL_RUNNING
+3 constant CAL_DONE
+CAL_INACTIVE value iq-calState
+
+struct
+ /n field >nf-nominal
+ /n field >nf-max
+ /n field >nf-min
+constant /nf-limit
+
+3 /n* buffer: measI
+3 /n* buffer: measQ
+3 /n* buffer: measIQ
+create nf-2g d# -110 , d# -95 , d# -125 ,
+create nf-5g d# -115 , d# -100 , d# -125 ,
+
+: sort ( buf size -- )
+ dup 0 do ( buf size )
+ dup 1 do ( buf size )
+ over i na+ @ 2 pick i 1- na+ @ 2dup > if ( buf size buf[i] buf[i-1] )
+ 3 pick i na+ ! 2 pick i 1- na+ ! ( buf size )
+ else ( buf size buf[i] buf[i-1] )
+ 2drop ( buf size )
+ then
+ loop
+ loop 2drop
+;
+
+5 /n* buffer: tmpbuf
+: get-nf-hist-mid ( nfCalBuf -- nfval )
+ tmpbuf 5 /n* move
+ tmpbuf 5 sort
+ tmpbuf 2 na+ @
+;
+
+: get-nf-limits ( ch -- 'limit )
+ ?dup 0= if nf-2g exit then
+ is-2GHz? if nf-2g else nf-5g then
+;
+
+: get-nf-default ( ch -- default )
+ get-nf-limits >nf-nominal @
+;
+
+6 /n* buffer: nfarray
+0 value nh
+0 value nmax
+0 value nlimit
+0 value ncmask
+0 value high-nf-mid
+: 'nh ( idx -- adr ) /nfCalHist * nh + ;
+: update-nfcal-hist ( caldata -- )
+ dup >nfCalHist to nh ( calData )
+ curchan get-nf-limits >nf-max @ to nmax ( calData )
+ rxchainmask dup 3 << or to ncmask ( calData )
+ false to high-nf-mid ( calData )
+
+ 6 0 do
+ ncmask 1 i << and
+ conf-is-ht40? i 3 >= and not and if
+ nfarray i na+ @ ( calData nfarray[i] )
+ i 'nh >nfCalBuffer i 'nh >currIndex @ na+ !
+ i 'nh >currIndex @ 1+ dup 5 >= if drop 0 then
+ i 'nh >currIndex !
+ i 'nh >invalidNFcount @ dup 0> if
+ 1- i 'nh >invalidNFCount !
+ nfarray i na+ @
+ else
+ drop i 'nh >nfCalBuffer get-nf-hist-mid
+ then dup i 'nh >privNF !
+ nmax > if
+ true to high-nf-mid
+ dup >nfcal-interference? @ 0= if
+ nmax i 'nh >privNF !
+ then
+ then
+ then
+ loop
+ high-nf-mid swap >nfcal-interference? !
+;
+
+: get-nf-thresh ( band -- nf-thresh ) drop 0 ;
+
+: setup-calibration ( -- )
+ a000 f000 980c reg@!
+ 0 a2c8 reg!
+ 1.0000 dup 980c reg@! \ kick off cal
+;
+
+: reset-calibration ( -- )
+ setup-calibration
+ CAL_RUNNING to iq-calState
+ measI 3 /n* erase
+ measQ 3 /n* erase
+ measIQ 3 /n* erase
+;
+
+: reset-calvalid? ( -- notdone? )
+ iq-calState CAL_DONE <> if true exit then
+ CAL_WAITING to iq-calState
+ false
+;
+
+: start-nfcal ( update? -- )
+ true caldata >nfcal-pending? !
+ if 8002 else 2.8002 then 2.8002 a2c4 reg@!
+;
+
+0 value dnf
+create nf-regs 9e1c , ae1c , be1c , 9830 , a830 , b830 ,
+
+: load-nf ( ch -- )
+ rxchainmask dup 3 << or to ncmask
+ get-nf-default to dnf
+ caldata >nfCalHist to nh
+
+ 6 0 do
+ ncmask 1 i << and
+ conf-is-ht40? i 3 >= and not and if
+ nh if i 'nh >privNF @ else dnf then 1 << 1ff and
+ 1ff nf-regs i na+ @ reg@!
+ then
+ loop
+
+ 8000 2.0002 a2c4 reg@!
+ 0 2 a2c4 wait-hw 0= if " Timeout waiting for NF to load" vtype exit then
+
+ \ Restore maxCCAPower
+ 6 0 do
+ ncmask 1 i << and
+ conf-is-ht40? i 3 >= and not and if
+ 19c 1ff nf-regs i na+ @ reg@!
+ then
+ loop
+;
+
+: sanitize-nf ( 'nf -- )
+ curchan is-2GHz? if nf-2g else nf-5g then to nlimit
+ 6 0 do
+ dup i na+ @ d# -60 > if
+ nlimit >nf-max @ over i na+ !
+ else
+ dup i na+ @ nlimit >nf-min @ < if
+ nlimit >nf-nominal @ over i na+ !
+ then then
+ loop drop
+;
+
+: sign-extend32 ( val index -- val' ) d# 31 swap - tuck << swap >>a ;
+: do-get-nf ( nfarray -- )
+ 3 0 do
+ 1 i << rxchainmask and if
+ nf-regs i na+ @ reg@ 1ff0.0000 and d# 20 >> 8 sign-extend32 over i na+ !
+ curchan is-ht40? if
+ nf-regs i 3 + na+ @ reg@ 1ff.0000 and d# 16 >> 8 sign-extend32 over i 3 + na+ !
+ then
+ then
+ loop drop
+;
+
+: get-nf ( ch -- ok? )
+ nfarray 6 /n* erase
+ CH_CW_INT not over >ch-flags @ and over >ch-flags !
+ a2c4 reg@ 2 and if " NF did not complete" vtype drop false exit then
+ nfarray do-get-nf
+ nfarray sanitize-nf
+ nfarray @ 0 > if
+ " Noise floor detection failed" vtype
+ CH_CW_INT over >ch-flags @ or over >ch-flags !
+ then
+
+ false caldata >nfcal-pending? !
+ caldata update-nfcal-hist
+ caldata >nfcalHist >privNF @ swap >ch-noisefloor !
+ true
+;
+
+: init-nfcal-hist ( ch -- )
+ dup >ch-freq @ caldata >cd-ch !
+ dup >ch-flags @ CH_CW_INT invert and caldata >cd-chFlags !
+ caldata >nfCalHist to nh
+ get-nf-default ( default-nf )
+
+ 6 0 do
+ 0 i 'nh >currIndex !
+ dup i 'nh >privNF !
+ 3 i 'nh >invalidNFcount !
+ i 'nh >nfCalBuffer 5 /n* 2 pick " lfill" evaluate
+ loop drop
+;
+
+[ifdef] notyet
+: get-ch-noise ( ch -- noisefloor )
+ curchan ?dup 0= if get-nf-default exit then
+ >ch-noiseFloor @ ?dup if nip else get-nf-default then
+;
+
+: bstuck-nfcal ( -- )
+ caldata >nfcal-pending? @ if
+ a2c4 reg@ 2 and 0= if curchan get-nf drop then
+ else
+ true start-nfcal
+ then
+ true caldata >nfcal-interference? !
+;
+
+: #rxchains ( -- #chains ) 0 6 0 do rxchainmask i >> 1 and + loop ;
+
+: collect-iqcal ( -- )
+ 3 0 do
+ 98c0 i 1000 * + reg@ measI i na+ !
+ 98c4 i 1000 * + reg@ measQ i na+ !
+ 98c8 i 1000 * + reg@ measIQ i na+ !
+ loop
+;
+
+0 value iqCorrNeg
+: calibrate-iq ( #chains -- )
+ 0 do
+ false to iqCorrNeg
+ measI i na+ @ measQ i na+ @ measIQ i na+ @
+ dup 8000.0000 u> if not 1+ true to iqCorrNeg then
+ ( powerMeasI powerMeasQ iqCorrMeas' )
+ -rot over 1 >> over 1 >> + 8 >> ( iqCorrMeas powerMeasI powerMeasQ iCoffDenom )
+ swap 6 >> ( iqCorrMeas powerMeasI iCoffDenom qCoffDenom )
+ 2dup or if \ Avoid divide by zero
+ rot swap / d# 64 - ( iqCorrMeas iCoffDenom qCoff )
+ d# 63 min d# -63 max 7f and ( iqCorrMeas iCoffDenom qCoff' )
+ -rot / d# 63 min d# -63 max ( qCoff iCoff )
+ iqCorrNeg 0= if negate then 7f and ( qCoff iCoff' )
+ 7 << or 3fff 98dc i 1000 * + reg@!
+ then
+ loop
+ 4000 dup 98dc reg@!
+;
+
+: (calibrate) ( -- done? )
+ iq-calState CAL_RUNNING = if
+ 980c reg@ 1.0000 and 0= if
+ collect-iqcal
+ #rxchains calibrate-iq
+ CAL_DONE to iq-calState
+ then
+ then
+ iq-calState CAL_DONE =
+;
+
+: calibrate ( ch longcal? -- done? )
+ (calibrate) -rot ( done? ch longcal? )
+
+ if
+ get-nf drop
+ curchan load-nf
+ false start-nfcal
+ else
+ drop
+ then ( done? )
+;
+[then]
+
+3 /n* constant /coeff-meas \ 3 passes per measurement
+/coeff-meas 8 * constant /coeff-chain \ 8 measurements per chain
+
+/coeff-chain 6 * buffer: mag-coeff \ [AR9300_MAX_CHAINS][MAX_MEASUREMENT][MPASS]
+/coeff-chain 6 * buffer: phs-coeff \ [AR9300_MAX_CHAINS][MAX_MEASUREMENT][MPASS]
+2 /n* buffer: iq-coeff
+6 /n* buffer: iq-res
+
+: 'mag-coeff ( m chain -- adr ) /coeff-chain * swap /coeff-meas * + mag-coeff + ;
+: 'phs-coeff ( m chain -- adr ) /coeff-chain * swap /coeff-meas * + phs-coeff + ;
+: coeff@ ( i adr -- n ) swap na+ @ ;
+: coeff! ( n i adr -- ) swap na+ ! ;
+: mag-coeff@ ( i m chain -- n ) 'mag-coeff coeff@ ;
+: mag-coeff! ( n i m chain -- ) 'mag-coeff coeff! ;
+: phs-coeff@ ( i m chain -- n ) 'phs-coeff coeff@ ;
+: phs-coeff! ( n i m chain -- ) 'phs-coeff coeff! ;
+
+\ Local variables for the iq calibration
+0 value sin-2phi-1 0 value sin-2phi-2
+0 value cos-2phi-1 0 value cos-2phi-2
+0 value mag-a0-d0 0 value mag-a1-d0
+0 value phs-a0-d0 0 value phs-a1-d0
+0 value if1
+0 value if2
+0 value if3
+0 value mag-tx
+0 value mag-rx
+0 value phs-tx
+0 value phs-rx
+
+\ Solve 4x4 linear equation used in loopback iq cal.
+: solve-iq-cal ( -- solved? )
+ cos-2phi-1 cos-2phi-2 - to if1
+ sin-2phi-1 sin-2phi-2 - to if3
+ if1 if1 * if3 if3 * + d# 15 >>a ?dup 0= if false exit then \ Divide by zero
+ to if2
+ mag-a0-d0 mag-a1-d0 - if1 * phs-a0-d0 phs-a1-d0 - if3 * + if2 / to mag-tx
+ mag-a1-d0 mag-a0-d0 - if3 * phs-a0-d0 phs-a1-d0 - if1 * + if2 / to phs-tx
+
+ mag-a0-d0 cos-2phi-1 mag-tx * sin-2phi-1 phs-tx * + d# 15 >>a - to mag-rx
+ phs-a0-d0 sin-2phi-1 mag-tx * cos-2phi-1 phs-tx * - d# 15 >>a + to phs-rx
+ true
+;
+
+: find-mag ( i q -- mag )
+ abs swap abs ( abs[i] abs [q] )
+ 2dup max -rot min ( max-abs min-abs )
+ over 5 >> swap dup 3 >> swap 2 >> + + -
+;
+
+\ Local variables
+0 value i2-m-q2-a0-d0 0 value i2-p-q2-a0-d0 0 value iq-corr-a0-d0
+0 value i2-m-q2-a0-d1 0 value i2-p-q2-a0-d1 0 value iq-corr-a0-d1
+0 value i2-m-q2-a1-d0 0 value i2-p-q2-a1-d0 0 value iq-corr-a1-d0
+0 value i2-m-q2-a1-d1 0 value i2-p-q2-a1-d1 0 value iq-corr-a1-d1
+0 value mag-a0-d1 0 value mag-a1-d1
+0 value phs-a0-d1 0 value phs-a1-d1
+0 value mag-corr-tx 0 value phs-corr-tx
+0 value mag-corr-rx 0 value phs-corr-rx
+0 value mag1 0 value mag2
+
+: ?sign-800 ( n -- ) dup 800 > if d# 20 << d# 20 >>a then ;
+: calc-iq-corr ( -- ok? )
+ iq-res @ fff and ?sign-800 to i2-m-q2-a0-d0
+ iq-res @ d# 12 >> fff and ?sign-800 to i2-p-q2-a0-d0
+ iq-res @ d# 24 >> ?sign-800 to iq-corr-a0-d0
+
+ iq-res na1+ @ 4 >> fff and ?sign-800 to i2-m-q2-a0-d1
+ iq-res 2 na+ @ fff and ?sign-800 to i2-p-q2-a0-d1
+ iq-res 2 na+ @ d# 12 >> fff and ?sign-800 to iq-corr-a0-d1
+
+ iq-res 2 na+ @ d# 24 >> ?sign-800 to i2-m-q2-a1-d0
+ iq-res 3 na+ @ 4 >> fff and ?sign-800 to i2-p-q2-a1-d0
+ iq-res 4 na+ @ fff and ?sign-800 to iq-corr-a1-d0
+
+ iq-res 4 na+ @ d# 12 >> fff and ?sign-800 to i2-m-q2-a1-d1
+ iq-res 4 na+ @ d# 24 >> ?sign-800 to i2-p-q2-a1-d1
+ iq-res 5 na+ @ 4 >> fff and ?sign-800 to iq-corr-a1-d1
+
+ i2-p-q2-a0-d0 0= i2-p-q2-a0-d1 0= or i2-p-q2-a1-d0 0= or i2-p-q2-a1-d1 0= or
+ if false exit then \ Divide by zero
+
+ i2-m-q2-a0-d0 d# 15 << i2-p-q2-a0-d0 / to mag-a0-d0
+ iq-corr-a0-d0 d# 15 << i2-p-q2-a0-d0 / to phs-a0-d0
+
+ i2-m-q2-a0-d1 d# 15 << i2-p-q2-a0-d1 / to mag-a0-d1
+ iq-corr-a0-d1 d# 15 << i2-p-q2-a0-d1 / to phs-a0-d1
+
+ i2-m-q2-a1-d0 d# 15 << i2-p-q2-a1-d0 / to mag-a1-d0
+ iq-corr-a1-d0 d# 15 << i2-p-q2-a1-d0 / to phs-a1-d0
+
+ i2-m-q2-a1-d1 d# 15 << i2-p-q2-a1-d1 / to mag-a1-d1
+ iq-corr-a1-d1 d# 15 << i2-p-q2-a1-d1 / to phs-a1-d1
+
+ \ W/o analog phase shift
+ mag-a0-d0 mag-a0-d1 - 8 << 5 >>a to sin-2phi-1
+ phs-a0-d1 phs-a0-d0 - 8 << 5 >>a to cos-2phi-1
+ mag-a1-d0 mag-a1-d1 - 8 << 5 >>a to sin-2phi-2
+ phs-a1-d1 phs-a1-d0 - 8 << 5 >>a to cos-2phi-2
+
+ \ Force sin2 + cos2 = 1
+ \ Find magnitude by approximation
+ cos-2phi-1 sin-2phi-1 find-mag to mag1
+ cos-2phi-2 sin-2phi-2 find-mag to mag2
+ mag1 0= mag2 0= or if false exit then \ Divide by zero
+
+ \ Normalize sin and cos by mag
+ sin-2phi-1 d# 15 << mag1 / to sin-2phi-1
+ cos-2phi-1 d# 15 << mag1 / to cos-2phi-1
+ sin-2phi-2 d# 15 << mag2 / to sin-2phi-2
+ cos-2phi-2 d# 15 << mag2 / to cos-2phi-2
+
+ \ Calculate IQ mismatch
+ solve-iq-cal 0= if false exit then \ Failure
+
+ mag-tx 8000 = if false exit then \ Divide by zero
+
+ \ Calculate and quantize tx IQ correction factor
+ mag-tx d# 15 << 8000 mag-tx - / to mag-corr-tx
+ phs-tx negate to phs-corr-tx
+
+ mag-corr-tx 7 << d# 15 >>a d# -63 max d# 63 min 7 <<
+ phs-corr-tx 8 << d# 15 >>a d# -63 max d# 63 min + iq-coeff !
+
+ mag-rx negate 8000 = if false exit then \ Divide by zero
+
+ \ Calculate and quantize rx IQ correction factor
+ mag-rx negate d# 15 << 8000 mag-rx + / to mag-corr-rx
+ phs-rx negate to phs-corr-rx
+
+ mag-corr-rx 7 << d# 15 >>a d# -63 max d# 63 min 7 <<
+ phs-corr-rx 8 << d# 15 >>a d# -63 max d# 63 min + iq-coeff na1+ !
+ true
+;
+
+: compute-avg ( coeff[] -- false | avg true )
+ >r
+ 0 r@ coeff@ 1 r@ coeff@ - abs ( diff0 ) ( R: coeff[] )
+ 1 r@ coeff@ 2 r@ coeff@ - abs ( diff0 diff1 ) ( R: coeff[] )
+ 2 r@ coeff@ 0 r@ coeff@ - abs ( diff0 diff1 diff2 ) ( R: coeff[] )
+
+ 3dup + + d# 33 > if r> 4drop false exit then
+ ( diff0 diff1 diff2 ) ( R: coeff[] )
+ rot dup 3 pick <= swap 2 pick <= and if
+ 2drop 0 r@ coeff@ 1 r@ coeff@ + 1 >>a
+ else <= if
+ 1 r@ coeff@ 2 r@ coeff@ + 1 >>a
+ else
+ 2 r@ coeff@ 0 r@ coeff@ + 1 >>a
+ then then
+ true r> drop
+;
+
+\ Local variables
+8 6 * /n* buffer: tx-cc-regs \ [MAX_MEASUREMENT][AR9300_MAX_CHAINS]
+: txcc@ ( c m -- n ) 6 * /n* tx-cc-regs + swap na+ @ ;
+: txcc! ( n c m -- ) 6 * /n* tx-cc-regs + swap na+ ! ;
+
+: load-tx-iq-cal-avg-2passes ( #chains -- )
+ \ Setup array of register addresses
+ 4 0 do
+ a650 i na+ dup 0 i 2* txcc! 0 i 2* 1+ txcc!
+ b650 i na+ dup 1 i 2* txcc! 1 i 2* 1+ txcc!
+ c650 i na+ dup 2 i 2* txcc! 2 i 2* 1+ txcc!
+ loop
+
+ \ Load the average of 2 passes
+ ( #chains ) false swap 0 do \ Chain loop
+ a68c reg@ 3e and 1 >> 8 min 0 do \ Measurement loop
+ i j 'mag-coeff compute-avg 0= if drop true leave then 7f and ( mag )
+ i j 'phs-coeff compute-avg 0= if 2drop true leave then 7f and ( mag phase )
+ 7 << or
+ i 1 and if d# 14 << fff.c000 else 3fff then
+ j i txcc@ reg@!
+ loop
+ dup if leave then
+ loop
+ ( failed? ) if 0 0 else 2000.0000 8000.0000 then
+ 8000.0000 98b0 reg@!
+ 2000.0000 98dc reg@!
+;
+
+: cal-tx-iq ( -- )
+ false 3 0 do \ Pass loop
+ 80.0000 01fc.0000 a648 reg@!
+ 1 1 a640 reg@!
+ 0 1 a640 wait-hw 0= if
+ " TX IQ cal not complete" vtype
+ drop true leave
+ then
+
+ a68c reg@ 3e and 1 >> 8 min i ( flag #meas pass# )
+ tx-chainmask get-streams 0 do \ Chain loop
+ over 0 do \ Measurement loop
+ a68c j 1000 * + reg@ 1 and if rot drop true -rot leave then
+ 9b00 j 1000 * + ( flag #meas pass# reg-base )
+ 3 0 do
+ j 3 * i + 4 * over + \ reg
+ 0 8 a370 reg@!
+ dup reg@ iq-res i 2* na+ !
+ 8 8 a370 reg@!
+ reg@ ffff and iq-res i 2* 1+ na+ !
+ loop drop ( flag #meas pass# )
+ calc-iq-corr 0= if rot drop true -rot leave then
+ iq-coeff @ 7f and dup d# 63 > if d# 128 - then
+ over i j mag-coeff!
+ iq-coeff @ 7 >> 7f and dup d# 63 > if d# 128 - then
+ over i j phs-coeff!
+ loop ( flag #meas pass# )
+ loop 2drop dup if leave then
+ dup if leave then
+ loop
+ 0= if tx-chainmask get-streams load-tx-iq-cal-avg-2passes then
+;
+
+: init-cal ( -- )
+ 40d8 reg@ 2.0000 and if 3 3 else 7 7 then set-chain-masks
+ cal-tx-iq \ Do tx IQ calibration
+ 0 a20c reg!
+ 5 us
+ 1 a20c reg!
+ 1 1 a2c4 reg@! \ Calibrate the AGC
+ 0 1 a2c4 wait-hw drop
+ txchainmask rxchainmask set-chain-masks \ Restore chain masks
+ true start-nfcal
+ reset-calibration
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/debug.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/debug.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,232 @@
+purpose: ATH9K driver test words
+\ See license at end of file
+
+headers
+hex
+
+: ll ( idx -- ) dup f and 0= if cr 4 u.r ." " else drop then ;
+: dump-reg ( reg len -- ) bounds do i ll i reg@ 8 u.r space 4 +loop ;
+: .regs ( -- )
+ 0 100 dump-reg \ General, DMA
+ 800 50 dump-reg \ QCU
+ 900 100 dump-reg
+ a00 50 dump-reg
+ 1000 130 dump-reg \ DCU
+ 1270 10 dump-reg
+ 12f0 10 dump-reg
+ 4000 e0 dump-reg \ Host Interface
+ 7000 60 dump-reg \ RTC
+ 8000 400 dump-reg \ PCU
+ 8800 800 dump-reg \ Key
+ 9000 800 dump-reg
+ \ Undocumented PHY
+ 9800 400 dump-reg \ CHAN_BASE
+ a800 400 dump-reg \ CHAN1_BASE
+ b800 400 dump-reg \ CHAN2_BASE
+ 9c00 40 dump-reg \ MRC_BASE
+ 9d00 20 dump-reg \ BBB_BASE
+ 9e00 200 dump-reg \ AGC_BASE
+ ae00 200 dump-reg \ AGC_BASE1
+ be00 200 dump-reg \ AGC_BASE2
+ a200 600 dump-reg \ SMB_BASE
+ b200 600 dump-reg \ SM_BASE1
+ c200 600 dump-reg \ SM_BASE2
+;
+: .uregs ( -- )
+ \ Unknown, non-zero, not badc0ffe, not deadbeef
+ 1430 10 dump-reg
+ 1470 10 dump-reg
+ 1f00 100 dump-reg
+ 8400 100 dump-reg
+ d800 440 dump-reg
+ dd00 20 dump-reg
+ de00 200 dump-reg
+ e000 2000 dump-reg
+ 10000 40 dump-reg
+ 11000 1e00 dump-reg
+ 15f00 40 dump-reg
+ 16000 c00 dump-reg
+ 17c00 400 dump-reg
+;
+
+d# 80 /n* buffer: tx-stat-buf \ tx statistics buffer
+ \ It is indexed with #tx-retry. Each word
+ \ is # of time that said #tx-retry happened.
+: init-debug ( -- ) tx-stat-buf d# 80 /n* erase ;
+: sd ( -- )
+ true to force-open?
+ a to defch
+ " load-base" evaluate 80.0000 + to debug-base
+ open .
+ " TP-LINK" set-ssid
+ " "(f4 ec 38 a4 87 2f)" target-mac swap move
+ init-debug
+;
+
+: tx-stat-buf@ ( i -- n ) tx-stat-buf swap na+ @ ;
+: tx-stat-buf++ ( i -- ) tx-stat-buf swap na+ dup @ 1+ swap ! ;
+: log-tx-stat ( -- ) #tx-retry tx-stat-buf++ ;
+
+0 value testi \ test iteration #
+0 value #test \ # iteration of test
+0 value #testf \ # of test failure
+: testi++ ( -- ) testi 1+ to testi ;
+: #test++ ( -- ) #test 1+ to #test ;
+: #testf++ ( -- ) #testf 1+ to #testf ;
+
+0 value #tx-reset-save
+: save-#tx-reset ( -- ) #tx-reset to #tx-reset-save ;
+
+0 value #test-tx-retry \ Success count
+0 value #test-tx-retry-fail \ Failure count
+: ?#test-tx-retry++ ( -- )
+ #tx-reset #tx-reset-save > if #test-tx-retry 1+ to #test-tx-retry then
+;
+: ?#test-tx-retry-fail++ ( -- )
+ #tx-reset #tx-reset-save > if #test-tx-retry-fail 1+ to #test-tx-retry-fail then
+;
+
+0 value test-start-ms
+0 value test-end-ms
+: 2u.r ( n -- ) <# u# u# u#> type ;
+: 3u.r ( n -- ) <# u# u# u# u#> type ;
+: .time ( ms -- )
+ base @ >r decimal ( ms ) ( R: base )
+ d# 1000 /mod ( ms' sec ) ( R: base )
+ d# 60 /mod ( ms sec' min ) ( R: base )
+ d# 60 /mod ( ms sec min' hr ) ( R: base )
+ 2u.r ascii : emit 2u.r ascii : emit 2u.r ascii . emit 3u.r
+ r> base ! ( )
+;
+: .stat ( -- )
+ ." elapse time = " test-end-ms test-start-ms - .time cr
+ .rx-stat .tx-stat
+ ." #test = " #test .d cr
+ ." #test failure = " #testf .d cr
+ ." #tx-reset success = " #test-tx-retry .d cr
+ ." #tx-reset failure = " #test-tx-retry-fail .d cr
+ ." #tx-reset-max = " #tx-reset-max .d cr
+ ." tx-stat-buf dump:" cr
+ tx-stat-buf tx-retry-cnt /n* " ldump" evaluate
+;
+: .graph ( -- )
+ \ Publish test parameters
+ ." tx desc retry cnt = " rseries @ .d cr
+ ." tx-retry-delay-time (ms) = " tx-retry-delay-time .d cr
+ \ Determine the largest count
+ 0 tx-retry-cnt 1+ 1 do i tx-stat-buf@ max loop
+ \ Determine the scale for the graph, at least 1
+ d# 100 /mod swap if 1+ then 1 max
+ \ Graph it
+ tx-retry-cnt 1+ 1 do
+ i 2 u.r space space
+ i tx-stat-buf@ over /mod swap if 1+ then
+ ?dup if 0 do ascii * emit loop then
+ cr
+ loop drop
+;
+
+\ ********************************************************************************
+\ TX, no ACK test
+\
+\ Reminder: set-ssid before testp
+
+: proc-queued-resp ( -- )
+ begin deque-rx while
+ process-rx
+ free-rx
+ got-response? if ascii R else ascii . then emit
+ repeat
+;
+
+: my-probe-ssid ( adr len -- found? )
+ start-scan-response
+ (probe-ssid)
+;
+: testp ( -- )
+ ." ---- probe-ssid ----" cr
+ 0 to testi
+ get-msecs to test-start-ms
+ begin
+ debug? 0= if (cr testi . then testi++
+ #test++ save-#tx-reset
+ debug-base 40.0000 + 800 my-probe-ssid 0= if
+ debug? 0= if ." failed" cr then
+ log-tx-stat
+ ?#test-tx-retry-fail++
+ #testf++
+ else
+ log-tx-stat
+ ?#test-tx-retry++
+ then
+ 400 ms key?
+ until
+ get-msecs to test-end-ms
+;
+
+\ ********************************************************************************
+\ TX, ACK test
+
+: testa ( -- )
+ ." ---- athenticate ----" cr
+ 0 to testi
+ get-msecs to test-start-ms
+ begin
+ debug? 0= if (cr testi . then testi++
+ #test++ save-#tx-reset
+ target-mac$ authenticate 0= if
+ log-tx-stat
+ ?#test-tx-retry-fail++
+ #testf++
+ else
+ log-tx-stat
+ ?#test-tx-retry++
+ then
+ 400 ms key?
+ until
+ get-msecs to test-end-ms
+;
+
+\ ********************************************************************************
+\ Associate test
+
+d# 2,000 constant read-timeout-limit
+0 value read-ms
+: read-loop ( -- )
+ get-msecs read-timeout-limit + to read-ms
+ begin
+ debug-base 10.0000 + 800 read-force drop
+ get-msecs read-ms >= until
+;
+: testd ( -- )
+ " reset-rcnt" $call-supplicant
+ do-associate 0= if ." Fail to associate" cr exit then
+ ['] 2drop to ?process-eapol
+ read-loop
+ target-mac$ deauthenticate
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/domain.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/domain.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,707 @@
+Purpose: Atheros regulatory domain constants
+\ See license at end of file
+
+headers
+hex
+
+00 constant NO_ENUMRD
+03 constant NULL1_WORLD
+07 constant NULL1_ETSIB
+08 constant NULL1_ETSIC
+10 constant FCC1_FCCA
+11 constant FCC1_WORLD
+12 constant FCC4_FCCA
+13 constant FCC5_FCCA
+14 constant FCC6_FCCA
+
+20 constant FCC2_FCCA
+21 constant FCC2_WORLD
+22 constant FCC2_ETSIC
+23 constant FCC6_WORLD
+31 constant FRANCE_RES
+3a constant FCC3_FCCA
+3b constant FCC3_WORLD
+
+37 constant ETSI1_WORLD
+32 constant ETSI3_ETSIA
+35 constant ETSI2_WORLD
+36 constant ETSI3_WORLD
+30 constant ETSI4_WORLD
+38 constant ETSI4_ETSIC
+39 constant ETSI5_WORLD
+34 constant ETSI6_WORLD
+33 constant ETSI_RESERVED
+
+40 constant MKK1_MKKA
+41 constant MKK1_MKKB
+42 constant APL4_WORLD
+43 constant MKK2_MKKA
+44 constant APL_RESERVED
+45 constant APL2_WORLD
+46 constant APL2_APLC
+47 constant APL3_WORLD
+48 constant MKK1_FCCA
+49 constant APL2_APLD
+4a constant MKK1_MKKA1
+4b constant MKK1_MKKA2
+4c constant MKK1_MKKC
+
+50 constant APL3_FCCA
+52 constant APL1_WORLD
+53 constant APL1_FCCA
+54 constant APL1_APLA
+55 constant APL1_ETSIC
+56 constant APL2_ETSIC
+58 constant APL5_WORLD
+5b constant APL6_WORLD
+5c constant APL7_FCCA
+5d constant APL8_WORLD
+5e constant APL9_WORLD
+
+60 constant WOR0_WORLD
+61 constant WOR1_WORLD
+62 constant WOR2_WORLD
+63 constant WOR3_WORLD
+64 constant WOR4_WORLD
+65 constant WOR5_ETSIC
+
+66 constant WOR01_WORLD
+67 constant WOR02_WORLD
+68 constant EU1_WORLD
+
+69 constant WOR9_WORLD
+6a constant WORA_WORLD
+6b constant WORB_WORLD
+
+80 constant MKK3_MKKB
+81 constant MKK3_MKKA2
+82 constant MKK3_MKKC
+
+83 constant MKK4_MKKB
+84 constant MKK4_MKKA2
+85 constant MKK4_MKKC
+
+86 constant MKK5_MKKB
+87 constant MKK5_MKKA2
+88 constant MKK5_MKKC
+
+89 constant MKK6_MKKB
+8a constant MKK6_MKKA2
+8b constant MKK6_MKKC
+
+8c constant MKK7_MKKB
+8d constant MKK7_MKKA2
+8e constant MKK7_MKKC
+
+8f constant MKK8_MKKB
+90 constant MKK8_MKKA2
+91 constant MKK8_MKKC
+
+92 constant MKK14_MKKA1
+93 constant MKK15_MKKA1
+
+d0 constant MKK10_FCCA
+d1 constant MKK10_MKKA1
+d2 constant MKK10_MKKC
+d3 constant MKK10_MKKA2
+
+d4 constant MKK11_MKKA
+d5 constant MKK11_FCCA
+d6 constant MKK11_MKKA1
+d7 constant MKK11_MKKC
+d8 constant MKK11_MKKA2
+
+d9 constant MKK12_MKKA
+da constant MKK12_FCCA
+db constant MKK12_MKKA1
+dc constant MKK12_MKKC
+dd constant MKK12_MKKA2
+
+de constant MKK13_MKKB
+
+f0 constant MKK3_MKKA
+f1 constant MKK3_MKKA1
+f2 constant MKK3_FCCA
+f3 constant MKK4_MKKA
+f4 constant MKK4_MKKA1
+f5 constant MKK4_FCCA
+f6 constant MKK9_MKKA
+f7 constant MKK10_MKKA
+f8 constant MKK6_MKKA1
+f9 constant MKK6_FCCA
+fa constant MKK7_MKKA1
+fb constant MKK7_FCCA
+fc constant MKK9_FCCA
+fd constant MKK9_MKKA1
+fe constant MKK9_MKKC
+ff constant MKK9_MKKA2
+
+0199 constant WORLD
+01ff constant DEBUG_REG_DMN
+
+40 constant CTL_MKK
+30 constant CTL_ETSI
+ff constant NO_CTL
+
+\ Regpair to CTL band mapping
+create regDomainPairs
+here
+ \ regpair , 5 GHz CTL , 2 GHz CTL
+ NO_ENUMRD , DEBUG_REG_DMN , DEBUG_REG_DMN ,
+ NULL1_WORLD , NO_CTL , CTL_ETSI ,
+ NULL1_ETSIB , NO_CTL , CTL_ETSI ,
+ NULL1_ETSIC , NO_CTL , CTL_ETSI ,
+
+ FCC2_FCCA , CTL_FCC , CTL_FCC ,
+ FCC2_WORLD , CTL_FCC , CTL_ETSI ,
+ FCC2_ETSIC , CTL_FCC , CTL_ETSI ,
+ FCC3_FCCA , CTL_FCC , CTL_FCC ,
+ FCC3_WORLD , CTL_FCC , CTL_ETSI ,
+ FCC4_FCCA , CTL_FCC , CTL_FCC ,
+ FCC5_FCCA , CTL_FCC , CTL_FCC ,
+ FCC6_FCCA , CTL_FCC , CTL_FCC ,
+ FCC6_WORLD , CTL_FCC , CTL_ETSI ,
+
+ ETSI1_WORLD , CTL_ETSI , CTL_ETSI ,
+ ETSI2_WORLD , CTL_ETSI , CTL_ETSI ,
+ ETSI3_WORLD , CTL_ETSI , CTL_ETSI ,
+ ETSI4_WORLD , CTL_ETSI , CTL_ETSI ,
+ ETSI5_WORLD , CTL_ETSI , CTL_ETSI ,
+ ETSI6_WORLD , CTL_ETSI , CTL_ETSI ,
+
+ ETSI3_ETSIA , CTL_ETSI , CTL_ETSI ,
+ FRANCE_RES , CTL_ETSI , CTL_ETSI ,
+
+ FCC1_WORLD , CTL_FCC , CTL_ETSI ,
+ FCC1_FCCA , CTL_FCC , CTL_FCC ,
+ APL1_WORLD , CTL_FCC , CTL_ETSI ,
+ APL2_WORLD , CTL_FCC , CTL_ETSI ,
+ APL3_WORLD , CTL_FCC , CTL_ETSI ,
+ APL4_WORLD , CTL_FCC , CTL_ETSI ,
+ APL5_WORLD , CTL_FCC , CTL_ETSI ,
+ APL6_WORLD , CTL_ETSI , CTL_ETSI ,
+ APL8_WORLD , CTL_ETSI , CTL_ETSI ,
+ APL9_WORLD , CTL_ETSI , CTL_ETSI ,
+
+ APL3_FCCA , CTL_FCC , CTL_FCC ,
+ APL7_FCCA , CTL_FCC , CTL_FCC ,
+ APL1_ETSIC , CTL_FCC , CTL_ETSI ,
+ APL2_ETSIC , CTL_FCC , CTL_ETSI ,
+ APL2_APLD , CTL_FCC , NO_CTL ,
+
+ MKK1_MKKA , CTL_MKK , CTL_MKK ,
+ MKK1_MKKB , CTL_MKK , CTL_MKK ,
+ MKK1_FCCA , CTL_MKK , CTL_FCC ,
+ MKK1_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK1_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK1_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK2_MKKA , CTL_MKK , CTL_MKK ,
+ MKK3_MKKA , CTL_MKK , CTL_MKK ,
+ MKK3_MKKB , CTL_MKK , CTL_MKK ,
+ MKK3_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK3_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK3_MKKC , CTL_MKK , CTL_MKK ,
+ MKK3_FCCA , CTL_MKK , CTL_FCC ,
+
+ MKK4_MKKA , CTL_MKK , CTL_MKK ,
+ MKK4_MKKB , CTL_MKK , CTL_MKK ,
+ MKK4_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK4_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK4_MKKC , CTL_MKK , CTL_MKK ,
+ MKK4_FCCA , CTL_MKK , CTL_FCC ,
+
+ MKK5_MKKB , CTL_MKK , CTL_MKK ,
+ MKK5_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK5_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK6_MKKB , CTL_MKK , CTL_MKK ,
+ MKK6_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK6_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK6_MKKC , CTL_MKK , CTL_MKK ,
+ MKK6_FCCA , CTL_MKK , CTL_FCC ,
+
+ MKK7_MKKB , CTL_MKK , CTL_MKK ,
+ MKK7_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK7_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK7_MKKC , CTL_MKK , CTL_MKK ,
+ MKK7_FCCA , CTL_MKK , CTL_FCC ,
+
+ MKK8_MKKB , CTL_MKK , CTL_MKK ,
+ MKK8_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK8_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK9_MKKA , CTL_MKK , CTL_MKK ,
+ MKK9_FCCA , CTL_MKK , CTL_FCC ,
+ MKK9_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK9_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK9_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK10_MKKA , CTL_MKK , CTL_MKK ,
+ MKK10_FCCA , CTL_MKK , CTL_FCC ,
+ MKK10_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK10_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK10_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK11_MKKA , CTL_MKK , CTL_MKK ,
+ MKK11_FCCA , CTL_MKK , CTL_FCC ,
+ MKK11_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK11_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK11_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK12_MKKA , CTL_MKK , CTL_MKK ,
+ MKK12_FCCA , CTL_MKK , CTL_FCC ,
+ MKK12_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK12_MKKA2 , CTL_MKK , CTL_MKK ,
+ MKK12_MKKC , CTL_MKK , CTL_MKK ,
+
+ MKK13_MKKB , CTL_MKK , CTL_MKK ,
+ MKK14_MKKA1 , CTL_MKK , CTL_MKK ,
+ MKK15_MKKA1 , CTL_MKK , CTL_MKK ,
+
+ WOR0_WORLD , NO_CTL , NO_CTL ,
+ WOR1_WORLD , NO_CTL , NO_CTL ,
+ WOR2_WORLD , NO_CTL , NO_CTL ,
+ WOR3_WORLD , NO_CTL , NO_CTL ,
+ WOR4_WORLD , NO_CTL , NO_CTL ,
+ WOR5_ETSIC , NO_CTL , NO_CTL ,
+ WOR01_WORLD , NO_CTL , NO_CTL ,
+ WOR02_WORLD , NO_CTL , NO_CTL ,
+ EU1_WORLD , NO_CTL , NO_CTL ,
+ WOR9_WORLD , NO_CTL , NO_CTL ,
+ WORA_WORLD , NO_CTL , NO_CTL ,
+ WORB_WORLD , NO_CTL , NO_CTL ,
+here swap - 3 /n* / constant #regDomainPairs
+
+0 constant CTRY_DEFAULT
+1ff constant CTRY_DEBUG
+
+\ Country codes
+decimal
+ 8 constant CTRY_ALBANIA
+ 12 constant CTRY_ALGERIA
+ 32 constant CTRY_ARGENTINA
+ 51 constant CTRY_ARMENIA
+ 533 constant CTRY_ARUBA
+ 36 constant CTRY_AUSTRALIA
+ 40 constant CTRY_AUSTRIA
+ 31 constant CTRY_AZERBAIJAN
+
+ 48 constant CTRY_BAHRAIN
+ 50 constant CTRY_BANGLADESH
+ 52 constant CTRY_BARBADOS
+ 112 constant CTRY_BELARUS
+ 56 constant CTRY_BELGIUM
+ 84 constant CTRY_BELIZE
+ 68 constant CTRY_BOLIVIA
+ 70 constant CTRY_BOSNIA_HERZ
+ 76 constant CTRY_BRAZIL
+ 96 constant CTRY_BRUNEI_DARUSSALAM
+ 100 constant CTRY_BULGARIA
+
+ 116 constant CTRY_CAMBODIA
+ 124 constant CTRY_CANADA
+ 152 constant CTRY_CHILE
+ 156 constant CTRY_CHINA
+ 170 constant CTRY_COLOMBIA
+ 188 constant CTRY_COSTA_RICA
+ 190 constant CTRY_CROATIA
+ 196 constant CTRY_CYPRUS
+ 203 constant CTRY_CZECH
+
+ 208 constant CTRY_DENMARK
+ 214 constant CTRY_DOMINICAN_REPUBLIC
+
+ 218 constant CTRY_ECUADOR
+ 818 constant CTRY_EGYPT
+ 222 constant CTRY_EL_SALVADOR
+ 233 constant CTRY_ESTONIA
+
+ 234 constant CTRY_FAEROE_ISLANDS
+ 246 constant CTRY_FINLAND
+ 250 constant CTRY_FRANCE
+
+ 268 constant CTRY_GEORGIA
+ 276 constant CTRY_GERMANY
+ 300 constant CTRY_GREECE
+ 304 constant CTRY_GREENLAND
+ 308 constant CTRY_GRENEDA
+ 316 constant CTRY_GUAM
+ 320 constant CTRY_GUATEMALA
+
+ 332 constant CTRY_HAITI
+ 340 constant CTRY_HONDURAS
+ 344 constant CTRY_HONG_KONG
+ 348 constant CTRY_HUNGARY
+
+ 352 constant CTRY_ICELAND
+ 356 constant CTRY_INDIA
+ 360 constant CTRY_INDONESIA
+ 365 constant CTRY_IRAN
+ 368 constant CTRY_IRAQ
+ 372 constant CTRY_IRELAND
+ 376 constant CTRY_ISRAEL
+ 380 constant CTRY_ITALY
+
+ 388 constant CTRY_JAMAICA
+ 392 constant CTRY_JAPAN
+ 400 constant CTRY_JORDAN
+
+ 398 constant CTRY_KAZAKHSTAN
+ 404 constant CTRY_KENYA
+ 408 constant CTRY_KOREA_NORTH
+ 410 constant CTRY_KOREA_ROC
+ 411 constant CTRY_KOREA_ROC2
+ 412 constant CTRY_KOREA_ROC3
+ 414 constant CTRY_KUWAIT
+
+ 428 constant CTRY_LATVIA
+ 422 constant CTRY_LEBANON
+ 434 constant CTRY_LIBYA
+ 438 constant CTRY_LIECHTENSTEIN
+ 440 constant CTRY_LITHUANIA
+ 442 constant CTRY_LUXEMBOURG
+
+ 446 constant CTRY_MACAU
+ 807 constant CTRY_MACEDONIA
+ 458 constant CTRY_MALAYSIA
+ 470 constant CTRY_MALTA
+ 484 constant CTRY_MEXICO
+ 492 constant CTRY_MONACO
+ 504 constant CTRY_MOROCCO
+
+ 524 constant CTRY_NEPAL
+ 528 constant CTRY_NETHERLANDS
+ 530 constant CTRY_NETHERLANDS_ANTILLES
+ 554 constant CTRY_NEW_ZEALAND
+ 558 constant CTRY_NICARAGUA
+ 578 constant CTRY_NORWAY
+
+ 512 constant CTRY_OMAN
+
+ 586 constant CTRY_PAKISTAN
+ 591 constant CTRY_PANAMA
+ 598 constant CTRY_PAPUA_NEW_GUINEA
+ 600 constant CTRY_PARAGUAY
+ 604 constant CTRY_PERU
+ 608 constant CTRY_PHILIPPINES
+ 616 constant CTRY_POLAND
+ 620 constant CTRY_PORTUGAL
+ 630 constant CTRY_PUERTO_RICO
+
+ 634 constant CTRY_QATAR
+
+ 642 constant CTRY_ROMANIA
+ 643 constant CTRY_RUSSIA
+
+ 682 constant CTRY_SAUDI_ARABIA
+ 891 constant CTRY_SERBIA_MONTENEGRO
+ 702 constant CTRY_SINGAPORE
+ 703 constant CTRY_SLOVAKIA
+ 705 constant CTRY_SLOVENIA
+ 710 constant CTRY_SOUTH_AFRICA
+ 724 constant CTRY_SPAIN
+ 144 constant CTRY_SRI_LANKA
+ 752 constant CTRY_SWEDEN
+ 756 constant CTRY_SWITZERLAND
+ 760 constant CTRY_SYRIA
+
+ 158 constant CTRY_TAIWAN
+ 764 constant CTRY_THAILAND
+ 780 constant CTRY_TRINIDAD_Y_TOBAGO
+ 788 constant CTRY_TUNISIA
+ 792 constant CTRY_TURKEY
+
+ 784 constant CTRY_UAE
+ 804 constant CTRY_UKRAINE
+ 826 constant CTRY_UNITED_KINGDOM
+ 840 constant CTRY_UNITED_STATES
+ 842 constant CTRY_UNITED_STATES_FCC49
+ 858 constant CTRY_URUGUAY
+ 860 constant CTRY_UZBEKISTAN
+
+ 862 constant CTRY_VENEZUELA
+ 704 constant CTRY_VIET_NAM
+
+ 877 constant CTRY_YEMEN
+
+ 716 constant CTRY_ZIMBABWE
+
+ 393 constant CTRY_JAPAN1
+ 394 constant CTRY_JAPAN2
+ 395 constant CTRY_JAPAN3
+ 396 constant CTRY_JAPAN4
+ 397 constant CTRY_JAPAN5
+4006 constant CTRY_JAPAN6
+4007 constant CTRY_JAPAN7
+4008 constant CTRY_JAPAN8
+4009 constant CTRY_JAPAN9
+4010 constant CTRY_JAPAN10
+4011 constant CTRY_JAPAN11
+4012 constant CTRY_JAPAN12
+4013 constant CTRY_JAPAN13
+4014 constant CTRY_JAPAN14
+4015 constant CTRY_JAPAN15
+4016 constant CTRY_JAPAN16
+4017 constant CTRY_JAPAN17
+4018 constant CTRY_JAPAN18
+4019 constant CTRY_JAPAN19
+4020 constant CTRY_JAPAN20
+4021 constant CTRY_JAPAN21
+4022 constant CTRY_JAPAN22
+4023 constant CTRY_JAPAN23
+4024 constant CTRY_JAPAN24
+4025 constant CTRY_JAPAN25
+4026 constant CTRY_JAPAN26
+4027 constant CTRY_JAPAN27
+4028 constant CTRY_JAPAN28
+4029 constant CTRY_JAPAN29
+4030 constant CTRY_JAPAN30
+4031 constant CTRY_JAPAN31
+4032 constant CTRY_JAPAN32
+4033 constant CTRY_JAPAN33
+4034 constant CTRY_JAPAN34
+4035 constant CTRY_JAPAN35
+4036 constant CTRY_JAPAN36
+4037 constant CTRY_JAPAN37
+4038 constant CTRY_JAPAN38
+4039 constant CTRY_JAPAN39
+4040 constant CTRY_JAPAN40
+4041 constant CTRY_JAPAN41
+4042 constant CTRY_JAPAN42
+4043 constant CTRY_JAPAN43
+4044 constant CTRY_JAPAN44
+4045 constant CTRY_JAPAN45
+4046 constant CTRY_JAPAN46
+4047 constant CTRY_JAPAN47
+4048 constant CTRY_JAPAN48
+4049 constant CTRY_JAPAN49
+4050 constant CTRY_JAPAN50
+4051 constant CTRY_JAPAN51
+4052 constant CTRY_JAPAN52
+4053 constant CTRY_JAPAN53
+4054 constant CTRY_JAPAN54
+4055 constant CTRY_JAPAN55
+4056 constant CTRY_JAPAN56
+4057 constant CTRY_JAPAN57
+4058 constant CTRY_JAPAN58
+4059 constant CTRY_JAPAN59
+
+5000 constant CTRY_AUSTRALIA2
+5001 constant CTRY_CANADA2
+5002 constant CTRY_BELGIUM2
+hex
+
+create allCountries
+here
+ CTRY_DEBUG , NO_ENUMRD , " DB" $,
+ CTRY_DEFAULT , FCC1_FCCA , " CO" $,
+ CTRY_ALBANIA , NULL1_WORLD , " AL" $,
+ CTRY_ALGERIA , NULL1_WORLD , " DZ" $,
+ CTRY_ARGENTINA , FCC3_WORLD , " AR" $,
+ CTRY_ARMENIA , ETSI4_WORLD , " AM" $,
+ CTRY_ARUBA , ETSI1_WORLD , " AW" $,
+ CTRY_AUSTRALIA , FCC2_WORLD , " AU" $,
+ CTRY_AUSTRALIA2 , FCC6_WORLD , " AU" $,
+ CTRY_AUSTRIA , ETSI1_WORLD , " AT" $,
+ CTRY_AZERBAIJAN , ETSI4_WORLD , " AZ" $,
+ CTRY_BAHRAIN , APL6_WORLD , " BH" $,
+ CTRY_BANGLADESH , NULL1_WORLD , " BD" $,
+ CTRY_BARBADOS , FCC2_WORLD , " BB" $,
+ CTRY_BELARUS , ETSI1_WORLD , " BY" $,
+ CTRY_BELGIUM , ETSI1_WORLD , " BE" $,
+ CTRY_BELGIUM2 , ETSI4_WORLD , " BL" $,
+ CTRY_BELIZE , APL1_ETSIC , " BZ" $,
+ CTRY_BOLIVIA , APL1_ETSIC , " BO" $,
+ CTRY_BOSNIA_HERZ , ETSI1_WORLD , " BA" $,
+ CTRY_BRAZIL , FCC3_WORLD , " BR" $,
+ CTRY_BRUNEI_DARUSSALAM , APL1_WORLD , " BN" $,
+ CTRY_BULGARIA , ETSI6_WORLD , " BG" $,
+ CTRY_CAMBODIA , ETSI1_WORLD , " KH" $,
+ CTRY_CANADA , FCC3_FCCA , " CA" $,
+ CTRY_CANADA2 , FCC6_FCCA , " CA" $,
+ CTRY_CHILE , APL6_WORLD , " CL" $,
+ CTRY_CHINA , APL1_WORLD , " CN" $,
+ CTRY_COLOMBIA , FCC1_FCCA , " CO" $,
+ CTRY_COSTA_RICA , FCC1_WORLD , " CR" $,
+ CTRY_CROATIA , ETSI1_WORLD , " HR" $,
+ CTRY_CYPRUS , ETSI1_WORLD , " CY" $,
+ CTRY_CZECH , ETSI3_WORLD , " CZ" $,
+ CTRY_DENMARK , ETSI1_WORLD , " DK" $,
+ CTRY_DOMINICAN_REPUBLIC , FCC1_FCCA , " DO" $,
+ CTRY_ECUADOR , FCC1_WORLD , " EC" $,
+ CTRY_EGYPT , ETSI3_WORLD , " EG" $,
+ CTRY_EL_SALVADOR , FCC1_WORLD , " SV" $,
+ CTRY_ESTONIA , ETSI1_WORLD , " EE" $,
+ CTRY_FINLAND , ETSI1_WORLD , " FI" $,
+ CTRY_FRANCE , ETSI1_WORLD , " FR" $,
+ CTRY_GEORGIA , ETSI4_WORLD , " GE" $,
+ CTRY_GERMANY , ETSI1_WORLD , " DE" $,
+ CTRY_GREECE , ETSI1_WORLD , " GR" $,
+ CTRY_GREENLAND , ETSI1_WORLD , " GL" $,
+ CTRY_GRENEDA , FCC3_FCCA , " GD" $,
+ CTRY_GUAM , FCC1_FCCA , " GU" $,
+ CTRY_GUATEMALA , FCC1_FCCA , " GT" $,
+ CTRY_HAITI , ETSI1_WORLD , " HT" $,
+ CTRY_HONDURAS , NULL1_WORLD , " HN" $,
+ CTRY_HONG_KONG , FCC3_WORLD , " HK" $,
+ CTRY_HUNGARY , ETSI1_WORLD , " HU" $,
+ CTRY_ICELAND , ETSI1_WORLD , " IS" $,
+ CTRY_INDIA , APL6_WORLD , " IN" $,
+ CTRY_INDONESIA , NULL1_WORLD , " ID" $,
+ CTRY_IRAN , APL1_WORLD , " IR" $,
+ CTRY_IRELAND , ETSI1_WORLD , " IE" $,
+ CTRY_ISRAEL , NULL1_WORLD , " IL" $,
+ CTRY_ITALY , ETSI1_WORLD , " IT" $,
+ CTRY_JAMAICA , FCC3_WORLD , " JM" $,
+
+ CTRY_JAPAN , MKK1_MKKA , " JP" $,
+ CTRY_JAPAN1 , MKK1_MKKB , " JP" $,
+ CTRY_JAPAN2 , MKK1_FCCA , " JP" $,
+ CTRY_JAPAN3 , MKK2_MKKA , " JP" $,
+ CTRY_JAPAN4 , MKK1_MKKA1 , " JP" $,
+ CTRY_JAPAN5 , MKK1_MKKA2 , " JP" $,
+ CTRY_JAPAN6 , MKK1_MKKC , " JP" $,
+ CTRY_JAPAN7 , MKK3_MKKB , " JP" $,
+ CTRY_JAPAN8 , MKK3_MKKA2 , " JP" $,
+ CTRY_JAPAN9 , MKK3_MKKC , " JP" $,
+ CTRY_JAPAN10 , MKK4_MKKB , " JP" $,
+ CTRY_JAPAN11 , MKK4_MKKA2 , " JP" $,
+ CTRY_JAPAN12 , MKK4_MKKC , " JP" $,
+ CTRY_JAPAN13 , MKK5_MKKB , " JP" $,
+ CTRY_JAPAN14 , MKK5_MKKA2 , " JP" $,
+ CTRY_JAPAN15 , MKK5_MKKC , " JP" $,
+ CTRY_JAPAN16 , MKK6_MKKB , " JP" $,
+ CTRY_JAPAN17 , MKK6_MKKA2 , " JP" $,
+ CTRY_JAPAN18 , MKK6_MKKC , " JP" $,
+ CTRY_JAPAN19 , MKK7_MKKB , " JP" $,
+ CTRY_JAPAN20 , MKK7_MKKA2 , " JP" $,
+ CTRY_JAPAN21 , MKK7_MKKC , " JP" $,
+ CTRY_JAPAN22 , MKK8_MKKB , " JP" $,
+ CTRY_JAPAN23 , MKK8_MKKA2 , " JP" $,
+ CTRY_JAPAN24 , MKK8_MKKC , " JP" $,
+ CTRY_JAPAN25 , MKK3_MKKA , " JP" $,
+ CTRY_JAPAN26 , MKK3_MKKA1 , " JP" $,
+ CTRY_JAPAN27 , MKK3_FCCA , " JP" $,
+ CTRY_JAPAN28 , MKK4_MKKA1 , " JP" $,
+ CTRY_JAPAN29 , MKK4_FCCA , " JP" $,
+ CTRY_JAPAN30 , MKK6_MKKA1 , " JP" $,
+ CTRY_JAPAN31 , MKK6_FCCA , " JP" $,
+ CTRY_JAPAN32 , MKK7_MKKA1 , " JP" $,
+ CTRY_JAPAN33 , MKK7_FCCA , " JP" $,
+ CTRY_JAPAN34 , MKK9_MKKA , " JP" $,
+ CTRY_JAPAN35 , MKK10_MKKA , " JP" $,
+ CTRY_JAPAN36 , MKK4_MKKA , " JP" $,
+ CTRY_JAPAN37 , MKK9_FCCA , " JP" $,
+ CTRY_JAPAN38 , MKK9_MKKA1 , " JP" $,
+ CTRY_JAPAN39 , MKK9_MKKC , " JP" $,
+ CTRY_JAPAN40 , MKK9_MKKA2 , " JP" $,
+ CTRY_JAPAN41 , MKK10_FCCA , " JP" $,
+ CTRY_JAPAN42 , MKK10_MKKA1 , " JP" $,
+ CTRY_JAPAN43 , MKK10_MKKC , " JP" $,
+ CTRY_JAPAN44 , MKK10_MKKA2 , " JP" $,
+ CTRY_JAPAN45 , MKK11_MKKA , " JP" $,
+ CTRY_JAPAN46 , MKK11_FCCA , " JP" $,
+ CTRY_JAPAN47 , MKK11_MKKA1 , " JP" $,
+ CTRY_JAPAN48 , MKK11_MKKC , " JP" $,
+ CTRY_JAPAN49 , MKK11_MKKA2 , " JP" $,
+ CTRY_JAPAN50 , MKK12_MKKA , " JP" $,
+ CTRY_JAPAN51 , MKK12_FCCA , " JP" $,
+ CTRY_JAPAN52 , MKK12_MKKA1 , " JP" $,
+ CTRY_JAPAN53 , MKK12_MKKC , " JP" $,
+ CTRY_JAPAN54 , MKK12_MKKA2 , " JP" $,
+ CTRY_JAPAN57 , MKK13_MKKB , " JP" $,
+ CTRY_JAPAN58 , MKK14_MKKA1 , " JP" $,
+ CTRY_JAPAN59 , MKK15_MKKA1 , " JP" $,
+
+ CTRY_JORDAN , ETSI2_WORLD , " JO" $,
+ CTRY_KAZAKHSTAN , NULL1_WORLD , " KZ" $,
+ CTRY_KOREA_NORTH , APL9_WORLD , " KP" $,
+ CTRY_KOREA_ROC , APL9_WORLD , " KR" $,
+ CTRY_KOREA_ROC2 , APL2_WORLD , " K2" $,
+ CTRY_KOREA_ROC3 , APL9_WORLD , " K3" $,
+ CTRY_KUWAIT , ETSI3_WORLD , " KW" $,
+ CTRY_LATVIA , ETSI1_WORLD , " LV" $,
+ CTRY_LEBANON , NULL1_WORLD , " LB" $,
+ CTRY_LIECHTENSTEIN , ETSI1_WORLD , " LI" $,
+ CTRY_LITHUANIA , ETSI1_WORLD , " LT" $,
+ CTRY_LUXEMBOURG , ETSI1_WORLD , " LU" $,
+ CTRY_MACAU , FCC2_WORLD , " MO" $,
+ CTRY_MACEDONIA , NULL1_WORLD , " MK" $,
+ CTRY_MALAYSIA , APL8_WORLD , " MY" $,
+ CTRY_MALTA , ETSI1_WORLD , " MT" $,
+ CTRY_MEXICO , FCC1_FCCA , " MX" $,
+ CTRY_MONACO , ETSI4_WORLD , " MC" $,
+ CTRY_MOROCCO , APL4_WORLD , " MA" $,
+ CTRY_NEPAL , APL1_WORLD , " NP" $,
+ CTRY_NETHERLANDS , ETSI1_WORLD , " NL" $,
+ CTRY_NETHERLANDS_ANTILLES , ETSI1_WORLD , " AN" $,
+ CTRY_NEW_ZEALAND , FCC2_ETSIC , " NZ" $,
+ CTRY_NORWAY , ETSI1_WORLD , " NO" $,
+ CTRY_OMAN , FCC3_WORLD , " OM" $,
+ CTRY_PAKISTAN , NULL1_WORLD , " PK" $,
+ CTRY_PANAMA , FCC1_FCCA , " PA" $,
+ CTRY_PAPUA_NEW_GUINEA , FCC1_WORLD , " PG" $,
+ CTRY_PERU , APL1_WORLD , " PE" $,
+ CTRY_PHILIPPINES , APL1_WORLD , " PH" $,
+ CTRY_POLAND , ETSI1_WORLD , " PL" $,
+ CTRY_PORTUGAL , ETSI1_WORLD , " PT" $,
+ CTRY_PUERTO_RICO , FCC1_FCCA , " PR" $,
+ CTRY_QATAR , APL1_WORLD , " QA" $,
+ CTRY_ROMANIA , NULL1_WORLD , " RO" $,
+ CTRY_RUSSIA , NULL1_WORLD , " RU" $,
+ CTRY_SAUDI_ARABIA , NULL1_WORLD , " SA" $,
+ CTRY_SERBIA_MONTENEGRO , ETSI1_WORLD , " CS" $,
+ CTRY_SINGAPORE , APL6_WORLD , " SG" $,
+ CTRY_SLOVAKIA , ETSI1_WORLD , " SK" $,
+ CTRY_SLOVENIA , ETSI1_WORLD , " SI" $,
+ CTRY_SOUTH_AFRICA , FCC3_WORLD , " ZA" $,
+ CTRY_SPAIN , ETSI1_WORLD , " ES" $,
+ CTRY_SRI_LANKA , FCC3_WORLD , " LK" $,
+ CTRY_SWEDEN , ETSI1_WORLD , " SE" $,
+ CTRY_SWITZERLAND , ETSI1_WORLD , " CH" $,
+ CTRY_SYRIA , NULL1_WORLD , " SY" $,
+ CTRY_TAIWAN , APL3_FCCA , " TW" $,
+ CTRY_THAILAND , FCC3_WORLD , " TH" $,
+ CTRY_TRINIDAD_Y_TOBAGO , FCC3_WORLD , " TT" $,
+ CTRY_TUNISIA , ETSI3_WORLD , " TN" $,
+ CTRY_TURKEY , ETSI3_WORLD , " TR" $,
+ CTRY_UKRAINE , NULL1_WORLD , " UA" $,
+ CTRY_UAE , NULL1_WORLD , " AE" $,
+ CTRY_UNITED_KINGDOM , ETSI1_WORLD , " GB" $,
+ CTRY_UNITED_STATES , FCC3_FCCA , " US" $,
+
+ CTRY_UNITED_STATES_FCC49 , FCC4_FCCA , " PS" $,
+ CTRY_URUGUAY , FCC3_WORLD , " UY" $,
+ CTRY_UZBEKISTAN , FCC3_FCCA , " UZ" $,
+ CTRY_VENEZUELA , APL2_ETSIC , " VE" $,
+ CTRY_VIET_NAM , NULL1_WORLD , " VN" $,
+ CTRY_YEMEN , NULL1_WORLD , " YE" $,
+ CTRY_ZIMBABWE , NULL1_WORLD , " ZW" $,
+here swap - 2 /n* 2 + / constant #allCountries
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/eep9382.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/eep9382.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,194 @@
+purpose: Atheros 9382 "EEPROM" code
+\ See license at end of file
+
+headers
+hex
+
+create eeprom
+here
+ 02 c, 04 c, \ eepromVersion, templateVersion
+ 00 c, 03 c, 7f c, 00 c, 00 c, 00 c, \ macAddr
+ " h116-041-f0000" $, \ custData
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c,
+ \ baseEepHeader
+ 0000 w, 001f w, 33 c, 03 c, 00 c, 00 c, 00 c, 00 c, 05 c,
+ 00 c, 00 c, 00 c, 0d c, 00 c, 06 c, 00 c, 08 c, ff c, 10 c, 0 l,
+ \ modalHeader2G
+ 0000.0110 l, 0004.4444 l, \ antCtrlCommon, antCtrlCommon2
+ 0010 w, 0010 w, 0010 w, \ antCtrlChain
+ 1f c, 1f c, 1f c, \ xatten1DB
+ 12 c, 12 c, 12 c, \ xatten1Margin
+ 19 c, 00 c, \ tempSlope, voltSlope
+ a4 c, 00 c, 00 c, 00 c, 00 c, \ spurChans: FREQ2FBIN(2464, 1)
+ ff c, 00 c, 00 c, \ noiseFloorThreshCh
+ 01 c, 01 c, 01 c, \ ob
+ 01 c, 01 c, 01 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ db_stage2-4
+ 00 c, 0e c, 0e c, 03 c, 00 c, 2c c, e2 c, 00 c, 02 c, 0e c, 1c c,
+ 0c80.c080 l, 0080.c080 l, \ papdRateMaskHt20, 40
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c,
+ \ base_ext1
+ 00 c, 00 c,
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c,
+ \ calFreqPier2G
+ 70 c, 89 c, ac c, \ 2412, 2437, 2472
+ \ calPierData2G
+ 6 3 * 3 * here over allot swap erase
+ \ calTarget_freqbin_Cck
+ 70 c, ac c, \ 2412, 2472
+ \ calTarget_freqbin_2G
+ 70 c, 89 c, ac c, \ 2412, 2437, 2472
+ \ calTarget_freqbin_2GHT20
+ 70 c, 89 c, ac c, \ 2412, 2437, 2472
+ \ calTarget_freqbin_2GHT40
+ 70 c, 89 c, ac c, \ 2412, 2437, 2472
+ \ calTargetPowerCck
+decimal
+ 34 c, 34 c, 34 c, 34 c,
+ 34 c, 34 c, 34 c, 34 c,
+ \ calTargetPower2G
+ 34 c, 34 c, 32 c, 32 c,
+ 34 c, 34 c, 32 c, 32 c,
+ 34 c, 34 c, 32 c, 32 c,
+ \ calTargetPower2GHT20
+ 32 c, 32 c, 32 c, 32 c, 32 c, 30 c, 32 c, 32 c, 30 c, 28 c, 0 c, 0 c, 0 c, 0 c,
+ 32 c, 32 c, 32 c, 32 c, 32 c, 30 c, 32 c, 32 c, 30 c, 28 c, 0 c, 0 c, 0 c, 0 c,
+ 32 c, 32 c, 32 c, 32 c, 32 c, 30 c, 32 c, 32 c, 30 c, 28 c, 0 c, 0 c, 0 c, 0 c,
+ \ calTargetPower2GHT40
+ 30 c, 30 c, 30 c, 30 c, 30 c, 28 c, 30 c, 30 c, 28 c, 26 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 30 c, 30 c, 28 c, 30 c, 30 c, 28 c, 26 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 30 c, 30 c, 28 c, 30 c, 30 c, 28 c, 26 c, 0 c, 0 c, 0 c, 0 c,
+hex
+ \ ctlIndex_2G
+ 11 c, 12 c, 15 c, 17 c, 41 c, 42 c,
+ 45 c, 47 c, 31 c, 32 c, 35 c, 37 c,
+ \ ctlfreqbin_2G
+ 70 c, 75 c, 9d c, a2 c,
+ 70 c, 75 c, a2 c, ff c,
+ 70 c, 75 c, a2 c, ff c,
+ 7a c, 7f c, 93 c, 98 c,
+ 70 c, 75 c, ac c, b9 c,
+ 70 c, 75 c, ac c, 00 c,
+ 70 c, 75 c, ac c, 00 c,
+ 7a c, 7f c, 93 c, a2 c,
+ 70 c, 75 c, ac c, 00 c,
+ 70 c, 75 c, ac c, 00 c,
+ 70 c, 75 c, ac c, 00 c,
+ 7a c, 7f c, 93 c, a2 c,
+ \ ctlPowerData_2G
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 3c c, 3c c,
+ 7c c, 3c c, 3c c, 7c c,
+ 7c c, 3c c, 00 c, 00 c,
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 7c c, 3c c,
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 3c c, 3c c,
+ 3c c, 7c c, 7c c, 7c c,
+ 3c c, 7c c, 7c c, 7c c,
+ \ modalHeader5G
+ 0000.0220 l, 0004.4444 l, \ antCtrlCommon, antCtrlCommon2
+ 0150 w, 0150 w, 0150 w, \ antCtrlChain
+ 19 c, 19 c, 19 c, \ xatten1DB
+ 14 c, 14 c, 14 c, \ xatten1Margin
+ 46 c, 00 c, \ tempSlope, voltSlope
+ 00 c, 00 c, 00 c, 00 c, 00 c, \ spurChans: FREQ2FBIN(2464, 1)
+ ff c, 00 c, 00 c, \ noiseFloorThreshCh
+ 03 c, 03 c, 03 c, \ ob
+ 03 c, 03 c, 03 c, 03 c, 03 c, 03 c, 03 c, 03 c, 03 c, \ db_stage2-4
+ 00 c, 0e c, 0e c, 03 c, 00 c, 2d c, e2 c, 00 c, 02 c, 0e c, 1c c,
+ 0cf0.e0e0 l, 6cf0.e0e0 l, \ papdRateMaskHt20, 40
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c,
+ \ base_ext2
+ 23 c, 32 c,
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c,
+ \ calFreqPier5G
+ 4c c, 54 c, 68 c, 78 c, 8c c, a0 c, b4 c, c5 c, \ 5180, 5220, 5320, 5400, 5500, 5600, 5700, 5785
+ \ calPierData5G
+ 6 8 * 3 * here over allot swap erase
+ \ calTarget_freqbin_5G
+ 4c c, 58 c, 68 c, 78 c, 8c c, a0 c, b4 c, cd c, \ 5180, 5240, 5320, 5400, 5500, 5600, 5700, 5825
+ \ calTarget_freqbin_5GHT20
+ 4c c, 58 c, 68 c, 78 c, 8c c, b4 c, bd c, cd c, \ 5180, 5240, 5320, 5400, 5500, 5700, 5745, 5825
+ \ calTarget_freqbin_5GHT40
+ 4c c, 58 c, 68 c, 78 c, 8c c, b4 c, bd c, cd c, \ 5180, 5240, 5320, 5400, 5500, 5700, 5745, 5825
+ \ calTargetPower5G
+decimal
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ 30 c, 30 c, 28 c, 24 c,
+ \ calTargetPower5GHT20
+ 30 c, 30 c, 30 c, 28 c, 24 c, 20 c, 30 c, 28 c, 24 c, 20 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 28 c, 24 c, 20 c, 30 c, 28 c, 24 c, 20 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 26 c, 22 c, 18 c, 30 c, 26 c, 22 c, 18 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 26 c, 22 c, 18 c, 30 c, 26 c, 22 c, 18 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 24 c, 20 c, 16 c, 30 c, 24 c, 20 c, 16 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 24 c, 20 c, 16 c, 30 c, 24 c, 20 c, 16 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 22 c, 18 c, 14 c, 30 c, 22 c, 18 c, 14 c, 0 c, 0 c, 0 c, 0 c,
+ 30 c, 30 c, 30 c, 22 c, 18 c, 14 c, 30 c, 22 c, 18 c, 14 c, 0 c, 0 c, 0 c, 0 c,
+ \ calTargetPower5GHT40
+ 28 c, 28 c, 28 c, 26 c, 22 c, 18 c, 28 c, 26 c, 22 c, 18 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 26 c, 22 c, 18 c, 28 c, 26 c, 22 c, 18 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 24 c, 20 c, 16 c, 28 c, 24 c, 20 c, 16 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 24 c, 20 c, 16 c, 28 c, 24 c, 20 c, 16 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 22 c, 18 c, 14 c, 28 c, 22 c, 18 c, 14 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 22 c, 18 c, 14 c, 28 c, 22 c, 18 c, 14 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 20 c, 16 c, 12 c, 28 c, 20 c, 16 c, 12 c, 0 c, 0 c, 0 c, 0 c,
+ 28 c, 28 c, 28 c, 20 c, 16 c, 12 c, 28 c, 20 c, 16 c, 12 c, 0 c, 0 c, 0 c, 0 c,
+hex
+ \ ctlIndex_5G
+ 10 c, 16 c, 18 c, 40 c, 46 c, 48 c, 30 c, 36 c, 38 c,
+ \ ctlfreqbin_5G
+ 4c c, 5c c, 60 c, 8c c, a0 c, b4 c, bd c, cd c,
+ 4c c, 5c c, 60 c, 8c c, 90 c, b4 c, bd c, cd c,
+ 4e c, 56 c, 5e c, 66 c, 8e c, 96 c, ae c, bf c,
+ 4c c, 50 c, 5c c, 68 c, 8c c, b4 c, ff c, ff c,
+ 4c c, 5c c, 8c c, b4 c, ff c, ff c, ff c, ff c,
+ 4e c, 5e c, 66 c, 8e c, 9e c, ae c, ff c, ff c,
+ 4c c, 50 c, 54 c, 5c c, 8c c, a0 c, b4 c, bd c,
+ 4c c, 5c c, 68 c, 8c c, 98 c, b4 c, bd c, cd c,
+ 4e c, 56 c, 5e c, 8e c, 96 c, ae c, b4 c, c7 c,
+ \ ctlPowerData_5G
+ 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 3c c,
+ 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 3c c,
+ 3c c, 7c c, 3c c, 7c c, 7c c, 7c c, 7c c, 7c c,
+ 3c c, 7c c, 7c c, 3c c, 7c c, 3c c, 3c c, 3c c,
+ 7c c, 7c c, 7c c, 3c c, 3c c, 3c c, 3c c, 3c c,
+ 7c c, 7c c, 7c c, 7c c, 7c c, 3c c, 3c c, 3c c,
+ 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 7c c, 7c c,
+ 7c c, 7c c, 3c c, 7c c, 7c c, 7c c, 7c c, 3c c,
+ 7c c, 3c c, 7c c, 7c c, 7c c, 7c c, 3c c, 7c c,
+
+here swap - constant /eeprom-init
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/eepdump.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/eepdump.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,147 @@
+purpose: Atheros 9382 "EEPROM" dump
+\ See license at end of file
+
+headers
+hex
+
+: scdump ( adr len -- ) bounds ?do i sign-c@ s. loop ;
+: .tab ( -- ) ." " ;
+: .array ( adr x y -- ) 0 do .tab 2dup cdump cr loop 2drop ;
+: .warray ( adr x -- ) 0 do dup i wa+ le-w@ . .tab loop drop ;
+: .baseEepHeader ( adr -- )
+ dup >regDmn0 le-w@ ." regDmn0 = " . cr
+ dup >regDmn1 le-w@ ." regDmn1 = " . cr
+ dup >txrxMask c@ ." txrxMask = " . cr
+ dup >opFlags c@ ." opFlags = " . cr
+ dup >eepMisc c@ ." eepMisc = " . cr
+ dup >rfSilent c@ ." rfSilent = " . cr
+ dup >blueToothOptions c@ ." blueToothOptions = " . cr
+ dup >deviceCap c@ ." deviceCap = " . cr
+ dup >deviceType c@ ." deviceType = " . cr
+ dup >pwrTableOffset sign-c@ ." pwrTableOffset = " s. cr
+ dup >params_for_tuning_caps c@ ." params_for_tuning_caps = " . cr
+ dup >featureEnable c@ ." featureEnable = " . cr
+ dup >miscConfiguration c@ ." miscConfiguration = " . cr
+ dup >eepromWriteEnableGpio c@ ." eepromWriteEnableGpio = " . cr
+ dup >wlanDisableGpio c@ ." wlanDisableGpio = " . cr
+ dup >rxBandSelectGpio c@ ." rxBandSelectGpio = " . cr
+ dup >txrxgain c@ ." txrxgain = " . cr
+ >swreg le-l@ ." swreg = " . cr
+;
+: .modalHeader ( adr -- )
+ dup >antCtrlCommon le-l@ ." antCtrlCommon = " . cr
+ dup >antCtrlCommon2 le-l@ ." antCtrlCommon2 = " . cr
+ dup >antCtrlChain ." antCtrlChain = " 3 .warray cr
+ dup >xatten1DB ." xatten1DB = " 3 cdump cr
+ dup >xatten1Margin ." xatten1Margin = " 3 cdump cr
+ dup >tempSlope sign-c@ ." tempSlope = " s. cr
+ dup >voltSlope sign-c@ ." voltSlope = " s. cr
+ dup >spurChans ." spurChans = " 5 cdump cr
+ dup >noiseFloorThreshCh ." noiseFloorThreshCh = " 3 scdump cr
+ dup >ob ." ob = " 3 cdump cr
+ dup >db_stage2 ." db_stage2 = " 3 cdump cr
+ dup >db_stage3 ." db_stage3 = " 3 cdump cr
+ dup >db_stage4 ." db_stage4 = " 3 cdump cr
+ dup >xpaBiasLvl c@ ." xpaBiasLvl = " . cr
+ dup >txFrameToDataStart c@ ." txFrameToDataStart = " . cr
+ dup >txFrameToPaOn c@ ." txFrameToPaOn = " . cr
+ dup >txClip c@ ." txClip = " . cr
+ dup >antennaGain sign-c@ ." antennaGain = " s. cr
+ dup >switchSettling c@ ." switchSettling = " . cr
+ dup >adcDesiredSize sign-c@ ." adcDesiredSize = " s. cr
+ dup >txEndToXpaOff c@ ." txEndToXpaOff = " . cr
+ dup >txEndToRxOn c@ ." txEndToRxOn = " . cr
+ dup >txFrameToXpaOn c@ ." txFrameToXpaOn = " . cr
+ dup >thresh62 c@ ." thresh62 = " . cr
+ dup >papdRateMaskHt20 le-l@ ." papdRateMaskHt20 = " . cr
+ >papdRateMaskHt40 le-l@ ." papdRateMaskHt40 = " . cr
+;
+: .base_ext2 ( adr -- )
+ dup >tempSlopeLow sign-c@ ." tempSlopeLow = " s. cr
+ dup >tempSlopeHigh sign-c@ ." tempSlopeHigh = " s. cr
+ dup >xatten1DBLow ." xatten1DBLow = " 3 cdump cr
+ dup >xatten1MarginLow ." xatten1MarginLow = " 3 cdump cr
+ dup >xatten1DBHigh ." xatten1DBHigh = " 3 cdump cr
+ >xatten1MarginHigh ." xatten1MarginHigh = " 3 cdump cr
+;
+: .tabx ( -- ) ." " ;
+: .calPierData ( adr #piers #chains -- )
+ ." chain# pier# refPwr voltM tempM rxNFC rxNFP rxTempM" cr
+ 0 do ( adr #piers )
+ dup 0 do ( adr #piers )
+ .tabx j . .tabx i . .tabx
+ 2dup j * i + /cal-data-per-freq-op-loop * + ( adr #piers adr )
+ dup >refPower sign-c@ s. .tabx
+ dup >voltMeas c@ . .tabx
+ dup >tempMeas c@ . .tabx
+ dup >rxNoisefloorCal sign-c@ s. .tabx
+ dup >rxNoisefloorPower sign-c@ s. .tabx
+ >rxTempMeas c@ . cr
+ loop
+ loop 2drop
+;
+
+: .eeprom ( -- )
+ eeprom >r
+ r@ >eepromVersion c@ ." EEPROM version = " . cr
+ r@ >templateVersion c@ ." Template version = " . cr
+ r@ >macAddr ." MAC address = " 6 cdump cr
+ r@ >custData ." Customer data = " d# 20 cdump cr
+ r@ >baseEepHeader ." Base EEPROM Header:" cr .baseEepHeader cr
+
+ r@ >modalHeader2G ." 2GHz Modal Header:" cr .modalHeader cr
+ r@ >base_ext1 ." base_ext1 = " d# 14 cdump cr
+ r@ >calFreqPier2G ." calFreqPier2G = " 3 cdump cr
+ r@ >calPierData2G ." calPierData2G:" cr 3 3 .calPierData
+ r@ >calTarget_freqbin_Cck ." calTarget_freqbin_Cck = " 2 cdump cr
+ r@ >calTarget_freqbin_2G ." calTarget_freqbin_2G = " 3 cdump cr
+ r@ >calTarget_freqbin_2GHT20 ." calTarget_freqbin_2GHT20 = " 3 cdump cr
+ r@ >calTarget_freqbin_2GHT40 ." calTarget_freqbin_2GHT40 = " 3 cdump cr
+ r@ >calTargetPowerCck ." calTargetPowerCck.tPow2x:" cr 4 2 .array
+ r@ >calTargetPower2G ." calTargetPower2G.tPow2x:" cr 4 3 .array
+ r@ >calTargetPower2GHT20 ." calTargetPower2GHT20.tPow2x:" cr d# 14 3 .array
+ r@ >calTargetPower2GHT40 ." calTargetPower2GHT40.tPow2x:" cr d# 14 3 .array
+ r@ >ctlIndex_2G ." ctlIndex_2G = " d# 12 cdump cr
+ r@ >ctl_freqbin_2G ." ctl_freqbin_2G:" cr d# 12 4 .array
+ r@ >ctlPowerData_2G ." ctlPowerData_2G:" cr d# 12 4 .array
+
+ r@ >modalHeader5G ." 5GHz Modal Header:" cr .modalHeader cr
+ r@ >base_ext2 ." base_ext2:" cr .base_ext2
+ r@ >calFreqPier5G ." calFreqPier5G = " 8 cdump cr
+ r@ >calPierData5G ." calPierData5G:" cr 8 3 .calPierData
+ r@ >calTarget_freqbin_5G ." calTarget_freqbin_5G = " 8 cdump cr
+ r@ >calTarget_freqbin_5GHT20 ." calTarget_freqbin_5GHT20 = " 8 cdump cr
+ r@ >calTarget_freqbin_5GHT40 ." calTarget_freqbin_5GHT40 = " 8 cdump cr
+ r@ >calTargetPower5GHT20 ." calTargetPower5GHT20.tPow2x:" cr d# 14 8 .array
+ r@ >calTargetPower5GHT40 ." calTargetPower5GHT40.tPow2x:" cr d# 14 8 .array
+ r@ >ctlIndex_5G ." ctlIndex_5G = " 9 cdump cr
+ r@ >ctl_freqbin_5G ." ctl_freqbin_5G:" cr 9 8 .array
+ r@ >ctlPowerData_5G ." ctlPowerData_5G:" cr 9 8 .array
+
+ r> drop
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/eeprom.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/eeprom.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,349 @@
+purpose: ATH9K EEPROM and OTP manipulation
+\ See license at end of file
+
+headers
+hex
+
+\ Eeprom data structure definition
+struct
+ 2 field >regDmn0
+ 2 field >regDmn1
+ 1 field >txrxMask
+ 1 field >opFlags
+ 1 field >eepMisc
+ 1 field >rfSilent
+ 1 field >blueToothOptions
+ 1 field >deviceCap
+ 1 field >deviceType
+ 1 field >pwrTableOffset \ Signed
+ 2 field >params_for_tuning_caps
+ 1 field >featureEnable
+ 1 field >miscConfiguration
+ 1 field >eepromWriteEnableGpio
+ 1 field >wlanDisableGpio
+ 1 field >wlanLedGpio
+ 1 field >rxBandSelectGpio
+ 1 field >txrxgain
+ 4 field >swreg
+constant /baseEepHeader
+
+struct
+ 4 field >antCtrlCommon
+ 4 field >antCtrlCommon2
+ 3 /w* field >antCtrlChain
+ 3 field >xatten1DB
+ 3 field >xatten1Margin
+ 1 field >tempSlope \ Signed
+ 1 field >voltSlope \ Signed
+ 5 field >spurChans
+ 3 field >noiseFloorThreshCh \ Signed
+ 3 field >ob
+ 3 field >db_stage2
+ 3 field >db_stage3
+ 3 field >db_stage4
+ 1 field >xpaBiasLvl
+ 1 field >txFrameToDataStart
+ 1 field >txFrameToPaOn
+ 1 field >txClip
+ 1 field >antennaGain \ Signed
+ 1 field >switchSettling
+ 1 field >adcDesiredSize \ Signed
+ 1 field >txEndToXpaOff
+ 1 field >txEndToRxOn
+ 1 field >txFrameToXpaOn
+ 1 field >thresh62
+ 4 field >papdRateMaskHt20
+ 4 field >papdRateMaskHt40
+ d# 10 +
+constant /modalHeader
+
+struct
+ 1 field >ant_div_control
+ d# 13 +
+constant /base_ext1
+
+struct
+ 1 field >tempSlopeLow \ signed
+ 1 field >tempSlopeHigh \ signed
+ 3 field >xatten1DBLow
+ 3 field >xatten1MarginLow
+ 3 field >xatten1DBHigh
+ 3 field >xatten1MarginHigh
+constant /base_ext2
+
+struct
+ 1 field >refPower \ signed
+ 1 field >voltMeas
+ 1 field >tempMeas
+ 1 field >rxNoisefloorCal \ signed
+ 1 field >rxNoisefloorPower \ signed
+ 1 field >rxTempMeas
+constant /cal-data-per-freq-op-loop
+
+struct
+ 1 field >eepromVersion
+ 1 field >templateVersion
+ 6 field >macAddr
+ d# 20 field >custData
+ /baseEepHeader field >baseEepHeader
+ /modalHeader field >modalHeader2G
+ /base_ext1 field >base_ext1
+ 3 field >calFreqPier2G
+ 6 3 * 3 * field >calPierData2G
+ 2 field >calTarget_freqbin_Cck
+ 3 field >calTarget_freqbin_2G
+ 3 field >calTarget_freqbin_2GHT20
+ 3 field >calTarget_freqbin_2GHT40
+ 4 2 * field >calTargetPowerCck
+ 4 3 * field >calTargetPower2G
+ d# 14 3 * field >calTargetPower2GHT20
+ d# 14 3 * field >calTargetPower2GHT40
+ d# 12 field >ctlIndex_2G
+ d# 12 4 * field >ctl_freqbin_2G
+ d# 12 4 * field >ctlPowerData_2G
+ /modalHeader field >modalHeader5G
+ /base_ext2 field >base_ext2
+ 8 field >calFreqPier5G
+ 6 8 * 3 * field >calPierData5G
+ 8 field >calTarget_freqbin_5G
+ 8 field >calTarget_freqbin_5GHT20
+ 8 field >calTarget_freqbin_5GHT40
+ 4 8 * field >calTargetPower5G
+ d# 14 8 * field >calTargetPower5GHT20
+ d# 14 8 * field >calTargetPower5GHT40
+ 9 field >ctlIndex_5G
+ 9 8 * field >ctl_freqbin_5G
+ 9 8 * field >ctlPowerData_5G
+constant /eeprom
+/eeprom-init /eeprom <> if ." eeprom data structure is inconsistent" cr then
+
+\ Words to facilitate signed-byte eeprom data accesses
+: sign-c ( b -- n ) d# 24 << d# 24 >>a ;
+: sign-c@ ( adr -- n ) c@ sign-c ;
+
+: baseEepHeader ( -- adr ) eeprom >baseEepHeader ;
+: base_ext2 ( -- adr ) eeprom >base_ext2 ;
+: pwrTableOffset@ ( -- n ) baseEepHeader >pwrTableOffset sign-c@ ;
+: tempSlopeLow@ ( -- n ) base_ext2 >tempSlopeLow sign-c@ ;
+: tempSlopeHigh@ ( -- n ) base_ext2 >tempSlopeHigh sign-c@ ;
+
+\ ModalHeader based data:
+: tempSlope@ ( adr -- n ) >tempSlope sign-c@ ;
+: voltSlope@ ( adr -- n ) >voltSlope sign-c@ ;
+: noiseFloorThreshCh@ ( adr -- n ) >noiseFloorThreshCh sign-c@ ;
+: antennaGain@ ( adr -- n ) >antennaGain sign-c@ ;
+: adcDesiredSize@ ( adr -- n ) >adcDesiredSize sign-c@ ;
+
+: modalHeader2G ( -- adr ) eeprom >modalHeader2G ;
+: tempSlope2G@ ( adr -- n ) modalHeader2G tempSlope@ ;
+: voltSlope2G@ ( adr -- n ) modalHeader2G voltSlope@ ;
+: noiseFloorThreshCh2G@ ( adr -- n ) modalHeader2G noiseFloorThreshCh@ ;
+: antennaGain2G@ ( adr -- n ) modalHeader2G antennaGain@ ;
+: adcDesiredSize2G@ ( adr -- n ) modalHeader2G adcDesiredSize@ ;
+
+: modalHeader5G ( -- adr ) eeprom >modalHeader5G ;
+: tempSlope5G@ ( adr -- n ) modalHeader5G tempSlope@ ;
+: voltSlope5G@ ( adr -- n ) modalHeader5G voltSlope@ ;
+: noiseFloorThreshCh5G@ ( adr -- n ) modalHeader5G noiseFloorThreshCh@ ;
+: antennaGain5G@ ( adr -- n ) modalHeader5G antennaGain@ ;
+: adcDesiredSize5G@ ( adr -- n ) modalHeader5G adcDesiredSize@ ;
+
+\ calPierData based data accesses:
+: calPierData2G ( pier chain -- adr )
+ 3 * + /cal-data-per-freq-op-loop * eeprom >calPierData2G +
+;
+: refPower2G@ ( pier chain -- n ) calPierData2G >refPower sign-c@ ;
+: voltMeas2G@ ( pier chain -- n ) calPierData2G >voltMeas c@ ;
+: tempMeas2G@ ( pier chain -- n ) calPierData2G >tempMeas c@ ;
+: rxTempMeas2G@ ( pier chain -- n ) calPierData2G >rxtempMeas c@ ;
+: rxNoisefloorCal2G@ ( pier chain -- n ) calPierData2G >rxNoisefloorCal sign-c@ ;
+: rxNoisefloorPower2G@ ( pier chain -- n ) calPierData2G >rxNoisefloorPower sign-c@ ;
+
+: calPierData5G ( pier chain -- adr )
+ 8 * + /cal-data-per-freq-op-loop * eeprom >calPierData5G +
+;
+: refPower5G@ ( pier chain -- n ) calPierData5G >refPower sign-c@ ;
+: voltMeas5G@ ( pier chain -- n ) calPierData5G >voltMeas c@ ;
+: tempMeas5G@ ( pier chain -- n ) calPierData5G >tempMeas c@ ;
+: rxtempMeas5G@ ( pier chain -- n ) calPierData5G >rxtempMeas c@ ;
+: rxNoisefloorCal5G@ ( pier chain -- n ) calPierData5G >rxNoisefloorCal sign-c@ ;
+: rxNoisefloorPower5G@ ( pier chain -- n ) calPierData5G >rxNoisefloorPower sign-c@ ;
+
+\ calTargetPower based data accesses
+: calTargetPowerCck@ ( idx pier -- n ) 4 * + eeprom >calTargetPowerCck + c@ ;
+: calTargetPower2G@ ( idx pier -- n ) 4 * + eeprom >calTargetPower2G + c@ ;
+: calTargetPower2GHT20@ ( idx pier -- n ) d# 14 * + eeprom >calTargetPower2GHT20 + c@ ;
+: calTargetPower2GHT40@ ( idx pier -- n ) d# 14 * + eeprom >calTargetPower2GHT40 + c@ ;
+
+: calTargetPower5G@ ( idx pier -- n ) 4 * + eeprom >calTargetPower5G + c@ ;
+: calTargetPower5GHT20@ ( idx pier -- n ) d# 14 * + eeprom >calTargetPower5GHT40 + c@ ;
+: calTargetPower5GHT40@ ( idx pier -- n ) d# 14 * + eeprom >calTargetPower5GHT40 + c@ ;
+
+\ ctl based data accesses
+: ctl_freqbin_2G@ ( ctl edge -- n ) d# 12 * + eeprom >ctl_freqbin_2G + c@ ;
+: ctlPowerData_2G@ ( ctl edge -- n ) d# 12 * + eeprom >ctlPowerData_2G + c@ ;
+
+: ctl_freqbin_5G@ ( ctl edge -- n ) 9 * + eeprom >ctl_freqbin_5G + c@ ;
+: ctlPowerData_5G@ ( ctl edge -- n ) 9 * + eeprom >ctlPowerData_5G + c@ ;
+
+\ Words to modify the eeprom data structure based on OTP/EEPROM content
+0 value epptr
+0 value edptr
+0 value edend
+: epptr+ ( n -- ) epptr + to epptr ;
+: edptr+ ( n -- ) 2 + edptr + to edptr ;
+: (process-edata) ( adr len -- )
+ over + to edend to edptr
+ eeprom to epptr
+ begin edptr edend < while
+ edptr c@ epptr+
+ edptr 1+ c@ edptr 2 + epptr 2 pick move
+ dup epptr+ edptr+
+ repeat
+;
+
+: wait-hw ( val mask reg -- ok? )
+ d# 1.0000 0 do
+ 3dup reg@ and = ?leave
+ d# 10 us
+ loop
+ reg@ and =
+;
+
+: fbin2freq ( freq is2GHz? -- freq' )
+ over ff = if drop exit then
+ if d# 2300 + else 5 * d# 4800 + then
+;
+: fbin2freq2G ( freq -- freq' ) true fbin2freq ;
+: fbin2freq5G ( freq -- freq' ) false fbin2freq ;
+
+: interpolate ( x xa xb ya yb -- y )
+ over >r
+ \ y = (yb - ya) * (x - xa) / (xb - xa) + ya
+ swap - 2* >r over - -rot - r> * swap /
+ 2 /mod r> + +
+;
+
+: eeprom@ ( idx -- data ) \ On 32-bit boundary, read 32 bits
+ fffc and 2000 + reg@ drop
+ 0 5.0000 4084 wait-hw drop \ Wait till data is valid
+ 4084 reg@ ffff and
+;
+: eeprom-b@ ( idx -- b ) dup eeprom@ swap 3 and 8 * >> ff and ;
+
+\ One time programmable memory read
+: otp@ ( idx -- data ) \ On 32-bit boundary, read 32 bits
+ fffc and 1.4000 + reg@ drop
+ 4 7 1.5f18 wait-hw drop \ Wait till data is valid
+ 1.5f1c reg@
+;
+: otp-b@ ( idx -- b ) dup otp@ swap 3 and 8 * >> ff and ;
+
+: hdr>len ( header -- len ) lbflip dup 4 >> 7f0 and swap d# 20 >> f and or ;
+: .hdr ( header -- )
+ dup ." Header = " u. cr
+ lbflip
+ dup 5 >> 7 and ." Code = " u. cr
+ dup 1f and over d# 10 >> 20 and or ." Reference = " u. cr
+ dup 4 >> 7f0 and over d# 20 >> f and or ." Length = " u. cr
+ dup d# 16 >> f and ." Major = " u. cr
+ d# 24 >> ff and ." Minor = " u. cr
+;
+
+\ To decipher the content of EEPROM or OTP
+\ 0. format: 4-byte hdr, data, 2-byte chksum (read backwards)
+\ 1. see if 3fc eeprom@ is a valid hdr (not 0's and ff's)
+\ 2. if not, see if 1fc eeprom@ is a valid hdr else goto step 6
+\ 3. if not, see if 3fc otp@ is a valid hdr else goto step 6
+\ 4. if not, see if 1fc otp@ is a valid hdr else goto step 7
+\ 5. if not, bad else goto step 7
+\ 6. use eeprom@, goto step 8
+\ 7. use otp@, goto step 8
+\ 8. from current idx down upto 100 times
+\ decipher hdr
+\ if len>=1024, idx--
+\ else verify checksum (sum of all data bytes)
+\ if checksum bad, idx-=len+4+2
+\ 9. save good content in eeprom
+
+\ OTP data block format, entries of:
+\ data-offset data-len data
+\ They correspond to C struct ar9300_eeprom.
+\ The AR9382 in Alex correspond to ar9300_h116.
+\ So far, the interesting one is the first entry, which is the mac address.
+
+false value edata-found?
+defer read-op
+defer read-bop
+0 value ehdr
+0 value eptr
+0 value elen
+d# 1024 buffer: edata
+
+: check-hdr ( -- ok? ) eptr read-op dup 0<> swap -1 <> and ;
+: (read-edata) ( len -- ok? )
+ 0 swap ( chksum len )
+ dup to elen 0 do ( chksum )
+ eptr i - read-bop dup edata i + c! + ( chksum' )
+ loop ffff and ( chksum' )
+ eptr elen - dup read-bop swap 1- read-bop ( chksum cs.lo cs.hi )
+ bwjoin = dup to edata-found?
+;
+: read-edata ( -- )
+ d# 100 0 do
+ eptr read-op dup to ehdr hdr>len ( elen )
+ eptr 4 - to eptr
+ dup d# 1024 >= if drop else (read-edata) ?leave then
+ loop
+;
+: process-edata ( -- )
+ edata elen (process-edata)
+ edata 2 + mac-adr /mac-adr move
+;
+
+: (init-edata) ( -- ) \ ath9k_hw_eeprom_init
+ false to edata-found?
+ 3ff to eptr ['] eeprom-b@ to read-bop ['] eeprom@ to read-op
+ check-hdr if read-edata exit then
+ 1ff to eptr
+ check-hdr if read-edata exit then
+ 3ff to eptr ['] otp-b@ to read-bop ['] otp@ to read-op
+ check-hdr if read-edata exit then
+ 1ff to eptr
+ check-hdr if read-edata then
+;
+: init-edata ( -- )
+ (init-edata)
+ edata-found? if
+ process-edata
+ else
+ ." WARNING: did not found data in OTP" cr
+ then
+;
+
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/global.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/global.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,447 @@
+purpose: ATH9K global variables
+\ See license at end of file
+
+headers
+hex
+
+\ Global variables
+0 value macVersion
+0 value macRev
+0 value phyRev
+
+0 value WARegVal \ AR_WA register value
+1000.0004 value misc-mode \ AR_PCU_MISC register value
+0 value ent-mode \ Value of reg 40d8, enterprise mode
+
+\ opmode values
+1 constant IFTYPE_ADHOC
+2 constant IFTYPE_STATION
+3 constant IFTYPE_AP
+6 constant IFTYPE_MONITOR
+7 constant IFTYPE_MESH_POINT
+
+IFTYPE_STATION value opmode
+: ap-mode? ( -- AP? ) opmode IFTYPE_AP = ;
+
+\ (d# 3840 + 4 + (3 + 1 + 4)) / 2 + /rx-stat
+d# 1926 d# 12 + value rx-bufsize
+
+\ ieee80211_rate
+struct
+ /n field >br-bitrate
+ /n field >br-hw-val
+ /n field >br-hw-val-short
+ /n field >br-flags
+constant /rates
+
+\ >br-flags bit definitions
+01 constant br-spream
+02 constant br-mand-a
+04 constant br-mand-b
+08 constant br-mand-g
+10 constant br-erp-g
+
+create legacy-rates
+here
+ d# 10 , 1b , 0 , 0c , \ CCK 1MB
+ d# 20 , 1a , 1e , 09 , \ CCK 2MB
+ d# 55 , 19 , 1d , 09 , \ CCK 5.5MB
+ d# 110 , 18 , 1c , 09 , \ CCK 11MB
+ d# 60 , 0b , 0 , 19 , \ OFDM 6MB
+ d# 90 , 0f , 0 , 10 , \ OFDM 9MB
+ d# 120 , 0a , 0 , 1b , \ OFDM 12MB
+ d# 180 , 0e , 0 , 10 , \ OFDM 18MB
+ d# 240 , 09 , 0 , 1b , \ OFDM 24MB
+ d# 360 , 0d , 0 , 10 , \ OFDM 36MB
+ d# 480 , 08 , 0 , 10 , \ OFDM 48MB
+ d# 540 , 0c , 0 , 10 , \ OFDM 54MB
+here swap - /rates / constant #legacy-rates
+
+: 'legacy-rates ( i -- adr ) /rates * legacy-rates + ;
+
+\ ieee80211_supported_band
+struct
+ /n field >band-type \ Band type
+ /n field >band-channel \ Pointer to array of channels structures
+ /n field >band-bitrates \ Pointer to array of bitrates structures
+ /n field >band-#chan
+ /n field >band-#rate
+ /n field >band-ht-cap
+ /n field >band-ht?
+ /n field >band-ampdu-factor
+ /n field >band-ampdu-density
+ /n field >band-tx-params
+ /n field >band-rx-highest
+ 10 field >band-rx-mask
+constant /band
+
+\ >band-type values
+0 constant BAND_2GHZ
+1 constant BAND_5GHZ
+
+/band buffer: band-2GHz
+/band buffer: band-5GHz
+create sband band-2GHz , band-5GHz ,
+
+\ >band-ht-cap definitions
+0001 constant HT_CAP_LDPC_CODING
+0002 constant HT_CAP_SUP_WIDTH_20_40
+000c constant HT_CAP_SM_PS
+0010 constant HT_CAP_GRN_FLD
+0020 constant HT_CAP_SGI_20
+0040 constant HT_CAP_SGI_40
+0080 constant HT_CAP_TX_STBC
+0300 constant HT_CAP_RX_STBC
+0400 constant HT_CAP_DELAY_BA
+0800 constant HT_CAP_MAX_AMSDU
+1000 constant HT_CAP_DSSSCCK40
+2000 constant HT_CAP_RESERVED
+4000 constant HT_CAP_40MHZ_INTOLERANT
+8000 constant HT_CAP_LSIG_TXOP_PROT
+
+\ >band-ampdu-factor values
+0 constant HT_MAX_AMPDU_8K
+1 constant HT_MAX_AMPDU_16K
+2 constant HT_MAX_AMPDU_32K
+3 constant HT_MAX_AMPDU_64K
+d# 13 constant HT_MAX_AMPDU_FACTOR
+
+\ >band-ampdu-density values
+0 constant HT_MPDU_DENSITY_NONE \ No restriction
+1 constant HT_MPDU_DENSITY_0_25 \ 1/4 usec
+2 constant HT_MPDU_DENSITY_0_5 \ 1/2 usec
+3 constant HT_MPDU_DENSITY_1 \ 1 usec
+4 constant HT_MPDU_DENSITY_2 \ 2 usec
+5 constant HT_MPDU_DENSITY_4 \ 4 usec
+6 constant HT_MPDU_DENSITY_8 \ 8 usec
+7 constant HT_MPDU_DENSITY_16 \ 16 usec
+
+\ >band-tx-params value
+01 constant HT_MCS_TX_DEFINED
+02 constant HT_MCS_TX_RX_DIFF
+10 constant HT_MCS_TX_UNEQUAL_MODULATION
+
+\ channel structure include the ieee fields
+struct
+ \ ieee80211_channel
+ /n field >ch-band \ >band-type
+ /n field >ch-freq
+ /n field >ch-hw-val \ Index to channels
+ /n field >ch-max-power
+ /n field >ch-flags
+ /n field >ch-max-antenna-gain
+ /n field >ch-beacon?
+
+ \ ath9k_channel
+ /n field >ch-mode
+ /n field >ch-noiseFloor
+
+ \ ANI variables
+ /n field >ani-listenTime
+ /n field >ani-ofdmPhyErrCnt
+ /n field >ani-cckPhyErrCnt
+ /n field >ani-ofdmNoiseImmunityLevel
+ /n field >ani-cckNoiseImmunityLevel
+ /n field >ani-spurImmunityLevel
+ /n field >ani-firstepLevel
+ /n field >ani-noiseFloor
+ /n field >ani-rssiThrHigh
+ /n field >ani-rssiThrLow
+ /n field >ani-ofdmWeakSigDetectOff
+ /n field >ani-mrcCCKOff
+ /n field >ani-ofdmsTurn
+
+ \ Cached ANI register values
+ /n field >ani-ini-sfcorr
+ /n field >ani-ini-sfcorr-low
+ /n field >ani-ini-sfcorr-ext
+ /n field >ani-ini-firstep
+ /n field >ani-ini-firstepLow
+ /n field >ani-ini-cycpwrThr1
+ /n field >ani-ini-cycpwrThr1Ext
+constant /channel
+
+: 'band-ch ( bandadr i -- adr ) /channel * swap >band-channel @ + ;
+
+decimal
+: ch-allot ( -- ) here /channel 4 /n* - dup allot erase ;
+create channels
+here
+ 0 , 2412 , 0 , 20 , ch-allot \ ch 1
+ 0 , 2417 , 1 , 20 , ch-allot \ ch 2
+ 0 , 2422 , 2 , 20 , ch-allot \ ch 3
+ 0 , 2427 , 3 , 20 , ch-allot \ ch 4
+ 0 , 2432 , 4 , 20 , ch-allot \ ch 5
+ 0 , 2437 , 5 , 20 , ch-allot \ ch 6
+ 0 , 2442 , 6 , 20 , ch-allot \ ch 7
+ 0 , 2447 , 7 , 20 , ch-allot \ ch 8
+ 0 , 2452 , 8 , 20 , ch-allot \ ch 9
+ 0 , 2457 , 9 , 20 , ch-allot \ ch 10
+ 0 , 2462 , 10 , 20 , ch-allot \ ch 11
+ 0 , 2467 , 11 , 20 , ch-allot \ ch 12
+ 0 , 2472 , 12 , 20 , ch-allot \ ch 13
+ 0 , 2484 , 13 , 20 , ch-allot \ ch 14
+here swap - /channel / ( constant #ch-2GHz )
+
+here
+ \ UNIT 1
+ 1 , 5180 , 14 , 20 , ch-allot \ ch 36
+ 1 , 5200 , 15 , 20 , ch-allot \ ch 40
+ 1 , 5220 , 16 , 20 , ch-allot \ ch 44
+ 1 , 5240 , 17 , 20 , ch-allot \ ch 48
+ \ UNIT 2
+ 1 , 5260 , 18 , 20 , ch-allot \ ch 52
+ 1 , 5280 , 19 , 20 , ch-allot \ ch 56
+ 1 , 5300 , 20 , 20 , ch-allot \ ch 60
+ 1 , 5320 , 21 , 20 , ch-allot \ ch 64
+ \ Middle band
+ 1 , 5500 , 22 , 20 , ch-allot \ ch 100
+ 1 , 5520 , 23 , 20 , ch-allot \ ch 104
+ 1 , 5540 , 24 , 20 , ch-allot \ ch 108
+ 1 , 5560 , 25 , 20 , ch-allot \ ch 112
+ 1 , 5580 , 26 , 20 , ch-allot \ ch 116
+ 1 , 5600 , 27 , 20 , ch-allot \ ch 120
+ 1 , 5620 , 28 , 20 , ch-allot \ ch 124
+ 1 , 5640 , 29 , 20 , ch-allot \ ch 128
+ 1 , 5660 , 30 , 20 , ch-allot \ ch 132
+ 1 , 5680 , 31 , 20 , ch-allot \ ch 136
+ 1 , 5700 , 32 , 20 , ch-allot \ ch 140
+ \ UNIT 3
+ 1 , 5745 , 33 , 20 , ch-allot \ ch 149
+ 1 , 5765 , 34 , 20 , ch-allot \ ch 153
+ 1 , 5785 , 35 , 20 , ch-allot \ ch 157
+ 1 , 5805 , 36 , 20 , ch-allot \ ch 161
+ 1 , 5825 , 37 , 20 , ch-allot \ ch 165
+here swap - /channel / constant #ch-5GHz constant #ch-2GHz
+
+#ch-5GHz #ch-2GHz + constant #channels
+
+channels value ch-2GHz
+channels #ch-2GHz /channel * + value ch-5GHz
+
+0 value defch \ 0 based index into channels
+: 'channel ( ch -- adr ) /channel * channels + ;
+
+create channel# 1 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 8 c,
+ 9 c, 10 c, 11 c, 12 c, 13 c, 14 c,
+ 36 c, 40 c, 44 c, 48 c,
+ 52 c, 56 c, 60 c, 64 c,
+ 100 c, 104 c, 108 c, 112 c, 116 c, 120 c,
+ 124 c, 128 c, 132 c, 136 c, 140 c,
+ 149 c, 153 c, 157 c, 161 c, 165 c,
+: idx>ch ( idx -- ch# ) channel# + c@ ;
+
+hex
+\ >ch-mode and >ch-flags bit definitions
+0000.0002 constant CH_CW_INT
+0000.0020 constant CH_CCK
+0000.0040 constant CH_OFDM
+0000.0080 constant CH_2GHZ
+0000.0100 constant CH_5GHZ
+0000.0200 constant CH_PASSIVE
+0000.0400 constant CH_DYN
+0000.4000 constant CH_HALF
+0000.8000 constant CH_QUARTER
+0001.0000 constant CH_HT20
+0002.0000 constant CH_HT40+
+0004.0000 constant CH_HT40-
+
+CH_5GHZ CH_OFDM or constant CH_A
+CH_2GHZ CH_CCK or constant CH_B
+CH_2GHZ CH_OFDM or constant CH_G
+CH_2GHZ CH_HT20 or constant CH_G_HT20
+CH_5GHZ CH_HT20 or constant CH_A_HT20
+CH_2GHZ CH_HT40+ or constant CH_G_HT40+
+CH_2GHZ CH_HT40- or constant CH_G_HT40-
+CH_5GHZ CH_HT40+ or constant CH_A_HT40+
+CH_5GHZ CH_HT40- or constant CH_A_HT40-
+CH_OFDM CH_CCK or CH_2GHZ or CH_5GHZ or CH_HT20 or CH_HT40+ or CH_HT40- or constant CH_ALL
+
+: is-g? ( ch -- flag )
+ >ch-flags @ dup CH_G and CH_G =
+ over CH_G_HT20 and CH_G_HT20 = or
+ over CH_G_HT40+ and CH_G_HT40+ = or
+ swap CH_G_HT40- and CH_G_HT40- = or
+;
+: is-ofdm? ( ch -- flag ) >ch-flags @ CH_OFDM and ;
+: is-5GHz? ( ch -- flag ) >ch-flags @ CH_5GHZ and ;
+: is-2GHz? ( ch -- flag ) >ch-flags @ CH_2GHZ and ;
+: is-half-rate? ( ch -- flag ) >ch-flags @ CH_HALF and ;
+: is-quarter-rate? ( ch -- flag ) >ch-flags @ CH_QUARTER and ;
+: is-a-fast? ( ch -- flag ) >ch-flags @ CH_5GHZ and ;
+: is-b? ( ch -- flag ) >ch-mode @ CH_B = ;
+: is-ht20? ( ch -- flag ) >ch-mode @ CH_HT20 and ;
+: is-ht40? ( ch -- flag ) >ch-mode @ CH_HT40+ CH_HT40- or and ;
+: is-ht? ( ch -- flag ) dup is-ht20? swap is-ht40? or ;
+
+hex
+
+\ Rate control phy values
+0 constant WLAN_RC_PHY_OFDM
+1 constant WLAN_RC_PHY_CCK
+2 constant WLAN_RC_PHY_HT_20_SS
+3 constant WLAN_RC_PHY_HT_20_DS
+4 constant WLAN_RC_PHY_HT_20_TS
+5 constant WLAN_RC_PHY_HT_40_SS
+6 constant WLAN_RC_PHY_HT_40_DS
+7 constant WLAN_RC_PHY_HT_40_TS
+8 constant WLAN_RC_PHY_HT_20_SS_HGI
+9 constant WLAN_RC_PHY_HT_20_DS_HGI
+a constant WLAN_RC_PHY_HT_20_TS_HGI
+b constant WLAN_RC_PHY_HT_40_SS_HGI
+c constant WLAN_RC_PHY_HT_40_DS_HGI
+d constant WLAN_RC_PHY_HT_40_TS_HGI
+e constant WLAN_RC_PHY_MAX
+
+\ hw-caps bit definitions
+0000.0001 constant HW_CAP_HT
+0000.0002 constant HW_CAP_RFSILENT
+0000.0004 constant HW_CAP_CST
+0000.0008 constant HW_CAP_ENHANCEDPM
+0000.0010 constant HW_CAP_AUTOSLEEP
+0000.0020 constant HW_CAP_4KB_SPLITTRANS
+0000.0040 constant HW_CAP_EDMA
+0000.0080 constant HW_CAP_RAC_SUPPORTED
+0000.0100 constant HW_CAP_LDPC
+0000.0200 constant HW_CAP_FASTCLOCK
+0000.0400 constant HW_CAP_SGI_20
+0000.0800 constant HW_CAP_PAPRD
+0000.1000 constant HW_CAP_ANT_DIV_COMB
+0000.2000 constant HW_CAP_2GHZ
+0000.4000 constant HW_CAP_5GHZ
+0000.8000 constant HW_CAP_APM
+HW_CAP_HT HW_CAP_CST or HW_CAP_ENHANCEDPM or HW_CAP_AUTOSLEEP or
+HW_CAP_4KB_SPLITTRANS or HW_CAP_EDMA or HW_CAP_FASTCLOCK or HW_CAP_LDPC or
+HW_CAP_RAC_SUPPORTED or HW_CAP_SGI_20 or HW_CAP_5GHZ or HW_CAP_2GHZ or
+value hw-caps
+
+d# 12 /n* constant rx-status-len
+d# 32 /n* constant tx-desc-len
+h# 127 constant dummy-rssi
+
+0 value curchan \ Points to one of the channels
+d# 20 value slottime
+dummy-rssi value last-rssi
+dummy-rssi value avgbrssi
+0 value max-txchains
+
+\ channel-type definitions
+0 constant NL80211_CHAN_NO_HT
+1 constant NL80211_CHAN_HT20
+2 constant NL80211_CHAN_HT40MINUS
+3 constant NL80211_CHAN_HT40PLUS
+0 value channel-type
+
+: conf-is-ht20? ( -- flag ) channel-type NL80211_CHAN_HT20 = ;
+: conf-is-ht40-? ( -- flag ) channel-type NL80211_CHAN_HT40MINUS = ;
+: conf-is-ht40+? ( -- flag ) channel-type NL80211_CHAN_HT40PLUS = ;
+: conf-is-ht40? ( -- flag ) conf-is-ht40-? conf-is-ht40+? or ;
+: conf-is-ht? ( -- flag ) channel-type ;
+
+0 value coverage-class
+
+0 value txchainmask
+0 value rxchainmask
+0 value paprd-ratemask
+0 value paprd-ratemask-ht40
+0 value paprd-table-write-done?
+0 value paprd-target-power
+
+1 constant led-pin
+0 constant LED_OFF
+
+/mac-adr buffer: curbssid
+/mac-adr buffer: bssidmask
+0 value curaid
+
+0 value tx-chainmask
+0 value rx-chainmask
+
+0 value clockrate
+\ clockrate values
+d# 22 constant CLOCK_RATE_CCK
+d# 40 constant CLOCK_RATE_5GHZ_OFDM
+d# 44 constant CLOCK_RATE_2GHZ_OFDM
+d# 44 constant CLOCK_FAST_RATE_5GHZ_OFDM
+
+\ Regulatory
+0 value reg-cap
+
+struct
+ /n field >reg-dmn-enum
+ /n field >reg-5ghz-ctl
+ /n field >reg-2ghz-ctl
+constant /reg-dmn-pair
+
+\ CTL constants
+e0 constant SD_NO_CTL
+0f constant CTL_MODE_M
+00 constant CTL_11A
+01 constant CTL_11B
+02 constant CTL_11G
+05 constant CTL_2GHT20
+06 constant CTL_5GHT20
+07 constant CTL_2GHT40
+08 constant CTL_5GHT40
+CTL_11A 8000 or constant CTL_11A_EXT
+CTL_11B 8000 or constant CTL_11B_EXT
+CTL_11G 8000 or constant CTL_11G_EXT
+
+struct
+ /n field >reg-country
+ /n field >reg-max-power
+ /n field >reg-tp-scale
+ /n field >reg-cur-rd
+ /n field >reg-cur-rd-ext
+ /n field >reg-power-limit
+ /n field >reg-pair
+ 2 field >reg-alpha2
+constant /regulatory
+
+/regulatory buffer: regulatory
+
+0 value sc-flags
+\ sc-flags bit definitions
+0001 constant SC_OP_INVALID
+0002 constant SC_OP_BEACONS
+0004 constant SC_OP_RXAGGR
+0008 constant SC_OP_TXAGGR
+0010 constant SC_OP_OFFCHANNEL
+0020 constant SC_OP_PREAMBLE_SHORT
+0040 constant SC_OP_PROTECT_ENABLE
+0080 constant SC_OP_RXFLUSH
+0100 constant SC_OP_LED_ASSOCIATED
+0200 constant SC_OP_LED_ON
+0400 constant SC_OP_TSF_RESET
+0800 constant SC_OP_BT_PRIORITY_DETECTED
+1000 constant SC_OP_BT_SCAN
+2000 constant SC_OP_ANI_RUN
+4000 constant SC_OP_ENABLE_APM
+
+0 value rx-defant
+0 value rs-otherant-cnt
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/ini9382.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/ini9382.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,1486 @@
+purpose: Atheros 9382 initialization arrays
+\ See license at end of file
+
+headers
+hex
+
+create array-soc-preamble
+here
+ \ Addr allmodes
+ 000040a4 , 00a0c1c9 ,
+ 00007008 , 00000000 ,
+ 00007020 , 00000000 ,
+ 00007034 , 00000002 ,
+ 00007038 , 000004c2 ,
+ 00007048 , 00000008 ,
+here swap - 2 /n* / constant soc-preamble-#row
+
+create array-soc-postamble
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 00007010 , 00000023 , 00000023 , 00000023 , 00000023 ,
+here swap - 5 /n* / constant soc-postamble-#row
+
+create array-mac-core
+here
+ \ Addr allmodes
+ 00000008 , 00000000 ,
+ 00000030 , 00020085 ,
+ 00000034 , 00000005 ,
+ 00000040 , 00000000 ,
+ 00000044 , 00000000 ,
+ 00000048 , 00000008 ,
+ 0000004c , 00000010 ,
+ 00000050 , 00000000 ,
+ 00001040 , 002ffc0f ,
+ 00001044 , 002ffc0f ,
+ 00001048 , 002ffc0f ,
+ 0000104c , 002ffc0f ,
+ 00001050 , 002ffc0f ,
+ 00001054 , 002ffc0f ,
+ 00001058 , 002ffc0f ,
+ 0000105c , 002ffc0f ,
+ 00001060 , 002ffc0f ,
+ 00001064 , 002ffc0f ,
+ 000010f0 , 00000100 ,
+ 00001270 , 00000000 ,
+ 000012b0 , 00000000 ,
+ 000012f0 , 00000000 ,
+ 0000143c , 00000000 ,
+ 0000147c , 00000000 ,
+ 00008000 , 00000000 ,
+ 00008004 , 00000000 ,
+ 00008008 , 00000000 ,
+ 0000800c , 00000000 ,
+ 00008018 , 00000000 ,
+ 00008020 , 00000000 ,
+ 00008038 , 00000000 ,
+ 0000803c , 00000000 ,
+ 00008040 , 00000000 ,
+ 00008044 , 00000000 ,
+ 00008048 , 00000000 ,
+ 0000804c , ffffffff ,
+ 00008054 , 00000000 ,
+ 00008058 , 00000000 ,
+ 0000805c , 000fc78f ,
+ 00008060 , 0000000f ,
+ 00008064 , 00000000 ,
+ 00008070 , 00000310 ,
+ 00008074 , 00000020 ,
+ 00008078 , 00000000 ,
+ 0000809c , 0000000f ,
+ 000080a0 , 00000000 ,
+ 000080a4 , 02ff0000 ,
+ 000080a8 , 0e070605 ,
+ 000080ac , 0000000d ,
+ 000080b0 , 00000000 ,
+ 000080b4 , 00000000 ,
+ 000080b8 , 00000000 ,
+ 000080bc , 00000000 ,
+ 000080c0 , 2a800000 ,
+ 000080c4 , 06900168 ,
+ 000080c8 , 13881c20 ,
+ 000080cc , 01f40000 ,
+ 000080d0 , 00252500 ,
+ 000080d4 , 00a00000 ,
+ 000080d8 , 00400000 ,
+ 000080dc , 00000000 ,
+ 000080e0 , ffffffff ,
+ 000080e4 , 0000ffff ,
+ 000080e8 , 3f3f3f3f ,
+ 000080ec , 00000000 ,
+ 000080f0 , 00000000 ,
+ 000080f4 , 00000000 ,
+ 000080fc , 00020000 ,
+ 00008100 , 00000000 ,
+ 00008108 , 00000052 ,
+ 0000810c , 00000000 ,
+ 00008110 , 00000000 ,
+ 00008114 , 000007ff ,
+ 00008118 , 000000aa ,
+ 0000811c , 00003210 ,
+ 00008124 , 00000000 ,
+ 00008128 , 00000000 ,
+ 0000812c , 00000000 ,
+ 00008130 , 00000000 ,
+ 00008134 , 00000000 ,
+ 00008138 , 00000000 ,
+ 0000813c , 0000ffff ,
+ 00008144 , ffffffff ,
+ 00008168 , 00000000 ,
+ 0000816c , 00000000 ,
+ 000081c0 , 00000000 ,
+ 000081c4 , 33332210 ,
+ 000081c8 , 00000000 ,
+ 000081cc , 00000000 ,
+ 000081ec , 00000000 ,
+ 000081f0 , 00000000 ,
+ 000081f4 , 00000000 ,
+ 000081f8 , 00000000 ,
+ 000081fc , 00000000 ,
+ 00008240 , 00100000 ,
+ 00008244 , 0010f424 ,
+ 00008248 , 00000800 ,
+ 0000824c , 0001e848 ,
+ 00008250 , 00000000 ,
+ 00008254 , 00000000 ,
+ 00008258 , 00000000 ,
+ 0000825c , 40000000 ,
+ 00008260 , 00080922 ,
+ 00008264 , 9bc00010 ,
+ 00008268 , ffffffff ,
+ 0000826c , 0000ffff ,
+ 00008270 , 00000000 ,
+ 00008274 , 40000000 ,
+ 00008278 , 003e4180 ,
+ 0000827c , 00000004 ,
+ 00008284 , 0000002c ,
+ 00008288 , 0000002c ,
+ 0000828c , 000000ff ,
+ 00008294 , 00000000 ,
+ 00008298 , 00000000 ,
+ 0000829c , 00000000 ,
+ 00008300 , 00000140 ,
+ 00008314 , 00000000 ,
+ 0000831c , 0000010d ,
+ 00008328 , 00000000 ,
+ 0000832c , 00000007 ,
+ 00008330 , 00000302 ,
+ 00008334 , 00000700 ,
+ 00008338 , 00ff0000 ,
+ 0000833c , 02400000 ,
+ 00008340 , 000107ff ,
+ 00008344 , aa48105b ,
+ 00008348 , 008f0000 ,
+ 0000835c , 00000000 ,
+ 00008360 , ffffffff ,
+ 00008364 , ffffffff ,
+ 00008368 , 00000000 ,
+ 00008370 , 00000000 ,
+ 00008374 , 000000ff ,
+ 00008378 , 00000000 ,
+ 0000837c , 00000000 ,
+ 00008380 , ffffffff ,
+ 00008384 , ffffffff ,
+ 00008390 , ffffffff ,
+ 00008394 , ffffffff ,
+ 00008398 , 00000000 ,
+ 0000839c , 00000000 ,
+ 000083a0 , 00000000 ,
+ 000083a4 , 0000fa14 ,
+ 000083a8 , 000f0c00 ,
+ 000083ac , 33332210 ,
+ 000083b0 , 33332210 ,
+ 000083b4 , 33332210 ,
+ 000083b8 , 33332210 ,
+ 000083bc , 00000000 ,
+ 000083c0 , 00000000 ,
+ 000083c4 , 00000000 ,
+ 000083c8 , 00000000 ,
+ 000083cc , 00000200 ,
+ 000083d0 , 000301ff ,
+here swap - 2 /n* / constant mac-core-#row
+
+create array-mac-postamble
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 00001030 , 00000230 , 00000460 , 000002c0 , 00000160 ,
+ 00001070 , 00000168 , 000002d0 , 00000318 , 0000018c ,
+ 000010b0 , 00000e60 , 00001cc0 , 00007c70 , 00003e38 ,
+ 00008014 , 03e803e8 , 07d007d0 , 10801600 , 08400b00 ,
+ 0000801c , 128d8027 , 128d804f , 12e00057 , 12e0002b ,
+ 00008120 , 08f04800 , 08f04800 , 08f04810 , 08f04810 ,
+ 000081d0 , 00003210 , 00003210 , 0000320a , 0000320a ,
+ 00008318 , 00003e80 , 00007d00 , 00006880 , 00003440 ,
+here swap - 5 /n* / constant mac-postamble-#row
+
+create array-bb-core
+here
+ \ Addr allmodes
+ 00009800 , afe68e30 ,
+ 00009804 , fd14e000 ,
+ 00009808 , 9c0a9f6b ,
+ 0000980c , 04900000 ,
+ 00009814 , 9280c00a ,
+ 00009818 , 00000000 ,
+ 0000981c , 00020028 ,
+ 00009834 , 6400a290 ,
+ 00009838 , 0108ecff ,
+ 0000983c , 0d000600 ,
+ 00009880 , 201fff00 ,
+ 00009884 , 00001042 ,
+ 000098a4 , 00200400 ,
+ 000098b0 , 32840bbe ,
+ 000098d0 , 004b6a8e ,
+ 000098d4 , 00000820 ,
+ 000098dc , 00000000 ,
+ 000098f0 , 00000000 ,
+ 000098f4 , 00000000 ,
+ 00009c04 , ff55ff55 ,
+ 00009c08 , 0320ff55 ,
+ 00009c0c , 00000000 ,
+ 00009c10 , 00000000 ,
+ 00009c14 , 00046384 ,
+ 00009c18 , 05b6b440 ,
+ 00009c1c , 00b6b440 ,
+ 00009d00 , c080a333 ,
+ 00009d04 , 40206c10 ,
+ 00009d08 , 009c4060 ,
+ 00009d0c , 9883800a ,
+ 00009d10 , 01834061 ,
+ 00009d14 , 00c0040b ,
+ 00009d18 , 00000000 ,
+ 00009e08 , 0038230c ,
+ 00009e24 , 990bb515 ,
+ 00009e28 , 0c6f0000 ,
+ 00009e30 , 06336f77 ,
+ 00009e34 , 6af6532f ,
+ 00009e38 , 0cc80c00 ,
+ 00009e40 , 0d261820 ,
+ 00009e4c , 00001004 ,
+ 00009e50 , 00ff03f1 ,
+ 00009e54 , 00000000 ,
+ 00009fc0 , 803e4788 ,
+ 00009fc4 , 0001efb5 ,
+ 00009fcc , 40000014 ,
+ 00009fd0 , 01193b93 ,
+ 0000a20c , 00000000 ,
+ 0000a220 , 00000000 ,
+ 0000a224 , 00000000 ,
+ 0000a228 , 10002310 ,
+ 0000a23c , 00000000 ,
+ 0000a244 , 0c000000 ,
+ 0000a2a0 , 00000001 ,
+ 0000a2c0 , 00000001 ,
+ 0000a2c8 , 00000000 ,
+ 0000a2cc , 18c43433 ,
+ 0000a2d4 , 00000000 ,
+ 0000a2ec , 00000000 ,
+ 0000a2f0 , 00000000 ,
+ 0000a2f4 , 00000000 ,
+ 0000a2f8 , 00000000 ,
+ 0000a344 , 00000000 ,
+ 0000a34c , 00000000 ,
+ 0000a350 , 0000a000 ,
+ 0000a364 , 00000000 ,
+ 0000a370 , 00000000 ,
+ 0000a390 , 00000001 ,
+ 0000a394 , 00000444 ,
+ 0000a398 , 001f0e0f ,
+ 0000a39c , 0075393f ,
+ 0000a3a0 , b79f6427 ,
+ 0000a3a4 , 00000000 ,
+ 0000a3a8 , aaaaaaaa ,
+ 0000a3ac , 3c466478 ,
+ 0000a3c0 , 20202020 ,
+ 0000a3c4 , 22222220 ,
+ 0000a3c8 , 20200020 ,
+ 0000a3cc , 20202020 ,
+ 0000a3d0 , 20202020 ,
+ 0000a3d4 , 20202020 ,
+ 0000a3d8 , 20202020 ,
+ 0000a3dc , 20202020 ,
+ 0000a3e0 , 20202020 ,
+ 0000a3e4 , 20202020 ,
+ 0000a3e8 , 20202020 ,
+ 0000a3ec , 20202020 ,
+ 0000a3f0 , 00000000 ,
+ 0000a3f4 , 00000246 ,
+ 0000a3f8 , 0cdbd380 ,
+ 0000a3fc , 000f0f01 ,
+ 0000a400 , 8fa91f01 ,
+ 0000a404 , 00000000 ,
+ 0000a408 , 0e79e5c6 ,
+ 0000a40c , 00820820 ,
+ 0000a414 , 1ce739ce ,
+ 0000a418 , 2d001dce ,
+ 0000a41c , 1ce739ce ,
+ 0000a420 , 000001ce ,
+ 0000a424 , 1ce739ce ,
+ 0000a428 , 000001ce ,
+ 0000a42c , 1ce739ce ,
+ 0000a430 , 1ce739ce ,
+ 0000a434 , 00000000 ,
+ 0000a438 , 00001801 ,
+ 0000a43c , 00100000 ,
+ 0000a440 , 00000000 ,
+ 0000a444 , 00000000 ,
+ 0000a448 , 06000080 ,
+ 0000a44c , 00000001 ,
+ 0000a450 , 00010000 ,
+ 0000a458 , 00000000 ,
+ 0000a640 , 00000000 ,
+ 0000a644 , 3fad9d74 ,
+ 0000a648 , 0048060a ,
+ 0000a64c , 00003c37 ,
+ 0000a670 , 03020100 ,
+ 0000a674 , 09080504 ,
+ 0000a678 , 0d0c0b0a ,
+ 0000a67c , 13121110 ,
+ 0000a680 , 31301514 ,
+ 0000a684 , 35343332 ,
+ 0000a688 , 00000036 ,
+ 0000a690 , 00000838 ,
+ 0000a7c0 , 00000000 ,
+ 0000a7c4 , fffffffc ,
+ 0000a7c8 , 00000000 ,
+ 0000a7cc , 00000000 ,
+ 0000a7d0 , 00000000 ,
+ 0000a7d4 , 00000004 ,
+ 0000a7dc , 00000001 ,
+ 0000a8d0 , 004b6a8e ,
+ 0000a8d4 , 00000820 ,
+ 0000a8dc , 00000000 ,
+ 0000a8f0 , 00000000 ,
+ 0000a8f4 , 00000000 ,
+ 0000b2d0 , 00000080 ,
+ 0000b2d4 , 00000000 ,
+ 0000b2ec , 00000000 ,
+ 0000b2f0 , 00000000 ,
+ 0000b2f4 , 00000000 ,
+ 0000b2f8 , 00000000 ,
+ 0000b408 , 0e79e5c0 ,
+ 0000b40c , 00820820 ,
+ 0000b420 , 00000000 ,
+ 0000b8d0 , 004b6a8e ,
+ 0000b8d4 , 00000820 ,
+ 0000b8dc , 00000000 ,
+ 0000b8f0 , 00000000 ,
+ 0000b8f4 , 00000000 ,
+ 0000c2d0 , 00000080 ,
+ 0000c2d4 , 00000000 ,
+ 0000c2ec , 00000000 ,
+ 0000c2f0 , 00000000 ,
+ 0000c2f4 , 00000000 ,
+ 0000c2f8 , 00000000 ,
+ 0000c408 , 0e79e5c0 ,
+ 0000c40c , 00820820 ,
+ 0000c420 , 00000000 ,
+here swap - 2 /n* / constant bb-core-#row
+
+create array-bb-postamble
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 00009810 , d00a8005 , d00a8005 , d00a8011 , d00a8011 ,
+ 00009820 , 206a022e , 206a022e , 206a012e , 206a012e ,
+ 00009824 , 5ac640d0 , 5ac640d0 , 5ac640d0 , 5ac640d0 ,
+ 00009828 , 06903081 , 06903081 , 06903881 , 06903881 ,
+ 0000982c , 05eea6d4 , 05eea6d4 , 05eea6d4 , 05eea6d4 ,
+ 00009830 , 0000059c , 0000059c , 0000119c , 0000119c ,
+ 00009c00 , 000000c4 , 000000c4 , 000000c4 , 000000c4 ,
+ 00009e00 , 0372111a , 0372111a , 037216a0 , 037216a0 ,
+ 00009e04 , 001c2020 , 001c2020 , 001c2020 , 001c2020 ,
+ 00009e0c , 6c4000e2 , 6d4000e2 , 6d4000e2 , 6c4000e2 ,
+ 00009e10 , 7ec88d2e , 7ec88d2e , 7ec84d2e , 7ec84d2e ,
+ 00009e14 , 37b95d5e , 37b9605e , 3379605e , 33795d5e ,
+ 00009e18 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 00009e1c , 0001cf9c , 0001cf9c , 00021f9c , 00021f9c ,
+ 00009e20 , 000003b5 , 000003b5 , 000003ce , 000003ce ,
+ 00009e2c , 0000001c , 0000001c , 00000021 , 00000021 ,
+ 00009e3c , cf946220 , cf946220 , cf946222 , cf946222 ,
+ 00009e44 , 02321e27 , 02321e27 , 02291e27 , 02291e27 ,
+ 00009e48 , 5030201a , 5030201a , 50302012 , 50302012 ,
+ 00009fc8 , 0003f000 , 0003f000 , 0001a000 , 0001a000 ,
+ 0000a204 , 000037c0 , 000037c4 , 000037c4 , 000037c0 ,
+ 0000a208 , 00000104 , 00000104 , 00000004 , 00000004 ,
+ 0000a22c , 01026a2f , 01026a2f , 01026a2f , 01026a2f ,
+ 0000a230 , 0000000a , 00000014 , 00000016 , 0000000b ,
+ 0000a234 , 00000fff , 10000fff , 10000fff , 00000fff ,
+ 0000a238 , ffb81018 , ffb81018 , ffb81018 , ffb81018 ,
+ 0000a250 , 00000000 , 00000000 , 00000210 , 00000108 ,
+ 0000a254 , 000007d0 , 00000fa0 , 00001130 , 00000898 ,
+ 0000a258 , 02020002 , 02020002 , 02020002 , 02020002 ,
+ 0000a25c , 01000e0e , 01000e0e , 01000e0e , 01000e0e ,
+ 0000a260 , 0a021501 , 0a021501 , 3a021501 , 3a021501 ,
+ 0000a264 , 00000e0e , 00000e0e , 00000e0e , 00000e0e ,
+ 0000a280 , 00000007 , 00000007 , 0000000b , 0000000b ,
+ 0000a284 , 00000000 , 00000000 , 00000150 , 00000150 ,
+ 0000a288 , 00000110 , 00000110 , 00000110 , 00000110 ,
+ 0000a28c , 00022222 , 00022222 , 00022222 , 00022222 ,
+ 0000a2c4 , 00158d18 , 00158d18 , 00158d18 , 00158d18 ,
+ 0000a2d0 , 00071981 , 00071981 , 00071981 , 00071982 ,
+ 0000a2d8 , 7999a83a , 7999a83a , 7999a83a , 7999a83a ,
+ 0000a358 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a830 , 0000019c , 0000019c , 0000019c , 0000019c ,
+ 0000ae04 , 001c0000 , 001c0000 , 001c0000 , 001c0000 ,
+ 0000ae18 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000ae1c , 0000019c , 0000019c , 0000019c , 0000019c ,
+ 0000ae20 , 000001b5 , 000001b5 , 000001ce , 000001ce ,
+ 0000b284 , 00000000 , 00000000 , 00000150 , 00000150 ,
+ 0000b830 , 0000019c , 0000019c , 0000019c , 0000019c ,
+ 0000be04 , 001c0000 , 001c0000 , 001c0000 , 001c0000 ,
+ 0000be18 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000be1c , 0000019c , 0000019c , 0000019c , 0000019c ,
+ 0000be20 , 000001b5 , 000001b5 , 000001ce , 000001ce ,
+ 0000c284 , 00000000 , 00000000 , 00000150 , 00000150 ,
+here swap - 5 /n* / constant bb-postamble-#row
+
+create array-radio-core
+here
+ \ Addr allmodes
+ 00016000 , 36db6db6 ,
+ 00016004 , 6db6db40 ,
+ 00016008 , 73f00000 ,
+ 0001600c , 00000000 ,
+ 00016040 , 7f80fff8 ,
+ 0001604c , 76d005b5 ,
+ 00016050 , 556cf031 ,
+ 00016054 , 13449440 ,
+ 00016058 , 0c51c92c ,
+ 0001605c , 3db7fffc ,
+ 00016060 , fffffffc ,
+ 00016064 , 000f0278 ,
+ 0001606c , 6db60000 ,
+ 00016080 , 00000000 ,
+ 00016084 , 0e48048c ,
+ 00016088 , 54214514 ,
+ 0001608c , 119f481e ,
+ 00016090 , 24926490 ,
+ 00016098 , d2888888 ,
+ 000160a0 , 0a108ffe ,
+ 000160a4 , 812fc370 ,
+ 000160a8 , 423c8000 ,
+ 000160b4 , 92480080 ,
+ 000160c0 , 00adb6d0 ,
+ 000160c4 , 6db6db60 ,
+ 000160c8 , 6db6db6c ,
+ 000160cc , 01e6c000 ,
+ 00016100 , 3fffbe01 ,
+ 00016104 , fff80000 ,
+ 00016108 , 00080010 ,
+ 00016144 , 02084080 ,
+ 00016148 , 00000000 ,
+ 00016280 , 058a0001 ,
+ 00016284 , 3d840208 ,
+ 00016288 , 05a20408 ,
+ 0001628c , 00038c07 ,
+ 00016290 , 00000004 ,
+ 00016294 , 458aa14f ,
+ 00016380 , 00000000 ,
+ 00016384 , 00000000 ,
+ 00016388 , 00800700 ,
+ 0001638c , 00800700 ,
+ 00016390 , 00800700 ,
+ 00016394 , 00000000 ,
+ 00016398 , 00000000 ,
+ 0001639c , 00000000 ,
+ 000163a0 , 00000001 ,
+ 000163a4 , 00000001 ,
+ 000163a8 , 00000000 ,
+ 000163ac , 00000000 ,
+ 000163b0 , 00000000 ,
+ 000163b4 , 00000000 ,
+ 000163b8 , 00000000 ,
+ 000163bc , 00000000 ,
+ 000163c0 , 000000a0 ,
+ 000163c4 , 000c0000 ,
+ 000163c8 , 14021402 ,
+ 000163cc , 00001402 ,
+ 000163d0 , 00000000 ,
+ 000163d4 , 00000000 ,
+ 00016400 , 36db6db6 ,
+ 00016404 , 6db6db40 ,
+ 00016408 , 73f00000 ,
+ 0001640c , 00000000 ,
+ 00016440 , 7f80fff8 ,
+ 0001644c , 76d005b5 ,
+ 00016450 , 556cf031 ,
+ 00016454 , 13449440 ,
+ 00016458 , 0c51c92c ,
+ 0001645c , 3db7fffc ,
+ 00016460 , fffffffc ,
+ 00016464 , 000f0278 ,
+ 0001646c , 6db60000 ,
+ 00016500 , 3fffbe01 ,
+ 00016504 , fff80000 ,
+ 00016508 , 00080010 ,
+ 00016544 , 02084080 ,
+ 00016548 , 00000000 ,
+ 00016780 , 00000000 ,
+ 00016784 , 00000000 ,
+ 00016788 , 00800700 ,
+ 0001678c , 00800700 ,
+ 00016790 , 00800700 ,
+ 00016794 , 00000000 ,
+ 00016798 , 00000000 ,
+ 0001679c , 00000000 ,
+ 000167a0 , 00000001 ,
+ 000167a4 , 00000001 ,
+ 000167a8 , 00000000 ,
+ 000167ac , 00000000 ,
+ 000167b0 , 00000000 ,
+ 000167b4 , 00000000 ,
+ 000167b8 , 00000000 ,
+ 000167bc , 00000000 ,
+ 000167c0 , 000000a0 ,
+ 000167c4 , 000c0000 ,
+ 000167c8 , 14021402 ,
+ 000167cc , 00001402 ,
+ 000167d0 , 00000000 ,
+ 000167d4 , 00000000 ,
+ 00016800 , 36db6db6 ,
+ 00016804 , 6db6db40 ,
+ 00016808 , 73f00000 ,
+ 0001680c , 00000000 ,
+ 00016840 , 7f80fff8 ,
+ 0001684c , 76d005b5 ,
+ 00016850 , 556cf031 ,
+ 00016854 , 13449440 ,
+ 00016858 , 0c51c92c ,
+ 0001685c , 3db7fffc ,
+ 00016860 , fffffffc ,
+ 00016864 , 000f0278 ,
+ 0001686c , 6db60000 ,
+ 00016900 , 3fffbe01 ,
+ 00016904 , fff80000 ,
+ 00016908 , 00080010 ,
+ 00016944 , 02084080 ,
+ 00016948 , 00000000 ,
+ 00016b80 , 00000000 ,
+ 00016b84 , 00000000 ,
+ 00016b88 , 00800700 ,
+ 00016b8c , 00800700 ,
+ 00016b90 , 00800700 ,
+ 00016b94 , 00000000 ,
+ 00016b98 , 00000000 ,
+ 00016b9c , 00000000 ,
+ 00016ba0 , 00000001 ,
+ 00016ba4 , 00000001 ,
+ 00016ba8 , 00000000 ,
+ 00016bac , 00000000 ,
+ 00016bb0 , 00000000 ,
+ 00016bb4 , 00000000 ,
+ 00016bb8 , 00000000 ,
+ 00016bbc , 00000000 ,
+ 00016bc0 , 000000a0 ,
+ 00016bc4 , 000c0000 ,
+ 00016bc8 , 14021402 ,
+ 00016bcc , 00001402 ,
+ 00016bd0 , 00000000 ,
+ 00016bd4 , 00000000 ,
+here swap - 2 /n* / constant radio-core-#row
+
+create array-radio-postamble
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 0001609c , 0dd08f29 , 0dd08f29 , 0b283f31 , 0b283f31 ,
+ 000160ac , a4653c00 , a4653c00 , 24652800 , 24652800 ,
+ 000160b0 , 03284f3e , 03284f3e , 05d08f20 , 05d08f20 ,
+ 0001610c , 08000000 , 00000000 , 00000000 , 00000000 ,
+ 00016140 , 10804008 , 10804008 , 50804008 , 50804008 ,
+ 0001650c , 08000000 , 00000000 , 00000000 , 00000000 ,
+ 00016540 , 10804008 , 10804008 , 50804008 , 50804008 ,
+ 0001690c , 08000000 , 00000000 , 00000000 , 00000000 ,
+ 00016940 , 10804008 , 10804008 , 50804008 , 50804008 ,
+here swap - 5 /n* / constant radio-postamble-#row
+
+create array-tx-gain-lowest
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 0000a2dc , 00033800 , 00033800 , 00637800 , 00637800 ,
+ 0000a2e0 , 0003c000 , 0003c000 , 03838000 , 03838000 ,
+ 0000a2e4 , 03fc0000 , 03fc0000 , 03fc0000 , 03fc0000 ,
+ 0000a2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a410 , 000050d9 , 000050d9 , 000050d9 , 000050d9 ,
+ 0000a500 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a504 , 06000003 , 06000003 , 04000002 , 04000002 ,
+ 0000a508 , 0a000020 , 0a000020 , 08000004 , 08000004 ,
+ 0000a50c , 10000023 , 10000023 , 0b000200 , 0b000200 ,
+ 0000a510 , 16000220 , 16000220 , 0f000202 , 0f000202 ,
+ 0000a514 , 1c000223 , 1c000223 , 12000400 , 12000400 ,
+ 0000a518 , 21002220 , 21002220 , 16000402 , 16000402 ,
+ 0000a51c , 27002223 , 27002223 , 19000404 , 19000404 ,
+ 0000a520 , 2b022220 , 2b022220 , 1c000603 , 1c000603 ,
+ 0000a524 , 2f022222 , 2f022222 , 21000a02 , 21000a02 ,
+ 0000a528 , 34022225 , 34022225 , 25000a04 , 25000a04 ,
+ 0000a52c , 3a02222a , 3a02222a , 28000a20 , 28000a20 ,
+ 0000a530 , 3e02222c , 3e02222c , 2c000e20 , 2c000e20 ,
+ 0000a534 , 4202242a , 4202242a , 30000e22 , 30000e22 ,
+ 0000a538 , 4702244a , 4702244a , 34000e24 , 34000e24 ,
+ 0000a53c , 4b02244c , 4b02244c , 38001640 , 38001640 ,
+ 0000a540 , 4e02246c , 4e02246c , 3c001660 , 3c001660 ,
+ 0000a544 , 52022470 , 52022470 , 3f001861 , 3f001861 ,
+ 0000a548 , 55022490 , 55022490 , 43001a81 , 43001a81 ,
+ 0000a54c , 59022492 , 59022492 , 47001a83 , 47001a83 ,
+ 0000a550 , 5d022692 , 5d022692 , 4a001c84 , 4a001c84 ,
+ 0000a554 , 61022892 , 61022892 , 4e001ce3 , 4e001ce3 ,
+ 0000a558 , 65024890 , 65024890 , 52001ce5 , 52001ce5 ,
+ 0000a55c , 69024892 , 69024892 , 56001ce9 , 56001ce9 ,
+ 0000a560 , 6e024c92 , 6e024c92 , 5a001ceb , 5a001ceb ,
+ 0000a564 , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a568 , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a56c , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a570 , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a574 , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a578 , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a57c , 74026e92 , 74026e92 , 5d001eec , 5d001eec ,
+ 0000a580 , 00800000 , 00800000 , 00800000 , 00800000 ,
+ 0000a584 , 06800003 , 06800003 , 04800002 , 04800002 ,
+ 0000a588 , 0a800020 , 0a800020 , 08800004 , 08800004 ,
+ 0000a58c , 10800023 , 10800023 , 0b800200 , 0b800200 ,
+ 0000a590 , 16800220 , 16800220 , 0f800202 , 0f800202 ,
+ 0000a594 , 1c800223 , 1c800223 , 12800400 , 12800400 ,
+ 0000a598 , 21802220 , 21802220 , 16800402 , 16800402 ,
+ 0000a59c , 27802223 , 27802223 , 19800404 , 19800404 ,
+ 0000a5a0 , 2b822220 , 2b822220 , 1c800603 , 1c800603 ,
+ 0000a5a4 , 2f822222 , 2f822222 , 21800a02 , 21800a02 ,
+ 0000a5a8 , 34822225 , 34822225 , 25800a04 , 25800a04 ,
+ 0000a5ac , 3a82222a , 3a82222a , 28800a20 , 28800a20 ,
+ 0000a5b0 , 3e82222c , 3e82222c , 2c800e20 , 2c800e20 ,
+ 0000a5b4 , 4282242a , 4282242a , 30800e22 , 30800e22 ,
+ 0000a5b8 , 4782244a , 4782244a , 34800e24 , 34800e24 ,
+ 0000a5bc , 4b82244c , 4b82244c , 38801640 , 38801640 ,
+ 0000a5c0 , 4e82246c , 4e82246c , 3c801660 , 3c801660 ,
+ 0000a5c4 , 52822470 , 52822470 , 3f801861 , 3f801861 ,
+ 0000a5c8 , 55822490 , 55822490 , 43801a81 , 43801a81 ,
+ 0000a5cc , 59822492 , 59822492 , 47801a83 , 47801a83 ,
+ 0000a5d0 , 5d822692 , 5d822692 , 4a801c84 , 4a801c84 ,
+ 0000a5d4 , 61822892 , 61822892 , 4e801ce3 , 4e801ce3 ,
+ 0000a5d8 , 65824890 , 65824890 , 52801ce5 , 52801ce5 ,
+ 0000a5dc , 69824892 , 69824892 , 56801ce9 , 56801ce9 ,
+ 0000a5e0 , 6e824c92 , 6e824c92 , 5a801ceb , 5a801ceb ,
+ 0000a5e4 , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5e8 , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5ec , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5f0 , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5f4 , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5f8 , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a5fc , 74826e92 , 74826e92 , 5d801eec , 5d801eec ,
+ 0000a600 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a604 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a608 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a60c , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a610 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a614 , 02004000 , 02004000 , 01404000 , 01404000 ,
+ 0000a618 , 02004801 , 02004801 , 01404501 , 01404501 ,
+ 0000a61c , 02808a02 , 02808a02 , 02008501 , 02008501 ,
+ 0000a620 , 0380ce03 , 0380ce03 , 0280ca03 , 0280ca03 ,
+ 0000a624 , 04411104 , 04411104 , 03010c04 , 03010c04 ,
+ 0000a628 , 04411104 , 04411104 , 04014c04 , 04014c04 ,
+ 0000a62c , 04411104 , 04411104 , 04015005 , 04015005 ,
+ 0000a630 , 04411104 , 04411104 , 04015005 , 04015005 ,
+ 0000a634 , 04411104 , 04411104 , 04015005 , 04015005 ,
+ 0000a638 , 04411104 , 04411104 , 04015005 , 04015005 ,
+ 0000a63c , 04411104 , 04411104 , 04015005 , 04015005 ,
+ 0000b2dc , 00033800 , 00033800 , 00637800 , 00637800 ,
+ 0000b2e0 , 0003c000 , 0003c000 , 03838000 , 03838000 ,
+ 0000b2e4 , 03fc0000 , 03fc0000 , 03fc0000 , 03fc0000 ,
+ 0000b2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000c2dc , 00033800 , 00033800 , 00637800 , 00637800 ,
+ 0000c2e0 , 0003c000 , 0003c000 , 03838000 , 03838000 ,
+ 0000c2e4 , 03fc0000 , 03fc0000 , 03fc0000 , 03fc0000 ,
+ 0000c2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 00016044 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016048 , 62480001 , 62480001 , 62480001 , 62480001 ,
+ 00016068 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016444 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016448 , 62480001 , 62480001 , 62480001 , 62480001 ,
+ 00016468 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016844 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016848 , 62480001 , 62480001 , 62480001 , 62480001 ,
+ 00016868 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+here swap - 5 /n* / constant tx-gain-lowest-#row
+
+create array-tx-gain-low
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 0000a2dc , 0380c7fc , 0380c7fc , 00637800 , 00637800 ,
+ 0000a2e0 , 0000f800 , 0000f800 , 03838000 , 03838000 ,
+ 0000a2e4 , 03ff0000 , 03ff0000 , 03fc0000 , 03fc0000 ,
+ 0000a2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a410 , 000050d9 , 000050d9 , 000050d9 , 000050d9 ,
+ 0000a500 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a504 , 06000003 , 06000003 , 04000002 , 04000002 ,
+ 0000a508 , 0a000020 , 0a000020 , 08000004 , 08000004 ,
+ 0000a50c , 10000023 , 10000023 , 0b000200 , 0b000200 ,
+ 0000a510 , 16000220 , 16000220 , 0f000202 , 0f000202 ,
+ 0000a514 , 1c000223 , 1c000223 , 12000400 , 12000400 ,
+ 0000a518 , 21002220 , 21002220 , 16000402 , 16000402 ,
+ 0000a51c , 27002223 , 27002223 , 19000404 , 19000404 ,
+ 0000a520 , 2b022220 , 2b022220 , 1c000603 , 1c000603 ,
+ 0000a524 , 2f022222 , 2f022222 , 21000a02 , 21000a02 ,
+ 0000a528 , 34022225 , 34022225 , 25000a04 , 25000a04 ,
+ 0000a52c , 3a02222a , 3a02222a , 28000a20 , 28000a20 ,
+ 0000a530 , 3e02222c , 3e02222c , 2c000e20 , 2c000e20 ,
+ 0000a534 , 4202242a , 4202242a , 30000e22 , 30000e22 ,
+ 0000a538 , 4702244a , 4702244a , 34000e24 , 34000e24 ,
+ 0000a53c , 4b02244c , 4b02244c , 38001640 , 38001640 ,
+ 0000a540 , 4e02246c , 4e02246c , 3c001660 , 3c001660 ,
+ 0000a544 , 5302266c , 5302266c , 3f001861 , 3f001861 ,
+ 0000a548 , 5702286c , 5702286c , 43001a81 , 43001a81 ,
+ 0000a54c , 5c02486b , 5c02486b , 47001a83 , 47001a83 ,
+ 0000a550 , 61024a6c , 61024a6c , 4a001c84 , 4a001c84 ,
+ 0000a554 , 66026a6c , 66026a6c , 4e001ce3 , 4e001ce3 ,
+ 0000a558 , 6b026e6c , 6b026e6c , 52001ce5 , 52001ce5 ,
+ 0000a55c , 7002708c , 7002708c , 56001ce9 , 56001ce9 ,
+ 0000a560 , 7302b08a , 7302b08a , 5a001ceb , 5a001ceb ,
+ 0000a564 , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a568 , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a56c , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a570 , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a574 , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a578 , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a57c , 7702b08c , 7702b08c , 5d001eec , 5d001eec ,
+ 0000a580 , 00800000 , 00800000 , 00800000 , 00800000 ,
+ 0000a584 , 06800003 , 06800003 , 04800002 , 04800002 ,
+ 0000a588 , 0a800020 , 0a800020 , 08800004 , 08800004 ,
+ 0000a58c , 10800023 , 10800023 , 0b800200 , 0b800200 ,
+ 0000a590 , 16800220 , 16800220 , 0f800202 , 0f800202 ,
+ 0000a594 , 1c800223 , 1c800223 , 12800400 , 12800400 ,
+ 0000a598 , 21802220 , 21802220 , 16800402 , 16800402 ,
+ 0000a59c , 27802223 , 27802223 , 19800404 , 19800404 ,
+ 0000a5a0 , 2b822220 , 2b822220 , 1c800603 , 1c800603 ,
+ 0000a5a4 , 2f822222 , 2f822222 , 21800a02 , 21800a02 ,
+ 0000a5a8 , 34822225 , 34822225 , 25800a04 , 25800a04 ,
+ 0000a5ac , 3a82222a , 3a82222a , 28800a20 , 28800a20 ,
+ 0000a5b0 , 3e82222c , 3e82222c , 2c800e20 , 2c800e20 ,
+ 0000a5b4 , 4282242a , 4282242a , 30800e22 , 30800e22 ,
+ 0000a5b8 , 4782244a , 4782244a , 34800e24 , 34800e24 ,
+ 0000a5bc , 4b82244c , 4b82244c , 38801640 , 38801640 ,
+ 0000a5c0 , 4e82246c , 4e82246c , 3c801660 , 3c801660 ,
+ 0000a5c4 , 5382266c , 5382266c , 3f801861 , 3f801861 ,
+ 0000a5c8 , 5782286c , 5782286c , 43801a81 , 43801a81 ,
+ 0000a5cc , 5c82486b , 5c82486b , 47801a83 , 47801a83 ,
+ 0000a5d0 , 61824a6c , 61824a6c , 4a801c84 , 4a801c84 ,
+ 0000a5d4 , 66826a6c , 66826a6c , 4e801ce3 , 4e801ce3 ,
+ 0000a5d8 , 6b826e6c , 6b826e6c , 52801ce5 , 52801ce5 ,
+ 0000a5dc , 7082708c , 7082708c , 56801ce9 , 56801ce9 ,
+ 0000a5e0 , 7382b08a , 7382b08a , 5a801ceb , 5a801ceb ,
+ 0000a5e4 , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5e8 , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5ec , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5f0 , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5f4 , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5f8 , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a5fc , 7782b08c , 7782b08c , 5d801eec , 5d801eec ,
+ 0000a600 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a604 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a608 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a60c , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a610 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a614 , 01404000 , 01404000 , 01404000 , 01404000 ,
+ 0000a618 , 01404501 , 01404501 , 01404501 , 01404501 ,
+ 0000a61c , 02008802 , 02008802 , 02008501 , 02008501 ,
+ 0000a620 , 0300cc03 , 0300cc03 , 0280ca03 , 0280ca03 ,
+ 0000a624 , 0300cc03 , 0300cc03 , 03010c04 , 03010c04 ,
+ 0000a628 , 0300cc03 , 0300cc03 , 04014c04 , 04014c04 ,
+ 0000a62c , 03810c03 , 03810c03 , 04015005 , 04015005 ,
+ 0000a630 , 03810e04 , 03810e04 , 04015005 , 04015005 ,
+ 0000a634 , 03810e04 , 03810e04 , 04015005 , 04015005 ,
+ 0000a638 , 03810e04 , 03810e04 , 04015005 , 04015005 ,
+ 0000a63c , 03810e04 , 03810e04 , 04015005 , 04015005 ,
+ 0000b2dc , 0380c7fc , 0380c7fc , 00637800 , 00637800 ,
+ 0000b2e0 , 0000f800 , 0000f800 , 03838000 , 03838000 ,
+ 0000b2e4 , 03ff0000 , 03ff0000 , 03fc0000 , 03fc0000 ,
+ 0000b2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000c2dc , 0380c7fc , 0380c7fc , 00637800 , 00637800 ,
+ 0000c2e0 , 0000f800 , 0000f800 , 03838000 , 03838000 ,
+ 0000c2e4 , 03ff0000 , 03ff0000 , 03fc0000 , 03fc0000 ,
+ 0000c2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 00016044 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016048 , 66480001 , 66480001 , 66480001 , 66480001 ,
+ 00016068 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016444 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016448 , 66480001 , 66480001 , 66480001 , 66480001 ,
+ 00016468 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016844 , 012492d4 , 012492d4 , 012492d4 , 012492d4 ,
+ 00016848 , 66480001 , 66480001 , 66480001 , 66480001 ,
+ 00016868 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+here swap - 5 /n* / constant tx-gain-low-#row
+
+create array-tx-gain-hi
+here
+ \ Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20
+ 0000a2dc , 01feee00 , 01feee00 , 00637800 , 00637800 ,
+ 0000a2e0 , 0000f000 , 0000f000 , 03838000 , 03838000 ,
+ 0000a2e4 , 01ff0000 , 01ff0000 , 03fc0000 , 03fc0000 ,
+ 0000a2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a410 , 000050d8 , 000050d8 , 000050d9 , 000050d9 ,
+ 0000a500 , 00002220 , 00002220 , 00000000 , 00000000 ,
+ 0000a504 , 04002222 , 04002222 , 04000002 , 04000002 ,
+ 0000a508 , 09002421 , 09002421 , 08000004 , 08000004 ,
+ 0000a50c , 0d002621 , 0d002621 , 0b000200 , 0b000200 ,
+ 0000a510 , 13004620 , 13004620 , 0f000202 , 0f000202 ,
+ 0000a514 , 19004a20 , 19004a20 , 11000400 , 11000400 ,
+ 0000a518 , 1d004e20 , 1d004e20 , 15000402 , 15000402 ,
+ 0000a51c , 21005420 , 21005420 , 19000404 , 19000404 ,
+ 0000a520 , 26005e20 , 26005e20 , 1b000603 , 1b000603 ,
+ 0000a524 , 2b005e40 , 2b005e40 , 1f000a02 , 1f000a02 ,
+ 0000a528 , 2f005e42 , 2f005e42 , 23000a04 , 23000a04 ,
+ 0000a52c , 33005e44 , 33005e44 , 26000a20 , 26000a20 ,
+ 0000a530 , 38005e65 , 38005e65 , 2a000e20 , 2a000e20 ,
+ 0000a534 , 3c005e69 , 3c005e69 , 2e000e22 , 2e000e22 ,
+ 0000a538 , 40005e6b , 40005e6b , 31000e24 , 31000e24 ,
+ 0000a53c , 44005e6d , 44005e6d , 34001640 , 34001640 ,
+ 0000a540 , 49005e72 , 49005e72 , 38001660 , 38001660 ,
+ 0000a544 , 4e005eb2 , 4e005eb2 , 3b001861 , 3b001861 ,
+ 0000a548 , 53005f12 , 53005f12 , 3e001a81 , 3e001a81 ,
+ 0000a54c , 59025eb2 , 59025eb2 , 42001a83 , 42001a83 ,
+ 0000a550 , 5e025f12 , 5e025f12 , 44001c84 , 44001c84 ,
+ 0000a554 , 61027f12 , 61027f12 , 48001ce3 , 48001ce3 ,
+ 0000a558 , 6702bf12 , 6702bf12 , 4c001ce5 , 4c001ce5 ,
+ 0000a55c , 6b02bf14 , 6b02bf14 , 50001ce9 , 50001ce9 ,
+ 0000a560 , 6f02bf16 , 6f02bf16 , 54001ceb , 54001ceb ,
+ 0000a564 , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a568 , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a56c , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a570 , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a574 , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a578 , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a57c , 6f02bf16 , 6f02bf16 , 56001eec , 56001eec ,
+ 0000a580 , 00802220 , 00802220 , 00800000 , 00800000 ,
+ 0000a584 , 04802222 , 04802222 , 04800002 , 04800002 ,
+ 0000a588 , 09802421 , 09802421 , 08800004 , 08800004 ,
+ 0000a58c , 0d802621 , 0d802621 , 0b800200 , 0b800200 ,
+ 0000a590 , 13804620 , 13804620 , 0f800202 , 0f800202 ,
+ 0000a594 , 19804a20 , 19804a20 , 11800400 , 11800400 ,
+ 0000a598 , 1d804e20 , 1d804e20 , 15800402 , 15800402 ,
+ 0000a59c , 21805420 , 21805420 , 19800404 , 19800404 ,
+ 0000a5a0 , 26805e20 , 26805e20 , 1b800603 , 1b800603 ,
+ 0000a5a4 , 2b805e40 , 2b805e40 , 1f800a02 , 1f800a02 ,
+ 0000a5a8 , 2f805e42 , 2f805e42 , 23800a04 , 23800a04 ,
+ 0000a5ac , 33805e44 , 33805e44 , 26800a20 , 26800a20 ,
+ 0000a5b0 , 38805e65 , 38805e65 , 2a800e20 , 2a800e20 ,
+ 0000a5b4 , 3c805e69 , 3c805e69 , 2e800e22 , 2e800e22 ,
+ 0000a5b8 , 40805e6b , 40805e6b , 31800e24 , 31800e24 ,
+ 0000a5bc , 44805e6d , 44805e6d , 34801640 , 34801640 ,
+ 0000a5c0 , 49805e72 , 49805e72 , 38801660 , 38801660 ,
+ 0000a5c4 , 4e805eb2 , 4e805eb2 , 3b801861 , 3b801861 ,
+ 0000a5c8 , 53805f12 , 53805f12 , 3e801a81 , 3e801a81 ,
+ 0000a5cc , 59825eb2 , 59825eb2 , 42801a83 , 42801a83 ,
+ 0000a5d0 , 5e825f12 , 5e825f12 , 44801c84 , 44801c84 ,
+ 0000a5d4 , 61827f12 , 61827f12 , 48801ce3 , 48801ce3 ,
+ 0000a5d8 , 6782bf12 , 6782bf12 , 4c801ce5 , 4c801ce5 ,
+ 0000a5dc , 6b82bf14 , 6b82bf14 , 50801ce9 , 50801ce9 ,
+ 0000a5e0 , 6f82bf16 , 6f82bf16 , 54801ceb , 54801ceb ,
+ 0000a5e4 , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5e8 , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5ec , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5f0 , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5f4 , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5f8 , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a5fc , 6f82bf16 , 6f82bf16 , 56801eec , 56801eec ,
+ 0000a600 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a604 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a608 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a60c , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000a610 , 00804000 , 00804000 , 00000000 , 00000000 ,
+ 0000a614 , 00804201 , 00804201 , 01404000 , 01404000 ,
+ 0000a618 , 0280c802 , 0280c802 , 01404501 , 01404501 ,
+ 0000a61c , 0280ca03 , 0280ca03 , 02008501 , 02008501 ,
+ 0000a620 , 04c15104 , 04c15104 , 0280ca03 , 0280ca03 ,
+ 0000a624 , 04c15305 , 04c15305 , 03010c04 , 03010c04 ,
+ 0000a628 , 04c15305 , 04c15305 , 04014c04 , 04014c04 ,
+ 0000a62c , 04c15305 , 04c15305 , 04015005 , 04015005 ,
+ 0000a630 , 04c15305 , 04c15305 , 04015005 , 04015005 ,
+ 0000a634 , 04c15305 , 04c15305 , 04015005 , 04015005 ,
+ 0000a638 , 04c15305 , 04c15305 , 04015005 , 04015005 ,
+ 0000a63c , 04c15305 , 04c15305 , 04015005 , 04015005 ,
+ 0000b2dc , 01feee00 , 01feee00 , 00637800 , 00637800 ,
+ 0000b2e0 , 0000f000 , 0000f000 , 03838000 , 03838000 ,
+ 0000b2e4 , 01ff0000 , 01ff0000 , 03fc0000 , 03fc0000 ,
+ 0000b2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 0000c2dc , 01feee00 , 01feee00 , 00637800 , 00637800 ,
+ 0000c2e0 , 0000f000 , 0000f000 , 03838000 , 03838000 ,
+ 0000c2e4 , 01ff0000 , 01ff0000 , 03fc0000 , 03fc0000 ,
+ 0000c2e8 , 00000000 , 00000000 , 00000000 , 00000000 ,
+ 00016044 , 056db2e4 , 056db2e4 , 056db2e4 , 056db2e4 ,
+ 00016048 , 8e480001 , 8e480001 , 8e480001 , 8e480001 ,
+ 00016068 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016444 , 056db2e4 , 056db2e4 , 056db2e4 , 056db2e4 ,
+ 00016448 , 8e480001 , 8e480001 , 8e480001 , 8e480001 ,
+ 00016468 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+ 00016844 , 056db2e4 , 056db2e4 , 056db2e4 , 056db2e4 ,
+ 00016848 , 8e480001 , 8e480001 , 8e480001 , 8e480001 ,
+ 00016868 , 6db6db6c , 6db6db6c , 6db6db6c , 6db6db6c ,
+here swap - 5 /n* / constant tx-gain-hi-#row
+
+array-tx-gain-lowest value array-tx-gain
+tx-gain-lowest-#row value tx-gain-#row
+
+create array-rx-gain-common
+here
+ \ Addr allmodes
+ 0000a000 , 00010000 ,
+ 0000a004 , 00030002 ,
+ 0000a008 , 00050004 ,
+ 0000a00c , 00810080 ,
+ 0000a010 , 00830082 ,
+ 0000a014 , 01810180 ,
+ 0000a018 , 01830182 ,
+ 0000a01c , 01850184 ,
+ 0000a020 , 01890188 ,
+ 0000a024 , 018b018a ,
+ 0000a028 , 018d018c ,
+ 0000a02c , 01910190 ,
+ 0000a030 , 01930192 ,
+ 0000a034 , 01950194 ,
+ 0000a038 , 038a0196 ,
+ 0000a03c , 038c038b ,
+ 0000a040 , 0390038d ,
+ 0000a044 , 03920391 ,
+ 0000a048 , 03940393 ,
+ 0000a04c , 03960395 ,
+ 0000a050 , 00000000 ,
+ 0000a054 , 00000000 ,
+ 0000a058 , 00000000 ,
+ 0000a05c , 00000000 ,
+ 0000a060 , 00000000 ,
+ 0000a064 , 00000000 ,
+ 0000a068 , 00000000 ,
+ 0000a06c , 00000000 ,
+ 0000a070 , 00000000 ,
+ 0000a074 , 00000000 ,
+ 0000a078 , 00000000 ,
+ 0000a07c , 00000000 ,
+ 0000a080 , 22222229 ,
+ 0000a084 , 1d1d1d1d ,
+ 0000a088 , 1d1d1d1d ,
+ 0000a08c , 1d1d1d1d ,
+ 0000a090 , 171d1d1d ,
+ 0000a094 , 11111717 ,
+ 0000a098 , 00030311 ,
+ 0000a09c , 00000000 ,
+ 0000a0a0 , 00000000 ,
+ 0000a0a4 , 00000000 ,
+ 0000a0a8 , 00000000 ,
+ 0000a0ac , 00000000 ,
+ 0000a0b0 , 00000000 ,
+ 0000a0b4 , 00000000 ,
+ 0000a0b8 , 00000000 ,
+ 0000a0bc , 00000000 ,
+ 0000a0c0 , 001f0000 ,
+ 0000a0c4 , 01000101 ,
+ 0000a0c8 , 011e011f ,
+ 0000a0cc , 011c011d ,
+ 0000a0d0 , 02030204 ,
+ 0000a0d4 , 02010202 ,
+ 0000a0d8 , 021f0200 ,
+ 0000a0dc , 0302021e ,
+ 0000a0e0 , 03000301 ,
+ 0000a0e4 , 031e031f ,
+ 0000a0e8 , 0402031d ,
+ 0000a0ec , 04000401 ,
+ 0000a0f0 , 041e041f ,
+ 0000a0f4 , 0502041d ,
+ 0000a0f8 , 05000501 ,
+ 0000a0fc , 051e051f ,
+ 0000a100 , 06010602 ,
+ 0000a104 , 061f0600 ,
+ 0000a108 , 061d061e ,
+ 0000a10c , 07020703 ,
+ 0000a110 , 07000701 ,
+ 0000a114 , 00000000 ,
+ 0000a118 , 00000000 ,
+ 0000a11c , 00000000 ,
+ 0000a120 , 00000000 ,
+ 0000a124 , 00000000 ,
+ 0000a128 , 00000000 ,
+ 0000a12c , 00000000 ,
+ 0000a130 , 00000000 ,
+ 0000a134 , 00000000 ,
+ 0000a138 , 00000000 ,
+ 0000a13c , 00000000 ,
+ 0000a140 , 001f0000 ,
+ 0000a144 , 01000101 ,
+ 0000a148 , 011e011f ,
+ 0000a14c , 011c011d ,
+ 0000a150 , 02030204 ,
+ 0000a154 , 02010202 ,
+ 0000a158 , 021f0200 ,
+ 0000a15c , 0302021e ,
+ 0000a160 , 03000301 ,
+ 0000a164 , 031e031f ,
+ 0000a168 , 0402031d ,
+ 0000a16c , 04000401 ,
+ 0000a170 , 041e041f ,
+ 0000a174 , 0502041d ,
+ 0000a178 , 05000501 ,
+ 0000a17c , 051e051f ,
+ 0000a180 , 06010602 ,
+ 0000a184 , 061f0600 ,
+ 0000a188 , 061d061e ,
+ 0000a18c , 07020703 ,
+ 0000a190 , 07000701 ,
+ 0000a194 , 00000000 ,
+ 0000a198 , 00000000 ,
+ 0000a19c , 00000000 ,
+ 0000a1a0 , 00000000 ,
+ 0000a1a4 , 00000000 ,
+ 0000a1a8 , 00000000 ,
+ 0000a1ac , 00000000 ,
+ 0000a1b0 , 00000000 ,
+ 0000a1b4 , 00000000 ,
+ 0000a1b8 , 00000000 ,
+ 0000a1bc , 00000000 ,
+ 0000a1c0 , 00000000 ,
+ 0000a1c4 , 00000000 ,
+ 0000a1c8 , 00000000 ,
+ 0000a1cc , 00000000 ,
+ 0000a1d0 , 00000000 ,
+ 0000a1d4 , 00000000 ,
+ 0000a1d8 , 00000000 ,
+ 0000a1dc , 00000000 ,
+ 0000a1e0 , 00000000 ,
+ 0000a1e4 , 00000000 ,
+ 0000a1e8 , 00000000 ,
+ 0000a1ec , 00000000 ,
+ 0000a1f0 , 00000396 ,
+ 0000a1f4 , 00000396 ,
+ 0000a1f8 , 00000396 ,
+ 0000a1fc , 00000196 ,
+ 0000b000 , 00010000 ,
+ 0000b004 , 00030002 ,
+ 0000b008 , 00050004 ,
+ 0000b00c , 00810080 ,
+ 0000b010 , 00830082 ,
+ 0000b014 , 01810180 ,
+ 0000b018 , 01830182 ,
+ 0000b01c , 01850184 ,
+ 0000b020 , 02810280 ,
+ 0000b024 , 02830282 ,
+ 0000b028 , 02850284 ,
+ 0000b02c , 02890288 ,
+ 0000b030 , 028b028a ,
+ 0000b034 , 0388028c ,
+ 0000b038 , 038a0389 ,
+ 0000b03c , 038c038b ,
+ 0000b040 , 0390038d ,
+ 0000b044 , 03920391 ,
+ 0000b048 , 03940393 ,
+ 0000b04c , 03960395 ,
+ 0000b050 , 00000000 ,
+ 0000b054 , 00000000 ,
+ 0000b058 , 00000000 ,
+ 0000b05c , 00000000 ,
+ 0000b060 , 00000000 ,
+ 0000b064 , 00000000 ,
+ 0000b068 , 00000000 ,
+ 0000b06c , 00000000 ,
+ 0000b070 , 00000000 ,
+ 0000b074 , 00000000 ,
+ 0000b078 , 00000000 ,
+ 0000b07c , 00000000 ,
+ 0000b080 , 2a2d2f32 ,
+ 0000b084 , 21232328 ,
+ 0000b088 , 19191c1e ,
+ 0000b08c , 12141417 ,
+ 0000b090 , 07070e0e ,
+ 0000b094 , 03030305 ,
+ 0000b098 , 00000003 ,
+ 0000b09c , 00000000 ,
+ 0000b0a0 , 00000000 ,
+ 0000b0a4 , 00000000 ,
+ 0000b0a8 , 00000000 ,
+ 0000b0ac , 00000000 ,
+ 0000b0b0 , 00000000 ,
+ 0000b0b4 , 00000000 ,
+ 0000b0b8 , 00000000 ,
+ 0000b0bc , 00000000 ,
+ 0000b0c0 , 003f0020 ,
+ 0000b0c4 , 00400041 ,
+ 0000b0c8 , 0140005f ,
+ 0000b0cc , 0160015f ,
+ 0000b0d0 , 017e017f ,
+ 0000b0d4 , 02410242 ,
+ 0000b0d8 , 025f0240 ,
+ 0000b0dc , 027f0260 ,
+ 0000b0e0 , 0341027e ,
+ 0000b0e4 , 035f0340 ,
+ 0000b0e8 , 037f0360 ,
+ 0000b0ec , 04400441 ,
+ 0000b0f0 , 0460045f ,
+ 0000b0f4 , 0541047f ,
+ 0000b0f8 , 055f0540 ,
+ 0000b0fc , 057f0560 ,
+ 0000b100 , 06400641 ,
+ 0000b104 , 0660065f ,
+ 0000b108 , 067e067f ,
+ 0000b10c , 07410742 ,
+ 0000b110 , 075f0740 ,
+ 0000b114 , 077f0760 ,
+ 0000b118 , 07800781 ,
+ 0000b11c , 07a0079f ,
+ 0000b120 , 07c107bf ,
+ 0000b124 , 000007c0 ,
+ 0000b128 , 00000000 ,
+ 0000b12c , 00000000 ,
+ 0000b130 , 00000000 ,
+ 0000b134 , 00000000 ,
+ 0000b138 , 00000000 ,
+ 0000b13c , 00000000 ,
+ 0000b140 , 003f0020 ,
+ 0000b144 , 00400041 ,
+ 0000b148 , 0140005f ,
+ 0000b14c , 0160015f ,
+ 0000b150 , 017e017f ,
+ 0000b154 , 02410242 ,
+ 0000b158 , 025f0240 ,
+ 0000b15c , 027f0260 ,
+ 0000b160 , 0341027e ,
+ 0000b164 , 035f0340 ,
+ 0000b168 , 037f0360 ,
+ 0000b16c , 04400441 ,
+ 0000b170 , 0460045f ,
+ 0000b174 , 0541047f ,
+ 0000b178 , 055f0540 ,
+ 0000b17c , 057f0560 ,
+ 0000b180 , 06400641 ,
+ 0000b184 , 0660065f ,
+ 0000b188 , 067e067f ,
+ 0000b18c , 07410742 ,
+ 0000b190 , 075f0740 ,
+ 0000b194 , 077f0760 ,
+ 0000b198 , 07800781 ,
+ 0000b19c , 07a0079f ,
+ 0000b1a0 , 07c107bf ,
+ 0000b1a4 , 000007c0 ,
+ 0000b1a8 , 00000000 ,
+ 0000b1ac , 00000000 ,
+ 0000b1b0 , 00000000 ,
+ 0000b1b4 , 00000000 ,
+ 0000b1b8 , 00000000 ,
+ 0000b1bc , 00000000 ,
+ 0000b1c0 , 00000000 ,
+ 0000b1c4 , 00000000 ,
+ 0000b1c8 , 00000000 ,
+ 0000b1cc , 00000000 ,
+ 0000b1d0 , 00000000 ,
+ 0000b1d4 , 00000000 ,
+ 0000b1d8 , 00000000 ,
+ 0000b1dc , 00000000 ,
+ 0000b1e0 , 00000000 ,
+ 0000b1e4 , 00000000 ,
+ 0000b1e8 , 00000000 ,
+ 0000b1ec , 00000000 ,
+ 0000b1f0 , 00000396 ,
+ 0000b1f4 , 00000396 ,
+ 0000b1f8 , 00000396 ,
+ 0000b1fc , 00000196 ,
+here swap - 2 /n* / constant rx-gain-common-#row
+
+create array-rx-gain-wo-xlna
+here
+ \ Addr allmodes
+ 0000a000 , 00010000 ,
+ 0000a004 , 00030002 ,
+ 0000a008 , 00050004 ,
+ 0000a00c , 00810080 ,
+ 0000a010 , 00830082 ,
+ 0000a014 , 01810180 ,
+ 0000a018 , 01830182 ,
+ 0000a01c , 01850184 ,
+ 0000a020 , 01890188 ,
+ 0000a024 , 018b018a ,
+ 0000a028 , 018d018c ,
+ 0000a02c , 03820190 ,
+ 0000a030 , 03840383 ,
+ 0000a034 , 03880385 ,
+ 0000a038 , 038a0389 ,
+ 0000a03c , 038c038b ,
+ 0000a040 , 0390038d ,
+ 0000a044 , 03920391 ,
+ 0000a048 , 03940393 ,
+ 0000a04c , 03960395 ,
+ 0000a050 , 00000000 ,
+ 0000a054 , 00000000 ,
+ 0000a058 , 00000000 ,
+ 0000a05c , 00000000 ,
+ 0000a060 , 00000000 ,
+ 0000a064 , 00000000 ,
+ 0000a068 , 00000000 ,
+ 0000a06c , 00000000 ,
+ 0000a070 , 00000000 ,
+ 0000a074 , 00000000 ,
+ 0000a078 , 00000000 ,
+ 0000a07c , 00000000 ,
+ 0000a080 , 29292929 ,
+ 0000a084 , 29292929 ,
+ 0000a088 , 29292929 ,
+ 0000a08c , 29292929 ,
+ 0000a090 , 22292929 ,
+ 0000a094 , 1d1d2222 ,
+ 0000a098 , 0c111117 ,
+ 0000a09c , 00030303 ,
+ 0000a0a0 , 00000000 ,
+ 0000a0a4 , 00000000 ,
+ 0000a0a8 , 00000000 ,
+ 0000a0ac , 00000000 ,
+ 0000a0b0 , 00000000 ,
+ 0000a0b4 , 00000000 ,
+ 0000a0b8 , 00000000 ,
+ 0000a0bc , 00000000 ,
+ 0000a0c0 , 001f0000 ,
+ 0000a0c4 , 01000101 ,
+ 0000a0c8 , 011e011f ,
+ 0000a0cc , 011c011d ,
+ 0000a0d0 , 02030204 ,
+ 0000a0d4 , 02010202 ,
+ 0000a0d8 , 021f0200 ,
+ 0000a0dc , 0302021e ,
+ 0000a0e0 , 03000301 ,
+ 0000a0e4 , 031e031f ,
+ 0000a0e8 , 0402031d ,
+ 0000a0ec , 04000401 ,
+ 0000a0f0 , 041e041f ,
+ 0000a0f4 , 0502041d ,
+ 0000a0f8 , 05000501 ,
+ 0000a0fc , 051e051f ,
+ 0000a100 , 06010602 ,
+ 0000a104 , 061f0600 ,
+ 0000a108 , 061d061e ,
+ 0000a10c , 07020703 ,
+ 0000a110 , 07000701 ,
+ 0000a114 , 00000000 ,
+ 0000a118 , 00000000 ,
+ 0000a11c , 00000000 ,
+ 0000a120 , 00000000 ,
+ 0000a124 , 00000000 ,
+ 0000a128 , 00000000 ,
+ 0000a12c , 00000000 ,
+ 0000a130 , 00000000 ,
+ 0000a134 , 00000000 ,
+ 0000a138 , 00000000 ,
+ 0000a13c , 00000000 ,
+ 0000a140 , 001f0000 ,
+ 0000a144 , 01000101 ,
+ 0000a148 , 011e011f ,
+ 0000a14c , 011c011d ,
+ 0000a150 , 02030204 ,
+ 0000a154 , 02010202 ,
+ 0000a158 , 021f0200 ,
+ 0000a15c , 0302021e ,
+ 0000a160 , 03000301 ,
+ 0000a164 , 031e031f ,
+ 0000a168 , 0402031d ,
+ 0000a16c , 04000401 ,
+ 0000a170 , 041e041f ,
+ 0000a174 , 0502041d ,
+ 0000a178 , 05000501 ,
+ 0000a17c , 051e051f ,
+ 0000a180 , 06010602 ,
+ 0000a184 , 061f0600 ,
+ 0000a188 , 061d061e ,
+ 0000a18c , 07020703 ,
+ 0000a190 , 07000701 ,
+ 0000a194 , 00000000 ,
+ 0000a198 , 00000000 ,
+ 0000a19c , 00000000 ,
+ 0000a1a0 , 00000000 ,
+ 0000a1a4 , 00000000 ,
+ 0000a1a8 , 00000000 ,
+ 0000a1ac , 00000000 ,
+ 0000a1b0 , 00000000 ,
+ 0000a1b4 , 00000000 ,
+ 0000a1b8 , 00000000 ,
+ 0000a1bc , 00000000 ,
+ 0000a1c0 , 00000000 ,
+ 0000a1c4 , 00000000 ,
+ 0000a1c8 , 00000000 ,
+ 0000a1cc , 00000000 ,
+ 0000a1d0 , 00000000 ,
+ 0000a1d4 , 00000000 ,
+ 0000a1d8 , 00000000 ,
+ 0000a1dc , 00000000 ,
+ 0000a1e0 , 00000000 ,
+ 0000a1e4 , 00000000 ,
+ 0000a1e8 , 00000000 ,
+ 0000a1ec , 00000000 ,
+ 0000a1f0 , 00000396 ,
+ 0000a1f4 , 00000396 ,
+ 0000a1f8 , 00000396 ,
+ 0000a1fc , 00000196 ,
+ 0000b000 , 00010000 ,
+ 0000b004 , 00030002 ,
+ 0000b008 , 00050004 ,
+ 0000b00c , 00810080 ,
+ 0000b010 , 00830082 ,
+ 0000b014 , 01810180 ,
+ 0000b018 , 01830182 ,
+ 0000b01c , 01850184 ,
+ 0000b020 , 02810280 ,
+ 0000b024 , 02830282 ,
+ 0000b028 , 02850284 ,
+ 0000b02c , 02890288 ,
+ 0000b030 , 028b028a ,
+ 0000b034 , 0388028c ,
+ 0000b038 , 038a0389 ,
+ 0000b03c , 038c038b ,
+ 0000b040 , 0390038d ,
+ 0000b044 , 03920391 ,
+ 0000b048 , 03940393 ,
+ 0000b04c , 03960395 ,
+ 0000b050 , 00000000 ,
+ 0000b054 , 00000000 ,
+ 0000b058 , 00000000 ,
+ 0000b05c , 00000000 ,
+ 0000b060 , 00000000 ,
+ 0000b064 , 00000000 ,
+ 0000b068 , 00000000 ,
+ 0000b06c , 00000000 ,
+ 0000b070 , 00000000 ,
+ 0000b074 , 00000000 ,
+ 0000b078 , 00000000 ,
+ 0000b07c , 00000000 ,
+ 0000b080 , 32323232 ,
+ 0000b084 , 2f2f3232 ,
+ 0000b088 , 23282a2d ,
+ 0000b08c , 1c1e2123 ,
+ 0000b090 , 14171919 ,
+ 0000b094 , 0e0e1214 ,
+ 0000b098 , 03050707 ,
+ 0000b09c , 00030303 ,
+ 0000b0a0 , 00000000 ,
+ 0000b0a4 , 00000000 ,
+ 0000b0a8 , 00000000 ,
+ 0000b0ac , 00000000 ,
+ 0000b0b0 , 00000000 ,
+ 0000b0b4 , 00000000 ,
+ 0000b0b8 , 00000000 ,
+ 0000b0bc , 00000000 ,
+ 0000b0c0 , 003f0020 ,
+ 0000b0c4 , 00400041 ,
+ 0000b0c8 , 0140005f ,
+ 0000b0cc , 0160015f ,
+ 0000b0d0 , 017e017f ,
+ 0000b0d4 , 02410242 ,
+ 0000b0d8 , 025f0240 ,
+ 0000b0dc , 027f0260 ,
+ 0000b0e0 , 0341027e ,
+ 0000b0e4 , 035f0340 ,
+ 0000b0e8 , 037f0360 ,
+ 0000b0ec , 04400441 ,
+ 0000b0f0 , 0460045f ,
+ 0000b0f4 , 0541047f ,
+ 0000b0f8 , 055f0540 ,
+ 0000b0fc , 057f0560 ,
+ 0000b100 , 06400641 ,
+ 0000b104 , 0660065f ,
+ 0000b108 , 067e067f ,
+ 0000b10c , 07410742 ,
+ 0000b110 , 075f0740 ,
+ 0000b114 , 077f0760 ,
+ 0000b118 , 07800781 ,
+ 0000b11c , 07a0079f ,
+ 0000b120 , 07c107bf ,
+ 0000b124 , 000007c0 ,
+ 0000b128 , 00000000 ,
+ 0000b12c , 00000000 ,
+ 0000b130 , 00000000 ,
+ 0000b134 , 00000000 ,
+ 0000b138 , 00000000 ,
+ 0000b13c , 00000000 ,
+ 0000b140 , 003f0020 ,
+ 0000b144 , 00400041 ,
+ 0000b148 , 0140005f ,
+ 0000b14c , 0160015f ,
+ 0000b150 , 017e017f ,
+ 0000b154 , 02410242 ,
+ 0000b158 , 025f0240 ,
+ 0000b15c , 027f0260 ,
+ 0000b160 , 0341027e ,
+ 0000b164 , 035f0340 ,
+ 0000b168 , 037f0360 ,
+ 0000b16c , 04400441 ,
+ 0000b170 , 0460045f ,
+ 0000b174 , 0541047f ,
+ 0000b178 , 055f0540 ,
+ 0000b17c , 057f0560 ,
+ 0000b180 , 06400641 ,
+ 0000b184 , 0660065f ,
+ 0000b188 , 067e067f ,
+ 0000b18c , 07410742 ,
+ 0000b190 , 075f0740 ,
+ 0000b194 , 077f0760 ,
+ 0000b198 , 07800781 ,
+ 0000b19c , 07a0079f ,
+ 0000b1a0 , 07c107bf ,
+ 0000b1a4 , 000007c0 ,
+ 0000b1a8 , 00000000 ,
+ 0000b1ac , 00000000 ,
+ 0000b1b0 , 00000000 ,
+ 0000b1b4 , 00000000 ,
+ 0000b1b8 , 00000000 ,
+ 0000b1bc , 00000000 ,
+ 0000b1c0 , 00000000 ,
+ 0000b1c4 , 00000000 ,
+ 0000b1c8 , 00000000 ,
+ 0000b1cc , 00000000 ,
+ 0000b1d0 , 00000000 ,
+ 0000b1d4 , 00000000 ,
+ 0000b1d8 , 00000000 ,
+ 0000b1dc , 00000000 ,
+ 0000b1e0 , 00000000 ,
+ 0000b1e4 , 00000000 ,
+ 0000b1e8 , 00000000 ,
+ 0000b1ec , 00000000 ,
+ 0000b1f0 , 00000396 ,
+ 0000b1f4 , 00000396 ,
+ 0000b1f8 , 00000396 ,
+ 0000b1fc , 00000196 ,
+here swap - 2 /n* / constant rx-gain-wo-xlna-#row
+
+array-rx-gain-common value array-rx-gain
+rx-gain-common-#row value rx-gain-#row
+
+create array-fast-clk
+here
+ \ Addr 5G_HT20 5G_HT40
+ 00001030 , 00000268 , 000004d0 ,
+ 00001070 , 0000018c , 00000318 ,
+ 000010b0 , 00000fd0 , 00001fa0 ,
+ 00008014 , 044c044c , 08980898 ,
+ 0000801c , 148ec02b , 148ec057 ,
+ 00008318 , 000044c0 , 00008980 ,
+ 00009e00 , 0372131c , 0372131c ,
+ 0000a230 , 0000000b , 00000016 ,
+ 0000a254 , 00000898 , 00001130 ,
+here swap - 2 /n* / constant fast-clk-#row
+
+create array-pcie-serdes
+here
+ \ Addr allmodes
+ 00004040 , 0821265e ,
+ 00004040 , 0008003b ,
+ 00004044 , 00000000 ,
+here swap - 2 /n* / constant pcie-serdes-#row
+
+create array-fast-clock
+here
+ \ Addr 5G_HT20 5G_HT40
+ 00001030 , 00000268 , 000004d0 ,
+ 00001070 , 0000018c , 00000318 ,
+ 000010b0 , 00000fd0 , 00001fa0 ,
+ 00008014 , 044c044c , 08980898 ,
+ 0000801c , 148ec02b , 148ec057 ,
+ 00008318 , 000044c0 , 00008980 ,
+ 00009e00 , 0372131c , 0372131c ,
+ 0000a230 , 0000000b , 00000016 ,
+ 0000a254 , 00000898 , 00001130 ,
+here swap - 3 /n* / constant fast-clock-#row
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/init.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/init.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,839 @@
+purpose: ATH9K initialization
+\ See license at end of file
+
+headers
+hex
+
+0 value rfkill-gpio
+0 value rfkill-polarity
+
+\ cfg-output type definitions
+0 constant GPIO_OUTPUT_MUX_AS_OUTPUT
+1 constant GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED
+2 constant GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED
+3 constant GPIO_OUTPUT_MUX_AS_TX_FRAME
+4 constant GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL
+5 constant GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED
+6 constant GPIO_OUTPUT_MUX_AS_MAC_POWER_LED
+
+: cfg-gpio-input ( gpio -- ) 0 1 rot 2* << 4050 reg@! ;
+: cfg-output ( gpio type -- )
+ over 6 mod 5 * tuck << 1f rot << ( gpio type' mask )
+ 2 pick d# 11 > if 4070 else 2 pick 5 > if 4064 else 4060 then then reg@!
+ 3 swap 2* << dup 4050 reg@! ( )
+;
+: set-gpio ( value gpio -- ) swap 1 and over << 1 rot << 4048 reg@! ;
+: get-gpio ( gpio -- value ) 404c reg@ 1 rot << and ;
+
+\ bt hardware settings
+0 value bt-scheme
+0 value bt-wlanactive-gpio
+0 value bt-active-gpio
+0 value bt-priority-gpio
+0 value bt-coex-mode \ Register setting for AR_BT_COEX_MODE
+0 value bt-coex-weights \ Register setting for AR_BT_COEX_WEIGHT
+0 value bt-coex-mode2 \ Register setting for AR_BT_COEX_MODE2
+
+\ bt-scheme
+0 constant BTCOEX_CFG_NONE,
+1 constant BTCOEX_CFG_2WIRE
+2 constant BTCOEX_CFG_3WIRE
+
+\ bt-mode definitions
+0 constant BT_COEX_MODE_LEGACY \ legacy rx_clear mode
+1 constant BT_COEX_MODE_UNSLOTTED \ untimed/unslotted mode
+2 constant BT_COEX_MODE_SLOTTED \ slotted mode
+3 constant BT_COEX_MODE_DISALBED \ coexistence disabled
+
+\ bt configuration
+BT_COEX_MODE_SLOTTED value bt-mode
+0 value bt-time-extend
+true value bt-txstate-extend?
+true value bt-txframe-extend?
+true value bt-quiet-collision?
+true value bt-hold-rx-clear?
+true value bt-rxclear-polarity?
+2 value bt-priority-time
+5 value bt-first-slot-time
+
+: init-btcoex-hw ( qnum -- )
+ d# 13 << 2.1300 or
+ bt-mode d# 10 << or bt-priority-time d# 18 << or
+ bt-first-slot-time d# 24 << or to bt-coex-mode
+
+ 1.0032 to bt-coex-mode2
+;
+: init-btcoex-2wire ( -- )
+ 1000 100c 405c reg@! \ Connect bt_active to baseband
+ bt-active-gpio d# 16 << f.0000 4060 reg@! \ Input mux bt_active to GPIO
+ bt-active-gpio cfg-gpio-input
+;
+: init-btcoex-3wire ( -- )
+ 1400 dup 405c reg@! \ Connect bt_priority_async and bt_active_async to baseband
+ bt-active-gpio d# 16 << bt-priority-gpio 8 << or
+ f.0f00 4060 reg@! \ Input mux for bt_priority_async and bt_active_async to GPIO
+ bt-active-gpio cfg-gpio-input
+ bt-priority-gpio cfg-gpio-input
+;
+: enable-btcoex-2wire ( -- )
+ bt-wlanactive-gpio GPIO_OUTPUT_MUX_AS_TX_FRAME cfg-output
+;
+: enable-btcoex-3wire ( -- )
+ bt-coex-mode 8170 reg!
+ bt-coex-weights 8174 reg!
+ bt-coex-mode2 817c reg!
+ 2.0000 dup 80fc reg@!
+ 0 10.0000 8120 reg@!
+ bt-wlanactive-gpio GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL cfg-output
+;
+
+: enable-btcoex ( -- )
+ bt-scheme BTCOEX_CFG_2WIRE = if enable-btcoex-2wire then
+ bt-scheme BTCOEX_CFG_3WIRE = if enable-btcoex-3wire then
+ 2 bt-active-gpio 2* << 3 bt-active-gpio 2* << 4090 reg@!
+;
+
+: disable-btcoex ( -- )
+ 0 bt-wlanactive-gpio set-gpio
+ bt-wlanactive-gpio GPIO_OUTPUT_MUX_AS_OUTPUT cfg-output
+ bt-scheme BTCOEX_CFG_3WIRE = if
+ 1c00 8170 reg!
+ 0 8174 reg!
+ 0 817c reg!
+ then
+;
+
+: set-clockrate ( -- )
+ curchan 0= if CLOCK_RATE_CCK
+ else
+ curchan >ch-band @ BAND_2GHZ = if CLOCK_RATE_2GHZ_OFDM
+ else
+ hw-caps HW_CAP_FASTCLOCK and if CLOCK_FAST_RATE_5GHZ_OFDM
+ else CLOCK_RATE_5GHZ_OFDM
+ then then then
+
+ conf-is-ht40? if 2* then to clockrate
+;
+
+: mac>clks ( us -- clks ) clockrate * ;
+: flip-bits ( val n -- val' ) 0 swap 0 do 1 << over i >> 1 and or loop nip ;
+
+: get-ch-edges ( flag -- false | lo hi true )
+ dup CH_5GHZ and if drop d# 4920 d# 6100 true exit then
+ CH_2GHZ and if d# 2312 d# 2372 true exit then
+ false
+;
+
+: get-nic-rev ( -- ) \ ath9k_hw_read_revisions
+ \ macVersion and macRev
+ 4020 reg@ dup h# fffc.0000 and d# 12 >> to macVersion
+ h# f00 and 8 >> to macRev
+ macVersion h# 1c0 = macRev 2 >= and not if
+ ." WARNING: driver may not support this version of Atheros chip" cr
+ then
+;
+
+: roundup/ ( x y -- x/y ) /mod swap if 1+ then ;
+: compute-txtime ( kbps framelen shortpre? phy -- txtime )
+ 3 pick 0= if 4drop 0 exit then
+ case
+ WLAN_RC_PHY_CCK of ( kbps framelen shortpre? )
+ d# 192 swap if 1 >> then ( kbps framelen phytime )
+ -rot 3 << d# 1000 * swap / ( phytime frametime )
+ + d# 10 + ( txtime )
+ endof
+ WLAN_RC_PHY_OFDM of ( kbps framelen shortpre? )
+ drop ( kbps framelen )
+ 3 << d# 22 + swap ( numbits kbps )
+ curchan 0= if ( numbits kbps )
+ 2 << d# 1000 / ( numbits bits/symbol )
+ roundup/ ( numsymbols )
+ 2 << d# 36 + ( txtime )
+ else
+ curchan is-quarter-rate? if ( numbits kbps )
+ 4 << d# 1000 / ( numbits bits/symbol )
+ roundup/ ( numsymbols )
+ 4 << d# 144 + ( txtime )
+ else
+ curchan is-half-rate? if ( numbits kbps )
+ 3 << d# 1000 / ( numbits bits/symbol )
+ roundup/ ( numsymbols )
+ 3 << d# 72 + ( txtime )
+ else ( numbits kbps )
+ 2 << d# 1000 / ( numbits bits/symbol )
+ roundup/ ( numsymbols )
+ 2 << d# 36 + ( txtime )
+ then then then
+ endof
+ ( otherwise ) 3drop 0 swap
+ endcase
+;
+: (test-chip) ( data reg -- error? ) 2dup reg! reg@ <> ;
+: test-chip ( -- error? )
+ 8000 reg@ \ Save register content
+ 0 h# 100 0 do i d# 16 << 8000 (test-chip) or loop
+ h# 5555.5555 8000 (test-chip) or
+ h# aaaa.aaaa 8000 (test-chip) or
+ h# 6666.6666 8000 (test-chip) or
+ h# 9999.9999 8000 (test-chip) or
+ swap 8000 reg! \ Restore register content
+ d# 100 us
+;
+
+: init-defaults ( -- )
+ regulatory /regulatory erase
+ CTRY_DEFAULT regulatory >reg-country !
+ d# 63 regulatory >reg-max-power !
+
+ d# 20 to slottime
+;
+
+: init-post ( -- )
+ init-edata
+ init-ani
+;
+
+\ reset types
+1 constant RESET_WARM
+3 constant RESET_COLD
+
+: WARegVal! ( -- ) WARegVal 4004 reg! d# 10 us ;
+: set-reset ( reset-type -- )
+ WARegVal! 3 704c reg!
+ 4028 reg@ 3000 and if
+ 0 402c reg!
+ 100 4000 reg!
+ then
+ ( reset-type ) 7000 reg!
+ d# 50 us
+ 0 7000 reg!
+ 0 3 7000 wait-hw drop
+ 0 4000 reg!
+;
+: set-reset-power-on ( -- )
+ WARegVal! 3 704c reg!
+ 0 7040 reg!
+ 1 7040 reg!
+ 2 f 7044 wait-hw drop
+ RESET_WARM set-reset
+;
+
+: set-power-awake ( -- )
+ WARegVal!
+ 7044 reg@ f and 1 = if set-reset-power-on then
+ d# 200 0 do
+ 1 1 704c reg@! d# 50 us
+ 7044 reg@ f and 2 = if leave then
+ loop
+ 0 4.0000 8004 reg@!
+;
+
+: fill-cap-info ( -- )
+ eeprom >baseEepHeader >r
+ r@ >regDmn0 le-w@ regulatory >reg-cur-rd !
+ r@ >regDmn1 le-w@ 1f or regulatory >reg-cur-rd-ext !
+ r@ >txrxmask c@ dup f and to rx-chainmask
+ 4 >> to tx-chainmask
+ r@ >deviceCap c@
+ f000 and ?dup if d# 12 >> else d# 128 then to keymax
+
+[ifdef] CONFIG_RFKILL
+ r@ >rfSilent c@ dup to rfsilent
+ dup 1 and if
+ dup 1c and 2 >> to rfkill-gpio
+ dup 2 and 1 >> to rfkill-polarity
+ hw-caps HW_CAP_RFSILENT or to hw-caps
+ then drop
+[then]
+
+ regulatory >reg-cur-rd-ext @ 2 and if b80 else 880 then to reg-cap
+ 6 to bt-active-gpio
+ 5 to bt-wlanactive-gpio
+ BTCOEX_CFG_2WIRE to bt-scheme
+
+ 40d8 reg@ to ent-mode
+ r> >miscConfiguration c@ 8 and if hw-caps HW_CAP_APM or to hw-caps then
+ tx-chainmask get-streams to max-txchains
+;
+
+: init-hw ( -- )
+ get-nic-rev
+ 4004 reg@ 2.4000 or to WARegVal
+ set-reset-power-on
+ init-defaults
+ set-power-awake
+ 9818 reg@ to phyRev
+ 0 config-pci-powersave
+ init-post
+ init-mode-gain-tables
+ fill-cap-info
+;
+
+: init-qos ( -- )
+ 0001.00aa 8118 reg!
+ 0000.3210 811c reg!
+ 0000.0052 8108 reg!
+ 0000.00ff 81ec reg!
+ 8200 81f0 do ffff.ffff i reg! 4 +loop
+;
+
+: init-pll ( ch -- )
+ compute-pll-control 7014 reg!
+ d# 100 us
+ 2 7048 reg!
+;
+
+: init-intr-masks ( -- )
+ 8180.0965 ap-mode? if 1000 or then a0 reg!
+ 80.0000 ac reg!
+ 0 40d4 reg! 0 40c8 reg! 0 40c4 reg! 0 40cc reg!
+;
+
+: set-slottime ( us -- ) mac>clks ffff min 1070 reg! ;
+: set-ack-timeout ( us -- ) mac>clks 3fff min 3fff 8014 reg@! ;
+: set-cts-timeout ( us -- ) mac>clks 3fff min d# 16 << 3fff.0000 8014 reg@! ;
+
+: init-global-settings ( -- )
+ misc-mode ?dup if dup 8120 reg@! then
+
+ curchan ?dup if
+ >ch-band @ BAND_5GHZ = if d# 16 else d# 10 then
+ else d# 10 then ( sifstime )
+ dup slottime coverage-class 3 * + + ( sifstime acktimeout )
+ curchan ?dup if
+ >ch-band @ BAND_2GHZ = if
+ d# 64 + over - slottime - ( sifstime acktimeout' )
+ then
+ then nip ( acktimeout )
+ slottime set-slottime
+ dup set-ack-timeout
+ set-cts-timeout
+;
+
+defer reset-txstatus-ring ' noop to reset-txstatus-ring
+: set-dma ( -- )
+ 5 7 30 reg@! \ MAC DMA read in 128 byte chunks
+ 5 7 34 reg@! \ MAC DMA write in 128 byte chunks
+ 200 8114 reg! \ Setup rx FIFO
+ 101 3f0f 18 reg@! \ Setup rx threshold
+ rx-bufsize rx-status-len - fff and 60 reg! \ Setup rx bufsize
+ 700 8340 reg! \ Setup usable entries in PCU txbuf
+ reset-txstatus-ring
+;
+
+: set-opmode ( -- )
+ 8004 reg@ fffc.ffff and ( val )
+ opmode case
+ IFTYPE_AP of 1001.0000 or 8004 reg! 0 20 14 reg@! endof
+ IFTYPE_ADHOC of 1002.0000 or 8004 reg! 20 20 14 reg@! endof
+ IFTYPE_MESH_POINT of 1002.0000 or 8004 reg! 20 20 14 reg@! endof
+ IFTYPE_STATION of 1000.0000 or 8004 reg! endof
+ IFTYPE_MONITOR of 1000.0000 or 8004 reg! endof
+ endcase
+;
+
+: reset-chip ( ch -- )
+ RESET_WARM set-reset
+ dup init-pll
+ set-rfmode
+;
+
+: change-channel ( ch -- error? )
+ rfbus-req? 0= if drop true exit then
+ dup set-ch-regs
+ dup set-channel
+ set-clockrate
+ dup false set-txpower
+ rfbus-done
+ dup is-ofdm? over is-ht? or if dup set-delta-slope then
+ spur-mitigate
+ false
+;
+
+: set-bssidmask ( -- )
+ bssidmask le-l@ 80e0 reg!
+ bssidmask 4 + le-w@ 80e4 reg!
+;
+: write-associd ( -- )
+ curbssid le-l@ 8008 reg!
+ curbssid 4 + le-w@ curaid 3fff and wljoin 800c reg!
+;
+: reset-bssidmask ( -- )
+ mac-adr @ curbssid @ xor invert bssidmask !
+ mac-adr 4 + w@ curbssid 4 + w@ xor invert ffff and bssidmask 4 + w!
+ set-bssidmask
+;
+
+defer reset-txqueue ' noop to reset-txqueue
+
+: reset-hw ( ch ch-change? -- )
+ tx-chainmask to txchainmask
+ rx-chainmask to rxchainmask
+
+ curchan ?dup if get-nf drop then
+ over >ch-freq @ caldata >cd-ch @ <>
+ 2 pick >ch-flags @ CH_CW_INT not and caldata >cd-chFlags @ CH_CW_INT not and <> or if
+ caldata /caldata erase
+ over init-nfcal-hist
+ then ( ch ch-change? )
+
+ ( ch-change? ) if
+ curchan if
+ dup >ch-freq @ curchan >ch-freq <>
+ over >ch-flags @ CH_ALL and curchan >ch-flags @ CH_ALL and = and if
+ dup change-channel 0= if
+ curchan load-nf
+ true start-nfcal
+ drop exit
+ then
+ then
+ then
+ then
+
+ 1f04 reg@ ff8 and ( ch led )
+ 8058 reg@ 1 max ( ch led defAnt )
+ 8004 reg@ 200.0000 and ( ch led defAnt macStaId1 )
+
+ mark-phy-inactive
+ false to paprd-table-write-done?
+ 3 pick reset-chip
+
+ 2.0000 dup 405c reg@!
+ 3 pick process-ini
+
+ c7ff.0000 ffff.0000 8060 reg@! \ Setup MFP options for CMP
+ 3 pick is-ofdm? 4 pick is-ht? or if 3 pick set-delta-slope then
+ 3 pick spur-mitigate
+ 3 pick set-board-values
+ ( ch led defAnt macStaId1 )
+ mac-adr le-l@ 8000 reg!
+ mac-adr 4 + le-w@ or 8880.0000 or 8004 reg!
+ set-bssidmask
+ ( ch led defAnt )
+ 8058 reg! ( ch led )
+ write-associd
+ ffff.ffff 80 reg!
+ 700 8018 reg!
+
+ set-opmode
+ over set-channel
+ set-clockrate
+
+ d# 10 0 do 1 i << 1000 i na+ reg! loop
+
+ reset-txqueue
+
+ init-intr-masks
+ cache-ani-ini-regs
+ init-qos
+
+ hw-caps HW_CAP_RFSILENT and if rfkill-gpio cfg-gpio-input then
+ init-global-settings
+
+ 2000.0000 dup 8004 reg@!
+ set-dma
+ 8 4088 reg!
+ 7d0.01f4 2c reg!
+
+ over init-bb
+ init-cal
+
+ ( led ) 3 or 1f04 reg!
+
+ in-little-endian? 0= if 5 14 reg! then
+
+ enable-btcoex
+ config-bb-watchdog
+;
+
+: reset-tsf ( -- )
+ 0 20.0000 8244 wait-hw drop
+ 100.0000 8020 reg!
+;
+
+[ifdef] notyet
+struct
+ /n field >bs-nexttbtt
+ /n field >bs-nextdtim
+ /n field >bs-intval
+ /n field >bs-dtimperiod
+ /n field >bs-cfpperiod
+ /n field >bs-cfpmaxduration
+ /n field >bs-cfpnext
+ /n field >bs-timoffset
+ /n field >bs-bmissthreshold
+ /n field >bs-sleepduration
+ /n field >bs-tsfoor-threshold
+constant /beacon-state
+
+/beacon-state buffer: bstate
+
+: tu>us ( tu -- us ) d# 10 << ;
+: init-beacon ( period next -- )
+ opmode IFTYPE_ADHOC = opmode IFTYPE_MESH_POINT = or if
+ 800 dup 30 reg@!
+ 1+ tu>us 821c reg!
+ 80
+ else
+ opmode IFTYPE_AP = if
+ dup tu>us 8200 reg!
+ dup 2 - tu>us 8204 reg!
+ d# 10 - tu>us 8208 reg!
+ 7
+ else
+ 2drop exit
+ then then swap ( flags period )
+
+ dup tu>us dup 8220 reg! dup 8224 reg! dup 8228 reg! 823c reg!
+ 100.0000 and if reset-tsf then
+ dup 8240 reg@! ( )
+;
+
+: set-beacon-timers ( -- )
+ bstate >bs-nexttbtt @ tu>us 8200 reg!
+ bstate >bs-intval @ ffff and tu>us dup 8220 reg! 8224 reg!
+ bstate >bs-bmissthreshold @ ff and 8 << 8018 reg!
+ bstate >bs-nextdtim @ 3 - tu>us 8214 reg!
+ bstate >bs-intval @ ffff and bstate >bs-sleepduration @ max
+ bstate >bs-dtimperiod @ bstate >bs-sleepduration @ max
+ 2dup = if bstate >bs-nextdtim else bstate >bs-nexttbtt then
+ @ ( nextTbtt ) 3 - tu>us 8210 reg!
+ 0a08.0000 80d4 reg!
+ hw-caps HW_CAP_AUTOSLEEP and if a00.0000 else 20.0000 then 80d8 reg!
+ ( dtimperiod ) tu>us 8234 reg!
+ ( beaconintval ) tu>us 8230 reg!
+ 31 dup 8240 reg@!
+ bstate >bs-tsfoor-threshold @ 813c reg!
+;
+[then]
+
+: get-defant ( -- ant ) 8054 reg@ 7 and ;
+: set-defant ( ant -- ) 7 and 8054 reg! ;
+
+\ rxfilter bit definitions
+0001 constant RX_FILTER_UCAST \ Always on
+0002 constant RX_FILTER_MCAST \ Always on
+0004 constant RX_FILTER_BCAST \ Always on
+0008 constant RX_FILTER_CONTROL
+0010 constant RX_FILTER_BEACON \ On for AP
+0020 constant RX_FILTER_PROM \ On if use-promiscuous?
+0080 constant RX_FILTER_PROBEREQ \ On for AP
+0100 constant RX_FILTER_PHYERR
+0200 constant RX_FILTER_MYBEACON \ On for station
+0400 constant RX_FILTER_COMP_BAR \ On if HT
+0800 constant RX_FILTER_COMP_BA
+1000 constant RX_FILTER_UNCOMP_BA_BAR
+4000 constant RX_FILTER_PSPOLL \ On for PSpoll
+2000 constant RX_FILTER_PHYRADAR
+8000 constant RX_FILTER_MCAST_BCAST_ALL \ On for other BSS
+
+: get-rxfilter ( -- bits )
+ 810c reg@
+ 803c reg@
+ over 20 and if RX_FILTER_PHYRADAR or then
+ swap 202.0000 and if RX_FILTER_PHYERR or then
+;
+: set-rxfilter ( bits -- )
+ dup 803c reg!
+ 0 over RX_FILTER_PHYRADAR and if 20 or then
+ swap RX_FILTER_PHYERR and if 202.0000 or then
+ dup 810c reg!
+ if 10 dup else 0 10 then 34 reg@!
+;
+
+: disable-phy ( -- )
+ RESET_WARM set-reset
+ 0 init-pll
+;
+
+: disable-hw ( -- )
+ RESET_COLD set-reset
+ 0 init-pll
+;
+
+: set-txpower-limit ( test? limit -- )
+ d# 63 min regulatory >reg-power-limit !
+ curchan swap set-txpower
+;
+
+: set-mcastfilter ( filter0 filter1 -- ) 8044 reg! 8040 reg! ;
+
+: get-tsf64 ( -- lo hi )
+ 8050 reg@ ( hi1 )
+ d# 10 0 do
+ 804c reg@ ( hi1 lo )
+ 8050 reg@ ( hi1 lo hi2 )
+ rot over = if swap leave then
+ swap ( hi1' lo )
+ loop swap ( lo hi )
+;
+
+: set-tsf64 ( lo hi -- ) swap 804c reg! 8050 reg! ;
+
+: set-tsfadjust ( setting -- )
+ misc-mode swap if 8 or else ffff.fff7 and then
+ to misc-mode
+;
+
+: set-led-brightness ( brightness -- ) LED_OFF = led-pin set-gpio ;
+
+: deinit-leds ( -- ) LED_OFF set-led-brightness ;
+
+: init-leds ( -- )
+ 1 to led-pin
+ led-pin GPIO_OUTPUT_MUX_AS_OUTPUT cfg-output
+ LED_OFF set-led-brightness
+;
+
+: setup-ht-cap ( 'band -- )
+ >r
+ true r@ >band-ht? !
+ HT_CAP_SUP_WIDTH_20_40 HT_CAP_SM_PS or HT_CAP_SGI_40 or HT_CAP_DSSSCCK40 or
+ HT_CAP_TX_STBC or 100 or
+ hw-caps HW_CAP_LDPC and if HT_CAP_LDPC_CODING or then
+ hw-caps HW_CAP_SGI_20 and if HT_CAP_SGI_20 or then
+ r@ >band-ht-cap !
+ HT_MAX_AMPDU_64K r@ >band-ampdu-factor !
+ HT_MPDU_DENSITY_8 r@ >band-ampdu-density !
+ 0 r@ >band-rx-highest !
+ r@ >band-rx-mask d# 10 erase
+ tx-chainmask get-streams ( #txstreams )
+ rx-chainmask get-streams ( #txstreams #rxstreams )
+ 2dup <> if ( #txstreams #rxstreams )
+ over 1- 2 << HT_MCS_TX_RX_DIFF or HT_MCS_TX_DEFINED or
+ else
+ HT_MCS_TX_DEFINED
+ then
+ r@ >band-tx-params ! ( #txstreams #rxstreams )
+ nip ( #rxstreams )
+ r> >band-rx-mask swap ff fill
+;
+
+: init-crypto ( -- )
+ keymax 0 do i reset-key loop
+ misc-mode 4 and if crypt-caps CRYPT_CAP_MIC_COMBINED or to crypt-caps then
+;
+
+: init-btcoex ( -- )
+ bt-scheme BTCOEX_CFG_2WIRE = if init-btcoex-2wire then
+ \ XXX Do not support 3wire
+;
+
+defer setup-descdma ' noop to setup-descdma
+defer init-queues ' noop to init-queues
+
+: init-ch-rates ( -- )
+ band-2GHz sband !
+ band-5GHz sband na1+ !
+
+ band-2GHz >r
+ BAND_2GHZ r@ >band-type !
+ ch-2GHz r@ >band-channel !
+ #ch-2GHz r@ >band-#chan !
+ legacy-rates r@ >band-bitrates !
+ #legacy-rates r> >band-#rate !
+
+ band-5GHz >r
+ BAND_5GHZ r@ >band-type !
+ ch-5GHz r@ >band-channel !
+ #ch-5GHz r@ >band-#chan !
+ legacy-rates 4 + r@ >band-bitrates !
+ #legacy-rates 1- r> >band-#rate !
+;
+
+: init-misc ( -- )
+ \ XXX kick off timer for ath_ani_calibrate
+ hw-caps HW_CAP_HT and if sc-flags SC_OP_TXAGGR or SC_OP_RXAGGR or to sc-flags then
+ true set-diversity
+ get-defant 1 max to rx-defant
+;
+
+: init-softc ( -- )
+ 0 to curaid
+ curbssid /mac-adr erase
+ init-hw
+ init-queues
+ init-btcoex
+ init-ch-rates
+ init-crypto
+ init-misc
+;
+
+: get-extchanmode ( type -- ch-mode )
+ curchan >ch-band @ dup BAND_2GHZ = if
+ drop case
+ NL80211_CHAN_NO_HT of CH_G_HT20 endof
+ NL80211_CHAN_HT20 of CH_G_HT20 endof
+ NL80211_CHAN_HT40PLUS of CH_G_HT40+ endof
+ NL80211_CHAN_HT40MINUS of CH_G_HT40- endof
+ ( otherwise ) 0 swap
+ endcase
+ else
+ BAND_5GHZ = if
+ case
+ NL80211_CHAN_NO_HT of CH_A_HT20 endof
+ NL80211_CHAN_HT20 of CH_A_HT20 endof
+ NL80211_CHAN_HT40PLUS of CH_A_HT40+ endof
+ NL80211_CHAN_HT40MINUS of CH_A_HT40- endof
+ ( otherwise ) 0 swap
+ endcase
+ else
+ drop 0
+ then then
+;
+
+: update-ichannel ( type -- )
+ curchan >ch-band @ BAND_2GHZ = if
+ CH_G curchan >ch-mode !
+ CH_2GHZ CH_OFDM or CH_G or curchan >ch-flags !
+ else
+ CH_A curchan >ch-mode !
+ CH_5GHZ CH_OFDM or curchan >ch-flags !
+ then
+ dup NL80211_CHAN_NO_HT <> if
+ get-extchanmode curchan >ch-mode !
+ else drop then
+;
+
+: init-band-txpower ( band -- )
+ dup >band-#chan @ 0 do ( band )
+ dup i 'band-ch to curchan ( band )
+ NL80211_CHAN_HT20 update-ichannel ( band )
+ true d# 63 set-txpower-limit ( band )
+ regulatory >reg-max-power @ 2/ curchan >ch-max-power ! ( band )
+ loop drop ( )
+;
+
+: init-txpower-limits ( -- )
+ curchan \ Save
+ band-2GHz init-band-txpower
+ band-5GHz init-band-txpower
+ to curchan \ Restore
+;
+
+: set-hw-cap ( -- )
+ band-2GHz setup-ht-cap
+ band-5GHz setup-ht-cap
+;
+
+: is-world-regd? ( -- flag )
+ regulatory >reg-cur-rd @ ffff.bfff and is-wwr-sku?
+;
+
+create def-reg-pair FCC3_FCCA , CTL_FCC , CTL_FCC ,
+: default-init-regd ( -- )
+ \ XXX US: channels 1-11 are valid, no mid-band channels in 5GHz band
+ CTRY_UNITED_STATES regulatory >reg-country !
+ def-reg-pair regulatory >reg-pair !
+ ascii U regulatory >reg-alpha2 c!
+ ascii S regulatory >reg-alpha2 1+ c!
+;
+defer init-regd ' default-init-regd to init-regd
+
+defer init-tx ' noop to init-tx
+defer init-rx ' noop to init-rx
+
+: init-le ( -- )
+ \ Determine processor's endianness
+ opencount @ \ Save opencount
+ h# 12345678 dup opencount !
+ opencount le-l@ = to in-little-endian?
+ opencount ! \ Restore opencount
+;
+
+: init-device ( -- )
+ init-le
+ init-softc
+ set-hw-cap
+ init-regd
+ init-tx
+ init-rx
+ init-txpower-limits
+ dummy-rssi to last-rssi
+ init-leds
+;
+
+: disable-interrupts ( -- )
+ 0 24 reg! 24 reg@ drop
+ 0 403c reg! 403c reg@ drop
+ 0 402c reg! 402c reg@ drop
+;
+: set-interrupts ( -- )
+ \ XXX
+;
+
+defer start-receive ' noop to start-receive
+defer stop-tx ' noop to stop-tx
+defer stop-rx ' noop to stop-rx
+
+: re-set-channel ( ch# -- ) \ 0 based
+ 'channel
+ stop-tx
+ stop-rx
+ ( ch ) true reset-hw
+ start-receive
+ false regulatory >reg-power-limit @ set-txpower-limit
+ set-interrupts
+;
+
+: reset ( -- )
+ disable-interrupts
+ stop-tx
+ stop-rx
+ curchan false reset-hw
+ start-receive
+ false regulatory >reg-power-limit @ set-txpower-limit
+ set-interrupts
+;
+
+: start ( -- )
+ 0 config-pci-powersave
+ defch 'channel false reset-hw
+ false regulatory >reg-power-limit @ set-txpower-limit
+ start-receive
+ set-interrupts
+ ff55 a8a8 wljoin to bt-coex-weights
+ enable-btcoex
+ 80 my-b@ fc and 80 my-b! \ Disable ASPM
+;
+
+: stop ( -- )
+ disable-btcoex
+ disable-interrupts
+ stop-rx
+ disable-phy
+ disable-hw
+ 1 config-pci-powersave
+;
+
+[ifdef] notyet
+: set-coverage-class ( cc -- )
+ to coverage-class
+ init-global-settings
+;
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/key.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/key.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,150 @@
+purpose: ATH9K key cache manipulation
+\ See license at end of file
+
+headers
+hex
+
+0 value keymax
+0 value crypt-caps
+1 constant CRYPT_CAP_CIPHER_AESCCM
+2 constant CRYPT_CAP_MIC_COMBINED
+
+/mac-adr buffer: keymac
+0 value keyptr
+0 value rxmicptr
+0 value txmicptr
+: set-key-mac ( idx -- )
+ 5 << 8800 + ( reg-base )
+ keymac le-l@ 1 >> keymac 4 + le-w@ 1 and d# 31 << or ( reg-base macL )
+ over d# 24 + reg! ( reg-base )
+ keymac c@ 1 and if 0 else 8000 then ( reg-base unicast )
+ keymac 4 + le-w@ 1 >> or ( reg-base macH )
+ swap d# 28 + reg! ( )
+;
+
+: set-key-entry ( type idx -- )
+ tuck 5 << 8800 + ( idx type reg-base )
+ keyptr le-l@ over reg!
+ keyptr 4 + le-w@ over 4 + reg!
+ keyptr 6 + le-l@ over 8 + reg!
+ keyptr d# 10 + le-w@ over d# 12 + reg!
+ keyptr d# 12 + le-l@ over d# 16 + reg!
+ d# 20 + reg!
+ ( idx ) set-key-mac
+;
+: set-key-wep ( -- )
+ wep1 to keyptr
+ /wep1 5 = if KEYTABLE_TYPE_40 0 set-key-entry then
+ /wep1 d# 13 = if KEYTABLE_TYPE_104 0 set-key-entry then
+ wep2 to keyptr
+ /wep2 5 = if KEYTABLE_TYPE_40 1 set-key-entry then
+ /wep2 d# 13 = if KEYTABLE_TYPE_104 1 set-key-entry then
+ wep3 to keyptr
+ /wep3 5 = if KEYTABLE_TYPE_40 2 set-key-entry then
+ /wep3 d# 13 = if KEYTABLE_TYPE_104 2 set-key-entry then
+ wep4 to keyptr
+ /wep4 5 = if KEYTABLE_TYPE_40 3 set-key-entry then
+ /wep4 d# 13 = if KEYTABLE_TYPE_104 3 set-key-entry then
+;
+: set-key-aes ( -- )
+ p-aes to keyptr
+ KEYTABLE_TYPE_CCM pair-idx set-key-entry
+;
+: set-key-aes-group ( -- )
+ g-aes to keyptr
+ KEYTABLE_TYPE_CCM grp-idx set-key-entry
+;
+: set-tkip-entry ( type idx -- )
+ tuck 5 << 8800 + ( idx type reg-base )
+ keyptr le-l@ invert over reg!
+ keyptr 4 + le-w@ invert over 4 + reg!
+ keyptr 6 + le-l@ over 8 + reg!
+ keyptr d# 10 + le-w@ over d# 12 + reg!
+ keyptr d# 12 + le-l@ over d# 16 + reg!
+ ( type ) tuck d# 20 + reg!
+ swap set-key-mac ( reg-base )
+
+ rxmicptr le-l@ over 800 + reg!
+ txmicptr 2 + le-w@ over 804 + reg!
+ rxmicptr 4 + le-l@ over 808 + reg!
+ txmicptr le-w@ over 80c + reg!
+ txmicptr 4 + le-l@ over 810 + reg!
+ KEYTABLE_TYPE_CLR over 814 + reg!
+ 0 over 818 + reg!
+ 0 over 81c + reg!
+
+ keyptr le-l@ over reg!
+ keyptr 4 + le-w@ swap 4 + reg!
+;
+: set-key-tkip ( -- )
+ p-tkip to keyptr
+ p-tkip d# 24 + to rxmicptr
+ p-tkip d# 16 + to txmicptr
+ KEYTABLE_TYPE_TKIP pair-idx set-tkip-entry
+;
+: set-key-tkip-group ( -- )
+ keymac /mac-adr erase 1 keymac c!
+ g-tkip to keyptr
+ ap-mode? if
+ g-tkip d# 16 + to rxmicptr
+ g-tkip d# 16 + to txmicptr
+ else
+ g-tkip d# 24 + to rxmicptr
+ g-tkip d# 24 + to txmicptr
+ then
+ KEYTABLE_TYPE_TKIP grp-idx set-tkip-entry
+;
+
+: set-key-cache ( -- )
+ target-mac keymac /mac-adr move
+ key-wep? if set-key-wep exit then
+ pkey-tkip? if set-key-tkip then
+ pkey-aes? if set-key-aes then
+\ keymac c@ 1 or keymac c! \ Multicast key for AP or adhoc
+ gkey-tkip? if set-key-tkip-group then
+ gkey-aes? if set-key-aes-group then
+;
+
+: reset-key ( i -- )
+ dup 5 << 8800 + ( i reg-base )
+ dup d# 20 + reg@ swap ( i type reg-base )
+ 0 over reg! 0 over 4 + reg!
+ 0 over 8 + reg! 0 over d# 12 + reg!
+ 0 over d# 16 + reg! 7 over d# 20 + reg! \ CLR
+ 0 over d# 24 + reg! 0 swap d# 28 + reg! ( i type )
+ 4 = if \ TKIP ( i )
+ d# 64 + 5 << 8800 + ( reg-base )
+ 0 over reg! 0 over 4 + reg!
+ 0 over 8 + reg! 0 over d# 12 + reg!
+ 0 over d# 16 + reg! 7 over d# 20 + reg! \ CLR if MIC_COMBINED
+ then drop
+;
+
+: reset-key-cache ( -- )
+ keymax 0 do i reset-key loop
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/mac.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/mac.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,835 @@
+purpose: ATH9K MAC layer
+\ See license at end of file
+
+headers
+hex
+
+\ =======================================================================
+\ Driver variables
+\ =======================================================================
+
+\ driver-state definitions
+0 constant ds-ready \ Initial state, can probe/scan/authenticate
+1 constant ds-associated \ Associated and WPA key handshake ok
+2 constant ds-disconnected \ Disconnected
+
+ds-ready instance value driver-state
+
+: set-driver-state ( state -- ) to driver-state ;
+: reset-driver-state ( -- ) ds-ready to driver-state ;
+: process-disconnect ( -- )
+ ds-disconnected set-driver-state
+ reset-key-cache
+ false to wep-enabled?
+ false to gkey-enabled?
+ false to pkey-enabled?
+;
+
+\ bss-type values
+1 constant bss-type-managed
+2 constant bss-type-adhoc
+bss-type-managed value bss-type
+
+0 value currate
+0 value basic-rate
+0 value basic-rate-hw-val
+0 value pkt-type
+true value basic-rate-erp?
+
+d# 256 buffer: ssid
+0 value /ssid
+: ssid$ ( -- $ ) ssid /ssid ;
+d# 34 instance buffer: scan-ssid
+
+0 value tx-tkip-iv16 0 value rx-tkip-iv16
+0 value tx-tkip-iv32 0 value rx-tkip-iv32
+6 constant /pn
+/pn buffer: tx-pn /pn buffer: rx-pn \ Big endian
+
+0 value atim
+d# 11 value channel
+d# 80 buffer: wpa-ie \ WPA IE saved for EAPOL phases
+0 value /wpa-ie
+
+external
+: wpa-ie$ ( -- adr len ) wpa-ie /wpa-ie ;
+headers
+
+\ Miscellaneous
+0 value preamble \ 0=long, 2=short, 4=auto
+0 value auth-mode \ 0: open; 1: shared key; 2: EAP
+h# 401 value cap \ Capabilities
+false value passive-scan?
+defer setup-data-series ' noop to setup-data-series
+
+: currate>bitrate ( -- rate ) currate 'legacy-rates >br-bitrate @ ;
+: bitrate>idx ( bitrate -- idx )
+ 0 swap #legacy-rates 0 do ( hw-val bitrate )
+ i 'legacy-rates >br-bitrate @ over = if
+ nip i swap leave
+ then
+ loop drop
+;
+: bitrate>hw-val ( bitrate -- hw-val )
+ bitrate>idx
+ 'legacy-rates preamble if >br-hw-val-short else >br-hw-val then @
+;
+: is-common-rate? ( bitrate -- common? )
+ 5 / 0 swap ( common? rate )
+ #rates 0 do
+ common-rates i + c@ 7f and over = if nip true swap leave then
+ loop drop
+;
+: find-fastest-rate ( adr len -- rateidx )
+ 0 -rot bounds do i c@ 7f and max loop ( rate )
+ 0 swap ( rateidx rate )
+ #rates 0 do supported-rates i + c@ over = if nip i swap leave then loop
+ drop ( rateidx' )
+;
+: (find-basic-rate) ( br-flag -- rate )
+ 0 swap
+ #legacy-rates 0 do ( rate br-flag )
+ dup i 'legacy-rates >br-flags @ and if
+ i 'legacy-rates >br-bitrate @ dup is-common-rate? if
+ currate>bitrate over >= if
+ rot max swap
+ else drop then
+ else drop then
+ then ( rate' br-flag )
+ loop
+ drop
+ ?dup 0= if
+ curchan is-2GHz? if band-2GHz else band-5GHz then
+ >band-channel @ >br-bitrate @
+ then
+;
+: find-basic-rate ( -- rate )
+ curchan is-5GHz? if br-mand-a
+ else
+ curchan is-b? if br-mand-b else br-mand-g then
+ then
+ (find-basic-rate)
+;
+
+external
+: set-atim-window ( n -- ) d# 50 min to atim ;
+: set-preamble ( preamble -- ) ( XXX to preamble ) drop ;
+: set-cap ( cap -- ) to cap ;
+: set-auth-mode ( amode -- ) to auth-mode ;
+: set-bss-type ( bssType -- ok? ) to bss-type true ;
+: set-country-info ( adr len -- ) 2drop ; \ XXX Country IE, affect regulatory
+: set-ssid ( adr len -- )
+ 2dup " mesh" $= if true to passive-scan? then
+
+ h# 32 min scan-ssid pack drop
+;
+: supported-rates$ ( -- adr len ) supported-rates #rates ;
+: set-common-rates ( adr len -- )
+ 2dup find-fastest-rate to currate
+ common-rates #rates erase
+ #rates min common-rates swap move
+ find-basic-rate to basic-rate
+ basic-rate bitrate>hw-val to basic-rate-hw-val
+ basic-rate bitrate>idx 'legacy-rates >br-flags @ br-erp-g and to basic-rate-erp?
+ setup-data-series
+;
+: disconnected? ( -- flag ) driver-state ds-disconnected = ;
+
+headers
+: link-up? ( -- flag ) driver-state ds-associated = ;
+
+: null$ ( -- adr len ) " " ;
+: zero$ ( -- adr len ) " "(00 00 00 00 00 00)" ;
+: broadcast-mac$ ( -- adr len ) " "(ff ff ff ff ff ff)" ;
+
+0 value supplicant-ih
+: $call-supplicant ( ...$ -- ... ) supplicant-ih $call-method ;
+: supplicant-associate ( -- flag ) " do-associate" $call-supplicant ;
+: supplicant-process-eapol ( adr len -- ) " process-eapol" $call-supplicant ;
+: .scan ( adr -- ) " .scan" $call-supplicant ;
+: .ssids ( adr -- ) " .ssids" $call-supplicant ;
+: rc4 ( data$ key$ -- ) " rc4" $call-supplicant ;
+
+: invalid-rssi ( -- rssi ) 80 ;
+defer rx-rssi ( -- rssi ) ['] invalid-rssi to rx-rssi
+defer ?process-eapol ( adr len -- ) ['] 2drop to ?process-eapol
+
+d# 24 constant /802.11-data-hdr \ Basic data frame header len
+rx-bufsize constant /packet-buf
+0 value packet-buf
+0 instance value seq#
+
+: alloc-packet ( -- )
+ packet-buf 0= if /packet-buf dma-alloc to packet-buf then
+;
+: free-packet ( -- )
+ packet-buf if
+ packet-buf /packet-buf dma-free
+ 0 to packet-buf
+ then
+;
+
+true instance value got-data?
+true instance value got-response?
+0 instance value /respbuf
+/packet-buf instance buffer: respbuf
+0 instance value /data
+0 instance value data
+
+/802.11-data-hdr d# 22 + constant /rx-min \ MAC header + ethernet header with SNAP
+
+false value HT-mode?
+
+: seq#++ ( -- ) seq# h# 20 + to seq# ; \ The 4 LSBs are the fragment number
+: addr4-present? ( adr -- present? ) le-w@ h# 300 and h# 300 = ;
+: QoS-present? ( adr -- present? ) le-w@ h# 88 and h# 88 = ;
+: HT-present? ( adr -- present? ) dup QoS-present? swap le-w@ h# 8000 and or ;
+
+: /802.11n-data-hdr ( adr -- len )
+ /802.11-data-hdr
+ over addr4-present? if 6 + then
+ swap QoS-present? if HT-mode? if 6 else 2 then + then
+;
+
+: snap-header " "(aa aa 03 00 00 00)" ;
+
+\ MAC frame format:
+\ Frame header
+\ 2-byte frame control
+\ 2-byte duration/id
+\ 6-byte address 1
+\ 6-byte address 2
+\ 6-byte address 3
+\ 2-byte sequence control
+\ 6-byte address 4
+\ 2-byte QoS control
+\ 4-byte HT control
+\ 0-7955 bytes frame body
+\ 4-byte FCS
+
+\ The low byte of the frame control word is:
+\ ssssTTpp
+\ pp is protocol version, always 00
+\ TT is type, 00 for management, 01 (i.e. 4) control, 10 (i.e. 8) data, 11 reserved
+\ ssss is subtype
+\ Management subtypes are:
+\ 0000 (00) Association request
+\ 0001 (10) Association response
+\ 0010 (20) Reassociation request
+\ 0011 (30) Reassociation response
+\ 0100 (40) Probe request
+\ 0101 (50) Probe response
+\ 0110-0111 (60-70) Reserved
+\ 1000 (80) Beacon
+\ 1001 (90) ATIM
+\ 1010 (a0) Disassociation
+\ 1011 (b0) Authentication
+\ 1100 (c0) Deauthentication
+\ 1101 (d0) Action
+\ 1110 (e0) Action No Ack
+\ 1111 (f0) Reserved
+\ Control subtypes are (other codes are reserved):
+\ 0111 (74) Control Wrapper
+\ 1000 (84) Block Ack Request
+\ 1001 (94) Block Ack
+\ 1010 (a4) PS-Poll
+\ 1011 (b4) RTS
+\ 1100 (c4) CTS
+\ 1101 (d4) ACK
+\ 1110 (e4) CF End
+\ 1111 (f4) CF End + CF ACK
+\ Data subtypes are (other codes are reserved):
+\ 0000 (08) Data
+\ 0001 (18) Data+CF-ACK
+\ 0010 (28) Data+CF-Poll
+\ 0011 (38) Data+CF-ACK+CF-Poll
+\ 0100 (48) Null (no data)
+\ 0101 (58) CF-ACK (no data)
+\ 0110 (68) CF-Poll (no data),
+\ 0111 (78) CF-ACK+CF-Poll (no-data)
+
+\ The upper byte of the frame control word is:
+\ bit 7 Order: set to 1 in a non-QoS STA transmits using the StrictlyOrdered service class;
+\ set to 1 in a QoS data or management frame, it indicates that the HT Control field exists
+\ bit 6 Protected Frame: set if the frame body is encrypted
+\ bit 5 More Data: set to indicate to a STA in PS mode that more data are buffered for that STA
+\ bit 4 Power Management: set if STA is to be in PS mode with a frame exchange
+\ bit 3 Retry: set if the frame is a retransmission
+\ bit 2 More Fragment
+\ bit 1 From DS
+\ bit 0 To DS
+\
+\ From/TO DS
+\ 00 All management and control frames, data frames within an IBSS
+\ 01 Data frames transmitted from a STA in an infrastructure network
+\ 10 Data frames received for a STA in an infrastructure network
+\ 11 Data frames on a "wireless bridge"
+
+\ Duration/ID
+\ 0-7fff Duration (in us) used to set the NAV (network allocation vector)
+\ 8000 Contention free transmission, NAV=8000
+\ c001-c7d7 AID (BSS associated ID) in PS-Poll frames
+\
+\ Sequence control
+\ ssss.ssss.ssss.ffff
+
+\ QoS control
+\ Applicable Frames bits 15-0
+\ QoS CF-Poll, CF-ACK+Poll by HC llll.llll.raae.tid
+\ QoS Data+CF-Poll, Data+CF-ACK+Poll by HC llll.llll.paae.tid
+\ QoS Data, Data+CF-ACK by HC bbbb.bbbb.paae.tid
+\ QoS Null by HC bbbb.bbbb.raae.tid
+\ QoS Data, Data+CF-ACK by non-AP STA dddd.dddd.paa0.tid
+\ qqqq.qqqq.paa1.tid
+\ QoS Null by non-AP STA dddd.dddd.raa0.tid
+\ qqqq.qqqq.raa1.tid
+\
+\ tid: 0-7 user priority; 8-f transmit stream id
+\ e: EOSP (end of service period)
+\ aa: ACK policy
+\ 00 normal or implicit block ACK
+\ 01 no ACK
+\ 10 no explicit or PSMP ack (power save mult poll)
+\ 11 block ACK
+\ r: reserved
+\ p: A-MSDU present
+\ l's: TXOP limit
+\ b's: AP PS buffer state
+\ llll.ppsr
+\ llll: total PS buffer size in units of 4096 bytes
+\ pp: AC of the highest priority traffic buffered at the AP
+\ s: buffered state, set if llll and pp are valid
+\ d's: TXOP duration requested
+\ q's: Queue size in units of 256 bytes
+
+\ HT control: present for Control Wrapper Frame and Order=1 for Qos frames
+\ bit 31 RDG/More PPDU, depends on RD initiator/responder
+\ bit 30 AC constraint, 0=response may contain data frames from any TID
+\ 1=response may contain data frames only rom the same AC
+\ bit 24 NDP Announcement, 1=null data packet will follow
+\ bit 22:23 CSI/Steering
+\ 0=no feedback required, 1=CSI, 2=noncompressed beamforming, 3=compressed beamforming
+\ bit 18:19 Calibration sequence
+\ bit 16:17 Calibration position
+\ 0=not a calibration frame, 1=start, 2=sounding response, 3=complete
+\ bit 0:15 Link Adaptation Control
+\ bit 9:15 MFB/ASELC, 127=no feedback, if MAI<>e, recommended MFB
+\ if MAI=e, dddddccc
+\ ccc command ddddd
+\ 0 Transmit Antenna Selection Sounding Indication 0-15
+\ 1 Transmit Antenna Selection Sounding Request 0
+\ Transmit ASEL Sounding Resumption 1-15
+\ 2 Receive Antenna Selection Sounding Indication 0-15
+\ 3 Receive Antenna Selection Sounding Request 0-15
+\ 4 Sounding Label 0-15
+\ 5 No feedback due to ASEL training failure 0-15
+\ 6 TXASSI-request feedback of explicit CSI 0-15
+\ bit 6:8 MFSI, MSI value, 7=unsolicited MFB
+\ bit 2:5 MAI, e=ASELI, iiiq: MRQ sequence id (MSI) & MCS request
+\ bit 1 TRQ Training request
+
+\ =================================================================================
+\ Process received MAC frames
+\ =================================================================================
+
+struct
+ /n field >dadr
+ /n field >dlen
+constant /qentry
+0 instance value qhead \ Retrieve from qhead
+0 instance value qend \ Insert to qend
+0 instance value queue
+d# 128 constant /queue
+
+: qend++ ( -- )
+ qend 1+ dup /queue = if drop 0 then
+ dup qhead = if ." WARNING: queue overflow" cr drop else to qend then
+;
+: qhead++ ( -- ) qhead 1+ dup /queue = if drop 0 then to qhead ;
+: queue-adr ( idx -- adr ) /qentry * queue + ;
+: qhead-adr ( -- adr ) qhead queue-adr ;
+: qend-adr ( -- adr ) qend queue-adr ;
+: init-queue ( -- )
+ queue 0= if
+ /qentry /queue * alloc-mem to queue
+ then
+ 0 to qhead 0 to qend
+;
+: enque ( adr len -- )
+ \ Remove snap header
+ over d# 14 + snap-header comp 0= if ( adr len )
+ 8 - dup alloc-mem dup qend-adr >dadr ! ( adr len' qadr )
+ over qend-adr >dlen ! ( adr len qadr )
+ rot 2dup d# 12 move ( len qadr adr ) \ Copy MAC addresses
+ d# 20 + -rot swap d# 12 /string ( adr qadr len )
+ else
+ dup alloc-mem dup qend-adr >dadr ! ( adr len qadr )
+ over qend-adr >dlen ! swap ( adr qadr len )
+ then
+ move \ Copy the rest
+ qend++
+;
+: deque ( adr len -- actual )
+ qhead qend = if 2drop 0 exit then
+ qhead-adr >dadr @ ( adr len qadr )
+ qhead-adr >dlen @ ( adr len qadr qlen )
+ rot min rot swap ( qadr adr actual )
+ dup >r move ( qadr qlen ) ( R: actual )
+ free-mem r> ( actual )
+;
+
+: skip-802.11n-data-hdr ( adr len -- adr' len' )
+ \ Go to the payload, skipping the MAC frame header
+ over /802.11n-data-hdr /string ( adr' len' )
+;
+
+: skip-802.11n-mgr-hdr ( adr len -- adr' len' )
+ \ Go to the payload, skipping the MAC frame header
+ over HT-present? if 4 else 0 then
+ /802.11-data-hdr + /string ( adr' len' )
+;
+
+0 value rs-rssi
+: compute-avgbrssi ( -- )
+ rx-rssi sign-c dup to rs-rssi
+ -80 <> if
+ rs-rssi d# -20 >= if
+ rs-rssi 7 <<
+ last-rssi dummy-rssi <> if
+ last-rssi 9 * + d# 10 /
+ then to last-rssi
+ then
+ then
+ last-rssi dummy-rssi = if
+ rs-rssi
+ else
+ last-rssi 7 >> last-rssi 7f and 40 >= if 1+ then
+ then 0 max
+ dup to rs-rssi to avgbrssi
+;
+: ?compute-avgbrssi ( adr -- )
+ d# 16 + target-mac$ comp 0= if compute-avgbrssi then
+;
+: (process-mgt) ( adr len -- )
+ drop dup >r c@ case
+ 80 of r@ ?compute-avgbrssi endof
+ 90 of " ATIM" vtype endof
+ a0 of " Disassociated" vtype process-disconnect endof
+ c0 of " Deauthenticated" vtype process-disconnect endof
+ d0 of " ACTION" vtype endof
+ endcase
+ r> drop
+;
+
+0 instance value resp-type
+: process-mgt ( adr len -- )
+ over c@ resp-type = to got-response?
+ 2dup (process-mgt)
+ got-response? if
+ dup to /respbuf
+ respbuf swap move
+ else
+ 2drop
+ then
+;
+
+: process-ctl ( adr len -- ) " Got a control frame" vtype vcdump ;
+
+\ XXX For TKIP and AES, should check duplicate sequence number
+: 802.11n>ethernet ( adr len -- adr' len' )
+ over >r ( adr len ) ( R: adr )
+ \ Skip 802.11n header
+ r@ /802.11n-data-hdr ( adr len slen ) ( R: adr )
+ r@ le-w@ 4000 and if \ Skip IV or CCMP header
+ key-wep? if 4 else 8 then +
+ then
+ \ Skip snap header, if any
+ dup r@ + snap-header comp 0= if 6 + then ( adr len slen' ) ( R: adr )
+ \ Recreate ethernet header
+ d# 12 - /string ( adr' len' ) ( R: adr )
+ \ Move source mac
+ r@ d# 16 + 2 pick /mac-adr + /mac-adr move ( adr' len' ) ( R: adr )
+ \ Move destination mac
+ r> 4 + 2 pick /mac-adr move ( adr' len' )
+;
+
+: (process-data) ( adr len -- )
+ 802.11n>ethernet to /data to data ( )
+ true to got-data?
+ data d# 12 + be-w@ h# 888e = if \ Pass EAPOL messages to supplicant
+ data /data ?process-eapol
+ then
+
+;
+: do-process-eapol ( adr len -- ) false to got-data? supplicant-process-eapol ;
+
+: process-subframe ( adr len -- )
+ over d# 12 + le-w@ min ( adr len' )
+ swap d# 14 + swap ( adr' len )
+ enque ( )
+;
+: process-a-msdu ( adr len -- )
+ \ A-MSDU subframe 1, A-MSDU subframe 2, ...
+ \ A-MSDU subframe header: 6-byte DA, 6-byte SA, 2-byte length
+ \ 0-2304 bytes of MSDU, 0-3 padding bytes
+
+ \ XXX unpack, return first packet, queue the rest
+ dup /rx-min < if exit then \ Invalid data packet: too small
+ skip-802.11n-data-hdr \ Skip to the subframes
+ ( adr len )
+ begin ?dup while ( adr len )
+ 2dup process-subframe ( adr len )
+ over d# 12 + le-w@ 4 round-up d# 14 + /string ( adr' len' )
+ 0 min ( adr len )
+ repeat drop
+;
+\ XXX Need to be able to process QoS data...
+: process-data ( adr len -- )
+ over le-w@ h# f0 and 0= if
+ (process-data)
+ else
+ 2drop
+ then
+;
+
+\ XXX Take care of multicast packets.
+: rx-for-me? ( adr -- mine? )
+ 4 + dup broadcast-mac$ comp 0= if
+ d# 12 + mac-adr$ comp \ Filter out msg I send
+ dup if ascii b else ascii x then vemit
+ exit
+ then
+ dup c@ 1 and if ascii m vemit drop false exit then
+ mac-adr$ comp 0= dup if ascii u else ascii o then vemit
+;
+: process-rx ( adr len -- )
+ false to got-data?
+ false to got-response?
+ over rx-for-me? 0= if 2drop exit then
+ over le-w@ h# c and case \ Frame control type
+ 0 of process-mgt endof \ Management
+ 4 of process-ctl endof \ Control
+ 8 of process-data endof \ Data
+ ( otherwise ) debug-me nip nip
+ endcase
+;
+
+\ =================================================================================
+\ Create MAC frames
+\ =================================================================================
+
+0 value x \ Temporary variables to assist frame creation
+0 value /x
+
+: set-x ( offset adr -- ) to x to /x ;
+: 'x ( -- adr ) x /x + ;
+: +x ( n -- ) /x + to /x ;
+: +x$ ( $ -- ) 'x swap dup +x move ;
+: +xl ( n -- ) 'x le-l! /l +x ;
+: +xw ( n -- ) 'x le-w! /w +x ;
+: +xb ( n -- ) 'x c! /c +x ;
+: +xbl ( n -- ) 'x be-l! /l +x ;
+: +xerase ( n -- ) 'x over erase +x ;
+
+: set-802.11-data-hdr ( adr3$ adr2$ adr1$ duration frame-type -- )
+ 0 packet-buf set-x
+ dup to pkt-type
+ +xw ( adr3$ adr2$ adr1$ duration )
+ +xw ( adr3$ adr2$ adr1$ )
+ +x$ ( adr3$ adr2$ )
+ +x$ ( adr3$ )
+ +x$ ( )
+ seq# +xw seq#++ ( )
+ resp-wait-short to resp-wait
+;
+
+: set-802.11n-data-hdr ( HT QoS adr4$ adr3$ adr2$ adr1$ duration frame-type -- )
+ set-802.11-data-hdr ( HT QoS adr4$ )
+ x addr4-present? if +x$ else 2drop then ( HT QoS )
+ x QoS-present? if +xw else drop then ( HT )
+ HT-mode? if +xw else drop then ( )
+;
+
+: set-802.11n-mgr-hdr ( BSSID$ DA$ duration frame-type -- )
+ 0 packet-buf set-x
+ dup to pkt-type
+ ( frame-type ) +xw \ Frame control
+ ( duration ) +xw \ Duration
+ ( DA$ ) +x$ \ Destination MAC
+ mac-adr$ +x$ \ Source MAC
+ ( BSSID$ ) +x$ \ BSSID
+ seq# +xw seq#++ \ Sequence #
+ resp-wait-long to resp-wait
+
+;
+
+\ Time in us for one ACK and one SIFS interval; management frame only
+: nav ( -- duration )
+ curchan is-2GHz? if
+ preamble if d# 218 else d# 314 then
+ else
+ d# 55 \ 5GHz band
+ then
+;
+
+\ Time in us for one ACK and one SIFS interval; unicast data frame only
+: data-nav ( len -- duration )
+ 4 + basic-rate swap ( rate len' )
+ curchan is-5GHz? basic-rate-erp? or if
+ 8 * d# 22 + d# 10 * swap 2 << /mod swap if 1+ then 2 << ( duration )
+ d# 36 + ( duration' )
+ else
+ d# 80 * swap /mod swap if 1+ then ( duration )
+ preamble if d# 106 else d# 202 then + ( duration' )
+ then
+;
+
+: get-iv ( -- iv )
+ 804c reg@ \ Timestamp
+ dup ff00 and ff00 = if ( iv )
+ dup d# 16 >> ff and ( iv iv.hi )
+ dup 3 >= swap /wep1 3 + < and if 100 + then
+ then ( iv' )
+
+ 8 << wep-idx 6 << or ( iv' ) \ In big endian
+;
+d# 16 buffer: rc4key
+: make-rc4key ( iv.lo iv.mi iv.hi -- )
+ rc4key d# 16 erase
+ rc4key c! rc4key 1+ c! rc4key 2 + c!
+ wep-idx wep-key$ rc4key 3 + swap move
+;
+: compute-icv ( adr len -- icv ) " $crc" evaluate ;
+: encrypt-wep ( adr len -- ) rc4key /wep1 3 + rc4 ;
+0 value au-dt-adr
+0 value /au-dt
+: make-authenticate-req ( [challenge$] seq target-mac$ -- adr len )
+ over target-mac$ move
+ 2dup nav
+ 5 pick 3 = if h# 40b0 else h# b0 then set-802.11n-mgr-hdr
+
+ dup 1 = if
+ auth-mode +xw \ Authentication algorithm
+ ( seq ) +xw \ Authentication sequence number
+ 0 +xw \ Status code
+ else
+ get-iv lbsplit 3dup make-rc4key \ Generate iv and rc4key
+ +xb +xb +xb +xb \ IV
+ 'x to au-dt-adr /x to /au-dt \ Save data adr/len to be encrypted
+ auth-mode +xw ( challenge$ seq )
+ ( seq ) +xw \ Authentication sequence number
+ 0 +xw \ Status code
+ d# 16 +xb dup +xb +x$ \ Challenge text
+ /x /au-dt - to /au-dt \ Update data len
+ au-dt-adr /au-dt compute-icv +xl \ ICV
+ au-dt-adr /au-dt 4 + encrypt-wep \ Encrypt data + ICV
+ then
+ x /x ( adr len )
+;
+
+: make-deauthenticate-req ( target-mac$ -- adr len )
+ 2dup nav h# c0 set-802.11n-mgr-hdr
+ 3 +xw \ Reason code: station is leaving
+ x /x
+;
+
+: make-disassociate-req ( target-mac$ -- adr len )
+ 2dup nav h# a0 set-802.11n-mgr-hdr
+ 3 +xw \ Reason code: station is leaving
+ x /x
+;
+
+: save-associate-params ( ch ssid$ target-mac$ -- ch ssid$ target-mac$ )
+ over target-mac$ move
+ 2over dup to /ssid
+ ssid swap move
+ 4 pick to channel
+;
+: save-wpa-ie ( boffset eoffset -- )
+ over - to /wpa-ie \ Len of wpa-ie
+ x + wpa-ie /wpa-ie move \ Copy IE
+;
+: moui ( ct -- ) ct-tkip = if moui-tkip else moui-aes then ;
+: oui ( ct -- ) ct-tkip = if oui-tkip else oui-aes then ;
+
+: make-associate-req ( ch ssid$ target-mac$ -- adr len )
+ save-associate-params
+ 2dup nav 0 set-802.11n-mgr-hdr
+
+ cap +xw \ Capability info: ESS, short slot, WEP
+ d# 300 +xw \ Listen interval
+
+ \ SSID
+ 0 +xb \ element ID = SSID
+ dup +xb \ len
+ ( ssid$ ) +x$ \ SSID
+
+ \ DS param
+ 3 +xb \ element ID = DS param set
+ 1 +xb \ len
+ ( ch ) +xb \ channel
+
+ \ Common supported rates
+ 1 +xb \ element ID = rates
+ #rates 8 min +xb \ len
+ common-rates #rates 8 min +x$ \ common supported data rates
+
+ \ Extended common supported rates
+ #rates 8 > if
+ d# 50 +xb \ element ID = Extended rates
+ #rates 8 - +xb \ len
+ common-rates 8 + #rates 8 - +x$ \ common supported data rates
+ then
+
+ \ RSN (WPA2)
+ ktype kt-wpa2 = if
+ /x \ Save beginning offset
+ d# 48 +xb \ element ID = RSN
+ d# 20 +xb \ len
+ 1 +xw \ version
+ ctype-g oui +xbl \ group cipher suite
+ 1 +xw \ count of pairwise cipher suite
+ ctype-p oui +xbl \ pairwise cipher suite
+ 1 +xw \ count of authentication suite
+ aoui +xbl \ authentication suite
+ 0 +xw \ RSN capabilities
+ /x save-wpa-ie \ Save IE in wpa-ie
+ then
+
+ \ WPA param
+ ktype kt-wpa = if
+ /x \ Save beginning offset
+ d# 221 +xb \ element ID = WPA
+ d# 22 +xb \ len
+ wpa-tag +xbl \ WPA-specific tag
+ 1 +xw \ version
+ ctype-g moui +xbl \ group cipher suite
+ 1 +xw \ count of pairwise cipher suite
+ ctype-p moui +xbl \ pairwise cipher suite
+ 1 +xw \ count of authentication suite
+ amoui +xbl \ authentication suite
+ /x save-wpa-ie \ Save IE in wpa-ie
+ then
+
+ x /x
+;
+
+: make-probe-req ( ssid$ target-mac$ -- )
+ 2dup 0 h# 40 set-802.11n-mgr-hdr
+
+ 0 +xb dup +xb ( ssid$ ) +x$
+ 1 +xb #rates 8 min dup +xb supported-rates swap +x$
+ #rates 8 > if
+ d# 50 +xb #rates 8 - dup +xb supported-rates over + swap +x$
+ then
+
+ x /x
+;
+
+: +wep-iv ( -- ) get-iv lbsplit +xb +xb +xb +xb ;
+: tx-tkip-iv++ ( -- )
+ tx-tkip-iv16 1+ dup to tx-tkip-iv16
+ 0= if tx-tkip-iv32 1+ to tx-tkip-iv32 then
+;
+: +tkip-iv ( -- )
+ tx-tkip-iv++
+ tx-tkip-iv16 wbsplit dup +xb 20 or 7f and +xb +xb 20 +xb
+ tx-tkip-iv32 +xl
+;
+: tx-pn++ ( -- )
+ tx-pn 2 + be-l@ 1+ dup tx-pn 2 + be-l!
+ 0= if tx-pn be-w@ 1+ tx-pn be-w! then
+;
+: +ccmp-hdr ( -- )
+ tx-pn++
+ tx-pn 4 + be-w@ +xw
+ 0 +xb
+ 20 +xb
+ tx-pn be-l@ +xl
+;
+: protect-data? ( -- flag ) key-enabled? ?dup 0= if key-wpax? then ;
+\ XXX Right now, support only managed mode; adhoc in the future
+: make-data-frame ( adr len -- adr' len' )
+ over /mac-adr mac-adr$ target-mac$ d# 10 data-nav
+ 108 key-enabled? if 4000 or then set-802.11-data-hdr
+ key-enabled? if
+ key-wep? if
+ +wep-iv
+ else
+ pkey-tkip? if +tkip-iv else +ccmp-hdr then
+ then
+ then
+ snap-header +x$
+ ( adr len ) d# 12 /string +x$
+ x /x
+;
+
+\ =================================================================================
+\ Create "libertas" like scan results to match supplicant package expectation:
+\ - 2 bytes of ??
+\ - 1 byte of # of APs scanned
+\ - AP[#AP]
+\
+\ Each AP[] has:
+\ - 2 bytes of length (does not include these 2 bytes)
+\ - 6 bytes AP ethernet address
+\ - 1 byte of RSSI
+\ - frame body of probe request or beacon
+\
+\ Assumption: respbuf /respbuf has the data to be put here
+\ =================================================================================
+
+0 instance value scanbuf \ Save original buffer address
+0 instance value /scanbuf \ Save original buffer size
+0 value /tsbuf \ Current size of data in scanbuf
+: scanbuf-have-room? ( -- ok? )
+ /respbuf respbuf /802.11n-data-hdr - 9 + \ Space needed
+ /scanbuf /tsbuf - \ Space available
+ <= ( ok? )
+;
+: add-scan-response ( -- )
+ scanbuf-have-room? 0= if ." Run out of scan buffer space" cr exit then
+ scanbuf 2 + c@ 1+ scanbuf 2 + c! \ Increment #APs
+ /tsbuf scanbuf set-x \ Get to the next buffer location for the new AP
+ respbuf /respbuf skip-802.11n-mgr-hdr ( rbuf' rlen' )
+ dup 7 + +xw \ length of AP data
+ respbuf d# 10 + /mac-adr +x$ \ AP mac address
+ rx-rssi +xb \ RSSI
+ +x$ \ AP data
+ /x to /tsbuf
+;
+: start-scan-response ( target-adr target-len -- )
+ to /scanbuf to scanbuf
+ 0 scanbuf set-x
+ 0 +xw \ 2 unknown bytes
+ 0 +xb \ #APs
+ /x to /tsbuf
+;
+: restart-scan-response ( -- ) scanbuf /scanbuf start-scan-response ;
+: get-scan-actual ( -- actual ) /tsbuf ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+
Added: dev/ath9k/paprd.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/paprd.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,428 @@
+purpose: ATH9K PAPRD code
+\ See license at end of file
+
+headers
+hex
+
+: get-streams ( chainmask -- #1bits )
+ ( val ) 0 3 0 do over i >> 1 and + loop nip
+;
+
+: enable-paprd ( flag -- )
+ dup if
+ true to paprd-table-write-done?
+ curchan false set-txpower
+ then
+ dup 1 98f0 reg@!
+ tx-chainmask 2 and if dup 1 a8f0 reg@! then
+ tx-chainmask 4 and if dup 1 b9f0 reg@! then
+ drop
+;
+
+[ifdef] notyet
+0 value paprd-training-power
+d# 32 /n* buffer: paprd-gain-table-entry
+d# 32 buffer: paprd-gain-table-index
+
+: get-training-power-2G ( -- power )
+ eeprom >modalHeader2G >papdRateMaskHt20 le-l@ d# 25 >> 7 and
+ paprd-target-power over - abs dup ( power delta delta )
+ a3d0 reg@ 3f and ( power delta delta scale )
+ > if 2drop -1 exit then ( power delta )
+ dup 4 < if + 4 - then ( power' )
+;
+
+: get-training-power-5G ( -- power )
+ curchan >ch-freq @ d# 5700 >= if
+ eeprom >modalHeader5G >papdRateMaskHt20 le-l@ d# 25 >>
+ else
+ curchan >ch-freq @ d# 5400 >= if
+ eeprom >modalHeader5G >papdRateMaskHt40 le-l@ d# 28 >>
+ else
+ eeprom >modalHeader5G >papdRateMaskHt40 le-l@ d# 25 >>
+ then then 7 and ( scale )
+
+ curchan is-ht40? if a3dc else a3d4 then reg@ 8 >> 3f and over +
+ ( scale power )
+ paprd-target-power over - abs ( scale power delta )
+ rot > if drop -1 exit then ( power )
+ tx-chainmask get-streams 2* + ( power' )
+;
+
+create ctrl0 98f0 , a8f0 , b8f0 ,
+create ctrl1 98f4 , a8f4 , b8f4 ,
+: setup-paprd-single-table ( -- )
+ curchan is-2GHz? if get-training-power-2G else get-training-power-5G then
+ dup 0< if
+ " ERROR: PAPRD target power out of training range" vtype
+ drop exit
+ then
+ to paprd-training-power
+
+ paprd-ratemask 1ff.ffff 98e4 reg@!
+ paprd-ratemask 1ff.ffff 98e8 reg@!
+ paprd-ratemask-ht40 1ff.ffff 98ec reg@!
+
+ max-txchains 0 do
+ 1800.0002 f800.0002 ctrl0 i na+ @ reg@!
+ 02d2.0006 0fff.fe07 ctrl1 i na+ @ reg@!
+ loop
+
+ false enable-paprd
+ 0003.0c39 0003.ff7f a690 reg@!
+ d# 147 a694 reg!
+ 244e.1eb1 2fff.ffff a698 reg@!
+ 0064.0190 03ff.ffff a69c reg@!
+ d# 261376 3.ffff 9900 reg@!
+ d# 248079 3.ffff 9904 reg@!
+ d# 233759 3.ffff 9908 reg@!
+ d# 330464 3.ffff 990c reg@!
+ d# 208194 3.ffff 9910 reg@!
+ d# 196949 3.ffff 9914 reg@!
+ d# 185706 3.ffff 9918 reg@!
+ d# 175487 3.ffff 991c reg@!
+;
+
+: get-paprd-gain-table ( -- )
+ d# 32 0 do
+ a500 i la+ reg@
+ dup paprd-gain-table-entry i na+ !
+ d# 24 >> paprd-gain-table-index i + c!
+ loop
+;
+
+0 value desired-scale
+0 value alpha-therm
+0 value alpha-volt
+0 value therm-cal-val
+0 value volt-cal-val
+0 value therm-val
+0 value volt-val
+: get-desired-gain ( target-power chain -- desired-gain )
+ 0 1 a6a0 reg@!
+ a42a reg@ 3e00.0000 and d# 25 >> to desired-scale
+ a440 reg@ 001f.00ff and dup d# 16 >> to alpha-volt
+ ff and to alpha-therm
+ a43c reg@ 0000.ffff and dup 8 >> to volt-cal-val
+ ff and to therm-cal-val
+ a454 reg@ 0000.ffff and dup 8 >> to volt-val
+ ff and to therm-val
+ ( chain ) 1000 * a420 + reg@ ff.0000 and d# 16 >>
+ dup d# 128 > if d# 256 - then - ( desired-gain )
+ alpha-therm therm-val therm-cal-val - * d# 128 + 8 >>a -
+ alpha-volt volt-val volt-cal-val - * d# 64 + 7 >>a -
+ desired-scale + ( desired-gain' )
+;
+
+: force-tx-gain ( gain-idx -- )
+ paprd-gain-table-entry swap na+ @ ( gain-entry )
+ 00ff.ffff and 1 << 01ff.ffff a458 reg@! ( )
+ 0 3f a3f8 reg@!
+;
+
+: setup-paprd-gain-table ( chain -- )
+ paprd-training-power swap get-desired-gain
+ 0 swap d# 32 0 do ( idx desired-gain )
+ paprd-gain-table-index i + c@ over >= if nip i swap leave then
+ loop drop ( idx )
+ force-tx-gain
+ 0 1 a6a0 reg@!
+;
+
+: init-paprd-table ( -- )
+ setup-paprd-single-table
+ get-paprd-gain-table
+;
+
+: populate-paprd-single-table ( chain caldata -- )
+ dup >pa-table 2 pick d# 24 * na+ ( chain caldata patable[chain] )
+ 2 pick 1000 * 9920 + ( chain caldata patable[chain] reg )
+ d# 24 0 do
+ over i na+ @ over i na+ reg!
+ loop 2drop ( chain caldata )
+
+ >small-signal-gain over na+ @ ( chain small-signal-gain[chain] )
+ swap 1000 * 98f8 + ( small-signal-gain[chain] reg )
+ 3ff swap reg@! ( )
+ paprd-training-power 3 << 1f8 98f4 reg@!
+ tx-chainmask 2 and if paprd-training-power 3 << 1f8 a8f4 reg@! then
+ tx-chainmask 4 and if paprd-training-power 3 << 1f8 b8f4 reg@! then
+;
+
+: paprd-done? ( -- done? ) a6a0 reg@ 1 and ;
+
+\ Arguments from create-paprd-curve
+d# 48 2* /n* buffer: data-buf
+0 value data-l
+0 value data-u
+
+\ Local variables
+d# 24 constant #bin
+#bin /n* constant /binbuf
+/binbuf buffer: theta
+/binbuf buffer: y
+/binbuf buffer: yest
+/binbuf buffer: xest
+/binbuf buffer: xtilde
+/binbuf buffer: b1tmp
+/binbuf buffer: b2tmp
+/binbuf buffer: PAin
+0 value max-idx
+0 value accum-cnt
+0 value G-fxp
+0 value cM
+0 value cI
+0 value cL
+0 value sum-y2
+0 value sum-y4
+0 value xtilde-abs
+0 value Qx
+0 value Qb1
+0 value Qb2
+0 value beta
+0 value alpha
+0 value beta-raw
+0 value alpha-raw
+0 value scale-b
+0 value Qscale-b
+0 value Qbeta
+0 value Qalpha
+0 value order1-5x
+0 value order2-3x
+0 value order1-5x-rem
+0 value order2-3x-rem
+
+\ Local routines
+: data-l@ ( i -- n ) data-l swap na+ @ ;
+: data-u@ ( i -- n ) data-u swap na+ @ ;
+: xtilde@ ( i -- n ) xtilde swap na+ @ ;
+: xtilde! ( n i -- ) xtilde swap na+ ! ;
+: xest@ ( i -- n ) xest swap na+ @ ;
+: xest! ( n i -- ) xest swap na+ ! ;
+: theta@ ( i -- n ) theta swap na+ @ ;
+: theta! ( n i -- ) theta swap na+ ! ;
+: y@ ( i -- n ) y swap na+ @ ;
+: y! ( n i -- ) y swap na+ ! ;
+: yest@ ( i -- n ) yest swap na+ @ ;
+: yest! ( n i -- ) yest swap na+ ! ;
+: b1tmp@ ( i -- n ) b1tmp swap na+ @ ;
+: b1tmp! ( n i -- ) b1tmp swap na+ ! ;
+: b2tmp@ ( i -- n ) b2tmp swap na+ @ ;
+: b2tmp! ( n i -- ) b2tmp swap na+ ! ;
+: PAin@ ( i -- n ) PAin swap na+ @ ;
+: PAin! ( n i -- ) PAin swap na+ ! ;
+: scale@ ( n -- scale ) log2 d# 10 - 0 max ;
+: up>> ( n scale -- n' ) 1 over << 1- rot + swap >> ;
+: up>>a ( n scale -- n' ) 1 over << 1- rot + swap >>a ;
+: up/ ( n r -- r' ) tuck 1- + swap / ;
+
+: (create-paprd-curve) ( pa-table gain -- error? )
+ y /binbuf erase yest /binbuf erase theta /binbuf erase
+ xest /binbuf erase xtilde /binbuf erase
+ 0 to max-idx
+ #bin 1- 0 do
+ i data-l@ ffff and dup to accum-cnt d# 16 > if \ Enough samples
+ \ sum of tx amplitude
+ i data-l@ d# 16 >> i data-u@ 7ff and wljoin 5 <<
+ accum-cnt up/ 5 up>> i 1+ xest!
+ \ sum of rx amplitude to lower bin edge
+ i data-u@ d# 11 >> 1f and i d# 23 + data-l@ ffff and 5 << or 5 <<
+ accum-cnt up/ 5 up>> max-idx 5 << + d# 16 + i 1+ y!
+ \ sum of angles
+ i d# 23 + data-l@ d# 16 >> i d# 23 + data-u@ 7ff and wljoin
+ dup 400.0000 >= if 800.0000 - then 5 <<
+ accum-cnt up/ i 1+ theta!
+ max-idx 1+ to max-idx
+ then
+ loop
+
+ \ Find average theta of first 5 bin and all of those to same value.
+ \ Curve is linear at that range.
+ 0 6 0 do i theta@ + loop 5 / ( pa-table gain theta-avg )
+ 6 0 do dup i theta! loop ( pa-table gain theta-avg )
+ max-idx 1+ 0 do i theta@ over - i theta! loop drop
+
+ 6 xest@ 3 xest@ = if 2drop true exit then \ Low signal gain
+
+ 6 y@ 3 y@ - 8 << 6 xest@ 3 xest@ - up/
+ ?dup 0= if 2drop true exit then \ Prevent divide by 0
+ dup to G-fxp
+
+ 0 xest@ 3 xest@ - * d# 256 up/ 3 y@ + ( pa-table gain y-intercept )
+ max-idx 1+ 0 do i y@ over - i yest! loop drop
+ 4 0 do
+ i 5 << dup i yest!
+ ( yest[i] ) 8 << G-fxp up/ i xest!
+ loop
+
+ max-idx yest@ ?dup 0= if 2drop true exit then
+
+ max-idx xest@ over 8 << G-fxp up/ - swap up/ case
+ 0 of d# 10 endof
+ 1 of 9 endof
+ ( otherwise ) 8 swap
+ endcase to cM
+ max-idx 1 >> 7 min to cI
+ max-idx cI - 1+ to cL
+
+ 0 to sum-y2 0 to sum-y4 0 to xtilde-abs
+ false cL 0 do ( pa-table gain false )
+ i cI + yest@ ?dup 0= if drop true leave then
+ ( pa-table gain false yest[i+cI] )
+ i cI + xest@ over 8 << - G-fxp up/ cM << over up/
+ cM << over up/
+ cM << over up/
+ dup i xtilde! ( pa-table gain false yest[i+cI] xtilde[i] )
+ abs dup xtilde-abs > if to xtilde-abs else drop then
+ dup * d# 64 up/ ( pa-table gain false yest[i+cI]**2 )
+ dup sum-y2 + to sum-y2 ( pa-table gain false yest[i+cI]**2 )
+ dup i b2tmp! ( pa-table gain false yest[i+cI]**2 )
+ dup cL * i b1tmp! ( pa-table gain false yest[i+cI]**2 )
+ dup * sum-y4 + to sum-y4 ( pa-table gain false )
+ loop
+ if 2drop true exit then
+
+ 0 0 cL 0 do ( pa-table gain max-b1-abs max-b2-abs )
+ i b1tmp@ sum-y2 - dup i b1tmp!
+ abs rot max swap ( pa-table gain max-b1-abs' max-b2-abs )
+ sum-y4 i b2tmp@ sum-y2 * - dup i b2tmp!
+ abs max ( pa-table gain max-b1-abs max-b2-abs' )
+ loop
+
+ ( max-b2-abs ) scale@ to Qb2
+ ( max-b1-abs ) scale@ to Qb1
+ xtilde-abs scale@ to Qx
+ 0 to beta-raw 0 to alpha-raw
+ cL 0 do
+ i xtilde@ Qx >>a dup i xtilde! ( pa-table gain xtilde[i] )
+ i b1tmp@ Qb1 >>a dup i b1tmp! ( pa-table gain xtilde[i] b1tmp[i] )
+ over * beta-raw + to beta-raw ( pa-table gain xtilde[i] )
+ i b2tmp@ Qb2 >>a dup i b2tmp! ( pa-table gain xtilde[i] b2tmp[i] )
+ * alpha-raw + to alpha-raw ( pa-table gain )
+ loop
+
+ sum-y4 3 >>a cL * sum-y2 dup 3 >>a * 3 << - ( pa-table gain scale-b )
+ dup abs scale@ dup to Qscale-b >>a ( pa-table gain scale-b' )
+ ?dup 0= if 2drop true exit then to scale-b ( pa-table gain )
+
+ beta-raw dup abs scale@ dup to Qbeta >>a dup to beta-raw
+ d# 10 << scale-b / to beta
+ alpha-raw dup abs scale@ dup to Qalpha >>a dup to alpha-raw
+ d# 10 << scale-b / to alpha
+
+ cM 3 * Qx - d# 10 + Qscale-b + dup
+ Qb1 - Qbeta - 5 /mod to order1-5x to order1-5x-rem
+ Qb2 - Qalpha - 3 /mod to order2-3x to order2-3x-rem
+
+ #bin 0 do
+ i 5 << ( pa-table gain i*32 )
+ beta over * order1-5x 6 + >> ( pa-table gain i*32 y5 )
+ 4 0 do over * order1-5x >> loop ( pa-table gain i*32 y5' )
+ order1-5x-rem >> ( pa-table gain i*32 y5' )
+ swap alpha ( pa-table gain y5 i*32 y3 )
+ 3 0 do over * order2-3x >> loop ( pa-table gain y5 i*32 y3' )
+ order2-3x-rem >> ( pa-table gain y5 i*32 y3' )
+ swap 8 << G-fxp / + + i PAin! ( pa-table gain )
+ i 2 >= if
+ i PAin@ i 1- PAin@ < if
+ i 1- PAin@ dup i 2 - PAin@ - + i PAin!
+ then
+ then
+ i PAin@ d# 1400 min i PAin!
+ loop
+
+ 0 to beta-raw 0 to alpha-raw
+ cL 0 do
+ i cI + yest@ ( pa-table gain yest[i+cI] )
+ i cI + theta@ cM << over up/ ( pa-table gain yest[i+cI] theta~ )
+ cM << over up/ ( pa-table gain yest[i+cI] theta~' )
+ cM << swap up/ ( pa-table gain theta~' )
+ dup i b1tmp@ * beta-raw + to beta-raw
+ i b2tmp@ * alpha-raw + to alpha-raw
+ loop
+
+ beta-raw dup abs scale@ dup to Qbeta >>a to beta-raw
+ alpha-raw dup abs scale@ dup to Qalpha >>a to alpha-raw
+
+ alpha-raw d# 10 << scale-b / to alpha
+ beta-raw d# 10 << scale-b / to beta
+ cM 3 * Qx - d# 10 + Qscale-b + 5 + dup
+ Qb1 - Qbeta - 5 /mod to order1-5x to order1-5x-rem
+ Qb2 - Qalpha - 3 /mod to order2-3x to order2-3x-rem
+
+ #bin 0 do
+ i 4 <> if
+ i 4 < if
+ 0 ( pa-table gain pa-angle )
+ else
+ i 5 <<
+ beta 0>= if
+ beta over * order1-5x 6 + >>
+ else
+ beta over * order1-5x 6 + up>>a
+ then
+ 4 0 do over * order1-5x >>a loop
+ order1-5x-rem >>a ( pa-table gain i*32 y5 )
+
+ swap alpha 0>= if
+ alpha over * order2-3x >>
+ else
+ alpha over * order2-3x up>>a
+ then
+ over * order2-3x >>a swap * order2-3x >>a order2-3x-rem >>a
+ ( pa-table gain y5 y3 )
+ + d# -150 max d# 150 min ( pa-table gain pa-angle )
+ then
+ dup 7ff and i PAin@ 7ff and d# 11 << or 3 pick i na+ ! \ pa-table[i] !
+ i 5 = if
+ 1+ 1 >> 7ff and i 1- PAin@ 7ff and d# 11 << or 2 pick i 1- na+ ! \ pa-table[i-1] !
+ else
+ drop
+ then
+ then
+ loop
+
+ G-fxp swap ! drop false ( false )
+;
+
+: create-paprd-curve ( caldata chain -- error? )
+ 2dup d# 24 /n* * swap >pa-table + dup d# 24 /n* erase
+ ( caldata chain 'pa-table[chain] )
+ data-buf to data-l
+ data-buf d# 48 /n* + to data-u
+ 0 8 a370 reg@!
+ d# 48 0 do 9b00 i na+ reg@ data-l i na+ ! loop
+ 8 8 a370 reg@!
+ d# 48 0 do 9b00 i na+ reg@ data-u i na+ ! loop
+
+ rot >small-signal-gain rot + ( 'pa-table[chain] 'small-signal-gain[chain] )
+ (create-paprd-curve) if true exit then
+ 0 1 a6a0 reg@!
+ false
+;
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/phy.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/phy.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,1173 @@
+purpose: ATH9K PHY code
+\ See license at end of file
+
+headers
+
+decimal
+0 constant CTRY_DEFAULT
+840 constant CTRY_UNITED_STATES
+hex
+
+0199 constant WORLD
+
+3a constant FCC3_FCCA
+
+10 constant CTL_FCC
+ff constant NO_CTL
+
+\ targetPowerHTRates
+0 dup constant HT_TARGET_RATE_0_8_16
+1+ dup constant HT_TARGET_RATE_1_3_9_11_17_19
+1+ dup constant HT_TARGET_RATE_4
+1+ dup constant HT_TARGET_RATE_5
+1+ dup constant HT_TARGET_RATE_6
+1+ dup constant HT_TARGET_RATE_7
+1+ dup constant HT_TARGET_RATE_12
+1+ dup constant HT_TARGET_RATE_13
+1+ dup constant HT_TARGET_RATE_14
+1+ dup constant HT_TARGET_RATE_15
+1+ dup constant HT_TARGET_RATE_20
+1+ dup constant HT_TARGET_RATE_21
+1+ dup constant HT_TARGET_RATE_22
+1+ constant HT_TARGET_RATE_23
+
+\ targetPowerLegacyRates
+0 dup constant LEGACY_TARGET_RATE_6_24
+1+ dup constant LEGACY_TARGET_RATE_36
+1+ dup constant LEGACY_TARGET_RATE_48
+1+ constant LEGACY_TARGET_RATE_54
+
+\ targetPowerCckRates
+0 dup constant LEGACY_TARGET_RATE_1L_5L
+1+ dup constant LEGACY_TARGET_RATE_5S
+1+ dup constant LEGACY_TARGET_RATE_11L
+1+ constant LEGACY_TARGET_RATE_11S
+
+\ ar9300_Rates
+0 dup constant ALL_TARGET_LEGACY_6_24
+1+ dup constant ALL_TARGET_LEGACY_36
+1+ dup constant ALL_TARGET_LEGACY_48
+1+ dup constant ALL_TARGET_LEGACY_54
+1+ dup constant ALL_TARGET_LEGACY_1L_5L
+1+ dup constant ALL_TARGET_LEGACY_5S
+1+ dup constant ALL_TARGET_LEGACY_11L
+1+ dup constant ALL_TARGET_LEGACY_11S
+1+ dup constant ALL_TARGET_HT20_0_8_16
+1+ dup constant ALL_TARGET_HT20_1_3_9_11_17_19
+1+ dup constant ALL_TARGET_HT20_4
+1+ dup constant ALL_TARGET_HT20_5
+1+ dup constant ALL_TARGET_HT20_6
+1+ dup constant ALL_TARGET_HT20_7
+1+ dup constant ALL_TARGET_HT20_12
+1+ dup constant ALL_TARGET_HT20_13
+1+ dup constant ALL_TARGET_HT20_14
+1+ dup constant ALL_TARGET_HT20_15
+1+ dup constant ALL_TARGET_HT20_20
+1+ dup constant ALL_TARGET_HT20_21
+1+ dup constant ALL_TARGET_HT20_22
+1+ dup constant ALL_TARGET_HT20_23
+1+ dup constant ALL_TARGET_HT40_0_8_16
+1+ dup constant ALL_TARGET_HT40_1_3_9_11_17_19
+1+ dup constant ALL_TARGET_HT40_4
+1+ dup constant ALL_TARGET_HT40_5
+1+ dup constant ALL_TARGET_HT40_6
+1+ dup constant ALL_TARGET_HT40_7
+1+ dup constant ALL_TARGET_HT40_12
+1+ dup constant ALL_TARGET_HT40_13
+1+ dup constant ALL_TARGET_HT40_14
+1+ dup constant ALL_TARGET_HT40_15
+1+ dup constant ALL_TARGET_HT40_20
+1+ dup constant ALL_TARGET_HT40_21
+1+ dup constant ALL_TARGET_HT40_22
+1+ dup constant ALL_TARGET_HT40_23
+1+ constant /RateTable
+
+\ This function takes the channel value in MHz and sets
+\ hardware channel value. Assumes writes have been enabled to analog bus.
+\
+\ Actual Expression,
+\
+\ For 2GHz channel,
+\ Channel Frequency = (3/4) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17)
+\ (freq_ref = 40MHz)
+\
+\ For 5GHz channel,
+\ Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^10)
+\ (freq_ref = 40MHz/(24>>amodeRefSel))
+\
+\ For 5GHz channels which are 5MHz spaced,
+\ Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17)
+\ (freq_ref = 40MHz)
+
+: get-chan-centers ( ch -- ctl-center ext-center synth-center )
+ dup >ch-freq @ over is-ht40? not if nip dup dup exit then
+ swap >ch-mode @ CH_HT40+ and if ( sc )
+ d# 10 + ( sc' )
+ dup d# 10 - swap ( cc sc )
+ dup d# 10 + swap ( cc ec sc )
+ else
+ d# 10 - ( sc' )
+ dup d# 10 + swap ( cc sc )
+ dup d# 10 - swap ( cc ec sc )
+ then
+;
+
+: set-xpa-bias-level ( is2GHz? -- )
+ if modalHeader2G else modalHeader5G then >xpaBiasLvl c@
+ dup 8 << 300 16288 reg@!
+ 2 >> 4 or 7 16290 reg@!
+;
+
+: set-ant-ctrl ( is2GHz? -- )
+ if modalHeader2G else modalHeader5G then
+ dup >antCtrlCommon le-l@ ffff and ffff a288 reg@!
+ dup >antCtrlCommon2 le-l@ ff.ffff and ff.ffff a28c reg@!
+ >antCtrlChain dup le-w@ fff and fff a284 reg@!
+ wa1+ dup le-w@ fff and fff b284 reg@!
+ wa1+ le-w@ fff and fff c284 reg@!
+;
+
+: set-drive-strength ( -- )
+ baseEepHeader >miscConfiguration c@ 1 and 0= if exit then
+ 00b6.db40 00ff.ffc0 160c0 reg@!
+ b6db.6da0 ffff.ffe0 160c4 reg@!
+ b680.0000 ff80.0000 160cc reg@!
+;
+
+\ Arguments for interpolate-power
+8 /n* buffer: px
+8 /n* buffer: py
+\ Local variables for interpolate-power
+false value lhave 0 value lx 0 value ly
+false value hhave 0 value hx 0 value hy
+\ Returns the interpolated y value corresponding to the specified x value
+\ from the np ordered pairs of data (px,py).
+\ The pairs do not have to be in any order.
+\ If the specified x value is less than any of the px,
+\ the returned y value is equal to the py for the lowest px.
+\ If the specified x value is greater than any of the px,
+\ the returned y value is equal to the py for the highest px.
+\
+: set-hhave ( idx -- )
+ px over na+ @ to hx
+ py swap na+ @ to hy
+ true to hhave
+;
+: set-lhave ( idx -- )
+ px over na+ @ to lx
+ py swap na+ @ to ly
+ true to lhave
+;
+: interpolate-power ( x #p -- y )
+ \ identify best lower and higher x calibration measurement
+ false to lhave false to hhave
+ 0 do
+ dup px i na+ @ - ( x dx )
+ dup 0<= if
+ hhave if
+ 2dup swap hx - > if i set-hhave then
+ else
+ i set-hhave
+ then
+ then
+ dup 0>= if
+ lhave if
+ 2dup swap lx - < if i set-lhave then
+ else
+ i set-lhave
+ then
+ then drop
+ loop ( x )
+
+ lhave if
+ hhave if
+ hx lx = if ly else dup lx hx ly hy interpolate then
+ else ly then
+ else
+ hhave if hy else c000.0000 then
+ then nip
+;
+
+: get-atten-chain ( ch chain -- atten )
+ over is-2ghz? if
+ modalHeader2G >xatten1DB + c@ nip
+ else
+ base_ext2 >xatten1DBLow over + c@ if
+ base_ext2 >xatten1DBLow over + c@ py !
+ modalHeader5G >xatten1DB over + c@ py na1+ !
+ base_ext2 >xatten1DBHigh + c@ py 2 na+ !
+ d# 5180 px ! d# 5500 px na1+ ! d# 5785 px 2 na+ !
+ ( ch ) >ch-freq @ 3 interpolate-power
+ else
+ modalHeader5G >xatten1DB + c@ nip
+ then
+ then
+;
+: get-atten-chain-margin ( ch chain -- atten )
+ over is-2ghz? if
+ modalHeader2G >xatten1Margin + c@ nip
+ else
+ base_ext2 >xatten1MarginLow over + c@ if
+ base_ext2 >xatten1MarginLow over + c@ py !
+ modalHeader5G >xatten1Margin over + c@ py na1+ !
+ base_ext2 >xatten1MarginHigh + c@ py 2 na+ !
+ d# 5180 px ! d# 5500 px na1+ ! d# 5785 px 2 na+ !
+ ( ch ) >ch-freq @ 3 interpolate-power
+ else
+ modalHeader5G >xatten1Margin + c@ nip
+ then
+ then
+;
+
+create ext-atten-reg 9e18 , ae18 , be18 ,
+: set-atten ( ch -- )
+ 3 0 do
+ dup i get-atten-chain 3f and ( ch atten )
+ over i get-atten-chain-margin 1f and d# 12 << or ( ch atten' )
+ 1.f03f ext-atten-reg i na+ @ reg@!
+ loop drop
+;
+
+: set-internal-regulator ( -- )
+ baseEepHeader >featureEnable c@ 10 and if
+ 0 1 700c reg@!
+ baseEepHeader >swreg le-l@ 7008 reg!
+ 1 1 700c reg@!
+ else
+ 4 0 7048 reg@! \ Force sw regulator
+ then
+;
+
+: set-board-values ( ch -- )
+ dup is-2ghz? set-xpa-bias-level
+ dup is-2ghz? set-ant-ctrl
+ set-drive-strength
+ ( ch ) set-atten
+ set-internal-regulator
+;
+
+: get-tgt-pwr2G ( freq idx -- power )
+ 3 0 do
+ eeprom >calTarget_freqbin_2G i + c@ fbin2freq2G px i na+ !
+ dup i calTargetPower2G@ py i na+ !
+ loop drop
+ ( freq ) 3 interpolate-power
+;
+: get-tgt-pwr5G ( freq idx -- power )
+ 8 0 do
+ eeprom >calTarget_freqbin_5G i + c@ fbin2freq5G px i na+ !
+ dup i calTargetPower5G@ py i na+ !
+ loop drop
+ ( freq ) 8 interpolate-power
+;
+: get-tgt-pwr ( freq idx is2Ghz? -- power )
+ if get-tgt-pwr2G else get-tgt-pwr5G then
+;
+: get-tgt-pwr-2Ght20 ( freq idx -- power )
+ 3 0 do
+ eeprom >calTarget_freqbin_2GHT20 i + c@ fbin2freq2G px i na+ !
+ dup i calTargetPower2GHT20@ py i na+ !
+ loop drop
+ ( freq ) 3 interpolate-power
+;
+: get-tgt-pwr-5Ght20 ( freq idx -- power )
+ 8 0 do
+ eeprom >calTarget_freqbin_5GHT20 i + c@ fbin2freq5G px i na+ !
+ dup i calTargetPower5GHT20@ py i na+ !
+ loop drop
+ ( freq ) 8 interpolate-power
+;
+: get-tgt-pwr-ht20 ( freq idx is2Ghz? -- power )
+ if get-tgt-pwr-2Ght20 else get-tgt-pwr-5Ght20 then
+;
+: get-tgt-pwr-2Ght40 ( freq idx -- power )
+ 3 0 do
+ eeprom >calTarget_freqbin_2GHT40 i + c@ fbin2freq2G px i na+ !
+ dup i calTargetPower2GHT40@ py i na+ !
+ loop drop
+ ( freq ) 3 interpolate-power
+;
+: get-tgt-pwr-5Ght40 ( freq idx -- power )
+ 8 0 do
+ eeprom >calTarget_freqbin_5GHT40 i + c@ fbin2freq5G px i na+ !
+ dup i calTargetPower5GHT40@ py i na+ !
+ loop drop
+ ( freq ) 8 interpolate-power
+;
+: get-tgt-pwr-ht40 ( freq idx is2Ghz? -- power )
+ if get-tgt-pwr-2Ght40 else get-tgt-pwr-5Ght40 then
+;
+: get-tgt-pwr-cck ( freq idx -- power )
+ 2 0 do
+ eeprom >calTarget_freqbin_Cck i + c@ fbin2freq2G px i na+ !
+ dup i calTargetPowerCck@ py i na+ !
+ loop drop
+ ( freq ) 2 interpolate-power
+;
+
+\ Variables local to tx-power* routines
+/RateTable buffer: targetPowerValT2
+/RateTable buffer: target_power_val_t2_eep
+
+: pow@ ( idx -- val ) targetPowerValT2 + c@ ;
+: pow-sm@ ( idx -- val ) pow@ 3f and ;
+: pow! ( val idx -- ) targetPowerValT2 + c! ;
+: pow-eep@ ( idx -- val ) target_power_val_t2_eep + c@ ;
+: pow-eep! ( val idx -- ) target_power_val_t2_eep + c! ;
+
+: tx-power-reg! ( -- )
+ 0 a458 reg! \ Reset forced gain
+
+ \ OFDM power per rate set
+ ALL_TARGET_LEGACY_6_24 pow-sm@ dup dup dup bljoin a3c0 reg!
+ ALL_TARGET_LEGACY_6_24 pow-sm@ ALL_TARGET_LEGACY_36 pow-sm@
+ ALL_TARGET_LEGACY_48 pow-sm@ ALL_TARGET_LEGACY_54 pow-sm@
+ bljoin a3c0 1 la+ reg!
+
+ \ CCK power per rate set
+ ALL_TARGET_LEGACY_1L_5L pow-sm@ 0 over dup bljoin a3c0 2 la+ reg!
+ ALL_TARGET_LEGACY_1L_5L pow-sm@ ALL_TARGET_LEGACY_5S pow-sm@
+ ALL_TARGET_LEGACY_11L pow-sm@ ALL_TARGET_LEGACY_11S pow-sm@
+ bljoin a3c0 3 la+ reg!
+
+ \ Power for duplicated frames - HT40
+ ALL_TARGET_LEGACY_1L_5L pow-sm@ ALL_TARGET_LEGACY_6_24 pow-sm@
+ 2dup bljoin a3e0 reg!
+
+ \ HT20 power per rate set
+ ALL_TARGET_HT20_0_8_16 pow-sm@ ALL_TARGET_HT20_1_3_9_11_17_19 pow-sm@
+ ALL_TARGET_HT20_4 pow-sm@ ALL_TARGET_HT20_5 pow-sm@
+ bljoin a3c0 4 la+ reg!
+
+ ALL_TARGET_HT20_6 pow-sm@ ALL_TARGET_HT20_7 pow-sm@
+ ALL_TARGET_HT20_12 pow-sm@ ALL_TARGET_HT20_13 pow-sm@
+ bljoin a3c0 5 la+ reg!
+
+ ALL_TARGET_HT20_14 pow-sm@ ALL_TARGET_HT20_15 pow-sm@
+ ALL_TARGET_HT20_20 pow-sm@ ALL_TARGET_HT20_21 pow-sm@
+ bljoin a3c0 9 la+ reg!
+
+ \ Mixed HT20 and HT40 rates
+ ALL_TARGET_HT20_22 pow-sm@ ALL_TARGET_HT20_23 pow-sm@
+ ALL_TARGET_HT40_22 pow-sm@ ALL_TARGET_HT40_23 pow-sm@
+ bljoin a3c0 d# 10 la+ reg!
+
+ \ HT40 power per rate set
+ ALL_TARGET_HT40_0_8_16 pow-sm@ ALL_TARGET_HT40_1_3_9_11_17_19 pow-sm@
+ ALL_TARGET_HT40_4 pow-sm@ ALL_TARGET_HT40_5 pow-sm@
+ bljoin a3c0 6 la+ reg!
+
+ ALL_TARGET_HT40_6 pow-sm@ ALL_TARGET_HT40_7 pow-sm@
+ ALL_TARGET_HT40_12 pow-sm@ ALL_TARGET_HT40_13 pow-sm@
+ bljoin a3c0 7 la+ reg!
+
+ ALL_TARGET_HT40_14 pow-sm@ ALL_TARGET_HT40_15 pow-sm@
+ ALL_TARGET_HT40_20 pow-sm@ ALL_TARGET_HT40_21 pow-sm@
+ bljoin a3c0 d# 11 la+ reg!
+;
+
+: set-target-power ( freq -- )
+ dup d# 4000 < ( freq is2GHz? )
+ ALL_TARGET_LEGACY_6_24 3dup swap get-tgt-pwr swap pow!
+ ALL_TARGET_LEGACY_36 3dup swap get-tgt-pwr swap pow!
+ ALL_TARGET_LEGACY_48 3dup swap get-tgt-pwr swap pow!
+ ALL_TARGET_LEGACY_54 3dup swap get-tgt-pwr swap pow!
+
+ over ALL_TARGET_LEGACY_1L_5L tuck get-tgt-pwr-cck swap pow!
+ over LEGACY_TARGET_RATE_5S tuck get-tgt-pwr-cck swap pow!
+ over ALL_TARGET_LEGACY_11L tuck get-tgt-pwr-cck swap pow!
+ over ALL_TARGET_LEGACY_11S tuck get-tgt-pwr-cck swap pow!
+
+ ALL_TARGET_HT20_0_8_16 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_1_3_9_11_17_19 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_4 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_5 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_6 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_7 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_12 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_13 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_14 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_15 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_20 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_21 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_22 3dup swap get-tgt-pwr-ht20 swap pow!
+ ALL_TARGET_HT20_23 3dup swap get-tgt-pwr-ht20 swap pow!
+
+ ALL_TARGET_HT40_0_8_16 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_1_3_9_11_17_19 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_4 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_5 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_6 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_7 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_12 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_13 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_14 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_15 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_20 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_21 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_22 3dup swap get-tgt-pwr-ht40 swap pow!
+ ALL_TARGET_HT40_23 3dup swap get-tgt-pwr-ht40 swap pow!
+
+ 2drop
+;
+
+: get-cal-pier ( freq ipier ichain -- cor temp volt freq )
+ rot d# 4000 >= if ( ipier ichain )
+ 2dup refPower5G@ -rot \ cor
+ 2dup tempMeas5G@ -rot \ temp
+ 2dup voltMeas5G@ -rot \ volt
+ drop eeprom >calFreqPier5G + c@ fbin2freq5G \ freq
+ else
+ 2dup refPower2G@ -rot \ cor
+ 2dup tempMeas2G@ -rot \ temp
+ 2dup voltMeas2G@ -rot \ volt
+ drop eeprom >calFreqPier2G + c@ fbin2freq2G \ freq
+ then
+;
+
+\ Local calibration arrays
+3 /n* buffer: lfreq 3 /n* buffer: hfreq
+3 /n* buffer: lcorr 3 /n* buffer: hcorr 3 /n* buffer: corr
+3 /n* buffer: ltemp 3 /n* buffer: htemp 3 /n* buffer: temp
+3 /n* buffer: lvolt 3 /n* buffer: hvolt 3 /n* buffer: volt
+
+: override-power-control ( freq -- )
+ corr @ ff and d# 16 << ff.0000 a420 reg@!
+ tx-chainmask 2 and if corr 1 na+ @ ff and d# 16 << ff.0000 b420 reg@! then
+ tx-chainmask 4 and if corr 2 na+ @ ff and d# 16 << ff.0000 c420 reg@! then
+
+ \ Enable open loop power control on chip
+ 300.0000 dup a40c reg@!
+ tx-chainmask 2 and if 300.0000 dup b40c reg@! then
+ tx-chainmask 4 and if 300.0000 dup c40c reg@! then
+
+ \ Enable temperature compensation
+ dup d# 4000 < if
+ tempSlope2G@
+ else
+ tempSlopeLow@ if
+ tempSlopeLow@ py ! tempSlope5G@ py na1+ ! tempSlopeHigh@ py 2 na+ !
+ d# 5180 px ! d# 5500 px na1+ ! d# 5785 px 2 na+ !
+ dup 3 interpolate-power
+ else
+ tempSlope5G@
+ then
+ then ff a440 reg@!
+ temp c@ ff a43c reg@!
+ drop
+;
+
+: hfreq@ ( ichain -- hfreq ) hfreq swap na+ @ ;
+: lfreq@ ( ichain -- lfreq ) lfreq swap na+ @ ;
+: use-low ( ichain -- )
+ >r
+ lcorr r@ na+ @ corr r@ na+ !
+ lvolt r@ na+ @ volt r@ na+ !
+ ltemp r@ na+ @ temp r> na+ !
+;
+: use-high ( ichain -- )
+ >r
+ hcorr r@ na+ @ corr r@ na+ !
+ hvolt r@ na+ @ volt r@ na+ !
+ htemp r@ na+ @ temp r> na+ !
+;
+: set-calibration ( freq -- )
+ 3 0 do 0 lfreq i na+ ! d# 10.0000 hfreq i na+ ! loop
+
+ \ Identify best lower and higher frequency calibration measurements
+ 3 0 do
+ dup d# 4000 >= if 8 else 3 then 0 do
+ dup i j get-cal-pier ( freq cor temp volt pfreq )
+ dup 5 pick >= if ( freq cor temp volt pfreq )
+ dup j hfreq@ <= if ( freq cor temp volt pfreq )
+ dup hfreq j na+ ! over hvolt j na+ !
+ 2 pick htemp j na+ ! 3 pick hcorr j na+ !
+ then
+ then ( freq cor temp volt pfreq )
+ dup 5 pick <= if ( freq cor temp volt pfreq )
+ dup j lfreq@ >= if ( freq cor temp volt pfreq )
+ dup lfreq j na+ ! over lvolt j na+ !
+ 2 pick ltemp j na+ ! 3 pick lcorr j na+ !
+ then
+ then 4drop ( freq )
+ loop ( freq )
+ loop ( freq )
+
+ \ Interpolate
+ 3 0 do
+ i hfreq@ i lfreq@ = if \ Same, pick one
+ i use-low
+ else
+ dup i lfreq@ - d# 1000 < if \ Low is good
+ i hfreq@ over - d# 1000 < if \ High is good too
+ dup i lfreq@ i hfreq@ lcorr i na+ @ hcorr i na+ @ interpolate corr i na+ !
+ dup i lfreq@ i hfreq@ lvolt i na+ @ hvolt i na+ @ interpolate volt i na+ !
+ dup i lfreq@ i hfreq@ ltemp i na+ @ htemp i na+ @ interpolate temp i na+ !
+ else \ Only low is good
+ i use-low
+ then
+ else \ Low is not good
+ i hfreq@ over - d# 1000 < if \ Only high is good
+ i use-high
+ else \ No good value
+ 0 corr i na+ ! 0 volt i na+ ! 0 temp na+ !
+ then
+ then
+ then
+ loop
+
+ override-power-control
+;
+
+: get-direct-edge-power2G ( ctl edge -- power ) ctlPowerData_2G@ ;
+: get-direct-edge-power5G ( ctl edge -- power ) ctlPowerData_5G@ ;
+
+: get-indirect-edge-power2G ( freq ctl edge -- power )
+ d# 63 >r \ Default to max power
+ 2dup ctlPowerData_2G@ c0 and if
+ 2dup ctl_freqbin_2G@ fbin2freq2G 3 pick < if
+ 2dup ctlPowerData_2G@ 3f and r> drop >r
+ then
+ then 3drop
+ r>
+;
+: get-indirect-edge-power5G ( freq ctl edge -- power )
+ d# 63 >r \ Default to max power
+ 2dup ctlPowerData_5G@ c0 and if
+ 2dup ctl_freqbin_5G@ fbin2freq5G 3 pick < if
+ 2dup ctlPowerData_5G@ 3f and r> drop >r
+ then
+ then 3drop
+ r>
+;
+: get-max-edge-power2G ( freq ctl -- power )
+ d# 63 -rot ( power freq ctl )
+ 4 0 do
+ dup i ctl_freqbin_2G@ fbin2freq2G 2 pick = if
+ rot drop
+ dup i get-direct-edge-power2G -rot ( power' freq ctl )
+ leave
+ else
+ i 0> if
+ dup i ctl_freqbin_2G@ fbin2freq2G 2 pick > if
+ rot drop
+ 2dup i 1- get-indirect-edge-power2G -rot ( power' freq ctl )
+ leave
+ then
+ then
+ then
+ loop 2drop
+;
+: get-max-edge-power5G ( freq ctl -- power )
+ d# 63 -rot ( power freq ctl )
+ 8 0 do
+ dup i ctl_freqbin_5G@ fbin2freq5G 2 pick = if
+ rot drop
+ dup i get-direct-edge-power5G -rot ( power' freq ctl )
+ leave
+ else
+ i 0> if
+ dup i ctl_freqbin_5G@ fbin2freq5G 2 pick > if
+ rot drop
+ 2dup i 1- get-indirect-edge-power5G -rot ( power' freq ctl )
+ leave
+ then
+ then
+ then
+ loop 2drop
+;
+: get-max-edge-power ( freq ctl is2GHz? -- power )
+ if get-max-edge-power2G else get-max-edge-power5G then
+;
+
+: get-#txchains ( mask -- )
+ 0 3 0 do
+ over i >> 1 and +
+ loop nip
+;
+create tpScaleReductionTable 0 c, 3 c, 6 c, 9 c, d# 63 c,
+create ctlModesFor11a CTL_11A , CTL_5GHT20 , CTL_11A_EXT , CTL_5GHT40 ,
+create ctlModesFor11g CTL_11B , CTL_11G , CTL_2GHT20 , CTL_11B_EXT , CTL_11G_EXT , CTL_2GHT40 ,
+0 value 'ctlMode
+0 value tscaledPower
+0 value tchan
+0 value tcfgctl \ Care about the upper nibble only
+0 value tfreq
+0 value 'ctlIndex
+d# 63 value twiceMaxEdgePower
+0 value tminCtlPower
+0 value tsynth-center 0 value text-center 0 value tctl-center
+: ctlMode@ ( idx -- val ) 'ctlMode swap na+ @ ;
+: ctlIndex@ ( idx -- val ) 'ctlIndex + c@ ;
+: set-power-array ( start end -- )
+ 1+ swap do
+ tminCtlPower targetPowerValT2 i + c@ min targetPowerValT2 i + c!
+ loop
+;
+: set-power-per-rate-table ( ch cfgctl powerLimit twiceMaxRegPower twiceAntRed -- )
+ d# 63 to twiceMaxEdgePower
+ 4 pick get-chan-centers to tsynth-center to text-center to tctl-center
+
+ \ Compute TxPower reduction due to antenna gain
+ \ scaledPower is the min of user input power level and regulatory allowed power level
+ 4 pick is-2GHz? if antennaGain2G@ else antennaGain5G@ then - 0 min + \ maxRegAllowedPower
+ ( powerLimit maxRegAllowedPower ) min ( ch cfgctl scaledPower )
+ -rot f0 and to tcfgctl to tchan ( scaledPower )
+
+ \ Reduce scaled power by # of chains active to get per chain tx power level
+ txchainmask get-#txchains case
+ 2 of 6 - endof
+ 3 of d# 10 - endof
+ endcase 0 max to tscaledPower
+
+ tchan is-2GHz? if
+ ctlModesFor11g to 'ctlMode
+ tchan is-ht40? if 6 else 3 then
+ else
+ ctlModesfor11a to 'ctlMode
+ tchan is-ht40? if 4 else 2 then
+ then
+
+ \ For MIMO, need to apply regulatory caps individually across
+ \ dynamically running modes: CCK, OFDM, HT20, HT40
+ \
+ \ The outer loop walks through each possible applicable runtime mode.
+ \ The inner loop walks through each ctlIndex entry in EEPROM.
+ \ The ctl value is encoded as [7:4] == test group, [3:0] == test mode.
+ 0 do
+ i ctlMode@ dup CTL_5GHT40 = swap CTL_2GHT40 = or
+ if tsynth-center
+ else i ctlMode@ 8000 and if
+ text-center
+ else
+ tctl-center
+ then then to tfreq
+
+ \ Walk through each CTL index in eeprom
+ tchan is-2GHz? if
+ eeprom >ctlIndex_2G to 'ctlIndex d# 12
+ else
+ eeprom >ctlIndex_5G to 'ctlIndex 9
+ then
+
+ 0 do
+ i ctlIndex@ 0= if leave then
+
+ tcfgctl j ctlMode@ f and or i ctlIndex@ =
+ tcfgctl j ctlMode@ f and or i ctlIndex@ f and e0 or = or if
+ tfreq i tchan is-2GHz? get-max-edge-power \ twiceMinEdgePower
+ tcfgCtl e0 = if
+ twiceMaxEdgePower min to twiceMaxEdgePower
+ else
+ to twiceMaxEdgePower
+ leave
+ then
+ then
+ loop
+ tscaledPower twiceMaxEdgePower min to tminCtlPower
+
+ \ Apply CTL mode to correct target power set
+ i ctlMode@ case
+ CTL_11B of ALL_TARGET_LEGACY_1L_5L ALL_TARGET_LEGACY_11S set-power-array endof
+ CTL_11A of ALL_TARGET_LEGACY_6_24 ALL_TARGET_LEGACY_54 set-power-array endof
+ CTL_11G of ALL_TARGET_LEGACY_6_24 ALL_TARGET_LEGACY_54 set-power-array endof
+ CTL_2GHT20 of ALL_TARGET_HT20_0_8_16 ALL_TARGET_HT20_23 set-power-array endof
+ CTL_5GHT20 of ALL_TARGET_HT20_0_8_16 ALL_TARGET_HT20_23 set-power-array endof
+ CTL_2GHT40 of ALL_TARGET_HT40_0_8_16 ALL_TARGET_HT40_23 set-power-array endof
+ CTL_5GHT40 of ALL_TARGET_HT40_0_8_16 ALL_TARGET_HT40_23 set-power-array endof
+ endcase
+ loop
+;
+
+: mcsidx-to-tgtpwridx ( mcs-idx base-idx -- pwridx )
+ over 7 and ( mcs-idx base-idx mod-idx )
+ ?dup 0= if nip exit then
+ 3 > if
+ over 3 >> 2 << + swap 7 and 2 - +
+ else
+ 1+ nip
+ then ( pwridx )
+;
+
+: get-paprd-scale-factor ( ch -- val )
+ dup is-2ghz? if
+ modalHeader2G >papdRateMaskHt20 le-l@ d# 25 >>
+ else
+ dup >ch-freq @
+ dup d# 5700 >= if
+ drop modalHeader5G >papdRateMaskHt20 le-l@ d# 25 >>
+ else
+ modalHeader5G >papdRateMaskHt40 le-l@
+ swap d# 5400 >= if d# 28 else d# 25 then >>
+ then
+ then nip
+;
+
+: is-wwr-sku? ( regd -- flag )
+ dup and 8000 0= ( regd flag )
+ over WORLD = ( regd flag flag )
+ rot f0 and f0 = or and ( flag' )
+;
+: get-band-ctl ( ch -- ctl )
+ regulatory 0= if drop SD_NO_CTL exit then
+ regulatory >reg-country @ 0=
+ regulatory >reg-cur-rd @ 3fff and is-wwr-sku? and if drop SD_NO_CTL exit then
+ dup >ch-band @ BAND_2GHZ = if drop regulatory >reg-pair @ >reg-2ghz-ctl @ exit then
+ dup >ch-band @ BAND_5GHZ = if drop regulatory >reg-pair @ >reg-5ghz-ctl @ exit then
+ drop NO_CTL
+;
+: get-regd-ctl ( ch -- ctl )
+ dup get-band-ctl
+ over is-b? if CTL_11B or nip exit then
+ swap is-g? if CTL_11G else CTL_11A then or
+;
+
+0 value cfgCtl
+0 value twiceAntennaReduction
+0 value twiceMaxRegulatoryPower
+0 value powerLimit
+0 value paprd-scale-factor
+0 value min-pwridx
+: (set-txpower) ( ch -- )
+ dup >ch-freq @ set-target-power
+ baseEepHeader >featureEnable c@ 20 and if
+ dup is-2GHz? if modalHeader2G else modalHeader5G then
+ dup >papdRateMaskHt20 le-l@ 1ff.ffff and to paprd-ratemask
+ >papdRateMaskHt40 le-l@ 1ff.ffff and to paprd-ratemask-ht40
+ dup get-paprd-scale-factor to paprd-scale-factor
+ dup is-ht40? if ALL_TARGET_HT40_0_8_16 else ALL_TARGET_HT20_0_8_16 then
+ to min-pwridx
+ paprd-table-write-done? not if
+ targetPowerValT2 target_power_val_t2_eep /RateTable move
+ d# 24 0 do
+ i min-pwridx mcsidx-to-tgtpwridx ( pwridx )
+ paprd-ratemask 1 i << and if ( pwridx )
+ dup pow@ ?dup if ( pwridx pwr )
+ over pow-eep@ over = if ( pwridx pwr )
+ paprd-scale-factor - swap pow! ( )
+ else 2drop then
+ else drop then
+ else drop then
+ loop
+ then
+ targetPowerValT2 target_power_val_t2_eep /RateTable move
+ then
+
+ ( ch ) dup get-regd-ctl ( ch cfgctl )
+ regulatory >reg-power-limit @ d# 63 min ( ch cfgctl powerLimit )
+ 2 pick >ch-max-power @ 2* ( ch cfgctl pl 2maxregpwr )
+ 3 pick >ch-max-antenna-gain @ 2* ( ch cfgctl pl 2maxregpwr 2maxag )
+ set-power-per-rate-table ( )
+
+ baseEepHeader >featureEnable c@ 20 and if
+ /RateTable 0 do
+ paprd-ratemask 1 i << and if
+ i pow@ i pow-eep@ - abs paprd-scale-factor > if
+ paprd-ratemask 1 i << invert and to paprd-ratemask
+ then
+ then
+ loop
+ then
+
+ 0 regulatory >reg-max-power !
+ /RateTable 0 do
+ i pow@ regulatory >reg-max-power @ max
+ regulatory >reg-max-power !
+ loop
+;
+: set-txpower ( ch test? -- )
+ over (set-txpower)
+ ( test? ) if drop exit then
+
+ \ This is the TX power we send back to driver core.
+ \ Since power is rate dependent, use one of the indices
+ \ from the AR9300_Rates enum to select an entry from
+ \ targetPowerValT2[] to report. Currently returns the
+ \ power for HT40 MCS 0, HT20 MCS 0, or OFDM 6 Mbps
+ \ as CCK power is less interesting (?).
+ dup is-ht40? if
+ ALL_TARGET_HT40_0_8_16
+ else dup is-ht20? if
+ ALL_TARGET_HT20_0_8_16
+ else
+ ALL_TARGET_LEGACY_6_24
+ then then ( ch i )
+ pow@ regulatory >reg-max-power !
+
+ \ Write target power array to registers
+ tx-power-reg!
+ dup >ch-freq @ set-calibration
+
+ dup is-2GHz? if
+ is-ht40? if ALL_TARGET_HT40_0_8_16 else ALL_TARGET_HT20_0_8_16 then
+ else
+ is-ht40? if ALL_TARGET_HT40_7 else ALL_TARGET_HT20_7 then
+ then
+ pow@ to paprd-target-power
+;
+
+: chansel-2GHz ( freq -- freq' ) 1.0000 * d# 15 / ;
+: chansel-5GHz ( freq -- freq' ) 8000 * d# 15 / ;
+: set-channel ( ch -- )
+ dup get-chan-centers nip nip ( ch freq )
+ dup d# 4800 < if
+ chansel-2GHz 1
+ else
+ chansel-5GHz 1 >> 0
+ then ( ch freq' synth-control )
+ d# 29 << a340 reg! \ PHY synthesizer control
+ 2 dup 1608c reg@! \ Enable long shift
+ ( freq ) 2 << 4000.0000 or dup 16098 reg! \ Program synthesizer
+ 8000.0000 or 16098 reg! \ Toggle load synth channel bit
+ to curchan
+;
+
+false value spur-in-range?
+create spur-freq d# 2420 , d# 2440 , d# 2464 , d# 2480 ,
+: spur-mitigate-mrc-cck ( ch -- )
+ false to spur-in-range?
+ >ch-freq @
+ 4 0 do
+ spur-freq i na+ @ over - \ cur_bb_spur
+ dup abs d# 10 < if
+ true to spur-in-range?
+ 1c0 3c0 a2c4 reg@!
+ d# 19 << d# 11 / f.ffff and 9 <<
+ 4000.00ff or 8000.0000 9fcc reg@!
+ leave
+ else drop then
+ loop drop
+ spur-in-range? 0= if
+ 140 3c0 a2c4 reg@!
+ 0 e000.1ffe 9fcc reg@!
+ then
+;
+
+: spur-ofdm-clear ( -- )
+ 0 f000.0000 980c reg@!
+ 0 9818 reg!
+ 0 1000.0000 982c reg@!
+ 0 07fe.0100 981c reg@!
+ 0 0000.0fff 9c0c reg@!
+ 0 0001.ffff a220 reg@!
+ 0 0000.0fff 9c10 reg@!
+;
+
+: spur-ofdm ( freq-offset spur-subch-sd spur-delta sfreq-sd -- )
+ 4000.0000 dup 980c reg@!
+ ( spur-delta sfreq-sd ) d# 20 << or 3fff.ffff 9818 reg@!
+ ( spur-subch-sd ) d# 28 << 1000.0000 982c reg@!
+ c000.0000 dup 9818 reg@!
+ 8000.0000 dup 980c reg@!
+ 122 0000.01ff 981c reg@!
+ a208 reg@ 4 and if 400.0000 dup 981c reg@! then
+
+ ( freq_offset ) 4 << 5 / dup 0< if 1- then 7f and ( mask-index )
+
+ 0002.0000 dup 981c reg@!
+ 3000.0000 dup 980c reg@!
+ dup 5 << c or 0000.0fff 9c0c reg@!
+ dup d# 10 << a0 or 0001.ffff a220 reg@!
+ 5 << c or 0000.0fff 9c10 reg@!
+ 03fc.0000 dup 981c reg@!
+;
+
+: spur-ofdm-work ( freq-offset ch -- )
+ is-ht40? if
+ dup 0< if
+ a204 reg@ 10 and if 0 else 1 then ( freq-offset spur-subch-sd )
+ over d# 10 + ( freq-offset spur-subch-sd spur-freq-sd )
+ else
+ a204 reg@ 10 and if 1 else 0 then ( freq-offset spur-subch-sd )
+ over d# 10 - ( freq-offset spur-subch-sd spur-freq-sd )
+ then
+ 2 pick d# 17 << ( freq-offset spur-subch-sd spur-freq-sd spur-delta-phase )
+ else
+ 0 over dup d# 18 << ( freq-offset spur-subch-sd spur-freq-sd spur-delta-phase )
+ then
+ ( spur-delta-phase ) 5 / f.ffff and swap
+ ( spur-freq-sd ) d# 11 / 3ff and
+ spur-ofdm ( )
+;
+
+0 value range
+0 value synth-freq
+: spur-mitigate-ofdm2G ( ch -- )
+ modalHeader2G >spurChans c@ 0= if drop exit then
+
+ dup >ch-freq @ ( ch freq )
+ over is-ht40? if
+ d# 10 a204 reg@ 10 and if + else - then
+ d# 19
+ else
+ d# 10
+ then to range to synth-freq
+ spur-ofdm-clear
+
+ 5 0 do ( ch )
+ modalHeader2G >spurChans i + c@ ?dup 0= if leave then
+ ( spurChans ) fbin2freq2G synth-freq - \ freq_offset
+ dup abs range < if over spur-ofdm-work else drop then
+ loop drop
+;
+: spur-mitigate-ofdm5G ( ch -- )
+ modalHeader5G >spurChans c@ 0= if drop exit then
+
+ dup >ch-freq @ ( ch freq )
+ over is-ht40? if
+ d# 10 a204 reg@ 10 and if + else - then
+ d# 19
+ else
+ d# 10
+ then to range to synth-freq
+ spur-ofdm-clear
+
+ 5 0 do ( ch )
+ modalHeader5G >spurChans i + c@ ?dup 0= if leave then
+ ( spurChans ) fbin2freq5G synth-freq - \ freq_offset
+ dup abs range < if over spur-ofdm-work else drop then
+ loop drop
+;
+: spur-mitigate-ofdm ( ch -- )
+ dup is-5GHz? if spur-mitigate-ofdm5G else spur-mitigate-ofdm2G then
+;
+
+: spur-mitigate ( ch -- )
+ dup spur-mitigate-mrc-cck
+ spur-mitigate-ofdm
+;
+
+: compute-pll-control ( ch -- pll )
+ ?dup 0= if 1400 exit then
+ 142c
+ over is-half-rate? if 4000 or then
+ swap is-quarter-rate? if 8000 or then
+;
+
+: set-11nmac2040 ( -- )
+ conf-is-ht40? if 1 else 0 then
+ 8318 reg!
+;
+
+: set-ch-regs ( ch -- )
+ a204 reg@ 3c0 or
+ over is-ht40? if
+ 4 or over >ch-mode @ CH_HT40+ and if 10 or then
+ then
+ 400 invert and a204 reg!
+ is-ht40? if 1 else 0 then 8318 reg!
+ 50.0000 64 reg!
+ f.0000 6c reg!
+;
+
+: init-bb ( ch -- )
+ 1 a20c reg! \ Activate PHY
+ a254 reg@ 3fff and
+ swap is-b? if 4 * d# 22 / else d# 10 / then
+ d# 100 + us
+;
+
+: set-chain-masks ( tx rx -- )
+ dup 5 = if 40 dup a34c reg@! then
+ dup 1 3 between over 5 = or over 7 = or if
+ dup a2a0 reg! dup a2c0 reg!
+ then drop
+
+ hw-caps HW_CAP_APM and if 3 else dup then 832c reg!
+ 5 = if 40 dup a34c reg@! then
+;
+
+: override-ini ( -- )
+ 0200.0020 dup 8048 reg@!
+ 2.0008 40 8344 reg@!
+;
+
+0 value array-#col
+: array@ ( col array row -- data ) array-#col /n* * + swap /n* + @ ;
+: array-reg! ( col array #row #col -- )
+ to array-#col
+ ( #row ) 0 do ( col array )
+ 2dup i array@ ( col array val )
+ 0 2 pick i array@ ( col array val reg )
+ reg! 1 us ( col array )
+ loop 2drop
+;
+
+: process-ini ( ch -- )
+ dup >ch-mode @ >r
+ r@ CH_A = r@ CH_A_HT20 = or if 1
+ else r@ CH_A_HT40+ = r@ CH_A_HT40- = or if 2
+ else r@ CH_G = r@ CH_G_HT20 = or r@ CH_B = or if 4
+ else 3 then then then ( modesIdx )
+ r> drop
+
+ 1 array-soc-preamble soc-preamble-#row 2 array-reg!
+ 1 array-mac-core mac-core-#row 2 array-reg!
+ 1 array-bb-core bb-core-#row 2 array-reg!
+ 1 array-radio-core radio-core-#row 2 array-reg!
+ dup array-soc-postamble soc-postamble-#row 5 array-reg!
+ dup array-mac-postamble mac-postamble-#row 5 array-reg!
+ dup array-bb-postamble bb-postamble-#row 5 array-reg!
+ dup array-radio-postamble radio-postamble-#row 5 array-reg!
+ 1 array-rx-gain rx-gain-#row 2 array-reg!
+ dup array-tx-gain tx-gain-#row 5 array-reg!
+
+ over is-a-fast? if
+ dup array-fast-clk fast-clk-#row 3 array-reg!
+ then drop
+
+ override-ini
+ dup set-ch-regs
+ txchainmask rxchainmask set-chain-masks
+
+ ( ch ) false set-txpower
+;
+
+: set-rfmode ( ch -- )
+ ?dup 0= if exit then
+ dup is-b? over is-g? or if 4 else 0 then
+ swap is-a-fast? if 104 or then
+ a208 reg!
+;
+
+: mark-phy-inactive ( -- ) 0 a20c reg! ;
+
+: log2 ( n -- log2-of-n )
+ 0 begin ( n log )
+ swap 1 >> ( log n' )
+ ?dup while ( log n' )
+ swap 1+ ( n' log' )
+ repeat ( log )
+;
+: get-delta-slope-vals ( coef -- man exp )
+ dup log2 ( coef exp )
+ d# 38 swap - ( coef exp' )
+ tuck d# 23 swap - 1 swap << + ( exp man )
+ d# 24 2 pick - >> ( exp man' )
+ swap d# 16 - ( man exp' )
+;
+
+: set-delta-slope ( ch -- )
+ 6400.0000 ( ch coef )
+ over is-half-rate? if 1 >> then ( ch coef' )
+ over is-quarter-rate? if 2 >> then ( ch coef' )
+
+ \ ALGO -> coef = 1e8/fcarrier*fclock/40
+ swap get-chan-centers nip nip / ( coef' )
+ dup get-delta-slope-vals ( coef man exp )
+ f and d# 13 << swap 7fff and d# 17 << or ffff.e000 9808 reg@!
+
+ \ For short GI, scaled coeff is 9/10 that of normal coeff
+ 9 * d# 10 / ( coef' )
+ get-delta-slope-vals ( man exp )
+ f and swap 7fff and 4 << or 7.ffff 9c14 reg@!
+;
+
+: rfbus-req? ( -- ok? )
+ 1 a23c reg! \ Enable RF bus request
+ 1 1 a240 wait-hw
+;
+
+: rfbus-done ( -- )
+ a254 reg@ 3fff and ( ch rx-delay )
+ curchan is-b? if 4 * d# 22 / else d# 10 / then
+ d# 100 + us
+ 0 a23c reg!
+;
+
+: set-diversity ( set? -- )
+ if 2000 else 0 then 2000 9fc0 reg@!
+;
+
+: set-radar ( -- )
+ e400.a611 9834 reg!
+ 0008.ccff 9838 reg!
+ 0 4000 983c reg@!
+;
+
+: config-bb-watchdog ( timeout -- )
+ ?dup if
+ d# 10000 min \ bound limit to 10 secs
+ 4 6 a7c8 reg@!
+ \ The time unit for watchdog event is 2^15 44/88MHz cycles.
+ \ For HT20 we have a time unit of 2^15/44 MHz = .74 ms per tick
+ \ For HT40 we have a time unit of 2^15/88 MHz = .37 ms per tick
+ d# 100 *
+ curchan is-ht40? if d# 37 else d# 74 then / fffc and
+ ffff.0002 or a7c4 reg!
+ else
+ 0 6 a7c8 reg@!
+ 0 3 a7c4 reg@!
+ then
+;
+
+: read-bb-watchdog ( -- )
+ 0 8 a7c0 reg@! \ Reset and clear watchdog status
+;
+
+: set-tx-gain-table ( -- )
+ eeprom >baseEepHeader >txrxgain c@ 4 >> case
+ 0 of array-tx-gain-lowest to array-tx-gain
+ tx-gain-lowest-#row to tx-gain-#row
+ endof
+ 1 of array-tx-gain-hi to array-tx-gain
+ tx-gain-hi-#row to tx-gain-#row
+ endof
+ 2 of array-tx-gain-low to array-tx-gain
+ tx-gain-low-#row to tx-gain-#row
+ endof
+ 3 of array-tx-gain-hi to array-tx-gain
+ tx-gain-hi-#row to tx-gain-#row
+ endof
+ endcase
+;
+
+: set-rx-gain-table ( -- )
+ eeprom >baseEepHeader >txrxgain c@ f and case
+ 0 of array-rx-gain-common to array-rx-gain
+ rx-gain-common-#row to rx-gain-#row
+ endof
+ 1 of array-rx-gain-wo-xlna to array-rx-gain
+ rx-gain-wo-xlna-#row to rx-gain-#row
+ endof
+ endcase
+;
+
+: init-mode-gain-tables ( -- )
+ set-tx-gain-table
+ set-rx-gain-table
+;
+
+: config-pci-powersave ( restore? -- )
+ 0= if
+ 8.0000 dup 4014 reg@! \ Allow forcing of PCIe core into L1 state
+ WARegVal 4004 reg!
+ then
+
+ 1 array-pcie-serdes pcie-serdes-#row 2 array-reg!
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/reg.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/reg.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,212 @@
+purpose: PCI access and misc words for ATH9K driver
+\ See license at end of file
+
+headers
+hex
+
+" wlan" device-name
+" wireless-network" device-type
+
+168c constant ATHEROS_ID
+true value in-little-endian?
+variable opencount 0 opencount !
+
+0 value chipbase
+2.0000 value /regs
+: reg@ ( r -- v ) chipbase + rl@ ;
+: reg! ( v r -- ) chipbase + rl! ;
+: reg@! ( v m r -- ) dup reg@ rot invert and rot or swap reg! ;
+
+: my-b@ ( offset -- b ) my-space + " config-b@" $call-parent ;
+: my-b! ( b offset -- ) my-space + " config-b!" $call-parent ;
+
+: my-w@ ( offset -- w ) my-space + " config-w@" $call-parent ;
+: my-w! ( w offset -- ) my-space + " config-w!" $call-parent ;
+
+: map-regs ( -- )
+ 0 0 my-space h# 0200.0010 + /regs " map-in" $call-parent to chipbase
+ 4 my-w@ 6 or 4 my-w!
+;
+: unmap-regs ( -- )
+ 4 my-w@ 6 invert and 4 my-w!
+ chipbase /regs " map-out" $call-parent
+;
+
+: dma-sync ( virt phys size -- ) " dma-sync" $call-parent ;
+: dma-alloc ( size -- virt ) " dma-alloc" $call-parent ;
+: dma-free ( virt size -- ) " dma-free" $call-parent ;
+: dma-map-in ( virt size cache? -- phys ) " dma-map-in" $call-parent ;
+: dma-map-out ( virt phys size -- ) " dma-map-out" $call-parent ;
+
+\ Little endian operations
+: le-w@ ( a -- w ) dup c@ swap ca1+ c@ bwjoin ;
+: le-w! ( w a -- ) >r wbsplit r@ ca1+ c! r> c! ;
+: le-l@ ( a -- l ) >r r@ c@ r@ 1+ c@ r@ 2+ c@ r> 3 + c@ bljoin ;
+: le-l! ( l a -- ) >r lbsplit r@ 3 + c! r@ 2+ c! r@ 1+ c! r> c! ;
+
+\ Big endian operations
+: be-w@ ( a -- w ) dup ca1+ c@ swap c@ bwjoin ;
+: be-w! ( w a -- ) >r wbsplit r@ c! r> ca1+ c! ;
+: be-l@ ( a -- l ) dup wa1+ be-w@ swap be-w@ wljoin ;
+: be-l! ( l a -- ) >r lwsplit r@ be-w! r> wa1+ be-w! ;
+
+\ Misc helpers
+: $, ( adr len -- ) here over allot swap move ;
+: 4drop ( n1 n2 n3 n4 -- ) 2drop 2drop ;
+: cdump ( adr len -- ) bounds ?do i c@ 3 u.r loop ;
+: $= ( $1 $2 -- flag )
+ rot tuck <> if 3drop false exit then
+ comp 0=
+;
+: /string ( adr len n -- ) tuck 2swap + -rot - ;
+: round-up ( n align -- n' ) 1- tuck + swap invert and ;
+
+\ Debug helpers
+false instance value debug?
+defer vemit ' drop to vemit
+defer vtype ' 2drop to vtype
+defer vcdump ' 2drop to vcdump
+: (vtype) ( adr len -- ) type cr ;
+: (vcdump) ( adr len -- ) cdump cr ;
+: enable-emit ( -- )
+ ['] emit to vemit
+ ['] (vtype) to vtype
+ ['] (vcdump) to vcdump
+;
+: disable-emit ( -- )
+ ['] drop to vemit
+ ['] 2drop to vtype
+ ['] 2drop to vcdump
+;
+
+\ Response wait time (ms)
+d# 1,000 constant resp-wait-short
+d# 1,500 constant resp-wait-long
+d# 5,000 constant resp-wait-xlong
+resp-wait-short instance value resp-wait
+
+\ MAC addresses
+6 constant /mac-adr
+create mac-adr 0 c, 3 c, 7f c, 0 c, 0 c, 0 c, 0 c, 0 c,
+: mac-adr$ ( -- $ ) mac-adr /mac-adr ;
+
+/mac-adr buffer: target-mac
+: target-mac$ ( -- $ ) target-mac /mac-adr ;
+
+\ Data rates
+d# 12 constant #rates
+create supported-rates 02 c, 04 c, 0b c, 16 c, 0c c, 12 c, 18 c, 24 c,
+ 30 c, 48 c, 60 c, 6c c,
+#rates buffer: common-rates
+
+\ WPA/WPA2 keys
+0 value ktype \ Key type
+0 value ctype-g \ Group (multicast) cipher type
+0 value ctype-p \ Pairwise (unicast) cipher type
+
+\ ktype values
+0 constant kt-wep
+1 constant kt-wpa
+2 constant kt-wpa2
+h# ff constant kt-none
+
+d# 16 constant /aes
+d# 32 constant /tkip
+/tkip buffer: g-tkip
+/aes buffer: g-aes
+/tkip buffer: p-tkip
+/aes buffer: p-aes
+
+\ ctype-x values
+0 constant ct-none
+1 constant ct-tkip
+2 constant ct-aes
+
+\ hardware key type values
+0 constant KEYTABLE_TYPE_40
+1 constant KEYTABLE_TYPE_104
+3 constant KEYTABLE_TYPE_128
+4 constant KEYTABLE_TYPE_TKIP
+5 constant KEYTABLE_TYPE_AES \ DO NOT use this
+6 constant KEYTABLE_TYPE_CCM \ AES (CCM)
+7 constant KEYTABLE_TYPE_CLR
+
+1 value grp-idx \ groupwise key table idx
+0 value pair-idx \ pairwise key table idx
+0 value wep-idx \ wep key table idx (0-3)
+
+d# 16 buffer: wep1 0 constant /wep1
+d# 16 buffer: wep2 0 constant /wep2
+d# 16 buffer: wep3 0 constant /wep3
+d# 16 buffer: wep4 0 constant /wep4
+: wep1$ ( -- $ ) wep1 /wep1 ;
+: wep2$ ( -- $ ) wep2 /wep2 ;
+: wep3$ ( -- $ ) wep3 /wep3 ;
+: wep4$ ( -- $ ) wep4 /wep4 ;
+: wep-key$ ( idx -- $ )
+ case
+ 0 of wep1 /wep1 endof
+ 1 of wep2 /wep2 endof
+ 2 of wep3 /wep3 endof
+ 3 of wep4 /wep4 endof
+ ( otherwise ) 0 0 rot
+ endcase
+;
+external
+: set-wep ( wep4$ wep3$ wep2$ wep1$ idx -- ok? )
+ to wep-idx
+ dup to /wep1 wep1 swap move
+ dup to /wep2 wep2 swap move
+ dup to /wep3 wep3 swap move
+ dup to /wep4 wep4 swap move
+ true
+;
+: set-key-type ( ctp ctg ktype -- ) to ktype to ctype-g to ctype-p ;
+headers
+: key-wep? ( -- wep? ) ktype kt-wep = ;
+: key-wpa? ( -- wpa? ) ktype kt-wpa = ;
+: key-wpa2? ( -- wpa2? ) ktype kt-wpa2 = ;
+: key-wpax? ( -- wpa|wap ) key-wpa? key-wpa2? or ;
+: pkey-tkip? ( -- tkip? ) key-wpax? if ctype-p ct-tkip = else false then ;
+: gkey-tkip? ( -- tkip? ) key-wpax? if ctype-g ct-tkip = else false then ;
+: pkey-aes? ( -- tkip? ) key-wpax? if ctype-p ct-aes = else false then ;
+: gkey-aes? ( -- tkip? ) key-wpax? if ctype-g ct-aes = else false then ;
+
+false value wep-enabled?
+false value gkey-enabled?
+false value pkey-enabled?
+: key-enabled? ( -- flag ) wep-enabled? pkey-enabled? or ;
+
+\ OUI values (big-endian)
+h# 0050.f201 constant wpa-tag \ WPA tag
+h# 0050.f202 constant moui-tkip \ WPA cipher suite TKIP
+h# 0050.f204 constant moui-aes \ WPA cipher suite AES
+h# 000f.ac02 constant oui-tkip \ WPA2 cipher suite TKIP
+h# 000f.ac04 constant oui-aes \ WPA2 cipher suite AES
+h# 000f.ac02 constant aoui \ WPA2 authentication suite
+h# 0050.f202 constant amoui \ WPA authentication suite
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/rx.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/rx.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,397 @@
+purpose: ATH9K RX code
+\ See license at end of file
+
+headers
+hex
+
+false instance value use-promiscuous?
+
+\ rx data structures:
+\ - an array of rx-buf
+\ - a link list of free rx-buf starting at frx-head,
+\ add and remove from frx-head
+\ - a link list of completed high priority rx-buf,
+\ read from hrx-head (oldest packet), add to hrx-end (newest packet)
+\ - a link list of completed low priority rx-buf,
+\ read from lrx-head, add to lrx-end
+\ - lrx-cur points to the current rx-buf in reg 78
+\ - hrx-cur points to the current rx-buf in reg 74
+
+d# 512 constant #rx-bufs
+
+struct
+ /n field >rx-next
+ /n field >rx-buf
+ /n field >rx-buf-phy
+constant /rx-list
+/rx-list #rx-bufs * buffer: rx-list
+: 'rx-list ( idx -- adr )
+ dup #rx-bufs >= if drop 0 else /rx-list * rx-list + then
+;
+
+struct
+ 4 field >rxs-info
+ 4 field >rxs-stat1
+ 4 field >rxs-stat2
+ 4 field >rxs-stat3
+ 4 field >rxs-stat4
+ 4 field >rxs-stat5
+ 4 field >rxs-stat6
+ 4 field >rxs-stat7
+ 4 field >rxs-stat8
+ 4 field >rxs-stat9
+ 4 field >rxs-stat10
+ 4 field >rxs-stat11
+ 0 field >rxs-data \ Start of received data
+constant /rx-stat
+
+rx-bufsize 400 round-up constant /rx-buf
+#rx-bufs /rx-buf * constant /rx-bufs
+/rx-stat buffer: rx-stat-save
+
+: (rx-rssi) ( -- rssi ) rx-stat-save >rxs-stat5 le-l@ d# 24 >> ;
+' (rx-rssi) to rx-rssi
+\ After rx buffer is filled, queue it for later read operations.
+\ However, we should take care of antenna issue now, theoretically.
+\ But empirically a bad idea.
+: ?change-ant ( node -- )
+ >rx-buf @ >rxs-stat4 le-l@ 8 >> dup rx-defant <> if
+ rs-otherant-cnt 1+ dup 3 > if drop set-defant 0 else nip then
+ else
+ drop 0
+ then to rs-otherant-cnt
+;
+
+0 value rx-bufs
+0 value rx-bufs-phy
+0 value frx-head
+0 value hrx-head 0 value hrx-end
+0 value lrx-head 0 value lrx-end
+0 value lrx-cur 0 value hrx-cur
+
+\ Statistics: #hrx + #lrx + #frx should equal #rx-buf
+0 value #hrx 0 value #lrx 0 value #frx
+0 value rxs-stat11 \ OR all the >rxs-stat11 values
+: rxs-stat11! ( n -- ) rxs-stat11 or to rxs-stat11 ;
+: #hrx++ ( -- ) #hrx 1+ to #hrx ;
+: #hrx-- ( -- ) #hrx 1- to #hrx ;
+: #lrx++ ( -- ) #lrx 1+ to #lrx ;
+: #lrx-- ( -- ) #lrx 1- to #lrx ;
+: #frx++ ( -- ) #frx 1+ to #frx ;
+: #frx-- ( -- ) #frx 1- to #frx ;
+
+\ Statistics for lrx:
+\ #rx = total rx received (#rx = #rxq + #rxe)
+\ #rxq = total rx deemed ok to queue
+\ #rxe = total rx deemed not ok to queue
+\ #rxd = total rx dequeued (#rxd <= #rxq)
+\ #rxf = total rx freed (#rxd+#rxe <= #rxf <= #rx)
+0 value #rx 0 value #rxq 0 value #rxe 0 value #rxd 0 value #rxf
+: #rx++ ( -- ) #rx 1+ to #rx ;
+: #rxq++ ( -- ) #rxq 1+ to #rxq ;
+: #rxe++ ( -- ) #rxe 1+ to #rxe ;
+: #rxd++ ( -- ) #rxd 1+ to #rxd ;
+: #rxf++ ( -- ) #rxf 1+ to #rxf ;
+: init-rx-stat ( -- ) 0 to #rx 0 to #rxq 0 to #rxe 0 to #rxd 0 to #rxf ;
+: .rx-stat ( -- )
+ ." #rx = " #rx .d
+ ." #rxq = " #rxq .d
+ ." #rxe = " #rxe .d
+ ." #rxd = " #rxd .d
+ ." #rxf = " #rxf .d cr
+;
+
+: 'rx-buf ( idx -- adr ) /rx-buf * rx-bufs + ;
+: 'rx-buf-phy ( idx -- adr ) /rx-buf * rx-bufs-phy + ;
+
+: free-rx-bufs ( -- )
+ rx-bufs 0= if exit then
+ rx-bufs rx-bufs-phy /rx-bufs dma-map-out
+ rx-bufs /rx-bufs dma-free
+ 0 to rx-bufs
+;
+: alloc-rx-bufs ( -- )
+ rx-bufs if exit then
+ /rx-bufs dma-alloc to rx-bufs
+ rx-bufs /rx-bufs false dma-map-in to rx-bufs-phy
+;
+: init-rx-lists ( -- )
+ rx-list to frx-head
+ #rx-bufs 0 do
+ i 'rx-list ( 'list[i] )
+ i 1+ 'rx-list over >rx-next ! ( 'list[i] )
+ i 'rx-buf over >rx-buf ! ( 'list[i] )
+ i 'rx-buf-phy swap >rx-buf-phy ! ( )
+ loop
+ 0 to lrx-head 0 to lrx-end
+ 0 to hrx-head 0 to hrx-end
+ 0 to lrx-cur 0 to hrx-cur
+\ 0 to #hrx 0 to #lrx #rx-bufs to #frx
+;
+: init-rx-bufs ( -- )
+ alloc-rx-bufs
+ init-rx-lists
+;
+
+\ After rx buffer is read, put it back into the free rx-list
+: free-rx ( rx-list -- ) #rxf++ frx-head over >rx-next ! to frx-head #frx++ ;
+
+\ Use to get the next free rx buffer in the rx-list
+: next-frx ( -- rx-list )
+ frx-head 0= if debug-me abort" Run out of free rx buffers" then
+ frx-head dup >rx-next @ to frx-head
+ 0 over >rx-next !
+ #frx--
+;
+: node>pbuf ( rx-list -- padr )
+ dup 0= if debug-me abort" rx-list address is 0" then
+ dup >rx-buf-phy @
+ swap >rx-buf @ /rx-stat erase \ Clear rx status
+;
+: next-hrx ( -- rx-list ) next-frx dup to hrx-cur ;
+: next-lrx ( -- rx-list ) next-frx dup to lrx-cur ;
+
+: (queue-hrx) ( -- )
+ #hrx++
+ ascii ` vemit
+ hrx-end 0= if
+ hrx-cur dup to hrx-end to hrx-head
+ else
+ hrx-cur dup hrx-end >rx-next ! to hrx-end
+ then
+;
+: (queue-lrx) ( -- )
+ #lrx++
+ ascii . vemit
+ lrx-end 0= if
+ lrx-cur dup to lrx-end to lrx-head
+ else
+ lrx-cur dup lrx-end >rx-next ! to lrx-end
+ then
+;
+: (restart-hrx) ( rx-list -- ) node>pbuf 74 reg! ;
+: (restart-lrx) ( rx-list -- ) node>pbuf 78 reg! ;
+: restart-hrx ( -- ) next-hrx (restart-hrx) ;
+: restart-lrx ( -- ) next-lrx (restart-lrx) ;
+: done-rx? ( adr -- done? ) wa1+ le-w@ ATHEROS_ID = ;
+: ok-rx? ( adr -- ok? ) >rxs-stat11 c@ dup rxs-stat11! 3 and 3 = ;
+: queue-hrx ( -- )
+ hrx-cur 0= if exit then
+ hrx-cur >rx-buf @
+ dup done-rx? if
+ ok-rx? if
+ (queue-hrx) restart-hrx
+ else
+ ascii ? vemit
+ hrx-cur (restart-hrx)
+ then
+ else drop then
+;
+: queue-lrx ( -- )
+ lrx-cur 0= if exit then
+ lrx-cur >rx-buf @
+ dup done-rx? if
+ #rx++
+ ok-rx? if
+ (queue-lrx) restart-lrx
+ #rxq++
+ else
+ #rxe++ ascii ? vemit
+ lrx-cur (restart-lrx)
+ then
+ else drop then
+;
+: queue-rx ( -- ) queue-hrx queue-lrx ;
+
+\ Retrieve rx buffer for read operations
+\ The descriptor is not freed here. When the caller is done with the buffer
+\ it needs to call free-rx to return the descriptor/buffer pair to the free list.
+
+: (deque-hrx) ( -- node adr len )
+ #hrx--
+ hrx-head dup >rx-buf @ ( node buf )
+ dup rx-stat-save /rx-stat move \ Save the rx status descriptor
+ dup >rxs-data ( node buf adr )
+ swap >rxs-stat2 le-l@ fff and ( node adr len )
+ 4 -
+ hrx-head >rx-next @ dup to hrx-head
+ 0= if 0 to hrx-end then
+;
+: (deque-lrx) ( -- node adr len )
+ #lrx-- #rxd++
+ lrx-head dup >rx-buf @ ( node buf )
+ dup rx-stat-save /rx-stat move \ Save the rx status descriptor
+ dup >rxs-data ( node buf adr )
+ swap >rxs-stat2 le-l@ fff and ( node adr len )
+ 4 -
+ lrx-head >rx-next @ dup to lrx-head
+ 0= if 0 to lrx-end then
+;
+: deque-rx ( -- false | node adr len true )
+ hrx-head if (deque-hrx) true else false then
+ ?dup 0= if
+ lrx-head if (deque-lrx) true else false then
+ then
+;
+: flush-rxq ( -- )
+ begin queue-rx deque-rx while 2drop free-rx repeat
+ 0 to rs-otherant-cnt
+;
+
+: calc-rxfilter ( -- filter )
+ get-rxfilter RX_FILTER_PHYERR RX_FILTER_PHYRADAR or and
+ RX_FILTER_UCAST or RX_FILTER_BCAST or ( RX_FILTER_MCAST or )
+ RX_FILTER_BEACON or
+ use-promiscuous? if RX_FILTER_PROM or then
+;
+
+: init-opmode ( -- )
+ calc-rxfilter
+ set-rxfilter
+ set-bssidmask
+ set-opmode
+ -1 -1 set-mcastfilter
+;
+
+: start-pcu-receive ( scanning? -- )
+ enable-mib-counters
+ reset-ani
+ 0 200.0020 8048 reg@!
+;
+
+true value first-start-rx?
+: start-rx ( -- )
+\ init-rx-stat
+ 0 to rs-otherant-cnt
+ 0 8 reg!
+ hrx-cur ?dup if (restart-hrx) else restart-hrx then
+ lrx-cur ?dup if (restart-lrx) else restart-lrx then
+ init-opmode
+ first-start-rx? start-pcu-receive
+ false to first-start-rx?
+;
+' start-rx to start-receive
+
+: stop-rx-dma ( -- )
+ 8100 58 reg!
+ 20 8 reg!
+ 20 20 8 wait-hw drop
+;
+
+: (stop-rx) ( -- )
+ 200.0020 dup 8048 reg@!
+ disable-mib-counters
+ 0 set-rxfilter
+ stop-rx-dma
+ flush-rxq
+;
+' (stop-rx) to stop-rx
+
+\ =================================================================================
+d# 2000 constant scan-time
+d# 1 constant scan-time-interval ( ms )
+
+d# 32 constant max-cmac
+/mac-adr max-cmac * constant /cmac
+/cmac buffer: cmac
+0 value #cmac
+
+: mac-cached? ( adr -- found? )
+ #cmac 0= if drop false exit then
+ false swap #cmac 0 do
+ dup cmac i /mac-adr * + /mac-adr comp 0= if nip true swap leave then
+ loop drop
+;
+: ?cache-mac ( adr -- new? )
+ dup mac-cached? if drop false exit then
+ #cmac max-cmac >= if
+ ." Run out of space to cache unique source addresses" cr
+ drop true exit \ Assume it's new
+ then
+ /mac-adr #cmac * cmac + /mac-adr move
+ #cmac 1+ to #cmac
+ true
+;
+: ?add-scan-response ( -- )
+ respbuf d# 10 + ?cache-mac if add-scan-response then
+;
+
+d# 500 constant scan-threshold
+0 value scan-start-ms
+: (scan-ch) ( -- )
+ get-msecs to scan-start-ms
+ scan-time 0 do
+ queue-rx
+ deque-rx if ( node adr len )
+ process-rx ( node )
+ free-rx
+ got-response? if ?add-scan-response then
+ get-msecs to scan-start-ms
+ else
+ get-msecs scan-start-ms - scan-threshold >= if leave then
+ then
+ scan-time-interval ms
+ loop
+;
+
+: scan-ch ( ch# -- )
+ restart-scan-response
+ ." Scanning channel: " dup idx>ch .d ." ..." cr
+ re-set-channel (scan-ch)
+ scanbuf .ssids
+;
+: scan-ch-2GHz ( -- ) d# 11 0 do i scan-ch loop ;
+: scan-ch-5GHz-1 ( -- ) d# 18 d# 14 do i scan-ch loop ;
+: scan-ch-5GHz-2 ( -- ) d# 22 d# 18 do i scan-ch loop ;
+: scan-ch-5GHz-M ( -- ) d# 33 d# 22 do i scan-ch loop ;
+: scan-ch-5GHz-3 ( -- ) d# 38 d# 33 do i scan-ch loop ;
+: scan-ch-5GHz ( -- )
+ scan-ch-5GHz-1
+ scan-ch-5GHz-2
+\ scan-ch-5GHz-M
+ scan-ch-5GHz-3
+;
+: scan-ch-all ( -- )
+ scan-ch-2GHz
+ scan-ch-5GHz
+;
+
+: scan-passive ( adr len -- )
+ 0 to #cmac
+ 80 to resp-type
+ start-scan-response
+ scan-ch-all
+;
+
+: scan-passive-quick ( adr len -- )
+ 0 to #cmac
+ 80 to resp-type
+ start-scan-response
+ (scan-ch)
+ scanbuf .ssids
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/ath9k/tx.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/ath9k/tx.fth Fri Dec 9 21:31:14 2011 (r2760)
@@ -0,0 +1,588 @@
+purpose: ATH9K tx code
+\ See license at end of file
+
+headers
+hex
+
+\ tx data structures
+
+0 constant data-qcu
+8 constant cab-qcu
+9 constant beacon-qcu
+
+: qreg@ ( reg q -- val ) 2 << + reg@ ;
+: qreg! ( val reg q -- ) 2 << + reg! ;
+: qreg@! ( val mask reg q -- ) 2 << + reg@! ;
+
+struct
+ /n field >rs-tries
+ /n field >rs-rate
+ /n field >rs-chain
+ /n field >rs-duration
+ /n field >rs-flags
+ /n field >rs-idx
+constant /rate-series
+
+0 value rseries
+
+create noack-series 1 , 1b , 3 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+
+create nondata-series a , 1b , 3 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+
+create data-series 4 , c , 3 , 0 , 0 , b ,
+ 4 , 8 , 3 , 0 , 1 , a ,
+ 4 , d , 3 , 0 , 1 , 9 ,
+ 8 , 9 , 3 , 0 , 1 , 8 ,
+
+create beacon-series 1 , 1b , 3 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+ 0 , 0 , 0 , 0 , 0 , -1 ,
+
+\ >rs-flags bit definitions
+1 constant RS_RTS_CTS \ program RTS/CTS rate and enable either RTS or CTS
+2 constant RS_2040 \ 40MHz width
+4 constant RS_HALFGI
+8 constant RS_STBC
+
+: 'series ( adr idx -- adr[idx] ) /rate-series * + ;
+: rs-tries@ ( adr idx -- tries ) 'series >rs-tries @ ;
+: rs-rate@ ( adr idx -- rate ) 'series >rs-rate @ ;
+: rs-dur@ ( adr idx -- dur ) 'series >rs-duration @ ;
+: rs-flags@ ( adr idx -- flags ) 'series >rs-flags @ ;
+: rs-chain@ ( adr idx -- chain ) 'series >rs-chain @ ;
+: rs-idx@ ( adr idx -- br-idx ) 'series >rs-idx @ ;
+: rs-tries! ( tries adr idx -- ) 'series >rs-tries ! ;
+: rs-rate! ( rate adr idx -- ) 'series >rs-rate ! ;
+: rs-dur! ( dur adr idx -- ) 'series >rs-duration ! ;
+: rs-flags! ( flags adr idx -- ) 'series >rs-flags ! ;
+: rs-chain! ( chain adr idx -- ) 'series >rs-chain ! ;
+: rs-idx! ( br-idx adr idx -- ) 'series >rs-idx ! ;
+
+false value noack?
+0 value fctl
+0 value rtsctsrate
+0 value data-rtsctsrate
+0 value txd-flag
+: idx>hw-val ( idx -- hw-val )
+ 'legacy-rates preamble if >br-hw-val-short else >br-hw-val then @
+;
+: find-next-lower-rate ( idx -- idx | -1 )
+ dup -1 = if exit then ( -1 )
+ 1- begin ( idx-1 )
+ dup 'legacy-rates >br-bitrate @ is-common-rate? if exit then
+ 1-
+ 0< until ( -1 )
+;
+: do-one-rate ( idx -- -1 ) drop -1 ;
+: (setup-data-series) ( -- )
+ data-series /rate-series 4 * erase
+ currate 4 0 do
+ dup data-series i rs-idx!
+ dup -1 <> if
+ dup idx>hw-val dup to data-rtsctsrate data-series i rs-rate!
+ txchainmask data-series i rs-chain!
+ i if 1 data-series i rs-flags! then
+ i 3 = if 8 else 4 then data-series i rs-tries!
+ find-next-lower-rate
+noop
+ then
+ loop drop
+;
+: setup-series ( -- )
+ curchan is-5GHz? if 1 else 0 then
+ dup noack-series 0 rs-idx!
+ dup nondata-series 0 rs-idx!
+ idx>hw-val dup noack-series 0 rs-rate!
+ nondata-series 0 rs-rate!
+ txchainmask noack-series 0 rs-chain!
+ txchainmask nondata-series 0 rs-chain!
+ txchainmask beacon-series 0 rs-chain!
+ (setup-data-series)
+;
+' setup-series to setup-data-series
+
+: setup-rseries ( framelen -- )
+ \ Determine the series and the rtsctsrate to use
+ noack? if
+ noack-series dup 0 rs-rate@ 0
+ else
+ fctl c and 8 = if
+ data-series data-rtsctsrate 1
+ else
+ nondata-series dup 0 rs-rate@ 0
+ then
+ then to txd-flag to rtsctsrate to rseries
+
+ \ Compute tx duration per valid entry in the series
+ 4 0 do ( framelen )
+ rseries i rs-idx@ dup -1 = if drop leave then
+ 'legacy-rates >br-bitrate @ d# 100 * over preamble ( framelen kbps framelen shortpre? )
+ curchan is-2GHz? if
+ rseries i rs-idx@ 'legacy-rates >br-flags @ br-erp-g and
+ if WLAN_RC_PHY_OFDM else WLAN_RC_PHY_CCK then
+ else
+ WLAN_RC_PHY_OFDM
+ then
+ compute-txtime ( framelen duration )
+ rseries i rs-dur! ( framelen )
+ loop drop
+;
+
+struct
+ 4 field >tx-info
+ 4 field >tx-link
+ 4 field >tx-buf0
+ 4 field >tx-len0
+ 6 4 * + \ buf1-3, len1-3
+ 4 field >tx-ctl10
+ 4 field >tx-ctl11
+ 4 field >tx-ctl12
+ 4 field >tx-ctl13
+ 4 field >tx-ctl14
+ 4 field >tx-ctl15
+ 4 field >tx-ctl16
+ 4 field >tx-ctl17
+ 4 field >tx-ctl18
+ 4 field >tx-ctl19
+ 4 field >tx-ctl20
+ 4 field >tx-ctl21
+ 4 field >tx-ctl22
+ d# 128 round-up
+constant /tx-desc
+d# 2 constant #tx-descs
+#tx-descs /tx-desc * constant /tx-descs
+0 value beacon-desc 0 value beacon-desc-phy
+0 value tx-desc 0 value tx-desc-phy
+0 value /beacon
+
+struct
+ 4 field >txs-info
+ 4 field >txs-s1
+ 4 field >txs-s2
+ 4 field >txs-s3
+ 4 field >txs-s4
+ 4 field >txs-s5
+ 4 field >txs-s6
+ 4 field >txs-s7
+ 4 field >txs-s8
+constant /txs-desc
+d# 64 constant #txs-desc
+#txs-desc /txs-desc * constant /txs-ring
+0 value txs-start 0 value txs-start-phy
+0 value txs-end 0 value txs-end-phy
+0 value txs-cur
+
+/rx-buf /tx-desc + constant /tx-buf
+0 value tx-beacon 0 value tx-beacon-phy
+
+: txs>phy ( virt -- phys ) txs-start - txs-start-phy + ;
+: txs>virt ( phys -- virt ) txs-start-phy - txs-start + ;
+
+\ In the ideal world where the hardware works properly, txs-cur++ is ok.
+: txs-cur++ ( -- )
+ txs-cur /txs-desc + dup txs-end >= if drop txs-start then
+ to txs-cur
+;
+\ In the real world where the hardware does not always advance the status ring, we
+\ have to sync our view with its view and clear memory between its pointer and ours.
+: clear-txs ( htxs -- )
+ txs-cur over > if \ Ring wrapped around
+ txs-cur txs-end over - erase
+ txs-start tuck - erase
+ else
+ txs-cur tuck - erase
+ then
+;
+: sync-txs-cur ( -- )
+ 838 reg@ txs>virt dup clear-txs to txs-cur
+;
+
+: free-txs-ring ( -- )
+ txs-start 0= if exit then
+ txs-start txs-start-phy /txs-ring dma-map-out
+ txs-start /txs-ring dma-free
+ 0 to txs-start
+;
+: alloc-txs-ring ( -- )
+ txs-start if exit then
+ /txs-ring dma-alloc to txs-start
+ txs-start /txs-ring erase
+ txs-start /txs-ring false dma-map-in to txs-start-phy
+ txs-start /txs-ring + to txs-end
+ txs-start-phy /txs-ring + to txs-end-phy
+;
+: free-tx-desc ( -- )
+ tx-desc 0= if exit then
+ tx-desc tx-desc-phy /tx-descs dma-map-out
+ tx-desc /tx-descs dma-free
+ 0 to tx-desc
+;
+: alloc-tx-desc ( -- )
+ tx-desc if exit then
+ /tx-descs dma-alloc to tx-desc
+ tx-desc /tx-descs erase
+ tx-desc /tx-descs false dma-map-in to tx-desc-phy
+;
+: free-beacon-buf ( -- )
+ tx-beacon 0= if exit then
+ tx-beacon tx-beacon-phy /tx-buf dma-map-out
+ tx-beacon /tx-buf dma-free
+ 0 to tx-beacon
+;
+: alloc-beacon-buf ( -- )
+ tx-beacon if exit then
+ /tx-buf dma-alloc to tx-beacon
+ tx-beacon /tx-buf erase
+ tx-beacon /tx-buf false dma-map-in to tx-beacon-phy
+;
+: free-tx-bufs ( -- )
+ free-txs-ring
+ free-tx-desc
+ free-beacon-buf
+;
+: init-tx-bufs ( -- )
+ alloc-txs-ring
+ txs-start to txs-cur
+ alloc-tx-desc
+ alloc-beacon-buf
+ tx-desc /tx-desc + to beacon-desc
+ tx-desc-phy /tx-desc + to beacon-desc-phy
+;
+
+: set-txs-ring ( -- )
+ txs-start-phy 830 reg!
+ txs-end-phy 834 reg!
+;
+' set-txs-ring to reset-txstatus-ring
+
+: fill-txd-11n ( keytype type key pwr flen desc -- )
+ >r
+ ( flen ) swap ( pwr ) d# 16 << or 3 pick ( keytype ) if 4000.0000 or then
+ 100.0000 or r@ >tx-ctl11 le-l!
+ \ type: 0-normal, 1-atim, 2-pspoll, 3-beacon, 4-probe resp, 5-chirp, 6-grp-poll
+ ( key ) 7f and d# 13 << swap
+ ( type ) dup d# 20 << swap 3 = if 100.0000 or then or
+ r@ >tx-ctl12 le-l@ or r@ >tx-ctl12 le-l!
+ \ XXX If both us and AP supports LDPC, ctl17 |= 8000.0000
+ \ keytype: 0-none, 1-wep, 2-aes, 3-tkip
+ ( keytype ) d# 26 << r@ >tx-ctl17 le-l!
+ 2000.0000 r> >tx-ctl19 le-l!
+;
+
+: fill-txd-rate ( ctsrate series flag desc -- )
+ >r
+ r@ >tx-ctl11 le-l@ 8040.0000 invert and
+ swap ?dup if 1 = if 40.0000 or else 80.0000 or then then
+ r@ >tx-ctl11 le-l!
+
+ dup 0 rs-tries@ d# 16 << ( ctrrate series tries )
+ over 1 rs-tries@ d# 20 << or ( ctrrate series tries' )
+ over 2 rs-tries@ d# 24 << or ( ctrrate series tries' )
+ over 3 rs-tries@ d# 28 << or ( ctrrate series tries' )
+ r@ >tx-ctl13 le-l! ( ctrrate series )
+
+ dup 0 rs-rate@
+ over 1 rs-rate@ d# 8 << or
+ over 2 rs-rate@ d# 16 << or
+ over 3 rs-rate@ d# 24 << or
+ r@ >tx-ctl14 le-l!
+
+ dup 0 rs-dur@ over 0 rs-flags@ 1 and if 8000 or then
+ over 1 rs-dur@ 2 pick 1 rs-flags@ 1 and if 8000 or then
+ wljoin r@ >tx-ctl15 le-l!
+ dup 2 rs-dur@ over 2 rs-flags@ 1 and if 8000 or then
+ over 3 rs-dur@ 2 pick 3 rs-flags@ 1 and if 8000 or then
+ wljoin r@ >tx-ctl16 le-l!
+
+ dup 0 rs-chain@ d# 2 << ( ctrrate series chain )
+ over 1 rs-chain@ d# 7 << or ( ctrrate series chain' )
+ over 2 rs-chain@ d# 12 << or ( ctrrate series chain' )
+ over 3 rs-chain@ d# 17 << or ( ctrrate series chain' )
+ nip swap d# 20 << or r> >tx-ctl18 le-l!
+;
+: chksum-tx-desc ( desc -- chksum )
+ 0 d# 10 0 do over i la+ le-l@ + loop nip
+ lwsplit + ffff and
+;
+: fill-txd ( noack? len padr qcu desc -- )
+ >r
+ ( qcu ) 8 << ATHEROS_ID d# 16 << or c017 or r@ >tx-info le-l!
+ ( padr ) r@ >tx-buf0 le-l!
+ ( len ) d# 16 << r@ >tx-len0 le-l!
+ r@ chksum-tx-desc r@ >tx-ctl10 le-l!
+ ( noack? ) 1 and d# 24 << r> >tx-ctl12 le-l!
+;
+
+: (xmit) ( padr qcu -- ) sync-txs-cur 2 << 800 + reg! ;
+
+: key-type ( -- keytype keyidx )
+ wep-enabled? if 1 wep-idx exit then
+ pkey-enabled? if pkey-tkip? if 3 else 2 then pair-idx exit then
+ 0 0 exit
+;
+
+: (xmit-data) ( -- ) tx-desc-phy data-qcu (xmit) ;
+: xmit-data ( adr len -- )
+ 2dup >r dup le-w@ to fctl ( adr len adr ) ( R: len )
+ 4 + c@ 1 and dup to noack? -rot ( noack? adr len ) ( R: len )
+ tuck false dma-map-in ( noack? len padr ) ( R: len )
+ data-qcu tx-desc fill-txd ( ) ( R: len )
+ r> 4 + fctl 4000 and if \ Compute framelen, add ICV or MIC len
+ wep-enabled? if 4 + then
+ pkey-enabled? if pkey-tkip? if d# 12 else 8 then + then
+ then >r ( ) ( R: flen )
+ key-type 0 swap d# 63 r@ tx-desc fill-txd-11n ( ) ( R: flen )
+ r> setup-rseries ( )
+ rtsctsrate rseries txd-flag tx-desc fill-txd-rate ( )
+ (xmit-data)
+;
+
+: (xmit-cab) ( -- ) tx-desc-phy cab-qcu (xmit) ;
+: xmit-cab ( adr len -- )
+ dup >r true -rot ( noack? adr len ) ( R: len )
+ tuck false dma-map-in ( noack? len padr ) ( R: len )
+ cab-qcu tx-desc fill-txd ( ) ( R: len )
+ 0 0 0 d# 63 r> 4 + tx-desc fill-txd-11n ( )
+ 0 beacon-series 0 tx-desc fill-txd-rate ( )
+ (xmit-cab)
+;
+
+\ XXX beacon-qcu fails for some reason. It used to work.
+: (xmit-beacon) ( -- ) beacon-desc-phy beacon-qcu (xmit) ;
+: xmit-beacon ( -- )
+ true /beacon tx-beacon-phy beacon-qcu beacon-desc fill-txd
+ 0 3 0 d# 63 /beacon 4 + beacon-desc fill-txd-11n
+ 0 beacon-series 0 beacon-desc fill-txd-rate
+ (xmit-beacon)
+;
+
+\ XXX hard code
+: hard-code-beacon ( -- )
+ " dummy-ap" dup to /ssid ssid swap move
+ broadcast-mac$ 2dup 0 h# 80 set-802.11n-mgr-hdr
+
+ 0 +xl 0 +xl \ 8-byte timestamp
+ d# 100 +xw \ Beacon interval
+ 411 +xw \ Capability mask
+
+ 0 +xb \ element ID = SSID
+ ssid$ dup +xb \ length ( adr len )
+ ( adr len ) +x$ \ SSID
+
+ 1 +xb \ element ID = Supported rates
+ 8 +xb \ length
+ 2 +xb 4 +xb d# 11 +xb d# 22 +xb \ 1 2 5.5 11 Mb/sec
+ d# 12 +xb d# 18 +xb d# 24 +xb d# 36 +xb \ 6 9 12 18 Mb/sec
+
+ 3 +xb \ element ID = DS parameter set
+ 1 +xb \ length
+ d# 11 +xb \ Channel number
+
+ 5 +xb \ element ID = TIM (Traffic Indicator Map) parameter set
+ 4 +xb \ length
+ 0 +xb \ DTIM Count
+ 1 +xb \ DTIM Period
+ 0 +xb \ Bitmap control
+ 0 +xb \ Bitmap
+
+ 7 +xb \ element ID = country
+ 6 +xb \ length
+ " US " +x$ \ Country string
+ 1 +xb \ First channel
+ d# 11 +xb \ Number of channels
+ 12 +xb \ Max transmit power
+
+ d# 42 +xb \ element ID = ERP info
+ 1 +xb \ length
+ 0 +xb \ no non-ERP stations, do not use protection, short or long preambles
+
+ d# 50 +xb \ element ID = Extended supported rates
+ 4 +xb \ length
+ d# 48 +xb d# 72 +xb d# 96 +xb d# 108 +xb \ 24 36 48 54 Mb/sec
+
+ \ XXX HT capabilities, HT Information, Overlap BSS Scan, Extended Capabilities
+
+ /x to /beacon
+ packet-buf tx-beacon /beacon move
+;
+
+: reset-beacon-queue ( -- )
+ 10.0000 1040 beacon-qcu qreg! \ DCU IFS settings
+ 8.200a 1080 beacon-qcu qreg! \ DCU retry limits
+ 8a0 9c0 beacon-qcu qreg! \ QCU misc settings
+ 24.1002 1100 beacon-qcu qreg! \ DCU misc settings (don't set beacon bit)
+ 0 10c0 beacon-qcu qreg! \ DCU channel time settings
+;
+: reset-data-queue ( -- )
+ curchan is-b? if 1f else f then
+ 3f.fc00 or 1040 data-qcu qreg! \ DCU IFS settings
+ 8.200a 1080 data-qcu qreg! \ DCU retry limits
+ 800 9c0 data-qcu qreg! \ QCU misc settings
+ 1002 1100 data-qcu qreg! \ DCU misc settings (1102 to enable fragment wait)
+ 0 10c0 data-qcu qreg! \ DCU channel time settings, no burst
+;
+
+: .txs ( ok? -- )
+ 0= if txs-cur >txs-s3 @ . then
+;
+
+d# 10 constant tx-retry-cnt
+d# 1 constant tx-retry-delay-time
+d# 100 constant tx-wait-delay
+: tx-delay ( -- ) tx-wait-delay us ;
+: tickle-txs ( -- ) 838 reg@ drop ; \ Supersition
+
+\ Empirically, the chip does not update the status ring immediately.
+\ Sometimes, a few frames later, it regurgitates the stale status descriptors.
+\ To avoid waiting on the wrong location, we need to sync our pointer with
+\ the hardware pointer. We do that here and before transmit to catch as many
+\ cases as possible.
+
+\ Statistics:
+\ (probe-ssid): i = 1-0x20+
+\ authenticate : i = 1-0x20+, status = 1 or 102, response or no regardless of status
+
+\ Theoretically, the code should really examine the status bits.
+\ Empirically, I found them unreliable. An ACKed packet may have the status 0x102.
+\ And yet, I see the ACK and the response on the air. So, ignore for now.
+
+0 value isr-sp
+0 value isr-s0
+0 value isr-s1
+0 value isr-s2
+0 value isr-adr
+0 value #tx-reset
+0 value #tx-reseti
+0 value #tx-reset-max
+0 value #tx-retry
+0 value debug-base
+: #tx-reset++ ( -- )
+ #tx-reset 1+ to #tx-reset
+ #tx-reseti 1+ dup to #tx-reseti
+ #tx-reset-max max to #tx-reset-max
+;
+: .tx-stat ( -- ) ." #tx-reset = " #tx-reset .d cr ;
+: tx-timeout? ( -- flag ) isr-s2 80.0000 and ;
+
+: init-isr-dump ( -- ) debug-base to isr-adr ;
+: isr-dump! ( n -- )
+ debug-base if
+ isr-adr ! isr-adr na1+ to isr-adr
+ else
+ drop
+ then
+;
+: isr-status@ ( -- )
+ c0 reg@ to isr-sp
+ c4 reg@ to isr-s0
+ c8 reg@ to isr-s1
+ d0 reg@ to isr-s2
+ isr-s0 isr-dump! isr-s1 isr-dump! isr-s2 isr-dump! 64 reg@ isr-dump!
+;
+: tx-reset ( -- )
+ ascii r vemit #tx-reset++
+ a00 data-qcu qreg@ isr-dump! 840 reg@ isr-dump!
+ reset
+ a00 data-qcu qreg@ isr-dump! 840 reg@ isr-dump!
+;
+: tx-retry-delay ( -- )
+ queue-rx
+ 4 0 do -1 isr-dump! loop
+ tx-retry-delay-time ms
+ queue-rx
+;
+
+: (wait-tx-done) ( -- done? )
+ begin
+ queue-rx \ In case if the chip got stuck in txstat update, we won't miss rx
+ tx-delay
+ isr-status@
+ isr-s1 ffff and ( TXERR ) isr-s0 ( TXOK ) or tx-timeout? or until
+
+ isr-s0
+ debug? if txs-cur >txs-s3 le-l@ . then
+ sync-txs-cur
+ queue-rx
+;
+
+: wait-tx-done ( -- done? )
+ 0 to #tx-reseti
+ init-isr-dump
+ false tx-retry-cnt 1+ 0 do
+ i to #tx-retry
+ (wait-tx-done) if drop true leave then
+ ascii | vemit
+ i tx-retry-cnt < if
+ isr-s1 ffff and 0= if tx-reset then
+ tx-retry-delay (xmit-data)
+ then
+ loop
+;
+
+: send-beacon ( -- done? )
+ xmit-beacon (wait-tx-done) \ No need to retry
+;
+
+: (reset-txqueue) ( -- )
+ reset-beacon-queue
+ reset-data-queue
+ 1 a40 reg! \ Chksum ptr & len
+;
+' (reset-txqueue) to reset-txqueue
+' set-txs-ring to init-tx
+
+: drain-txqueue ( -- )
+ \ Abort tx dma
+ 3ff 880 reg! \ Disable tx queues
+ 104.0000 dup 8120 reg@! \ Force quiet collision, Clear virtual more fragment
+ 40.0000 dup 8048 reg@! \ Force RX_CLEAR high
+ 1000.0000 dup 10f0 reg@! \ Ignore backoff
+
+ d# 10 0 do
+ d# 1000 0 do
+ a00 j qreg@ 3 and 0= if
+ 840 reg@ 1 j << and 0= if leave then
+ then
+ 5 us
+ loop
+ loop
+
+ 0 104.0000 8120 reg@!
+ 0 1000.0000 10f0 reg@!
+ 0 40.0000 8048 reg@!
+ 0 880 reg!
+;
+' drain-txqueue to stop-tx
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
More information about the openfirmware
mailing list