diff options
author | Karl Beldan <karl.beldan@rivierawaves.com> | 2013-03-25 11:26:57 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-25 14:19:35 -0400 |
commit | 675a0b049abf6edf30f8dd84c5610b6edc2296c8 (patch) | |
tree | 164178c576642dc1ec8ae70d9e26a5ec33472d26 /net/mac80211/main.c | |
parent | 219c38674c262378ec411dd8318ebfd199fbce8d (diff) |
mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan
Drivers that don't use chanctxes cannot perform VHT association because
they still use a "backward compatibility" pair of {ieee80211_channel,
nl80211_channel_type} in ieee80211_conf and ieee80211_local.
Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
[fix kernel-doc]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r-- | net/mac80211/main.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index b0d286821864..a16b037c9d34 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -95,42 +95,47 @@ static void ieee80211_reconfig_filter(struct work_struct *work) | |||
95 | static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local) | 95 | static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local) |
96 | { | 96 | { |
97 | struct ieee80211_sub_if_data *sdata; | 97 | struct ieee80211_sub_if_data *sdata; |
98 | struct ieee80211_channel *chan; | 98 | struct cfg80211_chan_def chandef = {}; |
99 | u32 changed = 0; | 99 | u32 changed = 0; |
100 | int power; | 100 | int power; |
101 | enum nl80211_channel_type channel_type; | ||
102 | u32 offchannel_flag; | 101 | u32 offchannel_flag; |
103 | 102 | ||
104 | offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; | 103 | offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
104 | |||
105 | if (local->scan_channel) { | 105 | if (local->scan_channel) { |
106 | chan = local->scan_channel; | 106 | chandef.chan = local->scan_channel; |
107 | /* If scanning on oper channel, use whatever channel-type | 107 | /* If scanning on oper channel, use whatever channel-type |
108 | * is currently in use. | 108 | * is currently in use. |
109 | */ | 109 | */ |
110 | if (chan == local->_oper_channel) | 110 | if (chandef.chan == local->_oper_chandef.chan) { |
111 | channel_type = local->_oper_channel_type; | 111 | chandef = local->_oper_chandef; |
112 | else | 112 | } else { |
113 | channel_type = NL80211_CHAN_NO_HT; | 113 | chandef.width = NL80211_CHAN_WIDTH_20_NOHT; |
114 | chandef.center_freq1 = chandef.chan->center_freq; | ||
115 | } | ||
114 | } else if (local->tmp_channel) { | 116 | } else if (local->tmp_channel) { |
115 | chan = local->tmp_channel; | 117 | chandef.chan = local->tmp_channel; |
116 | channel_type = NL80211_CHAN_NO_HT; | 118 | chandef.width = NL80211_CHAN_WIDTH_20_NOHT; |
117 | } else { | 119 | chandef.center_freq1 = chandef.chan->center_freq; |
118 | chan = local->_oper_channel; | 120 | } else |
119 | channel_type = local->_oper_channel_type; | 121 | chandef = local->_oper_chandef; |
120 | } | 122 | |
121 | 123 | WARN(!cfg80211_chandef_valid(&chandef), | |
122 | if (chan != local->_oper_channel || | 124 | "control:%d MHz width:%d center: %d/%d MHz", |
123 | channel_type != local->_oper_channel_type) | 125 | chandef.chan->center_freq, chandef.width, |
126 | chandef.center_freq1, chandef.center_freq2); | ||
127 | |||
128 | if (!cfg80211_chandef_identical(&chandef, &local->_oper_chandef)) | ||
124 | local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL; | 129 | local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL; |
125 | else | 130 | else |
126 | local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL; | 131 | local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL; |
127 | 132 | ||
128 | offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; | 133 | offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
129 | 134 | ||
130 | if (offchannel_flag || chan != local->hw.conf.channel || | 135 | if (offchannel_flag || |
131 | channel_type != local->hw.conf.channel_type) { | 136 | !cfg80211_chandef_identical(&local->hw.conf.chandef, |
132 | local->hw.conf.channel = chan; | 137 | &local->_oper_chandef)) { |
133 | local->hw.conf.channel_type = channel_type; | 138 | local->hw.conf.chandef = chandef; |
134 | changed |= IEEE80211_CONF_CHANGE_CHANNEL; | 139 | changed |= IEEE80211_CONF_CHANGE_CHANNEL; |
135 | } | 140 | } |
136 | 141 | ||
@@ -146,7 +151,7 @@ static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local) | |||
146 | changed |= IEEE80211_CONF_CHANGE_SMPS; | 151 | changed |= IEEE80211_CONF_CHANGE_SMPS; |
147 | } | 152 | } |
148 | 153 | ||
149 | power = chan->max_power; | 154 | power = chandef.chan->max_power; |
150 | 155 | ||
151 | rcu_read_lock(); | 156 | rcu_read_lock(); |
152 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | 157 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { |
@@ -740,11 +745,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
740 | sband = local->hw.wiphy->bands[band]; | 745 | sband = local->hw.wiphy->bands[band]; |
741 | if (!sband) | 746 | if (!sband) |
742 | continue; | 747 | continue; |
743 | if (!local->use_chanctx && !local->_oper_channel) { | 748 | if (!local->use_chanctx && !local->_oper_chandef.chan) { |
744 | /* init channel we're on */ | 749 | /* init channel we're on */ |
745 | local->hw.conf.channel = | 750 | struct cfg80211_chan_def chandef = { |
746 | local->_oper_channel = &sband->channels[0]; | 751 | .chan = &sband->channels[0], |
747 | local->hw.conf.channel_type = NL80211_CHAN_NO_HT; | 752 | .width = NL80211_CHAN_NO_HT, |
753 | .center_freq1 = sband->channels[0].center_freq, | ||
754 | .center_freq2 = 0 | ||
755 | }; | ||
756 | local->hw.conf.chandef = local->_oper_chandef = chandef; | ||
748 | } | 757 | } |
749 | cfg80211_chandef_create(&local->monitor_chandef, | 758 | cfg80211_chandef_create(&local->monitor_chandef, |
750 | &sband->channels[0], | 759 | &sband->channels[0], |