aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath
diff options
context:
space:
mode:
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>2013-08-14 02:01:36 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-16 14:17:49 -0400
commit6a09ae95ed248d6d946407bb1f955e5f2624663d (patch)
treec1db02516e464232cee0d18a94aa2976243de469 /drivers/net/wireless/ath
parent312a64435bda34bc7974140f8eb53a252b4ba4ed (diff)
ath5k: set 5/10 MHz supported channels and fix duration
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c24
-rw-r--r--drivers/net/wireless/ath/ath5k/pcu.c2
-rw-r--r--drivers/net/wireless/ath/ath5k/qcu.c25
3 files changed, 42 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 260a6fce89b5..7c298af35d42 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -165,28 +165,36 @@ static const struct ieee80211_rate ath5k_rates[] = {
165 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 165 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
166 { .bitrate = 60, 166 { .bitrate = 60,
167 .hw_value = ATH5K_RATE_CODE_6M, 167 .hw_value = ATH5K_RATE_CODE_6M,
168 .flags = 0 }, 168 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
169 IEEE80211_RATE_SUPPORTS_10MHZ },
169 { .bitrate = 90, 170 { .bitrate = 90,
170 .hw_value = ATH5K_RATE_CODE_9M, 171 .hw_value = ATH5K_RATE_CODE_9M,
171 .flags = 0 }, 172 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
173 IEEE80211_RATE_SUPPORTS_10MHZ },
172 { .bitrate = 120, 174 { .bitrate = 120,
173 .hw_value = ATH5K_RATE_CODE_12M, 175 .hw_value = ATH5K_RATE_CODE_12M,
174 .flags = 0 }, 176 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
177 IEEE80211_RATE_SUPPORTS_10MHZ },
175 { .bitrate = 180, 178 { .bitrate = 180,
176 .hw_value = ATH5K_RATE_CODE_18M, 179 .hw_value = ATH5K_RATE_CODE_18M,
177 .flags = 0 }, 180 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
181 IEEE80211_RATE_SUPPORTS_10MHZ },
178 { .bitrate = 240, 182 { .bitrate = 240,
179 .hw_value = ATH5K_RATE_CODE_24M, 183 .hw_value = ATH5K_RATE_CODE_24M,
180 .flags = 0 }, 184 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
185 IEEE80211_RATE_SUPPORTS_10MHZ },
181 { .bitrate = 360, 186 { .bitrate = 360,
182 .hw_value = ATH5K_RATE_CODE_36M, 187 .hw_value = ATH5K_RATE_CODE_36M,
183 .flags = 0 }, 188 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
189 IEEE80211_RATE_SUPPORTS_10MHZ },
184 { .bitrate = 480, 190 { .bitrate = 480,
185 .hw_value = ATH5K_RATE_CODE_48M, 191 .hw_value = ATH5K_RATE_CODE_48M,
186 .flags = 0 }, 192 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
193 IEEE80211_RATE_SUPPORTS_10MHZ },
187 { .bitrate = 540, 194 { .bitrate = 540,
188 .hw_value = ATH5K_RATE_CODE_54M, 195 .hw_value = ATH5K_RATE_CODE_54M,
189 .flags = 0 }, 196 .flags = IEEE80211_RATE_SUPPORTS_5MHZ |
197 IEEE80211_RATE_SUPPORTS_10MHZ },
190}; 198};
191 199
192static inline u64 ath5k_extend_tsf(struct ath5k_hw *ah, u32 rstamp) 200static inline u64 ath5k_extend_tsf(struct ath5k_hw *ah, u32 rstamp)
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c
index 1f16b4227d8f..c60d36aa13e2 100644
--- a/drivers/net/wireless/ath/ath5k/pcu.c
+++ b/drivers/net/wireless/ath/ath5k/pcu.c
@@ -144,11 +144,13 @@ ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum ieee80211_band band,
144 sifs = AR5K_INIT_SIFS_HALF_RATE; 144 sifs = AR5K_INIT_SIFS_HALF_RATE;
145 preamble *= 2; 145 preamble *= 2;
146 sym_time *= 2; 146 sym_time *= 2;
147 bitrate = DIV_ROUND_UP(bitrate, 2);
147 break; 148 break;
148 case AR5K_BWMODE_5MHZ: 149 case AR5K_BWMODE_5MHZ:
149 sifs = AR5K_INIT_SIFS_QUARTER_RATE; 150 sifs = AR5K_INIT_SIFS_QUARTER_RATE;
150 preamble *= 4; 151 preamble *= 4;
151 sym_time *= 4; 152 sym_time *= 4;
153 bitrate = DIV_ROUND_UP(bitrate, 4);
152 break; 154 break;
153 default: 155 default:
154 sifs = AR5K_INIT_SIFS_DEFAULT_BG; 156 sifs = AR5K_INIT_SIFS_DEFAULT_BG;
diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
index 65fe929529a8..0583c69d26db 100644
--- a/drivers/net/wireless/ath/ath5k/qcu.c
+++ b/drivers/net/wireless/ath/ath5k/qcu.c
@@ -566,9 +566,11 @@ int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
566{ 566{
567 struct ieee80211_channel *channel = ah->ah_current_channel; 567 struct ieee80211_channel *channel = ah->ah_current_channel;
568 enum ieee80211_band band; 568 enum ieee80211_band band;
569 struct ieee80211_supported_band *sband;
569 struct ieee80211_rate *rate; 570 struct ieee80211_rate *rate;
570 u32 ack_tx_time, eifs, eifs_clock, sifs, sifs_clock; 571 u32 ack_tx_time, eifs, eifs_clock, sifs, sifs_clock;
571 u32 slot_time_clock = ath5k_hw_htoclock(ah, slot_time); 572 u32 slot_time_clock = ath5k_hw_htoclock(ah, slot_time);
573 u32 rate_flags, i;
572 574
573 if (slot_time < 6 || slot_time_clock > AR5K_SLOT_TIME_MAX) 575 if (slot_time < 6 || slot_time_clock > AR5K_SLOT_TIME_MAX)
574 return -EINVAL; 576 return -EINVAL;
@@ -605,7 +607,28 @@ int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
605 else 607 else
606 band = IEEE80211_BAND_2GHZ; 608 band = IEEE80211_BAND_2GHZ;
607 609
608 rate = &ah->sbands[band].bitrates[0]; 610 switch (ah->ah_bwmode) {
611 case AR5K_BWMODE_5MHZ:
612 rate_flags = IEEE80211_RATE_SUPPORTS_5MHZ;
613 break;
614 case AR5K_BWMODE_10MHZ:
615 rate_flags = IEEE80211_RATE_SUPPORTS_10MHZ;
616 break;
617 default:
618 rate_flags = 0;
619 break;
620 }
621 sband = &ah->sbands[band];
622 rate = NULL;
623 for (i = 0; i < sband->n_bitrates; i++) {
624 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
625 continue;
626 rate = &sband->bitrates[i];
627 break;
628 }
629 if (WARN_ON(!rate))
630 return -EINVAL;
631
609 ack_tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, false); 632 ack_tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, false);
610 633
611 /* ack_tx_time includes an SIFS already */ 634 /* ack_tx_time includes an SIFS already */