Message ID | 20100118154750.GA9224@oksana.dev.rtsoft.ru (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
From: Anton Vorontsov <avorontsov@ru.mvista.com> Date: Mon, 18 Jan 2010 18:47:50 +0300 > From: Jiajun Wu <b06378@freescale.com> > > commit 7583605b6d29f1f7f6fc505b883328089f3485ad ("ucc_geth: Fix empty > TX queue processing") fixed empty TX queue mishandling, but didn't > account another corner case: when TX queue becomes full. > > Without this patch the driver will stop transmiting when TX queue > becomes full since 'bd == ugeth->txBd[txQ]' actually checks for > two things: queue empty or full. > > Let's better check for NULL skb, which unambiguously signals an empty > queue. > > Signed-off-by: Jiajun Wu <b06378@freescale.com> > Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Applied.
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 96bdc0b..eb8fe7e 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -3279,13 +3279,12 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) /* Handle the transmitted buffer and release */ /* the BD to be used with the current frame */ - if (bd == ugeth->txBd[txQ]) /* queue empty? */ + skb = ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]]; + if (!skb) break; dev->stats.tx_packets++; - skb = ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]]; - if (skb_queue_len(&ugeth->rx_recycle) < RX_BD_RING_LEN && skb_recycle_check(skb, ugeth->ug_info->uf_info.max_rx_buf_length +