summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-09-15 13:13:13 (GMT)
committerJohn W. Linville <linville@tuxdriver.com>2010-09-16 19:46:01 (GMT)
commit2d2080c3c1d52e186166afc3efe5067291e618bf (patch)
treee90c4bcb6320e68cceb6a1695895cceae2e14cb3
parent46a5ebaf02d69e26ee0f47a0b8d2d9bc619240d4 (diff)
downloadlinux-2d2080c3c1d52e186166afc3efe5067291e618bf.tar.xz
mac80211: set running state earlier
When an interface is brought up, the recent changes to allow changing type-while-up only set the running bit after everything was done. This broke a number of things, including idle calculation for monitor interfaces, and it also broke WDS station insertion (although nobody noticed yet). Thus, change the code to set the running bit earlier, but keep it after the driver's add_interface was called because otherwise drivers may iterate over interfaces they haven't fully set up yet. Reported-by: Rajkumar Manoharan <rmanoharan@atheros.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/iface.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index c1cc200..95908aa 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -280,6 +280,8 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
netif_carrier_on(dev);
}
+ set_bit(SDATA_STATE_RUNNING, &sdata->state);
+
if (sdata->vif.type == NL80211_IFTYPE_WDS) {
/* Create STA entry for the WDS peer */
sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
@@ -331,8 +333,6 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
netif_tx_start_all_queues(dev);
- set_bit(SDATA_STATE_RUNNING, &sdata->state);
-
return 0;
err_del_interface:
drv_remove_interface(local, &sdata->vif);
@@ -343,6 +343,7 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
sdata->bss = NULL;
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
list_del(&sdata->u.vlan.list);
+ clear_bit(SDATA_STATE_RUNNING, &sdata->state);
return res;
}