diff options
Diffstat (limited to 'package/mac80211/patches')
| -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, | 
