| From 6957356d5eb8ab68bb660bfd3384b9ad06bd31cf Mon Sep 17 00:00:00 2001 |
| From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Date: Tue, 10 Jun 2014 09:40:14 +0900 |
| Subject: net: sh_eth: Fix receive packet "exceeded" condition in sh_eth_rx() |
| |
| This patch fixes the packet "exceeded" condition in sh_eth_rx() when |
| RACT in an RX descriptor is not set and the "quota" is 0. |
| Otherwise, kernel panic happens because the "&n->poll_list" is deleted |
| twice in sh_eth_poll() which calls napi_complete() and net_rx_action(). |
| |
| Signed-off-by: Kouei Abe <kouei.abe.cp@renesas.com> |
| Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| (cherry picked from commit 4f809cea611f1f00a0b7a42751cb12d997a4c11c) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/net/ethernet/renesas/sh_eth.c | 8 +++----- |
| 1 file changed, 3 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c |
| index 2a29caa30479..1b34ac0a2420 100644 |
| --- a/drivers/net/ethernet/renesas/sh_eth.c |
| +++ b/drivers/net/ethernet/renesas/sh_eth.c |
| @@ -1399,7 +1399,6 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) |
| int entry = mdp->cur_rx % mdp->num_rx_ring; |
| int boguscnt = (mdp->dirty_rx + mdp->num_rx_ring) - mdp->cur_rx; |
| struct sk_buff *skb; |
| - int exceeded = 0; |
| u16 pkt_len = 0; |
| u32 desc_status; |
| |
| @@ -1411,10 +1410,9 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) |
| if (--boguscnt < 0) |
| break; |
| |
| - if (*quota <= 0) { |
| - exceeded = 1; |
| + if (*quota <= 0) |
| break; |
| - } |
| + |
| (*quota)--; |
| |
| if (!(desc_status & RDFEND)) |
| @@ -1508,7 +1506,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) |
| sh_eth_write(ndev, EDRRR_R, EDRRR); |
| } |
| |
| - return exceeded; |
| + return *quota <= 0; |
| } |
| |
| static void sh_eth_rcv_snd_disable(struct net_device *ndev) |
| -- |
| 2.1.2 |
| |