aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00mac.c
diff options
context:
space:
mode:
authorIvo van Doorn <IvDoorn@gmail.com>2008-06-06 16:53:14 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-06-14 12:17:56 -0400
commitb869767b6f5049f1d1ede2bb3e48832e0722ca5a (patch)
treea75e43aad931ffdaea889af7b2275f12a16f077a /drivers/net/wireless/rt2x00/rt2x00mac.c
parent6db3786aee36b32e5ed072ed67fad6d5341b0991 (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.c10
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;