Commit 6c8fae0c authored by Shenwei Wang's avatar Shenwei Wang Committed by David S. Miller

net: fec: simplify the code logic of quirks

Simplify the code logic of handling the quirk of FEC_QUIRK_HAS_RACC.
If a SoC has the RACC quirk, the driver will enable the 16bit shift
by default in the probe function for a better performance.

This patch handles the logic in one place to make the logic simple
and clean. The patch optimizes the fec_enet_xdp_get_tx_queue function
according to Paolo Abeni's comments, and it also exludes the SoCs that
require to do frame swap from XDP support.
Signed-off-by: default avatarShenwei Wang <shenwei.wang@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bb16db83
...@@ -1581,8 +1581,20 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) ...@@ -1581,8 +1581,20 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
bool need_swap = fep->quirks & FEC_QUIRK_SWAP_FRAME; bool need_swap = fep->quirks & FEC_QUIRK_SWAP_FRAME;
struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog); struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog);
u32 ret, xdp_result = FEC_ENET_XDP_PASS; u32 ret, xdp_result = FEC_ENET_XDP_PASS;
u32 data_start = FEC_ENET_XDP_HEADROOM;
struct xdp_buff xdp; struct xdp_buff xdp;
struct page *page; struct page *page;
u32 sub_len = 4;
#if !defined(CONFIG_M5272)
/*If it has the FEC_QUIRK_HAS_RACC quirk property, the bit of
* FEC_RACC_SHIFT16 is set by default in the probe function.
*/
if (fep->quirks & FEC_QUIRK_HAS_RACC) {
data_start += 2;
sub_len += 2;
}
#endif
#ifdef CONFIG_M532x #ifdef CONFIG_M532x
flush_cache_all(); flush_cache_all();
...@@ -1645,9 +1657,9 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) ...@@ -1645,9 +1657,9 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
if (xdp_prog) { if (xdp_prog) {
xdp_buff_clear_frags_flag(&xdp); xdp_buff_clear_frags_flag(&xdp);
/* subtract 16bit shift and FCS */
xdp_prepare_buff(&xdp, page_address(page), xdp_prepare_buff(&xdp, page_address(page),
FEC_ENET_XDP_HEADROOM, pkt_len, false); data_start, pkt_len - sub_len, false);
ret = fec_enet_run_xdp(fep, xdp_prog, &xdp, rxq, index); ret = fec_enet_run_xdp(fep, xdp_prog, &xdp, rxq, index);
xdp_result |= ret; xdp_result |= ret;
if (ret != FEC_ENET_XDP_PASS) if (ret != FEC_ENET_XDP_PASS)
...@@ -1659,18 +1671,15 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) ...@@ -1659,18 +1671,15 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
* bridging applications. * bridging applications.
*/ */
skb = build_skb(page_address(page), PAGE_SIZE); skb = build_skb(page_address(page), PAGE_SIZE);
skb_reserve(skb, FEC_ENET_XDP_HEADROOM); skb_reserve(skb, data_start);
skb_put(skb, pkt_len - 4); skb_put(skb, pkt_len - sub_len);
skb_mark_for_recycle(skb); skb_mark_for_recycle(skb);
data = skb->data;
if (need_swap) if (unlikely(need_swap)) {
data = page_address(page) + FEC_ENET_XDP_HEADROOM;
swap_buffer(data, pkt_len); swap_buffer(data, pkt_len);
}
#if !defined(CONFIG_M5272) data = skb->data;
if (fep->quirks & FEC_QUIRK_HAS_RACC)
data = skb_pull_inline(skb, 2);
#endif
/* Extract the enhanced buffer descriptor */ /* Extract the enhanced buffer descriptor */
ebdp = NULL; ebdp = NULL;
...@@ -3604,6 +3613,13 @@ static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf) ...@@ -3604,6 +3613,13 @@ static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf)
switch (bpf->command) { switch (bpf->command) {
case XDP_SETUP_PROG: case XDP_SETUP_PROG:
/* No need to support the SoCs that require to
* do the frame swap because the performance wouldn't be
* better than the skb mode.
*/
if (fep->quirks & FEC_QUIRK_SWAP_FRAME)
return -EOPNOTSUPP;
if (is_run) { if (is_run) {
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_disable(dev); netif_tx_disable(dev);
...@@ -3631,17 +3647,12 @@ static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf) ...@@ -3631,17 +3647,12 @@ static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf)
} }
static int static int
fec_enet_xdp_get_tx_queue(struct fec_enet_private *fep, int cpu) fec_enet_xdp_get_tx_queue(struct fec_enet_private *fep, int index)
{ {
int index = cpu;
if (unlikely(index < 0)) if (unlikely(index < 0))
index = 0; return 0;
while (index >= fep->num_tx_queues)
index -= fep->num_tx_queues;
return index; return (index % fep->num_tx_queues);
} }
static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep, static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
......
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