diff options
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 8336fee68d3e..df28c5f7c9c0 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -65,7 +65,7 @@ static int ieee80211_open(struct net_device *dev) | |||
65 | struct ieee80211_if_init_conf conf; | 65 | struct ieee80211_if_init_conf conf; |
66 | u32 changed = 0; | 66 | u32 changed = 0; |
67 | int res; | 67 | int res; |
68 | bool need_hw_reconfig = 0; | 68 | u32 hw_reconf_flags = 0; |
69 | u8 null_addr[ETH_ALEN] = {0}; | 69 | u8 null_addr[ETH_ALEN] = {0}; |
70 | 70 | ||
71 | /* fail early if user set an invalid address */ | 71 | /* fail early if user set an invalid address */ |
@@ -152,7 +152,8 @@ static int ieee80211_open(struct net_device *dev) | |||
152 | res = local->ops->start(local_to_hw(local)); | 152 | res = local->ops->start(local_to_hw(local)); |
153 | if (res) | 153 | if (res) |
154 | goto err_del_bss; | 154 | goto err_del_bss; |
155 | need_hw_reconfig = 1; | 155 | /* we're brought up, everything changes */ |
156 | hw_reconf_flags = ~0; | ||
156 | ieee80211_led_radio(local, local->hw.conf.radio_enabled); | 157 | ieee80211_led_radio(local, local->hw.conf.radio_enabled); |
157 | } | 158 | } |
158 | 159 | ||
@@ -198,8 +199,10 @@ static int ieee80211_open(struct net_device *dev) | |||
198 | 199 | ||
199 | /* must be before the call to ieee80211_configure_filter */ | 200 | /* must be before the call to ieee80211_configure_filter */ |
200 | local->monitors++; | 201 | local->monitors++; |
201 | if (local->monitors == 1) | 202 | if (local->monitors == 1) { |
202 | local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; | 203 | local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; |
204 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP; | ||
205 | } | ||
203 | 206 | ||
204 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) | 207 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) |
205 | local->fif_fcsfail++; | 208 | local->fif_fcsfail++; |
@@ -279,8 +282,8 @@ static int ieee80211_open(struct net_device *dev) | |||
279 | atomic_inc(&local->iff_promiscs); | 282 | atomic_inc(&local->iff_promiscs); |
280 | 283 | ||
281 | local->open_count++; | 284 | local->open_count++; |
282 | if (need_hw_reconfig) { | 285 | if (hw_reconf_flags) { |
283 | ieee80211_hw_config(local); | 286 | ieee80211_hw_config(local, hw_reconf_flags); |
284 | /* | 287 | /* |
285 | * set default queue parameters so drivers don't | 288 | * set default queue parameters so drivers don't |
286 | * need to initialise the hardware if the hardware | 289 | * need to initialise the hardware if the hardware |
@@ -322,6 +325,7 @@ static int ieee80211_stop(struct net_device *dev) | |||
322 | struct ieee80211_local *local = sdata->local; | 325 | struct ieee80211_local *local = sdata->local; |
323 | struct ieee80211_if_init_conf conf; | 326 | struct ieee80211_if_init_conf conf; |
324 | struct sta_info *sta; | 327 | struct sta_info *sta; |
328 | u32 hw_reconf_flags = 0; | ||
325 | 329 | ||
326 | /* | 330 | /* |
327 | * Stop TX on this interface first. | 331 | * Stop TX on this interface first. |
@@ -405,8 +409,10 @@ static int ieee80211_stop(struct net_device *dev) | |||
405 | } | 409 | } |
406 | 410 | ||
407 | local->monitors--; | 411 | local->monitors--; |
408 | if (local->monitors == 0) | 412 | if (local->monitors == 0) { |
409 | local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP; | 413 | local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP; |
414 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP; | ||
415 | } | ||
410 | 416 | ||
411 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) | 417 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) |
412 | local->fif_fcsfail--; | 418 | local->fif_fcsfail--; |
@@ -504,8 +510,15 @@ static int ieee80211_stop(struct net_device *dev) | |||
504 | 510 | ||
505 | tasklet_disable(&local->tx_pending_tasklet); | 511 | tasklet_disable(&local->tx_pending_tasklet); |
506 | tasklet_disable(&local->tasklet); | 512 | tasklet_disable(&local->tasklet); |
513 | |||
514 | /* no reconfiguring after stop! */ | ||
515 | hw_reconf_flags = 0; | ||
507 | } | 516 | } |
508 | 517 | ||
518 | /* do after stop to avoid reconfiguring when we stop anyway */ | ||
519 | if (hw_reconf_flags) | ||
520 | ieee80211_hw_config(local, hw_reconf_flags); | ||
521 | |||
509 | return 0; | 522 | return 0; |
510 | } | 523 | } |
511 | 524 | ||