aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorBob Copeland <me@bobcopeland.com>2009-03-23 23:35:37 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-03-27 20:13:19 -0400
commit5a0fe8ac70f81b5b91156736066e6445d0dcc61f (patch)
treea348f244f66a5a594e08dccdaefd7d97d0472e8e /drivers/net
parentde00c04ecbb482507ace2197782123446a1cfdca (diff)
ath5k: properly drop packets from ops->tx
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>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath5k/base.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index 6580df2f7443..5d57d774e466 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -2562,7 +2562,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
2562 if (skb_headroom(skb) < padsize) { 2562 if (skb_headroom(skb) < padsize) {
2563 ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough" 2563 ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough"
2564 " headroom to pad %d\n", hdrlen, padsize); 2564 " headroom to pad %d\n", hdrlen, padsize);
2565 return NETDEV_TX_BUSY; 2565 goto drop_packet;
2566 } 2566 }
2567 skb_push(skb, padsize); 2567 skb_push(skb, padsize);
2568 memmove(skb->data, skb->data+padsize, hdrlen); 2568 memmove(skb->data, skb->data+padsize, hdrlen);
@@ -2573,7 +2573,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
2573 ATH5K_ERR(sc, "no further txbuf available, dropping packet\n"); 2573 ATH5K_ERR(sc, "no further txbuf available, dropping packet\n");
2574 spin_unlock_irqrestore(&sc->txbuflock, flags); 2574 spin_unlock_irqrestore(&sc->txbuflock, flags);
2575 ieee80211_stop_queue(hw, skb_get_queue_mapping(skb)); 2575 ieee80211_stop_queue(hw, skb_get_queue_mapping(skb));
2576 return NETDEV_TX_BUSY; 2576 goto drop_packet;
2577 } 2577 }
2578 bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list); 2578 bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list);
2579 list_del(&bf->list); 2579 list_del(&bf->list);
@@ -2590,10 +2590,12 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
2590 list_add_tail(&bf->list, &sc->txbuf); 2590 list_add_tail(&bf->list, &sc->txbuf);
2591 sc->txbuf_len++; 2591 sc->txbuf_len++;
2592 spin_unlock_irqrestore(&sc->txbuflock, flags); 2592 spin_unlock_irqrestore(&sc->txbuflock, flags);
2593 dev_kfree_skb_any(skb); 2593 goto drop_packet;
2594 return NETDEV_TX_OK;
2595 } 2594 }
2595 return NETDEV_TX_OK;
2596 2596
2597drop_packet:
2598 dev_kfree_skb_any(skb);
2597 return NETDEV_TX_OK; 2599 return NETDEV_TX_OK;
2598} 2600}
2599 2601