aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-04-29 06:26:17 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-05-06 15:14:51 -0400
commit5cff20e6c5a6591a79d3b027af222870f52bb550 (patch)
tree81b6ebb75c1dc87b65258e71526c1581d168156c /net/mac80211/mlme.c
parent9955151df7c6452cae2ed9649f53d265c91cf155 (diff)
mac80211: tell driver when idle
When we aren't doing anything in mac80211, we can turn off much of the hardware, depending on the driver/hw. Not doing anything, aka being idle, means: * no monitor interfaces * no AP/mesh/wds interfaces * any station interfaces are in DISABLED state * any IBSS interfaces aren't trying to be in a network * we aren't trying to scan By creating a new function that verifies these conditions and calling it at strategic points where the states of those conditions change, we can easily make mac80211 tell the driver when we are idle to save power. Additionally, this fixes a small quirk where a recalculated powersave state is passed to the driver even if the hardware is about to stopped completely. This patch intentionally doesn't touch radio_enabled because that is currently implemented to be a soft rfkill which is inappropriate here when we need to be able to wake up with low latency. One thing I'm not entirely sure about is this: phy0: device no longer idle - in use wlan0: direct probe to AP 00:11:24:91:07:4d try 1 wlan0 direct probe responded wlan0: authenticate with AP 00:11:24:91:07:4d wlan0: authenticated > phy0: device now idle > phy0: device no longer idle - in use wlan0: associate with AP 00:11:24:91:07:4d wlan0: RX AssocResp from 00:11:24:91:07:4d (capab=0x401 status=0 aid=1) wlan0: associated Is it appropriate to go into idle state for a short time when we have just authenticated, but not associated yet? This happens only with the userspace SME, because we cannot really know how long it will wait before asking us to associate. Would going idle after a short timeout be more appropriate? We may need to revisit this, depending on what happens. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 2ded4766d014..5509c5aa6beb 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -890,6 +890,7 @@ static void ieee80211_direct_probe(struct ieee80211_sub_if_data *sdata)
890 printk(KERN_DEBUG "%s: direct probe to AP %pM timed out\n", 890 printk(KERN_DEBUG "%s: direct probe to AP %pM timed out\n",
891 sdata->dev->name, ifmgd->bssid); 891 sdata->dev->name, ifmgd->bssid);
892 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 892 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
893 ieee80211_recalc_idle(local);
893 cfg80211_send_auth_timeout(sdata->dev, ifmgd->bssid); 894 cfg80211_send_auth_timeout(sdata->dev, ifmgd->bssid);
894 895
895 /* 896 /*
@@ -938,6 +939,7 @@ static void ieee80211_authenticate(struct ieee80211_sub_if_data *sdata)
938 " timed out\n", 939 " timed out\n",
939 sdata->dev->name, ifmgd->bssid); 940 sdata->dev->name, ifmgd->bssid);
940 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 941 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
942 ieee80211_recalc_idle(local);
941 cfg80211_send_auth_timeout(sdata->dev, ifmgd->bssid); 943 cfg80211_send_auth_timeout(sdata->dev, ifmgd->bssid);
942 ieee80211_rx_bss_remove(sdata, ifmgd->bssid, 944 ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
943 sdata->local->hw.conf.channel->center_freq, 945 sdata->local->hw.conf.channel->center_freq,
@@ -1041,6 +1043,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
1041 1043
1042 rcu_read_unlock(); 1044 rcu_read_unlock();
1043 1045
1046 ieee80211_recalc_idle(local);
1047
1044 /* channel(_type) changes are handled by ieee80211_hw_config */ 1048 /* channel(_type) changes are handled by ieee80211_hw_config */
1045 local->oper_channel_type = NL80211_CHAN_NO_HT; 1049 local->oper_channel_type = NL80211_CHAN_NO_HT;
1046 1050
@@ -1121,6 +1125,7 @@ static void ieee80211_associate(struct ieee80211_sub_if_data *sdata)
1121 " timed out\n", 1125 " timed out\n",
1122 sdata->dev->name, ifmgd->bssid); 1126 sdata->dev->name, ifmgd->bssid);
1123 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 1127 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1128 ieee80211_recalc_idle(local);
1124 cfg80211_send_assoc_timeout(sdata->dev, ifmgd->bssid); 1129 cfg80211_send_assoc_timeout(sdata->dev, ifmgd->bssid);
1125 ieee80211_rx_bss_remove(sdata, ifmgd->bssid, 1130 ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
1126 sdata->local->hw.conf.channel->center_freq, 1131 sdata->local->hw.conf.channel->center_freq,
@@ -1141,6 +1146,7 @@ static void ieee80211_associate(struct ieee80211_sub_if_data *sdata)
1141 printk(KERN_DEBUG "%s: mismatch in privacy configuration and " 1146 printk(KERN_DEBUG "%s: mismatch in privacy configuration and "
1142 "mixed-cell disabled - abort association\n", sdata->dev->name); 1147 "mixed-cell disabled - abort association\n", sdata->dev->name);
1143 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 1148 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1149 ieee80211_recalc_idle(local);
1144 return; 1150 return;
1145 } 1151 }
1146 1152
@@ -1279,6 +1285,7 @@ static void ieee80211_auth_completed(struct ieee80211_sub_if_data *sdata)
1279 if (ifmgd->flags & IEEE80211_STA_EXT_SME) { 1285 if (ifmgd->flags & IEEE80211_STA_EXT_SME) {
1280 /* Wait for SME to request association */ 1286 /* Wait for SME to request association */
1281 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 1287 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1288 ieee80211_recalc_idle(sdata->local);
1282 } else 1289 } else
1283 ieee80211_associate(sdata); 1290 ieee80211_associate(sdata);
1284} 1291}
@@ -1515,6 +1522,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1515 if (ifmgd->flags & IEEE80211_STA_EXT_SME) { 1522 if (ifmgd->flags & IEEE80211_STA_EXT_SME) {
1516 /* Wait for SME to decide what to do next */ 1523 /* Wait for SME to decide what to do next */
1517 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 1524 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1525 ieee80211_recalc_idle(local);
1518 } 1526 }
1519 return; 1527 return;
1520 } 1528 }
@@ -2083,6 +2091,7 @@ static int ieee80211_sta_config_auth(struct ieee80211_sub_if_data *sdata)
2083 } else { 2091 } else {
2084 ifmgd->assoc_scan_tries = 0; 2092 ifmgd->assoc_scan_tries = 0;
2085 ifmgd->state = IEEE80211_STA_MLME_DISABLED; 2093 ifmgd->state = IEEE80211_STA_MLME_DISABLED;
2094 ieee80211_recalc_idle(local);
2086 } 2095 }
2087 } 2096 }
2088 return -1; 2097 return -1;
@@ -2126,6 +2135,8 @@ static void ieee80211_sta_work(struct work_struct *work)
2126 } else if (!test_and_clear_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request)) 2135 } else if (!test_and_clear_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request))
2127 return; 2136 return;
2128 2137
2138 ieee80211_recalc_idle(local);
2139
2129 switch (ifmgd->state) { 2140 switch (ifmgd->state) {
2130 case IEEE80211_STA_MLME_DISABLED: 2141 case IEEE80211_STA_MLME_DISABLED:
2131 break; 2142 break;