diff options
author | Ivo van Doorn <ivdoorn@gmail.com> | 2008-12-20 04:52:42 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-29 15:58:34 -0500 |
commit | 7d7f19ccb777946df0a8fb7c83189ba2ae08b02e (patch) | |
tree | 38fcea85510a4945283cf23bc029261b3941fc74 /drivers/net/wireless/rt2x00/rt61pci.c | |
parent | 3ebbbb56a162b8f9b9a77bc7810b9d4e0868e039 (diff) |
rt2x00: Implement Powersaving
Listen to IEEE80211_CONF_PS to determine if the device
should drop into powersaving mode. This feature depends
on the dynamic power save functionality in mac80211.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt61pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 987e89009f74..c7ab744f0052 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -146,12 +146,6 @@ static void rt61pci_rf_write(struct rt2x00_dev *rt2x00dev, | |||
146 | mutex_unlock(&rt2x00dev->csr_mutex); | 146 | mutex_unlock(&rt2x00dev->csr_mutex); |
147 | } | 147 | } |
148 | 148 | ||
149 | #ifdef CONFIG_RT2X00_LIB_LEDS | ||
150 | /* | ||
151 | * This function is only called from rt61pci_led_brightness() | ||
152 | * make gcc happy by placing this function inside the | ||
153 | * same ifdef statement as the caller. | ||
154 | */ | ||
155 | static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev, | 149 | static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev, |
156 | const u8 command, const u8 token, | 150 | const u8 command, const u8 token, |
157 | const u8 arg0, const u8 arg1) | 151 | const u8 arg0, const u8 arg1) |
@@ -180,7 +174,6 @@ static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev, | |||
180 | mutex_unlock(&rt2x00dev->csr_mutex); | 174 | mutex_unlock(&rt2x00dev->csr_mutex); |
181 | 175 | ||
182 | } | 176 | } |
183 | #endif /* CONFIG_RT2X00_LIB_LEDS */ | ||
184 | 177 | ||
185 | static void rt61pci_eepromregister_read(struct eeprom_93cx6 *eeprom) | 178 | static void rt61pci_eepromregister_read(struct eeprom_93cx6 *eeprom) |
186 | { | 179 | { |
@@ -967,6 +960,50 @@ static void rt61pci_config_duration(struct rt2x00_dev *rt2x00dev, | |||
967 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg); | 960 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg); |
968 | } | 961 | } |
969 | 962 | ||
963 | static void rt61pci_config_ps(struct rt2x00_dev *rt2x00dev, | ||
964 | struct rt2x00lib_conf *libconf) | ||
965 | { | ||
966 | enum dev_state state = | ||
967 | (libconf->conf->flags & IEEE80211_CONF_PS) ? | ||
968 | STATE_SLEEP : STATE_AWAKE; | ||
969 | u32 reg; | ||
970 | |||
971 | if (state == STATE_SLEEP) { | ||
972 | rt2x00pci_register_read(rt2x00dev, MAC_CSR11, ®); | ||
973 | rt2x00_set_field32(®, MAC_CSR11_DELAY_AFTER_TBCN, | ||
974 | libconf->conf->beacon_int - 10); | ||
975 | rt2x00_set_field32(®, MAC_CSR11_TBCN_BEFORE_WAKEUP, | ||
976 | libconf->conf->listen_interval - 1); | ||
977 | rt2x00_set_field32(®, MAC_CSR11_WAKEUP_LATENCY, 5); | ||
978 | |||
979 | /* We must first disable autowake before it can be enabled */ | ||
980 | rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 0); | ||
981 | rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg); | ||
982 | |||
983 | rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 1); | ||
984 | rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg); | ||
985 | |||
986 | rt2x00pci_register_write(rt2x00dev, SOFT_RESET_CSR, 0x00000005); | ||
987 | rt2x00pci_register_write(rt2x00dev, IO_CNTL_CSR, 0x0000001c); | ||
988 | rt2x00pci_register_write(rt2x00dev, PCI_USEC_CSR, 0x00000060); | ||
989 | |||
990 | rt61pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 0); | ||
991 | } else { | ||
992 | rt2x00pci_register_read(rt2x00dev, MAC_CSR11, ®); | ||
993 | rt2x00_set_field32(®, MAC_CSR11_DELAY_AFTER_TBCN, 0); | ||
994 | rt2x00_set_field32(®, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0); | ||
995 | rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 0); | ||
996 | rt2x00_set_field32(®, MAC_CSR11_WAKEUP_LATENCY, 0); | ||
997 | rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg); | ||
998 | |||
999 | rt2x00pci_register_write(rt2x00dev, SOFT_RESET_CSR, 0x00000007); | ||
1000 | rt2x00pci_register_write(rt2x00dev, IO_CNTL_CSR, 0x00000018); | ||
1001 | rt2x00pci_register_write(rt2x00dev, PCI_USEC_CSR, 0x00000020); | ||
1002 | |||
1003 | rt61pci_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 0); | ||
1004 | } | ||
1005 | } | ||
1006 | |||
970 | static void rt61pci_config(struct rt2x00_dev *rt2x00dev, | 1007 | static void rt61pci_config(struct rt2x00_dev *rt2x00dev, |
971 | struct rt2x00lib_conf *libconf, | 1008 | struct rt2x00lib_conf *libconf, |
972 | const unsigned int flags) | 1009 | const unsigned int flags) |
@@ -984,6 +1021,8 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev, | |||
984 | rt61pci_config_retry_limit(rt2x00dev, libconf); | 1021 | rt61pci_config_retry_limit(rt2x00dev, libconf); |
985 | if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL) | 1022 | if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL) |
986 | rt61pci_config_duration(rt2x00dev, libconf); | 1023 | rt61pci_config_duration(rt2x00dev, libconf); |
1024 | if (flags & IEEE80211_CONF_CHANGE_PS) | ||
1025 | rt61pci_config_ps(rt2x00dev, libconf); | ||
987 | } | 1026 | } |
988 | 1027 | ||
989 | /* | 1028 | /* |