summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreyk <reyk@openbsd.org>2005-05-21 19:01:41 +0000
committerreyk <reyk@openbsd.org>2005-05-21 19:01:41 +0000
commit73daa58737b8e71429dcf75868aa5974b39428d8 (patch)
treea88cbb9b4be1c523813a0b26c45f59a5aa6699cb
parent- use MIN()/MAX() rather than min()/max(), to avoid possible truncation (diff)
downloadwireguard-openbsd-73daa58737b8e71429dcf75868aa5974b39428d8.tar.xz
wireguard-openbsd-73daa58737b8e71429dcf75868aa5974b39428d8.zip
improve power saving mode
-rw-r--r--sys/dev/ic/ar5212.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/sys/dev/ic/ar5212.c b/sys/dev/ic/ar5212.c
index b2da7f077a0..7e4812e43cd 100644
--- a/sys/dev/ic/ar5212.c
+++ b/sys/dev/ic/ar5212.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ar5212.c,v 1.16 2005/05/08 14:46:50 reyk Exp $ */
+/* $OpenBSD: ar5212.c,v 1.17 2005/05/21 19:01:41 reyk Exp $ */
/*
* Copyright (c) 2004, 2005 Reyk Floeter <reyk@vantronix.net>
@@ -1232,9 +1232,10 @@ ar5k_ar5212_stop_tx_dma(hal, queue)
*/
AR5K_REG_WRITE_Q(AR5K_AR5212_QCU_TXD, queue);
- ret = ar5k_register_timeout(hal,
- AR5K_AR5212_QCU_STS(queue), AR5K_AR5212_QCU_STS_FRMPENDCNT,
- 0, AH_FALSE);
+ if (queue <= HAL_TX_QUEUE_ID_DATA_MAX)
+ ret = ar5k_register_timeout(hal,
+ AR5K_AR5212_QCU_STS(queue), AR5K_AR5212_QCU_STS_FRMPENDCNT,
+ 0, AH_FALSE);
/* Clear register */
AR5K_REG_WRITE(AR5K_AR5212_QCU_TXD, 0);
@@ -2411,14 +2412,18 @@ ar5k_ar5212_set_power(hal, mode, set_chip, sleep_duration)
HAL_BOOL set_chip;
u_int16_t sleep_duration;
{
+ u_int32_t staid;
int i;
+ staid = AR5K_REG_READ(AR5K_AR5212_STA_ID1);
+
switch (mode) {
- case HAL_PM_AUTO:
+ case HAL_PM_NETWORK_SLEEP:
if (set_chip == AH_TRUE) {
AR5K_REG_WRITE(AR5K_AR5212_SCR,
AR5K_AR5212_SCR_SLE | sleep_duration);
}
+ staid |= AR5K_AR5212_STA_ID1_PWR_SV;
break;
case HAL_PM_FULL_SLEEP:
@@ -2426,6 +2431,7 @@ ar5k_ar5212_set_power(hal, mode, set_chip, sleep_duration)
AR5K_REG_WRITE(AR5K_AR5212_SCR,
AR5K_AR5212_SCR_SLE_SLP);
}
+ staid |= AR5K_AR5212_STA_ID1_PWR_SV;
break;
case HAL_PM_AWAKE:
@@ -2449,10 +2455,10 @@ ar5k_ar5212_set_power(hal, mode, set_chip, sleep_duration)
/* Fail if the AR5212 didn't wake up */
if (i <= 0)
return (AH_FALSE);
+
+ staid &= ~AR5K_AR5212_STA_ID1_PWR_SV;
break;
- case HAL_PM_NETWORK_SLEEP:
- case HAL_PM_UNDEFINED:
default:
return (AH_FALSE);
}
@@ -2460,10 +2466,7 @@ ar5k_ar5212_set_power(hal, mode, set_chip, sleep_duration)
commit:
hal->ah_power_mode = mode;
- AR5K_REG_DISABLE_BITS(AR5K_AR5212_STA_ID1,
- AR5K_AR5212_STA_ID1_DEFAULT_ANTENNA);
- AR5K_REG_ENABLE_BITS(AR5K_AR5212_STA_ID1,
- AR5K_AR5212_STA_ID1_PWR_SV);
+ AR5K_REG_WRITE(AR5K_AR5212_STA_ID1, staid);
return (AH_TRUE);
}