2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_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
12 /*******************************************************************************
13 * Copyright (c) 2007 MediaTek Inc.
15 * All rights reserved. Copying, compilation, modification, distribution
16 * or any other use whatsoever of this material is strictly prohibited
17 * except in accordance with a Software License Agreement with
19 ********************************************************************************
22 /*******************************************************************************
25 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
26 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
27 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
28 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
29 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
30 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
31 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
32 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
33 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
34 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
35 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
36 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
37 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
39 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
40 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
41 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
42 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
43 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
45 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
46 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
47 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
48 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
49 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
51 ********************************************************************************
55 ** $Log: nic_cmd_event.c $
58 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
59 ** sync RSSI ignoring when BSS is disconnected
62 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
66 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
67 ** cfg80211 support merge back from ALPS.JB to DaVinci - MT6620 Driver v2.3 branch.
69 * 04 10 2012 yuche.tsai
71 * Update address for wifi direct connection issue.
74 * [WCXRP00000785] [MT6620 Wi-Fi][Driver][FW] P2P/BOW MAC address is XOR with AIS MAC address
75 * P2P/BOW mac address XOR with local bit instead of OR
78 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
79 * add the code to get the check rsponse and indicate to app.
82 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
83 * Add security check code.
86 * [WCXRP00000493] [MT6620 Wi-Fi][Driver] Do not indicate redundant disconnection to host when entering into RF test mode
87 * only indicate DISCONNECTION to host when entering RF test if necessary (connected -> disconnected cases)
89 * 01 20 2011 eddie.chen
90 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
91 * Add Oid for sw control debug command
94 * [WCXRP00000335] [MT6620 Wi-Fi][Driver] change to use milliseconds sleep instead of delay to avoid blocking to system scheduling
95 * change to use msleep() and shorten waiting interval to reduce blocking to other task while Wi-Fi driver is being loaded
98 * [WCXRP00000223] MT6620 Wi-Fi][Driver][FW] Adopt NVRAM parameters when enter/exit RF test mode
99 * reload NVRAM settings before entering RF test mode and leaving from RF test mode.
102 * [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
103 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
104 * 2) Remove CNM CH-RECOVER event handling
105 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
108 * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
109 * use OID_CUSTOM_TEST_MODE as indication for driver reset
110 * by dropping pending TX packets
113 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
114 * complete implementation of Android NVRAM access
117 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
118 * Do a complete reset with STA-REC null checking for RF test re-entry
120 * 09 15 2010 yuche.tsai
122 * Start to test AT GO only when P2P state is not IDLE.
124 * 09 09 2010 yuche.tsai
126 * Add AT GO Test mode after MAC address available.
128 * 09 03 2010 kevin.huang
130 * Refine #include sequence and solve recursive/nested #include issue
134 * eliminate klockwork errors
138 * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
139 * There is no CFG_SUPPORT_BOW in driver domain source.
143 * [AIS-FSM] honor registry setting for adhoc running mode. (A/B/G)
145 * 08 11 2010 yuche.tsai
147 * Add support for P2P Device Address query from FW.
151 * Centralize mgmt/system service procedures into independent calls.
155 * reset FSMs before entering RF test mode.
159 * 1) refine AIS-FSM indent.
160 * 2) when entering RF Test mode, flush 802.1X frames as well
161 * 3) when entering D3 state, flush 802.1X frames as well
165 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
168 * [WPD00003833][MT6620 and MT5931] Driver migration
169 * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
170 * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
173 * [WPD00003840][MT6620 5931] Security migration
174 * remove duplicate variable for migration.
176 * 06 06 2010 kevin.huang
177 * [WPD00003832][MT6620 5931] Create driver base
178 * [MT6620 5931] Create driver base
181 * [WPD00001943]Create WiFi test driver framework on WinXP
182 * change upon request: indicate as disconnected in driver domain when leaving from RF test mode
185 * [WPD00001943]Create WiFi test driver framework on WinXP
186 * do not clear scanning list array after disassociation
189 * [WPD00001943]Create WiFi test driver framework on WinXP
190 * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
191 * 2) finish statistics OIDs
194 * [WPD00001943]Create WiFi test driver framework on WinXP
195 * change OID behavior to meet WHQL requirement.
198 * [WPD00001943]Create WiFi test driver framework on WinXP
199 * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
200 * 2) buffer statistics data for 2 seconds
201 * 3) use default value for adhoc parameters instead of 0
204 * [WPD00001943]Create WiFi test driver framework on WinXP
205 * 1) do not take timeout mechanism for power mode oids
206 * 2) retrieve network type from connection status
207 * 3) after disassciation, set radio state to off
208 * 4) TCP option over IPv6 is supported
211 * [WPD00001943]Create WiFi test driver framework on WinXP
212 * correct OID_802_11_DISASSOCIATE handling.
215 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
216 * 1) add timeout handler mechanism for pending command packets
217 * 2) add p2p add/removal key
220 * [WPD00001943]Create WiFi test driver framework on WinXP
221 * treat BUS access failure as kind of card removal.
224 * [WPD00001943]Create WiFi test driver framework on WinXP
225 * information buffer for query oid/ioctl is now buffered in prCmdInfo
226 * * * * * * instead of glue-layer variable to improve multiple oid/ioctl capability
229 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
230 * add framework for BT-over-Wi-Fi support.
231 * * * * * * * * * * * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
232 * * * * * * * * * * * * * * 2) command sequence number is now increased atomically
233 * * * * * * * * * * * * * * 3) private data could be hold and taken use for other purpose
236 * [WPD00001943]Create WiFi test driver framework on WinXP
237 * accessing to firmware load/start address, and access to OID handling information
238 * are now handled in glue layer
241 * [WPD00001943]Create WiFi test driver framework on WinXP
242 * rWlanInfo should be placed at adapter rather than glue due to most operations
243 * * * * are done in adapter layer.
246 * [WPD00001943]Create WiFi test driver framework on WinXP
247 * add KAL API: kalFlushPendingTxPackets(), and take use of the API
250 * [WPD00001943]Create WiFi test driver framework on WinXP
251 * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
253 * 04 06 2010 jeffrey.chang
254 * [WPD00003826]Initial import for Linux port
255 * improve none-glude code portability
258 * [WPD00001943]Create WiFi test driver framework on WinXP
259 * sync statistics data structure definition with firmware implementation
262 * [WPD00001943]Create WiFi test driver framework on WinXP
263 * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
266 * [WPD00001943]Create WiFi test driver framework on WinXP
267 * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
270 * [WPD00001943]Create WiFi test driver framework on WinXP
271 * statistics information OIDs are now handled by querying from firmware domain
274 * [WPD00001943]Create WiFi test driver framework on WinXP
275 * indicate media stream mode after set is done
277 * 03 24 2010 jeffrey.chang
278 * [WPD00003826]Initial import for Linux port
279 * initial import for Linux port
282 * [WPD00001943]Create WiFi test driver framework on WinXP
283 * implement custom OID: EEPROM read/write access
286 * [WPD00001943]Create WiFi test driver framework on WinXP
287 * implement OID_802_3_MULTICAST_LIST oid handling
290 * [WPD00001943]Create WiFi test driver framework on WinXP
291 * limit RSSI return value to microsoft defined range.
294 * [WPD00001943]Create WiFi test driver framework on WinXP
295 * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
296 * * * * * * * 2. follow MSDN defined behavior when associates to another AP
297 * * * * * * * 3. for firmware download, packet size could be up to 2048 bytes
300 * [WPD00001943]Create WiFi test driver framework on WinXP
301 * block until firmware finished RF test enter/leave then indicate completion to upper layer
304 * [WPD00001943]Create WiFi test driver framework on WinXP
305 * 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.
308 * [WPD00001943]Create WiFi test driver framework on WinXP
309 * 1. eliminate improper variable in rHifInfo
310 * * * * * * * * 2. block TX/ordinary OID when RF test mode is engaged
311 * * * * * * * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
312 * * * * * * * * 4. correct some HAL implementation
315 * [WPD00001943]Create WiFi test driver framework on WinXP
316 * Under WinXP with SDIO, use prGlueInfo->rHifInfo.pvInformationBuffer instead of prGlueInfo->pvInformationBuffer
319 * [WPD00001943]Create WiFi test driver framework on WinXP
320 * implement following 802.11 OIDs:
321 * * * * * OID_802_11_RSSI,
322 * * * * * OID_802_11_RSSI_TRIGGER,
323 * * * * * OID_802_11_STATISTICS,
324 * * * * * OID_802_11_DISASSOCIATE,
325 * * * * * OID_802_11_POWER_MODE
328 * [WPD00001943]Create WiFi test driver framework on WinXP
329 * implement OID_802_11_MEDIA_STREAM_MODE
332 * [WPD00001943]Create WiFi test driver framework on WinXP
333 * 1) According to CMD/EVENT documentation v0.8,
334 * * * * * * * * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
335 * * * * * * * * and result is retrieved by get ATInfo instead
336 * * * * * * * * 2) add 4 counter for recording aggregation statistics
337 ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-12-10 16:47:47 GMT mtk02752
338 ** only handle MCR read when accessing FW domain register
339 ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-12-08 17:37:28 GMT mtk02752
340 ** * refine nicCmdEventQueryMcrRead
341 ** + add TxStatus/RxStatus for RF test QueryInformation OIDs
342 ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-12-02 22:05:45 GMT mtk02752
343 ** kalOidComplete() will decrease i4OidPendingCount
344 ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-12-01 23:02:57 GMT mtk02752
345 ** remove unnecessary spin locks
346 ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-12-01 22:51:18 GMT mtk02752
347 ** maintein i4OidPendingCount
348 ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-11-30 10:55:03 GMT mtk02752
349 ** modify for compatibility
350 ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-11-23 14:46:32 GMT mtk02752
351 ** add another version of command-done handler upon new event structure
352 ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-04-29 15:42:33 GMT mtk01461
354 ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-04-21 19:32:42 GMT mtk01461
355 ** Add nicCmdEventSetCommon() for general set OID
356 ** \main\maintrunk.MT6620WiFiDriver_Prj\1 2009-04-21 01:40:35 GMT mtk01461
357 ** Command Done Handler
360 /*******************************************************************************
361 * C O M P I L E R F L A G S
362 ********************************************************************************
365 /*******************************************************************************
366 * E X T E R N A L R E F E R E N C E S
367 ********************************************************************************
372 /*******************************************************************************
374 ********************************************************************************
377 /*******************************************************************************
379 ********************************************************************************
382 /*******************************************************************************
383 * P U B L I C D A T A
384 ********************************************************************************
388 nicCmdEventQueryMcrRead (
389 IN P_ADAPTER_T prAdapter,
390 IN P_CMD_INFO_T prCmdInfo,
391 IN PUINT_8 pucEventBuf
394 UINT_32 u4QueryInfoLen;
395 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo;
396 P_GLUE_INFO_T prGlueInfo;
397 P_CMD_ACCESS_REG prCmdAccessReg;
404 //4 <2> Update information of OID
405 if (prCmdInfo->fgIsOid) {
406 prGlueInfo = prAdapter->prGlueInfo;
407 prCmdAccessReg = (P_CMD_ACCESS_REG)(pucEventBuf);
409 u4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T);
411 prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T) prCmdInfo->pvInformationBuffer;
412 prMcrRdInfo->u4McrOffset = prCmdAccessReg->u4Address;
413 prMcrRdInfo->u4McrData = prCmdAccessReg->u4Data;
415 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
424 nicCmdEventQuerySwCtrlRead (
425 IN P_ADAPTER_T prAdapter,
426 IN P_CMD_INFO_T prCmdInfo,
427 IN PUINT_8 pucEventBuf
430 UINT_32 u4QueryInfoLen;
431 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo;
432 P_GLUE_INFO_T prGlueInfo;
433 P_CMD_SW_DBG_CTRL_T prCmdSwCtrl;
439 //4 <2> Update information of OID
440 if (prCmdInfo->fgIsOid) {
441 prGlueInfo = prAdapter->prGlueInfo;
442 prCmdSwCtrl = (P_CMD_SW_DBG_CTRL_T)(pucEventBuf);
444 u4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T);
446 prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T) prCmdInfo->pvInformationBuffer;
447 prSwCtrlInfo->u4Id = prCmdSwCtrl->u4Id;
448 prSwCtrlInfo->u4Data = prCmdSwCtrl->u4Data;
450 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
460 nicCmdEventSetCommon (
461 IN P_ADAPTER_T prAdapter,
462 IN P_CMD_INFO_T prCmdInfo,
463 IN PUINT_8 pucEventBuf
469 if (prCmdInfo->fgIsOid) {
470 /* Update Set Infomation Length */
471 kalOidComplete(prAdapter->prGlueInfo,
472 prCmdInfo->fgSetQuery,
473 prCmdInfo->u4InformationBufferLength,
474 WLAN_STATUS_SUCCESS);
481 nicCmdEventSetDisassociate (
482 IN P_ADAPTER_T prAdapter,
483 IN P_CMD_INFO_T prCmdInfo,
484 IN PUINT_8 pucEventBuf
490 if (prCmdInfo->fgIsOid) {
491 /* Update Set Infomation Length */
492 kalOidComplete(prAdapter->prGlueInfo,
493 prCmdInfo->fgSetQuery,
495 WLAN_STATUS_SUCCESS);
498 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
499 WLAN_STATUS_MEDIA_DISCONNECT,
504 prAdapter->fgIsRadioOff = TRUE;
511 nicCmdEventSetIpAddress (
512 IN P_ADAPTER_T prAdapter,
513 IN P_CMD_INFO_T prCmdInfo,
514 IN PUINT_8 pucEventBuf
522 u4Count = (prCmdInfo->u4SetInfoLen - OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress))
523 / sizeof(IPV4_NETWORK_ADDRESS) ;
525 if (prCmdInfo->fgIsOid) {
526 /* Update Set Infomation Length */
527 kalOidComplete(prAdapter->prGlueInfo,
528 prCmdInfo->fgSetQuery,
529 OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress) + u4Count *
530 (OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(PARAM_NETWORK_ADDRESS_IP)),
531 WLAN_STATUS_SUCCESS);
538 nicCmdEventQueryRfTestATInfo(
539 IN P_ADAPTER_T prAdapter,
540 IN P_CMD_INFO_T prCmdInfo,
541 IN PUINT_8 pucEventBuf
544 P_EVENT_TEST_STATUS prTestStatus, prQueryBuffer;
545 P_GLUE_INFO_T prGlueInfo;
546 UINT_32 u4QueryInfoLen;
551 prTestStatus = (P_EVENT_TEST_STATUS)pucEventBuf;
553 if (prCmdInfo->fgIsOid) {
554 prGlueInfo = prAdapter->prGlueInfo;
555 prQueryBuffer = (P_EVENT_TEST_STATUS) prCmdInfo->pvInformationBuffer;
557 kalMemCopy(prQueryBuffer, prTestStatus, sizeof(EVENT_TEST_STATUS));
559 u4QueryInfoLen = sizeof(EVENT_TEST_STATUS);
561 /* Update Query Infomation Length */
562 kalOidComplete(prGlueInfo,
563 prCmdInfo->fgSetQuery,
565 WLAN_STATUS_SUCCESS);
572 nicCmdEventQueryLinkQuality(
573 IN P_ADAPTER_T prAdapter,
574 IN P_CMD_INFO_T prCmdInfo,
575 IN PUINT_8 pucEventBuf
578 PARAM_RSSI rRssi, *prRssi;
579 P_EVENT_LINK_QUALITY prLinkQuality;
580 P_GLUE_INFO_T prGlueInfo;
581 UINT_32 u4QueryInfoLen;
586 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
588 rRssi = (PARAM_RSSI)prLinkQuality->cRssi; // ranged from (-128 ~ 30) in unit of dBm
590 if(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
591 if(rRssi > PARAM_WHQL_RSSI_MAX_DBM)
592 rRssi = PARAM_WHQL_RSSI_MAX_DBM;
593 else if(rRssi < PARAM_WHQL_RSSI_MIN_DBM)
594 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
597 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
600 if (prCmdInfo->fgIsOid) {
601 prGlueInfo = prAdapter->prGlueInfo;
602 prRssi = (PARAM_RSSI *) prCmdInfo->pvInformationBuffer;
604 kalMemCopy(prRssi, &rRssi, sizeof(PARAM_RSSI));
605 u4QueryInfoLen = sizeof(PARAM_RSSI);
607 kalOidComplete(prGlueInfo,
608 prCmdInfo->fgSetQuery,
610 WLAN_STATUS_SUCCESS);
615 /*----------------------------------------------------------------------------*/
617 * @brief This routine is in response of OID_GEN_LINK_SPEED query request
619 * @param prAdapter Pointer to the Adapter structure.
620 * @param prCmdInfo Pointer to the pending command info
625 /*----------------------------------------------------------------------------*/
627 nicCmdEventQueryLinkSpeed(
628 IN P_ADAPTER_T prAdapter,
629 IN P_CMD_INFO_T prCmdInfo,
630 IN PUINT_8 pucEventBuf
633 P_EVENT_LINK_QUALITY prLinkQuality;
634 P_GLUE_INFO_T prGlueInfo;
635 UINT_32 u4QueryInfoLen;
636 PUINT_32 pu4LinkSpeed;
641 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
643 if (prCmdInfo->fgIsOid) {
644 prGlueInfo = prAdapter->prGlueInfo;
645 pu4LinkSpeed = (PUINT_32)(prCmdInfo->pvInformationBuffer);
647 if(prLinkQuality->u2LinkSpeed == 0) {
648 *pu4LinkSpeed = 10000; /* 10K * 100bps = 1Mbps */
651 *pu4LinkSpeed = prLinkQuality->u2LinkSpeed * 5000;
654 u4QueryInfoLen = sizeof(UINT_32);
656 kalOidComplete(prGlueInfo,
657 prCmdInfo->fgSetQuery,
659 WLAN_STATUS_SUCCESS);
665 nicCmdEventQueryStatistics(
666 IN P_ADAPTER_T prAdapter,
667 IN P_CMD_INFO_T prCmdInfo,
668 IN PUINT_8 pucEventBuf
671 P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
672 P_EVENT_STATISTICS prEventStatistics;
673 P_GLUE_INFO_T prGlueInfo;
674 UINT_32 u4QueryInfoLen;
679 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
681 if (prCmdInfo->fgIsOid) {
682 prGlueInfo = prAdapter->prGlueInfo;
684 u4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
685 prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) prCmdInfo->pvInformationBuffer;
687 prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
688 prStatistics->rTransmittedFragmentCount
689 = prEventStatistics->rTransmittedFragmentCount;
690 prStatistics->rMulticastTransmittedFrameCount
691 = prEventStatistics->rMulticastTransmittedFrameCount;
692 prStatistics->rFailedCount
693 = prEventStatistics->rFailedCount;
694 prStatistics->rRetryCount
695 = prEventStatistics->rRetryCount;
696 prStatistics->rMultipleRetryCount
697 = prEventStatistics->rMultipleRetryCount;
698 prStatistics->rRTSSuccessCount
699 = prEventStatistics->rRTSSuccessCount;
700 prStatistics->rRTSFailureCount
701 = prEventStatistics->rRTSFailureCount;
702 prStatistics->rACKFailureCount
703 = prEventStatistics->rACKFailureCount;
704 prStatistics->rFrameDuplicateCount
705 = prEventStatistics->rFrameDuplicateCount;
706 prStatistics->rReceivedFragmentCount
707 = prEventStatistics->rReceivedFragmentCount;
708 prStatistics->rMulticastReceivedFrameCount
709 = prEventStatistics->rMulticastReceivedFrameCount;
710 prStatistics->rFCSErrorCount
711 = prEventStatistics->rFCSErrorCount;
712 prStatistics->rTKIPLocalMICFailures.QuadPart
714 prStatistics->rTKIPICVErrors.QuadPart
716 prStatistics->rTKIPCounterMeasuresInvoked.QuadPart
718 prStatistics->rTKIPReplays.QuadPart
720 prStatistics->rCCMPFormatErrors.QuadPart
722 prStatistics->rCCMPReplays.QuadPart
724 prStatistics->rCCMPDecryptErrors.QuadPart
726 prStatistics->rFourWayHandshakeFailures.QuadPart
728 prStatistics->rWEPUndecryptableCount.QuadPart
730 prStatistics->rWEPICVErrorCount.QuadPart
732 prStatistics->rDecryptSuccessCount.QuadPart
734 prStatistics->rDecryptFailureCount.QuadPart
737 kalOidComplete(prGlueInfo,
738 prCmdInfo->fgSetQuery,
740 WLAN_STATUS_SUCCESS);
745 nicCmdEventEnterRfTest(
746 IN P_ADAPTER_T prAdapter,
747 IN P_CMD_INFO_T prCmdInfo,
748 IN PUINT_8 pucEventBuf
751 UINT_32 u4WHISR = 0, u4Value = 0;
752 UINT_8 aucTxCount[8];
758 prAdapter->fgTestMode = TRUE;
760 // 0. always indicate disconnection
761 if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED) {
762 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
763 WLAN_STATUS_MEDIA_DISCONNECT,
768 // 1. Remove pending TX
769 nicTxRelease(prAdapter);
771 // 1.1 clear pending Security / Management Frames
772 kalClearSecurityFrames(prAdapter->prGlueInfo);
773 kalClearMgmtFrames(prAdapter->prGlueInfo);
775 // 1.2 clear pending TX packet queued in glue layer
776 kalFlushPendingTxPackets(prAdapter->prGlueInfo);
778 // 2. Reset driver-domain FSMs
779 nicUninitMGMT(prAdapter);
781 nicResetSystemService(prAdapter);
782 nicInitMGMT(prAdapter, NULL);
784 // 3. Disable Interrupt
785 HAL_INTR_DISABLE(prAdapter);
787 // 4. Block til firmware completed entering into RF test mode
790 HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
792 if (u4Value & WCIR_WLAN_READY) {
795 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
796 || fgIsBusAccessFailed == TRUE) {
797 if (prCmdInfo->fgIsOid) {
798 /* Update Set Infomation Length */
799 kalOidComplete(prAdapter->prGlueInfo,
800 prCmdInfo->fgSetQuery,
801 prCmdInfo->u4SetInfoLen,
802 WLAN_STATUS_NOT_SUPPORTED);
811 // 5. Clear Interrupt Status
812 HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
813 if(HAL_IS_TX_DONE_INTR(u4WHISR)) {
814 HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
817 // 6. Reset TX Counter
818 nicTxResetResource(prAdapter);
820 // 7. Re-enable Interrupt
821 HAL_INTR_ENABLE(prAdapter);
823 // 8. completion indication
824 if (prCmdInfo->fgIsOid) {
825 /* Update Set Infomation Length */
826 kalOidComplete(prAdapter->prGlueInfo,
827 prCmdInfo->fgSetQuery,
828 prCmdInfo->u4SetInfoLen,
829 WLAN_STATUS_SUCCESS);
832 #if CFG_SUPPORT_NVRAM
833 // 9. load manufacture data
834 wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
841 nicCmdEventLeaveRfTest(
842 IN P_ADAPTER_T prAdapter,
843 IN P_CMD_INFO_T prCmdInfo,
844 IN PUINT_8 pucEventBuf
847 UINT_32 u4WHISR = 0, u4Value = 0;
848 UINT_8 aucTxCount[8];
853 // 1. Disable Interrupt
854 HAL_INTR_DISABLE(prAdapter);
856 // 2. Block til firmware completed leaving from RF test mode
859 HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
861 if (u4Value & WCIR_WLAN_READY) {
864 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
865 || fgIsBusAccessFailed == TRUE) {
866 if (prCmdInfo->fgIsOid) {
867 /* Update Set Infomation Length */
868 kalOidComplete(prAdapter->prGlueInfo,
869 prCmdInfo->fgSetQuery,
870 prCmdInfo->u4SetInfoLen,
871 WLAN_STATUS_NOT_SUPPORTED);
881 // 3. Clear Interrupt Status
882 HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
883 if(HAL_IS_TX_DONE_INTR(u4WHISR)) {
884 HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
887 // 4. Reset TX Counter
888 nicTxResetResource(prAdapter);
890 // 5. Re-enable Interrupt
891 HAL_INTR_ENABLE(prAdapter);
893 // 6. set driver-land variable
894 prAdapter->fgTestMode = FALSE;
896 // 7. completion indication
897 if (prCmdInfo->fgIsOid) {
898 /* Update Set Infomation Length */
899 kalOidComplete(prAdapter->prGlueInfo,
900 prCmdInfo->fgSetQuery,
901 prCmdInfo->u4SetInfoLen,
902 WLAN_STATUS_SUCCESS);
905 /* 8. Indicate as disconnected */
906 if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED) {
908 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
909 WLAN_STATUS_MEDIA_DISCONNECT,
913 prAdapter->rWlanInfo.u4SysTime = kalGetTimeTick();
916 #if CFG_SUPPORT_NVRAM
917 /* 9. load manufacture data */
918 wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
921 /* 10. Override network address */
922 wlanUpdateNetworkAddress(prAdapter);
928 nicCmdEventQueryAddress(
929 IN P_ADAPTER_T prAdapter,
930 IN P_CMD_INFO_T prCmdInfo,
931 IN PUINT_8 pucEventBuf
934 UINT_32 u4QueryInfoLen;
935 P_GLUE_INFO_T prGlueInfo;
936 P_EVENT_BASIC_CONFIG prEventBasicConfig;
942 prEventBasicConfig = (P_EVENT_BASIC_CONFIG)(pucEventBuf);
945 kalMemCopy(&(prAdapter->rMyMacAddr), &(prEventBasicConfig->rMyMacAddr), MAC_ADDR_LEN);
947 //4 <2> Update information of OID
948 if (prCmdInfo->fgIsOid) {
949 prGlueInfo = prAdapter->prGlueInfo;
951 kalMemCopy(prCmdInfo->pvInformationBuffer, &(prEventBasicConfig->rMyMacAddr), MAC_ADDR_LEN);
952 u4QueryInfoLen = MAC_ADDR_LEN;
954 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
957 //4 <3> Update new MAC address and all 3 networks
958 COPY_MAC_ADDR(prAdapter->rWifiVar.aucMacAddress, prAdapter->rMyMacAddr);
959 COPY_MAC_ADDR(prAdapter->rWifiVar.aucDeviceAddress, prAdapter->rMyMacAddr);
960 prAdapter->rWifiVar.aucDeviceAddress[0] ^= MAC_ADDR_LOCAL_ADMIN;
962 COPY_MAC_ADDR(prAdapter->rWifiVar.aucInterfaceAddress, prAdapter->rMyMacAddr);
963 prAdapter->rWifiVar.aucInterfaceAddress[0] ^= MAC_ADDR_LOCAL_ADMIN;
965 COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].aucOwnMacAddr,
966 prAdapter->rMyMacAddr);
968 #if CFG_ENABLE_WIFI_DIRECT
969 if(prAdapter->fgIsP2PRegistered) {
970 COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX].aucOwnMacAddr,
971 prAdapter->rWifiVar.aucDeviceAddress);
975 #if CFG_ENABLE_BT_OVER_WIFI
976 COPY_MAC_ADDR(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX].aucOwnMacAddr,
977 prAdapter->rWifiVar.aucDeviceAddress);
980 #if CFG_TEST_WIFI_DIRECT_GO
981 if (prAdapter->rWifiVar.prP2pFsmInfo->eCurrentState == P2P_STATE_IDLE) {
982 wlanEnableP2pFunction(prAdapter);
984 wlanEnableATGO(prAdapter);
988 kalUpdateMACAddress(prAdapter->prGlueInfo, prAdapter->rWifiVar.aucMacAddress);
994 nicCmdEventQueryMcastAddr(
995 IN P_ADAPTER_T prAdapter,
996 IN P_CMD_INFO_T prCmdInfo,
997 IN PUINT_8 pucEventBuf
1000 UINT_32 u4QueryInfoLen;
1001 P_GLUE_INFO_T prGlueInfo;
1002 P_EVENT_MAC_MCAST_ADDR prEventMacMcastAddr;
1006 ASSERT(pucEventBuf);
1008 //4 <2> Update information of OID
1009 if (prCmdInfo->fgIsOid) {
1010 prGlueInfo = prAdapter->prGlueInfo;
1011 prEventMacMcastAddr = (P_EVENT_MAC_MCAST_ADDR)(pucEventBuf);
1013 u4QueryInfoLen = prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN;
1015 // buffer length check
1016 if (prCmdInfo->u4InformationBufferLength < u4QueryInfoLen) {
1017 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_BUFFER_TOO_SHORT);
1020 kalMemCopy(prCmdInfo->pvInformationBuffer,
1021 prEventMacMcastAddr->arAddress,
1022 prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN);
1024 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
1030 nicCmdEventQueryEepromRead(
1031 IN P_ADAPTER_T prAdapter,
1032 IN P_CMD_INFO_T prCmdInfo,
1033 IN PUINT_8 pucEventBuf
1036 UINT_32 u4QueryInfoLen;
1037 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRdInfo;
1038 P_GLUE_INFO_T prGlueInfo;
1039 P_EVENT_ACCESS_EEPROM prEventAccessEeprom;
1043 ASSERT(pucEventBuf);
1045 //4 <2> Update information of OID
1046 if (prCmdInfo->fgIsOid) {
1047 prGlueInfo = prAdapter->prGlueInfo;
1048 prEventAccessEeprom = (P_EVENT_ACCESS_EEPROM)(pucEventBuf);
1050 u4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
1052 prEepromRdInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T) prCmdInfo->pvInformationBuffer;
1053 prEepromRdInfo->ucEepromIndex = (UINT_8)(prEventAccessEeprom->u2Offset);
1054 prEepromRdInfo->u2EepromData = prEventAccessEeprom->u2Data;
1056 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
1065 nicCmdEventSetMediaStreamMode(
1066 IN P_ADAPTER_T prAdapter,
1067 IN P_CMD_INFO_T prCmdInfo,
1068 IN PUINT_8 pucEventBuf
1071 PARAM_MEDIA_STREAMING_INDICATION rParamMediaStreamIndication;
1076 if (prCmdInfo->fgIsOid) {
1077 /* Update Set Infomation Length */
1078 kalOidComplete(prAdapter->prGlueInfo,
1079 prCmdInfo->fgSetQuery,
1080 prCmdInfo->u4SetInfoLen,
1081 WLAN_STATUS_SUCCESS);
1084 rParamMediaStreamIndication.rStatus.eStatusType =
1085 ENUM_STATUS_TYPE_MEDIA_STREAM_MODE;
1086 rParamMediaStreamIndication.eMediaStreamMode =
1087 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ?
1088 ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
1090 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1091 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
1092 (PVOID)&rParamMediaStreamIndication,
1093 sizeof(PARAM_MEDIA_STREAMING_INDICATION));
1097 /* Statistics responder */
1099 nicCmdEventQueryXmitOk(
1100 IN P_ADAPTER_T prAdapter,
1101 IN P_CMD_INFO_T prCmdInfo,
1102 IN PUINT_8 pucEventBuf
1105 P_EVENT_STATISTICS prEventStatistics;
1106 P_GLUE_INFO_T prGlueInfo;
1107 UINT_32 u4QueryInfoLen;
1114 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1116 if (prCmdInfo->fgIsOid) {
1117 prGlueInfo = prAdapter->prGlueInfo;
1119 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1120 u4QueryInfoLen = sizeof(UINT_32);
1122 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1123 *pu4Data = (UINT_32) prEventStatistics->rTransmittedFragmentCount.QuadPart;
1126 u4QueryInfoLen = sizeof(UINT_64);
1128 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1129 *pu8Data = prEventStatistics->rTransmittedFragmentCount.QuadPart;
1132 kalOidComplete(prGlueInfo,
1133 prCmdInfo->fgSetQuery,
1135 WLAN_STATUS_SUCCESS);
1141 nicCmdEventQueryRecvOk(
1142 IN P_ADAPTER_T prAdapter,
1143 IN P_CMD_INFO_T prCmdInfo,
1144 IN PUINT_8 pucEventBuf
1147 P_EVENT_STATISTICS prEventStatistics;
1148 P_GLUE_INFO_T prGlueInfo;
1149 UINT_32 u4QueryInfoLen;
1156 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1158 if (prCmdInfo->fgIsOid) {
1159 prGlueInfo = prAdapter->prGlueInfo;
1161 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1162 u4QueryInfoLen = sizeof(UINT_32);
1164 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1165 *pu4Data = (UINT_32) prEventStatistics->rReceivedFragmentCount.QuadPart;
1168 u4QueryInfoLen = sizeof(UINT_64);
1170 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1171 *pu8Data = prEventStatistics->rReceivedFragmentCount.QuadPart;
1174 kalOidComplete(prGlueInfo,
1175 prCmdInfo->fgSetQuery,
1177 WLAN_STATUS_SUCCESS);
1182 nicCmdEventQueryXmitError(
1183 IN P_ADAPTER_T prAdapter,
1184 IN P_CMD_INFO_T prCmdInfo,
1185 IN PUINT_8 pucEventBuf
1188 P_EVENT_STATISTICS prEventStatistics;
1189 P_GLUE_INFO_T prGlueInfo;
1190 UINT_32 u4QueryInfoLen;
1197 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1199 if (prCmdInfo->fgIsOid) {
1200 prGlueInfo = prAdapter->prGlueInfo;
1202 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1203 u4QueryInfoLen = sizeof(UINT_32);
1205 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1206 *pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
1209 u4QueryInfoLen = sizeof(UINT_64);
1211 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1212 *pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
1215 kalOidComplete(prGlueInfo,
1216 prCmdInfo->fgSetQuery,
1218 WLAN_STATUS_SUCCESS);
1224 nicCmdEventQueryRecvError(
1225 IN P_ADAPTER_T prAdapter,
1226 IN P_CMD_INFO_T prCmdInfo,
1227 IN PUINT_8 pucEventBuf
1230 P_EVENT_STATISTICS prEventStatistics;
1231 P_GLUE_INFO_T prGlueInfo;
1232 UINT_32 u4QueryInfoLen;
1239 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1241 if (prCmdInfo->fgIsOid) {
1242 prGlueInfo = prAdapter->prGlueInfo;
1244 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1245 u4QueryInfoLen = sizeof(UINT_32);
1247 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1248 *pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
1249 // @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated
1252 u4QueryInfoLen = sizeof(UINT_64);
1254 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1255 *pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
1256 // @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated
1259 kalOidComplete(prGlueInfo,
1260 prCmdInfo->fgSetQuery,
1262 WLAN_STATUS_SUCCESS);
1268 nicCmdEventQueryRecvNoBuffer(
1269 IN P_ADAPTER_T prAdapter,
1270 IN P_CMD_INFO_T prCmdInfo,
1271 IN PUINT_8 pucEventBuf
1274 P_EVENT_STATISTICS prEventStatistics;
1275 P_GLUE_INFO_T prGlueInfo;
1276 UINT_32 u4QueryInfoLen;
1283 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1285 if (prCmdInfo->fgIsOid) {
1286 prGlueInfo = prAdapter->prGlueInfo;
1288 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1289 u4QueryInfoLen = sizeof(UINT_32);
1291 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1292 *pu4Data = 0; // @FIXME?
1295 u4QueryInfoLen = sizeof(UINT_64);
1297 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1298 *pu8Data = 0; //@FIXME?
1301 kalOidComplete(prGlueInfo,
1302 prCmdInfo->fgSetQuery,
1304 WLAN_STATUS_SUCCESS);
1310 nicCmdEventQueryRecvCrcError(
1311 IN P_ADAPTER_T prAdapter,
1312 IN P_CMD_INFO_T prCmdInfo,
1313 IN PUINT_8 pucEventBuf
1316 P_EVENT_STATISTICS prEventStatistics;
1317 P_GLUE_INFO_T prGlueInfo;
1318 UINT_32 u4QueryInfoLen;
1325 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1327 if (prCmdInfo->fgIsOid) {
1328 prGlueInfo = prAdapter->prGlueInfo;
1330 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1331 u4QueryInfoLen = sizeof(UINT_32);
1333 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1334 *pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
1337 u4QueryInfoLen = sizeof(UINT_64);
1339 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1340 *pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
1343 kalOidComplete(prGlueInfo,
1344 prCmdInfo->fgSetQuery,
1346 WLAN_STATUS_SUCCESS);
1352 nicCmdEventQueryRecvErrorAlignment(
1353 IN P_ADAPTER_T prAdapter,
1354 IN P_CMD_INFO_T prCmdInfo,
1355 IN PUINT_8 pucEventBuf
1358 P_EVENT_STATISTICS prEventStatistics;
1359 P_GLUE_INFO_T prGlueInfo;
1360 UINT_32 u4QueryInfoLen;
1367 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1369 if (prCmdInfo->fgIsOid) {
1370 prGlueInfo = prAdapter->prGlueInfo;
1372 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1373 u4QueryInfoLen = sizeof(UINT_32);
1375 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1376 *pu4Data = (UINT_32) 0; //@FIXME
1379 u4QueryInfoLen = sizeof(UINT_64);
1381 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1382 *pu8Data = 0; //@FIXME
1385 kalOidComplete(prGlueInfo,
1386 prCmdInfo->fgSetQuery,
1388 WLAN_STATUS_SUCCESS);
1394 nicCmdEventQueryXmitOneCollision(
1395 IN P_ADAPTER_T prAdapter,
1396 IN P_CMD_INFO_T prCmdInfo,
1397 IN PUINT_8 pucEventBuf
1400 P_EVENT_STATISTICS prEventStatistics;
1401 P_GLUE_INFO_T prGlueInfo;
1402 UINT_32 u4QueryInfoLen;
1409 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1411 if (prCmdInfo->fgIsOid) {
1412 prGlueInfo = prAdapter->prGlueInfo;
1414 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1415 u4QueryInfoLen = sizeof(UINT_32);
1417 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1418 *pu4Data = (UINT_32) (prEventStatistics->rMultipleRetryCount.QuadPart - prEventStatistics->rRetryCount.QuadPart);
1421 u4QueryInfoLen = sizeof(UINT_64);
1423 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1424 *pu8Data = (UINT_64) (prEventStatistics->rMultipleRetryCount.QuadPart - prEventStatistics->rRetryCount.QuadPart);
1427 kalOidComplete(prGlueInfo,
1428 prCmdInfo->fgSetQuery,
1430 WLAN_STATUS_SUCCESS);
1436 nicCmdEventQueryXmitMoreCollisions(
1437 IN P_ADAPTER_T prAdapter,
1438 IN P_CMD_INFO_T prCmdInfo,
1439 IN PUINT_8 pucEventBuf
1442 P_EVENT_STATISTICS prEventStatistics;
1443 P_GLUE_INFO_T prGlueInfo;
1444 UINT_32 u4QueryInfoLen;
1451 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1453 if (prCmdInfo->fgIsOid) {
1454 prGlueInfo = prAdapter->prGlueInfo;
1456 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1457 u4QueryInfoLen = sizeof(UINT_32);
1459 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1460 *pu4Data = (UINT_32) prEventStatistics->rMultipleRetryCount.QuadPart;
1463 u4QueryInfoLen = sizeof(UINT_64);
1465 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1466 *pu8Data = (UINT_64) prEventStatistics->rMultipleRetryCount.QuadPart;
1469 kalOidComplete(prGlueInfo,
1470 prCmdInfo->fgSetQuery,
1472 WLAN_STATUS_SUCCESS);
1478 nicCmdEventQueryXmitMaxCollisions(
1479 IN P_ADAPTER_T prAdapter,
1480 IN P_CMD_INFO_T prCmdInfo,
1481 IN PUINT_8 pucEventBuf
1484 P_EVENT_STATISTICS prEventStatistics;
1485 P_GLUE_INFO_T prGlueInfo;
1486 UINT_32 u4QueryInfoLen;
1493 prEventStatistics = (P_EVENT_STATISTICS)pucEventBuf;
1495 if (prCmdInfo->fgIsOid) {
1496 prGlueInfo = prAdapter->prGlueInfo;
1498 if(prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
1499 u4QueryInfoLen = sizeof(UINT_32);
1501 pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
1502 *pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
1505 u4QueryInfoLen = sizeof(UINT_64);
1507 pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
1508 *pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
1511 kalOidComplete(prGlueInfo,
1512 prCmdInfo->fgSetQuery,
1514 WLAN_STATUS_SUCCESS);
1519 /*----------------------------------------------------------------------------*/
1521 * @brief This function is called when command by OID/ioctl has been timeout
1523 * @param prAdapter Pointer to the Adapter structure.
1524 * @param prCmdInfo Pointer to the command information
1529 /*----------------------------------------------------------------------------*/
1531 nicOidCmdTimeoutCommon (
1532 IN P_ADAPTER_T prAdapter,
1533 IN P_CMD_INFO_T prCmdInfo
1538 kalOidComplete(prAdapter->prGlueInfo,
1539 prCmdInfo->fgSetQuery,
1541 WLAN_STATUS_FAILURE);
1545 /*----------------------------------------------------------------------------*/
1547 * @brief This function is a generic command timeout handler
1549 * @param pfnOidHandler Pointer to the OID handler
1553 /*----------------------------------------------------------------------------*/
1555 nicCmdTimeoutCommon (
1556 IN P_ADAPTER_T prAdapter,
1557 IN P_CMD_INFO_T prCmdInfo
1564 /*----------------------------------------------------------------------------*/
1566 * @brief This function is called when command for entering RF test has
1567 * failed sending due to timeout (highly possibly by firmware crash)
1569 * @param prAdapter Pointer to the Adapter structure.
1570 * @param prCmdInfo Pointer to the command information
1575 /*----------------------------------------------------------------------------*/
1577 nicOidCmdEnterRFTestTimeout (
1578 IN P_ADAPTER_T prAdapter,
1579 IN P_CMD_INFO_T prCmdInfo
1584 // 1. Remove pending TX frames
1585 nicTxRelease(prAdapter);
1587 // 1.1 clear pending Security / Management Frames
1588 kalClearSecurityFrames(prAdapter->prGlueInfo);
1589 kalClearMgmtFrames(prAdapter->prGlueInfo);
1591 // 1.2 clear pending TX packet queued in glue layer
1592 kalFlushPendingTxPackets(prAdapter->prGlueInfo);
1594 // 2. indiate for OID failure
1595 kalOidComplete(prAdapter->prGlueInfo,
1596 prCmdInfo->fgSetQuery,
1598 WLAN_STATUS_FAILURE);
1602 /*----------------------------------------------------------------------------*/
1604 * @brief This function is called when command for memory dump has
1607 * @param prAdapter Pointer to the Adapter structure.
1608 * @param prCmdInfo Pointer to the command information
1609 * @param pucEventBuf Pointer to event buffer
1614 /*----------------------------------------------------------------------------*/
1616 nicCmdEventQueryMemDump (
1617 IN P_ADAPTER_T prAdapter,
1618 IN P_CMD_INFO_T prCmdInfo,
1619 IN PUINT_8 pucEventBuf
1622 UINT_32 u4QueryInfoLen;
1623 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo;
1624 P_GLUE_INFO_T prGlueInfo;
1625 P_EVENT_DUMP_MEM_T prEventDumpMem;
1626 static UINT_8 aucPath[256];
1627 static UINT_32 u4CurTimeTick;
1631 ASSERT(pucEventBuf);
1633 //4 <2> Update information of OID
1634 if (prCmdInfo->fgIsOid) {
1635 prGlueInfo = prAdapter->prGlueInfo;
1636 prEventDumpMem = (P_EVENT_DUMP_MEM_T)(pucEventBuf);
1638 u4QueryInfoLen = sizeof(P_PARAM_CUSTOM_MEM_DUMP_STRUC_T);
1640 prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T) prCmdInfo->pvInformationBuffer;
1641 prMemDumpInfo->u4Address = prEventDumpMem->u4Address;
1642 prMemDumpInfo->u4Length = prEventDumpMem->u4Length;
1643 prMemDumpInfo->u4RemainLength = prEventDumpMem->u4RemainLength;
1644 prMemDumpInfo->ucFragNum = prEventDumpMem->ucFragNum;
1649 printk("Rx dump address 0x%X, Length %d, FragNum %d, remain %d\n",
1650 prEventDumpMem->u4Address,
1651 prEventDumpMem->u4Length,
1652 prEventDumpMem->ucFragNum,
1653 prEventDumpMem->u4RemainLength);
1655 for(i = 0; i < prEventDumpMem->u4Length; i++) {
1656 printk("%02X ", prEventDumpMem->aucBuffer[i]);
1665 if(prEventDumpMem->ucFragNum == 1) {
1666 /* Store memory dump into sdcard,
1667 * path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
1669 u4CurTimeTick = kalGetTimeTick();
1671 sprintf(aucPath, "/sdcard/dump_%ld_0x%08lX_%ld.hex",
1673 prEventDumpMem->u4Address,
1674 prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
1676 strcpy(aucPath, "dump.hex");
1678 kalWriteToFile(aucPath, FALSE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
1681 /* Append current memory dump to the hex file */
1682 kalWriteToFile(aucPath, TRUE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
1685 if(prEventDumpMem->u4RemainLength == 0 ||
1686 prEventDumpMem->u4Address == 0xFFFFFFFF) {
1687 /* The request is finished or firmware response a error */
1688 /* Reply time tick to iwpriv */
1689 *((PUINT_32)prCmdInfo->pvInformationBuffer) = u4CurTimeTick;
1690 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
1693 /* The memory dump request is not finished, Send next command*/
1696 prCmdInfo->pvInformationBuffer,
1697 prCmdInfo->u4InformationBufferLength);
1705 #if CFG_SUPPORT_BUILD_DATE_CODE
1706 /*----------------------------------------------------------------------------*/
1708 * @brief This function is called when event for build date code information
1709 * has been retrieved
1711 * @param prAdapter Pointer to the Adapter structure.
1712 * @param prCmdInfo Pointer to the command information
1713 * @param pucEventBuf Pointer to the event buffer
1718 /*----------------------------------------------------------------------------*/
1720 nicCmdEventBuildDateCode (
1721 IN P_ADAPTER_T prAdapter,
1722 IN P_CMD_INFO_T prCmdInfo,
1723 IN PUINT_8 pucEventBuf
1726 UINT_32 u4QueryInfoLen;
1727 P_EVENT_BUILD_DATE_CODE prEvent;
1728 P_GLUE_INFO_T prGlueInfo;
1732 ASSERT(pucEventBuf);
1734 //4 <2> Update information of OID
1735 if (prCmdInfo->fgIsOid) {
1736 prGlueInfo = prAdapter->prGlueInfo;
1737 prEvent = (P_EVENT_BUILD_DATE_CODE)pucEventBuf;
1739 u4QueryInfoLen = sizeof(UINT_8) * 16;
1740 kalMemCopy(prCmdInfo->pvInformationBuffer, prEvent->aucDateCode, sizeof(UINT_8) * 16);
1742 kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);