--- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h @@ -586,6 +586,7 @@ struct ath_softc { struct ieee80211_hw *hw; struct device *dev; + u32 chan_bw; int chan_idx; int chan_is_ht; struct survey_info *cur_survey; --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c @@ -1281,6 +1281,9 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); + debugfs_create_u32("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, + &sc->chan_bw); + sc->debug.regidx = 0; return 0; } --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -226,6 +226,7 @@ static int ath_set_channel(struct ath_so bool fastcc = true, stopped; struct ieee80211_channel *channel = hw->conf.channel; struct ath9k_hw_cal_data *caldata = NULL; + u32 oldflags; int r; if (sc->sc_flags & SC_OP_INVALID) @@ -268,6 +269,24 @@ static int ath_set_channel(struct ath_so if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL)) fastcc = false; + oldflags = hchan->channelFlags; + switch (sc->chan_bw) { + case 5: + hchan->channelFlags &= ~CHANNEL_HALF; + hchan->channelFlags |= CHANNEL_QUARTER; + break; + case 10: + hchan->channelFlags &= ~CHANNEL_QUARTER; + hchan->channelFlags |= CHANNEL_HALF; + break; + default: + hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER); + break; + } + + if (oldflags != hchan->channelFlags) + fastcc = false; + if (!(sc->sc_flags & SC_OP_OFFCHANNEL)) caldata = &sc->caldata;