linux/drivers/staging/vt6656/power.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   3 * All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation; either version 2 of the License, or
   8 * (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 *
  16 * File: power.c
  17 *
  18 * Purpose: Handles 802.11 power management functions
  19 *
  20 * Author: Lyndon Chen
  21 *
  22 * Date: July 17, 2002
  23 *
  24 * Functions:
  25 *      vnt_enable_power_saving - Enable Power Saving Mode
  26 *      PSvDiasblePowerSaving - Disable Power Saving Mode
  27 *      vnt_next_tbtt_wakeup - Decide if we need to wake up at next Beacon
  28 *
  29 * Revision History:
  30 *
  31 */
  32
  33#include "mac.h"
  34#include "device.h"
  35#include "power.h"
  36#include "wcmd.h"
  37#include "rxtx.h"
  38#include "card.h"
  39#include "usbpipe.h"
  40
  41/*
  42 *
  43 * Routine Description:
  44 * Enable hw power saving functions
  45 *
  46 * Return Value:
  47 *    None.
  48 *
  49 */
  50
  51void vnt_enable_power_saving(struct vnt_private *priv, u16 listen_interval)
  52{
  53        u16 aid = priv->current_aid | BIT(14) | BIT(15);
  54
  55        /* set period of power up before TBTT */
  56        vnt_mac_write_word(priv, MAC_REG_PWBT, C_PWBT);
  57
  58        if (priv->op_mode != NL80211_IFTYPE_ADHOC)
  59                /* set AID */
  60                vnt_mac_write_word(priv, MAC_REG_AIDATIM, aid);
  61
  62        /* Warren:06-18-2004,the sequence must follow
  63         * PSEN->AUTOSLEEP->GO2DOZE
  64         */
  65        /* enable power saving hw function */
  66        vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_PSEN);
  67
  68        /* Set AutoSleep */
  69        vnt_mac_reg_bits_on(priv, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
  70
  71        /* Warren:MUST turn on this once before turn on AUTOSLEEP ,or the
  72         * AUTOSLEEP doesn't work
  73         */
  74        vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_GO2DOZE);
  75
  76        if (listen_interval >= 2) {
  77
  78                /* clear always listen beacon */
  79                vnt_mac_reg_bits_off(priv, MAC_REG_PSCTL, PSCTL_ALBCN);
  80
  81                /* first time set listen next beacon */
  82                vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_LNBCN);
  83        } else
  84
  85                /* always listen beacon */
  86                vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_ALBCN);
  87
  88        dev_dbg(&priv->usb->dev,  "PS:Power Saving Mode Enable...\n");
  89}
  90
  91/*
  92 *
  93 * Routine Description:
  94 * Disable hw power saving functions
  95 *
  96 * Return Value:
  97 *    None.
  98 *
  99 */
 100
 101void vnt_disable_power_saving(struct vnt_private *priv)
 102{
 103
 104        /* disable power saving hw function */
 105        vnt_control_out(priv, MESSAGE_TYPE_DISABLE_PS, 0,
 106                        0, 0, NULL);
 107
 108        /* clear AutoSleep */
 109        vnt_mac_reg_bits_off(priv, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
 110
 111        /* set always listen beacon */
 112        vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_ALBCN);
 113}
 114
 115/*
 116 *
 117 * Routine Description:
 118 * Check if Next TBTT must wake up
 119 *
 120 * Return Value:
 121 *    None.
 122 *
 123 */
 124
 125int vnt_next_tbtt_wakeup(struct vnt_private *priv)
 126{
 127        struct ieee80211_hw *hw = priv->hw;
 128        struct ieee80211_conf *conf = &hw->conf;
 129        int wake_up = false;
 130
 131        if (conf->listen_interval > 1) {
 132                /* Turn on wake up to listen next beacon */
 133                vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_LNBCN);
 134                wake_up = true;
 135        }
 136
 137        return wake_up;
 138}
 139