Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[cascardo/linux.git] / drivers / staging / vt6655 / power.c
index 08241b9..e826f07 100644 (file)
  *
  */
 
-#include "ttype.h"
 #include "mac.h"
 #include "device.h"
-#include "wmgr.h"
 #include "power.h"
-#include "wcmd.h"
-#include "rxtx.h"
 #include "card.h"
 
 /*---------------------  Static Definitions -------------------------*/
@@ -73,8 +69,7 @@ PSvEnablePowerSaving(
 )
 {
        struct vnt_private *pDevice = hDeviceContext;
-       PSMgmtObject    pMgmt = pDevice->pMgmt;
-       unsigned short wAID = pMgmt->wCurrAID | BIT14 | BIT15;
+       u16 wAID = pDevice->current_aid | BIT(14) | BIT(15);
 
        // set period of power up before TBTT
        VNSvOutPortW(pDevice->PortOffset + MAC_REG_PWBT, C_PWBT);
@@ -83,7 +78,9 @@ PSvEnablePowerSaving(
                VNSvOutPortW(pDevice->PortOffset + MAC_REG_AIDATIM, wAID);
        } else {
                // set ATIM Window
+#if 0 /* TODO atim window */
                MACvWriteATIMW(pDevice->PortOffset, pMgmt->wCurrATIMWindow);
+#endif
        }
        // Set AutoSleep
        MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
@@ -95,22 +92,15 @@ PSvEnablePowerSaving(
                MACvRegBitsOff(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_ALBCN);
                // first time set listen next beacon
                MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_LNBCN);
-               pMgmt->wCountToWakeUp = wListenInterval;
        } else {
                // always listen beacon
                MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_ALBCN);
-               pMgmt->wCountToWakeUp = 0;
        }
 
        // enable power saving hw function
        MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN);
        pDevice->bEnablePSMode = true;
 
-       /* We don't send null pkt in ad hoc mode since beacon will handle this. */
-       if (pDevice->op_mode != NL80211_IFTYPE_ADHOC &&
-           pDevice->op_mode == NL80211_IFTYPE_STATION)
-               PSbSendNullPacket(pDevice);
-
        pDevice->bPWBitOn = true;
        pr_debug("PS:Power Saving Mode Enable...\n");
 }
@@ -143,182 +133,9 @@ PSvDisablePowerSaving(
 
        pDevice->bEnablePSMode = false;
 
-       if (pDevice->op_mode == NL80211_IFTYPE_STATION)
-               PSbSendNullPacket(pDevice);
-
        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
- -*/
-
-bool
-PSbConsiderPowerDown(
-       void *hDeviceContext,
-       bool bCheckRxDMA,
-       bool bCheckCountToWakeUp
-)
-{
-       struct vnt_private *pDevice = hDeviceContext;
-       PSMgmtObject    pMgmt = pDevice->pMgmt;
-       unsigned int uIdx;
-
-       // check if already in Doze mode
-       if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS))
-               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;
-
-       // Force PSEN on
-       MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN);
-
-       // check if all TD are empty,
-       for (uIdx = 0; uIdx < TYPE_MAXTD; uIdx++) {
-               if (pDevice->iTDUsed[uIdx] != 0)
-                       return false;
-       }
-
-       // check if rx isr is clear
-       if (bCheckRxDMA &&
-           ((pDevice->dwIsr & ISR_RXDMA0) != 0) &&
-           ((pDevice->dwIsr & ISR_RXDMA1) != 0)) {
-               return false;
-       }
-
-       if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) {
-               if (bCheckCountToWakeUp &&
-                   (pMgmt->wCountToWakeUp == 0 || pMgmt->wCountToWakeUp == 1)) {
-                       return false;
-               }
-       }
-
-       // no Tx, no Rx isr, now go to Doze
-       MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_GO2DOZE);
-       pr_debug("Go to Doze ZZZZZZZZZZZZZZZ\n");
-       return true;
-}
-
-/*+
- *
- * Routine Description:
- * Send PS-POLL packet
- *
- * Return Value:
- *    None.
- *
- -*/
-
-void
-PSvSendPSPOLL(
-       void *hDeviceContext
-)
-{
-       struct vnt_private *pDevice = hDeviceContext;
-       PSMgmtObject        pMgmt = pDevice->pMgmt;
-       PSTxMgmtPacket      pTxPacket = NULL;
-
-       memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_HDR_ADDR2_LEN);
-       pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool;
-       pTxPacket->p80211Header = (PUWLAN_80211HDR)((unsigned char *)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)
-               pr_debug("Send PS-Poll packet failed..\n");
-}
-
-/*+
- *
- * Routine Description:
- * Send NULL packet to AP for notification power state of STA
- *
- * Return Value:
- *    None.
- *
- -*/
-bool
-PSbSendNullPacket(
-       void *hDeviceContext
-)
-{
-       struct vnt_private *pDevice = hDeviceContext;
-       PSTxMgmtPacket      pTxPacket = NULL;
-       PSMgmtObject        pMgmt = pDevice->pMgmt;
-       unsigned int uIdx;
-
-       if (!pDevice->bLinkPass)
-               return false;
-
-       if (!pDevice->bEnablePSMode && !pDevice->fTxDataInSleep)
-               return false;
-
-       if (pDevice->bEnablePSMode) {
-               for (uIdx = 0; uIdx < TYPE_MAXTD; uIdx++) {
-                       if (pDevice->iTDUsed[uIdx] != 0)
-                               return false;
-               }
-       }
-
-       memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_NULLDATA_FR_MAXLEN);
-       pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool;
-       pTxPacket->p80211Header = (PUWLAN_80211HDR)((unsigned char *)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((unsigned short)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) {
-               pr_debug("Send Null Packet failed !\n");
-               return false;
-       }
-
-       return true;
-}
 
 /*+
  *
@@ -336,21 +153,14 @@ PSbIsNextTBTTWakeUp(
 )
 {
        struct vnt_private *pDevice = hDeviceContext;
-       PSMgmtObject        pMgmt = pDevice->pMgmt;
+       struct ieee80211_hw *hw = pDevice->hw;
+       struct ieee80211_conf *conf = &hw->conf;
        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->PortOffset, MAC_REG_PSCTL, PSCTL_LNBCN);
-                       bWakeUp = true;
-               }
-
+       if (conf->listen_interval == 1) {
+               /* Turn on wake up to listen next beacon */
+               MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_LNBCN);
+               bWakeUp = true;
        }
 
        return bWakeUp;