From 8b2632035c6414b8c6fd880315c314d7f25c94cc Mon Sep 17 00:00:00 2001 From: nbd Date: Mon, 8 Aug 2011 11:30:51 +0000 Subject: [PATCH] b43: fix reloading config settings after channel changes or hostapd restart (#8033), backport of r27930 git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@27931 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches/860-b43_restart_config.patch | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 package/mac80211/patches/860-b43_restart_config.patch 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..60ec8b6fb --- /dev/null +++ b/package/mac80211/patches/860-b43_restart_config.patch @@ -0,0 +1,94 @@ +--- a/drivers/net/wireless/b43/main.c ++++ b/drivers/net/wireless/b43/main.c +@@ -325,6 +325,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) + { +@@ -3602,14 +3606,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)) +@@ -3670,6 +3684,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; + } + +@@ -3758,7 +3775,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) +@@ -4566,6 +4584,12 @@ static int b43_op_start(struct ieee80211 + out_mutex_unlock: + mutex_unlock(&wl->mutex); + ++ if (err == 0) ++ b43_op_bss_info_changed(hw, vif, &vif->bss_conf, ~0); ++ ++ /* reload configuration */ ++ b43_op_config(hw, ~0); ++ + return err; + } + +@@ -4722,10 +4746,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, -- 2.35.1