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 = caldata;
1891 if (caldata && (chan->channel != caldata->channel || 1882 if (caldata && (chan->channel != caldata->channel ||
1892 chan->channelFlags != caldata->channelFlags || 1883 chan->channelFlags != caldata->channelFlags)) {
1893 chan->chanmode != caldata->chanmode)) {
1894 /* Operating channel changed, reset channel calibration data */ 1884 /* Operating channel changed, reset channel calibration data */
1895 memset(caldata, 0, sizeof(*caldata)); 1885 memset(caldata, 0, sizeof(*caldata));
1896 ath9k_init_nfcal_hist_buffer(ah, chan); 1886 ath9k_init_nfcal_hist_buffer(ah, chan);
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 0e446939b2d6..9d04d67843b2 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -369,36 +369,6 @@ enum ath9k_int {
369 ATH9K_INT_NOCARD = 0xffffffff 369 ATH9K_INT_NOCARD = 0xffffffff
370}; 370};
371 371
372#define CHANNEL_CCK 0x00020
373#define CHANNEL_OFDM 0x00040
374#define CHANNEL_2GHZ 0x00080
375#define CHANNEL_5GHZ 0x00100
376#define CHANNEL_PASSIVE 0x00200
377#define CHANNEL_DYN 0x00400
378#define CHANNEL_HALF 0x04000
379#define CHANNEL_QUARTER 0x08000
380#define CHANNEL_HT20 0x10000
381#define CHANNEL_HT40PLUS 0x20000
382#define CHANNEL_HT40MINUS 0x40000
383
384#define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
385#define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
386#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
387#define CHANNEL_G_HT20 (CHANNEL_2GHZ|CHANNEL_HT20)
388#define CHANNEL_A_HT20 (CHANNEL_5GHZ|CHANNEL_HT20)
389#define CHANNEL_G_HT40PLUS (CHANNEL_2GHZ|CHANNEL_HT40PLUS)
390#define CHANNEL_G_HT40MINUS (CHANNEL_2GHZ|CHANNEL_HT40MINUS)
391#define CHANNEL_A_HT40PLUS (CHANNEL_5GHZ|CHANNEL_HT40PLUS)
392#define CHANNEL_A_HT40MINUS (CHANNEL_5GHZ|CHANNEL_HT40MINUS)
393#define CHANNEL_ALL \
394 (CHANNEL_OFDM| \
395 CHANNEL_CCK| \
396 CHANNEL_2GHZ | \
397 CHANNEL_5GHZ | \
398 CHANNEL_HT20 | \
399 CHANNEL_HT40PLUS | \
400 CHANNEL_HT40MINUS)
401
402#define MAX_RTT_TABLE_ENTRY 6 372#define MAX_RTT_TABLE_ENTRY 6
403#define MAX_IQCAL_MEASUREMENT 8 373#define MAX_IQCAL_MEASUREMENT 8
404#define MAX_CL_TAB_ENTRY 16 374#define MAX_CL_TAB_ENTRY 16
@@ -417,8 +387,7 @@ enum ath9k_cal_flags {
417 387
418struct ath9k_hw_cal_data { 388struct ath9k_hw_cal_data {
419 u16 channel; 389 u16 channel;
420 u32 channelFlags; 390 u16 channelFlags;
421 u32 chanmode;
422 unsigned long cal_flags; 391 unsigned long cal_flags;
423 int32_t CalValid; 392 int32_t CalValid;
424 int8_t iCoff; 393 int8_t iCoff;
@@ -436,33 +405,34 @@ struct ath9k_hw_cal_data {
436struct ath9k_channel { 405struct ath9k_channel {
437 struct ieee80211_channel *chan; 406 struct ieee80211_channel *chan;
438 u16 channel; 407 u16 channel;
439 u32 channelFlags; 408 u16 channelFlags;
440 u32 chanmode;
441 s16 noisefloor; 409 s16 noisefloor;
442}; 410};
443 411
444#define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \ 412#define CHANNEL_5GHZ BIT(0)
445 (((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \ 413#define CHANNEL_HALF BIT(1)
446 (((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \ 414#define CHANNEL_QUARTER BIT(2)
447 (((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS)) 415#define CHANNEL_HT BIT(3)
448#define IS_CHAN_5GHZ(_c) (((_c)->channelFlags & CHANNEL_5GHZ) != 0) 416#define CHANNEL_HT40PLUS BIT(4)
449#define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0) 417#define CHANNEL_HT40MINUS BIT(5)
450#define IS_CHAN_HALF_RATE(_c) (((_c)->channelFlags & CHANNEL_HALF) != 0) 418
451#define IS_CHAN_QUARTER_RATE(_c) (((_c)->channelFlags & CHANNEL_QUARTER) != 0) 419#define IS_CHAN_5GHZ(_c) (!!((_c)->channelFlags & CHANNEL_5GHZ))
420#define IS_CHAN_2GHZ(_c) (!IS_CHAN_5GHZ(_c))
421
422#define IS_CHAN_HALF_RATE(_c) (!!((_c)->channelFlags & CHANNEL_HALF))
423#define IS_CHAN_QUARTER_RATE(_c) (!!((_c)->channelFlags & CHANNEL_QUARTER))
452#define IS_CHAN_A_FAST_CLOCK(_ah, _c) \ 424#define IS_CHAN_A_FAST_CLOCK(_ah, _c) \
453 ((((_c)->channelFlags & CHANNEL_5GHZ) != 0) && \ 425 (IS_CHAN_5GHZ(_c) && ((_ah)->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK))
454 ((_ah)->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)) 426
455 427#define IS_CHAN_HT(_c) ((_c)->channelFlags & CHANNEL_HT)
456/* These macros check chanmode and not channelFlags */ 428
457#define IS_CHAN_HT20(_c) (((_c)->chanmode == CHANNEL_A_HT20) || \ 429#define IS_CHAN_HT20(_c) (IS_CHAN_HT(_c) && !IS_CHAN_HT40(_c))
458 ((_c)->chanmode == CHANNEL_G_HT20)) 430
459#define IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) || \ 431#define IS_CHAN_HT40(_c) \
460 ((_c)->chanmode == CHANNEL_A_HT40MINUS) || \ 432 (!!((_c)->channelFlags & (CHANNEL_HT40PLUS | CHANNEL_HT40MINUS)))
461 ((_c)->chanmode == CHANNEL_G_HT40PLUS) || \ 433
462 ((_c)->chanmode == CHANNEL_G_HT40MINUS)) 434#define IS_CHAN_HT40PLUS(_c) ((_c)->channelFlags & CHANNEL_HT40PLUS)
463#define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c))) 435#define IS_CHAN_HT40MINUS(_c) ((_c)->channelFlags & CHANNEL_HT40MINUS)
464#define IS_CHAN_HT40PLUS(_c) ((_c)->chanmode & CHANNEL_HT40PLUS)
465#define IS_CHAN_HT40MINUS(_c) ((_c)->chanmode & CHANNEL_HT40MINUS)
466 436
467enum ath9k_power_mode { 437enum ath9k_power_mode {
468 ATH9K_PM_AWAKE = 0, 438 ATH9K_PM_AWAKE = 0,