* [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers
@ 2013-03-25 20:51 Karl Beldan
2013-03-25 20:51 ` [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan Karl Beldan
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Karl Beldan @ 2013-03-25 20:51 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, fengguang.wu, Karl Beldan
Fengguang's build with v1 yields kernel-doc warnings.
This v2 replaces the @channel+@channel_type kernel-doc entries in
struct ieee80211_conf with an @chandef.
Karl
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan
2013-03-25 20:51 [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
@ 2013-03-25 20:51 ` Karl Beldan
2013-03-25 21:11 ` Gertjan van Wingerde
2013-03-25 20:51 ` [PATCH v2 2/3] Let drivers not supporting channel contexts use VHT Karl Beldan
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Karl Beldan @ 2013-03-25 20:51 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, fengguang.wu, Karl Beldan, Karl Beldan
From: Karl Beldan <karl.beldan@rivierawaves.com>
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>
---
drivers/net/wireless/adm8211.c | 3 +-
drivers/net/wireless/at76c50x-usb.c | 4 +-
drivers/net/wireless/ath/ar5523/ar5523.c | 14 ++--
drivers/net/wireless/ath/ath5k/base.c | 2 +-
drivers/net/wireless/ath/ath5k/mac80211-ops.c | 4 +-
drivers/net/wireless/ath/ath9k/beacon.c | 2 +-
drivers/net/wireless/ath/ath9k/calib.c | 2 +-
drivers/net/wireless/ath/ath9k/common.c | 5 +-
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 16 +++--
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 8 +-
drivers/net/wireless/ath/ath9k/hw.c | 5 +-
drivers/net/wireless/ath/ath9k/link.c | 2 +-
drivers/net/wireless/ath/ath9k/main.c | 10 ++-
drivers/net/wireless/ath/ath9k/rc.c | 4 +-
drivers/net/wireless/ath/ath9k/recv.c | 6 +-
drivers/net/wireless/ath/carl9170/debug.c | 5 +-
drivers/net/wireless/ath/carl9170/mac.c | 8 +-
drivers/net/wireless/ath/carl9170/main.c | 9 ++-
drivers/net/wireless/ath/carl9170/phy.c | 4 +-
drivers/net/wireless/b43/b43.h | 2 +-
drivers/net/wireless/b43/main.c | 8 +-
drivers/net/wireless/b43/phy_ht.c | 5 +-
drivers/net/wireless/b43/phy_lcn.c | 5 +-
drivers/net/wireless/b43/phy_n.c | 5 +-
drivers/net/wireless/b43legacy/main.c | 9 ++-
drivers/net/wireless/brcm80211/brcmsmac/channel.c | 4 +-
.../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 6 +-
drivers/net/wireless/brcm80211/brcmsmac/main.c | 4 +-
drivers/net/wireless/iwlegacy/3945-rs.c | 2 +-
drivers/net/wireless/iwlegacy/4965-rs.c | 2 +-
drivers/net/wireless/iwlegacy/common.c | 2 +-
drivers/net/wireless/iwlwifi/dvm/rs.c | 2 +-
drivers/net/wireless/iwlwifi/dvm/rxon.c | 9 ++-
drivers/net/wireless/libertas_tf/main.c | 8 +-
drivers/net/wireless/mac80211_hwsim.c | 42 +++++++++-----
drivers/net/wireless/mwl8k.c | 36 +++++++-----
drivers/net/wireless/p54/fwio.c | 4 +-
drivers/net/wireless/p54/main.c | 4 +-
drivers/net/wireless/p54/txrx.c | 4 +-
drivers/net/wireless/rt2x00/rt2800lib.c | 8 +-
drivers/net/wireless/rt2x00/rt2x00config.c | 10 ++--
drivers/net/wireless/rt2x00/rt61pci.c | 2 +-
drivers/net/wireless/rt2x00/rt73usb.c | 2 +-
drivers/net/wireless/rtl818x/rtl8180/dev.c | 4 +-
drivers/net/wireless/rtl818x/rtl8180/grf5101.c | 3 +-
drivers/net/wireless/rtl818x/rtl8180/max2820.c | 2 +-
drivers/net/wireless/rtl818x/rtl8180/rtl8225.c | 3 +-
drivers/net/wireless/rtl818x/rtl8180/sa2400.c | 3 +-
drivers/net/wireless/rtl818x/rtl8187/dev.c | 4 +-
drivers/net/wireless/rtl818x/rtl8187/rtl8225.c | 3 +-
drivers/net/wireless/rtlwifi/base.c | 4 +-
drivers/net/wireless/rtlwifi/core.c | 6 +-
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | 8 +-
drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 4 +-
drivers/net/wireless/ti/wl1251/main.c | 5 +-
drivers/net/wireless/ti/wlcore/main.c | 2 +-
drivers/net/wireless/zd1211rw/zd_mac.c | 4 +-
include/net/mac80211.h | 18 +++---
net/mac80211/cfg.c | 7 +--
net/mac80211/chan.c | 11 ++--
net/mac80211/ieee80211_i.h | 3 +-
net/mac80211/main.c | 59 +++++++++++--------
net/mac80211/mlme.c | 24 ++++++--
net/mac80211/scan.c | 6 +-
net/mac80211/trace.h | 37 ++++++-------
net/mac80211/tx.c | 4 +-
net/mac80211/util.c | 3 +-
70 files changed, 293 insertions(+), 244 deletions(-)
diff --git a/drivers/net/wireless/adm8211.c b/drivers/net/wireless/adm8211.c
index 3d339e0..f9a24e5 100644
--- a/drivers/net/wireless/adm8211.c
+++ b/drivers/net/wireless/adm8211.c
@@ -1293,7 +1293,8 @@ 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);
+ int channel =
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
if (channel != priv->channel) {
priv->channel = channel;
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 5ac5f7a..34c8a33 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -1943,12 +1943,12 @@ static int at76_config(struct ieee80211_hw *hw, u32 changed)
struct at76_priv *priv = hw->priv;
at76_dbg(DBG_MAC80211, "%s(): channel %d",
- __func__, hw->conf.channel->hw_value);
+ __func__, hw->conf.chandef.chan->hw_value);
at76_dbg_dump(DBG_MAC80211, priv->bssid, ETH_ALEN, "bssid:");
mutex_lock(&priv->mtx);
- priv->channel = hw->conf.channel->hw_value;
+ priv->channel = hw->conf.chandef.chan->hw_value;
if (is_valid_ether_addr(priv->bssid))
at76_join(priv);
diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
index afd1e36..17d7fec 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
@@ -457,14 +457,14 @@ static int ar5523_set_chan(struct ar5523 *ar)
memset(&reset, 0, sizeof(reset));
reset.flags |= cpu_to_be32(UATH_CHAN_2GHZ);
reset.flags |= cpu_to_be32(UATH_CHAN_OFDM);
- reset.freq = cpu_to_be32(conf->channel->center_freq);
+ reset.freq = cpu_to_be32(conf->chandef.chan->center_freq);
reset.maxrdpower = cpu_to_be32(50); /* XXX */
reset.channelchange = cpu_to_be32(1);
reset.keeprccontent = cpu_to_be32(0);
ar5523_dbg(ar, "set chan flags 0x%x freq %d\n",
be32_to_cpu(reset.flags),
- conf->channel->center_freq);
+ conf->chandef.chan->center_freq);
return ar5523_cmd_write(ar, WDCMSG_RESET, &reset, sizeof(reset), 0);
}
@@ -594,7 +594,7 @@ static void ar5523_data_rx_cb(struct urb *urb)
rx_status = IEEE80211_SKB_RXCB(data->skb);
memset(rx_status, 0, sizeof(*rx_status));
rx_status->freq = be32_to_cpu(desc->channel);
- rx_status->band = hw->conf.channel->band;
+ rx_status->band = hw->conf.chandef.chan->band;
rx_status->signal = -95 + be32_to_cpu(desc->rssi);
ieee80211_rx_irqsafe(hw, data->skb);
@@ -1153,13 +1153,13 @@ static int ar5523_get_wlan_mode(struct ar5523 *ar,
struct ieee80211_sta *sta;
u32 sta_rate_set;
- band = ar->hw->wiphy->bands[ar->hw->conf.channel->band];
+ band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
sta = ieee80211_find_sta(ar->vif, bss_conf->bssid);
if (!sta) {
ar5523_info(ar, "STA not found!\n");
return WLAN_MODE_11b;
}
- sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];
+ sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
for (bit = 0; bit < band->n_bitrates; bit++) {
if (sta_rate_set & 1) {
@@ -1197,11 +1197,11 @@ static void ar5523_create_rateset(struct ar5523 *ar,
ar5523_info(ar, "STA not found. Cannot set rates\n");
sta_rate_set = bss_conf->basic_rates;
} else
- sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];
+ sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);
- band = ar->hw->wiphy->bands[ar->hw->conf.channel->band];
+ band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
for (bit = 0; bit < band->n_bitrates; bit++) {
BUG_ON(i >= AR5523_MAX_NRATES);
ar5523_dbg(ar, "Considering rate %d : %d\n",
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 1d264c0..9b20d9e 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2639,7 +2639,7 @@ int ath5k_start(struct ieee80211_hw *hw)
* be followed by initialization of the appropriate bits
* and then setup of the interrupt mask.
*/
- ah->curchan = ah->hw->conf.channel;
+ ah->curchan = ah->hw->conf.chandef.chan;
ah->imask = AR5K_INT_RXOK
| AR5K_INT_RXERR
| AR5K_INT_RXEOL
diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
index 4264341..06f86f4 100644
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
@@ -202,7 +202,7 @@ ath5k_config(struct ieee80211_hw *hw, u32 changed)
mutex_lock(&ah->lock);
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
- ret = ath5k_chan_set(ah, conf->channel);
+ ret = ath5k_chan_set(ah, conf->chandef.chan);
if (ret < 0)
goto unlock;
}
@@ -678,7 +678,7 @@ ath5k_get_survey(struct ieee80211_hw *hw, int idx, struct survey_info *survey)
memcpy(survey, &ah->survey, sizeof(*survey));
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->noise = ah->ah_noise_floor;
survey->filled = SURVEY_INFO_NOISE_DBM |
SURVEY_INFO_CHANNEL_TIME |
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 5f05c26..2ff570f 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -79,7 +79,7 @@ static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
u8 chainmask = ah->txchainmask;
u8 rate = 0;
- sband = &sc->sbands[common->hw->conf.channel->band];
+ sband = &sc->sbands[common->hw->conf.chandef.chan->band];
rate = sband->bitrates[rateidx].hw_value;
if (vif->bss_conf.use_short_preamble)
rate |= sband->bitrates[rateidx].hw_value_short;
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index 1e85085..b184f1f 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -208,7 +208,7 @@ bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
return true;
ath_dbg(common, CALIBRATE, "Resetting Cal %d state for channel %u\n",
- currCal->calData->calType, conf->channel->center_freq);
+ currCal->calData->calType, conf->chandef.chan->center_freq);
ah->caldata->CalValid &= ~currCal->calData->calType;
currCal->calState = CAL_WAITING;
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
index 905f1b3..6c78fe7 100644
--- a/drivers/net/wireless/ath/ath9k/common.c
+++ b/drivers/net/wireless/ath/ath9k/common.c
@@ -133,13 +133,14 @@ EXPORT_SYMBOL(ath9k_cmn_update_ichannel);
struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw,
struct ath_hw *ah)
{
- struct ieee80211_channel *curchan = hw->conf.channel;
+ struct ieee80211_channel *curchan = hw->conf.chandef.chan;
struct ath9k_channel *channel;
u8 chan_idx;
chan_idx = curchan->hw_value;
channel = &ah->channels[chan_idx];
- ath9k_cmn_update_ichannel(channel, curchan, hw->conf.channel_type);
+ ath9k_cmn_update_ichannel(channel, curchan,
+ cfg80211_get_chandef_type(&hw->conf.chandef));
return channel;
}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index a8016d7..098e354 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -190,7 +190,7 @@ void ath9k_htc_reset(struct ath9k_htc_priv *priv)
{
struct ath_hw *ah = priv->ah;
struct ath_common *common = ath9k_hw_common(ah);
- struct ieee80211_channel *channel = priv->hw->conf.channel;
+ struct ieee80211_channel *channel = priv->hw->conf.chandef.chan;
struct ath9k_hw_cal_data *caldata = NULL;
enum htc_phymode mode;
__be16 htc_mode;
@@ -250,7 +250,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
struct ath_common *common = ath9k_hw_common(ah);
struct ieee80211_conf *conf = &common->hw->conf;
bool fastcc;
- struct ieee80211_channel *channel = hw->conf.channel;
+ struct ieee80211_channel *channel = hw->conf.chandef.chan;
struct ath9k_hw_cal_data *caldata = NULL;
enum htc_phymode mode;
__be16 htc_mode;
@@ -602,7 +602,7 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
u32 caps = 0;
int i, j;
- sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
+ sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
for (i = 0, j = 0; i < sband->n_bitrates; i++) {
if (sta->supp_rates[sband->band] & BIT(i)) {
@@ -904,7 +904,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
struct ath9k_htc_priv *priv = hw->priv;
struct ath_hw *ah = priv->ah;
struct ath_common *common = ath9k_hw_common(ah);
- struct ieee80211_channel *curchan = hw->conf.channel;
+ struct ieee80211_channel *curchan = hw->conf.chandef.chan;
struct ath9k_channel *init_channel;
int ret = 0;
enum htc_phymode mode;
@@ -1193,15 +1193,17 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
}
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) {
- struct ieee80211_channel *curchan = hw->conf.channel;
+ struct ieee80211_channel *curchan = hw->conf.chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&hw->conf.chandef);
int pos = curchan->hw_value;
ath_dbg(common, CONFIG, "Set channel: %d MHz\n",
curchan->center_freq);
ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
- hw->conf.channel,
- hw->conf.channel_type);
+ hw->conf.chandef.chan,
+ channel_type);
if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
ath_err(common, "Unable to set channel\n");
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index 3ad1fd0..306c550 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -490,7 +490,7 @@ static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
if (txs->ts_flags & ATH9K_HTC_TXSTAT_SGI)
rate->flags |= IEEE80211_TX_RC_SHORT_GI;
} else {
- if (cur_conf->channel->band == IEEE80211_BAND_5GHZ)
+ if (cur_conf->chandef.chan->band == IEEE80211_BAND_5GHZ)
rate->idx += 4; /* No CCK rates */
}
@@ -939,7 +939,7 @@ static void ath9k_process_rate(struct ieee80211_hw *hw,
return;
}
- band = hw->conf.channel->band;
+ band = hw->conf.chandef.chan->band;
sband = hw->wiphy->bands[band];
for (i = 0; i < sband->n_bitrates; i++) {
@@ -1078,8 +1078,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
- rx_status->band = hw->conf.channel->band;
- rx_status->freq = hw->conf.channel->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR;
rx_status->antenna = rxbuf->rxstatus.rs_antenna;
rx_status->flag |= RX_FLAG_MACTIME_END;
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 2a2ae40..d5e6a38 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -139,7 +139,7 @@ static void ath9k_hw_set_clockrate(struct ath_hw *ah)
clockrate = 117;
else if (!ah->curchan) /* should really check for CCK instead */
clockrate = ATH9K_CLOCK_RATE_CCK;
- else if (conf->channel->band == IEEE80211_BAND_2GHZ)
+ else if (conf->chandef.chan->band == IEEE80211_BAND_2GHZ)
clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)
clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
@@ -1110,7 +1110,8 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
* BA frames in some implementations, but it has been found to fix ACK
* timeout issues in other cases as well.
*/
- if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ &&
+ if (conf->chandef.chan &&
+ conf->chandef.chan->band == IEEE80211_BAND_2GHZ &&
!IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) {
acktimeout += 64 - sifstime - ah->slottime;
ctstimeout += 48 - sifstime - ah->slottime;
diff --git a/drivers/net/wireless/ath/ath9k/link.c b/drivers/net/wireless/ath/ath9k/link.c
index ade3afb..b1433f5 100644
--- a/drivers/net/wireless/ath/ath9k/link.c
+++ b/drivers/net/wireless/ath/ath9k/link.c
@@ -213,7 +213,7 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int
txctl.txq = sc->tx.txq_map[IEEE80211_AC_BE];
memset(tx_info, 0, sizeof(*tx_info));
- tx_info->band = hw->conf.channel->band;
+ tx_info->band = hw->conf.chandef.chan->band;
tx_info->flags |= IEEE80211_TX_CTL_NO_ACK;
tx_info->control.rates[0].idx = 0;
tx_info->control.rates[0].count = 1;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 24650fd4..f984a03 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -585,7 +585,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
struct ath_softc *sc = hw->priv;
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
- struct ieee80211_channel *curchan = hw->conf.channel;
+ struct ieee80211_channel *curchan = hw->conf.chandef.chan;
struct ath9k_channel *init_channel;
int r;
@@ -1184,7 +1184,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
}
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
- struct ieee80211_channel *curchan = hw->conf.channel;
+ struct ieee80211_channel *curchan = hw->conf.chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&conf->chandef);
int pos = curchan->hw_value;
int old_pos = -1;
unsigned long flags;
@@ -1193,7 +1195,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
old_pos = ah->curchan - &ah->channels[0];
ath_dbg(common, CONFIG, "Set channel: %d MHz type: %d\n",
- curchan->center_freq, conf->channel_type);
+ curchan->center_freq, channel_type);
/* update survey stats for the old channel before switching */
spin_lock_irqsave(&common->cc_lock, flags);
@@ -1208,7 +1210,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
ath9k_hw_getnf(ah, ah->curchan);
ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
- curchan, conf->channel_type);
+ curchan, channel_type);
/*
* If the operating channel changes, change the survey in-use flags
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index 96ac433..aa4d368 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -814,7 +814,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
* So, set fourth rate in series to be same as third one for
* above conditions.
*/
- if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
+ if ((sc->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) &&
(conf_is_ht(&sc->hw->conf))) {
u8 dot11rate = rate_table->info[rix].dot11rate;
u8 phy = rate_table->info[rix].phy;
@@ -1328,7 +1328,7 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
ath_dbg(ath9k_hw_common(sc->sc_ah), CONFIG,
"Operating HT Bandwidth changed to: %d\n",
- sc->hw->conf.channel_type);
+ cfg80211_get_chandef_type(&sc->hw->conf.chandef));
}
}
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index ee156e5..c90ca57 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -859,7 +859,7 @@ static int ath9k_process_rate(struct ath_common *common,
unsigned int i = 0;
struct ath_softc __maybe_unused *sc = common->priv;
- band = hw->conf.channel->band;
+ band = hw->conf.chandef.chan->band;
sband = hw->wiphy->bands[band];
if (rx_stats->rs_rate & 0x80) {
@@ -954,8 +954,8 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
if (ath9k_process_rate(common, hw, rx_stats, rx_status))
return -EINVAL;
- rx_status->band = hw->conf.channel->band;
- rx_status->freq = hw->conf.channel->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
rx_status->signal = ah->noise + rx_stats->rs_rssi;
rx_status->antenna = rx_stats->rs_antenna;
rx_status->flag |= RX_FLAG_MACTIME_END;
diff --git a/drivers/net/wireless/ath/carl9170/debug.c b/drivers/net/wireless/ath/carl9170/debug.c
index 93fe600..7741fe8 100644
--- a/drivers/net/wireless/ath/carl9170/debug.c
+++ b/drivers/net/wireless/ath/carl9170/debug.c
@@ -654,8 +654,9 @@ static ssize_t carl9170_debugfs_bug_write(struct ar9170 *ar, const char *buf,
goto out;
case 'P':
- err = carl9170_set_channel(ar, ar->hw->conf.channel,
- ar->hw->conf.channel_type, CARL9170_RFI_COLD);
+ err = carl9170_set_channel(ar, ar->hw->conf.chandef.chan,
+ cfg80211_get_chandef_type(&ar->hw->conf.chandef),
+ CARL9170_RFI_COLD);
if (err < 0)
count = err;
diff --git a/drivers/net/wireless/ath/carl9170/mac.c b/drivers/net/wireless/ath/carl9170/mac.c
index 24d75ab..a2f00570 100644
--- a/drivers/net/wireless/ath/carl9170/mac.c
+++ b/drivers/net/wireless/ath/carl9170/mac.c
@@ -48,7 +48,7 @@ int carl9170_set_dyn_sifs_ack(struct ar9170 *ar)
if (conf_is_ht40(&ar->hw->conf))
val = 0x010a;
else {
- if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ)
+ if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
val = 0x105;
else
val = 0x104;
@@ -66,7 +66,7 @@ int carl9170_set_rts_cts_rate(struct ar9170 *ar)
rts_rate = 0x1da;
cts_rate = 0x10a;
} else {
- if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
+ if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
/* 11 mbit CCK */
rts_rate = 033;
cts_rate = 003;
@@ -93,7 +93,7 @@ int carl9170_set_slot_time(struct ar9170 *ar)
return 0;
}
- if ((ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ) ||
+ if ((ar->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ) ||
vif->bss_conf.use_short_slot)
slottime = 9;
@@ -120,7 +120,7 @@ int carl9170_set_mac_rates(struct ar9170 *ar)
basic |= (vif->bss_conf.basic_rates & 0xff0) << 4;
rcu_read_unlock();
- if (ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ)
+ if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
mandatory = 0xff00; /* OFDM 6/9/12/18/24/36/48/54 */
else
mandatory = 0xff0f; /* OFDM (6/9../54) + CCK (1/2/5.5/11) */
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c
index 08b1931..4e268b1 100644
--- a/drivers/net/wireless/ath/carl9170/main.c
+++ b/drivers/net/wireless/ath/carl9170/main.c
@@ -929,6 +929,9 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
}
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&hw->conf.chandef);
+
/* adjust slot time for 5 GHz */
err = carl9170_set_slot_time(ar);
if (err)
@@ -938,8 +941,8 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
if (err)
goto out;
- err = carl9170_set_channel(ar, hw->conf.channel,
- hw->conf.channel_type, CARL9170_RFI_NONE);
+ err = carl9170_set_channel(ar, hw->conf.chandef.chan,
+ channel_type, CARL9170_RFI_NONE);
if (err)
goto out;
@@ -957,7 +960,7 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
}
if (changed & IEEE80211_CONF_CHANGE_POWER) {
- err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel);
+ err = carl9170_set_mac_tpc(ar, ar->hw->conf.chandef.chan);
if (err)
goto out;
}
diff --git a/drivers/net/wireless/ath/carl9170/phy.c b/drivers/net/wireless/ath/carl9170/phy.c
index b72c09c..c5f1fdd 100644
--- a/drivers/net/wireless/ath/carl9170/phy.c
+++ b/drivers/net/wireless/ath/carl9170/phy.c
@@ -1331,7 +1331,7 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw)
* CTL_ETSI for 2GHz and CTL_FCC for 5GHz.
*/
ctl_grp = ath_regd_get_band_ctl(&ar->common.regulatory,
- ar->hw->conf.channel->band);
+ ar->hw->conf.chandef.chan->band);
/* ctl group not found - either invalid band (NO_CTL) or ww roaming */
if (ctl_grp == NO_CTL || ctl_grp == SD_NO_CTL)
@@ -1341,7 +1341,7 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw)
/* skip CTL and heavy clip for CTL_MKK and CTL_ETSI */
return;
- if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
+ if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
modes = mode_list_2ghz;
nr_modes = ARRAY_SIZE(mode_list_2ghz);
} else {
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index 10e288d..6a4bd8c 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -972,7 +972,7 @@ static inline int b43_is_mode(struct b43_wl *wl, int type)
*/
static inline enum ieee80211_band b43_current_band(struct b43_wl *wl)
{
- return wl->hw->conf.channel->band;
+ return wl->hw->conf.chandef.chan->band;
}
static inline int b43_bus_may_powerdown(struct b43_wldev *wldev)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 0568273..d135e89 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -3848,7 +3848,7 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
dev = wl->current_dev;
/* Switch the band (if necessary). This might change the active core. */
- err = b43_switch_band(wl, conf->channel);
+ err = b43_switch_band(wl, conf->chandef.chan);
if (err)
goto out_unlock_mutex;
@@ -3878,8 +3878,8 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
/* Switch to the requested channel.
* The firmware takes care of races with the TX handler. */
- if (conf->channel->hw_value != phy->channel)
- b43_switch_channel(dev, conf->channel->hw_value);
+ if (conf->chandef.chan->hw_value != phy->channel)
+ b43_switch_channel(dev, conf->chandef.chan->hw_value);
dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
@@ -5002,7 +5002,7 @@ static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = dev->stats.link_noise;
diff --git a/drivers/net/wireless/b43/phy_ht.c b/drivers/net/wireless/b43/phy_ht.c
index 7416c5e..016682e 100644
--- a/drivers/net/wireless/b43/phy_ht.c
+++ b/drivers/net/wireless/b43/phy_ht.c
@@ -525,8 +525,9 @@ static void b43_phy_ht_op_switch_analog(struct b43_wldev *dev, bool on)
static int b43_phy_ht_op_switch_channel(struct b43_wldev *dev,
unsigned int new_channel)
{
- struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
- enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
+ struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
if ((new_channel < 1) || (new_channel > 14))
diff --git a/drivers/net/wireless/b43/phy_lcn.c b/drivers/net/wireless/b43/phy_lcn.c
index a13e28e..0bafa3b 100644
--- a/drivers/net/wireless/b43/phy_lcn.c
+++ b/drivers/net/wireless/b43/phy_lcn.c
@@ -808,8 +808,9 @@ static void b43_phy_lcn_op_switch_analog(struct b43_wldev *dev, bool on)
static int b43_phy_lcn_op_switch_channel(struct b43_wldev *dev,
unsigned int new_channel)
{
- struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
- enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
+ struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
if ((new_channel < 1) || (new_channel > 14))
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index 3c35382..949a3bd 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -5530,8 +5530,9 @@ static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on)
static int b43_nphy_op_switch_channel(struct b43_wldev *dev,
unsigned int new_channel)
{
- struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
- enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
+ struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
if ((new_channel < 1) || (new_channel > 14))
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 8c3f70e..5726688 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -2720,7 +2720,7 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw,
goto out_unlock_mutex;
/* Switch the PHY mode (if necessary). */
- switch (conf->channel->band) {
+ switch (conf->chandef.chan->band) {
case IEEE80211_BAND_2GHZ:
if (phy->type == B43legacy_PHYTYPE_B)
new_phymode = B43legacy_PHYMODE_B;
@@ -2748,8 +2748,9 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw,
/* Switch to the requested channel.
* The firmware takes care of races with the TX handler. */
- if (conf->channel->hw_value != phy->channel)
- b43legacy_radio_selectchannel(dev, conf->channel->hw_value, 0);
+ if (conf->chandef.chan->hw_value != phy->channel)
+ b43legacy_radio_selectchannel(dev, conf->chandef.chan->hw_value,
+ 0);
dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
@@ -3558,7 +3559,7 @@ static int b43legacy_op_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = dev->stats.link_noise;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
index 10ee314..cc87926 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
@@ -379,7 +379,7 @@ brcms_c_channel_set_chanspec(struct brcms_cm_info *wlc_cm, u16 chanspec,
u8 local_constraint_qdbm)
{
struct brcms_c_info *wlc = wlc_cm->wlc;
- struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
+ struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
struct txpwr_limits txpwr;
brcms_c_channel_reg_limits(wlc_cm, chanspec, &txpwr);
@@ -404,7 +404,7 @@ brcms_c_channel_reg_limits(struct brcms_cm_info *wlc_cm, u16 chanspec,
struct txpwr_limits *txpwr)
{
struct brcms_c_info *wlc = wlc_cm->wlc;
- struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
+ struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
uint i;
uint chan;
int maxpwr;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index aa5f43f..70731d2 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -414,10 +414,10 @@ static int brcms_ops_config(struct ieee80211_hw *hw, u32 changed)
new_int);
}
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
- if (conf->channel_type == NL80211_CHAN_HT20 ||
- conf->channel_type == NL80211_CHAN_NO_HT)
+ if (conf->chandef.width == NL80211_CHAN_WIDTH_20 ||
+ conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
err = brcms_c_set_channel(wl->wlc,
- conf->channel->hw_value);
+ conf->chandef.chan->hw_value);
else
err = -ENOTSUPP;
}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 8ef02dc..e0dc183 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -5099,7 +5099,7 @@ int brcms_c_up(struct brcms_c_info *wlc)
wlc->pub->up = true;
if (wlc->bandinit_pending) {
- ch = wlc->pub->ieee_hw->conf.channel;
+ ch = wlc->pub->ieee_hw->conf.chandef.chan;
brcms_c_suspend_mac_and_wait(wlc);
brcms_c_set_chanspec(wlc, ch20mhz_chspec(ch->hw_value));
wlc->bandinit_pending = false;
@@ -7748,7 +7748,7 @@ bool brcms_c_dpc(struct brcms_c_info *wlc, bool bounded)
void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx)
{
struct bcma_device *core = wlc->hw->d11core;
- struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
+ struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
u16 chanspec;
brcms_dbg_info(core, "wl%d\n", wlc->pub->unit);
diff --git a/drivers/net/wireless/iwlegacy/3945-rs.c b/drivers/net/wireless/iwlegacy/3945-rs.c
index d4fd29a..c9f197d 100644
--- a/drivers/net/wireless/iwlegacy/3945-rs.c
+++ b/drivers/net/wireless/iwlegacy/3945-rs.c
@@ -347,7 +347,7 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
psta = (struct il3945_sta_priv *)sta->drv_priv;
rs_sta = &psta->rs_sta;
- sband = hw->wiphy->bands[conf->channel->band];
+ sband = hw->wiphy->bands[conf->chandef.chan->band];
rs_sta->il = il;
diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c
index e8324b5..1d92a59 100644
--- a/drivers/net/wireless/iwlegacy/4965-rs.c
+++ b/drivers/net/wireless/iwlegacy/4965-rs.c
@@ -2299,7 +2299,7 @@ il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
sta_priv = (struct il_station_priv *)sta->drv_priv;
lq_sta = &sta_priv->lq_sta;
- sband = hw->wiphy->bands[conf->channel->band];
+ sband = hw->wiphy->bands[conf->chandef.chan->band];
lq_sta->lq.sta_id = sta_id;
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
index 722bfb5..025d8b0 100644
--- a/drivers/net/wireless/iwlegacy/common.c
+++ b/drivers/net/wireless/iwlegacy/common.c
@@ -4974,7 +4974,7 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
struct il_priv *il = hw->priv;
const struct il_channel_info *ch_info;
struct ieee80211_conf *conf = &hw->conf;
- struct ieee80211_channel *channel = conf->channel;
+ struct ieee80211_channel *channel = conf->chandef.chan;
struct il_ht_config *ht_conf = &il->current_ht_config;
unsigned long flags = 0;
int ret = 0;
diff --git a/drivers/net/wireless/iwlwifi/dvm/rs.c b/drivers/net/wireless/iwlwifi/dvm/rs.c
index abe3042..907bd6e 100644
--- a/drivers/net/wireless/iwlwifi/dvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/dvm/rs.c
@@ -2831,7 +2831,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
sta_priv = (struct iwl_station_priv *) sta->drv_priv;
lq_sta = &sta_priv->lq_sta;
- sband = hw->wiphy->bands[conf->channel->band];
+ sband = hw->wiphy->bands[conf->chandef.chan->band];
lq_sta->lq.sta_id = sta_id;
diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c
index 23be948..085c589 100644
--- a/drivers/net/wireless/iwlwifi/dvm/rxon.c
+++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c
@@ -78,8 +78,9 @@ void iwl_connection_init_rx_config(struct iwl_priv *priv,
ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
#endif
- ctx->staging.channel = cpu_to_le16(priv->hw->conf.channel->hw_value);
- priv->band = priv->hw->conf.channel->band;
+ ctx->staging.channel =
+ cpu_to_le16(priv->hw->conf.chandef.chan->hw_value);
+ priv->band = priv->hw->conf.chandef.chan->band;
iwl_set_flags_for_band(priv, ctx, priv->band, ctx->vif);
@@ -951,7 +952,7 @@ static void iwl_calc_basic_rates(struct iwl_priv *priv,
unsigned long basic = ctx->vif->bss_conf.basic_rates;
int i;
- sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
+ sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
for_each_set_bit(i, &basic, BITS_PER_LONG) {
int hw = sband->bitrates[i].hw_value;
@@ -1181,7 +1182,7 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
struct iwl_rxon_context *ctx;
struct ieee80211_conf *conf = &hw->conf;
- struct ieee80211_channel *channel = conf->channel;
+ struct ieee80211_channel *channel = conf->chandef.chan;
int ret = 0;
IWL_DEBUG_MAC80211(priv, "enter: changed %#x\n", changed);
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c
index 7001856..088de9d 100644
--- a/drivers/net/wireless/libertas_tf/main.c
+++ b/drivers/net/wireless/libertas_tf/main.c
@@ -412,9 +412,9 @@ static int lbtf_op_config(struct ieee80211_hw *hw, u32 changed)
struct ieee80211_conf *conf = &hw->conf;
lbtf_deb_enter(LBTF_DEB_MACOPS);
- if (conf->channel->center_freq != priv->cur_freq) {
- priv->cur_freq = conf->channel->center_freq;
- lbtf_set_channel(priv, conf->channel->hw_value);
+ if (conf->chandef.chan->center_freq != priv->cur_freq) {
+ priv->cur_freq = conf->chandef.chan->center_freq;
+ lbtf_set_channel(priv, conf->chandef.chan->hw_value);
}
lbtf_deb_leave(LBTF_DEB_MACOPS);
return 0;
@@ -537,7 +537,7 @@ static int lbtf_op_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = priv->noise;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 0064d38..4ac5486 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -1062,11 +1062,13 @@ out:
return HRTIMER_NORESTART;
}
-static const char *hwsim_chantypes[] = {
- [NL80211_CHAN_NO_HT] = "noht",
- [NL80211_CHAN_HT20] = "ht20",
- [NL80211_CHAN_HT40MINUS] = "ht40-",
- [NL80211_CHAN_HT40PLUS] = "ht40+",
+static const char * const hwsim_chanwidths[] = {
+ [NL80211_CHAN_WIDTH_20_NOHT] = "noht",
+ [NL80211_CHAN_WIDTH_20] = "ht20",
+ [NL80211_CHAN_WIDTH_40] = "ht40",
+ [NL80211_CHAN_WIDTH_80] = "vht80",
+ [NL80211_CHAN_WIDTH_80P80] = "vht80p80",
+ [NL80211_CHAN_WIDTH_160] = "vht160",
};
static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
@@ -1080,18 +1082,28 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
[IEEE80211_SMPS_DYNAMIC] = "dynamic",
};
- wiphy_debug(hw->wiphy,
- "%s (freq=%d/%s idle=%d ps=%d smps=%s)\n",
- __func__,
- conf->channel ? conf->channel->center_freq : 0,
- hwsim_chantypes[conf->channel_type],
- !!(conf->flags & IEEE80211_CONF_IDLE),
- !!(conf->flags & IEEE80211_CONF_PS),
- smps_modes[conf->smps_mode]);
+ if (conf->chandef.chan)
+ wiphy_debug(hw->wiphy,
+ "%s (freq=%d(%d - %d)/%s idle=%d ps=%d smps=%s)\n",
+ __func__,
+ conf->chandef.chan->center_freq,
+ conf->chandef.center_freq1,
+ conf->chandef.center_freq2,
+ hwsim_chanwidths[conf->chandef.width],
+ !!(conf->flags & IEEE80211_CONF_IDLE),
+ !!(conf->flags & IEEE80211_CONF_PS),
+ smps_modes[conf->smps_mode]);
+ else
+ wiphy_debug(hw->wiphy,
+ "%s (freq=0 idle=%d ps=%d smps=%s)\n",
+ __func__,
+ !!(conf->flags & IEEE80211_CONF_IDLE),
+ !!(conf->flags & IEEE80211_CONF_PS),
+ smps_modes[conf->smps_mode]);
data->idle = !!(conf->flags & IEEE80211_CONF_IDLE);
- data->channel = conf->channel;
+ data->channel = conf->chandef.chan;
WARN_ON(data->channel && channels > 1);
@@ -1277,7 +1289,7 @@ static int mac80211_hwsim_get_survey(
return -ENOENT;
/* Current channel */
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
/*
* Magically conjured noise level --- this is only ok for simulated hardware.
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 091d9a6..9f9a144 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -2837,7 +2837,9 @@ static int mwl8k_cmd_tx_power(struct ieee80211_hw *hw,
struct ieee80211_conf *conf,
unsigned short pwr)
{
- struct ieee80211_channel *channel = conf->channel;
+ struct ieee80211_channel *channel = conf->chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&conf->chandef);
struct mwl8k_cmd_tx_power *cmd;
int rc;
int i;
@@ -2857,14 +2859,14 @@ static int mwl8k_cmd_tx_power(struct ieee80211_hw *hw,
cmd->channel = cpu_to_le16(channel->hw_value);
- if (conf->channel_type == NL80211_CHAN_NO_HT ||
- conf->channel_type == NL80211_CHAN_HT20) {
+ if (channel_type == NL80211_CHAN_NO_HT ||
+ channel_type == NL80211_CHAN_HT20) {
cmd->bw = cpu_to_le16(0x2);
} else {
cmd->bw = cpu_to_le16(0x4);
- if (conf->channel_type == NL80211_CHAN_HT40MINUS)
+ if (channel_type == NL80211_CHAN_HT40MINUS)
cmd->sub_ch = cpu_to_le16(0x3);
- else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
+ else if (channel_type == NL80211_CHAN_HT40PLUS)
cmd->sub_ch = cpu_to_le16(0x1);
}
@@ -3008,7 +3010,9 @@ struct mwl8k_cmd_set_rf_channel {
static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
struct ieee80211_conf *conf)
{
- struct ieee80211_channel *channel = conf->channel;
+ struct ieee80211_channel *channel = conf->chandef.chan;
+ enum nl80211_channel_type channel_type =
+ cfg80211_get_chandef_type(&conf->chandef);
struct mwl8k_cmd_set_rf_channel *cmd;
int rc;
@@ -3026,12 +3030,12 @@ static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
else if (channel->band == IEEE80211_BAND_5GHZ)
cmd->channel_flags |= cpu_to_le32(0x00000004);
- if (conf->channel_type == NL80211_CHAN_NO_HT ||
- conf->channel_type == NL80211_CHAN_HT20)
+ if (channel_type == NL80211_CHAN_NO_HT ||
+ channel_type == NL80211_CHAN_HT20)
cmd->channel_flags |= cpu_to_le32(0x00000080);
- else if (conf->channel_type == NL80211_CHAN_HT40MINUS)
+ else if (channel_type == NL80211_CHAN_HT40MINUS)
cmd->channel_flags |= cpu_to_le32(0x000001900);
- else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
+ else if (channel_type == NL80211_CHAN_HT40PLUS)
cmd->channel_flags |= cpu_to_le32(0x000000900);
rc = mwl8k_post_cmd(hw, &cmd->header);
@@ -3950,7 +3954,7 @@ static int mwl8k_cmd_set_new_stn_add(struct ieee80211_hw *hw,
memcpy(cmd->mac_addr, sta->addr, ETH_ALEN);
cmd->stn_id = cpu_to_le16(sta->aid);
cmd->action = cpu_to_le16(MWL8K_STA_ACTION_ADD);
- if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
+ if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
else
rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
@@ -4385,7 +4389,7 @@ static int mwl8k_cmd_update_stadb_add(struct ieee80211_hw *hw,
p->ht_caps = cpu_to_le16(sta->ht_cap.cap);
p->extended_ht_caps = (sta->ht_cap.ampdu_factor & 3) |
((sta->ht_cap.ampdu_density & 7) << 2);
- if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
+ if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
else
rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
@@ -4868,7 +4872,7 @@ mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
goto out;
}
- if (hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
+ if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
ap_legacy_rates = ap->supp_rates[IEEE80211_BAND_2GHZ];
} else {
ap_legacy_rates =
@@ -4900,7 +4904,7 @@ mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
if (idx)
idx--;
- if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
+ if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
rate = mwl8k_rates_24[idx].hw_value;
else
rate = mwl8k_rates_50[idx].hw_value;
@@ -4973,7 +4977,7 @@ mwl8k_bss_info_changed_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
if (idx)
idx--;
- if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
+ if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
rate = mwl8k_rates_24[idx].hw_value;
else
rate = mwl8k_rates_50[idx].hw_value;
@@ -5246,7 +5250,7 @@ static int mwl8k_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = priv->noise;
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
index 9ba8510..b3879fb 100644
--- a/drivers/net/wireless/p54/fwio.c
+++ b/drivers/net/wireless/p54/fwio.c
@@ -402,7 +402,7 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell)
struct p54_rssi_db_entry *rssi_data;
unsigned int i;
void *entry;
- __le16 freq = cpu_to_le16(priv->hw->conf.channel->center_freq);
+ __le16 freq = cpu_to_le16(priv->hw->conf.chandef.chan->center_freq);
skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*head) +
2 + sizeof(*iq_autocal) + sizeof(*body) +
@@ -532,7 +532,7 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell)
err:
wiphy_err(priv->hw->wiphy, "frequency change to channel %d failed.\n",
ieee80211_frequency_to_channel(
- priv->hw->conf.channel->center_freq));
+ priv->hw->conf.chandef.chan->center_freq));
dev_kfree_skb_any(skb);
return -EINVAL;
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
index ee654a6..067e6f2 100644
--- a/drivers/net/wireless/p54/main.c
+++ b/drivers/net/wireless/p54/main.c
@@ -340,7 +340,7 @@ static int p54_config(struct ieee80211_hw *dev, u32 changed)
* TODO: Use the LM_SCAN_TRAP to determine the current
* operating channel.
*/
- priv->curchan = priv->hw->conf.channel;
+ priv->curchan = priv->hw->conf.chandef.chan;
p54_reset_stats(priv);
WARN_ON(p54_fetch_statistics(priv));
}
@@ -480,7 +480,7 @@ static void p54_bss_info_changed(struct ieee80211_hw *dev,
p54_set_edcf(priv);
}
if (changed & BSS_CHANGED_BASIC_RATES) {
- if (dev->conf.channel->band == IEEE80211_BAND_5GHZ)
+ if (dev->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
priv->basic_rate_mask = (info->basic_rates << 4);
else
priv->basic_rate_mask = info->basic_rates;
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
index 12f0a34..f95de0d 100644
--- a/drivers/net/wireless/p54/txrx.c
+++ b/drivers/net/wireless/p54/txrx.c
@@ -354,13 +354,13 @@ static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb)
rx_status->signal = p54_rssi_to_dbm(priv, hdr->rssi);
if (hdr->rate & 0x10)
rx_status->flag |= RX_FLAG_SHORTPRE;
- if (priv->hw->conf.channel->band == IEEE80211_BAND_5GHZ)
+ if (priv->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
rx_status->rate_idx = (rate < 4) ? 0 : rate - 4;
else
rx_status->rate_idx = rate;
rx_status->freq = freq;
- rx_status->band = priv->hw->conf.channel->band;
+ rx_status->band = priv->hw->conf.chandef.chan->band;
rx_status->antenna = hdr->antenna;
tsf32 = le32_to_cpu(hdr->tsf32);
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index a658b4b..34456b4 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2763,7 +2763,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
{
- rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.channel,
+ rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
rt2x00dev->tx_power);
}
EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
@@ -2898,11 +2898,11 @@ void rt2800_config(struct rt2x00_dev *rt2x00dev,
if (flags & IEEE80211_CONF_CHANGE_CHANNEL) {
rt2800_config_channel(rt2x00dev, libconf->conf,
&libconf->rf, &libconf->channel);
- rt2800_config_txpower(rt2x00dev, libconf->conf->channel,
+ rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
libconf->conf->power_level);
}
if (flags & IEEE80211_CONF_CHANGE_POWER)
- rt2800_config_txpower(rt2x00dev, libconf->conf->channel,
+ rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
libconf->conf->power_level);
if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
rt2800_config_retry_limit(rt2x00dev, libconf);
@@ -5563,7 +5563,7 @@ int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
rt2800_register_read(rt2x00dev, CH_IDLE_STA, &idle);
rt2800_register_read(rt2x00dev, CH_BUSY_STA, &busy);
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index 49a63e9..8cb43f8 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -184,7 +184,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
/*
* Initialize center channel to current channel.
*/
- center_channel = spec->channels[conf->channel->hw_value].channel;
+ center_channel = spec->channels[conf->chandef.chan->hw_value].channel;
/*
* Adjust center channel to HT40+ and HT40- operation.
@@ -199,7 +199,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
return i;
WARN_ON(1);
- return conf->channel->hw_value;
+ return conf->chandef.chan->hw_value;
}
void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
@@ -227,7 +227,7 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
hw_value = rt2x00ht_center_channel(rt2x00dev, conf);
} else {
clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
- hw_value = conf->channel->hw_value;
+ hw_value = conf->chandef.chan->hw_value;
}
memcpy(&libconf.rf,
@@ -279,8 +279,8 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
else
clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
- rt2x00dev->curr_band = conf->channel->band;
- rt2x00dev->curr_freq = conf->channel->center_freq;
+ rt2x00dev->curr_band = conf->chandef.chan->band;
+ rt2x00dev->curr_freq = conf->chandef.chan->center_freq;
rt2x00dev->tx_power = conf->power_level;
rt2x00dev->short_retry = conf->short_frame_max_tx_count;
rt2x00dev->long_retry = conf->long_frame_max_tx_count;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index f95792c..f85035c 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -847,7 +847,7 @@ static void rt61pci_config_lna_gain(struct rt2x00_dev *rt2x00dev,
u16 eeprom;
short lna_gain = 0;
- if (libconf->conf->channel->band == IEEE80211_BAND_2GHZ) {
+ if (libconf->conf->chandef.chan->band == IEEE80211_BAND_2GHZ) {
if (test_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags))
lna_gain += 14;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 24eec66..a3387b1 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -739,7 +739,7 @@ static void rt73usb_config_lna_gain(struct rt2x00_dev *rt2x00dev,
u16 eeprom;
short lna_gain = 0;
- if (libconf->conf->channel->band == IEEE80211_BAND_2GHZ) {
+ if (libconf->conf->chandef.chan->band == IEEE80211_BAND_2GHZ) {
if (test_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags))
lna_gain += 14;
diff --git a/drivers/net/wireless/rtl818x/rtl8180/dev.c b/drivers/net/wireless/rtl818x/rtl8180/dev.c
index 1b3c284..91a04e2 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
@@ -147,8 +147,8 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
signal = priv->rf->calc_rssi(agc, sq);
}
rx_status.signal = signal;
- rx_status.freq = dev->conf.channel->center_freq;
- rx_status.band = dev->conf.channel->band;
+ rx_status.freq = dev->conf.chandef.chan->center_freq;
+ rx_status.band = dev->conf.chandef.chan->band;
rx_status.mactime = le64_to_cpu(entry->tsft);
rx_status.flag |= RX_FLAG_MACTIME_START;
if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
diff --git a/drivers/net/wireless/rtl818x/rtl8180/grf5101.c b/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
index 5ee7589..077ff92 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
@@ -82,7 +82,8 @@ static void grf5101_rf_set_channel(struct ieee80211_hw *dev,
struct ieee80211_conf *conf)
{
struct rtl8180_priv *priv = dev->priv;
- int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ int channel =
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
u32 txpw = priv->channels[channel - 1].hw_value & 0xFF;
u32 chan = channel - 1;
diff --git a/drivers/net/wireless/rtl818x/rtl8180/max2820.c b/drivers/net/wireless/rtl818x/rtl8180/max2820.c
index 667b336..4715000 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/max2820.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/max2820.c
@@ -95,7 +95,7 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev,
{
struct rtl8180_priv *priv = dev->priv;
int channel = conf ?
- ieee80211_frequency_to_channel(conf->channel->center_freq) : 1;
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq) : 1;
unsigned int chan_idx = channel - 1;
u32 txpw = priv->channels[chan_idx].hw_value & 0xFF;
u32 chan = max2820_chan[chan_idx];
diff --git a/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c b/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
index 7c4574b..cc2a541 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
@@ -719,7 +719,8 @@ static void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
struct ieee80211_conf *conf)
{
struct rtl8180_priv *priv = dev->priv;
- int chan = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ int chan =
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
if (priv->rf->init == rtl8225_rf_init)
rtl8225_rf_set_tx_power(dev, chan);
diff --git a/drivers/net/wireless/rtl818x/rtl8180/sa2400.c b/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
index 44771a62..b3ec40f 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
@@ -105,7 +105,8 @@ static void sa2400_rf_set_channel(struct ieee80211_hw *dev,
struct ieee80211_conf *conf)
{
struct rtl8180_priv *priv = dev->priv;
- int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ int channel =
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
u32 txpw = priv->channels[channel - 1].hw_value & 0xFF;
u32 chan = sa2400_chan[channel - 1];
diff --git a/drivers/net/wireless/rtl818x/rtl8187/dev.c b/drivers/net/wireless/rtl818x/rtl8187/dev.c
index 4574bd2..f49220e 100644
--- a/drivers/net/wireless/rtl818x/rtl8187/dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c
@@ -379,8 +379,8 @@ static void rtl8187_rx_cb(struct urb *urb)
rate = (flags >> 20) & 0xF;
skb_trim(skb, flags & 0x0FFF);
rx_status.rate_idx = rate;
- rx_status.freq = dev->conf.channel->center_freq;
- rx_status.band = dev->conf.channel->band;
+ rx_status.freq = dev->conf.chandef.chan->center_freq;
+ rx_status.band = dev->conf.chandef.chan->band;
rx_status.flag |= RX_FLAG_MACTIME_START;
if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
diff --git a/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c b/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
index 908903f..f0bf35f 100644
--- a/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
+++ b/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
@@ -905,7 +905,8 @@ static void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
struct ieee80211_conf *conf)
{
struct rtl8187_priv *priv = dev->priv;
- int chan = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ int chan =
+ ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
if (priv->rf->init == rtl8225_rf_init)
rtl8225_rf_set_tx_power(dev, chan);
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 99c5cea..0e7866d 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -691,7 +691,7 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
int rate_idx;
if (false == isht) {
- if (IEEE80211_BAND_2GHZ == hw->conf.channel->band) {
+ if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
switch (desc_rate) {
case DESC92_RATE1M:
rate_idx = 0;
@@ -1365,7 +1365,7 @@ int rtl_send_smps_action(struct ieee80211_hw *hw,
rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
info->control.rates[0].idx = 0;
- info->band = hw->conf.channel->band;
+ info->band = hw->conf.chandef.chan->band;
rtlpriv->intf_ops->adapter_tx(hw, sta, skb, &tcb_desc);
}
err_free:
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index b5a7a26..64a41ec 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -320,7 +320,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
}
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
- struct ieee80211_channel *channel = hw->conf.channel;
+ struct ieee80211_channel *channel = hw->conf.chandef.chan;
u8 wide_chan = (u8) channel->hw_value;
/*
@@ -332,7 +332,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
*info for cisco1253 bw20, so we modify
*it here based on UPPER & LOWER
*/
- switch (hw->conf.channel_type) {
+ switch (cfg80211_get_chandef_type(&hw->conf.chandef)) {
case NL80211_CHAN_HT20:
case NL80211_CHAN_NO_HT:
/* SC */
@@ -390,7 +390,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
rtlpriv->cfg->ops->switch_channel(hw);
rtlpriv->cfg->ops->set_channel_access(hw);
rtlpriv->cfg->ops->set_bw_mode(hw,
- hw->conf.channel_type);
+ cfg80211_get_chandef_type(&hw->conf.chandef));
}
mutex_unlock(&rtlpriv->locks.conf_mutex);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
index b9b1a6e..27e4ebd 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
@@ -544,8 +544,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
if (GET_RX_DESC_CRC32(pdesc))
rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
index b6222ee..f0dada5 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
@@ -324,8 +324,8 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
&& (GET_RX_DESC_FAGGR(pdesc) == 1));
stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
if (GET_RX_DESC_CRC32(pdesc))
rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
if (!GET_RX_DESC_SWDEC(pdesc))
@@ -395,8 +395,8 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
stats.rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(rxdesc);
/* TODO: is center_freq changed when doing scan? */
/* TODO: Shall we add protection or just skip those two step? */
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
if (GET_RX_DESC_CRC32(rxdesc))
rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
if (!GET_RX_DESC_SWDEC(rxdesc))
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
index 941080e..b8ec718 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
@@ -499,8 +499,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
&& (GET_RX_DESC_FAGGR(pdesc) == 1));
stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
if (GET_RX_DESC_CRC32(pdesc))
rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
if (!GET_RX_DESC_SWDEC(pdesc))
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
index 7b0a2e7..0b074f1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
@@ -538,8 +538,8 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
if (stats->hwerror)
return false;
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
hdr = (struct ieee80211_hdr *)(skb->data + stats->rx_drvinfo_size
+ stats->rx_bufshift);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
index ac08129..601261d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
@@ -304,8 +304,8 @@ bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw,
status->is_cck = RTL8723E_RX_HAL_IS_CCK_RATE(status->rate);
- rx_status->freq = hw->conf.channel->center_freq;
- rx_status->band = hw->conf.channel->band;
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
+ status->rx_bufshift);
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index bbbf68c..3291ffa 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -572,7 +572,8 @@ static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
struct ieee80211_conf *conf = &hw->conf;
int channel, ret = 0;
- channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ channel = ieee80211_frequency_to_channel(
+ conf->chandef.chan->center_freq);
wl1251_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d",
channel,
@@ -1223,7 +1224,7 @@ static int wl1251_op_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = wl->noise;
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index a9f7041..c26cb09 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -4474,7 +4474,7 @@ static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
if (idx != 0)
return -ENOENT;
- survey->channel = conf->channel;
+ survey->channel = conf->chandef.chan;
survey->filled = 0;
return 0;
}
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
index 114364b..c6208a7 100644
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -1156,10 +1156,10 @@ static int zd_op_config(struct ieee80211_hw *hw, u32 changed)
struct ieee80211_conf *conf = &hw->conf;
spin_lock_irq(&mac->lock);
- mac->channel = conf->channel->hw_value;
+ mac->channel = conf->chandef.chan->hw_value;
spin_unlock_irq(&mac->lock);
- return zd_chip_set_channel(&mac->chip, conf->channel->hw_value);
+ return zd_chip_set_channel(&mac->chip, conf->chandef.chan->hw_value);
}
static void zd_beacon_done(struct zd_mac *mac)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 23a275a..00390fb 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -974,8 +974,7 @@ enum ieee80211_smps_mode {
* @power_level: requested transmit power (in dBm), backward compatibility
* value only that is set to the minimum of all interfaces
*
- * @channel: the channel to tune to
- * @channel_type: the channel (HT) type
+ * @chandef: the channel to tune to
* @radar_enabled: whether radar detection is enabled
*
* @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
@@ -1001,8 +1000,7 @@ struct ieee80211_conf {
u8 long_frame_max_tx_count, short_frame_max_tx_count;
- struct ieee80211_channel *channel;
- enum nl80211_channel_type channel_type;
+ struct cfg80211_chan_def chandef;
bool radar_enabled;
enum ieee80211_smps_mode smps_mode;
};
@@ -4216,31 +4214,33 @@ void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
static inline bool
conf_is_ht20(struct ieee80211_conf *conf)
{
- return conf->channel_type == NL80211_CHAN_HT20;
+ return conf->chandef.width == NL80211_CHAN_WIDTH_20;
}
static inline bool
conf_is_ht40_minus(struct ieee80211_conf *conf)
{
- return conf->channel_type == NL80211_CHAN_HT40MINUS;
+ return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
+ conf->chandef.center_freq1 < conf->chandef.chan->center_freq;
}
static inline bool
conf_is_ht40_plus(struct ieee80211_conf *conf)
{
- return conf->channel_type == NL80211_CHAN_HT40PLUS;
+ return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
+ conf->chandef.center_freq1 > conf->chandef.chan->center_freq;
}
static inline bool
conf_is_ht40(struct ieee80211_conf *conf)
{
- return conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf);
+ return conf->chandef.width == NL80211_CHAN_WIDTH_40;
}
static inline bool
conf_is_ht(struct ieee80211_conf *conf)
{
- return conf->channel_type != NL80211_CHAN_NO_HT;
+ return conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
}
static inline enum nl80211_iftype
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 50aaf25..6e43feb 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -805,8 +805,7 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
IEEE80211_CHANCTX_EXCLUSIVE);
}
} else if (local->open_count == local->monitors) {
- local->_oper_channel = chandef->chan;
- local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
+ local->_oper_chandef = *chandef;
ieee80211_hw_config(local, 0);
}
@@ -3373,9 +3372,7 @@ static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
if (local->use_chanctx)
*chandef = local->monitor_chandef;
else
- cfg80211_chandef_create(chandef,
- local->_oper_channel,
- local->_oper_channel_type);
+ *chandef = local->_oper_chandef;
ret = 0;
}
rcu_read_unlock();
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
index 78c0d90..8024874 100644
--- a/net/mac80211/chan.c
+++ b/net/mac80211/chan.c
@@ -22,7 +22,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,
drv_change_chanctx(local, ctx, IEEE80211_CHANCTX_CHANGE_WIDTH);
if (!local->use_chanctx) {
- local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
+ local->_oper_chandef = *chandef;
ieee80211_hw_config(local, 0);
}
}
@@ -77,9 +77,7 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
ctx->mode = mode;
if (!local->use_chanctx) {
- local->_oper_channel_type =
- cfg80211_get_chandef_type(chandef);
- local->_oper_channel = chandef->chan;
+ local->_oper_chandef = *chandef;
ieee80211_hw_config(local, 0);
} else {
err = drv_add_chanctx(local, ctx);
@@ -106,7 +104,10 @@ static void ieee80211_free_chanctx(struct ieee80211_local *local,
WARN_ON_ONCE(ctx->refcount != 0);
if (!local->use_chanctx) {
- local->_oper_channel_type = NL80211_CHAN_NO_HT;
+ struct cfg80211_chan_def *chandef = &local->_oper_chandef;
+ chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
+ chandef->center_freq1 = chandef->chan->center_freq;
+ chandef->center_freq2 = 0;
ieee80211_hw_config(local, 0);
} else {
drv_remove_chanctx(local, ctx);
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index c7f8b8b..f9782f0 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1021,8 +1021,7 @@ struct ieee80211_local {
struct ieee80211_sub_if_data __rcu *scan_sdata;
struct ieee80211_channel *csa_channel;
/* For backward compatibility only -- do not use */
- struct ieee80211_channel *_oper_channel;
- enum nl80211_channel_type _oper_channel_type;
+ struct cfg80211_chan_def _oper_chandef;
/* Temporary remain-on-channel for off-channel operations */
struct ieee80211_channel *tmp_channel;
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index b0d2868..a16b037 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -95,42 +95,47 @@ static void ieee80211_reconfig_filter(struct work_struct *work)
static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local)
{
struct ieee80211_sub_if_data *sdata;
- struct ieee80211_channel *chan;
+ struct cfg80211_chan_def chandef = {};
u32 changed = 0;
int power;
- enum nl80211_channel_type channel_type;
u32 offchannel_flag;
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
+
if (local->scan_channel) {
- chan = local->scan_channel;
+ chandef.chan = local->scan_channel;
/* If scanning on oper channel, use whatever channel-type
* is currently in use.
*/
- if (chan == local->_oper_channel)
- channel_type = local->_oper_channel_type;
- else
- channel_type = NL80211_CHAN_NO_HT;
+ if (chandef.chan == local->_oper_chandef.chan) {
+ chandef = local->_oper_chandef;
+ } else {
+ chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
+ chandef.center_freq1 = chandef.chan->center_freq;
+ }
} else if (local->tmp_channel) {
- chan = local->tmp_channel;
- channel_type = NL80211_CHAN_NO_HT;
- } else {
- chan = local->_oper_channel;
- channel_type = local->_oper_channel_type;
- }
-
- if (chan != local->_oper_channel ||
- channel_type != local->_oper_channel_type)
+ chandef.chan = local->tmp_channel;
+ chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
+ chandef.center_freq1 = chandef.chan->center_freq;
+ } else
+ chandef = local->_oper_chandef;
+
+ WARN(!cfg80211_chandef_valid(&chandef),
+ "control:%d MHz width:%d center: %d/%d MHz",
+ chandef.chan->center_freq, chandef.width,
+ chandef.center_freq1, chandef.center_freq2);
+
+ if (!cfg80211_chandef_identical(&chandef, &local->_oper_chandef))
local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL;
else
local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL;
offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
- if (offchannel_flag || chan != local->hw.conf.channel ||
- channel_type != local->hw.conf.channel_type) {
- local->hw.conf.channel = chan;
- local->hw.conf.channel_type = channel_type;
+ if (offchannel_flag ||
+ !cfg80211_chandef_identical(&local->hw.conf.chandef,
+ &local->_oper_chandef)) {
+ local->hw.conf.chandef = chandef;
changed |= IEEE80211_CONF_CHANGE_CHANNEL;
}
@@ -146,7 +151,7 @@ static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local)
changed |= IEEE80211_CONF_CHANGE_SMPS;
}
- power = chan->max_power;
+ power = chandef.chan->max_power;
rcu_read_lock();
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
@@ -740,11 +745,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
sband = local->hw.wiphy->bands[band];
if (!sband)
continue;
- if (!local->use_chanctx && !local->_oper_channel) {
+ if (!local->use_chanctx && !local->_oper_chandef.chan) {
/* init channel we're on */
- local->hw.conf.channel =
- local->_oper_channel = &sband->channels[0];
- local->hw.conf.channel_type = NL80211_CHAN_NO_HT;
+ struct cfg80211_chan_def chandef = {
+ .chan = &sband->channels[0],
+ .width = NL80211_CHAN_NO_HT,
+ .center_freq1 = sband->channels[0].center_freq,
+ .center_freq2 = 0
+ };
+ local->hw.conf.chandef = local->_oper_chandef = chandef;
}
cfg80211_chandef_create(&local->monitor_chandef,
&sband->channels[0],
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 9958cb7..237e2ef 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -988,6 +988,7 @@ static void ieee80211_chswitch_work(struct work_struct *work)
{
struct ieee80211_sub_if_data *sdata =
container_of(work, struct ieee80211_sub_if_data, u.mgd.chswitch_work);
+ struct ieee80211_local *local = sdata->local;
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
if (!ieee80211_sdata_running(sdata))
@@ -997,21 +998,30 @@ static void ieee80211_chswitch_work(struct work_struct *work)
if (!ifmgd->associated)
goto out;
- sdata->local->_oper_channel = sdata->local->csa_channel;
- if (!sdata->local->ops->channel_switch) {
+ /*
+ * FIXME: Here we are downgrading to NL80211_CHAN_WIDTH_20_NOHT
+ * and don't adjust our ht/vht settings
+ * This is wrong - we should behave according to the CSA params
+ */
+ local->_oper_chandef.chan = local->csa_channel;
+ local->_oper_chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
+ local->_oper_chandef.center_freq1 =
+ local->_oper_chandef.chan->center_freq;
+ local->_oper_chandef.center_freq2 = 0;
+
+ if (!local->ops->channel_switch) {
/* call "hw_config" only if doing sw channel switch */
- ieee80211_hw_config(sdata->local,
- IEEE80211_CONF_CHANGE_CHANNEL);
+ ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
} else {
/* update the device channel directly */
- sdata->local->hw.conf.channel = sdata->local->_oper_channel;
+ local->hw.conf.chandef = local->_oper_chandef;
}
/* XXX: shouldn't really modify cfg80211-owned data! */
- ifmgd->associated->channel = sdata->local->_oper_channel;
+ ifmgd->associated->channel = local->_oper_chandef.chan;
/* XXX: wait for a beacon first? */
- ieee80211_wake_queues_by_reason(&sdata->local->hw,
+ ieee80211_wake_queues_by_reason(&local->hw,
IEEE80211_MAX_QUEUE_MAP,
IEEE80211_QUEUE_STOP_REASON_CSA);
out:
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index cb34cbb..581764f 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -384,7 +384,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
{
int i;
struct ieee80211_sub_if_data *sdata;
- enum ieee80211_band band = local->hw.conf.channel->band;
+ enum ieee80211_band band = local->hw.conf.chandef.chan->band;
u32 tx_flags;
tx_flags = IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
@@ -401,7 +401,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
local->scan_req->ssids[i].ssid_len,
local->scan_req->ie, local->scan_req->ie_len,
local->scan_req->rates[band], false,
- tx_flags, local->hw.conf.channel, true);
+ tx_flags, local->hw.conf.chandef.chan, true);
/*
* After sending probe requests, wait for probe responses
@@ -467,7 +467,7 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
if (local->ops->hw_scan) {
__set_bit(SCAN_HW_SCANNING, &local->scanning);
} else if ((req->n_channels == 1) &&
- (req->channels[0] == local->_oper_channel)) {
+ (req->channels[0] == local->_oper_chandef.chan)) {
/*
* If we are scanning only on the operating channel
* then we do not need to stop normal activities
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index d79e374..8286dce 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -28,27 +28,27 @@
#define VIF_PR_FMT " vif:%s(%d%s)"
#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
-#define CHANDEF_ENTRY __field(u32, control_freq) \
- __field(u32, chan_width) \
- __field(u32, center_freq1) \
+#define CHANDEF_ENTRY __field(u32, control_freq) \
+ __field(u32, chan_width) \
+ __field(u32, center_freq1) \
__field(u32, center_freq2)
-#define CHANDEF_ASSIGN(c) \
- __entry->control_freq = (c)->chan->center_freq; \
- __entry->chan_width = (c)->width; \
- __entry->center_freq1 = (c)->center_freq1; \
+#define CHANDEF_ASSIGN(c) \
+ __entry->control_freq = (c)->chan ? (c)->chan->center_freq : 0; \
+ __entry->chan_width = (c)->width; \
+ __entry->center_freq1 = (c)->center_freq1; \
__entry->center_freq2 = (c)->center_freq2;
#define CHANDEF_PR_FMT " control:%d MHz width:%d center: %d/%d MHz"
-#define CHANDEF_PR_ARG __entry->control_freq, __entry->chan_width, \
+#define CHANDEF_PR_ARG __entry->control_freq, __entry->chan_width, \
__entry->center_freq1, __entry->center_freq2
-#define CHANCTX_ENTRY CHANDEF_ENTRY \
- __field(u8, rx_chains_static) \
+#define CHANCTX_ENTRY CHANDEF_ENTRY \
+ __field(u8, rx_chains_static) \
__field(u8, rx_chains_dynamic)
-#define CHANCTX_ASSIGN CHANDEF_ASSIGN(&ctx->conf.def) \
- __entry->rx_chains_static = ctx->conf.rx_chains_static; \
+#define CHANCTX_ASSIGN CHANDEF_ASSIGN(&ctx->conf.def) \
+ __entry->rx_chains_static = ctx->conf.rx_chains_static; \
__entry->rx_chains_dynamic = ctx->conf.rx_chains_dynamic
#define CHANCTX_PR_FMT CHANDEF_PR_FMT " chains:%d/%d"
-#define CHANCTX_PR_ARG CHANDEF_PR_ARG, \
+#define CHANCTX_PR_ARG CHANDEF_PR_ARG, \
__entry->rx_chains_static, __entry->rx_chains_dynamic
@@ -286,8 +286,7 @@ TRACE_EVENT(drv_config,
__field(u16, listen_interval)
__field(u8, long_frame_max_tx_count)
__field(u8, short_frame_max_tx_count)
- __field(int, center_freq)
- __field(int, channel_type)
+ CHANDEF_ENTRY
__field(int, smps)
),
@@ -303,15 +302,13 @@ TRACE_EVENT(drv_config,
local->hw.conf.long_frame_max_tx_count;
__entry->short_frame_max_tx_count =
local->hw.conf.short_frame_max_tx_count;
- __entry->center_freq = local->hw.conf.channel ?
- local->hw.conf.channel->center_freq : 0;
- __entry->channel_type = local->hw.conf.channel_type;
+ CHANDEF_ASSIGN(&local->hw.conf.chandef)
__entry->smps = local->hw.conf.smps_mode;
),
TP_printk(
- LOCAL_PR_FMT " ch:%#x freq:%d",
- LOCAL_PR_ARG, __entry->changed, __entry->center_freq
+ LOCAL_PR_FMT " ch:%#x" CHANDEF_PR_FMT,
+ LOCAL_PR_ARG, __entry->changed, CHANDEF_PR_ARG
)
);
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 4a83d8d..aad0bf5 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1709,7 +1709,7 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
if (chanctx_conf)
chan = chanctx_conf->def.chan;
else if (!local->use_chanctx)
- chan = local->_oper_channel;
+ chan = local->_oper_chandef.chan;
else
goto fail_rcu;
@@ -1843,7 +1843,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
* This is the exception! WDS style interfaces are prohibited
* when channel contexts are in used so this must be valid
*/
- band = local->hw.conf.channel->band;
+ band = local->hw.conf.chandef.chan->band;
break;
#ifdef CONFIG_MAC80211_MESH
case NL80211_IFTYPE_MESH_POINT:
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 90cc2b8..1734cd2 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2171,8 +2171,7 @@ void ieee80211_dfs_radar_detected_work(struct work_struct *work)
/* currently not handled */
WARN_ON(1);
else {
- cfg80211_chandef_create(&chandef, local->hw.conf.channel,
- local->hw.conf.channel_type);
+ chandef = local->hw.conf.chandef;
cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
}
}
--
1.7.9.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/3] Let drivers not supporting channel contexts use VHT
2013-03-25 20:51 [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
2013-03-25 20:51 ` [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan Karl Beldan
@ 2013-03-25 20:51 ` Karl Beldan
2013-03-25 20:51 ` [PATCH v2 3/3] mac80211_hwsim: advertise VHT support also when channels == 1 Karl Beldan
2013-03-25 21:35 ` [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
3 siblings, 0 replies; 6+ messages in thread
From: Karl Beldan @ 2013-03-25 20:51 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, fengguang.wu, Karl Beldan, Karl Beldan
From: Karl Beldan <karl.beldan@rivierawaves.com>
It is possible since the global hw config and local switched to
cfg80211_chan_def.
Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
---
net/mac80211/main.c | 14 +-------------
1 files changed, 1 insertions(+), 13 deletions(-)
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index a16b037..52136fd 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -840,22 +840,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
if (supp_ht)
local->scan_ies_len += 2 + sizeof(struct ieee80211_ht_cap);
- if (supp_vht) {
+ if (supp_vht)
local->scan_ies_len +=
2 + sizeof(struct ieee80211_vht_cap);
- /*
- * (for now at least), drivers wanting to use VHT must
- * support channel contexts, as they contain all the
- * necessary VHT information and the global hw config
- * doesn't (yet)
- */
- if (WARN_ON(!local->use_chanctx)) {
- result = -EINVAL;
- goto fail_wiphy_register;
- }
- }
-
if (!local->ops->hw_scan) {
/* For hw_scan, driver needs to set these up. */
local->hw.wiphy->max_scan_ssids = 4;
--
1.7.9.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/3] mac80211_hwsim: advertise VHT support also when channels == 1
2013-03-25 20:51 [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
2013-03-25 20:51 ` [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan Karl Beldan
2013-03-25 20:51 ` [PATCH v2 2/3] Let drivers not supporting channel contexts use VHT Karl Beldan
@ 2013-03-25 20:51 ` Karl Beldan
2013-03-25 21:35 ` [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
3 siblings, 0 replies; 6+ messages in thread
From: Karl Beldan @ 2013-03-25 20:51 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, fengguang.wu, Karl Beldan, Karl Beldan
From: Karl Beldan <karl.beldan@rivierawaves.com>
Drivers can now advertise VHT support even if they don't use channel
contexts.
Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
---
drivers/net/wireless/mac80211_hwsim.c | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 4ac5486..70b6ce6 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2310,9 +2310,6 @@ static int __init init_mac80211_hwsim(void)
hw->wiphy->bands[band] = sband;
- if (channels == 1)
- continue;
-
sband->vht_cap.vht_supported = true;
sband->vht_cap.cap =
IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
--
1.7.9.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan
2013-03-25 20:51 ` [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan Karl Beldan
@ 2013-03-25 21:11 ` Gertjan van Wingerde
0 siblings, 0 replies; 6+ messages in thread
From: Gertjan van Wingerde @ 2013-03-25 21:11 UTC (permalink / raw)
To: Karl Beldan
Cc: Johannes Berg, linux-wireless, fengguang.wu@intel.com,
Karl Beldan, Karl Beldan
Sent from my iPad
On 25 mrt. 2013, at 21:51, Karl Beldan <karl.beldan@gmail.com> wrote:
> From: Karl Beldan <karl.beldan@rivierawaves.com>
>
> 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>
For the rt2x00 parts:
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
> ---
> drivers/net/wireless/adm8211.c | 3 +-
> drivers/net/wireless/at76c50x-usb.c | 4 +-
> drivers/net/wireless/ath/ar5523/ar5523.c | 14 ++--
> drivers/net/wireless/ath/ath5k/base.c | 2 +-
> drivers/net/wireless/ath/ath5k/mac80211-ops.c | 4 +-
> drivers/net/wireless/ath/ath9k/beacon.c | 2 +-
> drivers/net/wireless/ath/ath9k/calib.c | 2 +-
> drivers/net/wireless/ath/ath9k/common.c | 5 +-
> drivers/net/wireless/ath/ath9k/htc_drv_main.c | 16 +++--
> drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 8 +-
> drivers/net/wireless/ath/ath9k/hw.c | 5 +-
> drivers/net/wireless/ath/ath9k/link.c | 2 +-
> drivers/net/wireless/ath/ath9k/main.c | 10 ++-
> drivers/net/wireless/ath/ath9k/rc.c | 4 +-
> drivers/net/wireless/ath/ath9k/recv.c | 6 +-
> drivers/net/wireless/ath/carl9170/debug.c | 5 +-
> drivers/net/wireless/ath/carl9170/mac.c | 8 +-
> drivers/net/wireless/ath/carl9170/main.c | 9 ++-
> drivers/net/wireless/ath/carl9170/phy.c | 4 +-
> drivers/net/wireless/b43/b43.h | 2 +-
> drivers/net/wireless/b43/main.c | 8 +-
> drivers/net/wireless/b43/phy_ht.c | 5 +-
> drivers/net/wireless/b43/phy_lcn.c | 5 +-
> drivers/net/wireless/b43/phy_n.c | 5 +-
> drivers/net/wireless/b43legacy/main.c | 9 ++-
> drivers/net/wireless/brcm80211/brcmsmac/channel.c | 4 +-
> .../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 6 +-
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 4 +-
> drivers/net/wireless/iwlegacy/3945-rs.c | 2 +-
> drivers/net/wireless/iwlegacy/4965-rs.c | 2 +-
> drivers/net/wireless/iwlegacy/common.c | 2 +-
> drivers/net/wireless/iwlwifi/dvm/rs.c | 2 +-
> drivers/net/wireless/iwlwifi/dvm/rxon.c | 9 ++-
> drivers/net/wireless/libertas_tf/main.c | 8 +-
> drivers/net/wireless/mac80211_hwsim.c | 42 +++++++++-----
> drivers/net/wireless/mwl8k.c | 36 +++++++-----
> drivers/net/wireless/p54/fwio.c | 4 +-
> drivers/net/wireless/p54/main.c | 4 +-
> drivers/net/wireless/p54/txrx.c | 4 +-
> drivers/net/wireless/rt2x00/rt2800lib.c | 8 +-
> drivers/net/wireless/rt2x00/rt2x00config.c | 10 ++--
> drivers/net/wireless/rt2x00/rt61pci.c | 2 +-
> drivers/net/wireless/rt2x00/rt73usb.c | 2 +-
> drivers/net/wireless/rtl818x/rtl8180/dev.c | 4 +-
> drivers/net/wireless/rtl818x/rtl8180/grf5101.c | 3 +-
> drivers/net/wireless/rtl818x/rtl8180/max2820.c | 2 +-
> drivers/net/wireless/rtl818x/rtl8180/rtl8225.c | 3 +-
> drivers/net/wireless/rtl818x/rtl8180/sa2400.c | 3 +-
> drivers/net/wireless/rtl818x/rtl8187/dev.c | 4 +-
> drivers/net/wireless/rtl818x/rtl8187/rtl8225.c | 3 +-
> drivers/net/wireless/rtlwifi/base.c | 4 +-
> drivers/net/wireless/rtlwifi/core.c | 6 +-
> drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 4 +-
> drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | 8 +-
> drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 4 +-
> drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 4 +-
> drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 4 +-
> drivers/net/wireless/ti/wl1251/main.c | 5 +-
> drivers/net/wireless/ti/wlcore/main.c | 2 +-
> drivers/net/wireless/zd1211rw/zd_mac.c | 4 +-
> include/net/mac80211.h | 18 +++---
> net/mac80211/cfg.c | 7 +--
> net/mac80211/chan.c | 11 ++--
> net/mac80211/ieee80211_i.h | 3 +-
> net/mac80211/main.c | 59 +++++++++++--------
> net/mac80211/mlme.c | 24 ++++++--
> net/mac80211/scan.c | 6 +-
> net/mac80211/trace.h | 37 ++++++-------
> net/mac80211/tx.c | 4 +-
> net/mac80211/util.c | 3 +-
> 70 files changed, 293 insertions(+), 244 deletions(-)
>
> diff --git a/drivers/net/wireless/adm8211.c b/drivers/net/wireless/adm8211.c
> index 3d339e0..f9a24e5 100644
> --- a/drivers/net/wireless/adm8211.c
> +++ b/drivers/net/wireless/adm8211.c
> @@ -1293,7 +1293,8 @@ 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);
> + int channel =
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
>
> if (channel != priv->channel) {
> priv->channel = channel;
> diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
> index 5ac5f7a..34c8a33 100644
> --- a/drivers/net/wireless/at76c50x-usb.c
> +++ b/drivers/net/wireless/at76c50x-usb.c
> @@ -1943,12 +1943,12 @@ static int at76_config(struct ieee80211_hw *hw, u32 changed)
> struct at76_priv *priv = hw->priv;
>
> at76_dbg(DBG_MAC80211, "%s(): channel %d",
> - __func__, hw->conf.channel->hw_value);
> + __func__, hw->conf.chandef.chan->hw_value);
> at76_dbg_dump(DBG_MAC80211, priv->bssid, ETH_ALEN, "bssid:");
>
> mutex_lock(&priv->mtx);
>
> - priv->channel = hw->conf.channel->hw_value;
> + priv->channel = hw->conf.chandef.chan->hw_value;
>
> if (is_valid_ether_addr(priv->bssid))
> at76_join(priv);
> diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
> index afd1e36..17d7fec 100644
> --- a/drivers/net/wireless/ath/ar5523/ar5523.c
> +++ b/drivers/net/wireless/ath/ar5523/ar5523.c
> @@ -457,14 +457,14 @@ static int ar5523_set_chan(struct ar5523 *ar)
> memset(&reset, 0, sizeof(reset));
> reset.flags |= cpu_to_be32(UATH_CHAN_2GHZ);
> reset.flags |= cpu_to_be32(UATH_CHAN_OFDM);
> - reset.freq = cpu_to_be32(conf->channel->center_freq);
> + reset.freq = cpu_to_be32(conf->chandef.chan->center_freq);
> reset.maxrdpower = cpu_to_be32(50); /* XXX */
> reset.channelchange = cpu_to_be32(1);
> reset.keeprccontent = cpu_to_be32(0);
>
> ar5523_dbg(ar, "set chan flags 0x%x freq %d\n",
> be32_to_cpu(reset.flags),
> - conf->channel->center_freq);
> + conf->chandef.chan->center_freq);
> return ar5523_cmd_write(ar, WDCMSG_RESET, &reset, sizeof(reset), 0);
> }
>
> @@ -594,7 +594,7 @@ static void ar5523_data_rx_cb(struct urb *urb)
> rx_status = IEEE80211_SKB_RXCB(data->skb);
> memset(rx_status, 0, sizeof(*rx_status));
> rx_status->freq = be32_to_cpu(desc->channel);
> - rx_status->band = hw->conf.channel->band;
> + rx_status->band = hw->conf.chandef.chan->band;
> rx_status->signal = -95 + be32_to_cpu(desc->rssi);
>
> ieee80211_rx_irqsafe(hw, data->skb);
> @@ -1153,13 +1153,13 @@ static int ar5523_get_wlan_mode(struct ar5523 *ar,
> struct ieee80211_sta *sta;
> u32 sta_rate_set;
>
> - band = ar->hw->wiphy->bands[ar->hw->conf.channel->band];
> + band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
> sta = ieee80211_find_sta(ar->vif, bss_conf->bssid);
> if (!sta) {
> ar5523_info(ar, "STA not found!\n");
> return WLAN_MODE_11b;
> }
> - sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];
> + sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
>
> for (bit = 0; bit < band->n_bitrates; bit++) {
> if (sta_rate_set & 1) {
> @@ -1197,11 +1197,11 @@ static void ar5523_create_rateset(struct ar5523 *ar,
> ar5523_info(ar, "STA not found. Cannot set rates\n");
> sta_rate_set = bss_conf->basic_rates;
> } else
> - sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];
> + sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
>
> ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);
>
> - band = ar->hw->wiphy->bands[ar->hw->conf.channel->band];
> + band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
> for (bit = 0; bit < band->n_bitrates; bit++) {
> BUG_ON(i >= AR5523_MAX_NRATES);
> ar5523_dbg(ar, "Considering rate %d : %d\n",
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index 1d264c0..9b20d9e 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -2639,7 +2639,7 @@ int ath5k_start(struct ieee80211_hw *hw)
> * be followed by initialization of the appropriate bits
> * and then setup of the interrupt mask.
> */
> - ah->curchan = ah->hw->conf.channel;
> + ah->curchan = ah->hw->conf.chandef.chan;
> ah->imask = AR5K_INT_RXOK
> | AR5K_INT_RXERR
> | AR5K_INT_RXEOL
> diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
> index 4264341..06f86f4 100644
> --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
> +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
> @@ -202,7 +202,7 @@ ath5k_config(struct ieee80211_hw *hw, u32 changed)
> mutex_lock(&ah->lock);
>
> if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
> - ret = ath5k_chan_set(ah, conf->channel);
> + ret = ath5k_chan_set(ah, conf->chandef.chan);
> if (ret < 0)
> goto unlock;
> }
> @@ -678,7 +678,7 @@ ath5k_get_survey(struct ieee80211_hw *hw, int idx, struct survey_info *survey)
>
> memcpy(survey, &ah->survey, sizeof(*survey));
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->noise = ah->ah_noise_floor;
> survey->filled = SURVEY_INFO_NOISE_DBM |
> SURVEY_INFO_CHANNEL_TIME |
> diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
> index 5f05c26..2ff570f 100644
> --- a/drivers/net/wireless/ath/ath9k/beacon.c
> +++ b/drivers/net/wireless/ath/ath9k/beacon.c
> @@ -79,7 +79,7 @@ static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
> u8 chainmask = ah->txchainmask;
> u8 rate = 0;
>
> - sband = &sc->sbands[common->hw->conf.channel->band];
> + sband = &sc->sbands[common->hw->conf.chandef.chan->band];
> rate = sband->bitrates[rateidx].hw_value;
> if (vif->bss_conf.use_short_preamble)
> rate |= sband->bitrates[rateidx].hw_value_short;
> diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
> index 1e85085..b184f1f 100644
> --- a/drivers/net/wireless/ath/ath9k/calib.c
> +++ b/drivers/net/wireless/ath/ath9k/calib.c
> @@ -208,7 +208,7 @@ bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
> return true;
>
> ath_dbg(common, CALIBRATE, "Resetting Cal %d state for channel %u\n",
> - currCal->calData->calType, conf->channel->center_freq);
> + currCal->calData->calType, conf->chandef.chan->center_freq);
>
> ah->caldata->CalValid &= ~currCal->calData->calType;
> currCal->calState = CAL_WAITING;
> diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
> index 905f1b3..6c78fe7 100644
> --- a/drivers/net/wireless/ath/ath9k/common.c
> +++ b/drivers/net/wireless/ath/ath9k/common.c
> @@ -133,13 +133,14 @@ EXPORT_SYMBOL(ath9k_cmn_update_ichannel);
> struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw,
> struct ath_hw *ah)
> {
> - struct ieee80211_channel *curchan = hw->conf.channel;
> + struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> struct ath9k_channel *channel;
> u8 chan_idx;
>
> chan_idx = curchan->hw_value;
> channel = &ah->channels[chan_idx];
> - ath9k_cmn_update_ichannel(channel, curchan, hw->conf.channel_type);
> + ath9k_cmn_update_ichannel(channel, curchan,
> + cfg80211_get_chandef_type(&hw->conf.chandef));
>
> return channel;
> }
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> index a8016d7..098e354 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> @@ -190,7 +190,7 @@ void ath9k_htc_reset(struct ath9k_htc_priv *priv)
> {
> struct ath_hw *ah = priv->ah;
> struct ath_common *common = ath9k_hw_common(ah);
> - struct ieee80211_channel *channel = priv->hw->conf.channel;
> + struct ieee80211_channel *channel = priv->hw->conf.chandef.chan;
> struct ath9k_hw_cal_data *caldata = NULL;
> enum htc_phymode mode;
> __be16 htc_mode;
> @@ -250,7 +250,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
> struct ath_common *common = ath9k_hw_common(ah);
> struct ieee80211_conf *conf = &common->hw->conf;
> bool fastcc;
> - struct ieee80211_channel *channel = hw->conf.channel;
> + struct ieee80211_channel *channel = hw->conf.chandef.chan;
> struct ath9k_hw_cal_data *caldata = NULL;
> enum htc_phymode mode;
> __be16 htc_mode;
> @@ -602,7 +602,7 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
> u32 caps = 0;
> int i, j;
>
> - sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
> + sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
>
> for (i = 0, j = 0; i < sband->n_bitrates; i++) {
> if (sta->supp_rates[sband->band] & BIT(i)) {
> @@ -904,7 +904,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
> struct ath9k_htc_priv *priv = hw->priv;
> struct ath_hw *ah = priv->ah;
> struct ath_common *common = ath9k_hw_common(ah);
> - struct ieee80211_channel *curchan = hw->conf.channel;
> + struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> struct ath9k_channel *init_channel;
> int ret = 0;
> enum htc_phymode mode;
> @@ -1193,15 +1193,17 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
> }
>
> if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) {
> - struct ieee80211_channel *curchan = hw->conf.channel;
> + struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&hw->conf.chandef);
> int pos = curchan->hw_value;
>
> ath_dbg(common, CONFIG, "Set channel: %d MHz\n",
> curchan->center_freq);
>
> ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
> - hw->conf.channel,
> - hw->conf.channel_type);
> + hw->conf.chandef.chan,
> + channel_type);
>
> if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
> ath_err(common, "Unable to set channel\n");
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
> index 3ad1fd0..306c550 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
> @@ -490,7 +490,7 @@ static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
> if (txs->ts_flags & ATH9K_HTC_TXSTAT_SGI)
> rate->flags |= IEEE80211_TX_RC_SHORT_GI;
> } else {
> - if (cur_conf->channel->band == IEEE80211_BAND_5GHZ)
> + if (cur_conf->chandef.chan->band == IEEE80211_BAND_5GHZ)
> rate->idx += 4; /* No CCK rates */
> }
>
> @@ -939,7 +939,7 @@ static void ath9k_process_rate(struct ieee80211_hw *hw,
> return;
> }
>
> - band = hw->conf.channel->band;
> + band = hw->conf.chandef.chan->band;
> sband = hw->wiphy->bands[band];
>
> for (i = 0; i < sband->n_bitrates; i++) {
> @@ -1078,8 +1078,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
> priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
>
> rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
> - rx_status->band = hw->conf.channel->band;
> - rx_status->freq = hw->conf.channel->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR;
> rx_status->antenna = rxbuf->rxstatus.rs_antenna;
> rx_status->flag |= RX_FLAG_MACTIME_END;
> diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
> index 2a2ae40..d5e6a38 100644
> --- a/drivers/net/wireless/ath/ath9k/hw.c
> +++ b/drivers/net/wireless/ath/ath9k/hw.c
> @@ -139,7 +139,7 @@ static void ath9k_hw_set_clockrate(struct ath_hw *ah)
> clockrate = 117;
> else if (!ah->curchan) /* should really check for CCK instead */
> clockrate = ATH9K_CLOCK_RATE_CCK;
> - else if (conf->channel->band == IEEE80211_BAND_2GHZ)
> + else if (conf->chandef.chan->band == IEEE80211_BAND_2GHZ)
> clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
> else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)
> clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
> @@ -1110,7 +1110,8 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
> * BA frames in some implementations, but it has been found to fix ACK
> * timeout issues in other cases as well.
> */
> - if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ &&
> + if (conf->chandef.chan &&
> + conf->chandef.chan->band == IEEE80211_BAND_2GHZ &&
> !IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) {
> acktimeout += 64 - sifstime - ah->slottime;
> ctstimeout += 48 - sifstime - ah->slottime;
> diff --git a/drivers/net/wireless/ath/ath9k/link.c b/drivers/net/wireless/ath/ath9k/link.c
> index ade3afb..b1433f5 100644
> --- a/drivers/net/wireless/ath/ath9k/link.c
> +++ b/drivers/net/wireless/ath/ath9k/link.c
> @@ -213,7 +213,7 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int
> txctl.txq = sc->tx.txq_map[IEEE80211_AC_BE];
>
> memset(tx_info, 0, sizeof(*tx_info));
> - tx_info->band = hw->conf.channel->band;
> + tx_info->band = hw->conf.chandef.chan->band;
> tx_info->flags |= IEEE80211_TX_CTL_NO_ACK;
> tx_info->control.rates[0].idx = 0;
> tx_info->control.rates[0].count = 1;
> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
> index 24650fd4..f984a03 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -585,7 +585,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
> struct ath_softc *sc = hw->priv;
> struct ath_hw *ah = sc->sc_ah;
> struct ath_common *common = ath9k_hw_common(ah);
> - struct ieee80211_channel *curchan = hw->conf.channel;
> + struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> struct ath9k_channel *init_channel;
> int r;
>
> @@ -1184,7 +1184,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
> }
>
> if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
> - struct ieee80211_channel *curchan = hw->conf.channel;
> + struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&conf->chandef);
> int pos = curchan->hw_value;
> int old_pos = -1;
> unsigned long flags;
> @@ -1193,7 +1195,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
> old_pos = ah->curchan - &ah->channels[0];
>
> ath_dbg(common, CONFIG, "Set channel: %d MHz type: %d\n",
> - curchan->center_freq, conf->channel_type);
> + curchan->center_freq, channel_type);
>
> /* update survey stats for the old channel before switching */
> spin_lock_irqsave(&common->cc_lock, flags);
> @@ -1208,7 +1210,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
> ath9k_hw_getnf(ah, ah->curchan);
>
> ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
> - curchan, conf->channel_type);
> + curchan, channel_type);
>
> /*
> * If the operating channel changes, change the survey in-use flags
> diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
> index 96ac433..aa4d368 100644
> --- a/drivers/net/wireless/ath/ath9k/rc.c
> +++ b/drivers/net/wireless/ath/ath9k/rc.c
> @@ -814,7 +814,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
> * So, set fourth rate in series to be same as third one for
> * above conditions.
> */
> - if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
> + if ((sc->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) &&
> (conf_is_ht(&sc->hw->conf))) {
> u8 dot11rate = rate_table->info[rix].dot11rate;
> u8 phy = rate_table->info[rix].phy;
> @@ -1328,7 +1328,7 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
>
> ath_dbg(ath9k_hw_common(sc->sc_ah), CONFIG,
> "Operating HT Bandwidth changed to: %d\n",
> - sc->hw->conf.channel_type);
> + cfg80211_get_chandef_type(&sc->hw->conf.chandef));
> }
> }
>
> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
> index ee156e5..c90ca57 100644
> --- a/drivers/net/wireless/ath/ath9k/recv.c
> +++ b/drivers/net/wireless/ath/ath9k/recv.c
> @@ -859,7 +859,7 @@ static int ath9k_process_rate(struct ath_common *common,
> unsigned int i = 0;
> struct ath_softc __maybe_unused *sc = common->priv;
>
> - band = hw->conf.channel->band;
> + band = hw->conf.chandef.chan->band;
> sband = hw->wiphy->bands[band];
>
> if (rx_stats->rs_rate & 0x80) {
> @@ -954,8 +954,8 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
> if (ath9k_process_rate(common, hw, rx_stats, rx_status))
> return -EINVAL;
>
> - rx_status->band = hw->conf.channel->band;
> - rx_status->freq = hw->conf.channel->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> rx_status->signal = ah->noise + rx_stats->rs_rssi;
> rx_status->antenna = rx_stats->rs_antenna;
> rx_status->flag |= RX_FLAG_MACTIME_END;
> diff --git a/drivers/net/wireless/ath/carl9170/debug.c b/drivers/net/wireless/ath/carl9170/debug.c
> index 93fe600..7741fe8 100644
> --- a/drivers/net/wireless/ath/carl9170/debug.c
> +++ b/drivers/net/wireless/ath/carl9170/debug.c
> @@ -654,8 +654,9 @@ static ssize_t carl9170_debugfs_bug_write(struct ar9170 *ar, const char *buf,
> goto out;
>
> case 'P':
> - err = carl9170_set_channel(ar, ar->hw->conf.channel,
> - ar->hw->conf.channel_type, CARL9170_RFI_COLD);
> + err = carl9170_set_channel(ar, ar->hw->conf.chandef.chan,
> + cfg80211_get_chandef_type(&ar->hw->conf.chandef),
> + CARL9170_RFI_COLD);
> if (err < 0)
> count = err;
>
> diff --git a/drivers/net/wireless/ath/carl9170/mac.c b/drivers/net/wireless/ath/carl9170/mac.c
> index 24d75ab..a2f00570 100644
> --- a/drivers/net/wireless/ath/carl9170/mac.c
> +++ b/drivers/net/wireless/ath/carl9170/mac.c
> @@ -48,7 +48,7 @@ int carl9170_set_dyn_sifs_ack(struct ar9170 *ar)
> if (conf_is_ht40(&ar->hw->conf))
> val = 0x010a;
> else {
> - if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ)
> + if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
> val = 0x105;
> else
> val = 0x104;
> @@ -66,7 +66,7 @@ int carl9170_set_rts_cts_rate(struct ar9170 *ar)
> rts_rate = 0x1da;
> cts_rate = 0x10a;
> } else {
> - if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
> + if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
> /* 11 mbit CCK */
> rts_rate = 033;
> cts_rate = 003;
> @@ -93,7 +93,7 @@ int carl9170_set_slot_time(struct ar9170 *ar)
> return 0;
> }
>
> - if ((ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ) ||
> + if ((ar->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ) ||
> vif->bss_conf.use_short_slot)
> slottime = 9;
>
> @@ -120,7 +120,7 @@ int carl9170_set_mac_rates(struct ar9170 *ar)
> basic |= (vif->bss_conf.basic_rates & 0xff0) << 4;
> rcu_read_unlock();
>
> - if (ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ)
> + if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
> mandatory = 0xff00; /* OFDM 6/9/12/18/24/36/48/54 */
> else
> mandatory = 0xff0f; /* OFDM (6/9../54) + CCK (1/2/5.5/11) */
> diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c
> index 08b1931..4e268b1 100644
> --- a/drivers/net/wireless/ath/carl9170/main.c
> +++ b/drivers/net/wireless/ath/carl9170/main.c
> @@ -929,6 +929,9 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
> }
>
> if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&hw->conf.chandef);
> +
> /* adjust slot time for 5 GHz */
> err = carl9170_set_slot_time(ar);
> if (err)
> @@ -938,8 +941,8 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
> if (err)
> goto out;
>
> - err = carl9170_set_channel(ar, hw->conf.channel,
> - hw->conf.channel_type, CARL9170_RFI_NONE);
> + err = carl9170_set_channel(ar, hw->conf.chandef.chan,
> + channel_type, CARL9170_RFI_NONE);
> if (err)
> goto out;
>
> @@ -957,7 +960,7 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
> }
>
> if (changed & IEEE80211_CONF_CHANGE_POWER) {
> - err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel);
> + err = carl9170_set_mac_tpc(ar, ar->hw->conf.chandef.chan);
> if (err)
> goto out;
> }
> diff --git a/drivers/net/wireless/ath/carl9170/phy.c b/drivers/net/wireless/ath/carl9170/phy.c
> index b72c09c..c5f1fdd 100644
> --- a/drivers/net/wireless/ath/carl9170/phy.c
> +++ b/drivers/net/wireless/ath/carl9170/phy.c
> @@ -1331,7 +1331,7 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw)
> * CTL_ETSI for 2GHz and CTL_FCC for 5GHz.
> */
> ctl_grp = ath_regd_get_band_ctl(&ar->common.regulatory,
> - ar->hw->conf.channel->band);
> + ar->hw->conf.chandef.chan->band);
>
> /* ctl group not found - either invalid band (NO_CTL) or ww roaming */
> if (ctl_grp == NO_CTL || ctl_grp == SD_NO_CTL)
> @@ -1341,7 +1341,7 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw)
> /* skip CTL and heavy clip for CTL_MKK and CTL_ETSI */
> return;
>
> - if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
> + if (ar->hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
> modes = mode_list_2ghz;
> nr_modes = ARRAY_SIZE(mode_list_2ghz);
> } else {
> diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
> index 10e288d..6a4bd8c 100644
> --- a/drivers/net/wireless/b43/b43.h
> +++ b/drivers/net/wireless/b43/b43.h
> @@ -972,7 +972,7 @@ static inline int b43_is_mode(struct b43_wl *wl, int type)
> */
> static inline enum ieee80211_band b43_current_band(struct b43_wl *wl)
> {
> - return wl->hw->conf.channel->band;
> + return wl->hw->conf.chandef.chan->band;
> }
>
> static inline int b43_bus_may_powerdown(struct b43_wldev *wldev)
> diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
> index 0568273..d135e89 100644
> --- a/drivers/net/wireless/b43/main.c
> +++ b/drivers/net/wireless/b43/main.c
> @@ -3848,7 +3848,7 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
> dev = wl->current_dev;
>
> /* Switch the band (if necessary). This might change the active core. */
> - err = b43_switch_band(wl, conf->channel);
> + err = b43_switch_band(wl, conf->chandef.chan);
> if (err)
> goto out_unlock_mutex;
>
> @@ -3878,8 +3878,8 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
>
> /* Switch to the requested channel.
> * The firmware takes care of races with the TX handler. */
> - if (conf->channel->hw_value != phy->channel)
> - b43_switch_channel(dev, conf->channel->hw_value);
> + if (conf->chandef.chan->hw_value != phy->channel)
> + b43_switch_channel(dev, conf->chandef.chan->hw_value);
>
> dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
>
> @@ -5002,7 +5002,7 @@ static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = SURVEY_INFO_NOISE_DBM;
> survey->noise = dev->stats.link_noise;
>
> diff --git a/drivers/net/wireless/b43/phy_ht.c b/drivers/net/wireless/b43/phy_ht.c
> index 7416c5e..016682e 100644
> --- a/drivers/net/wireless/b43/phy_ht.c
> +++ b/drivers/net/wireless/b43/phy_ht.c
> @@ -525,8 +525,9 @@ static void b43_phy_ht_op_switch_analog(struct b43_wldev *dev, bool on)
> static int b43_phy_ht_op_switch_channel(struct b43_wldev *dev,
> unsigned int new_channel)
> {
> - struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
> - enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
> + struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
>
> if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
> if ((new_channel < 1) || (new_channel > 14))
> diff --git a/drivers/net/wireless/b43/phy_lcn.c b/drivers/net/wireless/b43/phy_lcn.c
> index a13e28e..0bafa3b 100644
> --- a/drivers/net/wireless/b43/phy_lcn.c
> +++ b/drivers/net/wireless/b43/phy_lcn.c
> @@ -808,8 +808,9 @@ static void b43_phy_lcn_op_switch_analog(struct b43_wldev *dev, bool on)
> static int b43_phy_lcn_op_switch_channel(struct b43_wldev *dev,
> unsigned int new_channel)
> {
> - struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
> - enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
> + struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
>
> if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
> if ((new_channel < 1) || (new_channel > 14))
> diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
> index 3c35382..949a3bd 100644
> --- a/drivers/net/wireless/b43/phy_n.c
> +++ b/drivers/net/wireless/b43/phy_n.c
> @@ -5530,8 +5530,9 @@ static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on)
> static int b43_nphy_op_switch_channel(struct b43_wldev *dev,
> unsigned int new_channel)
> {
> - struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
> - enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
> + struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);
>
> if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
> if ((new_channel < 1) || (new_channel > 14))
> diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
> index 8c3f70e..5726688 100644
> --- a/drivers/net/wireless/b43legacy/main.c
> +++ b/drivers/net/wireless/b43legacy/main.c
> @@ -2720,7 +2720,7 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw,
> goto out_unlock_mutex;
>
> /* Switch the PHY mode (if necessary). */
> - switch (conf->channel->band) {
> + switch (conf->chandef.chan->band) {
> case IEEE80211_BAND_2GHZ:
> if (phy->type == B43legacy_PHYTYPE_B)
> new_phymode = B43legacy_PHYMODE_B;
> @@ -2748,8 +2748,9 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw,
>
> /* Switch to the requested channel.
> * The firmware takes care of races with the TX handler. */
> - if (conf->channel->hw_value != phy->channel)
> - b43legacy_radio_selectchannel(dev, conf->channel->hw_value, 0);
> + if (conf->chandef.chan->hw_value != phy->channel)
> + b43legacy_radio_selectchannel(dev, conf->chandef.chan->hw_value,
> + 0);
>
> dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
>
> @@ -3558,7 +3559,7 @@ static int b43legacy_op_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = SURVEY_INFO_NOISE_DBM;
> survey->noise = dev->stats.link_noise;
>
> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
> index 10ee314..cc87926 100644
> --- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
> +++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
> @@ -379,7 +379,7 @@ brcms_c_channel_set_chanspec(struct brcms_cm_info *wlc_cm, u16 chanspec,
> u8 local_constraint_qdbm)
> {
> struct brcms_c_info *wlc = wlc_cm->wlc;
> - struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
> + struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
> struct txpwr_limits txpwr;
>
> brcms_c_channel_reg_limits(wlc_cm, chanspec, &txpwr);
> @@ -404,7 +404,7 @@ brcms_c_channel_reg_limits(struct brcms_cm_info *wlc_cm, u16 chanspec,
> struct txpwr_limits *txpwr)
> {
> struct brcms_c_info *wlc = wlc_cm->wlc;
> - struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
> + struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
> uint i;
> uint chan;
> int maxpwr;
> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
> index aa5f43f..70731d2 100644
> --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
> +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
> @@ -414,10 +414,10 @@ static int brcms_ops_config(struct ieee80211_hw *hw, u32 changed)
> new_int);
> }
> if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
> - if (conf->channel_type == NL80211_CHAN_HT20 ||
> - conf->channel_type == NL80211_CHAN_NO_HT)
> + if (conf->chandef.width == NL80211_CHAN_WIDTH_20 ||
> + conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
> err = brcms_c_set_channel(wl->wlc,
> - conf->channel->hw_value);
> + conf->chandef.chan->hw_value);
> else
> err = -ENOTSUPP;
> }
> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> index 8ef02dc..e0dc183 100644
> --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
> +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> @@ -5099,7 +5099,7 @@ int brcms_c_up(struct brcms_c_info *wlc)
> wlc->pub->up = true;
>
> if (wlc->bandinit_pending) {
> - ch = wlc->pub->ieee_hw->conf.channel;
> + ch = wlc->pub->ieee_hw->conf.chandef.chan;
> brcms_c_suspend_mac_and_wait(wlc);
> brcms_c_set_chanspec(wlc, ch20mhz_chspec(ch->hw_value));
> wlc->bandinit_pending = false;
> @@ -7748,7 +7748,7 @@ bool brcms_c_dpc(struct brcms_c_info *wlc, bool bounded)
> void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx)
> {
> struct bcma_device *core = wlc->hw->d11core;
> - struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel;
> + struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.chandef.chan;
> u16 chanspec;
>
> brcms_dbg_info(core, "wl%d\n", wlc->pub->unit);
> diff --git a/drivers/net/wireless/iwlegacy/3945-rs.c b/drivers/net/wireless/iwlegacy/3945-rs.c
> index d4fd29a..c9f197d 100644
> --- a/drivers/net/wireless/iwlegacy/3945-rs.c
> +++ b/drivers/net/wireless/iwlegacy/3945-rs.c
> @@ -347,7 +347,7 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
>
> psta = (struct il3945_sta_priv *)sta->drv_priv;
> rs_sta = &psta->rs_sta;
> - sband = hw->wiphy->bands[conf->channel->band];
> + sband = hw->wiphy->bands[conf->chandef.chan->band];
>
> rs_sta->il = il;
>
> diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c
> index e8324b5..1d92a59 100644
> --- a/drivers/net/wireless/iwlegacy/4965-rs.c
> +++ b/drivers/net/wireless/iwlegacy/4965-rs.c
> @@ -2299,7 +2299,7 @@ il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
>
> sta_priv = (struct il_station_priv *)sta->drv_priv;
> lq_sta = &sta_priv->lq_sta;
> - sband = hw->wiphy->bands[conf->channel->band];
> + sband = hw->wiphy->bands[conf->chandef.chan->band];
>
> lq_sta->lq.sta_id = sta_id;
>
> diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
> index 722bfb5..025d8b0 100644
> --- a/drivers/net/wireless/iwlegacy/common.c
> +++ b/drivers/net/wireless/iwlegacy/common.c
> @@ -4974,7 +4974,7 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
> struct il_priv *il = hw->priv;
> const struct il_channel_info *ch_info;
> struct ieee80211_conf *conf = &hw->conf;
> - struct ieee80211_channel *channel = conf->channel;
> + struct ieee80211_channel *channel = conf->chandef.chan;
> struct il_ht_config *ht_conf = &il->current_ht_config;
> unsigned long flags = 0;
> int ret = 0;
> diff --git a/drivers/net/wireless/iwlwifi/dvm/rs.c b/drivers/net/wireless/iwlwifi/dvm/rs.c
> index abe3042..907bd6e 100644
> --- a/drivers/net/wireless/iwlwifi/dvm/rs.c
> +++ b/drivers/net/wireless/iwlwifi/dvm/rs.c
> @@ -2831,7 +2831,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
>
> sta_priv = (struct iwl_station_priv *) sta->drv_priv;
> lq_sta = &sta_priv->lq_sta;
> - sband = hw->wiphy->bands[conf->channel->band];
> + sband = hw->wiphy->bands[conf->chandef.chan->band];
>
>
> lq_sta->lq.sta_id = sta_id;
> diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c
> index 23be948..085c589 100644
> --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c
> +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c
> @@ -78,8 +78,9 @@ void iwl_connection_init_rx_config(struct iwl_priv *priv,
> ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
> #endif
>
> - ctx->staging.channel = cpu_to_le16(priv->hw->conf.channel->hw_value);
> - priv->band = priv->hw->conf.channel->band;
> + ctx->staging.channel =
> + cpu_to_le16(priv->hw->conf.chandef.chan->hw_value);
> + priv->band = priv->hw->conf.chandef.chan->band;
>
> iwl_set_flags_for_band(priv, ctx, priv->band, ctx->vif);
>
> @@ -951,7 +952,7 @@ static void iwl_calc_basic_rates(struct iwl_priv *priv,
> unsigned long basic = ctx->vif->bss_conf.basic_rates;
> int i;
>
> - sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
> + sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
>
> for_each_set_bit(i, &basic, BITS_PER_LONG) {
> int hw = sband->bitrates[i].hw_value;
> @@ -1181,7 +1182,7 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
> struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
> struct iwl_rxon_context *ctx;
> struct ieee80211_conf *conf = &hw->conf;
> - struct ieee80211_channel *channel = conf->channel;
> + struct ieee80211_channel *channel = conf->chandef.chan;
> int ret = 0;
>
> IWL_DEBUG_MAC80211(priv, "enter: changed %#x\n", changed);
> diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c
> index 7001856..088de9d 100644
> --- a/drivers/net/wireless/libertas_tf/main.c
> +++ b/drivers/net/wireless/libertas_tf/main.c
> @@ -412,9 +412,9 @@ static int lbtf_op_config(struct ieee80211_hw *hw, u32 changed)
> struct ieee80211_conf *conf = &hw->conf;
> lbtf_deb_enter(LBTF_DEB_MACOPS);
>
> - if (conf->channel->center_freq != priv->cur_freq) {
> - priv->cur_freq = conf->channel->center_freq;
> - lbtf_set_channel(priv, conf->channel->hw_value);
> + if (conf->chandef.chan->center_freq != priv->cur_freq) {
> + priv->cur_freq = conf->chandef.chan->center_freq;
> + lbtf_set_channel(priv, conf->chandef.chan->hw_value);
> }
> lbtf_deb_leave(LBTF_DEB_MACOPS);
> return 0;
> @@ -537,7 +537,7 @@ static int lbtf_op_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = SURVEY_INFO_NOISE_DBM;
> survey->noise = priv->noise;
>
> diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
> index 0064d38..4ac5486 100644
> --- a/drivers/net/wireless/mac80211_hwsim.c
> +++ b/drivers/net/wireless/mac80211_hwsim.c
> @@ -1062,11 +1062,13 @@ out:
> return HRTIMER_NORESTART;
> }
>
> -static const char *hwsim_chantypes[] = {
> - [NL80211_CHAN_NO_HT] = "noht",
> - [NL80211_CHAN_HT20] = "ht20",
> - [NL80211_CHAN_HT40MINUS] = "ht40-",
> - [NL80211_CHAN_HT40PLUS] = "ht40+",
> +static const char * const hwsim_chanwidths[] = {
> + [NL80211_CHAN_WIDTH_20_NOHT] = "noht",
> + [NL80211_CHAN_WIDTH_20] = "ht20",
> + [NL80211_CHAN_WIDTH_40] = "ht40",
> + [NL80211_CHAN_WIDTH_80] = "vht80",
> + [NL80211_CHAN_WIDTH_80P80] = "vht80p80",
> + [NL80211_CHAN_WIDTH_160] = "vht160",
> };
>
> static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
> @@ -1080,18 +1082,28 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
> [IEEE80211_SMPS_DYNAMIC] = "dynamic",
> };
>
> - wiphy_debug(hw->wiphy,
> - "%s (freq=%d/%s idle=%d ps=%d smps=%s)\n",
> - __func__,
> - conf->channel ? conf->channel->center_freq : 0,
> - hwsim_chantypes[conf->channel_type],
> - !!(conf->flags & IEEE80211_CONF_IDLE),
> - !!(conf->flags & IEEE80211_CONF_PS),
> - smps_modes[conf->smps_mode]);
> + if (conf->chandef.chan)
> + wiphy_debug(hw->wiphy,
> + "%s (freq=%d(%d - %d)/%s idle=%d ps=%d smps=%s)\n",
> + __func__,
> + conf->chandef.chan->center_freq,
> + conf->chandef.center_freq1,
> + conf->chandef.center_freq2,
> + hwsim_chanwidths[conf->chandef.width],
> + !!(conf->flags & IEEE80211_CONF_IDLE),
> + !!(conf->flags & IEEE80211_CONF_PS),
> + smps_modes[conf->smps_mode]);
> + else
> + wiphy_debug(hw->wiphy,
> + "%s (freq=0 idle=%d ps=%d smps=%s)\n",
> + __func__,
> + !!(conf->flags & IEEE80211_CONF_IDLE),
> + !!(conf->flags & IEEE80211_CONF_PS),
> + smps_modes[conf->smps_mode]);
>
> data->idle = !!(conf->flags & IEEE80211_CONF_IDLE);
>
> - data->channel = conf->channel;
> + data->channel = conf->chandef.chan;
>
> WARN_ON(data->channel && channels > 1);
>
> @@ -1277,7 +1289,7 @@ static int mac80211_hwsim_get_survey(
> return -ENOENT;
>
> /* Current channel */
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
>
> /*
> * Magically conjured noise level --- this is only ok for simulated hardware.
> diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
> index 091d9a6..9f9a144 100644
> --- a/drivers/net/wireless/mwl8k.c
> +++ b/drivers/net/wireless/mwl8k.c
> @@ -2837,7 +2837,9 @@ static int mwl8k_cmd_tx_power(struct ieee80211_hw *hw,
> struct ieee80211_conf *conf,
> unsigned short pwr)
> {
> - struct ieee80211_channel *channel = conf->channel;
> + struct ieee80211_channel *channel = conf->chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&conf->chandef);
> struct mwl8k_cmd_tx_power *cmd;
> int rc;
> int i;
> @@ -2857,14 +2859,14 @@ static int mwl8k_cmd_tx_power(struct ieee80211_hw *hw,
>
> cmd->channel = cpu_to_le16(channel->hw_value);
>
> - if (conf->channel_type == NL80211_CHAN_NO_HT ||
> - conf->channel_type == NL80211_CHAN_HT20) {
> + if (channel_type == NL80211_CHAN_NO_HT ||
> + channel_type == NL80211_CHAN_HT20) {
> cmd->bw = cpu_to_le16(0x2);
> } else {
> cmd->bw = cpu_to_le16(0x4);
> - if (conf->channel_type == NL80211_CHAN_HT40MINUS)
> + if (channel_type == NL80211_CHAN_HT40MINUS)
> cmd->sub_ch = cpu_to_le16(0x3);
> - else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
> + else if (channel_type == NL80211_CHAN_HT40PLUS)
> cmd->sub_ch = cpu_to_le16(0x1);
> }
>
> @@ -3008,7 +3010,9 @@ struct mwl8k_cmd_set_rf_channel {
> static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
> struct ieee80211_conf *conf)
> {
> - struct ieee80211_channel *channel = conf->channel;
> + struct ieee80211_channel *channel = conf->chandef.chan;
> + enum nl80211_channel_type channel_type =
> + cfg80211_get_chandef_type(&conf->chandef);
> struct mwl8k_cmd_set_rf_channel *cmd;
> int rc;
>
> @@ -3026,12 +3030,12 @@ static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
> else if (channel->band == IEEE80211_BAND_5GHZ)
> cmd->channel_flags |= cpu_to_le32(0x00000004);
>
> - if (conf->channel_type == NL80211_CHAN_NO_HT ||
> - conf->channel_type == NL80211_CHAN_HT20)
> + if (channel_type == NL80211_CHAN_NO_HT ||
> + channel_type == NL80211_CHAN_HT20)
> cmd->channel_flags |= cpu_to_le32(0x00000080);
> - else if (conf->channel_type == NL80211_CHAN_HT40MINUS)
> + else if (channel_type == NL80211_CHAN_HT40MINUS)
> cmd->channel_flags |= cpu_to_le32(0x000001900);
> - else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
> + else if (channel_type == NL80211_CHAN_HT40PLUS)
> cmd->channel_flags |= cpu_to_le32(0x000000900);
>
> rc = mwl8k_post_cmd(hw, &cmd->header);
> @@ -3950,7 +3954,7 @@ static int mwl8k_cmd_set_new_stn_add(struct ieee80211_hw *hw,
> memcpy(cmd->mac_addr, sta->addr, ETH_ALEN);
> cmd->stn_id = cpu_to_le16(sta->aid);
> cmd->action = cpu_to_le16(MWL8K_STA_ACTION_ADD);
> - if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
> + if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
> rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
> else
> rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
> @@ -4385,7 +4389,7 @@ static int mwl8k_cmd_update_stadb_add(struct ieee80211_hw *hw,
> p->ht_caps = cpu_to_le16(sta->ht_cap.cap);
> p->extended_ht_caps = (sta->ht_cap.ampdu_factor & 3) |
> ((sta->ht_cap.ampdu_density & 7) << 2);
> - if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
> + if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
> rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
> else
> rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
> @@ -4868,7 +4872,7 @@ mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> goto out;
> }
>
> - if (hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
> + if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ) {
> ap_legacy_rates = ap->supp_rates[IEEE80211_BAND_2GHZ];
> } else {
> ap_legacy_rates =
> @@ -4900,7 +4904,7 @@ mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> if (idx)
> idx--;
>
> - if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
> + if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
> rate = mwl8k_rates_24[idx].hw_value;
> else
> rate = mwl8k_rates_50[idx].hw_value;
> @@ -4973,7 +4977,7 @@ mwl8k_bss_info_changed_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> if (idx)
> idx--;
>
> - if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
> + if (hw->conf.chandef.chan->band == IEEE80211_BAND_2GHZ)
> rate = mwl8k_rates_24[idx].hw_value;
> else
> rate = mwl8k_rates_50[idx].hw_value;
> @@ -5246,7 +5250,7 @@ static int mwl8k_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = SURVEY_INFO_NOISE_DBM;
> survey->noise = priv->noise;
>
> diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
> index 9ba8510..b3879fb 100644
> --- a/drivers/net/wireless/p54/fwio.c
> +++ b/drivers/net/wireless/p54/fwio.c
> @@ -402,7 +402,7 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell)
> struct p54_rssi_db_entry *rssi_data;
> unsigned int i;
> void *entry;
> - __le16 freq = cpu_to_le16(priv->hw->conf.channel->center_freq);
> + __le16 freq = cpu_to_le16(priv->hw->conf.chandef.chan->center_freq);
>
> skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*head) +
> 2 + sizeof(*iq_autocal) + sizeof(*body) +
> @@ -532,7 +532,7 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell)
> err:
> wiphy_err(priv->hw->wiphy, "frequency change to channel %d failed.\n",
> ieee80211_frequency_to_channel(
> - priv->hw->conf.channel->center_freq));
> + priv->hw->conf.chandef.chan->center_freq));
>
> dev_kfree_skb_any(skb);
> return -EINVAL;
> diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
> index ee654a6..067e6f2 100644
> --- a/drivers/net/wireless/p54/main.c
> +++ b/drivers/net/wireless/p54/main.c
> @@ -340,7 +340,7 @@ static int p54_config(struct ieee80211_hw *dev, u32 changed)
> * TODO: Use the LM_SCAN_TRAP to determine the current
> * operating channel.
> */
> - priv->curchan = priv->hw->conf.channel;
> + priv->curchan = priv->hw->conf.chandef.chan;
> p54_reset_stats(priv);
> WARN_ON(p54_fetch_statistics(priv));
> }
> @@ -480,7 +480,7 @@ static void p54_bss_info_changed(struct ieee80211_hw *dev,
> p54_set_edcf(priv);
> }
> if (changed & BSS_CHANGED_BASIC_RATES) {
> - if (dev->conf.channel->band == IEEE80211_BAND_5GHZ)
> + if (dev->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
> priv->basic_rate_mask = (info->basic_rates << 4);
> else
> priv->basic_rate_mask = info->basic_rates;
> diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
> index 12f0a34..f95de0d 100644
> --- a/drivers/net/wireless/p54/txrx.c
> +++ b/drivers/net/wireless/p54/txrx.c
> @@ -354,13 +354,13 @@ static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb)
> rx_status->signal = p54_rssi_to_dbm(priv, hdr->rssi);
> if (hdr->rate & 0x10)
> rx_status->flag |= RX_FLAG_SHORTPRE;
> - if (priv->hw->conf.channel->band == IEEE80211_BAND_5GHZ)
> + if (priv->hw->conf.chandef.chan->band == IEEE80211_BAND_5GHZ)
> rx_status->rate_idx = (rate < 4) ? 0 : rate - 4;
> else
> rx_status->rate_idx = rate;
>
> rx_status->freq = freq;
> - rx_status->band = priv->hw->conf.channel->band;
> + rx_status->band = priv->hw->conf.chandef.chan->band;
> rx_status->antenna = hdr->antenna;
>
> tsf32 = le32_to_cpu(hdr->tsf32);
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index a658b4b..34456b4 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -2763,7 +2763,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
>
> void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
> {
> - rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.channel,
> + rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
> rt2x00dev->tx_power);
> }
> EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
> @@ -2898,11 +2898,11 @@ void rt2800_config(struct rt2x00_dev *rt2x00dev,
> if (flags & IEEE80211_CONF_CHANGE_CHANNEL) {
> rt2800_config_channel(rt2x00dev, libconf->conf,
> &libconf->rf, &libconf->channel);
> - rt2800_config_txpower(rt2x00dev, libconf->conf->channel,
> + rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
> libconf->conf->power_level);
> }
> if (flags & IEEE80211_CONF_CHANGE_POWER)
> - rt2800_config_txpower(rt2x00dev, libconf->conf->channel,
> + rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
> libconf->conf->power_level);
> if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
> rt2800_config_retry_limit(rt2x00dev, libconf);
> @@ -5563,7 +5563,7 @@ int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
>
> rt2800_register_read(rt2x00dev, CH_IDLE_STA, &idle);
> rt2800_register_read(rt2x00dev, CH_BUSY_STA, &busy);
> diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
> index 49a63e9..8cb43f8 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00config.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00config.c
> @@ -184,7 +184,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
> /*
> * Initialize center channel to current channel.
> */
> - center_channel = spec->channels[conf->channel->hw_value].channel;
> + center_channel = spec->channels[conf->chandef.chan->hw_value].channel;
>
> /*
> * Adjust center channel to HT40+ and HT40- operation.
> @@ -199,7 +199,7 @@ static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev,
> return i;
>
> WARN_ON(1);
> - return conf->channel->hw_value;
> + return conf->chandef.chan->hw_value;
> }
>
> void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
> @@ -227,7 +227,7 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
> hw_value = rt2x00ht_center_channel(rt2x00dev, conf);
> } else {
> clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
> - hw_value = conf->channel->hw_value;
> + hw_value = conf->chandef.chan->hw_value;
> }
>
> memcpy(&libconf.rf,
> @@ -279,8 +279,8 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
> else
> clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
>
> - rt2x00dev->curr_band = conf->channel->band;
> - rt2x00dev->curr_freq = conf->channel->center_freq;
> + rt2x00dev->curr_band = conf->chandef.chan->band;
> + rt2x00dev->curr_freq = conf->chandef.chan->center_freq;
> rt2x00dev->tx_power = conf->power_level;
> rt2x00dev->short_retry = conf->short_frame_max_tx_count;
> rt2x00dev->long_retry = conf->long_frame_max_tx_count;
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
> index f95792c..f85035c 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.c
> +++ b/drivers/net/wireless/rt2x00/rt61pci.c
> @@ -847,7 +847,7 @@ static void rt61pci_config_lna_gain(struct rt2x00_dev *rt2x00dev,
> u16 eeprom;
> short lna_gain = 0;
>
> - if (libconf->conf->channel->band == IEEE80211_BAND_2GHZ) {
> + if (libconf->conf->chandef.chan->band == IEEE80211_BAND_2GHZ) {
> if (test_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags))
> lna_gain += 14;
>
> diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
> index 24eec66..a3387b1 100644
> --- a/drivers/net/wireless/rt2x00/rt73usb.c
> +++ b/drivers/net/wireless/rt2x00/rt73usb.c
> @@ -739,7 +739,7 @@ static void rt73usb_config_lna_gain(struct rt2x00_dev *rt2x00dev,
> u16 eeprom;
> short lna_gain = 0;
>
> - if (libconf->conf->channel->band == IEEE80211_BAND_2GHZ) {
> + if (libconf->conf->chandef.chan->band == IEEE80211_BAND_2GHZ) {
> if (test_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags))
> lna_gain += 14;
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/dev.c b/drivers/net/wireless/rtl818x/rtl8180/dev.c
> index 1b3c284..91a04e2 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
> @@ -147,8 +147,8 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
> signal = priv->rf->calc_rssi(agc, sq);
> }
> rx_status.signal = signal;
> - rx_status.freq = dev->conf.channel->center_freq;
> - rx_status.band = dev->conf.channel->band;
> + rx_status.freq = dev->conf.chandef.chan->center_freq;
> + rx_status.band = dev->conf.chandef.chan->band;
> rx_status.mactime = le64_to_cpu(entry->tsft);
> rx_status.flag |= RX_FLAG_MACTIME_START;
> if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/grf5101.c b/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
> index 5ee7589..077ff92 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/grf5101.c
> @@ -82,7 +82,8 @@ static void grf5101_rf_set_channel(struct ieee80211_hw *dev,
> struct ieee80211_conf *conf)
> {
> struct rtl8180_priv *priv = dev->priv;
> - int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
> + int channel =
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
> u32 txpw = priv->channels[channel - 1].hw_value & 0xFF;
> u32 chan = channel - 1;
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/max2820.c b/drivers/net/wireless/rtl818x/rtl8180/max2820.c
> index 667b336..4715000 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/max2820.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/max2820.c
> @@ -95,7 +95,7 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev,
> {
> struct rtl8180_priv *priv = dev->priv;
> int channel = conf ?
> - ieee80211_frequency_to_channel(conf->channel->center_freq) : 1;
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq) : 1;
> unsigned int chan_idx = channel - 1;
> u32 txpw = priv->channels[chan_idx].hw_value & 0xFF;
> u32 chan = max2820_chan[chan_idx];
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c b/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
> index 7c4574b..cc2a541 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/rtl8225.c
> @@ -719,7 +719,8 @@ static void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
> struct ieee80211_conf *conf)
> {
> struct rtl8180_priv *priv = dev->priv;
> - int chan = ieee80211_frequency_to_channel(conf->channel->center_freq);
> + int chan =
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
>
> if (priv->rf->init == rtl8225_rf_init)
> rtl8225_rf_set_tx_power(dev, chan);
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/sa2400.c b/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
> index 44771a62..b3ec40f 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/sa2400.c
> @@ -105,7 +105,8 @@ static void sa2400_rf_set_channel(struct ieee80211_hw *dev,
> struct ieee80211_conf *conf)
> {
> struct rtl8180_priv *priv = dev->priv;
> - int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
> + int channel =
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
> u32 txpw = priv->channels[channel - 1].hw_value & 0xFF;
> u32 chan = sa2400_chan[channel - 1];
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8187/dev.c b/drivers/net/wireless/rtl818x/rtl8187/dev.c
> index 4574bd2..f49220e 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187/dev.c
> +++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c
> @@ -379,8 +379,8 @@ static void rtl8187_rx_cb(struct urb *urb)
> rate = (flags >> 20) & 0xF;
> skb_trim(skb, flags & 0x0FFF);
> rx_status.rate_idx = rate;
> - rx_status.freq = dev->conf.channel->center_freq;
> - rx_status.band = dev->conf.channel->band;
> + rx_status.freq = dev->conf.chandef.chan->center_freq;
> + rx_status.band = dev->conf.chandef.chan->band;
> rx_status.flag |= RX_FLAG_MACTIME_START;
> if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
> rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
> diff --git a/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c b/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
> index 908903f..f0bf35f 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
> +++ b/drivers/net/wireless/rtl818x/rtl8187/rtl8225.c
> @@ -905,7 +905,8 @@ static void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
> struct ieee80211_conf *conf)
> {
> struct rtl8187_priv *priv = dev->priv;
> - int chan = ieee80211_frequency_to_channel(conf->channel->center_freq);
> + int chan =
> + ieee80211_frequency_to_channel(conf->chandef.chan->center_freq);
>
> if (priv->rf->init == rtl8225_rf_init)
> rtl8225_rf_set_tx_power(dev, chan);
> diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
> index 99c5cea..0e7866d 100644
> --- a/drivers/net/wireless/rtlwifi/base.c
> +++ b/drivers/net/wireless/rtlwifi/base.c
> @@ -691,7 +691,7 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
> int rate_idx;
>
> if (false == isht) {
> - if (IEEE80211_BAND_2GHZ == hw->conf.channel->band) {
> + if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
> switch (desc_rate) {
> case DESC92_RATE1M:
> rate_idx = 0;
> @@ -1365,7 +1365,7 @@ int rtl_send_smps_action(struct ieee80211_hw *hw,
> rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
>
> info->control.rates[0].idx = 0;
> - info->band = hw->conf.channel->band;
> + info->band = hw->conf.chandef.chan->band;
> rtlpriv->intf_ops->adapter_tx(hw, sta, skb, &tcb_desc);
> }
> err_free:
> diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
> index b5a7a26..64a41ec 100644
> --- a/drivers/net/wireless/rtlwifi/core.c
> +++ b/drivers/net/wireless/rtlwifi/core.c
> @@ -320,7 +320,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
> }
>
> if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
> - struct ieee80211_channel *channel = hw->conf.channel;
> + struct ieee80211_channel *channel = hw->conf.chandef.chan;
> u8 wide_chan = (u8) channel->hw_value;
>
> /*
> @@ -332,7 +332,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
> *info for cisco1253 bw20, so we modify
> *it here based on UPPER & LOWER
> */
> - switch (hw->conf.channel_type) {
> + switch (cfg80211_get_chandef_type(&hw->conf.chandef)) {
> case NL80211_CHAN_HT20:
> case NL80211_CHAN_NO_HT:
> /* SC */
> @@ -390,7 +390,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
> rtlpriv->cfg->ops->switch_channel(hw);
> rtlpriv->cfg->ops->set_channel_access(hw);
> rtlpriv->cfg->ops->set_bw_mode(hw,
> - hw->conf.channel_type);
> + cfg80211_get_chandef_type(&hw->conf.chandef));
> }
>
> mutex_unlock(&rtlpriv->locks.conf_mutex);
> diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
> index b9b1a6e..27e4ebd 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
> @@ -544,8 +544,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
> stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
> stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
>
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
>
> if (GET_RX_DESC_CRC32(pdesc))
> rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
> diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
> index b6222ee..f0dada5 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
> @@ -324,8 +324,8 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
> && (GET_RX_DESC_FAGGR(pdesc) == 1));
> stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
> stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
> if (GET_RX_DESC_CRC32(pdesc))
> rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
> if (!GET_RX_DESC_SWDEC(pdesc))
> @@ -395,8 +395,8 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
> stats.rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(rxdesc);
> /* TODO: is center_freq changed when doing scan? */
> /* TODO: Shall we add protection or just skip those two step? */
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
> if (GET_RX_DESC_CRC32(rxdesc))
> rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
> if (!GET_RX_DESC_SWDEC(rxdesc))
> diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
> index 941080e..b8ec718 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
> @@ -499,8 +499,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
> && (GET_RX_DESC_FAGGR(pdesc) == 1));
> stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
> stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
> if (GET_RX_DESC_CRC32(pdesc))
> rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
> if (!GET_RX_DESC_SWDEC(pdesc))
> diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
> index 7b0a2e7..0b074f1 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
> @@ -538,8 +538,8 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
> if (stats->hwerror)
> return false;
>
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
>
> hdr = (struct ieee80211_hdr *)(skb->data + stats->rx_drvinfo_size
> + stats->rx_bufshift);
> diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> index ac08129..601261d 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> @@ -304,8 +304,8 @@ bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw,
>
> status->is_cck = RTL8723E_RX_HAL_IS_CCK_RATE(status->rate);
>
> - rx_status->freq = hw->conf.channel->center_freq;
> - rx_status->band = hw->conf.channel->band;
> + rx_status->freq = hw->conf.chandef.chan->center_freq;
> + rx_status->band = hw->conf.chandef.chan->band;
>
> hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
> + status->rx_bufshift);
> diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
> index bbbf68c..3291ffa 100644
> --- a/drivers/net/wireless/ti/wl1251/main.c
> +++ b/drivers/net/wireless/ti/wl1251/main.c
> @@ -572,7 +572,8 @@ static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
> struct ieee80211_conf *conf = &hw->conf;
> int channel, ret = 0;
>
> - channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
> + channel = ieee80211_frequency_to_channel(
> + conf->chandef.chan->center_freq);
>
> wl1251_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d",
> channel,
> @@ -1223,7 +1224,7 @@ static int wl1251_op_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = SURVEY_INFO_NOISE_DBM;
> survey->noise = wl->noise;
>
> diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
> index a9f7041..c26cb09 100644
> --- a/drivers/net/wireless/ti/wlcore/main.c
> +++ b/drivers/net/wireless/ti/wlcore/main.c
> @@ -4474,7 +4474,7 @@ static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
> if (idx != 0)
> return -ENOENT;
>
> - survey->channel = conf->channel;
> + survey->channel = conf->chandef.chan;
> survey->filled = 0;
> return 0;
> }
> diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
> index 114364b..c6208a7 100644
> --- a/drivers/net/wireless/zd1211rw/zd_mac.c
> +++ b/drivers/net/wireless/zd1211rw/zd_mac.c
> @@ -1156,10 +1156,10 @@ static int zd_op_config(struct ieee80211_hw *hw, u32 changed)
> struct ieee80211_conf *conf = &hw->conf;
>
> spin_lock_irq(&mac->lock);
> - mac->channel = conf->channel->hw_value;
> + mac->channel = conf->chandef.chan->hw_value;
> spin_unlock_irq(&mac->lock);
>
> - return zd_chip_set_channel(&mac->chip, conf->channel->hw_value);
> + return zd_chip_set_channel(&mac->chip, conf->chandef.chan->hw_value);
> }
>
> static void zd_beacon_done(struct zd_mac *mac)
> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
> index 23a275a..00390fb 100644
> --- a/include/net/mac80211.h
> +++ b/include/net/mac80211.h
> @@ -974,8 +974,7 @@ enum ieee80211_smps_mode {
> * @power_level: requested transmit power (in dBm), backward compatibility
> * value only that is set to the minimum of all interfaces
> *
> - * @channel: the channel to tune to
> - * @channel_type: the channel (HT) type
> + * @chandef: the channel to tune to
> * @radar_enabled: whether radar detection is enabled
> *
> * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
> @@ -1001,8 +1000,7 @@ struct ieee80211_conf {
>
> u8 long_frame_max_tx_count, short_frame_max_tx_count;
>
> - struct ieee80211_channel *channel;
> - enum nl80211_channel_type channel_type;
> + struct cfg80211_chan_def chandef;
> bool radar_enabled;
> enum ieee80211_smps_mode smps_mode;
> };
> @@ -4216,31 +4214,33 @@ void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
> static inline bool
> conf_is_ht20(struct ieee80211_conf *conf)
> {
> - return conf->channel_type == NL80211_CHAN_HT20;
> + return conf->chandef.width == NL80211_CHAN_WIDTH_20;
> }
>
> static inline bool
> conf_is_ht40_minus(struct ieee80211_conf *conf)
> {
> - return conf->channel_type == NL80211_CHAN_HT40MINUS;
> + return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
> + conf->chandef.center_freq1 < conf->chandef.chan->center_freq;
> }
>
> static inline bool
> conf_is_ht40_plus(struct ieee80211_conf *conf)
> {
> - return conf->channel_type == NL80211_CHAN_HT40PLUS;
> + return conf->chandef.width == NL80211_CHAN_WIDTH_40 &&
> + conf->chandef.center_freq1 > conf->chandef.chan->center_freq;
> }
>
> static inline bool
> conf_is_ht40(struct ieee80211_conf *conf)
> {
> - return conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf);
> + return conf->chandef.width == NL80211_CHAN_WIDTH_40;
> }
>
> static inline bool
> conf_is_ht(struct ieee80211_conf *conf)
> {
> - return conf->channel_type != NL80211_CHAN_NO_HT;
> + return conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
> }
>
> static inline enum nl80211_iftype
> diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
> index 50aaf25..6e43feb 100644
> --- a/net/mac80211/cfg.c
> +++ b/net/mac80211/cfg.c
> @@ -805,8 +805,7 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
> IEEE80211_CHANCTX_EXCLUSIVE);
> }
> } else if (local->open_count == local->monitors) {
> - local->_oper_channel = chandef->chan;
> - local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
> + local->_oper_chandef = *chandef;
> ieee80211_hw_config(local, 0);
> }
>
> @@ -3373,9 +3372,7 @@ static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
> if (local->use_chanctx)
> *chandef = local->monitor_chandef;
> else
> - cfg80211_chandef_create(chandef,
> - local->_oper_channel,
> - local->_oper_channel_type);
> + *chandef = local->_oper_chandef;
> ret = 0;
> }
> rcu_read_unlock();
> diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
> index 78c0d90..8024874 100644
> --- a/net/mac80211/chan.c
> +++ b/net/mac80211/chan.c
> @@ -22,7 +22,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,
> drv_change_chanctx(local, ctx, IEEE80211_CHANCTX_CHANGE_WIDTH);
>
> if (!local->use_chanctx) {
> - local->_oper_channel_type = cfg80211_get_chandef_type(chandef);
> + local->_oper_chandef = *chandef;
> ieee80211_hw_config(local, 0);
> }
> }
> @@ -77,9 +77,7 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
> ctx->mode = mode;
>
> if (!local->use_chanctx) {
> - local->_oper_channel_type =
> - cfg80211_get_chandef_type(chandef);
> - local->_oper_channel = chandef->chan;
> + local->_oper_chandef = *chandef;
> ieee80211_hw_config(local, 0);
> } else {
> err = drv_add_chanctx(local, ctx);
> @@ -106,7 +104,10 @@ static void ieee80211_free_chanctx(struct ieee80211_local *local,
> WARN_ON_ONCE(ctx->refcount != 0);
>
> if (!local->use_chanctx) {
> - local->_oper_channel_type = NL80211_CHAN_NO_HT;
> + struct cfg80211_chan_def *chandef = &local->_oper_chandef;
> + chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
> + chandef->center_freq1 = chandef->chan->center_freq;
> + chandef->center_freq2 = 0;
> ieee80211_hw_config(local, 0);
> } else {
> drv_remove_chanctx(local, ctx);
> diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
> index c7f8b8b..f9782f0 100644
> --- a/net/mac80211/ieee80211_i.h
> +++ b/net/mac80211/ieee80211_i.h
> @@ -1021,8 +1021,7 @@ struct ieee80211_local {
> struct ieee80211_sub_if_data __rcu *scan_sdata;
> struct ieee80211_channel *csa_channel;
> /* For backward compatibility only -- do not use */
> - struct ieee80211_channel *_oper_channel;
> - enum nl80211_channel_type _oper_channel_type;
> + struct cfg80211_chan_def _oper_chandef;
>
> /* Temporary remain-on-channel for off-channel operations */
> struct ieee80211_channel *tmp_channel;
> diff --git a/net/mac80211/main.c b/net/mac80211/main.c
> index b0d2868..a16b037 100644
> --- a/net/mac80211/main.c
> +++ b/net/mac80211/main.c
> @@ -95,42 +95,47 @@ static void ieee80211_reconfig_filter(struct work_struct *work)
> static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local)
> {
> struct ieee80211_sub_if_data *sdata;
> - struct ieee80211_channel *chan;
> + struct cfg80211_chan_def chandef = {};
> u32 changed = 0;
> int power;
> - enum nl80211_channel_type channel_type;
> u32 offchannel_flag;
>
> offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
> +
> if (local->scan_channel) {
> - chan = local->scan_channel;
> + chandef.chan = local->scan_channel;
> /* If scanning on oper channel, use whatever channel-type
> * is currently in use.
> */
> - if (chan == local->_oper_channel)
> - channel_type = local->_oper_channel_type;
> - else
> - channel_type = NL80211_CHAN_NO_HT;
> + if (chandef.chan == local->_oper_chandef.chan) {
> + chandef = local->_oper_chandef;
> + } else {
> + chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
> + chandef.center_freq1 = chandef.chan->center_freq;
> + }
> } else if (local->tmp_channel) {
> - chan = local->tmp_channel;
> - channel_type = NL80211_CHAN_NO_HT;
> - } else {
> - chan = local->_oper_channel;
> - channel_type = local->_oper_channel_type;
> - }
> -
> - if (chan != local->_oper_channel ||
> - channel_type != local->_oper_channel_type)
> + chandef.chan = local->tmp_channel;
> + chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
> + chandef.center_freq1 = chandef.chan->center_freq;
> + } else
> + chandef = local->_oper_chandef;
> +
> + WARN(!cfg80211_chandef_valid(&chandef),
> + "control:%d MHz width:%d center: %d/%d MHz",
> + chandef.chan->center_freq, chandef.width,
> + chandef.center_freq1, chandef.center_freq2);
> +
> + if (!cfg80211_chandef_identical(&chandef, &local->_oper_chandef))
> local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL;
> else
> local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL;
>
> offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
>
> - if (offchannel_flag || chan != local->hw.conf.channel ||
> - channel_type != local->hw.conf.channel_type) {
> - local->hw.conf.channel = chan;
> - local->hw.conf.channel_type = channel_type;
> + if (offchannel_flag ||
> + !cfg80211_chandef_identical(&local->hw.conf.chandef,
> + &local->_oper_chandef)) {
> + local->hw.conf.chandef = chandef;
> changed |= IEEE80211_CONF_CHANGE_CHANNEL;
> }
>
> @@ -146,7 +151,7 @@ static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local)
> changed |= IEEE80211_CONF_CHANGE_SMPS;
> }
>
> - power = chan->max_power;
> + power = chandef.chan->max_power;
>
> rcu_read_lock();
> list_for_each_entry_rcu(sdata, &local->interfaces, list) {
> @@ -740,11 +745,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
> sband = local->hw.wiphy->bands[band];
> if (!sband)
> continue;
> - if (!local->use_chanctx && !local->_oper_channel) {
> + if (!local->use_chanctx && !local->_oper_chandef.chan) {
> /* init channel we're on */
> - local->hw.conf.channel =
> - local->_oper_channel = &sband->channels[0];
> - local->hw.conf.channel_type = NL80211_CHAN_NO_HT;
> + struct cfg80211_chan_def chandef = {
> + .chan = &sband->channels[0],
> + .width = NL80211_CHAN_NO_HT,
> + .center_freq1 = sband->channels[0].center_freq,
> + .center_freq2 = 0
> + };
> + local->hw.conf.chandef = local->_oper_chandef = chandef;
> }
> cfg80211_chandef_create(&local->monitor_chandef,
> &sband->channels[0],
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index 9958cb7..237e2ef 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -988,6 +988,7 @@ static void ieee80211_chswitch_work(struct work_struct *work)
> {
> struct ieee80211_sub_if_data *sdata =
> container_of(work, struct ieee80211_sub_if_data, u.mgd.chswitch_work);
> + struct ieee80211_local *local = sdata->local;
> struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
>
> if (!ieee80211_sdata_running(sdata))
> @@ -997,21 +998,30 @@ static void ieee80211_chswitch_work(struct work_struct *work)
> if (!ifmgd->associated)
> goto out;
>
> - sdata->local->_oper_channel = sdata->local->csa_channel;
> - if (!sdata->local->ops->channel_switch) {
> + /*
> + * FIXME: Here we are downgrading to NL80211_CHAN_WIDTH_20_NOHT
> + * and don't adjust our ht/vht settings
> + * This is wrong - we should behave according to the CSA params
> + */
> + local->_oper_chandef.chan = local->csa_channel;
> + local->_oper_chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
> + local->_oper_chandef.center_freq1 =
> + local->_oper_chandef.chan->center_freq;
> + local->_oper_chandef.center_freq2 = 0;
> +
> + if (!local->ops->channel_switch) {
> /* call "hw_config" only if doing sw channel switch */
> - ieee80211_hw_config(sdata->local,
> - IEEE80211_CONF_CHANGE_CHANNEL);
> + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
> } else {
> /* update the device channel directly */
> - sdata->local->hw.conf.channel = sdata->local->_oper_channel;
> + local->hw.conf.chandef = local->_oper_chandef;
> }
>
> /* XXX: shouldn't really modify cfg80211-owned data! */
> - ifmgd->associated->channel = sdata->local->_oper_channel;
> + ifmgd->associated->channel = local->_oper_chandef.chan;
>
> /* XXX: wait for a beacon first? */
> - ieee80211_wake_queues_by_reason(&sdata->local->hw,
> + ieee80211_wake_queues_by_reason(&local->hw,
> IEEE80211_MAX_QUEUE_MAP,
> IEEE80211_QUEUE_STOP_REASON_CSA);
> out:
> diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
> index cb34cbb..581764f 100644
> --- a/net/mac80211/scan.c
> +++ b/net/mac80211/scan.c
> @@ -384,7 +384,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
> {
> int i;
> struct ieee80211_sub_if_data *sdata;
> - enum ieee80211_band band = local->hw.conf.channel->band;
> + enum ieee80211_band band = local->hw.conf.chandef.chan->band;
> u32 tx_flags;
>
> tx_flags = IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
> @@ -401,7 +401,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
> local->scan_req->ssids[i].ssid_len,
> local->scan_req->ie, local->scan_req->ie_len,
> local->scan_req->rates[band], false,
> - tx_flags, local->hw.conf.channel, true);
> + tx_flags, local->hw.conf.chandef.chan, true);
>
> /*
> * After sending probe requests, wait for probe responses
> @@ -467,7 +467,7 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
> if (local->ops->hw_scan) {
> __set_bit(SCAN_HW_SCANNING, &local->scanning);
> } else if ((req->n_channels == 1) &&
> - (req->channels[0] == local->_oper_channel)) {
> + (req->channels[0] == local->_oper_chandef.chan)) {
> /*
> * If we are scanning only on the operating channel
> * then we do not need to stop normal activities
> diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
> index d79e374..8286dce 100644
> --- a/net/mac80211/trace.h
> +++ b/net/mac80211/trace.h
> @@ -28,27 +28,27 @@
> #define VIF_PR_FMT " vif:%s(%d%s)"
> #define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
>
> -#define CHANDEF_ENTRY __field(u32, control_freq) \
> - __field(u32, chan_width) \
> - __field(u32, center_freq1) \
> +#define CHANDEF_ENTRY __field(u32, control_freq) \
> + __field(u32, chan_width) \
> + __field(u32, center_freq1) \
> __field(u32, center_freq2)
> -#define CHANDEF_ASSIGN(c) \
> - __entry->control_freq = (c)->chan->center_freq; \
> - __entry->chan_width = (c)->width; \
> - __entry->center_freq1 = (c)->center_freq1; \
> +#define CHANDEF_ASSIGN(c) \
> + __entry->control_freq = (c)->chan ? (c)->chan->center_freq : 0; \
> + __entry->chan_width = (c)->width; \
> + __entry->center_freq1 = (c)->center_freq1; \
> __entry->center_freq2 = (c)->center_freq2;
> #define CHANDEF_PR_FMT " control:%d MHz width:%d center: %d/%d MHz"
> -#define CHANDEF_PR_ARG __entry->control_freq, __entry->chan_width, \
> +#define CHANDEF_PR_ARG __entry->control_freq, __entry->chan_width, \
> __entry->center_freq1, __entry->center_freq2
>
> -#define CHANCTX_ENTRY CHANDEF_ENTRY \
> - __field(u8, rx_chains_static) \
> +#define CHANCTX_ENTRY CHANDEF_ENTRY \
> + __field(u8, rx_chains_static) \
> __field(u8, rx_chains_dynamic)
> -#define CHANCTX_ASSIGN CHANDEF_ASSIGN(&ctx->conf.def) \
> - __entry->rx_chains_static = ctx->conf.rx_chains_static; \
> +#define CHANCTX_ASSIGN CHANDEF_ASSIGN(&ctx->conf.def) \
> + __entry->rx_chains_static = ctx->conf.rx_chains_static; \
> __entry->rx_chains_dynamic = ctx->conf.rx_chains_dynamic
> #define CHANCTX_PR_FMT CHANDEF_PR_FMT " chains:%d/%d"
> -#define CHANCTX_PR_ARG CHANDEF_PR_ARG, \
> +#define CHANCTX_PR_ARG CHANDEF_PR_ARG, \
> __entry->rx_chains_static, __entry->rx_chains_dynamic
>
>
> @@ -286,8 +286,7 @@ TRACE_EVENT(drv_config,
> __field(u16, listen_interval)
> __field(u8, long_frame_max_tx_count)
> __field(u8, short_frame_max_tx_count)
> - __field(int, center_freq)
> - __field(int, channel_type)
> + CHANDEF_ENTRY
> __field(int, smps)
> ),
>
> @@ -303,15 +302,13 @@ TRACE_EVENT(drv_config,
> local->hw.conf.long_frame_max_tx_count;
> __entry->short_frame_max_tx_count =
> local->hw.conf.short_frame_max_tx_count;
> - __entry->center_freq = local->hw.conf.channel ?
> - local->hw.conf.channel->center_freq : 0;
> - __entry->channel_type = local->hw.conf.channel_type;
> + CHANDEF_ASSIGN(&local->hw.conf.chandef)
> __entry->smps = local->hw.conf.smps_mode;
> ),
>
> TP_printk(
> - LOCAL_PR_FMT " ch:%#x freq:%d",
> - LOCAL_PR_ARG, __entry->changed, __entry->center_freq
> + LOCAL_PR_FMT " ch:%#x" CHANDEF_PR_FMT,
> + LOCAL_PR_ARG, __entry->changed, CHANDEF_PR_ARG
> )
> );
>
> diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
> index 4a83d8d..aad0bf5 100644
> --- a/net/mac80211/tx.c
> +++ b/net/mac80211/tx.c
> @@ -1709,7 +1709,7 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
> if (chanctx_conf)
> chan = chanctx_conf->def.chan;
> else if (!local->use_chanctx)
> - chan = local->_oper_channel;
> + chan = local->_oper_chandef.chan;
> else
> goto fail_rcu;
>
> @@ -1843,7 +1843,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
> * This is the exception! WDS style interfaces are prohibited
> * when channel contexts are in used so this must be valid
> */
> - band = local->hw.conf.channel->band;
> + band = local->hw.conf.chandef.chan->band;
> break;
> #ifdef CONFIG_MAC80211_MESH
> case NL80211_IFTYPE_MESH_POINT:
> diff --git a/net/mac80211/util.c b/net/mac80211/util.c
> index 90cc2b8..1734cd2 100644
> --- a/net/mac80211/util.c
> +++ b/net/mac80211/util.c
> @@ -2171,8 +2171,7 @@ void ieee80211_dfs_radar_detected_work(struct work_struct *work)
> /* currently not handled */
> WARN_ON(1);
> else {
> - cfg80211_chandef_create(&chandef, local->hw.conf.channel,
> - local->hw.conf.channel_type);
> + chandef = local->hw.conf.chandef;
> cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
> }
> }
> --
> 1.7.9.dirty
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers
2013-03-25 20:51 [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
` (2 preceding siblings ...)
2013-03-25 20:51 ` [PATCH v2 3/3] mac80211_hwsim: advertise VHT support also when channels == 1 Karl Beldan
@ 2013-03-25 21:35 ` Karl Beldan
3 siblings, 0 replies; 6+ messages in thread
From: Karl Beldan @ 2013-03-25 21:35 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, fengguang.wu
On Mon, Mar 25, 2013 at 09:51:42PM +0100, Karl Beldan wrote:
>
> Fengguang's build with v1 yields kernel-doc warnings.
> This v2 replaces the @channel+@channel_type kernel-doc entries in
> struct ieee80211_conf with an @chandef.
>
Just saw you had already fixed that in your wip branch, thanks.
Karl
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-03-25 21:35 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-25 20:51 [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
2013-03-25 20:51 ` [PATCH v2 1/3] mac80211: Use a cfg80211_chan_def in ieee80211_hw_conf_chan Karl Beldan
2013-03-25 21:11 ` Gertjan van Wingerde
2013-03-25 20:51 ` [PATCH v2 2/3] Let drivers not supporting channel contexts use VHT Karl Beldan
2013-03-25 20:51 ` [PATCH v2 3/3] mac80211_hwsim: advertise VHT support also when channels == 1 Karl Beldan
2013-03-25 21:35 ` [PATCH v2 0/3] mac80211: Enable VHT for non chanctxes drivers Karl Beldan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.