diff options
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r-- | net/mac80211/main.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index c155c0b69426..2543e48bd813 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include "debugfs.h" | 34 | #include "debugfs.h" |
35 | 35 | ||
36 | 36 | ||
37 | bool ieee80211_disable_40mhz_24ghz; | 37 | static bool ieee80211_disable_40mhz_24ghz; |
38 | module_param(ieee80211_disable_40mhz_24ghz, bool, 0644); | 38 | module_param(ieee80211_disable_40mhz_24ghz, bool, 0644); |
39 | MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz, | 39 | MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz, |
40 | "Disable 40MHz support in the 2.4GHz band"); | 40 | "Disable 40MHz support in the 2.4GHz band"); |
@@ -112,7 +112,13 @@ bool ieee80211_cfg_on_oper_channel(struct ieee80211_local *local) | |||
112 | /* This logic needs to match logic in ieee80211_hw_config */ | 112 | /* This logic needs to match logic in ieee80211_hw_config */ |
113 | if (local->scan_channel) { | 113 | if (local->scan_channel) { |
114 | chan = local->scan_channel; | 114 | chan = local->scan_channel; |
115 | channel_type = NL80211_CHAN_NO_HT; | 115 | /* If scanning on oper channel, use whatever channel-type |
116 | * is currently in use. | ||
117 | */ | ||
118 | if (chan == local->oper_channel) | ||
119 | channel_type = local->_oper_channel_type; | ||
120 | else | ||
121 | channel_type = NL80211_CHAN_NO_HT; | ||
116 | } else if (local->tmp_channel) { | 122 | } else if (local->tmp_channel) { |
117 | chan = scan_chan = local->tmp_channel; | 123 | chan = scan_chan = local->tmp_channel; |
118 | channel_type = local->tmp_channel_type; | 124 | channel_type = local->tmp_channel_type; |
@@ -151,7 +157,13 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) | |||
151 | offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; | 157 | offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
152 | if (scan_chan) { | 158 | if (scan_chan) { |
153 | chan = scan_chan; | 159 | chan = scan_chan; |
154 | channel_type = NL80211_CHAN_NO_HT; | 160 | /* If scanning on oper channel, use whatever channel-type |
161 | * is currently in use. | ||
162 | */ | ||
163 | if (chan == local->oper_channel) | ||
164 | channel_type = local->_oper_channel_type; | ||
165 | else | ||
166 | channel_type = NL80211_CHAN_NO_HT; | ||
155 | } else if (local->tmp_channel) { | 167 | } else if (local->tmp_channel) { |
156 | chan = scan_chan = local->tmp_channel; | 168 | chan = scan_chan = local->tmp_channel; |
157 | channel_type = local->tmp_channel_type; | 169 | channel_type = local->tmp_channel_type; |
@@ -187,7 +199,8 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) | |||
187 | changed |= IEEE80211_CONF_CHANGE_SMPS; | 199 | changed |= IEEE80211_CONF_CHANGE_SMPS; |
188 | } | 200 | } |
189 | 201 | ||
190 | if (scan_chan) | 202 | if ((local->scanning & SCAN_SW_SCANNING) || |
203 | (local->scanning & SCAN_HW_SCANNING)) | ||
191 | power = chan->max_power; | 204 | power = chan->max_power; |
192 | else | 205 | else |
193 | power = local->power_constr_level ? | 206 | power = local->power_constr_level ? |
@@ -710,6 +723,18 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
710 | } | 723 | } |
711 | channels += sband->n_channels; | 724 | channels += sband->n_channels; |
712 | 725 | ||
726 | /* | ||
727 | * Since ieee80211_disable_40mhz_24ghz is global, we can | ||
728 | * modify the sband's ht data even if the driver uses a | ||
729 | * global structure for that. | ||
730 | */ | ||
731 | if (ieee80211_disable_40mhz_24ghz && | ||
732 | band == IEEE80211_BAND_2GHZ && | ||
733 | sband->ht_cap.ht_supported) { | ||
734 | sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||
735 | sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_40; | ||
736 | } | ||
737 | |||
713 | if (max_bitrates < sband->n_bitrates) | 738 | if (max_bitrates < sband->n_bitrates) |
714 | max_bitrates = sband->n_bitrates; | 739 | max_bitrates = sband->n_bitrates; |
715 | supp_ht = supp_ht || sband->ht_cap.ht_supported; | 740 | supp_ht = supp_ht || sband->ht_cap.ht_supported; |