ath5k: properly drop packets from ops->tx
authorBob Copeland <me@bobcopeland.com>
Tue, 24 Mar 2009 03:35:37 +0000 (23:35 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Sat, 28 Mar 2009 00:13:19 +0000 (20:13 -0400)
We shouldn't return NETDEV_TX_BUSY from the TX callback, especially
after we've mucked with the sk_buffs.  Drop the packets and return
NETDEV_TX_OK.

Changes-licensed-under: 3-Clause-BSD

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath5k/base.c

index 6580df2f74433495019c22b744d02f96a323d4a3..5d57d774e466b0308b47df24b5871005dcc4fc51 100644 (file)
@@ -2562,7 +2562,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
                if (skb_headroom(skb) < padsize) {
                        ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough"
                                  " headroom to pad %d\n", hdrlen, padsize);
-                       return NETDEV_TX_BUSY;
+                       goto drop_packet;
                }
                skb_push(skb, padsize);
                memmove(skb->data, skb->data+padsize, hdrlen);
@@ -2573,7 +2573,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
                ATH5K_ERR(sc, "no further txbuf available, dropping packet\n");
                spin_unlock_irqrestore(&sc->txbuflock, flags);
                ieee80211_stop_queue(hw, skb_get_queue_mapping(skb));
-               return NETDEV_TX_BUSY;
+               goto drop_packet;
        }
        bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list);
        list_del(&bf->list);
@@ -2590,10 +2590,12 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
                list_add_tail(&bf->list, &sc->txbuf);
                sc->txbuf_len++;
                spin_unlock_irqrestore(&sc->txbuflock, flags);
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
+               goto drop_packet;
        }
+       return NETDEV_TX_OK;
 
+drop_packet:
+       dev_kfree_skb_any(skb);
        return NETDEV_TX_OK;
 }