2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/swcr.c#1 $
15 ** 09 03 2013 jeffrey.chang
16 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
19 ** 08 28 2013 jeffrey.chang
20 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
23 ** 08 28 2013 jeffrey.chang
24 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
25 ** modify set ip address logic
27 ** 08 28 2013 jeffrey.chang
28 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
29 ** 1) clear the IP buffer
31 ** 08 28 2013 jeffrey.chang
32 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
33 ** 1) modify code which may cause assert
35 ** 08 26 2013 jeffrey.chang
36 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
39 ** 08 26 2013 jeffrey.chang
40 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
41 ** 1) Add SwCr for enable/disable ARP filter
43 ** 08 26 2013 jeffrey.chang
44 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
45 ** 1) change the naming convetion of RX filter to be more general
46 ** (following Android rules)
48 ** 08 23 2013 jeffrey.chang
49 ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
50 ** 1) align Android design, only allow MC packet with table lookup passed.
51 ** 2) For mulicast routing, kernel driver will turn on and pass all MC packet through
54 ** 08 22 2013 tsaiyuan.hsu
55 ** [BORA00002222] MT6630 unified MAC RXM
56 ** add mDNS filter for Android.
58 ** 08 13 2013 terry.wu
59 ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
62 ** 08 05 2013 terry.wu
63 ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
64 ** 1. Add SW rate definition
65 ** 2. Add HW default rate selection logic from FW
67 ** 06 25 2013 terry.wu
68 ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
69 ** Update for 1st connection
72 ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
73 ** 1. remove unused HIF definitions
74 ** 2. enable NDIS 5.1 build success
76 ** 03 12 2013 terry.wu
77 ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
78 ** Update Tx utility function for management frame
81 ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
82 ** submit some code related with security.
85 ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
86 ** take use of GET_BSS_INFO_BY_INDEX() and MAX_BSS_INDEX macros
87 ** for correctly indexing of BSS-INFO pointers
89 ** 01 28 2013 cm.chang
90 ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
94 ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
95 ** modification for ucBssIndex migration
97 ** 01 15 2013 terry.wu
98 ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
99 ** Update Tx done resource release mechanism.
101 ** 09 17 2012 cm.chang
102 ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
103 ** Duplicate source from MT6620 v2.3 driver branch
104 ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
106 * 06 04 2012 tsaiyuan.hsu
107 * [WCXRP00001249] [ALPS.ICS] Daily build warning on "wlan/mgmt/swcr.c#1"
108 * resolve build waring for "WNM_UNIT_TEST not defined".
110 * 03 02 2012 terry.wu
112 * Sync CFG80211 modification from branch 2,2.
114 * 01 05 2012 tsaiyuan.hsu
115 * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
116 * add timing measurement support for 802.11v.
118 * 11 22 2011 tsaiyuan.hsu
119 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
120 * keep debug counter setting after wake up.
122 * 11 15 2011 cm.chang
124 * Fix compiling warning
126 * 11 11 2011 tsaiyuan.hsu
127 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
128 * fix debug counters of rx in driver.
130 * 11 11 2011 tsaiyuan.hsu
131 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
132 * add debug counters of bb and ar for xlog.
134 * 11 10 2011 eddie.chen
135 * [WCXRP00001096] [MT6620 Wi-Fi][Driver/FW] Enhance the log function (xlog)
136 * Modify the QM xlog level and remove LOG_FUNC.
138 * 11 08 2011 tsaiyuan.hsu
139 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
140 * add debug counters, eCurPsProf, for PS.
142 * 11 07 2011 tsaiyuan.hsu
143 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
144 * add debug counters and periodically dump counters for debugging.
147 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
148 * change the DBGLOG for "\n" and "\r\n". LABEL to LOUD for XLOG
150 * 08 31 2011 tsaiyuan.hsu
151 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
152 * remove obsolete code.
154 * 08 15 2011 tsaiyuan.hsu
155 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
156 * add swcr in driver reg, 0x9fxx0000, to disable roaming .
158 * 05 11 2011 eddie.chen
159 * [WCXRP00000709] [MT6620 Wi-Fi][Driver] Check free number before copying broadcast packet
160 * Fix dest type when GO packet copying.
162 * 05 09 2011 eddie.chen
163 * [WCXRP00000709] [MT6620 Wi-Fi][Driver] Check free number before copying broadcast packet
164 * Check free number before copying broadcast packet.
166 * 04 14 2011 eddie.chen
167 * [WCXRP00000603] [MT6620 Wi-Fi][DRV] Fix Klocwork warning
168 * Check the SW RFB free. Fix the compile warning..
170 * 04 12 2011 eddie.chen
171 * [WCXRP00000617] [MT6620 Wi-Fi][DRV/FW] Fix for sigma
172 * Fix the sta index in processing security frame
173 * Simple flow control for TC4 to avoid mgt frames for PS STA to occupy the TC4
176 * 03 28 2011 eddie.chen
177 * [WCXRP00000603] [MT6620 Wi-Fi][DRV] Fix Klocwork warning
178 * Fix Klockwork warning.
180 * 03 15 2011 eddie.chen
181 * [WCXRP00000554] [MT6620 Wi-Fi][DRV] Add sw control debug counter
182 * Add sw debug counter for QM.
184 * 01 11 2011 eddie.chen
185 * [WCXRP00000322] Add WMM IE in beacon,
186 Add per station flow control when STA is in PS
194 /*******************************************************************************
195 * C O M P I L E R F L A G S
196 ********************************************************************************
199 /*******************************************************************************
200 * E X T E R N A L R E F E R E N C E S
201 ********************************************************************************
208 /*******************************************************************************
210 ********************************************************************************
213 /*******************************************************************************
214 * P U B L I C D A T A
215 ********************************************************************************
217 UINT_32 g_au4SwCr
[SWCR_CR_NUM
]; /*: 0: command other: data */
220 UINT_32 g_u4RXFilter
= 0; /* [31] 0: stop 1: start, [3] IPv6 [2] IPv4 */
222 static TIMER_T g_rSwcrDebugTimer
;
223 static BOOLEAN g_fgSwcrDebugTimer
= FALSE
;
224 static UINT_32 g_u4SwcrDebugCheckTimeout
;
225 static ENUM_SWCR_DBG_TYPE_T g_ucSwcrDebugCheckType
;
226 static UINT_32 g_u4SwcrDebugFrameDumpType
;
228 /*******************************************************************************
229 * P R I V A T E D A T A
230 ********************************************************************************
232 static const PFN_CMD_RW_T g_arSwCtrlCmd
[] = {
236 , testPsCmdCategory0
, testPsCmdCategory1
238 #if CFG_SUPPORT_802_11V
239 #if (CFG_SUPPORT_802_11V_TIMING_MEASUREMENT == 1) && (WNM_UNIT_TEST == 1)
240 , testWNMCmdCategory0
246 const PFN_SWCR_RW_T g_arSwCrModHandle
[] = {
252 /*******************************************************************************
254 ********************************************************************************
267 SWCTRL_DUMP_ALL_QUEUE_LEN
,
271 SWCTRL_DUMP_QM_DBG_CNT
,
275 #if CFG_INIT_ENABLE_PATTERN_FILTER_ARP
276 SWCTRL_RX_ARP_OFFLOAD
,
280 SWCTRL_CATA0_INDEX_NUM
287 SWCTRL_CATA1_INDEX_NUM
291 #define RX_FILTER_START (1<<31)
292 #define RX_FILTER_IPV4 (1<<2)
293 #define RX_FILTER_IPV6 (1<<3)
294 typedef enum _ENUM_SWCR_RX_FILTER_CMD_T
{
295 SWCR_RX_FILTER_CMD_STOP
= 0,
296 SWCR_RX_FILTER_CMD_START
,
297 SWCR_RX_FILTER_CMD_ADD
,
298 SWCR_RX_FILTER_CMD_REMOVE
,
300 } ENUM_SWCR_RX_FILTER_CMD_T
;
307 TEST_PS_ENABLE_BEACON
,
311 TEST_PS_UPDATE_BEACON
,
312 TEST_PS_CATA0_INDEX_NUM
317 TEST_PS_STA_ENTER_PS
,
319 TEST_PS_STA_TRIGGER_PSPOLL
,
320 TEST_PS_STA_TRIGGER_FRAME
,
321 TEST_PS_CATA1_INDEX_NUM
325 #if CFG_SUPPORT_802_11V
328 TEST_WNM_TIMING_MEAS
,
329 TEST_WNM_CATA0_INDEX_NUM
335 #define _SWCTRL_MAGIC 0x66201642
337 /*******************************************************************************
338 * F U N C T I O N D E C L A R A T I O N S
339 ********************************************************************************
343 /*******************************************************************************
345 ********************************************************************************
348 void dumpQueue(P_ADAPTER_T prAdapter
)
351 P_TX_CTRL_T prTxCtrl
;
353 P_GLUE_INFO_T prGlueInfo
;
358 DEBUGFUNC("dumpQueue");
360 prTxCtrl
= &prAdapter
->rTxCtrl
;
361 prQM
= &prAdapter
->rQM
;
362 prGlueInfo
= prAdapter
->prGlueInfo
;
363 #if QM_ADAPTIVE_TC_RESOURCE_CTRL
364 for (i
= TC0_INDEX
; i
<= TC5_INDEX
; i
++) {
365 DBGLOG(SW4
, INFO
, ("TC %u\n", i
));
366 DBGLOG(SW4
, INFO
, ("Max %u Free %u\n",
367 prTxCtrl
->rTc
.au2MaxNumOfBuffer
[i
],
368 prTxCtrl
->rTc
.au2FreeBufferCount
[i
]));
371 ("Average %u minReserved %u CurrentTcResource %u GuaranteedTcResource %u\n",
372 QM_GET_TX_QUEUE_LEN(prAdapter
, i
), prQM
->au4MinReservedTcResource
[i
],
373 prQM
->au4CurrentTcResource
[i
], prQM
->au4GuaranteedTcResource
[i
]));
379 #if QM_FORWARDING_FAIRNESS
380 for (i
= 0; i
< NUM_OF_PER_STA_TX_QUEUES
; i
++) {
382 ("TC %u HeadStaIdx %u ForwardCount %u\n", i
, prQM
->au4HeadStaRecIndex
[i
],
383 prQM
->au4ResourceUsedCount
[i
]));
387 DBGLOG(SW4
, INFO
, ("BMC or unknown TxQueue Len %u\n", prQM
->arTxQueue
[0].u4NumElem
));
388 DBGLOG(SW4
, INFO
, ("Pending %d\n", prGlueInfo
->i4TxPendingFrameNum
));
389 DBGLOG(SW4
, INFO
, ("Pending Security %d\n", prGlueInfo
->i4TxPendingSecurityFrameNum
));
391 for (i
= 0; i
< 4; i
++) {
392 for (j
= 0; j
< CFG_MAX_TXQ_NUM
; j
++) {
394 ("Pending Q[%u][%u] %d\n", i
, j
,
395 prGlueInfo
->ai4TxPendingFrameNumPerQueue
[i
][j
]));
400 DBGLOG(SW4
, INFO
, (" rFreeSwRfbList %u\n", prAdapter
->rRxCtrl
.rFreeSwRfbList
.u4NumElem
));
402 (" rReceivedRfbList %u\n", prAdapter
->rRxCtrl
.rReceivedRfbList
.u4NumElem
));
404 (" rIndicatedRfbList %u\n", prAdapter
->rRxCtrl
.rIndicatedRfbList
.u4NumElem
));
405 DBGLOG(SW4
, INFO
, (" ucNumIndPacket %u\n", prAdapter
->rRxCtrl
.ucNumIndPacket
));
406 DBGLOG(SW4
, INFO
, (" ucNumRetainedPacket %u\n", prAdapter
->rRxCtrl
.ucNumRetainedPacket
));
412 void dumpSTA(P_ADAPTER_T prAdapter
, P_STA_RECORD_T prStaRec
)
416 P_BSS_INFO_T prBssInfo
;
418 DEBUGFUNC("dumpSTA");
421 ucWTEntry
= prStaRec
->ucWlanIndex
;
423 prBssInfo
= GET_BSS_INFO_BY_INDEX(prAdapter
, prStaRec
->ucBssIndex
);
427 ("Mac address: " MACSTR
" Rcpi %u" "\n", MAC2STR(prStaRec
->aucMacAddr
),
430 DBGLOG(SW4
, INFO
, ("Idx %u Wtbl %u Used %u State %u Bss Phy 0x%x Sta DesiredPhy 0x%x\n",
431 prStaRec
->ucIndex
, ucWTEntry
,
432 prStaRec
->fgIsInUse
, prStaRec
->ucStaState
,
433 prBssInfo
->ucPhyTypeSet
, prStaRec
->ucDesiredPhyTypeSet
));
436 ("Sta Operation 0x%x DesiredNontHtRateSet 0x%x Mcs 0x%x u2HtCapInfo 0x%x\n",
437 prStaRec
->u2OperationalRateSet
, prStaRec
->u2DesiredNonHTRateSet
, prStaRec
->ucMcsSet
,
438 prStaRec
->u2HtCapInfo
));
441 for (i
= 0; i
< NUM_OF_PER_STA_TX_QUEUES
; i
++) {
442 DBGLOG(SW4
, INFO
, ("TC %u Queue Len %u\n", i
, prStaRec
->arTxQueue
[i
].u4NumElem
));
445 DBGLOG(SW4
, INFO
, ("BmpDeliveryAC %x\n", prStaRec
->ucBmpDeliveryAC
));
446 DBGLOG(SW4
, INFO
, ("BmpTriggerAC %x\n", prStaRec
->ucBmpTriggerAC
));
447 DBGLOG(SW4
, INFO
, ("UapsdSpSupproted %u\n", prStaRec
->fgIsUapsdSupported
));
448 DBGLOG(SW4
, INFO
, ("IsQoS %u\n", prStaRec
->fgIsQoS
));
449 DBGLOG(SW4
, INFO
, ("AssocId %u\n", prStaRec
->u2AssocId
));
451 DBGLOG(SW4
, INFO
, ("fgIsInPS %u\n", prStaRec
->fgIsInPS
));
452 DBGLOG(SW4
, INFO
, ("ucFreeQuota %u\n", prStaRec
->ucFreeQuota
));
453 DBGLOG(SW4
, INFO
, ("ucFreeQuotaForDelivery %u\n", prStaRec
->ucFreeQuotaForDelivery
));
454 DBGLOG(SW4
, INFO
, ("ucFreeQuotaForNonDelivery %u\n", prStaRec
->ucFreeQuotaForNonDelivery
));
458 DBGLOG(SW4
, INFO
, ("IsQmmSup %u\n", prStaRec
->fgIsWmmSupported
));
459 DBGLOG(SW4
, INFO
, ("IsUapsdSup %u\n", prStaRec
->fgIsUapsdSupported
));
460 DBGLOG(SW4
, INFO
, ("AvailabaleDeliverPkts %u\n", prStaRec
->ucAvailableDeliverPkts
));
461 DBGLOG(SW4
, INFO
, ("BmpDeliverPktsAC %u\n", prStaRec
->u4BmpDeliverPktsAC
));
462 DBGLOG(SW4
, INFO
, ("BmpBufferAC %u\n", prStaRec
->u4BmpBufferAC
));
463 DBGLOG(SW4
, INFO
, ("BmpNonDeliverPktsAC %u\n", prStaRec
->u4BmpNonDeliverPktsAC
));
466 for (i
= 0; i
< CFG_RX_MAX_BA_TID_NUM
; i
++) {
467 if (prStaRec
->aprRxReorderParamRefTbl
[i
]) {
469 ("RxReorder fgIsValid: %u\n",
470 prStaRec
->aprRxReorderParamRefTbl
[i
]->fgIsValid
));
472 ("RxReorder Tid: %u\n",
473 prStaRec
->aprRxReorderParamRefTbl
[i
]->ucTid
));
475 ("RxReorder rReOrderQue Len: %u\n",
476 prStaRec
->aprRxReorderParamRefTbl
[i
]->rReOrderQue
.u4NumElem
));
478 ("RxReorder WinStart: %u\n",
479 prStaRec
->aprRxReorderParamRefTbl
[i
]->u2WinStart
));
481 ("RxReorder WinEnd: %u\n",
482 prStaRec
->aprRxReorderParamRefTbl
[i
]->u2WinEnd
));
484 ("RxReorder WinSize: %u\n",
485 prStaRec
->aprRxReorderParamRefTbl
[i
]->u2WinSize
));
492 VOID
dumpBss(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
495 DBGLOG(SW4
, INFO
, ("SSID %s\n", prBssInfo
->aucSSID
));
496 DBGLOG(SW4
, INFO
, ("OWN " MACSTR
"\n", MAC2STR(prBssInfo
->aucOwnMacAddr
)));
497 DBGLOG(SW4
, INFO
, ("BSSID " MACSTR
"\n", MAC2STR(prBssInfo
->aucBSSID
)));
498 DBGLOG(SW4
, INFO
, ("eNetworkType %u\n", prBssInfo
->eNetworkType
));
499 DBGLOG(SW4
, INFO
, ("ucBssIndex %u\n", prBssInfo
->ucBssIndex
));
500 DBGLOG(SW4
, INFO
, ("eConnectionState %u\n", prBssInfo
->eConnectionState
));
501 DBGLOG(SW4
, INFO
, ("eCurrentOPMode %u\n", prBssInfo
->eCurrentOPMode
));
502 DBGLOG(SW4
, INFO
, ("fgIsQBSS %u\n", prBssInfo
->fgIsQBSS
));
503 DBGLOG(SW4
, INFO
, ("fgIsShortPreambleAllowed %u\n", prBssInfo
->fgIsShortPreambleAllowed
));
504 DBGLOG(SW4
, INFO
, ("fgUseShortPreamble %u\n", prBssInfo
->fgUseShortPreamble
));
505 DBGLOG(SW4
, INFO
, ("fgUseShortSlotTime %u\n", prBssInfo
->fgUseShortSlotTime
));
506 DBGLOG(SW4
, INFO
, ("ucNonHTBasicPhyType %x\n", prBssInfo
->ucNonHTBasicPhyType
));
507 DBGLOG(SW4
, INFO
, ("u2OperationalRateSet %x\n", prBssInfo
->u2OperationalRateSet
));
508 DBGLOG(SW4
, INFO
, ("u2BSSBasicRateSet %x\n", prBssInfo
->u2BSSBasicRateSet
));
509 DBGLOG(SW4
, INFO
, ("ucPhyTypeSet %x\n", prBssInfo
->ucPhyTypeSet
));
510 DBGLOG(SW4
, INFO
, ("rStaRecOfClientList %d\n", prBssInfo
->rStaRecOfClientList
.u4NumElem
));
511 DBGLOG(SW4
, INFO
, ("u2CapInfo %x\n", prBssInfo
->u2CapInfo
));
512 DBGLOG(SW4
, INFO
, ("u2ATIMWindow %x\n", prBssInfo
->u2ATIMWindow
));
513 DBGLOG(SW4
, INFO
, ("u2AssocId %x\n", prBssInfo
->u2AssocId
));
514 DBGLOG(SW4
, INFO
, ("ucDTIMPeriod %x\n", prBssInfo
->ucDTIMPeriod
));
515 DBGLOG(SW4
, INFO
, ("ucDTIMCount %x\n", prBssInfo
->ucDTIMCount
));
516 DBGLOG(SW4
, INFO
, ("fgIsNetAbsent %x\n", prBssInfo
->fgIsNetAbsent
));
517 DBGLOG(SW4
, INFO
, ("eBand %d\n", prBssInfo
->eBand
));
518 DBGLOG(SW4
, INFO
, ("ucPrimaryChannel %d\n", prBssInfo
->ucPrimaryChannel
));
519 DBGLOG(SW4
, INFO
, ("ucHtOpInfo1 %d\n", prBssInfo
->ucHtOpInfo1
));
520 DBGLOG(SW4
, INFO
, ("ucHtOpInfo2 %d\n", prBssInfo
->u2HtOpInfo2
));
521 DBGLOG(SW4
, INFO
, ("ucHtOpInfo3 %d\n", prBssInfo
->u2HtOpInfo3
));
522 DBGLOG(SW4
, INFO
, ("fgErpProtectMode %d\n", prBssInfo
->fgErpProtectMode
));
523 DBGLOG(SW4
, INFO
, ("eHtProtectMode %d\n", prBssInfo
->eHtProtectMode
));
524 DBGLOG(SW4
, INFO
, ("eGfOperationMode %d\n", prBssInfo
->eGfOperationMode
));
525 DBGLOG(SW4
, INFO
, ("eRifsOperationMode %d\n", prBssInfo
->eRifsOperationMode
));
526 DBGLOG(SW4
, INFO
, ("fgObssErpProtectMode %d\n", prBssInfo
->fgObssErpProtectMode
));
527 DBGLOG(SW4
, INFO
, ("eObssHtProtectMode %d\n", prBssInfo
->eObssHtProtectMode
));
528 DBGLOG(SW4
, INFO
, ("eObssGfProtectMode %d\n", prBssInfo
->eObssGfOperationMode
));
529 DBGLOG(SW4
, INFO
, ("fgObssRifsOperationMode %d\n", prBssInfo
->fgObssRifsOperationMode
));
530 DBGLOG(SW4
, INFO
, ("fgAssoc40mBwAllowed %d\n", prBssInfo
->fgAssoc40mBwAllowed
));
531 DBGLOG(SW4
, INFO
, ("fg40mBwAllowed %d\n", prBssInfo
->fg40mBwAllowed
));
532 DBGLOG(SW4
, INFO
, ("eBssSCO %d\n", prBssInfo
->eBssSCO
));
539 VOID
swCtrlCmdCategory0(P_ADAPTER_T prAdapter
, UINT_8 ucCate
, UINT_8 ucAction
, UINT_8 ucOpt0
,
542 UINT_8 ucIndex
, ucRead
;
545 DEBUGFUNC("swCtrlCmdCategory0");
547 SWCR_GET_RW_INDEX(ucAction
, ucRead
, ucIndex
);
551 if (ucIndex
>= SWCTRL_CATA0_INDEX_NUM
)
554 if (ucRead
== SWCR_WRITE
) {
558 aucDebugModule
[ucOpt0
] = (UINT_8
) g_au4SwCr
[1];
561 case SWCTRL_WIFI_VAR
:
565 case SWCTRL_DUMP_QM_DBG_CNT
:
566 for (i
= 0; i
< QM_DBG_CNT_NUM
; i
++) {
567 prAdapter
->rQM
.au4QmDebugCounters
[i
] = 0;
570 case SWCTRL_QM_DBG_CNT
:
571 prAdapter
->rQM
.au4QmDebugCounters
[ucOpt0
] = g_au4SwCr
[1];
576 case SWCTRL_RX_PKTS_DUMP
:
577 /* DBGLOG(SW4, INFO,("SWCTRL_RX_PKTS_DUMP: mask %x\n", g_au4SwCr[1])); */
578 prAdapter
->rRxCtrl
.u4RxPktsDumpTypeMask
= g_au4SwCr
[1];
581 case SWCTRL_RX_FILTER
:
584 BOOLEAN fgUpdate
= FALSE
;
585 WLAN_STATUS rStatus
= WLAN_STATUS_SUCCESS
;
587 if (ucOpt0
== SWCR_RX_FILTER_CMD_STOP
) {
588 g_u4RXFilter
&= ~(RX_FILTER_START
);
589 /* changed by jeffrey to align Android behavior */
591 if (prAdapter
->fgAllMulicastFilter
== FALSE
) {
592 prAdapter
->u4OsPacketFilter
&=
593 ~PARAM_PACKET_FILTER_ALL_MULTICAST
;
596 prAdapter
->u4OsPacketFilter
&=
597 ~PARAM_PACKET_FILTER_MULTICAST
;
598 u4rxfilter
= prAdapter
->u4OsPacketFilter
;
600 } else if (ucOpt0
== SWCR_RX_FILTER_CMD_START
) {
601 g_u4RXFilter
|= (RX_FILTER_START
);
603 if ((g_u4RXFilter
& RX_FILTER_IPV4
) ||
604 (g_u4RXFilter
& RX_FILTER_IPV6
)) {
606 prAdapter
->u4OsPacketFilter
|=
607 PARAM_PACKET_FILTER_ALL_MULTICAST
;
609 prAdapter
->u4OsPacketFilter
|=
610 PARAM_PACKET_FILTER_MULTICAST
;
612 u4rxfilter
= prAdapter
->u4OsPacketFilter
;
614 } else if (ucOpt0
== SWCR_RX_FILTER_CMD_ADD
) {
616 g_u4RXFilter
|= (1 << ucOpt1
);
618 } else if (ucOpt0
== SWCR_RX_FILTER_CMD_REMOVE
) {
620 g_u4RXFilter
&= ~(1 << ucOpt1
);
624 if (fgUpdate
== TRUE
) {
625 rStatus
= wlanSendSetQueryCmd(prAdapter
, /* prAdapter */
626 CMD_ID_SET_RX_FILTER
, /* ucCID */
627 TRUE
, /* fgSetQuery */
628 FALSE
, /* fgNeedResp */
630 NULL
, /* pfCmdDoneHandler */
631 NULL
, /* pfCmdTimeoutHandler */
632 sizeof(UINT_32
), /* u4SetQueryInfoLen */
633 (PUINT_8
) & u4rxfilter
, /* pucInfoBuffer */
634 NULL
, /* pvSetQueryBuffer */
635 0 /* un4SetQueryBufferLen */
638 /* DBGLOG(SW4, INFO,("SWCTRL_RX_FILTER: g_u4RXFilter %x ucOpt0 %x ucOpt1 %x fgUpdate %x u4rxfilter %x, rStatus %x\n", */
639 /* g_u4RXFilter, ucOpt0, ucOpt1, fgUpdate, u4rxfilter, rStatus)); */
643 #if CFG_INIT_ENABLE_PATTERN_FILTER_ARP
644 case SWCTRL_RX_ARP_OFFLOAD
:
646 WLAN_STATUS rStatus
= WLAN_STATUS_FAILURE
;
647 UINT_32 u4SetInfoLen
= 0;
648 UINT_32 u4Len
= OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST
, arAddress
);
649 UINT_32 u4NumIPv4
= 0, u4NumIPv6
= 0;
651 PUINT_8 pucBufIpAddr
= NULL
;
652 P_PARAM_NETWORK_ADDRESS_LIST prParamNetAddrList
= NULL
;
653 P_PARAM_NETWORK_ADDRESS_IP prParamIpAddr
= NULL
;
654 PUINT_8 pucIp
= NULL
;
655 /* PUINT_8 pucIpv6 = NULL; */
657 u4Len
+ (OFFSET_OF(PARAM_NETWORK_ADDRESS
, aucAddress
) +
658 sizeof(PARAM_NETWORK_ADDRESS_IP
)) * 3;
659 P_PARAM_NETWORK_ADDRESS prParamNetAddr
= NULL
;
661 /* <1> allocate IP address buffer */
662 pucBufIpAddr
= kalMemAlloc(bufSize
, VIR_MEM_TYPE
);
663 pucIp
= kalMemAlloc(3 * 4, VIR_MEM_TYPE
); /* TODO: replace 3 to macro */
665 prParamNetAddrList
= (P_PARAM_NETWORK_ADDRESS_LIST
) pucBufIpAddr
;
666 prParamNetAddr
= prParamNetAddrList
->arAddress
;
667 /* <2> clear IP address buffer */
668 kalMemZero(pucBufIpAddr
, bufSize
);
669 kalMemZero(pucIp
, 3 * 4);
671 /* <3> setup the number of IP address */
673 if (wlanGetIPV4Address(prAdapter
->prGlueInfo
, pucIp
, &u4NumIPv4
) && u4NumIPv4
> 3) { /* TODO: repleace 3 to macro */
676 } else if (ucOpt1
== 0) {
677 u4NumIPv4
= u4NumIPv6
= 0;
679 printk("u4Len:%d bufSize:%d u4NumIPv4:%d\n", u4Len
, bufSize
,
682 prParamNetAddrList
->u4AddressCount
= u4NumIPv6
+ u4NumIPv4
;
683 prParamNetAddrList
->u2AddressType
= PARAM_PROTOCOL_ID_TCP_IP
;
685 for (i
= 0; i
< u4NumIPv4
; i
++) {
686 prParamNetAddr
->u2AddressLength
=
687 sizeof(PARAM_NETWORK_ADDRESS_IP
);
688 prParamNetAddr
->u2AddressType
= PARAM_PROTOCOL_ID_TCP_IP
;
690 (P_PARAM_NETWORK_ADDRESS_IP
) prParamNetAddr
->aucAddress
;
691 kalMemCopy(&prParamIpAddr
->in_addr
, pucIp
+ (i
* 4), 4);
693 (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prParamNetAddr
+
695 (PARAM_NETWORK_ADDRESS
,
698 (PARAM_NETWORK_ADDRESS_IP
));
700 OFFSET_OF(PARAM_NETWORK_ADDRESS
,
702 sizeof(PARAM_NETWORK_ADDRESS_IP
);
707 if (!wlanGetIPV6Address(prAdapter
->prGlueInfo
,
710 || (u4NumIPv6
+ u4NumIPv4
) > 3) {
714 pucIpv6
= kalMemAlloc(u4NumIPv6
* 16, VIR_MEM_TYPE
);
716 for (i
= 0; i
< u4NumIPv6
; i
++) {
717 prParamNetAddr
->u2AddressLength
= 6;
718 prParamNetAddr
->u2AddressType
= PARAM_PROTOCOL_ID_TCP_IP
;
719 kalMemCopy(prParamNetAddr
->aucAddress
, pucIpv6
+ (i
* 16),
722 (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prParamNetAddr
+
725 OFFSET_OF(PARAM_NETWORK_ADDRESS
,
726 aucAddress
) + sizeof(ip6
);
731 ASSERT(u4Len
<= bufSize
);
733 rStatus
= wlanoidSetNetworkAddress(prAdapter
,
734 (PVOID
) prParamNetAddrList
,
735 u4Len
, &u4SetInfoLen
);
737 if (rStatus
!= WLAN_STATUS_SUCCESS
) {
739 ("set HW packet filter fail 0x%1x\n", rStatus
));
743 kalMemFree(pucIp
, VIR_MEM_TYPE
, 3 * 4); /* TODO: replace 3 to marco */
746 kalMemFree(pucBufIpAddr
, VIR_MEM_TYPE
, bufSize
);
752 case SWCTRL_PS_DTIM_SKIP
:
767 g_au4SwCr
[1] = aucDebugModule
[ucOpt0
];
771 g_au4SwCr
[1] = _SWCTRL_MAGIC
;
772 DBGLOG(SW4
, INFO
, ("BUILD TIME: %s %s\n", __DATE__
, __TIME__
));
776 P_QUE_MGT_T prQM
= &prAdapter
->rQM
;
779 #if QM_ADAPTIVE_TC_RESOURCE_CTRL
780 g_au4SwCr
[1] = (QM_GET_TX_QUEUE_LEN(prAdapter
, ucOpt1
));
781 g_au4SwCr
[2] = prQM
->au4MinReservedTcResource
[ucOpt1
];
782 g_au4SwCr
[3] = prQM
->au4CurrentTcResource
[ucOpt1
];
783 g_au4SwCr
[4] = prQM
->au4GuaranteedTcResource
[ucOpt1
];
788 #if QM_FORWARDING_FAIRNESS
789 g_au4SwCr
[1] = prQM
->au4ResourceUsedCount
[ucOpt1
];
790 g_au4SwCr
[2] = prQM
->au4HeadStaRecIndex
[ucOpt1
];
795 g_au4SwCr
[1] = prQM
->arTxQueue
[ucOpt1
].u4NumElem
; /* only one */
802 case SWCTRL_TX_CTRL_INFO
:
804 P_TX_CTRL_T prTxCtrl
;
805 prTxCtrl
= &prAdapter
->rTxCtrl
;
809 prAdapter
->rTxCtrl
.rTc
.au2FreeBufferCount
[ucOpt1
];
811 prAdapter
->rTxCtrl
.rTc
.au2MaxNumOfBuffer
[ucOpt1
];
817 case SWCTRL_DUMP_QUEUE
:
818 dumpQueue(prAdapter
);
822 case SWCTRL_DUMP_QM_DBG_CNT
:
823 for (i
= 0; i
< QM_DBG_CNT_NUM
; i
++) {
825 ("QM:DBG %u %u\n", i
, prAdapter
->rQM
.au4QmDebugCounters
[i
]));
829 case SWCTRL_QM_DBG_CNT
:
830 g_au4SwCr
[1] = prAdapter
->rQM
.au4QmDebugCounters
[ucOpt0
];
833 case SWCTRL_DUMP_BSS
:
835 dumpBss(prAdapter
, GET_BSS_INFO_BY_INDEX(prAdapter
, ucOpt0
));
847 VOID
swCtrlCmdCategory1(P_ADAPTER_T prAdapter
, UINT_8 ucCate
, UINT_8 ucAction
, UINT_8 ucOpt0
,
850 UINT_8 ucIndex
, ucRead
;
852 P_STA_RECORD_T prStaRec
;
854 DEBUGFUNC("swCtrlCmdCategory1");
856 SWCR_GET_RW_INDEX(ucAction
, ucRead
, ucIndex
);
858 if (ucOpt0
>= CFG_STA_REC_NUM
)
861 /* prStaRec = cnmGetStaRecByIndex (prAdapter, ucOpt0); */
862 prStaRec
= &prAdapter
->arStaRec
[ucOpt0
];
863 ucWTEntry
= prStaRec
->ucWlanIndex
;
864 if (ucRead
== SWCR_WRITE
) {
868 case SWCTRL_STA_QUE_INFO
:
870 g_au4SwCr
[1] = prStaRec
->arTxQueue
[ucOpt1
].u4NumElem
;
873 case SWCTRL_STA_INFO
:
876 g_au4SwCr
[1] = prStaRec
->fgIsInPS
;
882 case SWCTRL_DUMP_STA
:
884 dumpSTA(prAdapter
, prStaRec
);
900 testPsSendQoSNullFrame(IN P_ADAPTER_T prAdapter
,
901 IN P_STA_RECORD_T prStaRec
,
903 IN UINT_8 ucBssIndex
,
905 IN BOOLEAN fgIsBurstEnd
,
906 IN BOOLEAN ucPacketType
, IN BOOLEAN ucPsSessionID
, IN BOOLEAN fgSetEOSP
)
908 P_MSDU_INFO_T prMsduInfo
;
909 UINT_16 u2EstimatedFrameLen
;
910 P_WLAN_MAC_HEADER_QOS_T prQoSNullFrame
;
912 DEBUGFUNC("testPsSendQoSNullFrame");
913 DBGLOG(SW4
, LOUD
, ("\n"));
915 /* 4 <1> Allocate a PKT_INFO_T for Null Frame */
916 /* Init with MGMT Header Length */
917 u2EstimatedFrameLen
= MAC_TX_RESERVED_FIELD
+ WLAN_MAC_HEADER_QOS_LEN
;
919 /* Allocate a MSDU_INFO_T */
921 prMsduInfo
= cnmMgtPktAlloc(prAdapter
, u2EstimatedFrameLen
);
923 if (prMsduInfo
== NULL
) {
924 DBGLOG(SW4
, WARN
, ("No PKT_INFO_T for sending Null Frame.\n"));
927 /* 4 <2> Compose Null frame in MSDU_INfO_T. */
928 bssComposeQoSNullFrame(prAdapter
,
929 (PUINT_8
) ((ULONG
) (prMsduInfo
->prPacket
) + MAC_TX_RESERVED_FIELD
),
930 prStaRec
, ucUP
, fgSetEOSP
);
933 TX_SET_MMPDU(prAdapter
,
937 WLAN_MAC_HEADER_QOS_LEN
, WLAN_MAC_HEADER_QOS_LEN
, NULL
, MSDU_RATE_MODE_AUTO
);
939 prMsduInfo
->ucUserPriority
= ucUP
;
940 prMsduInfo
->ucPacketType
= ucPacketType
;
943 (P_WLAN_MAC_HEADER_QOS_T
) ((PUINT_8
)
944 ((ULONG
) (prMsduInfo
->prPacket
) + MAC_TX_RESERVED_FIELD
));
947 prQoSNullFrame
->aucAddr1
[0] = 0xfd;
949 prQoSNullFrame
->aucAddr1
[5] = 0xdd;
952 /* 4 <4> Inform TXM to send this Null frame. */
953 nicTxEnqueueMsdu(prAdapter
, prMsduInfo
);
959 VOID
testPsSetupBss(IN P_ADAPTER_T prAdapter
, IN UINT_8 ucBssIndex
)
961 P_BSS_INFO_T prBssInfo
;
962 UINT_8 _aucZeroMacAddr
[] = NULL_MAC_ADDR
;
964 DEBUGFUNC("testPsSetupBss()");
965 DBGLOG(SW4
, INFO
, ("index %d\n", ucBssIndex
));
967 prBssInfo
= GET_BSS_INFO_BY_INDEX(prAdapter
, ucBssIndex
);
969 /* 4 <1.2> Initiate PWR STATE */
970 /* SET_NET_PWR_STATE_IDLE(prAdapter, ucNetworkTypeIndex); */
973 /* 4 <2> Initiate BSS_INFO_T - common part */
974 BSS_INFO_INIT(prAdapter
, prBssInfo
);
976 prBssInfo
->eConnectionState
= PARAM_MEDIA_STATE_DISCONNECTED
;
977 prBssInfo
->eConnectionStateIndicated
= PARAM_MEDIA_STATE_DISCONNECTED
;
978 prBssInfo
->eCurrentOPMode
= OP_MODE_ACCESS_POINT
;
979 prBssInfo
->fgIsNetActive
= TRUE
;
980 prBssInfo
->ucBssIndex
= ucBssIndex
;
981 prBssInfo
->ucReasonOfDisconnect
= DISCONNECT_REASON_CODE_RESERVED
;
983 prBssInfo
->ucPhyTypeSet
= PHY_TYPE_SET_802_11BG
; /* Depend on eBand */
984 prBssInfo
->ucConfigAdHocAPMode
= AP_MODE_MIXED_11BG
; /* Depend on eCurrentOPMode and ucPhyTypeSet */
985 prBssInfo
->u2BSSBasicRateSet
= RATE_SET_ERP
;
986 prBssInfo
->u2OperationalRateSet
= RATE_SET_OFDM
;
987 prBssInfo
->fgErpProtectMode
= FALSE
;
988 prBssInfo
->fgIsQBSS
= TRUE
;
990 /* 4 <1.5> Setup MIB for current BSS */
991 prBssInfo
->u2BeaconInterval
= 100;
992 prBssInfo
->ucDTIMPeriod
= DOT11_DTIM_PERIOD_DEFAULT
;
993 prBssInfo
->u2ATIMWindow
= 0;
995 prBssInfo
->ucBeaconTimeoutCount
= 0;
998 bssInitForAP(prAdapter
, prBssInfo
, TRUE
);
1000 COPY_MAC_ADDR(prBssInfo
->aucBSSID
, _aucZeroMacAddr
);
1001 LINK_INITIALIZE(&prBssInfo
->rStaRecOfClientList
);
1002 prBssInfo
->fgIsBeaconActivated
= TRUE
;
1003 prBssInfo
->u2HwDefaultFixedRateCode
= RATE_CCK_1M_LONG
;
1006 COPY_MAC_ADDR(prBssInfo
->aucOwnMacAddr
, prAdapter
->rWifiVar
.aucMacAddress
);
1008 /* 4 <3> Initiate BSS_INFO_T - private part */
1010 prBssInfo
->eBand
= BAND_2G4
;
1011 prBssInfo
->ucPrimaryChannel
= 1;
1012 prBssInfo
->prStaRecOfAP
= (P_STA_RECORD_T
) NULL
;
1015 /* prBssInfo->fgErpProtectMode = eErpProectMode; */
1016 /* prBssInfo->eHtProtectMode = eHtProtectMode; */
1017 /* prBssInfo->eGfOperationMode = eGfOperationMode; */
1020 /* 4 <4> Allocate MSDU_INFO_T for Beacon */
1021 prBssInfo
->prBeacon
= cnmMgtPktAlloc(prAdapter
,
1022 OFFSET_OF(WLAN_BEACON_FRAME_T
,
1023 aucInfoElem
[0]) + MAX_IE_LENGTH
);
1025 if (prBssInfo
->prBeacon
) {
1026 prBssInfo
->prBeacon
->eSrc
= TX_PACKET_MGMT
;
1027 prBssInfo
->prBeacon
->ucBssIndex
= ucBssIndex
;
1029 DBGLOG(SW4
, INFO
, ("prBeacon allocation fail\n"));
1033 prBssInfo
->rPmProfSetupInfo
.ucBmpDeliveryAC
= PM_UAPSD_ALL
;
1034 prBssInfo
->rPmProfSetupInfo
.ucBmpTriggerAC
= PM_UAPSD_ALL
;
1035 prBssInfo
->rPmProfSetupInfo
.ucUapsdSp
= WMM_MAX_SP_LENGTH_2
;
1037 prBssInfo
->rPmProfSetupInfo
.ucBmpDeliveryAC
= (UINT_8
) prAdapter
->u4UapsdAcBmp
;
1038 prBssInfo
->rPmProfSetupInfo
.ucBmpTriggerAC
= (UINT_8
) prAdapter
->u4UapsdAcBmp
;
1039 prBssInfo
->rPmProfSetupInfo
.ucUapsdSp
= (UINT_8
) prAdapter
->u4MaxSpLen
;
1043 for (eAci
= 0; eAci
< WMM_AC_INDEX_NUM
; eAci
++) {
1045 prBssInfo
->arACQueParms
[eAci
].ucIsACMSet
= FALSE
;
1046 prBssInfo
->arACQueParms
[eAci
].u2Aifsn
= (UINT_16
) eAci
;
1047 prBssInfo
->arACQueParms
[eAci
].u2CWmin
= 7;
1048 prBssInfo
->arACQueParms
[eAci
].u2CWmax
= 31;
1049 prBssInfo
->arACQueParms
[eAci
].u2TxopLimit
= eAci
+ 1;
1051 ("MQM: eAci = %d, ACM = %d, Aifsn = %d, CWmin = %d, CWmax = %d, TxopLimit = %d\n",
1052 eAci
, prBssInfo
->arACQueParms
[eAci
].ucIsACMSet
,
1053 prBssInfo
->arACQueParms
[eAci
].u2Aifsn
,
1054 prBssInfo
->arACQueParms
[eAci
].u2CWmin
,
1055 prBssInfo
->arACQueParms
[eAci
].u2CWmax
,
1056 prBssInfo
->arACQueParms
[eAci
].u2TxopLimit
));
1062 DBGLOG(SW4
, INFO
, ("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1063 prBssInfo
->rPmProfSetupInfo
.ucBmpDeliveryAC
,
1064 prBssInfo
->rPmProfSetupInfo
.ucBmpTriggerAC
,
1065 prBssInfo
->rPmProfSetupInfo
.ucUapsdSp
));
1073 VOID
testPsCmdCategory0(P_ADAPTER_T prAdapter
, UINT_8 ucCate
, UINT_8 ucAction
, UINT_8 ucOpt0
,
1076 UINT_8 ucIndex
, ucRead
;
1077 P_STA_RECORD_T prStaRec
;
1079 DEBUGFUNC("testPsCmdCategory0");
1080 SWCR_GET_RW_INDEX(ucAction
, ucRead
, ucIndex
);
1082 DBGLOG(SW4
, LOUD
, ("Read %u Index %u\n", ucRead
, ucIndex
));
1084 prStaRec
= cnmGetStaRecByIndex(prAdapter
, 0);
1086 if (ucIndex
>= TEST_PS_CATA0_INDEX_NUM
)
1089 if (ucRead
== SWCR_WRITE
) {
1091 case TEST_PS_SETUP_BSS
:
1092 testPsSetupBss(prAdapter
, ucOpt0
);
1095 case TEST_PS_ENABLE_BEACON
:
1098 case TEST_PS_TRIGGER_BMC
:
1099 /* txmForwardQueuedBmcPkts (ucOpt0); */
1101 case TEST_PS_SEND_NULL
:
1104 testPsSendQoSNullFrame(prAdapter
, prStaRec
, (UINT_8
) (g_au4SwCr
[1] & 0xFF), /* UP */
1105 ucOpt0
, (BOOLEAN
) ((g_au4SwCr
[1] >> 8) & 0xFF), /* BMC */
1106 (BOOLEAN
) ((g_au4SwCr
[1] >> 16) & 0xFF), /* BurstEnd */
1107 (BOOLEAN
) ((g_au4SwCr
[1] >> 24) & 0xFF), /* Packet type */
1108 (UINT_8
) ((g_au4SwCr
[2]) & 0xFF), /* PS sesson ID 7: NOACK */
1113 case TEST_PS_BUFFER_BMC
:
1114 /* g_aprBssInfo[ucOpt0]->fgApToBufferBMC = (g_au4SwCr[1] & 0xFF); */
1116 case TEST_PS_UPDATE_BEACON
:
1117 bssUpdateBeaconContent(prAdapter
, ucOpt0
/*networktype */);
1127 g_au4SwCr
[1] = 0x88660011;
1134 #endif /* TEST_PS */
1138 VOID
testPsCmdCategory1(P_ADAPTER_T prAdapter
, UINT_8 ucCate
, UINT_8 ucAction
, UINT_8 ucOpt0
,
1141 UINT_8 ucIndex
, ucRead
;
1143 P_STA_RECORD_T prStaRec
;
1145 DEBUGFUNC("testPsCmdCategory1");
1147 SWCR_GET_RW_INDEX(ucAction
, ucRead
, ucIndex
);
1149 if (ucOpt0
>= CFG_STA_REC_NUM
)
1152 prStaRec
= cnmGetStaRecByIndex(prAdapter
, ucOpt0
);
1153 ucWTEntry
= prStaRec
->ucWlanIndex
;
1154 if (ucRead
== SWCR_WRITE
) {
1157 case TEST_PS_STA_PS
:
1158 prStaRec
->fgIsInPS
= (BOOLEAN
) (g_au4SwCr
[1] & 0x1);
1159 prStaRec
->fgIsQoS
= (BOOLEAN
) (g_au4SwCr
[1] >> 8 & 0xFF);
1160 prStaRec
->fgIsUapsdSupported
= (BOOLEAN
) (g_au4SwCr
[1] >> 16 & 0xFF);
1161 prStaRec
->ucBmpDeliveryAC
= (BOOLEAN
) (g_au4SwCr
[1] >> 24 & 0xFF);
1177 #endif /* TEST_PS */
1179 #if CFG_SUPPORT_802_11V
1180 #if (CFG_SUPPORT_802_11V_TIMING_MEASUREMENT == 1) && (WNM_UNIT_TEST == 1)
1181 VOID
testWNMCmdCategory0(P_ADAPTER_T prAdapter
, UINT_8 ucCate
, UINT_8 ucAction
, UINT_8 ucOpt0
,
1184 UINT_8 ucIndex
, ucRead
;
1185 P_STA_RECORD_T prStaRec
;
1187 DEBUGFUNC("testWNMCmdCategory0");
1188 SWCR_GET_RW_INDEX(ucAction
, ucRead
, ucIndex
);
1190 DBGLOG(SW4
, INFO
, ("Read %u Index %u\n", ucRead
, ucIndex
));
1192 if (ucIndex
>= TEST_WNM_CATA0_INDEX_NUM
)
1195 if (ucRead
== SWCR_WRITE
) {
1197 case TEST_WNM_TIMING_MEAS
:
1198 wnmTimingMeasUnitTest1(prAdapter
, ucOpt0
);
1206 #endif /* TEST_WNM */
1207 #endif /* CFG_SUPPORT_802_11V */
1209 VOID
swCtrlSwCr(P_ADAPTER_T prAdapter
, UINT_8 ucRead
, UINT_16 u2Addr
, UINT_32
*pu4Data
)
1211 /* According other register STAIDX */
1213 ucOffset
= (u2Addr
>> 2) & 0x3F;
1215 if (ucOffset
>= SWCR_CR_NUM
)
1218 if (ucRead
== SWCR_WRITE
) {
1219 g_au4SwCr
[ucOffset
] = *pu4Data
;
1220 if (ucOffset
== 0x0) {
1221 /* Commmand [31:24]: Category */
1222 /* Commmand [23:23]: 1(W) 0(R) */
1223 /* Commmand [22:16]: Index */
1224 /* Commmand [15:08]: Option0 */
1225 /* Commmand [07:00]: Option1 */
1228 u4Cmd
= g_au4SwCr
[0];
1229 ucCate
= (UINT_8
) (u4Cmd
>> 24);
1230 if (ucCate
< sizeof(g_arSwCtrlCmd
) / sizeof(g_arSwCtrlCmd
[0])) {
1231 if (g_arSwCtrlCmd
[ucCate
] != NULL
) {
1232 g_arSwCtrlCmd
[ucCate
] (prAdapter
, ucCate
,
1233 (UINT_8
) (u4Cmd
>> 16 & 0xFF),
1234 (UINT_8
) ((u4Cmd
>> 8) & 0xFF),
1235 (UINT_8
) (u4Cmd
& 0xFF));
1240 *pu4Data
= g_au4SwCr
[ucOffset
];
1244 VOID
swCrReadWriteCmd(P_ADAPTER_T prAdapter
, UINT_8 ucRead
, UINT_16 u2Addr
, UINT_32
*pu4Data
)
1248 ucMod
= u2Addr
>> 8;
1249 /* Address [15:8] MOD ID */
1250 /* Address [7:0] OFFSET */
1252 DEBUGFUNC("swCrReadWriteCmd");
1253 DBGLOG(SW4
, INFO
, ("%u addr 0x%x data 0x%x\n", ucRead
, u2Addr
, *pu4Data
));
1255 if (ucMod
< (sizeof(g_arSwCrModHandle
) / sizeof(g_arSwCrModHandle
[0]))) {
1257 if (g_arSwCrModHandle
[ucMod
] != NULL
) {
1258 g_arSwCrModHandle
[ucMod
] (prAdapter
, ucRead
, u2Addr
, pu4Data
);
1264 VOID
swCrFrameCheckEnable(P_ADAPTER_T prAdapter
, UINT_32 u4DumpType
)
1266 g_u4SwcrDebugFrameDumpType
= u4DumpType
;
1267 #if CFG_RX_PKTS_DUMP
1268 prAdapter
->rRxCtrl
.u4RxPktsDumpTypeMask
= u4DumpType
;
1272 VOID
swCrDebugInit(P_ADAPTER_T prAdapter
)
1275 if (g_u4SwcrDebugFrameDumpType
) {
1276 swCrFrameCheckEnable(prAdapter
, g_u4SwcrDebugFrameDumpType
);
1279 g_fgSwcrDebugTimer
= FALSE
;
1281 cnmTimerInitTimer(prAdapter
,
1283 (PFN_MGMT_TIMEOUT_FUNC
) swCrDebugCheckTimeout
, (ULONG
) NULL
);
1285 if (g_u4SwcrDebugCheckTimeout
) {
1286 swCrDebugCheckEnable(prAdapter
, TRUE
, g_ucSwcrDebugCheckType
,
1287 g_u4SwcrDebugCheckTimeout
);
1291 VOID
swCrDebugUninit(P_ADAPTER_T prAdapter
)
1293 cnmTimerStopTimer(prAdapter
, &g_rSwcrDebugTimer
);
1295 g_fgSwcrDebugTimer
= FALSE
;
1298 VOID
swCrDebugCheckEnable(P_ADAPTER_T prAdapter
, BOOLEAN fgIsEnable
, UINT_8 ucType
,
1302 g_ucSwcrDebugCheckType
= ucType
;
1303 g_u4SwcrDebugCheckTimeout
= u4Timeout
;
1304 if (g_fgSwcrDebugTimer
== FALSE
) {
1305 swCrDebugCheckTimeout(prAdapter
, 0);
1308 cnmTimerStopTimer(prAdapter
, &g_rSwcrDebugTimer
);
1309 g_u4SwcrDebugCheckTimeout
= 0;
1312 g_fgSwcrDebugTimer
= fgIsEnable
;
1315 VOID
swCrDebugCheck(P_ADAPTER_T prAdapter
, P_CMD_SW_DBG_CTRL_T prCmdSwCtrl
)
1317 P_RX_CTRL_T prRxCtrl
;
1318 P_TX_CTRL_T prTxCtrl
;
1322 prTxCtrl
= &prAdapter
->rTxCtrl
;
1323 prRxCtrl
= &prAdapter
->rRxCtrl
;
1327 if (prCmdSwCtrl
->u4Data
== SWCR_DBG_TYPE_ALL
) {
1329 /* TX Counter from fw */
1330 DBGLOG(SW4
, INFO
, ("TX0\n"
1331 "%08x %08x %08x %08x\n"
1332 "%08x %08x %08x %08x\n",
1333 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_CNT
],
1334 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_BCN_CNT
],
1335 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_FAILED_CNT
],
1336 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_RETRY_CNT
],
1338 u4DebugCnt
[SWCR_DBG_ALL_TX_AGING_TIMEOUT_CNT
],
1339 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_PS_OVERFLOW_CNT
],
1340 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_MGNT_DROP_CNT
],
1341 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_TX_ERROR_CNT
]));
1343 /* TX Counter from drv */
1344 DBGLOG(SW4
, INFO
, ("TX1\n"
1345 "%08x %08x %08x %08x\n",
1346 (UINT_32
) TX_GET_CNT(prTxCtrl
, TX_INACTIVE_BSS_DROP
),
1347 (UINT_32
) TX_GET_CNT(prTxCtrl
, TX_INACTIVE_STA_DROP
),
1348 (UINT_32
) TX_GET_CNT(prTxCtrl
, TX_FORWARD_OVERFLOW_DROP
),
1349 (UINT_32
) TX_GET_CNT(prTxCtrl
, TX_AP_BORADCAST_DROP
)));
1353 DBGLOG(SW4
, INFO
, ("RX0\n"
1354 "%08x %08x %08x %08x\n"
1355 "%08x %08x %08x %08x\n"
1356 "%08x %08x %08x %08x\n"
1357 "%08x %08x %08x %08x\n",
1358 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_CNT
],
1359 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_DROP_CNT
],
1360 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_DUP_DROP_CNT
],
1362 u4DebugCnt
[SWCR_DBG_ALL_RX_TYPE_ERROR_DROP_CNT
],
1364 u4DebugCnt
[SWCR_DBG_ALL_RX_CLASS_ERROR_DROP_CNT
],
1366 u4DebugCnt
[SWCR_DBG_ALL_RX_AMPDU_ERROR_DROP_CNT
],
1368 u4DebugCnt
[SWCR_DBG_ALL_RX_STATUS_ERROR_DROP_CNT
],
1370 u4DebugCnt
[SWCR_DBG_ALL_RX_FORMAT_ERROR_DROP_CNT
],
1372 u4DebugCnt
[SWCR_DBG_ALL_RX_ICV_ERROR_DROP_CNT
],
1374 u4DebugCnt
[SWCR_DBG_ALL_RX_KEY_ERROR_DROP_CNT
],
1376 u4DebugCnt
[SWCR_DBG_ALL_RX_TKIP_ERROR_DROP_CNT
],
1378 u4DebugCnt
[SWCR_DBG_ALL_RX_MIC_ERROR_DROP_CNT
],
1380 u4DebugCnt
[SWCR_DBG_ALL_RX_BIP_ERROR_DROP_CNT
],
1381 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_FCSERR_CNT
],
1382 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_FIFOFULL_CNT
],
1383 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_RX_PFDROP_CNT
]));
1385 DBGLOG(SW4
, INFO
, ("RX1\n"
1386 "%08x %08x %08x %08x\n"
1387 "%08x %08x %08x %08x\n",
1388 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_MPDU_TOTAL_COUNT
),
1389 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_DATA_INDICATION_COUNT
),
1390 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_DATA_RETURNED_COUNT
),
1391 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_DATA_RETAINED_COUNT
),
1392 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_DROP_TOTAL_COUNT
),
1393 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_TYPE_ERR_DROP_COUNT
),
1394 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_CLASS_ERR_DROP_COUNT
),
1395 (UINT_32
) RX_GET_CNT(prRxCtrl
, RX_DST_NULL_DROP_COUNT
)));
1397 DBGLOG(SW4
, INFO
, ("PWR\n"
1398 "%08x %08x %08x %08x\n"
1399 "%08x %08x %08x %08x\n",
1400 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_PS_POLL_CNT
],
1402 u4DebugCnt
[SWCR_DBG_ALL_PWR_TRIGGER_NULL_CNT
],
1403 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_BCN_IND_CNT
],
1405 u4DebugCnt
[SWCR_DBG_ALL_PWR_BCN_TIMEOUT_CNT
],
1406 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_PM_STATE0
],
1407 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_PM_STATE1
],
1408 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_CUR_PS_PROF0
],
1409 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_PWR_CUR_PS_PROF1
]));
1411 DBGLOG(SW4
, INFO
, ("ARM\n"
1412 "%08x %08x %08x %08x\n"
1414 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_AR_STA0_RATE
],
1415 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_AR_STA0_BWGI
],
1417 u4DebugCnt
[SWCR_DBG_ALL_AR_STA0_RX_RATE_RCPI
],
1418 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_ROAMING_ENABLE
],
1419 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_ROAMING_ROAM_CNT
],
1420 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_ROAMING_INT_CNT
]));
1422 DBGLOG(SW4
, INFO
, ("BB\n"
1423 "%08x %08x %08x %08x\n"
1424 "%08x %08x %08x %08x\n",
1425 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_RX_MDRDY_CNT
],
1426 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_RX_FCSERR_CNT
],
1427 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_CCK_PD_CNT
],
1428 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_OFDM_PD_CNT
],
1429 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_CCK_SFDERR_CNT
],
1430 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_CCK_SIGERR_CNT
],
1431 prCmdSwCtrl
->u4DebugCnt
[SWCR_DBG_ALL_BB_OFDM_TAGERR_CNT
],
1433 u4DebugCnt
[SWCR_DBG_ALL_BB_OFDM_SIGERR_CNT
]));
1437 /* start the next check */
1438 if (g_u4SwcrDebugCheckTimeout
) {
1439 cnmTimerStartTimer(prAdapter
, &g_rSwcrDebugTimer
,
1440 g_u4SwcrDebugCheckTimeout
* MSEC_PER_SEC
);
1444 VOID
swCrDebugCheckTimeout(IN P_ADAPTER_T prAdapter
, ULONG ulParamPtr
)
1446 CMD_SW_DBG_CTRL_T rCmdSwCtrl
;
1447 WLAN_STATUS rStatus
;
1449 rCmdSwCtrl
.u4Id
= (0xb000 << 16) + g_ucSwcrDebugCheckType
;
1450 rCmdSwCtrl
.u4Data
= 0;
1451 rStatus
= wlanSendSetQueryCmd(prAdapter
, /* prAdapter */
1452 CMD_ID_SW_DBG_CTRL
, /* ucCID */
1453 FALSE
, /* fgSetQuery */
1454 TRUE
, /* fgNeedResp */
1455 FALSE
, /* fgIsOid */
1456 swCrDebugQuery
, /* pfCmdDoneHandler */
1457 swCrDebugQueryTimeout
, /* pfCmdTimeoutHandler */
1458 sizeof(CMD_SW_DBG_CTRL_T
), /* u4SetQueryInfoLen */
1459 (PUINT_8
) &rCmdSwCtrl
, /* pucInfoBuffer */
1460 NULL
, /* pvSetQueryBuffer */
1461 0 /* u4SetQueryBufferLen */
1464 ASSERT(rStatus
== WLAN_STATUS_PENDING
);
1469 VOID
swCrDebugQuery(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1473 swCrDebugCheck(prAdapter
, (P_CMD_SW_DBG_CTRL_T
) (pucEventBuf
));
1476 VOID
swCrDebugQueryTimeout(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
)
1480 swCrDebugCheck(prAdapter
, NULL
);
1483 #endif /* CFG_SUPPORT_SWCR */