2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/nic/nic_pwr_mgt.c#1 $
5 /*! \file "nic_pwr_mgt.c"
6 \brief In this file we define the STATE and EVENT for Power Management FSM.
8 The SCAN FSM is responsible for performing SCAN behavior when the Arbiter enter
9 ARB_STATE_SCAN. The STATE and EVENT for SCAN FSM are defined here with detail
16 ** $Log: nic_pwr_mgt.c $
19 * [WCXRP00001125] [MT6620 Wi-Fi][Firmware] Strengthen Wi-Fi power off sequence to have a clearroom environment when returining to ROM code
20 * 1. Due to firmware now stops HIF DMA for powering off, do not try to receive any packet from firmware
21 * 2. Take use of prAdapter->fgIsEnterD3ReqIssued for tracking whether it is powering off or not
24 * [WCXRP00001022] [MT6628 Driver][Firmware Download] Add multi section independent download functionality
25 * add firmware download path in divided scatters.
28 * [WCXRP00000851] [MT6628 Wi-Fi][Driver] Add HIFSYS related definition to driver source tree
29 * reuse firmware download logic of MT6620 for MT6628.
32 * [WCXRP00000718] [MT6620 Wi-Fi] modify the behavior of setting tx power
33 * ACPI APIs migrate to wlan_lib.c for glue layer to invoke.
36 * [WCXRP00000636] [WHQL][MT5931 Driver] 2c_PMHibernate (hang on 2h)
37 * fix for compilation error when applied with FW_DOWNLOAD = 0
40 * [WCXRP00000636] [WHQL][MT5931 Driver] 2c_PMHibernate (hang on 2h)
41 * 1) add API for glue layer to query ACPI state
42 * 2) Windows glue should not access to hardware after switched into D3 state
45 * [WCXRP00000639] [WHQL][MT5931 Driver] 2c_PMStandby test item can not complete
46 * refine for MT5931/MT6620 logic separation.
49 * [WCXRP00000639] [WHQL][MT5931 Driver] 2c_PMStandby test item can not complete
50 * bugfix: firmware download procedure for ACPI state transition is not complete.
53 * [WCXRP00000559] [MT6620 Wi-Fi][Driver] Combine TX/RX DMA buffers into a single one to reduce physically continuous memory consumption
54 * 1. deprecate CFG_HANDLE_IST_IN_SDIO_CALLBACK
55 * 2. Use common coalescing buffer for both TX/RX directions
59 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
60 * Toggle non-standard debug messages to comments.
63 * [WCXRP00000335] [MT6620 Wi-Fi][Driver] change to use milliseconds sleep instead of delay to avoid blocking to system scheduling
64 * change to use msleep() and shorten waiting interval to reduce blocking to other task while Wi-Fi driver is being loaded
67 * [WCXRP00000327] [MT6620 Wi-Fi][Driver] Improve HEC WHQA 6972 workaround coverage in driver side
68 * check success or failure for setting fw-own
71 * [WCXRP00000327] [MT6620 Wi-Fi][Driver] Improve HEC WHQA 6972 workaround coverage in driver side
72 * host driver not to set FW-own when there is still pending interrupts
75 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
76 * add firmware download for MT5931.
79 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
80 * Do a complete reset with STA-REC null checking for RF test re-entry
84 * eliminate klockwork errors
88 * reset ACPI power state before waking up MT6620 Wi-Fi firmware.
92 * [AIS-FSM] honor registry setting for adhoc running mode. (A/B/G)
96 * Centralize mgmt/system service procedures into independent calls.
100 * 1) refine AIS-FSM indent.
101 * 2) when entering RF Test mode, flush 802.1X frames as well
102 * 3) when entering D3 state, flush 802.1X frames as well
106 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
109 * [WPD00003833][MT6620 and MT5931] Driver migration
110 * change MAC address updating logic.
112 * 06 06 2010 kevin.huang
113 * [WPD00003832][MT6620 5931] Create driver base
114 * [MT6620 5931] Create driver base
117 * [WPD00001943]Create WiFi test driver framework on WinXP
118 * 1) when acquiring LP-own, write for clr-own with lower frequency compared to read poll
119 * 2) correct address list parsing
122 * [WPD00001943]Create WiFi test driver framework on WinXP
123 * sleepy notify is only used for sleepy state,
124 * while wake-up state is automatically set when host needs to access device
127 * [WPD00001943]Create WiFi test driver framework on WinXP
128 * correct hibernation problem.
131 * [WPD00001943]Create WiFi test driver framework on WinXP
132 * 1) surpress compiler warning
133 * 2) when acqruing LP-own, keep writing WHLPCR whenever OWN is not acquired yet
136 * [WPD00001943]Create WiFi test driver framework on WinXP
137 * surpress compiler warning
140 * [WPD00001943]Create WiFi test driver framework on WinXP
141 * when acquiring driver-own, wait for up to 8 seconds.
143 * 04 21 2010 jeffrey.chang
144 * [WPD00003826]Initial import for Linux port
145 * add for private ioctl support
148 * [WPD00001943]Create WiFi test driver framework on WinXP
149 * 1) remove redundant firmware image unloading
150 * * 2) use compile-time macros to separate logic related to accquiring own
153 * [WPD00001943]Create WiFi test driver framework on WinXP
154 * treat BUS access failure as kind of card removal.
157 * [WPD00001943]Create WiFi test driver framework on WinXP
158 * accessing to firmware load/start address, and access to OID handling information
159 * * are now handled in glue layer
162 * [WPD00001943]Create WiFi test driver framework on WinXP
163 * ePowerCtrl is not necessary as a glue variable.
166 * [WPD00001943]Create WiFi test driver framework on WinXP
167 * add KAL API: kalFlushPendingTxPackets(), and take use of the API
170 * [WPD00001943]Create WiFi test driver framework on WinXP
171 * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
173 * 03 24 2010 jeffrey.chang
174 * [WPD00003826]Initial import for Linux port
175 * initial import for Linux port
178 * [WPD00001943]Create WiFi test driver framework on WinXP
179 * always send CMD_NIC_POWER_CTRL packet when nic is being halted
182 * [WPD00001943]Create WiFi test driver framework on WinXP
186 * [WPD00001943]Create WiFi test driver framework on WinXP
187 * 1) add ACPI D0/D3 state switching support
188 * * * * * * * * 2) use more formal way to handle interrupt when the status is retrieved from enhanced RX response
191 * [WPD00001943]Create WiFi test driver framework on WinXP
192 * 1) add another spin-lock to protect MsduInfoList due to it might be accessed by different thread.
193 * * 2) change own-back acquiring procedure to wait for up to 16.67 seconds
194 ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-10-13 21:59:15 GMT mtk01084
195 ** update for new HW design
196 ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-09-09 17:26:36 GMT mtk01084
197 ** remove CMD52 access
198 ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-05-18 14:50:29 GMT mtk01084
199 ** modify lines in nicpmSetDriverOwn()
200 ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-23 16:55:37 GMT mtk01084
201 ** modify nicpmSetDriverOwn()
202 ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-19 18:33:00 GMT mtk01084
203 ** update for basic power management functions
204 ** \main\maintrunk.MT6620WiFiDriver_Prj\1 2009-03-19 15:05:32 GMT mtk01084
209 /*******************************************************************************
210 * C O M P I L E R F L A G S
211 ********************************************************************************
214 /*******************************************************************************
215 * E X T E R N A L R E F E R E N C E S
216 ********************************************************************************
220 /*******************************************************************************
222 ********************************************************************************
225 /*******************************************************************************
227 ********************************************************************************
230 /*******************************************************************************
231 * P U B L I C D A T A
232 ********************************************************************************
233 */extern BOOLEAN fgIsResetting;
235 /*******************************************************************************
236 * P R I V A T E D A T A
237 ********************************************************************************
240 /*******************************************************************************
242 ********************************************************************************
245 /*******************************************************************************
246 * F U N C T I O N D E C L A R A T I O N S
247 ********************************************************************************
250 /*******************************************************************************
252 ********************************************************************************
255 /*----------------------------------------------------------------------------*/
257 * \brief This routine is used to process the POWER ON procedure.
259 * \param[in] pvAdapter Pointer to the Adapter structure.
263 /*----------------------------------------------------------------------------*/
266 IN P_ADAPTER_T prAdapter,
267 IN BOOLEAN fgEnableGlobalInt
274 if(prAdapter->fgIsFwOwn == TRUE) {
278 if(nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) {
279 // pending interrupts
284 if (fgEnableGlobalInt) {
285 prAdapter->fgIsIntEnableWithLPOwnSet = TRUE;
288 HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_SET);
290 HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);
291 if(u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
292 // if set firmware own not successful (possibly pending interrupts),
293 // indicate an own clear event
294 HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
299 prAdapter->fgIsFwOwn = TRUE;
303 /*----------------------------------------------------------------------------*/
305 * \brief This routine is used to process the POWER OFF procedure.
307 * \param[in] pvAdapter Pointer to the Adapter structure.
311 /*----------------------------------------------------------------------------*/
314 IN P_ADAPTER_T prAdapter
317 #define LP_OWN_BACK_TOTAL_DELAY_MS 8192 //exponential of 2
318 #define LP_OWN_BACK_LOOP_DELAY_MS 1 //exponential of 2
319 #define LP_OWN_BACK_CLR_OWN_ITERATION 256 //exponential of 2
321 BOOLEAN fgStatus = TRUE;
322 UINT_32 i, u4CurrTick, u4RegValue = 0;
326 if(prAdapter->fgIsFwOwn == FALSE)
329 u4CurrTick = kalGetTimeTick();
332 HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);
334 if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
335 prAdapter->fgIsFwOwn = FALSE;
338 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
339 || fgIsBusAccessFailed == TRUE
340 || (kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS
341 ||fgIsResetting ==TRUE) {
342 //ERRORLOG(("LP cannot be own back (for %ld ms)", kalGetTimeTick() - u4CurrTick));
347 if((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
348 /* Software get LP ownership - per 256 iterations */
349 HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
352 /* Delay for LP engine to complete its operation. */
353 kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
361 /*----------------------------------------------------------------------------*/
363 * \brief This routine is used to set ACPI power mode to D0.
365 * \param[in] pvAdapter Pointer to the Adapter structure.
369 /*----------------------------------------------------------------------------*/
371 nicpmSetAcpiPowerD0 (
372 IN P_ADAPTER_T prAdapter
375 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
376 UINT_32 u4Value = 0, u4WHISR = 0;
377 UINT_8 aucTxCount[8];
379 #if CFG_ENABLE_FW_DOWNLOAD
380 UINT_32 u4FwImgLength, u4FwLoadAddr, u4ImgSecSize;
381 PVOID prFwMappingHandle;
382 PVOID pvFwImageMapFile = NULL;
383 #if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
385 P_FIRMWARE_DIVIDED_DOWNLOAD_T prFwHead;
387 const UINT_32 u4CRCOffset = offsetof(FIRMWARE_DIVIDED_DOWNLOAD_T, u4NumOfEntries);
391 DEBUGFUNC("nicpmSetAcpiPowerD0");
396 /* 0. Reset variables in ADAPTER_T */
397 prAdapter->fgIsFwOwn = TRUE;
398 prAdapter->fgWiFiInSleepyState = FALSE;
399 prAdapter->rAcpiState = ACPI_STATE_D0;
400 prAdapter->fgIsEnterD3ReqIssued = FALSE;
402 #if defined(MT6620) || defined(MT6628)
403 /* 1. Request Ownership to enter F/W download state */
404 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
405 #if !CFG_ENABLE_FULL_PM
406 nicpmSetDriverOwn(prAdapter);
409 /* 2. Initialize the Adapter */
410 if ( (u4Status = nicInitializeAdapter(prAdapter)) != WLAN_STATUS_SUCCESS ) {
411 DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
412 u4Status = WLAN_STATUS_FAILURE;
417 #if CFG_ENABLE_FW_DOWNLOAD
418 prFwMappingHandle = kalFirmwareImageMapping(prAdapter->prGlueInfo, &pvFwImageMapFile, &u4FwImgLength);
419 if(!prFwMappingHandle) {
420 DBGLOG(INIT, ERROR,("Fail to load FW image from file!\n"));
421 pvFwImageMapFile = NULL;
424 #if defined(MT6620) || defined(MT6628)
425 if (pvFwImageMapFile) {
426 /* 3.1 disable interrupt, download is done by polling mode only */
427 nicDisableInterrupt(prAdapter);
429 /* 3.2 Initialize Tx Resource to fw download state */
430 nicTxInitResetResource(prAdapter);
432 /* 3.3 FW download here */
433 u4FwLoadAddr = kalGetFwLoadAddress(prAdapter->prGlueInfo);
435 #if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
436 // 3a. parse file header for decision of divided firmware download or not
437 prFwHead = (P_FIRMWARE_DIVIDED_DOWNLOAD_T)pvFwImageMapFile;
439 if(prFwHead->u4Signature == MTK_WIFI_SIGNATURE &&
440 prFwHead->u4CRC == wlanCRC32((PUINT_8)pvFwImageMapFile + u4CRCOffset, u4FwImgLength - u4CRCOffset)) {
447 /* 3b. engage divided firmware downloading */
448 if(fgValidHead == TRUE) {
449 for(i = 0 ; i < prFwHead->u4NumOfEntries ; i++) {
450 #if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
451 if(wlanImageSectionDownloadAggregated(prAdapter,
452 prFwHead->arSection[i].u4DestAddr,
453 prFwHead->arSection[i].u4Length,
454 (PUINT_8)pvFwImageMapFile + prFwHead->arSection[i].u4Offset) != WLAN_STATUS_SUCCESS) {
455 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
456 u4Status = WLAN_STATUS_FAILURE;
459 for(j = 0 ; j < prFwHead->arSection[i].u4Length ; j += CMD_PKT_SIZE_FOR_IMAGE) {
460 if(j + CMD_PKT_SIZE_FOR_IMAGE < prFwHead->arSection[i].u4Length)
461 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
463 u4ImgSecSize = prFwHead->arSection[i].u4Length - j;
465 if(wlanImageSectionDownload(prAdapter,
466 prFwHead->arSection[i].u4DestAddr + j,
468 (PUINT_8)pvFwImageMapFile + prFwHead->arSection[i].u4Offset + j) != WLAN_STATUS_SUCCESS) {
469 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
470 u4Status = WLAN_STATUS_FAILURE;
475 /* escape from loop if any pending error occurs */
476 if(u4Status == WLAN_STATUS_FAILURE) {
483 #if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
484 if(wlanImageSectionDownloadAggregated(prAdapter,
487 (PUINT_8)pvFwImageMapFile) != WLAN_STATUS_SUCCESS) {
488 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
489 u4Status = WLAN_STATUS_FAILURE;
492 for (i = 0; i < u4FwImgLength ; i += CMD_PKT_SIZE_FOR_IMAGE) {
493 if(i + CMD_PKT_SIZE_FOR_IMAGE < u4FwImgLength)
494 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
496 u4ImgSecSize = u4FwImgLength - i;
498 if(wlanImageSectionDownload(prAdapter,
501 (PUINT_8)pvFwImageMapFile + i) != WLAN_STATUS_SUCCESS) {
502 DBGLOG(INIT, ERROR, ("wlanImageSectionDownload failed!\n"));
503 u4Status = WLAN_STATUS_FAILURE;
509 if(u4Status != WLAN_STATUS_SUCCESS) {
510 kalFirmwareImageUnmapping(prAdapter->prGlueInfo, prFwMappingHandle, pvFwImageMapFile);
514 #if !CFG_ENABLE_FW_DOWNLOAD_ACK
515 // Send INIT_CMD_ID_QUERY_PENDING_ERROR command and wait for response
516 if(wlanImageQueryStatus(prAdapter) != WLAN_STATUS_SUCCESS) {
517 kalFirmwareImageUnmapping(prAdapter->prGlueInfo, prFwMappingHandle, pvFwImageMapFile);
518 u4Status = WLAN_STATUS_FAILURE;
523 kalFirmwareImageUnmapping(prAdapter->prGlueInfo, prFwMappingHandle, pvFwImageMapFile);
526 u4Status = WLAN_STATUS_FAILURE;
530 /* 4. send Wi-Fi Start command */
531 #if CFG_OVERRIDE_FW_START_ADDRESS
532 wlanConfigWifiFunc(prAdapter,
534 kalGetFwStartAddress(prAdapter->prGlueInfo));
536 wlanConfigWifiFunc(prAdapter,
541 #elif defined(MT5931)
542 if (pvFwImageMapFile) {
543 DBGLOG(INIT, TRACE, ("Download Address: 0x%08X\n", kalGetFwLoadAddress(prAdapter->prGlueInfo)));
544 DBGLOG(INIT, TRACE, ("Firmware Length: 0x%08X\n", u4FwImgLength));
547 /* 1.0 whole-chip reset except HIFSYS */
548 HAL_MCR_WR(prAdapter, MCR_WMCSR, WMCSR_CHIP_RST);
549 HAL_MCR_WR(prAdapter, MCR_WMCSR, 0);
551 /* 1.1 wait for INIT_RDY */
554 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
556 if (u4Value & WMCSR_INI_RDY) {
557 DBGLOG(INIT, TRACE, ("INIT-RDY detected\n"));
560 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
561 || fgIsBusAccessFailed == TRUE) {
562 u4Status = WLAN_STATUS_FAILURE;
565 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
566 DBGLOG(INIT, ERROR, ("Waiting for Init Ready bit: Timeout\n"));
567 u4Status = WLAN_STATUS_FAILURE;
576 /* 1.2 set KSEL/FLEN */
577 HAL_MCR_WR(prAdapter, MCR_FWCFG, u4FwImgLength >> 6);
579 /* 1.3 enable FWDL_EN */
580 HAL_MCR_WR(prAdapter, MCR_WMCSR, WMCSR_FWDLEN);
582 /* 1.4 wait for PLL_RDY */
585 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
587 if (u4Value & WMCSR_PLLRDY) {
588 DBGLOG(INIT, TRACE, ("PLL-RDY detected\n"));
591 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
592 || fgIsBusAccessFailed == TRUE) {
593 u4Status = WLAN_STATUS_FAILURE;
596 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
597 DBGLOG(INIT, ERROR, ("Waiting for PLL Ready bit: Timeout\n"));
598 u4Status = WLAN_STATUS_FAILURE;
607 /* 2.1 turn on HIFSYS firmware download mode */
608 HAL_MCR_WR(prAdapter, MCR_FWDLSR, FWDLSR_FWDL_MODE);
610 /* 2.2 set starting address */
611 u4FwLoadAddr = kalGetFwLoadAddress(prAdapter->prGlueInfo);
612 HAL_MCR_WR(prAdapter, MCR_FWDLDSAR, u4FwLoadAddr);
614 /* 3. upload firmware */
615 for (i = 0; i < u4FwImgLength ; i += CMD_PKT_SIZE_FOR_IMAGE) {
616 if(i + CMD_PKT_SIZE_FOR_IMAGE < u4FwImgLength)
617 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
619 u4ImgSecSize = u4FwImgLength - i;
621 if(wlanImageSectionDownload(prAdapter,
624 (PUINT_8)pvFwImageMapFile + i) != WLAN_STATUS_SUCCESS) {
625 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
626 u4Status = WLAN_STATUS_FAILURE;
631 /* 4.1 poll FWDL_OK & FWDL_FAIL bits */
634 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
636 if (u4Value & WMCSR_DL_OK) {
637 DBGLOG(INIT, TRACE, ("DL_OK detected\n"));
640 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
641 || fgIsBusAccessFailed == TRUE
642 || (u4Value & WMCSR_DL_FAIL)) {
643 DBGLOG(INIT, ERROR, ("DL_FAIL detected: 0x%08X\n", u4Value));
644 u4Status = WLAN_STATUS_FAILURE;
647 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
648 DBGLOG(INIT, ERROR, ("Waiting for DL_OK/DL_FAIL bit: Timeout\n"));
649 u4Status = WLAN_STATUS_FAILURE;
658 /* 4.2 turn off HIFSYS download mode */
659 HAL_MCR_WR(prAdapter, MCR_FWDLSR, 0);
664 DBGLOG(INIT, ERROR, ("No Firmware found!\n"));
665 u4Status = WLAN_STATUS_FAILURE;
672 /* 5. check Wi-Fi FW asserts ready bit */
673 DBGLOG(INIT, TRACE, ("wlanAdapterStart(): Waiting for Ready bit..\n"));
676 HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
678 if (u4Value & WCIR_WLAN_READY) {
679 DBGLOG(INIT, TRACE, ("Ready bit asserted\n"));
682 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
683 || fgIsBusAccessFailed == TRUE) {
684 u4Status = WLAN_STATUS_FAILURE;
687 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
688 DBGLOG(INIT, ERROR, ("Waiting for Ready bit: Timeout\n"));
689 u4Status = WLAN_STATUS_FAILURE;
700 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
701 #if !CFG_ENABLE_FULL_PM
702 nicpmSetDriverOwn(prAdapter);
705 /* 2. Initialize the Adapter */
706 if ( (u4Status = nicInitializeAdapter(prAdapter)) != WLAN_STATUS_SUCCESS ) {
707 DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
708 u4Status = WLAN_STATUS_FAILURE;
713 if(u4Status == WLAN_STATUS_SUCCESS) {
714 // 6.1 reset interrupt status
715 HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
716 if(HAL_IS_TX_DONE_INTR(u4WHISR)) {
717 HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
720 /* 6.2 reset TX Resource for normal operation */
721 nicTxResetResource(prAdapter);
723 /* 6.3 Enable interrupt */
724 nicEnableInterrupt(prAdapter);
726 /* 6.4 Override network address */
727 wlanUpdateNetworkAddress(prAdapter);
729 /* 6.5 indicate disconnection as default status */
730 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
731 WLAN_STATUS_MEDIA_DISCONNECT,
736 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
738 /* MGMT Initialization */
739 nicInitMGMT(prAdapter, NULL);
743 if(u4Status != WLAN_STATUS_SUCCESS) {
751 /*----------------------------------------------------------------------------*/
753 * @brief This routine is used to set ACPI power mode to D3.
755 * @param prAdapter pointer to the Adapter handler
759 /*----------------------------------------------------------------------------*/
761 nicpmSetAcpiPowerD3 (
762 IN P_ADAPTER_T prAdapter
769 /* 1. MGMT - unitialization */
770 nicUninitMGMT(prAdapter);
772 /* 2. Disable Interrupt */
773 nicDisableInterrupt(prAdapter);
775 /* 3. emit CMD_NIC_POWER_CTRL command packet */
776 wlanSendNicPowerCtrlCmd(prAdapter, 1);
778 /* 4. Clear Interrupt Status */
780 while(i < CFG_IST_LOOP_COUNT && nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) {
784 /* 5. Remove pending TX */
785 nicTxRelease(prAdapter);
787 // 5.1 clear pending Security / Management Frames
788 kalClearSecurityFrames(prAdapter->prGlueInfo);
789 kalClearMgmtFrames(prAdapter->prGlueInfo);
791 // 5.2 clear pending TX packet queued in glue layer
792 kalFlushPendingTxPackets(prAdapter->prGlueInfo);
794 /* 6. Set Onwership to F/W */
795 nicpmSetFWOwn(prAdapter, FALSE);
797 /* 7. Set variables */
798 prAdapter->rAcpiState = ACPI_STATE_D3;