diff options
author | Bruno Randolf <br1@einfach.org> | 2010-09-16 22:37:12 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-09-21 11:05:16 -0400 |
commit | de8af45520f47d14397b603beefae3d2983ce787 (patch) | |
tree | 493af409fabc1be554664480847ed280bd06ff6c /drivers/net/wireless/ath | |
parent | 234132960dcf8ebd9d424d92a4dfb0e57fa63a17 (diff) |
ath5k: Simplify cw_min/max and AIFS configuration
Get rid of overly complicated cw_min/max and AIFS configuration:
* Validate values in ath5k_hw_set_tx_queueprops(), so we can use them directly
without further checks or computation in ath5k_hw_reset_tx_queue().
* Simplifiy by using AR5K_TUNE_AIFS|CWMIN|CWMAX variables directly since we
don't support XR or B channels. That way we can also remove
AR5K_TXQ_USEDEFAULT and the confusing logic around it.
* Update data types: AIFS is u8, CW's are u16.
* Remove now unneeded variables in ath5k_hw.
Signed-off-by: Bruno Randolf <br1@einfach.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/ath5k.h | 11 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/attach.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/base.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/qcu.c | 99 |
4 files changed, 65 insertions, 65 deletions
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h index 9475b2157f2d..b96bb985b56d 100644 --- a/drivers/net/wireless/ath/ath5k/ath5k.h +++ b/drivers/net/wireless/ath/ath5k/ath5k.h | |||
@@ -258,8 +258,6 @@ | |||
258 | (AR5K_INIT_PROG_IFS_TURBO) \ | 258 | (AR5K_INIT_PROG_IFS_TURBO) \ |
259 | ) | 259 | ) |
260 | 260 | ||
261 | /* token to use for aifs, cwmin, cwmax in MadWiFi */ | ||
262 | #define AR5K_TXQ_USEDEFAULT ((u32) -1) | ||
263 | 261 | ||
264 | /* GENERIC CHIPSET DEFINITIONS */ | 262 | /* GENERIC CHIPSET DEFINITIONS */ |
265 | 263 | ||
@@ -530,9 +528,9 @@ struct ath5k_txq_info { | |||
530 | enum ath5k_tx_queue tqi_type; | 528 | enum ath5k_tx_queue tqi_type; |
531 | enum ath5k_tx_queue_subtype tqi_subtype; | 529 | enum ath5k_tx_queue_subtype tqi_subtype; |
532 | u16 tqi_flags; /* Tx queue flags (see above) */ | 530 | u16 tqi_flags; /* Tx queue flags (see above) */ |
533 | u32 tqi_aifs; /* Arbitrated Interframe Space */ | 531 | u8 tqi_aifs; /* Arbitrated Interframe Space */ |
534 | s32 tqi_cw_min; /* Minimum Contention Window */ | 532 | u16 tqi_cw_min; /* Minimum Contention Window */ |
535 | s32 tqi_cw_max; /* Maximum Contention Window */ | 533 | u16 tqi_cw_max; /* Maximum Contention Window */ |
536 | u32 tqi_cbr_period; /* Constant bit rate period */ | 534 | u32 tqi_cbr_period; /* Constant bit rate period */ |
537 | u32 tqi_cbr_overflow_limit; | 535 | u32 tqi_cbr_overflow_limit; |
538 | u32 tqi_burst_time; | 536 | u32 tqi_burst_time; |
@@ -1044,9 +1042,6 @@ struct ath5k_hw { | |||
1044 | #define ah_ee_version ah_capabilities.cap_eeprom.ee_version | 1042 | #define ah_ee_version ah_capabilities.cap_eeprom.ee_version |
1045 | 1043 | ||
1046 | u32 ah_atim_window; | 1044 | u32 ah_atim_window; |
1047 | u32 ah_aifs; | ||
1048 | u32 ah_cw_min; | ||
1049 | u32 ah_cw_max; | ||
1050 | u32 ah_limit_tx_retries; | 1045 | u32 ah_limit_tx_retries; |
1051 | u8 ah_coverage_class; | 1046 | u8 ah_coverage_class; |
1052 | 1047 | ||
diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c index 20d178eabc9c..6e02de311cdd 100644 --- a/drivers/net/wireless/ath/ath5k/attach.c +++ b/drivers/net/wireless/ath/ath5k/attach.c | |||
@@ -119,8 +119,6 @@ int ath5k_hw_attach(struct ath5k_softc *sc) | |||
119 | ah->ah_txpower.txp_tpc = AR5K_TUNE_TPC_TXPOWER; | 119 | ah->ah_txpower.txp_tpc = AR5K_TUNE_TPC_TXPOWER; |
120 | ah->ah_imr = 0; | 120 | ah->ah_imr = 0; |
121 | ah->ah_atim_window = 0; | 121 | ah->ah_atim_window = 0; |
122 | ah->ah_aifs = AR5K_TUNE_AIFS; | ||
123 | ah->ah_cw_min = AR5K_TUNE_CWMIN; | ||
124 | ah->ah_limit_tx_retries = AR5K_INIT_TX_RETRY; | 122 | ah->ah_limit_tx_retries = AR5K_INIT_TX_RETRY; |
125 | ah->ah_software_retry = false; | 123 | ah->ah_software_retry = false; |
126 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; | 124 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 3e5ed6c0c808..6bd8dd6f327b 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -849,9 +849,11 @@ ath5k_txq_setup(struct ath5k_softc *sc, | |||
849 | struct ath5k_txq *txq; | 849 | struct ath5k_txq *txq; |
850 | struct ath5k_txq_info qi = { | 850 | struct ath5k_txq_info qi = { |
851 | .tqi_subtype = subtype, | 851 | .tqi_subtype = subtype, |
852 | .tqi_aifs = AR5K_TXQ_USEDEFAULT, | 852 | /* XXX: default values not correct for B and XR channels, |
853 | .tqi_cw_min = AR5K_TXQ_USEDEFAULT, | 853 | * but who cares? */ |
854 | .tqi_cw_max = AR5K_TXQ_USEDEFAULT | 854 | .tqi_aifs = AR5K_TUNE_AIFS, |
855 | .tqi_cw_min = AR5K_TUNE_CWMIN, | ||
856 | .tqi_cw_max = AR5K_TUNE_CWMAX | ||
855 | }; | 857 | }; |
856 | int qnum; | 858 | int qnum; |
857 | 859 | ||
@@ -901,9 +903,11 @@ static int | |||
901 | ath5k_beaconq_setup(struct ath5k_hw *ah) | 903 | ath5k_beaconq_setup(struct ath5k_hw *ah) |
902 | { | 904 | { |
903 | struct ath5k_txq_info qi = { | 905 | struct ath5k_txq_info qi = { |
904 | .tqi_aifs = AR5K_TXQ_USEDEFAULT, | 906 | /* XXX: default values not correct for B and XR channels, |
905 | .tqi_cw_min = AR5K_TXQ_USEDEFAULT, | 907 | * but who cares? */ |
906 | .tqi_cw_max = AR5K_TXQ_USEDEFAULT, | 908 | .tqi_aifs = AR5K_TUNE_AIFS, |
909 | .tqi_cw_min = AR5K_TUNE_CWMIN, | ||
910 | .tqi_cw_max = AR5K_TUNE_CWMAX, | ||
907 | /* NB: for dynamic turbo, don't enable any other interrupts */ | 911 | /* NB: for dynamic turbo, don't enable any other interrupts */ |
908 | .tqi_flags = AR5K_TXQ_FLAG_TXDESCINT_ENABLE | 912 | .tqi_flags = AR5K_TXQ_FLAG_TXDESCINT_ENABLE |
909 | }; | 913 | }; |
@@ -937,7 +941,7 @@ ath5k_beaconq_config(struct ath5k_softc *sc) | |||
937 | */ | 941 | */ |
938 | qi.tqi_aifs = 0; | 942 | qi.tqi_aifs = 0; |
939 | qi.tqi_cw_min = 0; | 943 | qi.tqi_cw_min = 0; |
940 | qi.tqi_cw_max = 2 * ah->ah_cw_min; | 944 | qi.tqi_cw_max = 2 * AR5K_TUNE_CWMIN; |
941 | } | 945 | } |
942 | 946 | ||
943 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, | 947 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, |
diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c index 4186ff4c6e9c..84c717ded1c5 100644 --- a/drivers/net/wireless/ath/ath5k/qcu.c +++ b/drivers/net/wireless/ath/ath5k/qcu.c | |||
@@ -36,24 +36,58 @@ int ath5k_hw_get_tx_queueprops(struct ath5k_hw *ah, int queue, | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * Make sure cw is a power of 2 minus 1 and smaller than 1024 | ||
40 | */ | ||
41 | static u16 ath5k_cw_validate(u16 cw_req) | ||
42 | { | ||
43 | u32 cw = 1; | ||
44 | cw_req = min(cw_req, (u16)1023); | ||
45 | |||
46 | while (cw < cw_req) | ||
47 | cw = (cw << 1) | 1; | ||
48 | |||
49 | return cw; | ||
50 | } | ||
51 | |||
52 | /* | ||
39 | * Set properties for a transmit queue | 53 | * Set properties for a transmit queue |
40 | */ | 54 | */ |
41 | int ath5k_hw_set_tx_queueprops(struct ath5k_hw *ah, int queue, | 55 | int ath5k_hw_set_tx_queueprops(struct ath5k_hw *ah, int queue, |
42 | const struct ath5k_txq_info *queue_info) | 56 | const struct ath5k_txq_info *qinfo) |
43 | { | 57 | { |
58 | struct ath5k_txq_info *qi; | ||
59 | |||
44 | AR5K_ASSERT_ENTRY(queue, ah->ah_capabilities.cap_queues.q_tx_num); | 60 | AR5K_ASSERT_ENTRY(queue, ah->ah_capabilities.cap_queues.q_tx_num); |
45 | 61 | ||
46 | if (ah->ah_txq[queue].tqi_type == AR5K_TX_QUEUE_INACTIVE) | 62 | qi = &ah->ah_txq[queue]; |
63 | |||
64 | if (qi->tqi_type == AR5K_TX_QUEUE_INACTIVE) | ||
47 | return -EIO; | 65 | return -EIO; |
48 | 66 | ||
49 | memcpy(&ah->ah_txq[queue], queue_info, sizeof(struct ath5k_txq_info)); | 67 | /* copy and validate values */ |
68 | qi->tqi_type = qinfo->tqi_type; | ||
69 | qi->tqi_subtype = qinfo->tqi_subtype; | ||
70 | qi->tqi_flags = qinfo->tqi_flags; | ||
71 | /* | ||
72 | * According to the docs: Although the AIFS field is 8 bit wide, | ||
73 | * the maximum supported value is 0xFC. Setting it higher than that | ||
74 | * will cause the DCU to hang. | ||
75 | */ | ||
76 | qi->tqi_aifs = min(qinfo->tqi_aifs, (u8)0xFC); | ||
77 | qi->tqi_cw_min = ath5k_cw_validate(qinfo->tqi_cw_min); | ||
78 | qi->tqi_cw_max = ath5k_cw_validate(qinfo->tqi_cw_max); | ||
79 | qi->tqi_cbr_period = qinfo->tqi_cbr_period; | ||
80 | qi->tqi_cbr_overflow_limit = qinfo->tqi_cbr_overflow_limit; | ||
81 | qi->tqi_burst_time = qinfo->tqi_burst_time; | ||
82 | qi->tqi_ready_time = qinfo->tqi_ready_time; | ||
50 | 83 | ||
51 | /*XXX: Is this supported on 5210 ?*/ | 84 | /*XXX: Is this supported on 5210 ?*/ |
52 | if ((queue_info->tqi_type == AR5K_TX_QUEUE_DATA && | 85 | /*XXX: Is this correct for AR5K_WME_AC_VI,VO ???*/ |
53 | ((queue_info->tqi_subtype == AR5K_WME_AC_VI) || | 86 | if ((qinfo->tqi_type == AR5K_TX_QUEUE_DATA && |
54 | (queue_info->tqi_subtype == AR5K_WME_AC_VO))) || | 87 | ((qinfo->tqi_subtype == AR5K_WME_AC_VI) || |
55 | queue_info->tqi_type == AR5K_TX_QUEUE_UAPSD) | 88 | (qinfo->tqi_subtype == AR5K_WME_AC_VO))) || |
56 | ah->ah_txq[queue].tqi_flags |= AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS; | 89 | qinfo->tqi_type == AR5K_TX_QUEUE_UAPSD) |
90 | qi->tqi_flags |= AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS; | ||
57 | 91 | ||
58 | return 0; | 92 | return 0; |
59 | } | 93 | } |
@@ -186,7 +220,7 @@ void ath5k_hw_release_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
186 | */ | 220 | */ |
187 | int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | 221 | int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) |
188 | { | 222 | { |
189 | u32 cw_min, cw_max, retry_lg, retry_sh; | 223 | u32 retry_lg, retry_sh; |
190 | struct ath5k_txq_info *tq = &ah->ah_txq[queue]; | 224 | struct ath5k_txq_info *tq = &ah->ah_txq[queue]; |
191 | 225 | ||
192 | AR5K_ASSERT_ENTRY(queue, ah->ah_capabilities.cap_queues.q_tx_num); | 226 | AR5K_ASSERT_ENTRY(queue, ah->ah_capabilities.cap_queues.q_tx_num); |
@@ -217,14 +251,13 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
217 | /* Set IFS0 */ | 251 | /* Set IFS0 */ |
218 | if (ah->ah_turbo) { | 252 | if (ah->ah_turbo) { |
219 | ath5k_hw_reg_write(ah, ((AR5K_INIT_SIFS_TURBO + | 253 | ath5k_hw_reg_write(ah, ((AR5K_INIT_SIFS_TURBO + |
220 | (ah->ah_aifs + tq->tqi_aifs) * | 254 | tq->tqi_aifs * AR5K_INIT_SLOT_TIME_TURBO) << |
221 | AR5K_INIT_SLOT_TIME_TURBO) << | ||
222 | AR5K_IFS0_DIFS_S) | AR5K_INIT_SIFS_TURBO, | 255 | AR5K_IFS0_DIFS_S) | AR5K_INIT_SIFS_TURBO, |
223 | AR5K_IFS0); | 256 | AR5K_IFS0); |
224 | } else { | 257 | } else { |
225 | ath5k_hw_reg_write(ah, ((AR5K_INIT_SIFS + | 258 | ath5k_hw_reg_write(ah, ((AR5K_INIT_SIFS + |
226 | (ah->ah_aifs + tq->tqi_aifs) * | 259 | tq->tqi_aifs * AR5K_INIT_SLOT_TIME) << |
227 | AR5K_INIT_SLOT_TIME) << AR5K_IFS0_DIFS_S) | | 260 | AR5K_IFS0_DIFS_S) | |
228 | AR5K_INIT_SIFS, AR5K_IFS0); | 261 | AR5K_INIT_SIFS, AR5K_IFS0); |
229 | } | 262 | } |
230 | 263 | ||
@@ -248,35 +281,6 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
248 | } | 281 | } |
249 | 282 | ||
250 | /* | 283 | /* |
251 | * Calculate cwmin/max by channel mode | ||
252 | */ | ||
253 | cw_min = ah->ah_cw_min = AR5K_TUNE_CWMIN; | ||
254 | cw_max = ah->ah_cw_max = AR5K_TUNE_CWMAX; | ||
255 | ah->ah_aifs = AR5K_TUNE_AIFS; | ||
256 | /*XR is only supported on 5212*/ | ||
257 | if (IS_CHAN_XR(ah->ah_current_channel) && | ||
258 | ah->ah_version == AR5K_AR5212) { | ||
259 | cw_min = ah->ah_cw_min = AR5K_TUNE_CWMIN_XR; | ||
260 | cw_max = ah->ah_cw_max = AR5K_TUNE_CWMAX_XR; | ||
261 | ah->ah_aifs = AR5K_TUNE_AIFS_XR; | ||
262 | /*B mode is not supported on 5210*/ | ||
263 | } else if (IS_CHAN_B(ah->ah_current_channel) && | ||
264 | ah->ah_version != AR5K_AR5210) { | ||
265 | cw_min = ah->ah_cw_min = AR5K_TUNE_CWMIN_11B; | ||
266 | cw_max = ah->ah_cw_max = AR5K_TUNE_CWMAX_11B; | ||
267 | ah->ah_aifs = AR5K_TUNE_AIFS_11B; | ||
268 | } | ||
269 | |||
270 | cw_min = 1; | ||
271 | while (cw_min < ah->ah_cw_min) | ||
272 | cw_min = (cw_min << 1) | 1; | ||
273 | |||
274 | cw_min = tq->tqi_cw_min < 0 ? (cw_min >> (-tq->tqi_cw_min)) : | ||
275 | ((cw_min << tq->tqi_cw_min) + (1 << tq->tqi_cw_min) - 1); | ||
276 | cw_max = tq->tqi_cw_max < 0 ? (cw_max >> (-tq->tqi_cw_max)) : | ||
277 | ((cw_max << tq->tqi_cw_max) + (1 << tq->tqi_cw_max) - 1); | ||
278 | |||
279 | /* | ||
280 | * Calculate and set retry limits | 284 | * Calculate and set retry limits |
281 | */ | 285 | */ |
282 | if (ah->ah_software_retry) { | 286 | if (ah->ah_software_retry) { |
@@ -292,7 +296,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
292 | /*No QCU/DCU [5210]*/ | 296 | /*No QCU/DCU [5210]*/ |
293 | if (ah->ah_version == AR5K_AR5210) { | 297 | if (ah->ah_version == AR5K_AR5210) { |
294 | ath5k_hw_reg_write(ah, | 298 | ath5k_hw_reg_write(ah, |
295 | (cw_min << AR5K_NODCU_RETRY_LMT_CW_MIN_S) | 299 | (tq->tqi_cw_min << AR5K_NODCU_RETRY_LMT_CW_MIN_S) |
296 | | AR5K_REG_SM(AR5K_INIT_SLG_RETRY, | 300 | | AR5K_REG_SM(AR5K_INIT_SLG_RETRY, |
297 | AR5K_NODCU_RETRY_LMT_SLG_RETRY) | 301 | AR5K_NODCU_RETRY_LMT_SLG_RETRY) |
298 | | AR5K_REG_SM(AR5K_INIT_SSH_RETRY, | 302 | | AR5K_REG_SM(AR5K_INIT_SSH_RETRY, |
@@ -314,14 +318,13 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
314 | /*===Rest is also for QCU/DCU only [5211+]===*/ | 318 | /*===Rest is also for QCU/DCU only [5211+]===*/ |
315 | 319 | ||
316 | /* | 320 | /* |
317 | * Set initial content window (cw_min/cw_max) | 321 | * Set contention window (cw_min/cw_max) |
318 | * and arbitrated interframe space (aifs)... | 322 | * and arbitrated interframe space (aifs)... |
319 | */ | 323 | */ |
320 | ath5k_hw_reg_write(ah, | 324 | ath5k_hw_reg_write(ah, |
321 | AR5K_REG_SM(cw_min, AR5K_DCU_LCL_IFS_CW_MIN) | | 325 | AR5K_REG_SM(tq->tqi_cw_min, AR5K_DCU_LCL_IFS_CW_MIN) | |
322 | AR5K_REG_SM(cw_max, AR5K_DCU_LCL_IFS_CW_MAX) | | 326 | AR5K_REG_SM(tq->tqi_cw_max, AR5K_DCU_LCL_IFS_CW_MAX) | |
323 | AR5K_REG_SM(ah->ah_aifs + tq->tqi_aifs, | 327 | AR5K_REG_SM(tq->tqi_aifs, AR5K_DCU_LCL_IFS_AIFS), |
324 | AR5K_DCU_LCL_IFS_AIFS), | ||
325 | AR5K_QUEUE_DFS_LOCAL_IFS(queue)); | 328 | AR5K_QUEUE_DFS_LOCAL_IFS(queue)); |
326 | 329 | ||
327 | /* | 330 | /* |