Commit 5d697032 authored by Christian Riesch's avatar Christian Riesch Committed by David S. Miller

davinci_emac: Do not free all rx dma descriptors during init

This patch fixes a regression that was introduced by

commit 0a5f3846
davinci_emac: Add Carrier Link OK check in Davinci RX Handler

Said commit adds a check whether the carrier link is ok. If the link is
not ok, the skb is freed and no new dma descriptor added to the rx dma
channel. This causes trouble during initialization when the carrier
status has not yet been updated. If a lot of packets are received while
netif_carrier_ok returns false, all dma descriptors are freed and the
rx dma transfer is stopped.

The bug occurs when the board is connected to a network with lots of
traffic and the ifconfig down/up is done, e.g., when reconfiguring
the interface with DHCP.

The bug can be reproduced by flood pinging the davinci board while doing
ifconfig eth0 down
ifconfig eth0 up
on the board.

After that, the rx path stops working and the overrun value reported
by ifconfig is counting up.

This patch reverts commit 0a5f3846
and instead issues warnings only if cpdma_chan_submit returns -ENOMEM.
Signed-off-by: default avatarChristian Riesch <christian.riesch@omicron.at>
Cc: <stable@vger.kernel.org>
Cc: Hegde, Vinay <vinay.hegde@ti.com>
Cc: Cyril Chemparathy <cyril@ti.com>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Tested-by: default avatarRajashekhara, Sudhakar <sudhakar.raj@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e0f03d5
...@@ -1009,7 +1009,7 @@ static void emac_rx_handler(void *token, int len, int status) ...@@ -1009,7 +1009,7 @@ static void emac_rx_handler(void *token, int len, int status)
int ret; int ret;
/* free and bail if we are shutting down */ /* free and bail if we are shutting down */
if (unlikely(!netif_running(ndev) || !netif_carrier_ok(ndev))) { if (unlikely(!netif_running(ndev))) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return; return;
} }
...@@ -1038,7 +1038,9 @@ static void emac_rx_handler(void *token, int len, int status) ...@@ -1038,7 +1038,9 @@ static void emac_rx_handler(void *token, int len, int status)
recycle: recycle:
ret = cpdma_chan_submit(priv->rxchan, skb, skb->data, ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
skb_tailroom(skb), GFP_KERNEL); skb_tailroom(skb), GFP_KERNEL);
if (WARN_ON(ret < 0))
WARN_ON(ret == -ENOMEM);
if (unlikely(ret < 0))
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment