Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
0004  * All rights reserved.
0005  *
0006  * Purpose: Handles 802.11 power management  functions
0007  *
0008  * Author: Lyndon Chen
0009  *
0010  * Date: July 17, 2002
0011  *
0012  * Functions:
0013  *      PSvEnablePowerSaving - Enable Power Saving Mode
0014  *      PSvDiasblePowerSaving - Disable Power Saving Mode
0015  *      PSbConsiderPowerDown - Decide if we can Power Down
0016  *      PSvSendPSPOLL - Send PS-POLL packet
0017  *      PSbSendNullPacket - Send Null packet
0018  *      PSbIsNextTBTTWakeUp - Decide if we need to wake up at next Beacon
0019  *
0020  * Revision History:
0021  *
0022  */
0023 
0024 #include "mac.h"
0025 #include "device.h"
0026 #include "power.h"
0027 #include "card.h"
0028 
0029 /*---------------------  Static Definitions -------------------------*/
0030 
0031 /*---------------------  Static Classes  ----------------------------*/
0032 
0033 /*---------------------  Static Functions  --------------------------*/
0034 
0035 /*---------------------  Export Variables  --------------------------*/
0036 
0037 /*---------------------  Export Functions  --------------------------*/
0038 
0039 /*
0040  *
0041  * Routine Description:
0042  * Enable hw power saving functions
0043  *
0044  * Return Value:
0045  *    None.
0046  *
0047  */
0048 
0049 void PSvEnablePowerSaving(struct vnt_private *priv,
0050               unsigned short wListenInterval)
0051 {
0052     u16 wAID = priv->current_aid | BIT(14) | BIT(15);
0053 
0054     /* set period of power up before TBTT */
0055     iowrite16(C_PWBT, priv->port_offset + MAC_REG_PWBT);
0056     if (priv->op_mode != NL80211_IFTYPE_ADHOC) {
0057         /* set AID */
0058         iowrite16(wAID, priv->port_offset + MAC_REG_AIDATIM);
0059     }
0060 
0061     /* Set AutoSleep */
0062     vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
0063 
0064     /* Set HWUTSF */
0065     vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF);
0066 
0067     if (wListenInterval >= 2) {
0068         /* clear always listen beacon */
0069         vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN);
0070         /* first time set listen next beacon */
0071         vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_LNBCN);
0072     } else {
0073         /* always listen beacon */
0074         vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN);
0075     }
0076 
0077     /* enable power saving hw function */
0078     vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_PSEN);
0079     priv->bEnablePSMode = true;
0080 
0081     priv->bPWBitOn = true;
0082     pr_debug("PS:Power Saving Mode Enable...\n");
0083 }
0084 
0085 /*
0086  *
0087  * Routine Description:
0088  * Disable hw power saving functions
0089  *
0090  * Return Value:
0091  *    None.
0092  *
0093  */
0094 
0095 void PSvDisablePowerSaving(struct vnt_private *priv)
0096 {
0097     /* disable power saving hw function */
0098     MACbPSWakeup(priv);
0099 
0100     /* clear AutoSleep */
0101     vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
0102 
0103     /* clear HWUTSF */
0104     vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF);
0105 
0106     /* set always listen beacon */
0107     vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN);
0108 
0109     priv->bEnablePSMode = false;
0110 
0111     priv->bPWBitOn = false;
0112 }
0113 
0114 /*
0115  *
0116  * Routine Description:
0117  * Check if Next TBTT must wake up
0118  *
0119  * Return Value:
0120  *    None.
0121  *
0122  */
0123 
0124 bool PSbIsNextTBTTWakeUp(struct vnt_private *priv)
0125 {
0126     struct ieee80211_hw *hw = priv->hw;
0127     struct ieee80211_conf *conf = &hw->conf;
0128     bool wake_up = false;
0129 
0130     if (conf->listen_interval > 1) {
0131         if (!priv->wake_up_count)
0132             priv->wake_up_count = conf->listen_interval;
0133 
0134         --priv->wake_up_count;
0135 
0136         if (priv->wake_up_count == 1) {
0137             /* Turn on wake up to listen next beacon */
0138             vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_LNBCN);
0139             wake_up = true;
0140         }
0141     }
0142 
0143     return wake_up;
0144 }