diff options
author | Ivo van Doorn <IvDoorn@gmail.com> | 2008-06-06 16:53:14 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-06-14 12:17:56 -0400 |
commit | b869767b6f5049f1d1ede2bb3e48832e0722ca5a (patch) | |
tree | a75e43aad931ffdaea889af7b2275f12a16f077a /drivers/net/wireless/rt2x00/rt2x00mac.c | |
parent | 6db3786aee36b32e5ed072ed67fad6d5341b0991 (diff) |
rt2x00: Don't kick TX queue after each frame
TX queues shouldn't be kicked after each frame that is put into the
queue. This could cause problems during RTS and CTS-to-self as well
as with fragmentation. In all those cases you want all frames to be
send out in a single burst. Off course we shouldn't let the queue fill
up entirely, thus we introduce a 10% threshold which, when reached,
will force the frames to be send out regardless of the frame.
In addition we should prevent queues to become full in such a way
that the tx() handler can fail. Instead of stopping the queue when
it is full, we should stop it when it is below the threshold.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00mac.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 10 |
1 files changed, 1 insertions, 9 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index e7f544c404bc..59f273bf5b5e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -34,7 +34,6 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, | |||
34 | struct sk_buff *frag_skb) | 34 | struct sk_buff *frag_skb) |
35 | { | 35 | { |
36 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(frag_skb); | 36 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(frag_skb); |
37 | struct skb_frame_desc *skbdesc; | ||
38 | struct ieee80211_tx_info *rts_info; | 37 | struct ieee80211_tx_info *rts_info; |
39 | struct sk_buff *skb; | 38 | struct sk_buff *skb; |
40 | int size; | 39 | int size; |
@@ -82,13 +81,6 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, | |||
82 | frag_skb->data, size, tx_info, | 81 | frag_skb->data, size, tx_info, |
83 | (struct ieee80211_rts *)(skb->data)); | 82 | (struct ieee80211_rts *)(skb->data)); |
84 | 83 | ||
85 | /* | ||
86 | * Initialize skb descriptor | ||
87 | */ | ||
88 | skbdesc = get_skb_frame_desc(skb); | ||
89 | memset(skbdesc, 0, sizeof(*skbdesc)); | ||
90 | skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED; | ||
91 | |||
92 | if (rt2x00queue_write_tx_frame(queue, skb)) { | 84 | if (rt2x00queue_write_tx_frame(queue, skb)) { |
93 | WARNING(rt2x00dev, "Failed to send RTS/CTS frame.\n"); | 85 | WARNING(rt2x00dev, "Failed to send RTS/CTS frame.\n"); |
94 | return NETDEV_TX_BUSY; | 86 | return NETDEV_TX_BUSY; |
@@ -163,7 +155,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
163 | return NETDEV_TX_BUSY; | 155 | return NETDEV_TX_BUSY; |
164 | } | 156 | } |
165 | 157 | ||
166 | if (rt2x00queue_full(queue)) | 158 | if (rt2x00queue_threshold(queue)) |
167 | ieee80211_stop_queue(rt2x00dev->hw, qid); | 159 | ieee80211_stop_queue(rt2x00dev->hw, qid); |
168 | 160 | ||
169 | return NETDEV_TX_OK; | 161 | return NETDEV_TX_OK; |