提交 a18e08bd 编写于 作者: Y Yoshihiro Shimoda 提交者: David S. Miller

net: sh_eth: fix the condition to fix the cur_tx/dirty_rx

The following commit couldn't work if the RMCR is not set to 1.

"net: sh_eth: fix the rxdesc pointer when rx descriptor empty happens"
commit id 79fba9f5

If RMCR is not set, the controller will clear the EDRRR after it received
a frame. In this case, the driver doesn't need to fix the value of
cur_rx/dirty_rx. The driver only needs it when the controll detects
receive descriptors are empty.
Signed-off-by: NYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: NGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 eb2dc35d
...@@ -1011,7 +1011,7 @@ static int sh_eth_txfree(struct net_device *ndev) ...@@ -1011,7 +1011,7 @@ static int sh_eth_txfree(struct net_device *ndev)
} }
/* Packet receive function */ /* Packet receive function */
static int sh_eth_rx(struct net_device *ndev) static int sh_eth_rx(struct net_device *ndev, u32 intr_status)
{ {
struct sh_eth_private *mdp = netdev_priv(ndev); struct sh_eth_private *mdp = netdev_priv(ndev);
struct sh_eth_rxdesc *rxdesc; struct sh_eth_rxdesc *rxdesc;
...@@ -1102,9 +1102,11 @@ static int sh_eth_rx(struct net_device *ndev) ...@@ -1102,9 +1102,11 @@ static int sh_eth_rx(struct net_device *ndev)
/* Restart Rx engine if stopped. */ /* Restart Rx engine if stopped. */
/* If we don't need to check status, don't. -KDU */ /* If we don't need to check status, don't. -KDU */
if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) { if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) {
/* fix the values for the next receiving */ /* fix the values for the next receiving if RDE is set */
mdp->cur_rx = mdp->dirty_rx = (sh_eth_read(ndev, RDFAR) - if (intr_status & EESR_RDE)
sh_eth_read(ndev, RDLAR)) >> 4; mdp->cur_rx = mdp->dirty_rx =
(sh_eth_read(ndev, RDFAR) -
sh_eth_read(ndev, RDLAR)) >> 4;
sh_eth_write(ndev, EDRRR_R, EDRRR); sh_eth_write(ndev, EDRRR_R, EDRRR);
} }
...@@ -1273,7 +1275,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) ...@@ -1273,7 +1275,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
EESR_RTSF | /* short frame recv */ EESR_RTSF | /* short frame recv */
EESR_PRE | /* PHY-LSI recv error */ EESR_PRE | /* PHY-LSI recv error */
EESR_CERF)){ /* recv frame CRC error */ EESR_CERF)){ /* recv frame CRC error */
sh_eth_rx(ndev); sh_eth_rx(ndev, intr_status);
} }
/* Tx Check */ /* Tx Check */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册