diff options
Diffstat (limited to 'package/mac80211/patches/420-mac80211-hw-conf-change-flags.patch')
-rw-r--r-- | package/mac80211/patches/420-mac80211-hw-conf-change-flags.patch | 616 |
1 files changed, 616 insertions, 0 deletions
diff --git a/package/mac80211/patches/420-mac80211-hw-conf-change-flags.patch b/package/mac80211/patches/420-mac80211-hw-conf-change-flags.patch new file mode 100644 index 0000000000..4bae8cbb59 --- /dev/null +++ b/package/mac80211/patches/420-mac80211-hw-conf-change-flags.patch @@ -0,0 +1,616 @@ +Subject: mac80211: introduce hw config change flags + +This makes mac80211 notify the driver which configuration +actually changed, e.g. channel etc. + +No driver changes, this is just plumbing, driver authors are +expected to act on this if they want to. + +Also remove the HW CONFIG debug printk, it's incorrect, often +we configure something else. + +Signed-off-by: Johannes Berg <johannes@sipsolutions.net> +--- + drivers/net/wireless/adm8211.c | 3 +- + drivers/net/wireless/at76_usb.c | 3 +- + drivers/net/wireless/ath5k/base.c | 7 ++---- + drivers/net/wireless/ath9k/main.c | 4 +-- + drivers/net/wireless/b43/main.c | 3 +- + drivers/net/wireless/b43legacy/main.c | 3 +- + drivers/net/wireless/iwlwifi/iwl-agn.c | 3 +- + drivers/net/wireless/iwlwifi/iwl3945-base.c | 7 +++--- + drivers/net/wireless/libertas_tf/main.c | 4 ++- + drivers/net/wireless/mac80211_hwsim.c | 4 +-- + drivers/net/wireless/p54/p54common.c | 3 +- + drivers/net/wireless/rt2x00/rt2x00.h | 2 - + drivers/net/wireless/rt2x00/rt2x00dev.c | 2 - + drivers/net/wireless/rt2x00/rt2x00mac.c | 3 +- + drivers/net/wireless/rtl8180_dev.c | 3 +- + drivers/net/wireless/rtl8187_dev.c | 3 +- + drivers/net/wireless/zd1211rw/zd_mac.c | 4 ++- + include/net/mac80211.h | 30 +++++++++++++++++++++++----- + net/mac80211/cfg.c | 3 +- + net/mac80211/ieee80211_i.h | 2 - + net/mac80211/iface.c | 25 +++++++++++++++++------ + net/mac80211/main.c | 29 ++++++++++++++------------- + net/mac80211/scan.c | 12 ++++++++--- + net/mac80211/util.c | 3 +- + net/mac80211/wext.c | 14 ++++++------- + 25 files changed, 118 insertions(+), 61 deletions(-) + +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -464,12 +464,32 @@ static inline int __deprecated __IEEE802 + #define IEEE80211_CONF_SHORT_SLOT_TIME (__IEEE80211_CONF_SHORT_SLOT_TIME()) + + /** ++ * enum ieee80211_conf_changed - denotes which configuration changed ++ * ++ * @IEEE80211_CONF_CHANGE_RADIO_ENABLED: the value of radio_enabled changed ++ * @IEEE80211_CONF_CHANGE_BEACON_INTERVAL: the beacon interval changed ++ * @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed ++ * @IEEE80211_CONF_CHANGE_RADIOTAP: the radiotap flag changed ++ * @IEEE80211_CONF_CHANGE_PS: the PS flag changed ++ * @IEEE80211_CONF_CHANGE_POWER: the TX power changed ++ * @IEEE80211_CONF_CHANGE_CHANNEL: the channel changed ++ */ ++enum ieee80211_conf_changed { ++ IEEE80211_CONF_CHANGE_RADIO_ENABLED = BIT(0), ++ IEEE80211_CONF_CHANGE_BEACON_INTERVAL = BIT(1), ++ IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = BIT(2), ++ IEEE80211_CONF_CHANGE_RADIOTAP = BIT(3), ++ IEEE80211_CONF_CHANGE_PS = BIT(4), ++ IEEE80211_CONF_CHANGE_POWER = BIT(5), ++ IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), ++}; ++ ++/** + * struct ieee80211_conf - configuration of the device + * + * This struct indicates how the driver shall configure the hardware. + * + * @radio_enabled: when zero, driver is required to switch off the radio. +- * TODO make a flag + * @beacon_int: beacon interval (TODO make interface config) + * @listen_interval: listen interval in units of beacon interval + * @flags: configuration flags defined above +@@ -479,13 +499,13 @@ static inline int __deprecated __IEEE802 + * @channel: the channel to tune to + */ + struct ieee80211_conf { +- int radio_enabled; +- + int beacon_int; +- u16 listen_interval; + u32 flags; + int power_level; + ++ u16 listen_interval; ++ bool radio_enabled; ++ + struct ieee80211_channel *channel; + + struct ieee80211_sta_ht_cap ht_cap; +@@ -1213,7 +1233,7 @@ struct ieee80211_ops { + struct ieee80211_if_init_conf *conf); + void (*remove_interface)(struct ieee80211_hw *hw, + struct ieee80211_if_init_conf *conf); +- int (*config)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); ++ int (*config)(struct ieee80211_hw *hw, u32 changed); + int (*config_interface)(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_if_conf *conf); +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -394,7 +394,8 @@ static int ieee80211_config_beacon(struc + */ + if (params->interval) { + sdata->local->hw.conf.beacon_int = params->interval; +- ieee80211_hw_config(sdata->local); ++ ieee80211_hw_config(sdata->local, ++ IEEE80211_CONF_CHANGE_BEACON_INTERVAL); + /* + * We updated some parameter so if below bails out + * it's not an error. +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -880,7 +880,7 @@ static inline int ieee80211_bssid_match( + } + + +-int ieee80211_hw_config(struct ieee80211_local *local); ++int ieee80211_hw_config(struct ieee80211_local *local, u32 changed); + int ieee80211_if_config(struct ieee80211_sub_if_data *sdata, u32 changed); + void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx); + void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -65,7 +65,7 @@ static int ieee80211_open(struct net_dev + struct ieee80211_if_init_conf conf; + u32 changed = 0; + int res; +- bool need_hw_reconfig = 0; ++ u32 hw_reconf_flags = 0; + u8 null_addr[ETH_ALEN] = {0}; + + /* fail early if user set an invalid address */ +@@ -152,7 +152,8 @@ static int ieee80211_open(struct net_dev + res = local->ops->start(local_to_hw(local)); + if (res) + goto err_del_bss; +- need_hw_reconfig = 1; ++ /* we're brought up, everything changes */ ++ hw_reconf_flags = ~0; + ieee80211_led_radio(local, local->hw.conf.radio_enabled); + } + +@@ -198,8 +199,10 @@ static int ieee80211_open(struct net_dev + + /* must be before the call to ieee80211_configure_filter */ + local->monitors++; +- if (local->monitors == 1) ++ if (local->monitors == 1) { + local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; ++ hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP; ++ } + + if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) + local->fif_fcsfail++; +@@ -279,8 +282,8 @@ static int ieee80211_open(struct net_dev + atomic_inc(&local->iff_promiscs); + + local->open_count++; +- if (need_hw_reconfig) { +- ieee80211_hw_config(local); ++ if (hw_reconf_flags) { ++ ieee80211_hw_config(local, hw_reconf_flags); + /* + * set default queue parameters so drivers don't + * need to initialise the hardware if the hardware +@@ -322,6 +325,7 @@ static int ieee80211_stop(struct net_dev + struct ieee80211_local *local = sdata->local; + struct ieee80211_if_init_conf conf; + struct sta_info *sta; ++ u32 hw_reconf_flags = 0; + + /* + * Stop TX on this interface first. +@@ -405,8 +409,10 @@ static int ieee80211_stop(struct net_dev + } + + local->monitors--; +- if (local->monitors == 0) ++ if (local->monitors == 0) { + local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP; ++ hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP; ++ } + + if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) + local->fif_fcsfail--; +@@ -504,8 +510,15 @@ static int ieee80211_stop(struct net_dev + + tasklet_disable(&local->tx_pending_tasklet); + tasklet_disable(&local->tasklet); ++ ++ /* no reconfiguring after stop! */ ++ hw_reconf_flags = 0; + } + ++ /* do after stop to avoid reconfiguring when we stop anyway */ ++ if (hw_reconf_flags) ++ ieee80211_hw_config(local, hw_reconf_flags); ++ + return 0; + } + +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -197,31 +197,34 @@ int ieee80211_if_config(struct ieee80211 + &sdata->vif, &conf); + } + +-int ieee80211_hw_config(struct ieee80211_local *local) ++int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) + { + struct ieee80211_channel *chan; + int ret = 0; ++ int power; + + if (local->sw_scanning) + chan = local->scan_channel; + else + chan = local->oper_channel; + +- local->hw.conf.channel = chan; ++ if (chan != local->hw.conf.channel) { ++ local->hw.conf.channel = chan; ++ changed |= IEEE80211_CONF_CHANGE_CHANNEL; ++ } ++ + + if (!local->hw.conf.power_level) +- local->hw.conf.power_level = chan->max_power; ++ power = chan->max_power; + else +- local->hw.conf.power_level = min(chan->max_power, +- local->hw.conf.power_level); +- +-#ifdef CONFIG_MAC80211_VERBOSE_DEBUG +- printk(KERN_DEBUG "%s: HW CONFIG: freq=%d\n", +- wiphy_name(local->hw.wiphy), chan->center_freq); +-#endif ++ power = min(chan->max_power, local->hw.conf.power_level); ++ if (local->hw.conf.power_level != power) { ++ changed |= IEEE80211_CONF_CHANGE_POWER; ++ local->hw.conf.power_level = power; ++ } + +- if (local->open_count) { +- ret = local->ops->config(local_to_hw(local), &local->hw.conf); ++ if (changed && local->open_count) { ++ ret = local->ops->config(local_to_hw(local), changed); + /* + * HW reconfiguration should never fail, the driver has told + * us what it can support so it should live up to that promise. +@@ -672,7 +675,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( + local->fragmentation_threshold = IEEE80211_MAX_FRAG_THRESHOLD; + local->short_retry_limit = 7; + local->long_retry_limit = 4; +- local->hw.conf.radio_enabled = 1; ++ local->hw.conf.radio_enabled = true; + + INIT_LIST_HEAD(&local->interfaces); + +--- a/net/mac80211/scan.c ++++ b/net/mac80211/scan.c +@@ -447,12 +447,17 @@ void ieee80211_scan_completed(struct iee + + if (local->hw_scanning) { + local->hw_scanning = false; +- ieee80211_hw_config(local); ++ /* ++ * Somebody might have requested channel change during scan ++ * that we won't have acted upon, try now. ieee80211_hw_config ++ * will set the flag based on actual changes. ++ */ ++ ieee80211_hw_config(local, 0); + goto done; + } + + local->sw_scanning = false; +- ieee80211_hw_config(local); ++ ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); + + netif_tx_lock_bh(local->mdev); + netif_addr_lock(local->mdev); +@@ -539,7 +544,8 @@ void ieee80211_scan_work(struct work_str + + if (!skip) { + local->scan_channel = chan; +- if (ieee80211_hw_config(local)) ++ if (ieee80211_hw_config(local, ++ IEEE80211_CONF_CHANGE_CHANNEL)) + skip = 1; + } + +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -645,7 +645,8 @@ int ieee80211_set_freq(struct ieee80211_ + if (local->sw_scanning || local->hw_scanning) + ret = 0; + else +- ret = ieee80211_hw_config(local); ++ ret = ieee80211_hw_config( ++ local, IEEE80211_CONF_CHANGE_CHANNEL); + + rate_control_clear(local); + } +--- a/net/mac80211/wext.c ++++ b/net/mac80211/wext.c +@@ -656,7 +656,7 @@ static int ieee80211_ioctl_siwtxpower(st + union iwreq_data *data, char *extra) + { + struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); +- bool need_reconfig = 0; ++ u32 reconf_flags = 0; + int new_power_level; + + if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) +@@ -680,17 +680,17 @@ static int ieee80211_ioctl_siwtxpower(st + + if (local->hw.conf.power_level != new_power_level) { + local->hw.conf.power_level = new_power_level; +- need_reconfig = 1; ++ reconf_flags |= IEEE80211_CONF_CHANGE_POWER; + } + + if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) { + local->hw.conf.radio_enabled = !(data->txpower.disabled); +- need_reconfig = 1; ++ reconf_flags |= IEEE80211_CONF_CHANGE_RADIO_ENABLED; + ieee80211_led_radio(local, local->hw.conf.radio_enabled); + } + +- if (need_reconfig) +- ieee80211_hw_config(local); ++ if (reconf_flags) ++ ieee80211_hw_config(local, reconf_flags); + + return 0; + } +@@ -976,7 +976,7 @@ static int ieee80211_ioctl_siwpower(stru + + if (wrq->disabled) { + conf->flags &= ~IEEE80211_CONF_PS; +- return ieee80211_hw_config(local); ++ return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); + } + + switch (wrq->flags & IW_POWER_MODE) { +@@ -989,7 +989,7 @@ static int ieee80211_ioctl_siwpower(stru + return -EINVAL; + } + +- return ieee80211_hw_config(local); ++ return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); + } + + static int ieee80211_ioctl_giwpower(struct net_device *dev, +--- a/drivers/net/wireless/adm8211.c ++++ b/drivers/net/wireless/adm8211.c +@@ -1314,9 +1314,10 @@ static int adm8211_set_ssid(struct ieee8 + return 0; + } + +-static int adm8211_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) ++static int adm8211_config(struct ieee80211_hw *dev, u32 changed) + { + struct adm8211_priv *priv = dev->priv; ++ struct ieee80211_conf *conf = &dev->conf; + int channel = ieee80211_frequency_to_channel(conf->channel->center_freq); + + if (channel != priv->channel) { +--- a/drivers/net/wireless/at76_usb.c ++++ b/drivers/net/wireless/at76_usb.c +@@ -2057,9 +2057,10 @@ exit: + return 0; + } + +-static int at76_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++static int at76_config(struct ieee80211_hw *hw, u32 changed) + { + struct at76_priv *priv = hw->priv; ++ struct ieee80211_conf *conf = &hw->conf; + + at76_dbg(DBG_MAC80211, "%s(): channel %d radio %d", + __func__, conf->channel->hw_value, conf->radio_enabled); +--- a/drivers/net/wireless/ath5k/base.c ++++ b/drivers/net/wireless/ath5k/base.c +@@ -219,8 +219,7 @@ static int ath5k_add_interface(struct ie + struct ieee80211_if_init_conf *conf); + static void ath5k_remove_interface(struct ieee80211_hw *hw, + struct ieee80211_if_init_conf *conf); +-static int ath5k_config(struct ieee80211_hw *hw, +- struct ieee80211_conf *conf); ++static int ath5k_config(struct ieee80211_hw *hw, u32 changed); + static int ath5k_config_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_if_conf *conf); +@@ -2767,10 +2766,10 @@ end: + * TODO: Phy disable/diversity etc + */ + static int +-ath5k_config(struct ieee80211_hw *hw, +- struct ieee80211_conf *conf) ++ath5k_config(struct ieee80211_hw *hw, u32 changed) + { + struct ath5k_softc *sc = hw->priv; ++ struct ieee80211_conf *conf = &hw->conf; + + sc->bintval = conf->beacon_int; + sc->power_level = conf->power_level; +--- a/drivers/net/wireless/ath9k/main.c ++++ b/drivers/net/wireless/ath9k/main.c +@@ -1231,11 +1231,11 @@ static void ath9k_remove_interface(struc + __func__, error); + } + +-static int ath9k_config(struct ieee80211_hw *hw, +- struct ieee80211_conf *conf) ++static int ath9k_config(struct ieee80211_hw *hw, u32 changed) + { + struct ath_softc *sc = hw->priv; + struct ieee80211_channel *curchan = hw->conf.channel; ++ struct ieee80211_conf *conf = &hw->conf; + int pos; + + DPRINTF(sc, ATH_DBG_CONFIG, "%s: Set channel: %d MHz\n", +--- a/drivers/net/wireless/b43/main.c ++++ b/drivers/net/wireless/b43/main.c +@@ -3320,11 +3320,12 @@ init_failure: + return err; + } + +-static int b43_op_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++static int b43_op_config(struct ieee80211_hw *hw, u32 changed) + { + struct b43_wl *wl = hw_to_b43_wl(hw); + struct b43_wldev *dev; + struct b43_phy *phy; ++ struct ieee80211_conf *conf = &hw->conf; + unsigned long flags; + int antenna; + int err = 0; +--- a/drivers/net/wireless/b43legacy/main.c ++++ b/drivers/net/wireless/b43legacy/main.c +@@ -2557,11 +2557,12 @@ init_failure: + } + + static int b43legacy_op_dev_config(struct ieee80211_hw *hw, +- struct ieee80211_conf *conf) ++ u32 changed) + { + struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); + struct b43legacy_wldev *dev; + struct b43legacy_phy *phy; ++ struct ieee80211_conf *conf = &hw->conf; + unsigned long flags; + unsigned int new_phymode = 0xFFFF; + int antenna_tx; +--- a/drivers/net/wireless/iwlwifi/iwl-agn.c ++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c +@@ -2760,10 +2760,11 @@ static int iwl4965_mac_add_interface(str + * be set inappropriately and the driver currently sets the hardware up to + * use it whenever needed. + */ +-static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++static int iwl4965_mac_config(struct ieee80211_hw *hw, u32 changed) + { + struct iwl_priv *priv = hw->priv; + const struct iwl_channel_info *ch_info; ++ struct ieee80211_conf *conf = &hw->conf; + unsigned long flags; + int ret = 0; + u16 channel; +--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c ++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c +@@ -6427,7 +6427,7 @@ static void iwl3945_bg_abort_scan(struct + mutex_unlock(&priv->mutex); + } + +-static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf); ++static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed); + + static void iwl3945_bg_scan_completed(struct work_struct *work) + { +@@ -6440,7 +6440,7 @@ static void iwl3945_bg_scan_completed(st + return; + + if (test_bit(STATUS_CONF_PENDING, &priv->status)) +- iwl3945_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw)); ++ iwl3945_mac_config(priv->hw, 0); + + ieee80211_scan_completed(priv->hw); + +@@ -6629,10 +6629,11 @@ static int iwl3945_mac_add_interface(str + * be set inappropriately and the driver currently sets the hardware up to + * use it whenever needed. + */ +-static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed) + { + struct iwl3945_priv *priv = hw->priv; + const struct iwl3945_channel_info *ch_info; ++ struct ieee80211_conf *conf = &hw->conf; + unsigned long flags; + int ret = 0; + +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -361,10 +361,10 @@ static void mac80211_hwsim_beacon(unsign + } + + +-static int mac80211_hwsim_config(struct ieee80211_hw *hw, +- struct ieee80211_conf *conf) ++static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed) + { + struct mac80211_hwsim_data *data = hw->priv; ++ struct ieee80211_conf *conf = &hw->conf; + + printk(KERN_DEBUG "%s:%s (freq=%d radio_enabled=%d beacon_int=%d)\n", + wiphy_name(hw->wiphy), __func__, +--- a/drivers/net/wireless/p54/p54common.c ++++ b/drivers/net/wireless/p54/p54common.c +@@ -1205,10 +1205,11 @@ static void p54_remove_interface(struct + p54_set_filter(dev, 0, NULL); + } + +-static int p54_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) ++static int p54_config(struct ieee80211_hw *dev, u32 changed) + { + int ret; + struct p54_common *priv = dev->priv; ++ struct ieee80211_conf *conf = &dev->conf; + + mutex_lock(&priv->conf_mutex); + priv->rx_antenna = 2; /* automatic */ +--- a/drivers/net/wireless/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/rt2x00/rt2x00.h +@@ -997,7 +997,7 @@ int rt2x00mac_add_interface(struct ieee8 + struct ieee80211_if_init_conf *conf); + void rt2x00mac_remove_interface(struct ieee80211_hw *hw, + struct ieee80211_if_init_conf *conf); +-int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf); ++int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed); + int rt2x00mac_config_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_if_conf *conf); +--- a/drivers/net/wireless/rt2x00/rt2x00mac.c ++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c +@@ -335,9 +335,10 @@ void rt2x00mac_remove_interface(struct i + } + EXPORT_SYMBOL_GPL(rt2x00mac_remove_interface); + +-int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed) + { + struct rt2x00_dev *rt2x00dev = hw->priv; ++ struct ieee80211_conf *conf = &hw->conf; + int radio_on; + int status; + +--- a/drivers/net/wireless/rtl8180_dev.c ++++ b/drivers/net/wireless/rtl8180_dev.c +@@ -692,9 +692,10 @@ static void rtl8180_remove_interface(str + priv->vif = NULL; + } + +-static int rtl8180_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) ++static int rtl8180_config(struct ieee80211_hw *dev, u32 changed) + { + struct rtl8180_priv *priv = dev->priv; ++ struct ieee80211_conf *conf = &dev->conf; + + priv->rf->set_chan(dev, conf); + +--- a/drivers/net/wireless/rtl8187_dev.c ++++ b/drivers/net/wireless/rtl8187_dev.c +@@ -870,9 +870,10 @@ static void rtl8187_remove_interface(str + mutex_unlock(&priv->conf_mutex); + } + +-static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) ++static int rtl8187_config(struct ieee80211_hw *dev, u32 changed) + { + struct rtl8187_priv *priv = dev->priv; ++ struct ieee80211_conf *conf = &dev->conf; + u32 reg; + + mutex_lock(&priv->conf_mutex); +--- a/drivers/net/wireless/zd1211rw/zd_mac.c ++++ b/drivers/net/wireless/zd1211rw/zd_mac.c +@@ -743,9 +743,11 @@ static void zd_op_remove_interface(struc + zd_write_mac_addr(&mac->chip, NULL); + } + +-static int zd_op_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) ++static int zd_op_config(struct ieee80211_hw *hw, u32 changed) + { + struct zd_mac *mac = zd_hw_mac(hw); ++ struct ieee80211_conf *conf = &hw->conf; ++ + return zd_chip_set_channel(&mac->chip, conf->channel->hw_value); + } + +--- a/drivers/net/wireless/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c +@@ -1245,7 +1245,7 @@ int rt2x00lib_resume(struct rt2x00_dev * + /* + * Reconfigure device. + */ +- retval = rt2x00mac_config(rt2x00dev->hw, &rt2x00dev->hw->conf); ++ retval = rt2x00mac_config(rt2x00dev->hw, ~0); + if (retval) + goto exit; + |