Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a18e08bd authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by David S. Miller
Browse files

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: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eb2dc35d
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -1011,7 +1011,7 @@ static int sh_eth_txfree(struct net_device *ndev)
}

/* 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_rxdesc *rxdesc;
@@ -1102,8 +1102,10 @@ static int sh_eth_rx(struct net_device *ndev)
	/* Restart Rx engine if stopped. */
	/* If we don't need to check status, don't. -KDU */
	if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) {
		/* fix the values for the next receiving */
		mdp->cur_rx = mdp->dirty_rx = (sh_eth_read(ndev, RDFAR) -
		/* fix the values for the next receiving if RDE is set */
		if (intr_status & EESR_RDE)
			mdp->cur_rx = mdp->dirty_rx =
				(sh_eth_read(ndev, RDFAR) -
				 sh_eth_read(ndev, RDLAR)) >> 4;
		sh_eth_write(ndev, EDRRR_R, EDRRR);
	}
@@ -1273,7 +1275,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
			EESR_RTSF | /* short frame recv */
			EESR_PRE  | /* PHY-LSI recv error */
			EESR_CERF)){ /* recv frame CRC error */
		sh_eth_rx(ndev);
		sh_eth_rx(ndev, intr_status);
	}

	/* Tx Check */