aboutsummaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2017-12-05 16:30:51 +0100
committerFelix Fietkau <nbd@nbd.name>2018-02-05 10:16:26 +0100
commit968b8616127a52fe5baff20a1f29ff49ade26bc2 (patch)
tree035d4b6ed30149d6e2b5bec8858924ad52f470fd /target
parent798497c66e6a67d9dbad096c041e855abe0ee662 (diff)
downloadupstream-968b8616127a52fe5baff20a1f29ff49ade26bc2.tar.gz
upstream-968b8616127a52fe5baff20a1f29ff49ade26bc2.tar.bz2
upstream-968b8616127a52fe5baff20a1f29ff49ade26bc2.zip
ramips: improve NAPI polling to increase GRO batch size
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'target')
-rw-r--r--target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c b/target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c
index a9d2f385a4..f2c11097f4 100644
--- a/target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c
+++ b/target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c
@@ -882,17 +882,17 @@ release_desc:
rxd->rxd2 = RX_DMA_LSO;
ring->rx_calc_idx = idx;
+ done++;
+ }
+
+ if (done) {
/* make sure that all changes to the dma ring are flushed before
* we continue
*/
wmb();
fe_reg_w32(ring->rx_calc_idx, FE_REG_RX_CALC_IDX0);
- done++;
}
- if (done < budget)
- fe_reg_w32(rx_intr, FE_REG_FE_INT_STATUS);
-
return done;
}
@@ -928,16 +928,12 @@ static int fe_poll_tx(struct fe_priv *priv, int budget, u32 tx_intr,
}
ring->tx_free_idx = idx;
- if (idx == hwidx) {
+ 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
- *tx_again = 1;
- } else {
+
+ if (idx != hwidx)
*tx_again = 1;
- }
if (done) {
netdev_completed_queue(netdev, done, bytes_compl);
@@ -958,8 +954,6 @@ static int fe_poll(struct napi_struct *napi, int budget)
u32 status, fe_status, status_reg, mask;
u32 tx_intr, rx_intr, status_intr;
- status = fe_reg_r32(FE_REG_FE_INT_STATUS);
- fe_status = status;
tx_intr = priv->soc->tx_int;
rx_intr = priv->soc->rx_int;
status_intr = priv->soc->status_int;
@@ -967,6 +961,7 @@ static int fe_poll(struct napi_struct *napi, int budget)
rx_done = 0;
tx_again = 0;
+ fe_status = status = fe_reg_r32(FE_REG_FE_INT_STATUS);
if (fe_reg_table[FE_REG_FE_INT_STATUS2]) {
fe_status = fe_reg_r32(FE_REG_FE_INT_STATUS2);
status_reg = FE_REG_FE_INT_STATUS2;
@@ -974,11 +969,14 @@ static int fe_poll(struct napi_struct *napi, int budget)
status_reg = FE_REG_FE_INT_STATUS;
}
+poll_again:
+ fe_reg_w32(status & (rx_intr | tx_intr), FE_REG_FE_INT_STATUS);
+
if (status & tx_intr)
- tx_done = fe_poll_tx(priv, budget, tx_intr, &tx_again);
+ tx_done += fe_poll_tx(priv, budget, tx_intr, &tx_again);
if (status & rx_intr)
- rx_done = fe_poll_rx(napi, budget, priv, rx_intr);
+ rx_done += fe_poll_rx(napi, budget - rx_done, priv, rx_intr);
if (unlikely(fe_status & status_intr)) {
if (hwstat && spin_trylock(&hwstat->stats_lock)) {
@@ -1009,7 +1007,6 @@ static int fe_poll(struct napi_struct *napi, int budget)
rx_done = budget;
}
-poll_again:
return rx_done;
}