diff options
Diffstat (limited to 'drivers/staging/vt6656/power.c')
| -rw-r--r-- | drivers/staging/vt6656/power.c | 462 |
1 files changed, 209 insertions, 253 deletions
diff --git a/drivers/staging/vt6656/power.c b/drivers/staging/vt6656/power.c index e8c1b35e812..ddbd04695c9 100644 --- a/drivers/staging/vt6656/power.c +++ b/drivers/staging/vt6656/power.c @@ -19,7 +19,7 @@ * * File: power.c * - * Purpose: Handles 802.11 power management functions + * Purpose: Handles 802.11 power management functions * * Author: Lyndon Chen * @@ -37,7 +37,6 @@ * */ -#include "ttype.h" #include "mac.h" #include "device.h" #include "wmgr.h" @@ -45,22 +44,11 @@ #include "wcmd.h" #include "rxtx.h" #include "card.h" -#include "control.h" -#include "rndis.h" +#include "usbpipe.h" -/*--------------------- Static Definitions -------------------------*/ +static int msglevel = MSG_LEVEL_INFO; -/*--------------------- Static Classes ----------------------------*/ - -/*--------------------- Static Variables --------------------------*/ -static int msglevel =MSG_LEVEL_INFO; -/*--------------------- Static Functions --------------------------*/ - -/*--------------------- Export Variables --------------------------*/ - -/*--------------------- Export Functions --------------------------*/ - -/*+ +/* * * Routine Description: * Enable hw power saving functions @@ -68,69 +56,66 @@ static int msglevel =MSG_LEVEL_INFO; * Return Value: * None. * --*/ + */ -void PSvEnablePowerSaving(void *hDeviceContext, - WORD wListenInterval) +void PSvEnablePowerSaving(struct vnt_private *pDevice, u16 wListenInterval) { - PSDevice pDevice = (PSDevice)hDeviceContext; - PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - WORD wAID = pMgmt->wCurrAID | BIT14 | BIT15; + struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; + u16 wAID = pMgmt->wCurrAID | BIT14 | BIT15; + + /* set period of power up before TBTT */ + MACvWriteWord(pDevice, MAC_REG_PWBT, C_PWBT); - /* set period of power up before TBTT */ - MACvWriteWord(pDevice, MAC_REG_PWBT, C_PWBT); + if (pDevice->op_mode != NL80211_IFTYPE_ADHOC) { + /* set AID */ + MACvWriteWord(pDevice, MAC_REG_AIDATIM, wAID); + } - if (pDevice->eOPMode != OP_MODE_ADHOC) { - /* set AID */ - MACvWriteWord(pDevice, MAC_REG_AIDATIM, wAID); - } else { - // set ATIM Window - //MACvWriteATIMW(pDevice->PortOffset, pMgmt->wCurrATIMWindow); - } + /* Warren:06-18-2004,the sequence must follow + * PSEN->AUTOSLEEP->GO2DOZE + */ + /* enable power saving hw function */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); - //Warren:06-18-2004,the sequence must follow PSEN->AUTOSLEEP->GO2DOZE - // enable power saving hw function - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); - // Set AutoSleep - MACvRegBitsOn(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); + /* Set AutoSleep */ + MACvRegBitsOn(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); - //Warren:MUST turn on this once before turn on AUTOSLEEP ,or the AUTOSLEEP doesn't work - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); + /* Warren:MUST turn on this once before turn on AUTOSLEEP ,or the + * AUTOSLEEP doesn't work + */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); + if (wListenInterval >= 2) { - if (wListenInterval >= 2) { + /* clear always listen beacon */ + MACvRegBitsOff(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - // clear always listen beacon - MACvRegBitsOff(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - // first time set listen next beacon - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); + /* first time set listen next beacon */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - pMgmt->wCountToWakeUp = wListenInterval; + pMgmt->wCountToWakeUp = wListenInterval; - } - else { + } else { - // always listen beacon - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - pMgmt->wCountToWakeUp = 0; + /* always listen beacon */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - } + pMgmt->wCountToWakeUp = 0; + } - pDevice->bEnablePSMode = TRUE; + pDevice->bEnablePSMode = true; - if (pDevice->eOPMode == OP_MODE_ADHOC) { - /* bMgrPrepareBeaconToSend((void *) pDevice, pMgmt); */ - } - // We don't send null pkt in ad hoc mode since beacon will handle this. - else if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) { - PSbSendNullPacket(pDevice); - } - pDevice->bPWBitOn = TRUE; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS:Power Saving Mode Enable... \n"); - return; + /* We don't send null pkt in ad hoc mode + * since beacon will handle this. + */ + if (pDevice->op_mode == NL80211_IFTYPE_STATION) + PSbSendNullPacket(pDevice); + + pDevice->bPWBitOn = true; + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS:Power Saving Mode Enable...\n"); } -/*+ +/* * * Routine Description: * Disable hw power saving functions @@ -138,95 +123,84 @@ void PSvEnablePowerSaving(void *hDeviceContext, * Return Value: * None. * --*/ + */ -void PSvDisablePowerSaving(void *hDeviceContext) +void PSvDisablePowerSaving(struct vnt_private *pDevice) { - PSDevice pDevice = (PSDevice)hDeviceContext; -// PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - - // disable power saving hw function - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_DISABLE_PS, - 0, - 0, - 0, - NULL - ); + /* disable power saving hw function */ + vnt_control_out(pDevice, MESSAGE_TYPE_DISABLE_PS, 0, + 0, 0, NULL); - //clear AutoSleep - MACvRegBitsOff(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); + /* clear AutoSleep */ + MACvRegBitsOff(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); - // set always listen beacon - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); + /* set always listen beacon */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); + pDevice->bEnablePSMode = false; - pDevice->bEnablePSMode = FALSE; + if (pDevice->op_mode == NL80211_IFTYPE_STATION) + PSbSendNullPacket(pDevice); - if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) { - PSbSendNullPacket(pDevice); - } - pDevice->bPWBitOn = FALSE; - return; + pDevice->bPWBitOn = false; } -/*+ +/* * * Routine Description: * Consider to power down when no more packets to tx or rx. * * Return Value: - * TRUE, if power down success - * FALSE, if fail --*/ + * true, if power down success + * false, if fail + */ -BOOL PSbConsiderPowerDown(void *hDeviceContext, - BOOL bCheckRxDMA, - BOOL bCheckCountToWakeUp) +int PSbConsiderPowerDown(struct vnt_private *pDevice, int bCheckRxDMA, + int bCheckCountToWakeUp) { - PSDevice pDevice = (PSDevice)hDeviceContext; - PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - BYTE byData; - - - // check if already in Doze mode - ControlvReadByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_PSCTL, &byData); - if ( (byData & PSCTL_PS) != 0 ) - return TRUE; - - if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { - // check if in TIM wake period - if (pMgmt->bInTIMWake) - return FALSE; - } - - // check scan state - if (pDevice->bCmdRunning) - return FALSE; - - //Tx Burst - if ( pDevice->bPSModeTxBurst ) - return FALSE; - - // Froce PSEN on - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); - - if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { - if (bCheckCountToWakeUp && - (pMgmt->wCountToWakeUp == 0 || pMgmt->wCountToWakeUp == 1)) { - return FALSE; - } - } - - pDevice->bPSRxBeacon = TRUE; - // no Tx, no Rx isr, now go to Doze - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Go to Doze ZZZZZZZZZZZZZZZ\n"); - return TRUE; + struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; + u8 byData; + + /* check if already in Doze mode */ + vnt_control_in_u8(pDevice, MESSAGE_REQUEST_MACREG, + MAC_REG_PSCTL, &byData); + + if ((byData & PSCTL_PS) != 0) + return true; + + if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { + /* check if in TIM wake period */ + if (pMgmt->bInTIMWake) + return false; + } + + /* check scan state */ + if (pDevice->bCmdRunning) + return false; + + /* Tx Burst */ + if (pDevice->bPSModeTxBurst) + return false; + + /* Froce PSEN on */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); + + if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { + if (bCheckCountToWakeUp && (pMgmt->wCountToWakeUp == 0 + || pMgmt->wCountToWakeUp == 1)) { + return false; + } + } + + pDevice->bPSRxBeacon = true; + + /* no Tx, no Rx isr, now go to Doze */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Go to Doze ZZZZZZZZZZZZZZZ\n"); + return true; } -/*+ +/* * * Routine Description: * Send PS-POLL packet @@ -234,41 +208,42 @@ BOOL PSbConsiderPowerDown(void *hDeviceContext, * Return Value: * None. * --*/ + */ -void PSvSendPSPOLL(void *hDeviceContext) +void PSvSendPSPOLL(struct vnt_private *pDevice) { - PSDevice pDevice = (PSDevice)hDeviceContext; - PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - PSTxMgmtPacket pTxPacket = NULL; - - - memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_HDR_ADDR2_LEN); - pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool; - pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket)); - pTxPacket->p80211Header->sA2.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_CTL) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PSPOLL) | - WLAN_SET_FC_PWRMGT(0) - )); - pTxPacket->p80211Header->sA2.wDurationID = pMgmt->wCurrAID | BIT14 | BIT15; - memcpy(pTxPacket->p80211Header->sA2.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA2.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - pTxPacket->cbMPDULen = WLAN_HDR_ADDR2_LEN; - pTxPacket->cbPayloadLen = 0; - // send the frame - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send PS-Poll packet failed..\n"); - } - else { -// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send PS-Poll packet success..\n"); - }; - - return; + struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; + struct vnt_tx_mgmt *pTxPacket = NULL; + + memset(pMgmt->pbyPSPacketPool, 0, sizeof(struct vnt_tx_mgmt) + + WLAN_HDR_ADDR2_LEN); + pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyPSPacketPool; + pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket + + sizeof(struct vnt_tx_mgmt)); + + pTxPacket->p80211Header->sA2.wFrameCtl = cpu_to_le16( + ( + WLAN_SET_FC_FTYPE(WLAN_TYPE_CTL) | + WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PSPOLL) | + WLAN_SET_FC_PWRMGT(0) + )); + + pTxPacket->p80211Header->sA2.wDurationID = + pMgmt->wCurrAID | BIT14 | BIT15; + memcpy(pTxPacket->p80211Header->sA2.abyAddr1, pMgmt->abyCurrBSSID, + WLAN_ADDR_LEN); + memcpy(pTxPacket->p80211Header->sA2.abyAddr2, pMgmt->abyMACAddr, + WLAN_ADDR_LEN); + pTxPacket->cbMPDULen = WLAN_HDR_ADDR2_LEN; + pTxPacket->cbPayloadLen = 0; + + /* log failure if sending failed */ + if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) + DBG_PRT(MSG_LEVEL_DEBUG, + KERN_INFO "Send PS-Poll packet failed..\n"); } -/*+ +/* * * Routine Description: * Send NULL packet to AP for notification power state of STA @@ -276,70 +251,58 @@ void PSvSendPSPOLL(void *hDeviceContext) * Return Value: * None. * --*/ + */ -BOOL PSbSendNullPacket(void *hDeviceContext) +int PSbSendNullPacket(struct vnt_private *pDevice) { - PSDevice pDevice = (PSDevice)hDeviceContext; - PSTxMgmtPacket pTxPacket = NULL; - PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - - - - if (pDevice->bLinkPass == FALSE) { - return FALSE; - } - - if ((pDevice->bEnablePSMode == FALSE) && - (pDevice->fTxDataInSleep == FALSE)){ - return FALSE; - } - - memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_NULLDATA_FR_MAXLEN); - pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool; - pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket)); - - if (pDevice->bEnablePSMode) { - - pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL) | - WLAN_SET_FC_PWRMGT(1) - )); - } - else { - pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL) | - WLAN_SET_FC_PWRMGT(0) - )); - } - - if(pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { - pTxPacket->p80211Header->sA3.wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_TODS(1)); - } - - memcpy(pTxPacket->p80211Header->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - pTxPacket->cbMPDULen = WLAN_HDR_ADDR3_LEN; - pTxPacket->cbPayloadLen = 0; - // send the frame - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send Null Packet failed !\n"); - return FALSE; - } - else { -// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send Null Packet success....\n"); - } - - - return TRUE ; + struct vnt_tx_mgmt *pTxPacket = NULL; + struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; + u16 flags = 0; + + if (pDevice->bLinkPass == false) + return false; + + if (pDevice->bEnablePSMode == false && pDevice->tx_trigger == false) + return false; + + memset(pMgmt->pbyPSPacketPool, 0, sizeof(struct vnt_tx_mgmt) + + WLAN_NULLDATA_FR_MAXLEN); + pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyPSPacketPool; + pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket + + sizeof(struct vnt_tx_mgmt)); + + flags = WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) | + WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL); + + if (pDevice->bEnablePSMode) + flags |= WLAN_SET_FC_PWRMGT(1); + else + flags |= WLAN_SET_FC_PWRMGT(0); + + pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16(flags); + + if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) + pTxPacket->p80211Header->sA3.wFrameCtl |= + cpu_to_le16((u16)WLAN_SET_FC_TODS(1)); + + memcpy(pTxPacket->p80211Header->sA3.abyAddr1, pMgmt->abyCurrBSSID, + WLAN_ADDR_LEN); + memcpy(pTxPacket->p80211Header->sA3.abyAddr2, pMgmt->abyMACAddr, + WLAN_ADDR_LEN); + memcpy(pTxPacket->p80211Header->sA3.abyAddr3, pMgmt->abyCurrBSSID, + WLAN_BSSID_LEN); + pTxPacket->cbMPDULen = WLAN_HDR_ADDR3_LEN; + pTxPacket->cbPayloadLen = 0; + /* log error if sending failed */ + if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { + DBG_PRT(MSG_LEVEL_DEBUG, + KERN_INFO "Send Null Packet failed !\n"); + return false; + } + return true; } -/*+ +/* * * Routine Description: * Check if Next TBTT must wake up @@ -347,36 +310,29 @@ BOOL PSbSendNullPacket(void *hDeviceContext) * Return Value: * None. * --*/ + */ -BOOL PSbIsNextTBTTWakeUp(void *hDeviceContext) +int PSbIsNextTBTTWakeUp(struct vnt_private *pDevice) { - - PSDevice pDevice = (PSDevice)hDeviceContext; - PSMgmtObject pMgmt = &(pDevice->sMgmtObj); - BOOL bWakeUp = FALSE; - - if (pMgmt->wListenInterval >= 2) { - if (pMgmt->wCountToWakeUp == 0) { - pMgmt->wCountToWakeUp = pMgmt->wListenInterval; - } - - pMgmt->wCountToWakeUp --; - - if (pMgmt->wCountToWakeUp == 1) { - - // Turn on wake up to listen next beacon - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - pDevice->bPSRxBeacon = FALSE; - bWakeUp = TRUE; - - } else if ( !pDevice->bPSRxBeacon ) { - //Listen until RxBeacon - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - } - - } - - return bWakeUp; + struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; + int bWakeUp = false; + + if (pMgmt->wListenInterval >= 2) { + if (pMgmt->wCountToWakeUp == 0) + pMgmt->wCountToWakeUp = pMgmt->wListenInterval; + + pMgmt->wCountToWakeUp--; + + if (pMgmt->wCountToWakeUp == 1) { + /* Turn on wake up to listen next beacon */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); + pDevice->bPSRxBeacon = false; + bWakeUp = true; + } else if (!pDevice->bPSRxBeacon) { + /* Listen until RxBeacon */ + MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); + } + } + return bWakeUp; } |
