aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-10-11 17:30:56 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-10-14 13:39:58 -0400
commit6b21fd2027f8deb6fb7d3283b4c2eacabc8eeb95 (patch)
treec585fc28083ef4d8737f17febcaf79cc9e64f485
parent81c507a8b09fe00a1b4a2e7e84ba7234b126c332 (diff)
ath9k_hw: simplify channel flags
There was some duplication between channelFlags and chanmode, as well as a lot of redundant checks based on the combinations of flags. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/calib.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/common.c75
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c24
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h80
4 files changed, 50 insertions, 130 deletions
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index d438a0341e68..fe23026d82cd 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -408,7 +408,6 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
408 408
409 ah->caldata->channel = chan->channel; 409 ah->caldata->channel = chan->channel;
410 ah->caldata->channelFlags = chan->channelFlags; 410 ah->caldata->channelFlags = chan->channelFlags;
411 ah->caldata->chanmode = chan->chanmode;
412 h = ah->caldata->nfCalHist; 411 h = ah->caldata->nfCalHist;
413 default_nf = ath9k_hw_get_default_nf(ah, chan); 412 default_nf = ath9k_hw_get_default_nf(ah, chan);
414 for (i = 0; i < NUM_NF_READINGS; i++) { 413 for (i = 0; i < NUM_NF_READINGS; i++) {
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
index d3063c21e16c..b5ac26994f19 100644
--- a/drivers/net/wireless/ath/ath9k/common.c
+++ b/drivers/net/wireless/ath/ath9k/common.c
@@ -49,83 +49,44 @@ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb)
49} 49}
50EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype); 50EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype);
51 51
52static u32 ath9k_get_extchanmode(struct cfg80211_chan_def *chandef)
53{
54 u32 chanmode = 0;
55
56 switch (chandef->chan->band) {
57 case IEEE80211_BAND_2GHZ:
58 switch (chandef->width) {
59 case NL80211_CHAN_WIDTH_20_NOHT:
60 case NL80211_CHAN_WIDTH_20:
61 chanmode = CHANNEL_G_HT20;
62 break;
63 case NL80211_CHAN_WIDTH_40:
64 if (chandef->center_freq1 > chandef->chan->center_freq)
65 chanmode = CHANNEL_G_HT40PLUS;
66 else
67 chanmode = CHANNEL_G_HT40MINUS;
68 break;
69 default:
70 break;
71 }
72 break;
73 case IEEE80211_BAND_5GHZ:
74 switch (chandef->width) {
75 case NL80211_CHAN_WIDTH_20_NOHT:
76 case NL80211_CHAN_WIDTH_20:
77 chanmode = CHANNEL_A_HT20;
78 break;
79 case NL80211_CHAN_WIDTH_40:
80 if (chandef->center_freq1 > chandef->chan->center_freq)
81 chanmode = CHANNEL_A_HT40PLUS;
82 else
83 chanmode = CHANNEL_A_HT40MINUS;
84 break;
85 default:
86 break;
87 }
88 break;
89 default:
90 break;
91 }
92
93 return chanmode;
94}
95
96/* 52/*
97 * Update internal channel flags. 53 * Update internal channel flags.
98 */ 54 */
99void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 55void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
100 struct cfg80211_chan_def *chandef) 56 struct cfg80211_chan_def *chandef)
101{ 57{
102 ichan->channel = chandef->chan->center_freq; 58 struct ieee80211_channel *chan = chandef->chan;
103 ichan->chan = chandef->chan; 59 u16 flags = 0;
104 60
105 if (chandef->chan->band == IEEE80211_BAND_2GHZ) { 61 ichan->channel = chan->center_freq;
106 ichan->chanmode = CHANNEL_G; 62 ichan->chan = chan;
107 ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM; 63
108 } else { 64 if (chan->band == IEEE80211_BAND_5GHZ)
109 ichan->chanmode = CHANNEL_A; 65 flags |= CHANNEL_5GHZ;
110 ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
111 }
112 66
113 switch (chandef->width) { 67 switch (chandef->width) {
114 case NL80211_CHAN_WIDTH_5: 68 case NL80211_CHAN_WIDTH_5:
115 ichan->channelFlags |= CHANNEL_QUARTER; 69 flags |= CHANNEL_QUARTER;
116 break; 70 break;
117 case NL80211_CHAN_WIDTH_10: 71 case NL80211_CHAN_WIDTH_10:
118 ichan->channelFlags |= CHANNEL_HALF; 72 flags |= CHANNEL_HALF;
119 break; 73 break;
120 case NL80211_CHAN_WIDTH_20_NOHT: 74 case NL80211_CHAN_WIDTH_20_NOHT:
121 break; 75 break;
122 case NL80211_CHAN_WIDTH_20: 76 case NL80211_CHAN_WIDTH_20:
77 flags |= CHANNEL_HT;
78 break;
123 case NL80211_CHAN_WIDTH_40: 79 case NL80211_CHAN_WIDTH_40:
124 ichan->chanmode = ath9k_get_extchanmode(chandef); 80 if (chandef->center_freq1 > chandef->chan->center_freq)
81 flags |= CHANNEL_HT40PLUS | CHANNEL_HT;
82 else
83 flags |= CHANNEL_HT40MINUS | CHANNEL_HT;
125 break; 84 break;
126 default: 85 default:
127 WARN_ON(1); 86 WARN_ON(1);
128 } 87 }
88
89 ichan->channelFlags = flags;
129} 90}
130EXPORT_SYMBOL(ath9k_cmn_update_ichannel); 91EXPORT_SYMBOL(ath9k_cmn_update_ichannel);
131 92
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 40a1132910f5..bc7382fbcf66 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1156,7 +1156,7 @@ u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
1156{ 1156{
1157 u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band); 1157 u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band);
1158 1158
1159 if (IS_CHAN_G(chan)) 1159 if (IS_CHAN_2GHZ(chan))
1160 ctl |= CTL_11G; 1160 ctl |= CTL_11G;
1161 else 1161 else
1162 ctl |= CTL_11A; 1162 ctl |= CTL_11A;
@@ -1505,7 +1505,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
1505 1505
1506 if (pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) { 1506 if (pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) {
1507 band_switch = IS_CHAN_5GHZ(ah->curchan) != IS_CHAN_5GHZ(chan); 1507 band_switch = IS_CHAN_5GHZ(ah->curchan) != IS_CHAN_5GHZ(chan);
1508 mode_diff = (chan->chanmode != ah->curchan->chanmode); 1508 mode_diff = (chan->channelFlags != ah->curchan->channelFlags);
1509 } 1509 }
1510 1510
1511 for (qnum = 0; qnum < AR_NUM_QCU; qnum++) { 1511 for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
@@ -1814,20 +1814,11 @@ static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan)
1814 goto fail; 1814 goto fail;
1815 1815
1816 /* 1816 /*
1817 * If cross-band fcc is not supoprted, bail out if 1817 * If cross-band fcc is not supoprted, bail out if channelFlags differ.
1818 * either channelFlags or chanmode differ.
1819 *
1820 * chanmode will be different if the HT operating mode
1821 * changes because of CSA.
1822 */ 1818 */
1823 if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH)) { 1819 if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) &&
1824 if ((chan->channelFlags & CHANNEL_ALL) != 1820 chan->channelFlags != ah->curchan->channelFlags)
1825 (ah->curchan->channelFlags & CHANNEL_ALL)) 1821 goto fail;
1826 goto fail;
1827
1828 if (chan->chanmode != ah->curchan->chanmode)
1829 goto fail;
1830 }
1831 1822
1832 if (!ath9k_hw_check_alive(ah)) 1823 if (!ath9k_hw_check_alive(ah))
1833 goto fail; 1824 goto fail;
@@ -1889,8 +1880,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1889 1880
1890 ah->caldata = caldata; 1881 ah->caldata =