diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2011-08-08 11:28:24 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2011-08-08 11:28:24 +0000 |
commit | 983bbbfb916b1e9f8e68bf83a658108e0a0d3816 (patch) | |
tree | 015bbb9f0828ea5c24d474ef56b0694df3b07823 | |
parent | 41845878f3a0f4eba90cb7fbcd0e15b7d767b956 (diff) |
b43: fix reloading config settings after channel changes or hostapd restart (#8033)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@27930 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | package/mac80211/patches/860-b43_restart_config.patch | 101 |
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 000000000..75d735063 --- /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, |