aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-08-08 11:28:24 +0000
committerFelix Fietkau <nbd@openwrt.org>2011-08-08 11:28:24 +0000
commit22e951ae46323dc48abca27e270168ba572b9506 (patch)
treee2f9e0b8d9a1ae98b57bfbdac3a230efb444c84f
parent7ef004a144bc85f98e8664a0d6e09a030311e654 (diff)
downloadupstream-22e951ae46323dc48abca27e270168ba572b9506.tar.gz
upstream-22e951ae46323dc48abca27e270168ba572b9506.tar.bz2
upstream-22e951ae46323dc48abca27e270168ba572b9506.zip
b43: fix reloading config settings after channel changes or hostapd restart (#8033)
SVN-Revision: 27930
-rw-r--r--package/mac80211/patches/860-b43_restart_config.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/package/mac80211/patches/860-b43_restart_config.patch b/package/mac80211/patches/860-b43_restart_config.patch
new file mode 100644
index 0000000000..75d735063a
--- /dev/null
+++ b/package/mac80211/patches/860-b43_restart_config.patch
@@ -0,0 +1,101 @@
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -326,6 +326,10 @@ static void b43_wireless_core_exit(struc
+ static int b43_wireless_core_init(struct b43_wldev *dev);
+ static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
+ static int b43_wireless_core_start(struct b43_wldev *dev);
++static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
++ struct ieee80211_vif *vif,
++ struct ieee80211_bss_conf *conf,
++ u32 changed);
+
+ static int b43_ratelimit(struct b43_wl *wl)
+ {
+@@ -3762,14 +3766,24 @@ static int b43_op_config(struct ieee8021
+ struct ieee80211_conf *conf = &hw->conf;
+ int antenna;
+ int err = 0;
++ bool reload_bss = false;
+
+ mutex_lock(&wl->mutex);
+
++ dev = wl->current_dev;
++
+ /* Switch the band (if necessary). This might change the active core. */
+ err = b43_switch_band(wl, conf->channel);
+ if (err)
+ goto out_unlock_mutex;
+- dev = wl->current_dev;
++
++ /* Need to reload all settings if the core changed */
++ if (dev != wl->current_dev) {
++ dev = wl->current_dev;
++ changed = ~0;
++ reload_bss = true;
++ }
++
+ phy = &dev->phy;
+
+ if (conf_is_ht(conf))
+@@ -3830,6 +3844,9 @@ out_mac_enable:
+ out_unlock_mutex:
+ mutex_unlock(&wl->mutex);
+
++ if (wl->vif && reload_bss)
++ b43_op_bss_info_changed(hw, wl->vif, &wl->vif->bss_conf, ~0);
++
+ return err;
+ }
+
+@@ -3918,7 +3935,8 @@ static void b43_op_bss_info_changed(stru
+ if (changed & BSS_CHANGED_BEACON_INT &&
+ (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
+ b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
+- b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
++ b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) &&
++ conf->beacon_int)
+ b43_set_beacon_int(dev, conf->beacon_int);
+
+ if (changed & BSS_CHANGED_BASIC_RATES)
+@@ -4699,6 +4717,9 @@ static int b43_op_add_interface(struct i
+ out_mutex_unlock:
+ mutex_unlock(&wl->mutex);
+
++ if (err == 0)
++ b43_op_bss_info_changed(hw, vif, &vif->bss_conf, ~0);
++
+ return err;
+ }
+
+@@ -4769,6 +4790,9 @@ static int b43_op_start(struct ieee80211
+ out_mutex_unlock:
+ mutex_unlock(&wl->mutex);
+
++ /* reload configuration */
++ b43_op_config(hw, ~0);
++
+ return err;
+ }
+
+@@ -4925,10 +4949,18 @@ out:
+ if (err)
+ wl->current_dev = NULL; /* Failed to init the dev. */
+ mutex_unlock(&wl->mutex);
+- if (err)
++
++ if (err) {
+ b43err(wl, "Controller restart FAILED\n");
+- else
+- b43info(wl, "Controller restarted\n");
++ return;
++ }
++
++ /* reload configuration */
++ b43_op_config(wl->hw, ~0);
++ if (wl->vif)
++ b43_op_bss_info_changed(wl->hw, wl->vif, &wl->vif->bss_conf, ~0);
++
++ b43info(wl, "Controller restarted\n");
+ }
+
+ static int b43_setup_bands(struct b43_wldev *dev,