aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/vt6656/power.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/vt6656/power.c')
-rw-r--r--drivers/staging/vt6656/power.c462
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;
}