/*----------------------------------------------------------------------------*/ VOID nicpmSetFWOwn(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgEnableGlobalInt) { UINT_32 u4RegValue; ASSERT(prAdapter); if (prAdapter->fgIsFwOwn == TRUE) { return; } else { if (nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) { /* pending interrupts */ return; } } if (fgEnableGlobalInt) { prAdapter->fgIsIntEnableWithLPOwnSet = TRUE; } else { HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_SET); HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue); if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) { /* if set firmware own not successful (possibly pending interrupts), */ /* indicate an own clear event */ HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR); return; } prAdapter->fgIsFwOwn = TRUE; } }
/*----------------------------------------------------------------------------*/ BOOLEAN nicpmSetAcpiPowerD3 ( IN P_ADAPTER_T prAdapter ) { UINT_32 i; ASSERT(prAdapter); /* 1. MGMT - unitialization */ nicUninitMGMT(prAdapter); /* 2. Disable Interrupt */ nicDisableInterrupt(prAdapter); /* 3. emit CMD_NIC_POWER_CTRL command packet */ wlanSendNicPowerCtrlCmd(prAdapter, 1); /* 4. Clear Interrupt Status */ i = 0; while(i < CFG_IST_LOOP_COUNT && nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) { i++; }; /* 5. Remove pending TX */ nicTxRelease(prAdapter, TRUE); // 5.1 clear pending Security / Management Frames kalClearSecurityFrames(prAdapter->prGlueInfo); kalClearMgmtFrames(prAdapter->prGlueInfo); // 5.2 clear pending TX packet queued in glue layer kalFlushPendingTxPackets(prAdapter->prGlueInfo); /* 6. Set Onwership to F/W */ nicpmSetFWOwn(prAdapter, FALSE); /* 7. Set variables */ prAdapter->rAcpiState = ACPI_STATE_D3; return TRUE; }