2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/nic/nic_cmd_event.c#1 $
5 /*! \file nic_cmd_event.c
6 \brief Callback functions for Command packets.
8 Various Event packet handlers which will be setup in the callback function of
15 ** $Log: nic_cmd_event.c $
17 * 04 10 2012 yuche.tsai
19 * Update address for wifi direct connection issue.
22 * [WCXRP00000785] [MT6620 Wi-Fi][Driver][FW] P2P/BOW MAC address is XOR with AIS MAC address
23 * P2P/BOW mac address XOR with local bit instead of OR
26 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
27 * add the code to get the check rsponse and indicate to app.
30 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
31 * Add security check code.
34 * [WCXRP00000493] [MT6620 Wi-Fi][Driver] Do not indicate redundant disconnection to host when entering into RF test mode
35 * only indicate DISCONNECTION to host when entering RF test if necessary (connected -> disconnected cases)
37 * 01 20 2011 eddie.chen
38 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
39 * Add Oid for sw control debug command
42 * [WCXRP00000335] [MT6620 Wi-Fi][Driver] change to use milliseconds sleep instead of delay to avoid blocking to system scheduling
43 * change to use msleep() and shorten waiting interval to reduce blocking to other task while Wi-Fi driver is being loaded
46 * [WCXRP00000223] MT6620 Wi-Fi][Driver][FW] Adopt NVRAM parameters when enter/exit RF test mode
47 * reload NVRAM settings before entering RF test mode and leaving from RF test mode.
50 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying current TX rate from firmware auto rate module
51 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
52 * 2) Remove CNM CH-RECOVER event handling
53 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
56 * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
57 * use OID_CUSTOM_TEST_MODE as indication for driver reset
58 * by dropping pending TX packets
61 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
62 * complete implementation of Android NVRAM access
65 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
66 * Do a complete reset with STA-REC null checking for RF test re-entry
68 * 09 15 2010 yuche.tsai
70 * Start to test AT GO only when P2P state is not IDLE.
72 * 09 09 2010 yuche.tsai
74 * Add AT GO Test mode after MAC address available.
76 * 09 03 2010 kevin.huang
78 * Refine #include sequence and solve recursive/nested #include issue
82 * eliminate klockwork errors
86 * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
87 * There is no CFG_SUPPORT_BOW in driver domain source.
91 * [AIS-FSM] honor registry setting for adhoc running mode. (A/B/G)
93 * 08 11 2010 yuche.tsai
95 * Add support for P2P Device Address query from FW.
99 * Centralize mgmt/system service procedures into independent calls.
103 * reset FSMs before entering RF test mode.
107 * 1) refine AIS-FSM indent.
108 * 2) when entering RF Test mode, flush 802.1X frames as well
109 * 3) when entering D3 state, flush 802.1X frames as well
113 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
116 * [WPD00003833][MT6620 and MT5931] Driver migration
117 * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
118 * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
121 * [WPD00003840][MT6620 5931] Security migration
122 * remove duplicate variable for migration.
124 * 06 06 2010 kevin.huang
125 * [WPD00003832][MT6620 5931] Create driver base
126 * [MT6620 5931] Create driver base
129 * [WPD00001943]Create WiFi test driver framework on WinXP
130 * change upon request: indicate as disconnected in driver domain when leaving from RF test mode
133 * [WPD00001943]Create WiFi test driver framework on WinXP
134 * do not clear scanning list array after disassociation
137 * [WPD00001943]Create WiFi test driver framework on WinXP
138 * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
139 * 2) finish statistics OIDs
142 * [WPD00001943]Create WiFi test driver framework on WinXP
143 * change OID behavior to meet WHQL requirement.
146 * [WPD00001943]Create WiFi test driver framework on WinXP
147 * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
148 * 2) buffer statistics data for 2 seconds
149 * 3) use default value for adhoc parameters instead of 0
152 * [WPD00001943]Create WiFi test driver framework on WinXP
153 * 1) do not take timeout mechanism for power mode oids
154 * 2) retrieve network type from connection status
155 * 3) after disassciation, set radio state to off
156 * 4) TCP option over IPv6 is supported
159 * [WPD00001943]Create WiFi test driver framework on WinXP
160 * correct OID_802_11_DISASSOCIATE handling.
163 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
164 * 1) add timeout handler mechanism for pending command packets
165 * 2) add p2p add/removal key
168 * [WPD00001943]Create WiFi test driver framework on WinXP
169 * treat BUS access failure as kind of card removal.
172 * [WPD00001943]Create WiFi test driver framework on WinXP
173 * information buffer for query oid/ioctl is now buffered in prCmdInfo
174 * * * * * * instead of glue-layer variable to improve multiple oid/ioctl capability
177 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
178 * add framework for BT-over-Wi-Fi support.
179 * * * * * * * * * * * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
180 * * * * * * * * * * * * * * 2) command sequence number is now increased atomically
181 * * * * * * * * * * * * * * 3) private data could be hold and taken use for other purpose
184 * [WPD00001943]Create WiFi test driver framework on WinXP
185 * accessing to firmware load/start address, and access to OID handling information
186 * are now handled in glue layer
189 * [WPD00001943]Create WiFi test driver framework on WinXP
190 * rWlanInfo should be placed at adapter rather than glue due to most operations
191 * * * * are done in adapter layer.
194 * [WPD00001943]Create WiFi test driver framework on WinXP
195 * add KAL API: kalFlushPendingTxPackets(), and take use of the API
198 * [WPD00001943]Create WiFi test driver framework on WinXP
199 * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
201 * 04 06 2010 jeffrey.chang
202 * [WPD00003826]Initial import for Linux port
203 * improve none-glude code portability
206 * [WPD00001943]Create WiFi test driver framework on WinXP
207 * sync statistics data structure definition with firmware implementation
210 * [WPD00001943]Create WiFi test driver framework on WinXP
211 * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
214 * [WPD00001943]Create WiFi test driver framework on WinXP
215 * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
218 * [WPD00001943]Create WiFi test driver framework on WinXP
219 * statistics information OIDs are now handled by querying from firmware domain
222 * [WPD00001943]Create WiFi test driver framework on WinXP
223 * indicate media stream mode after set is done
225 * 03 24 2010 jeffrey.chang
226 * [WPD00003826]Initial import for Linux port
227 * initial import for Linux port
230 * [WPD00001943]Create WiFi test driver framework on WinXP
231 * implement custom OID: EEPROM read/write access
234 * [WPD00001943]Create WiFi test driver framework on WinXP
235 * implement OID_802_3_MULTICAST_LIST oid handling
238 * [WPD00001943]Create WiFi test driver framework on WinXP
239 * limit RSSI return value to microsoft defined range.
242 * [WPD00001943]Create WiFi test driver framework on WinXP
243 * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
244 * * * * * * * 2. follow MSDN defined behavior when associates to another AP
245 * * * * * * * 3. for firmware download, packet size could be up to 2048 bytes
248 * [WPD00001943]Create WiFi test driver framework on WinXP
249 * block until firmware finished RF test enter/leave then indicate completion to upper layer
252 * [WPD00001943]Create WiFi test driver framework on WinXP
253 * when entering RF test mode and leaving from RF test mode, wait for W_FUNC_RDY bit to be asserted forever until it is set or card is removed.
256 * [WPD00001943]Create WiFi test driver framework on WinXP
257 * 1. eliminate improper variable in rHifInfo
258 * * * * * * * * 2. block TX/ordinary OID when RF test mode is engaged
259 * * * * * * * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
260 * * * * * * * * 4. correct some HAL implementation
263 * [WPD00001943]Create WiFi test driver framework on WinXP
264 * Under WinXP with SDIO, use prGlueInfo->rHifInfo.pvInformationBuffer instead of prGlueInfo->pvInformationBuffer
267 * [WPD00001943]Create WiFi test driver framework on WinXP
268 * implement following 802.11 OIDs:
269 * * * * * OID_802_11_RSSI,
270 * * * * * OID_802_11_RSSI_TRIGGER,
271 * * * * * OID_802_11_STATISTICS,
272 * * * * * OID_802_11_DISASSOCIATE,
273 * * * * * OID_802_11_POWER_MODE
276 * [WPD00001943]Create WiFi test driver framework on WinXP
277 * implement OID_802_11_MEDIA_STREAM_MODE
280 * [WPD00001943]Create WiFi test driver framework on WinXP
281 * 1) According to CMD/EVENT documentation v0.8,
282 * * * * * * * * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
283 * * * * * * * * and result is retrieved by get ATInfo instead
284 * * * * * * * * 2) add 4 counter for recording aggregation statistics
285 ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-12-10 16:47:47 GMT mtk02752
286 ** only handle MCR read when accessing FW domain register
287 ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-12-08 17:37:28 GMT mtk02752
288 ** * refine nicCmdEventQueryMcrRead
289 ** + add TxStatus/RxStatus for RF test QueryInformation OIDs
290 ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-12-02 22:05:45 GMT mtk02752
291 ** kalOidComplete() will decrease i4OidPendingCount
292 ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-12-01 23:02:57 GMT mtk02752
293 ** remove unnecessary spin locks
294 ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-12-01 22:51:18 GMT mtk02752
295 ** maintein i4OidPendingCount
296 ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-11-30 10:55:03 GMT mtk02752
297 ** modify for compatibility
298 ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-11-23 14:46:32 GMT mtk02752
299 ** add another version of command-done handler upon new event structure
300 ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-04-29 15:42:33 GMT mtk01461
302 ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-04-21 19:32:42 GMT mtk01461
303 ** Add nicCmdEventSetCommon() for general set OID
304 ** \main\maintrunk.MT6620WiFiDriver_Prj\1 2009-04-21 01:40:35 GMT mtk01461
305 ** Command Done Handler
308 /*******************************************************************************
309 * C O M P I L E R F L A G S
310 ********************************************************************************
313 /*******************************************************************************
314 * E X T E R N A L R E F E R E N C E S
315 ********************************************************************************
320 /*******************************************************************************
322 ********************************************************************************
325 /*******************************************************************************
327 ********************************************************************************
330 /*******************************************************************************
331 * P U B L I C D A T A
332 ********************************************************************************
336 nicCmdEventQueryMcrRead(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
338 UINT_32 u4QueryInfoLen
;
339 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo
;
340 P_GLUE_INFO_T prGlueInfo
;
341 P_CMD_ACCESS_REG prCmdAccessReg
;
348 /* 4 <2> Update information of OID */
349 if (prCmdInfo
->fgIsOid
) {
350 prGlueInfo
= prAdapter
->prGlueInfo
;
351 prCmdAccessReg
= (P_CMD_ACCESS_REG
) (pucEventBuf
);
353 u4QueryInfoLen
= sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T
);
355 prMcrRdInfo
= (P_PARAM_CUSTOM_MCR_RW_STRUC_T
) prCmdInfo
->pvInformationBuffer
;
356 prMcrRdInfo
->u4McrOffset
= prCmdAccessReg
->u4Address
;
357 prMcrRdInfo
->u4McrData
= prCmdAccessReg
->u4Data
;
359 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
360 WLAN_STATUS_SUCCESS
);
369 nicCmdEventQuerySwCtrlRead(IN P_ADAPTER_T prAdapter
,
370 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
372 UINT_32 u4QueryInfoLen
;
373 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo
;
374 P_GLUE_INFO_T prGlueInfo
;
375 P_CMD_SW_DBG_CTRL_T prCmdSwCtrl
;
381 /* 4 <2> Update information of OID */
382 if (prCmdInfo
->fgIsOid
) {
383 prGlueInfo
= prAdapter
->prGlueInfo
;
384 prCmdSwCtrl
= (P_CMD_SW_DBG_CTRL_T
) (pucEventBuf
);
386 u4QueryInfoLen
= sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T
);
388 prSwCtrlInfo
= (P_PARAM_CUSTOM_SW_CTRL_STRUC_T
) prCmdInfo
->pvInformationBuffer
;
389 prSwCtrlInfo
->u4Id
= prCmdSwCtrl
->u4Id
;
390 prSwCtrlInfo
->u4Data
= prCmdSwCtrl
->u4Data
;
392 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
393 WLAN_STATUS_SUCCESS
);
403 nicCmdEventSetCommon(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
408 if (prCmdInfo
->fgIsOid
) {
409 /* Update Set Infomation Length */
410 kalOidComplete(prAdapter
->prGlueInfo
,
411 prCmdInfo
->fgSetQuery
,
412 prCmdInfo
->u4InformationBufferLength
, WLAN_STATUS_SUCCESS
);
419 nicCmdEventSetDisassociate(IN P_ADAPTER_T prAdapter
,
420 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
425 if (prCmdInfo
->fgIsOid
) {
426 /* Update Set Infomation Length */
427 kalOidComplete(prAdapter
->prGlueInfo
,
428 prCmdInfo
->fgSetQuery
, 0, WLAN_STATUS_SUCCESS
);
431 kalIndicateStatusAndComplete(prAdapter
->prGlueInfo
, WLAN_STATUS_MEDIA_DISCONNECT
, NULL
, 0);
434 prAdapter
->fgIsRadioOff
= TRUE
;
441 nicCmdEventSetIpAddress(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
448 u4Count
= (prCmdInfo
->u4SetInfoLen
- OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST
, arNetAddress
))
449 / sizeof(IPV4_NETWORK_ADDRESS
);
451 if (prCmdInfo
->fgIsOid
) {
452 /* Update Set Infomation Length */
453 kalOidComplete(prAdapter
->prGlueInfo
,
454 prCmdInfo
->fgSetQuery
,
455 OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST
, arAddress
) + u4Count
*
456 (OFFSET_OF(PARAM_NETWORK_ADDRESS
, aucAddress
) +
457 sizeof(PARAM_NETWORK_ADDRESS_IP
)), WLAN_STATUS_SUCCESS
);
464 nicCmdEventQueryRfTestATInfo(IN P_ADAPTER_T prAdapter
,
465 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
467 P_EVENT_TEST_STATUS prTestStatus
, prQueryBuffer
;
468 P_GLUE_INFO_T prGlueInfo
;
469 UINT_32 u4QueryInfoLen
;
474 prTestStatus
= (P_EVENT_TEST_STATUS
) pucEventBuf
;
476 if (prCmdInfo
->fgIsOid
) {
477 prGlueInfo
= prAdapter
->prGlueInfo
;
478 prQueryBuffer
= (P_EVENT_TEST_STATUS
) prCmdInfo
->pvInformationBuffer
;
480 kalMemCopy(prQueryBuffer
, prTestStatus
, sizeof(EVENT_TEST_STATUS
));
482 u4QueryInfoLen
= sizeof(EVENT_TEST_STATUS
);
484 /* Update Query Infomation Length */
485 kalOidComplete(prGlueInfo
,
486 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
493 nicCmdEventQueryLinkQuality(IN P_ADAPTER_T prAdapter
,
494 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
496 PARAM_RSSI rRssi
, *prRssi
;
497 P_EVENT_LINK_QUALITY prLinkQuality
;
498 P_GLUE_INFO_T prGlueInfo
;
499 UINT_32 u4QueryInfoLen
;
504 prLinkQuality
= (P_EVENT_LINK_QUALITY
) pucEventBuf
;
506 rRssi
= (PARAM_RSSI
) prLinkQuality
->cRssi
; /* ranged from (-128 ~ 30) in unit of dBm */
508 if (prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_AIS_INDEX
].eConnectionState
==
509 PARAM_MEDIA_STATE_CONNECTED
) {
510 if (rRssi
> PARAM_WHQL_RSSI_MAX_DBM
)
511 rRssi
= PARAM_WHQL_RSSI_MAX_DBM
;
512 else if (rRssi
< PARAM_WHQL_RSSI_MIN_DBM
)
513 rRssi
= PARAM_WHQL_RSSI_MIN_DBM
;
515 rRssi
= PARAM_WHQL_RSSI_MIN_DBM
;
518 if (prCmdInfo
->fgIsOid
) {
519 prGlueInfo
= prAdapter
->prGlueInfo
;
520 prRssi
= (PARAM_RSSI
*) prCmdInfo
->pvInformationBuffer
;
522 kalMemCopy(prRssi
, &rRssi
, sizeof(PARAM_RSSI
));
523 u4QueryInfoLen
= sizeof(PARAM_RSSI
);
525 kalOidComplete(prGlueInfo
,
526 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
531 /*----------------------------------------------------------------------------*/
533 * @brief This routine is in response of OID_GEN_LINK_SPEED query request
535 * @param prAdapter Pointer to the Adapter structure.
536 * @param prCmdInfo Pointer to the pending command info
541 /*----------------------------------------------------------------------------*/
543 nicCmdEventQueryLinkSpeed(IN P_ADAPTER_T prAdapter
,
544 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
546 P_EVENT_LINK_QUALITY prLinkQuality
;
547 P_GLUE_INFO_T prGlueInfo
;
548 UINT_32 u4QueryInfoLen
;
549 PUINT_32 pu4LinkSpeed
;
554 prLinkQuality
= (P_EVENT_LINK_QUALITY
) pucEventBuf
;
556 if (prCmdInfo
->fgIsOid
) {
557 prGlueInfo
= prAdapter
->prGlueInfo
;
558 pu4LinkSpeed
= (PUINT_32
) (prCmdInfo
->pvInformationBuffer
);
560 if (prLinkQuality
->u2LinkSpeed
== 0) {
561 *pu4LinkSpeed
= 10000; /* 10K * 100bps = 1Mbps */
563 *pu4LinkSpeed
= prLinkQuality
->u2LinkSpeed
* 5000;
566 u4QueryInfoLen
= sizeof(UINT_32
);
568 kalOidComplete(prGlueInfo
,
569 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
575 nicCmdEventQueryStatistics(IN P_ADAPTER_T prAdapter
,
576 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
578 P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics
;
579 P_EVENT_STATISTICS prEventStatistics
;
580 P_GLUE_INFO_T prGlueInfo
;
581 UINT_32 u4QueryInfoLen
;
586 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
588 if (prCmdInfo
->fgIsOid
) {
589 prGlueInfo
= prAdapter
->prGlueInfo
;
591 u4QueryInfoLen
= sizeof(PARAM_802_11_STATISTICS_STRUCT_T
);
592 prStatistics
= (P_PARAM_802_11_STATISTICS_STRUCT_T
) prCmdInfo
->pvInformationBuffer
;
594 prStatistics
->u4Length
= sizeof(PARAM_802_11_STATISTICS_STRUCT_T
);
595 prStatistics
->rTransmittedFragmentCount
596 = prEventStatistics
->rTransmittedFragmentCount
;
597 prStatistics
->rMulticastTransmittedFrameCount
598 = prEventStatistics
->rMulticastTransmittedFrameCount
;
599 prStatistics
->rFailedCount
= prEventStatistics
->rFailedCount
;
600 prStatistics
->rRetryCount
= prEventStatistics
->rRetryCount
;
601 prStatistics
->rMultipleRetryCount
= prEventStatistics
->rMultipleRetryCount
;
602 prStatistics
->rRTSSuccessCount
= prEventStatistics
->rRTSSuccessCount
;
603 prStatistics
->rRTSFailureCount
= prEventStatistics
->rRTSFailureCount
;
604 prStatistics
->rACKFailureCount
= prEventStatistics
->rACKFailureCount
;
605 prStatistics
->rFrameDuplicateCount
= prEventStatistics
->rFrameDuplicateCount
;
606 prStatistics
->rReceivedFragmentCount
= prEventStatistics
->rReceivedFragmentCount
;
607 prStatistics
->rMulticastReceivedFrameCount
608 = prEventStatistics
->rMulticastReceivedFrameCount
;
609 prStatistics
->rFCSErrorCount
= prEventStatistics
->rFCSErrorCount
;
610 prStatistics
->rTKIPLocalMICFailures
.QuadPart
= 0;
611 prStatistics
->rTKIPICVErrors
.QuadPart
= 0;
612 prStatistics
->rTKIPCounterMeasuresInvoked
.QuadPart
= 0;
613 prStatistics
->rTKIPReplays
.QuadPart
= 0;
614 prStatistics
->rCCMPFormatErrors
.QuadPart
= 0;
615 prStatistics
->rCCMPReplays
.QuadPart
= 0;
616 prStatistics
->rCCMPDecryptErrors
.QuadPart
= 0;
617 prStatistics
->rFourWayHandshakeFailures
.QuadPart
= 0;
618 prStatistics
->rWEPUndecryptableCount
.QuadPart
= 0;
619 prStatistics
->rWEPICVErrorCount
.QuadPart
= 0;
620 prStatistics
->rDecryptSuccessCount
.QuadPart
= 0;
621 prStatistics
->rDecryptFailureCount
.QuadPart
= 0;
623 kalOidComplete(prGlueInfo
,
624 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
629 nicCmdEventEnterRfTest(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
631 UINT_32 u4WHISR
= 0, u4Value
= 0;
632 UINT_8 aucTxCount
[8];
638 prAdapter
->fgTestMode
= TRUE
;
640 /* 0. always indicate disconnection */
641 if (kalGetMediaStateIndicated(prAdapter
->prGlueInfo
) != PARAM_MEDIA_STATE_DISCONNECTED
) {
642 kalIndicateStatusAndComplete(prAdapter
->prGlueInfo
,
643 WLAN_STATUS_MEDIA_DISCONNECT
, NULL
, 0);
645 /* 1. Remove pending TX */
646 nicTxRelease(prAdapter
);
648 /* 1.1 clear pending Security / Management Frames */
649 kalClearSecurityFrames(prAdapter
->prGlueInfo
);
650 kalClearMgmtFrames(prAdapter
->prGlueInfo
);
652 /* 1.2 clear pending TX packet queued in glue layer */
653 kalFlushPendingTxPackets(prAdapter
->prGlueInfo
);
655 /* 2. Reset driver-domain FSMs */
656 nicUninitMGMT(prAdapter
);
658 nicResetSystemService(prAdapter
);
659 nicInitMGMT(prAdapter
, NULL
);
661 /* 3. Disable Interrupt */
662 HAL_INTR_DISABLE(prAdapter
);
664 /* 4. Block til firmware completed entering into RF test mode */
667 HAL_MCR_RD(prAdapter
, MCR_WCIR
, &u4Value
);
669 if (u4Value
& WCIR_WLAN_READY
) {
671 } else if (kalIsCardRemoved(prAdapter
->prGlueInfo
) == TRUE
672 || fgIsBusAccessFailed
== TRUE
) {
673 if (prCmdInfo
->fgIsOid
) {
674 /* Update Set Infomation Length */
675 kalOidComplete(prAdapter
->prGlueInfo
,
676 prCmdInfo
->fgSetQuery
,
677 prCmdInfo
->u4SetInfoLen
, WLAN_STATUS_NOT_SUPPORTED
);
685 /* 5. Clear Interrupt Status */
686 HAL_READ_INTR_STATUS(prAdapter
, 4, (PUINT_8
) & u4WHISR
);
687 if (HAL_IS_TX_DONE_INTR(u4WHISR
)) {
688 HAL_READ_TX_RELEASED_COUNT(prAdapter
, aucTxCount
);
690 /* 6. Reset TX Counter */
691 nicTxResetResource(prAdapter
);
693 /* 7. Re-enable Interrupt */
694 HAL_INTR_ENABLE(prAdapter
);
696 /* 8. completion indication */
697 if (prCmdInfo
->fgIsOid
) {
698 /* Update Set Infomation Length */
699 kalOidComplete(prAdapter
->prGlueInfo
,
700 prCmdInfo
->fgSetQuery
, prCmdInfo
->u4SetInfoLen
, WLAN_STATUS_SUCCESS
);
702 #if CFG_SUPPORT_NVRAM
703 /* 9. load manufacture data */
704 wlanLoadManufactureData(prAdapter
, kalGetConfiguration(prAdapter
->prGlueInfo
));
711 nicCmdEventLeaveRfTest(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
713 UINT_32 u4WHISR
= 0, u4Value
= 0;
714 UINT_8 aucTxCount
[8];
719 /* 1. Disable Interrupt */
720 HAL_INTR_DISABLE(prAdapter
);
722 /* 2. Block til firmware completed leaving from RF test mode */
725 HAL_MCR_RD(prAdapter
, MCR_WCIR
, &u4Value
);
727 if (u4Value
& WCIR_WLAN_READY
) {
729 } else if (kalIsCardRemoved(prAdapter
->prGlueInfo
) == TRUE
730 || fgIsBusAccessFailed
== TRUE
) {
731 if (prCmdInfo
->fgIsOid
) {
732 /* Update Set Infomation Length */
733 kalOidComplete(prAdapter
->prGlueInfo
,
734 prCmdInfo
->fgSetQuery
,
735 prCmdInfo
->u4SetInfoLen
, WLAN_STATUS_NOT_SUPPORTED
);
744 /* 3. Clear Interrupt Status */
745 HAL_READ_INTR_STATUS(prAdapter
, 4, (PUINT_8
) & u4WHISR
);
746 if (HAL_IS_TX_DONE_INTR(u4WHISR
)) {
747 HAL_READ_TX_RELEASED_COUNT(prAdapter
, aucTxCount
);
749 /* 4. Reset TX Counter */
750 nicTxResetResource(prAdapter
);
752 /* 5. Re-enable Interrupt */
753 HAL_INTR_ENABLE(prAdapter
);
755 /* 6. set driver-land variable */
756 prAdapter
->fgTestMode
= FALSE
;
758 /* 7. completion indication */
759 if (prCmdInfo
->fgIsOid
) {
760 /* Update Set Infomation Length */
761 kalOidComplete(prAdapter
->prGlueInfo
,
762 prCmdInfo
->fgSetQuery
, prCmdInfo
->u4SetInfoLen
, WLAN_STATUS_SUCCESS
);
765 /* 8. Indicate as disconnected */
766 if (kalGetMediaStateIndicated(prAdapter
->prGlueInfo
) != PARAM_MEDIA_STATE_DISCONNECTED
) {
768 kalIndicateStatusAndComplete(prAdapter
->prGlueInfo
,
769 WLAN_STATUS_MEDIA_DISCONNECT
, NULL
, 0);
771 prAdapter
->rWlanInfo
.u4SysTime
= kalGetTimeTick();
773 #if CFG_SUPPORT_NVRAM
774 /* 9. load manufacture data */
775 wlanLoadManufactureData(prAdapter
, kalGetConfiguration(prAdapter
->prGlueInfo
));
778 /* 10. Override network address */
779 wlanUpdateNetworkAddress(prAdapter
);
785 nicCmdEventQueryAddress(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
787 UINT_32 u4QueryInfoLen
;
788 P_GLUE_INFO_T prGlueInfo
;
789 P_EVENT_BASIC_CONFIG prEventBasicConfig
;
795 prEventBasicConfig
= (P_EVENT_BASIC_CONFIG
) (pucEventBuf
);
797 /* copy to adapter */
798 kalMemCopy(&(prAdapter
->rMyMacAddr
), &(prEventBasicConfig
->rMyMacAddr
), MAC_ADDR_LEN
);
800 /* 4 <2> Update information of OID */
801 if (prCmdInfo
->fgIsOid
) {
802 prGlueInfo
= prAdapter
->prGlueInfo
;
804 kalMemCopy(prCmdInfo
->pvInformationBuffer
, &(prEventBasicConfig
->rMyMacAddr
),
806 u4QueryInfoLen
= MAC_ADDR_LEN
;
808 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
809 WLAN_STATUS_SUCCESS
);
811 /* 4 <3> Update new MAC address and all 3 networks */
812 COPY_MAC_ADDR(prAdapter
->rWifiVar
.aucMacAddress
, prAdapter
->rMyMacAddr
);
813 COPY_MAC_ADDR(prAdapter
->rWifiVar
.aucDeviceAddress
, prAdapter
->rMyMacAddr
);
814 prAdapter
->rWifiVar
.aucDeviceAddress
[0] ^= MAC_ADDR_LOCAL_ADMIN
;
816 COPY_MAC_ADDR(prAdapter
->rWifiVar
.aucInterfaceAddress
, prAdapter
->rMyMacAddr
);
817 prAdapter
->rWifiVar
.aucInterfaceAddress
[0] ^= MAC_ADDR_LOCAL_ADMIN
;
819 COPY_MAC_ADDR(prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_AIS_INDEX
].aucOwnMacAddr
,
820 prAdapter
->rMyMacAddr
);
822 #if CFG_ENABLE_WIFI_DIRECT
823 if (prAdapter
->fgIsP2PRegistered
) {
824 COPY_MAC_ADDR(prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_P2P_INDEX
].aucOwnMacAddr
,
825 prAdapter
->rWifiVar
.aucDeviceAddress
);
829 #if CFG_ENABLE_BT_OVER_WIFI
830 COPY_MAC_ADDR(prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_BOW_INDEX
].aucOwnMacAddr
,
831 prAdapter
->rWifiVar
.aucDeviceAddress
);
834 #if CFG_TEST_WIFI_DIRECT_GO
835 if (prAdapter
->rWifiVar
.prP2pFsmInfo
->eCurrentState
== P2P_STATE_IDLE
) {
836 wlanEnableP2pFunction(prAdapter
);
838 wlanEnableATGO(prAdapter
);
842 kalUpdateMACAddress(prAdapter
->prGlueInfo
, prAdapter
->rWifiVar
.aucMacAddress
);
848 nicCmdEventQueryMcastAddr(IN P_ADAPTER_T prAdapter
,
849 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
851 UINT_32 u4QueryInfoLen
;
852 P_GLUE_INFO_T prGlueInfo
;
853 P_EVENT_MAC_MCAST_ADDR prEventMacMcastAddr
;
859 /* 4 <2> Update information of OID */
860 if (prCmdInfo
->fgIsOid
) {
861 prGlueInfo
= prAdapter
->prGlueInfo
;
862 prEventMacMcastAddr
= (P_EVENT_MAC_MCAST_ADDR
) (pucEventBuf
);
864 u4QueryInfoLen
= prEventMacMcastAddr
->u4NumOfGroupAddr
* MAC_ADDR_LEN
;
866 /* buffer length check */
867 if (prCmdInfo
->u4InformationBufferLength
< u4QueryInfoLen
) {
868 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
869 WLAN_STATUS_BUFFER_TOO_SHORT
);
871 kalMemCopy(prCmdInfo
->pvInformationBuffer
,
872 prEventMacMcastAddr
->arAddress
,
873 prEventMacMcastAddr
->u4NumOfGroupAddr
* MAC_ADDR_LEN
);
875 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
876 WLAN_STATUS_SUCCESS
);
882 nicCmdEventQueryEepromRead(IN P_ADAPTER_T prAdapter
,
883 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
885 UINT_32 u4QueryInfoLen
;
886 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRdInfo
;
887 P_GLUE_INFO_T prGlueInfo
;
888 P_EVENT_ACCESS_EEPROM prEventAccessEeprom
;
894 /* 4 <2> Update information of OID */
895 if (prCmdInfo
->fgIsOid
) {
896 prGlueInfo
= prAdapter
->prGlueInfo
;
897 prEventAccessEeprom
= (P_EVENT_ACCESS_EEPROM
) (pucEventBuf
);
899 u4QueryInfoLen
= sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T
);
901 prEepromRdInfo
= (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T
) prCmdInfo
->pvInformationBuffer
;
902 prEepromRdInfo
->ucEepromIndex
= (UINT_8
) (prEventAccessEeprom
->u2Offset
);
903 prEepromRdInfo
->u2EepromData
= prEventAccessEeprom
->u2Data
;
905 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
906 WLAN_STATUS_SUCCESS
);
915 nicCmdEventSetMediaStreamMode(IN P_ADAPTER_T prAdapter
,
916 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
918 PARAM_MEDIA_STREAMING_INDICATION rParamMediaStreamIndication
;
923 if (prCmdInfo
->fgIsOid
) {
924 /* Update Set Infomation Length */
925 kalOidComplete(prAdapter
->prGlueInfo
,
926 prCmdInfo
->fgSetQuery
, prCmdInfo
->u4SetInfoLen
, WLAN_STATUS_SUCCESS
);
929 rParamMediaStreamIndication
.rStatus
.eStatusType
= ENUM_STATUS_TYPE_MEDIA_STREAM_MODE
;
930 rParamMediaStreamIndication
.eMediaStreamMode
=
931 prAdapter
->rWlanInfo
.eLinkAttr
.ucMediaStreamMode
== 0 ?
932 ENUM_MEDIA_STREAM_OFF
: ENUM_MEDIA_STREAM_ON
;
934 kalIndicateStatusAndComplete(prAdapter
->prGlueInfo
,
935 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION
,
936 (PVOID
) & rParamMediaStreamIndication
,
937 sizeof(PARAM_MEDIA_STREAMING_INDICATION
));
941 /* Statistics responder */
943 nicCmdEventQueryXmitOk(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
945 P_EVENT_STATISTICS prEventStatistics
;
946 P_GLUE_INFO_T prGlueInfo
;
947 UINT_32 u4QueryInfoLen
;
954 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
956 if (prCmdInfo
->fgIsOid
) {
957 prGlueInfo
= prAdapter
->prGlueInfo
;
959 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
960 u4QueryInfoLen
= sizeof(UINT_32
);
962 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
963 *pu4Data
= (UINT_32
) prEventStatistics
->rTransmittedFragmentCount
.QuadPart
;
965 u4QueryInfoLen
= sizeof(UINT_64
);
967 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
968 *pu8Data
= prEventStatistics
->rTransmittedFragmentCount
.QuadPart
;
971 kalOidComplete(prGlueInfo
,
972 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
978 nicCmdEventQueryRecvOk(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
980 P_EVENT_STATISTICS prEventStatistics
;
981 P_GLUE_INFO_T prGlueInfo
;
982 UINT_32 u4QueryInfoLen
;
989 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
991 if (prCmdInfo
->fgIsOid
) {
992 prGlueInfo
= prAdapter
->prGlueInfo
;
994 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
995 u4QueryInfoLen
= sizeof(UINT_32
);
997 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
998 *pu4Data
= (UINT_32
) prEventStatistics
->rReceivedFragmentCount
.QuadPart
;
1000 u4QueryInfoLen
= sizeof(UINT_64
);
1002 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1003 *pu8Data
= prEventStatistics
->rReceivedFragmentCount
.QuadPart
;
1006 kalOidComplete(prGlueInfo
,
1007 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1012 nicCmdEventQueryXmitError(IN P_ADAPTER_T prAdapter
,
1013 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1015 P_EVENT_STATISTICS prEventStatistics
;
1016 P_GLUE_INFO_T prGlueInfo
;
1017 UINT_32 u4QueryInfoLen
;
1024 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1026 if (prCmdInfo
->fgIsOid
) {
1027 prGlueInfo
= prAdapter
->prGlueInfo
;
1029 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1030 u4QueryInfoLen
= sizeof(UINT_32
);
1032 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1033 *pu4Data
= (UINT_32
) prEventStatistics
->rFailedCount
.QuadPart
;
1035 u4QueryInfoLen
= sizeof(UINT_64
);
1037 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1038 *pu8Data
= (UINT_64
) prEventStatistics
->rFailedCount
.QuadPart
;
1041 kalOidComplete(prGlueInfo
,
1042 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1048 nicCmdEventQueryRecvError(IN P_ADAPTER_T prAdapter
,
1049 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1051 P_EVENT_STATISTICS prEventStatistics
;
1052 P_GLUE_INFO_T prGlueInfo
;
1053 UINT_32 u4QueryInfoLen
;
1060 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1062 if (prCmdInfo
->fgIsOid
) {
1063 prGlueInfo
= prAdapter
->prGlueInfo
;
1065 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1066 u4QueryInfoLen
= sizeof(UINT_32
);
1068 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1069 *pu4Data
= (UINT_32
) prEventStatistics
->rFCSErrorCount
.QuadPart
;
1070 /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
1072 u4QueryInfoLen
= sizeof(UINT_64
);
1074 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1075 *pu8Data
= prEventStatistics
->rFCSErrorCount
.QuadPart
;
1076 /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
1079 kalOidComplete(prGlueInfo
,
1080 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1086 nicCmdEventQueryRecvNoBuffer(IN P_ADAPTER_T prAdapter
,
1087 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1089 P_EVENT_STATISTICS prEventStatistics
;
1090 P_GLUE_INFO_T prGlueInfo
;
1091 UINT_32 u4QueryInfoLen
;
1098 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1100 if (prCmdInfo
->fgIsOid
) {
1101 prGlueInfo
= prAdapter
->prGlueInfo
;
1103 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1104 u4QueryInfoLen
= sizeof(UINT_32
);
1106 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1107 *pu4Data
= 0; /* @FIXME? */
1109 u4QueryInfoLen
= sizeof(UINT_64
);
1111 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1112 *pu8Data
= 0; /* @FIXME? */
1115 kalOidComplete(prGlueInfo
,
1116 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1122 nicCmdEventQueryRecvCrcError(IN P_ADAPTER_T prAdapter
,
1123 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1125 P_EVENT_STATISTICS prEventStatistics
;
1126 P_GLUE_INFO_T prGlueInfo
;
1127 UINT_32 u4QueryInfoLen
;
1134 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1136 if (prCmdInfo
->fgIsOid
) {
1137 prGlueInfo
= prAdapter
->prGlueInfo
;
1139 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1140 u4QueryInfoLen
= sizeof(UINT_32
);
1142 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1143 *pu4Data
= (UINT_32
) prEventStatistics
->rFCSErrorCount
.QuadPart
;
1145 u4QueryInfoLen
= sizeof(UINT_64
);
1147 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1148 *pu8Data
= prEventStatistics
->rFCSErrorCount
.QuadPart
;
1151 kalOidComplete(prGlueInfo
,
1152 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1158 nicCmdEventQueryRecvErrorAlignment(IN P_ADAPTER_T prAdapter
,
1159 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1161 P_EVENT_STATISTICS prEventStatistics
;
1162 P_GLUE_INFO_T prGlueInfo
;
1163 UINT_32 u4QueryInfoLen
;
1170 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1172 if (prCmdInfo
->fgIsOid
) {
1173 prGlueInfo
= prAdapter
->prGlueInfo
;
1175 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1176 u4QueryInfoLen
= sizeof(UINT_32
);
1178 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1179 *pu4Data
= (UINT_32
) 0; /* @FIXME */
1181 u4QueryInfoLen
= sizeof(UINT_64
);
1183 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1184 *pu8Data
= 0; /* @FIXME */
1187 kalOidComplete(prGlueInfo
,
1188 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1194 nicCmdEventQueryXmitOneCollision(IN P_ADAPTER_T prAdapter
,
1195 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1197 P_EVENT_STATISTICS prEventStatistics
;
1198 P_GLUE_INFO_T prGlueInfo
;
1199 UINT_32 u4QueryInfoLen
;
1206 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1208 if (prCmdInfo
->fgIsOid
) {
1209 prGlueInfo
= prAdapter
->prGlueInfo
;
1211 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1212 u4QueryInfoLen
= sizeof(UINT_32
);
1214 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1216 (UINT_32
) (prEventStatistics
->rMultipleRetryCount
.QuadPart
-
1217 prEventStatistics
->rRetryCount
.QuadPart
);
1219 u4QueryInfoLen
= sizeof(UINT_64
);
1221 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1223 (UINT_64
) (prEventStatistics
->rMultipleRetryCount
.QuadPart
-
1224 prEventStatistics
->rRetryCount
.QuadPart
);
1227 kalOidComplete(prGlueInfo
,
1228 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1234 nicCmdEventQueryXmitMoreCollisions(IN P_ADAPTER_T prAdapter
,
1235 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1237 P_EVENT_STATISTICS prEventStatistics
;
1238 P_GLUE_INFO_T prGlueInfo
;
1239 UINT_32 u4QueryInfoLen
;
1246 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1248 if (prCmdInfo
->fgIsOid
) {
1249 prGlueInfo
= prAdapter
->prGlueInfo
;
1251 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1252 u4QueryInfoLen
= sizeof(UINT_32
);
1254 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1255 *pu4Data
= (UINT_32
) prEventStatistics
->rMultipleRetryCount
.QuadPart
;
1257 u4QueryInfoLen
= sizeof(UINT_64
);
1259 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1260 *pu8Data
= (UINT_64
) prEventStatistics
->rMultipleRetryCount
.QuadPart
;
1263 kalOidComplete(prGlueInfo
,
1264 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1270 nicCmdEventQueryXmitMaxCollisions(IN P_ADAPTER_T prAdapter
,
1271 IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1273 P_EVENT_STATISTICS prEventStatistics
;
1274 P_GLUE_INFO_T prGlueInfo
;
1275 UINT_32 u4QueryInfoLen
;
1282 prEventStatistics
= (P_EVENT_STATISTICS
) pucEventBuf
;
1284 if (prCmdInfo
->fgIsOid
) {
1285 prGlueInfo
= prAdapter
->prGlueInfo
;
1287 if (prCmdInfo
->u4InformationBufferLength
== sizeof(UINT_32
)) {
1288 u4QueryInfoLen
= sizeof(UINT_32
);
1290 pu4Data
= (PUINT_32
) prCmdInfo
->pvInformationBuffer
;
1291 *pu4Data
= (UINT_32
) prEventStatistics
->rFailedCount
.QuadPart
;
1293 u4QueryInfoLen
= sizeof(UINT_64
);
1295 pu8Data
= (PUINT_64
) prCmdInfo
->pvInformationBuffer
;
1296 *pu8Data
= (UINT_64
) prEventStatistics
->rFailedCount
.QuadPart
;
1299 kalOidComplete(prGlueInfo
,
1300 prCmdInfo
->fgSetQuery
, u4QueryInfoLen
, WLAN_STATUS_SUCCESS
);
1305 /*----------------------------------------------------------------------------*/
1307 * @brief This function is called when command by OID/ioctl has been timeout
1309 * @param prAdapter Pointer to the Adapter structure.
1310 * @param prCmdInfo Pointer to the command information
1315 /*----------------------------------------------------------------------------*/
1316 VOID
nicOidCmdTimeoutCommon(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
)
1320 kalOidComplete(prAdapter
->prGlueInfo
, prCmdInfo
->fgSetQuery
, 0, WLAN_STATUS_FAILURE
);
1324 /*----------------------------------------------------------------------------*/
1326 * @brief This function is a generic command timeout handler
1328 * @param pfnOidHandler Pointer to the OID handler
1332 /*----------------------------------------------------------------------------*/
1333 VOID
nicCmdTimeoutCommon(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
)
1339 /*----------------------------------------------------------------------------*/
1341 * @brief This function is called when command for entering RF test has
1342 * failed sending due to timeout (highly possibly by firmware crash)
1344 * @param prAdapter Pointer to the Adapter structure.
1345 * @param prCmdInfo Pointer to the command information
1350 /*----------------------------------------------------------------------------*/
1351 VOID
nicOidCmdEnterRFTestTimeout(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
)
1355 /* 1. Remove pending TX frames */
1356 nicTxRelease(prAdapter
);
1358 /* 1.1 clear pending Security / Management Frames */
1359 kalClearSecurityFrames(prAdapter
->prGlueInfo
);
1360 kalClearMgmtFrames(prAdapter
->prGlueInfo
);
1362 /* 1.2 clear pending TX packet queued in glue layer */
1363 kalFlushPendingTxPackets(prAdapter
->prGlueInfo
);
1365 /* 2. indiate for OID failure */
1366 kalOidComplete(prAdapter
->prGlueInfo
, prCmdInfo
->fgSetQuery
, 0, WLAN_STATUS_FAILURE
);
1370 /*----------------------------------------------------------------------------*/
1372 * @brief This function is called when command for memory dump has
1375 * @param prAdapter Pointer to the Adapter structure.
1376 * @param prCmdInfo Pointer to the command information
1377 * @param pucEventBuf Pointer to event buffer
1382 /*----------------------------------------------------------------------------*/
1384 nicCmdEventQueryMemDump(IN P_ADAPTER_T prAdapter
, IN P_CMD_INFO_T prCmdInfo
, IN PUINT_8 pucEventBuf
)
1386 UINT_32 u4QueryInfoLen
;
1387 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo
;
1388 P_GLUE_INFO_T prGlueInfo
;
1389 P_EVENT_DUMP_MEM_T prEventDumpMem
;
1390 static UINT_8 aucPath
[256];
1391 static UINT_32 u4CurTimeTick
;
1395 ASSERT(pucEventBuf
);
1397 /* 4 <2> Update information of OID */
1398 if (prCmdInfo
->fgIsOid
) {
1399 prGlueInfo
= prAdapter
->prGlueInfo
;
1400 prEventDumpMem
= (P_EVENT_DUMP_MEM_T
) (pucEventBuf
);
1402 u4QueryInfoLen
= sizeof(P_PARAM_CUSTOM_MEM_DUMP_STRUC_T
);
1404 prMemDumpInfo
= (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T
) prCmdInfo
->pvInformationBuffer
;
1405 prMemDumpInfo
->u4Address
= prEventDumpMem
->u4Address
;
1406 prMemDumpInfo
->u4Length
= prEventDumpMem
->u4Length
;
1407 prMemDumpInfo
->u4RemainLength
= prEventDumpMem
->u4RemainLength
;
1408 prMemDumpInfo
->ucFragNum
= prEventDumpMem
->ucFragNum
;
1413 printk("Rx dump address 0x%X, Length %d, FragNum %d, remain %d\n",
1414 prEventDumpMem
->u4Address
,
1415 prEventDumpMem
->u4Length
,
1416 prEventDumpMem
->ucFragNum
, prEventDumpMem
->u4RemainLength
);
1418 for (i
= 0; i
< prEventDumpMem
->u4Length
; i
++) {
1419 printk("%02X ", prEventDumpMem
->aucBuffer
[i
]);
1428 if (prEventDumpMem
->ucFragNum
== 1) {
1429 /* Store memory dump into sdcard,
1430 * path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
1432 u4CurTimeTick
= kalGetTimeTick();
1433 sprintf(aucPath
, "/sdcard/dump_%ld_0x%08lX_%ld.hex",
1435 prEventDumpMem
->u4Address
,
1436 prEventDumpMem
->u4Length
+ prEventDumpMem
->u4RemainLength
);
1437 kalWriteToFile(aucPath
, FALSE
, &prEventDumpMem
->aucBuffer
[0],
1438 prEventDumpMem
->u4Length
);
1440 /* Append current memory dump to the hex file */
1441 kalWriteToFile(aucPath
, TRUE
, &prEventDumpMem
->aucBuffer
[0],
1442 prEventDumpMem
->u4Length
);
1445 if (prEventDumpMem
->u4RemainLength
== 0 || prEventDumpMem
->u4Address
== 0xFFFFFFFF) {
1446 /* The request is finished or firmware response a error */
1447 /* Reply time tick to iwpriv */
1448 *((PUINT_32
) prCmdInfo
->pvInformationBuffer
) = u4CurTimeTick
;
1449 kalOidComplete(prGlueInfo
, prCmdInfo
->fgSetQuery
, u4QueryInfoLen
,
1450 WLAN_STATUS_SUCCESS
);
1452 /* The memory dump request is not finished, Send next command */
1453 wlanSendMemDumpCmd(prAdapter
,
1454 prCmdInfo
->pvInformationBuffer
,
1455 prCmdInfo
->u4InformationBufferLength
);