Commit bc58493b authored by David S. Miller's avatar David S. Miller

Merge branch 'mediatek-rx-path-enhancements'

Sean Wang says:

====================
net: ethernet: mediatek: add enhancements to RX path

Changes since v1:
- fix message typos and add coverletter

Changes since v2:
- split from the previous series for submitting add enhancements as
a series targeting 'net-next' and add indents before comments.

Changes since v3:
- merge the patch using PDMA RX path
- fixed the input of mtk_poll_rx is with the remaining budget

Changes since v4:
- save one wmb and register update when no packet is being handled
inside mtk_poll_rx call
- fixed incorrect return packet count from mtk_napi_rx
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0da4d283 41156cea
...@@ -895,17 +895,18 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, ...@@ -895,17 +895,18 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size); rxd->rxd2 = RX_DMA_PLEN0(ring->buf_size);
ring->calc_idx = idx; ring->calc_idx = idx;
done++;
}
if (done) {
/* make sure that all changes to the dma ring are flushed before /* make sure that all changes to the dma ring are flushed before
* we continue * we continue
*/ */
wmb(); wmb();
mtk_w32(eth, ring->calc_idx, MTK_PRX_CRX_IDX0); mtk_w32(eth, ring->calc_idx, MTK_PRX_CRX_IDX0);
done++;
} }
if (done < budget)
mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS);
return done; return done;
} }
...@@ -1024,10 +1025,13 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget) ...@@ -1024,10 +1025,13 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget)
struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi); struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
u32 status, mask; u32 status, mask;
int rx_done = 0; int rx_done = 0;
int remain_budget = budget;
mtk_handle_status_irq(eth); mtk_handle_status_irq(eth);
poll_again:
mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS); mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS);
rx_done = mtk_poll_rx(napi, budget, eth); rx_done = mtk_poll_rx(napi, remain_budget, eth);
if (unlikely(netif_msg_intr(eth))) { if (unlikely(netif_msg_intr(eth))) {
status = mtk_r32(eth, MTK_PDMA_INT_STATUS); status = mtk_r32(eth, MTK_PDMA_INT_STATUS);
...@@ -1036,18 +1040,18 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget) ...@@ -1036,18 +1040,18 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget)
"done rx %d, intr 0x%08x/0x%x\n", "done rx %d, intr 0x%08x/0x%x\n",
rx_done, status, mask); rx_done, status, mask);
} }
if (rx_done == remain_budget)
if (rx_done == budget)
return budget; return budget;
status = mtk_r32(eth, MTK_PDMA_INT_STATUS); status = mtk_r32(eth, MTK_PDMA_INT_STATUS);
if (status & MTK_RX_DONE_INT) if (status & MTK_RX_DONE_INT) {
return budget; remain_budget -= rx_done;
goto poll_again;
}
napi_complete(napi); napi_complete(napi);
mtk_irq_enable(eth, MTK_PDMA_INT_MASK, MTK_RX_DONE_INT); mtk_irq_enable(eth, MTK_PDMA_INT_MASK, MTK_RX_DONE_INT);
return rx_done; return rx_done + budget - remain_budget;
} }
static int mtk_tx_alloc(struct mtk_eth *eth) static int mtk_tx_alloc(struct mtk_eth *eth)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment