diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-10-21 06:40:02 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-10-31 19:00:23 -0400 |
commit | e6a9854b05c1a6af1308fe2b8c68f35abf28a3ee (patch) | |
tree | 241f611f8194586ccabf61bacb060508773b9d05 /drivers/net/wireless/rt2x00/rt2x00queue.c | |
parent | cb121bad67a32cde37adc2729b7e18aa4fd3063e (diff) |
mac80211/drivers: rewrite the rate control API
So after the previous changes we were still unhappy with how
convoluted the API is and decided to make things simpler for
everybody. This completely changes the rate control API, now
taking into account 802.11n with MCS rates and more control,
most drivers don't support that though.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 451d410ecdae..070786ebd076 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -230,8 +230,15 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
230 | /* | 230 | /* |
231 | * Determine retry information. | 231 | * Determine retry information. |
232 | */ | 232 | */ |
233 | txdesc->retry_limit = tx_info->control.retry_limit; | 233 | txdesc->retry_limit = tx_info->control.rates[0].count - 1; |
234 | if (tx_info->flags & IEEE80211_TX_CTL_LONG_RETRY_LIMIT) | 234 | /* |
235 | * XXX: If at this point we knew whether the HW is going to use | ||
236 | * the RETRY_MODE bit or the retry_limit (currently all | ||
237 | * use the RETRY_MODE bit) we could do something like b43 | ||
238 | * does, set the RETRY_MODE bit when the RC algorithm is | ||
239 | * requesting more than the long retry limit. | ||
240 | */ | ||
241 | if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) | ||
235 | __set_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags); | 242 | __set_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags); |
236 | 243 | ||
237 | /* | 244 | /* |
@@ -371,10 +378,12 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, | |||
371 | 378 | ||
372 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | 379 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) |
373 | { | 380 | { |
381 | struct ieee80211_tx_info *tx_info; | ||
374 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); | 382 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); |
375 | struct txentry_desc txdesc; | 383 | struct txentry_desc txdesc; |
376 | struct skb_frame_desc *skbdesc; | 384 | struct skb_frame_desc *skbdesc; |
377 | unsigned int iv_len = 0; | 385 | unsigned int iv_len = 0; |
386 | u8 rate_idx, rate_flags; | ||
378 | 387 | ||
379 | if (unlikely(rt2x00queue_full(queue))) | 388 | if (unlikely(rt2x00queue_full(queue))) |
380 | return -EINVAL; | 389 | return -EINVAL; |
@@ -399,13 +408,18 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
399 | iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len; | 408 | iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len; |
400 | 409 | ||
401 | /* | 410 | /* |
402 | * All information is retreived from the skb->cb array, | 411 | * All information is retrieved from the skb->cb array, |
403 | * now we should claim ownership of the driver part of that | 412 | * now we should claim ownership of the driver part of that |
404 | * array. | 413 | * array, preserving the bitrate index and flags. |
405 | */ | 414 | */ |
415 | tx_info = IEEE80211_SKB_CB(skb); | ||
416 | rate_idx = tx_info->control.rates[0].idx; | ||
417 | rate_flags = tx_info->control.rates[0].flags; | ||
406 | skbdesc = get_skb_frame_desc(entry->skb); | 418 | skbdesc = get_skb_frame_desc(entry->skb); |
407 | memset(skbdesc, 0, sizeof(*skbdesc)); | 419 | memset(skbdesc, 0, sizeof(*skbdesc)); |
408 | skbdesc->entry = entry; | 420 | skbdesc->entry = entry; |
421 | skbdesc->tx_rate_idx = rate_idx; | ||
422 | skbdesc->tx_rate_flags = rate_flags; | ||
409 | 423 | ||
410 | /* | 424 | /* |
411 | * When hardware encryption is supported, and this frame | 425 | * When hardware encryption is supported, and this frame |