From: Felix Fietkau Date: Mon, 8 Aug 2011 11:28:24 +0000 (+0000) Subject: b43: fix reloading config settings after channel changes or hostapd restart (#8033) X-Git-Tag: reboot~16077 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=22e951ae46323dc48abca27e270168ba572b9506;p=openwrt%2Fstaging%2Fxback.git b43: fix reloading config settings after channel changes or hostapd restart (#8033) SVN-Revision: 27930 --- 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,