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>
This commit is contained in:

committed by
John W. Linville

parent
6db3786aee
commit
b869767b6f
@@ -34,7 +34,6 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
|
||||
struct sk_buff *frag_skb)
|
||||
{
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(frag_skb);
|
||||
struct skb_frame_desc *skbdesc;
|
||||
struct ieee80211_tx_info *rts_info;
|
||||
struct sk_buff *skb;
|
||||
int size;
|
||||
@@ -82,13 +81,6 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
|
||||
frag_skb->data, size, tx_info,
|
||||
(struct ieee80211_rts *)(skb->data));
|
||||
|
||||
/*
|
||||
* Initialize skb descriptor
|
||||
*/
|
||||
skbdesc = get_skb_frame_desc(skb);
|
||||
memset(skbdesc, 0, sizeof(*skbdesc));
|
||||
skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED;
|
||||
|
||||
if (rt2x00queue_write_tx_frame(queue, skb)) {
|
||||
WARNING(rt2x00dev, "Failed to send RTS/CTS frame.\n");
|
||||
return NETDEV_TX_BUSY;
|
||||
@@ -163,7 +155,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
if (rt2x00queue_full(queue))
|
||||
if (rt2x00queue_threshold(queue))
|
||||
ieee80211_stop_queue(rt2x00dev->hw, qid);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
Reference in New Issue
Block a user