aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neil@brown.name>2019-10-29 10:23:28 -0700
committerHauke Mehrtens <hauke@hauke-m.de>2020-09-06 17:11:34 +0200
commit7ac454014a11347887323a131415ac7032d53546 (patch)
tree2c99c507903d174367a0aadcaaf73f4abcb7a688
parentf5afa593e7cead980350fb82f6853d880c493872 (diff)
downloadupstream-7ac454014a11347887323a131415ac7032d53546.tar.gz
upstream-7ac454014a11347887323a131415ac7032d53546.tar.bz2
upstream-7ac454014a11347887323a131415ac7032d53546.zip
ramips: ethernet: fix to interrupt handling
The current code acknowledged interrupts *after* polling. This is the wrong way around, and could cause an interrupt to be missed. This is not likely to be fatal as another packet, and so another interrupt, should come along soon. But maybe it is causing problems, so let's fix it anyway. Signed-off-by: NeilBrown <neil@brown.name> (Note that this matches the upstream driver.) Signed-off-by: Rosen Penev <rosenp@gmail.com>
-rw-r--r--target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index b2c3d32c55..3541b11240 100644
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -876,6 +876,8 @@ static int fe_poll_rx(struct napi_struct *napi, int budget,
struct fe_rx_dma *rxd, trxd;
int done = 0, pad;
+ fe_reg_w32(rx_intr, FE_REG_FE_INT_STATUS);
+
if (netdev->features & NETIF_F_RXCSUM)
checksum_bit = soc->checksum_bit;
else
@@ -968,9 +970,6 @@ release_desc:
done++;
}
- if (done < budget)
- fe_reg_w32(rx_intr, FE_REG_FE_INT_STATUS);
-
return done;
}
@@ -986,6 +985,8 @@ static int fe_poll_tx(struct fe_priv *priv, int budget, u32 tx_intr,
u32 idx, hwidx;
struct fe_tx_ring *ring = &priv->tx_ring;
+ fe_reg_w32(tx_intr, FE_REG_FE_INT_STATUS);
+
idx = ring->tx_free_idx;
hwidx = fe_reg_r32(FE_REG_TX_DTX_IDX0);
@@ -1009,9 +1010,7 @@ static int fe_poll_tx(struct fe_priv *priv, int budget, u32 tx_intr,
if (idx == hwidx) {
/* read hw index again make sure no new tx packet */
hwidx = fe_reg_r32(FE_REG_TX_DTX_IDX0);
- if (idx == hwidx)
- fe_reg_w32(tx_intr, FE_REG_FE_INT_STATUS);
- else
+ if (idx != hwidx)
*tx_again = 1;
} else {
*tx_again = 1;