All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT
@ 2021-02-10 14:18 Lorenzo Bianconi
  2021-02-10 15:29 ` Jesper Dangaard Brouer
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Lorenzo Bianconi @ 2021-02-10 14:18 UTC (permalink / raw)
  To: bpf
  Cc: netdev, davem, kuba, ast, daniel, lorenzo.bianconi, brouer, toke,
	Freysteinn.Alfredsson

Move XDP_REDIRECT error path handling from each XDP ethernet driver to
devmap code. According to the new APIs, the driver running the
ndo_xdp_xmit pointer, will break tx loop whenever the hw reports a tx
error and it will just return to devmap caller the number of successfully
transmitted frames. It will be devmap responsability to free dropped frames.
Move each XDP ndo_xdp_xmit capable driver to the new APIs:
- veth
- virtio-net
- mvneta
- mvpp2
- socionext
- amazon ena
- bnxt
- freescale (dpaa2, dpaa)
- xen-frontend
- qede
- ice
- igb
- ixgbe
- i40e
- mlx5
- ti (cpsw, cpsw-new)
- tun
- sfc

This is a preliminary patch to introduce a XDP_TX queue hook used to
managed pending frames that has not been transmitted by the hw.
More details about the new ndo_xdp_xmit design can be found here [0].

[0] https://github.com/xdp-project/xdp-project/blob/master/areas/core/redesign01_ndo_xdp_xmit.org

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 18 ++++++-------
 drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 20 ++++++--------
 .../net/ethernet/freescale/dpaa/dpaa_eth.c    | 12 ++++-----
 .../net/ethernet/freescale/dpaa2/dpaa2-eth.c  |  2 --
 drivers/net/ethernet/intel/i40e/i40e_txrx.c   | 15 +++++------
 drivers/net/ethernet/intel/ice/ice_txrx.c     | 15 +++++------
 drivers/net/ethernet/intel/igb/igb_main.c     | 11 ++++----
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 11 ++++----
 drivers/net/ethernet/marvell/mvneta.c         | 13 +++++----
 .../net/ethernet/marvell/mvpp2/mvpp2_main.c   | 13 +++++----
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  | 15 +++++------
 drivers/net/ethernet/qlogic/qede/qede_fp.c    | 19 +++++--------
 drivers/net/ethernet/sfc/tx.c                 | 15 +----------
 drivers/net/ethernet/socionext/netsec.c       | 14 +++++-----
 drivers/net/ethernet/ti/cpsw.c                | 14 +++++-----
 drivers/net/ethernet/ti/cpsw_new.c            | 14 +++++-----
 drivers/net/ethernet/ti/cpsw_priv.c           | 11 +++-----
 drivers/net/tun.c                             | 15 ++++++-----
 drivers/net/veth.c                            | 27 ++++++++++---------
 drivers/net/virtio_net.c                      | 25 ++++++++---------
 drivers/net/xen-netfront.c                    | 18 ++++++-------
 kernel/bpf/devmap.c                           | 27 +++++++++----------
 22 files changed, 152 insertions(+), 192 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 1db6cfd2b55c..2a0bc645bf66 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -300,7 +300,7 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
 
 	rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &push_hdr, &push_len);
 	if (unlikely(rc))
-		goto error_drop_packet;
+		return rc;
 
 	ena_tx_ctx.ena_bufs = tx_info->bufs;
 	ena_tx_ctx.push_header = push_hdr;
@@ -330,8 +330,6 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
 error_unmap_dma:
 	ena_unmap_tx_buff(xdp_ring, tx_info);
 	tx_info->xdpf = NULL;
-error_drop_packet:
-	xdp_return_frame(xdpf);
 	return rc;
 }
 
@@ -339,8 +337,8 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
 			struct xdp_frame **frames, u32 flags)
 {
 	struct ena_adapter *adapter = netdev_priv(dev);
-	int qid, i, err, drops = 0;
 	struct ena_ring *xdp_ring;
+	int qid, i, nxmit = 0;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
@@ -360,12 +358,12 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
 	spin_lock(&xdp_ring->xdp_tx_lock);
 
 	for (i = 0; i < n; i++) {
-		err = ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0);
 		/* The descriptor is freed by ena_xdp_xmit_frame in case
 		 * of an error.
 		 */
-		if (err)
-			drops++;
+		if (ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0))
+			break;
+		nxmit++;
 	}
 
 	/* Ring doorbell to make device aware of the packets */
@@ -378,7 +376,7 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
 	spin_unlock(&xdp_ring->xdp_tx_lock);
 
 	/* Return number of packets sent */
-	return n - drops;
+	return nxmit;
 }
 
 static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
@@ -414,7 +412,9 @@ static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
 		/* The XDP queues are shared between XDP_TX and XDP_REDIRECT */
 		spin_lock(&xdp_ring->xdp_tx_lock);
 
-		ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf, XDP_XMIT_FLUSH);
+		if (ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf,
+				       XDP_XMIT_FLUSH))
+			xdp_return_frame(xdpf);
 
 		spin_unlock(&xdp_ring->xdp_tx_lock);
 		xdp_stat = &rx_ring->rx_stats.xdp_tx;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
index 641303894341..ec9564e584e0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
@@ -217,7 +217,7 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
 	struct pci_dev *pdev = bp->pdev;
 	struct bnxt_tx_ring_info *txr;
 	dma_addr_t mapping;
-	int drops = 0;
+	int nxmit = 0;
 	int ring;
 	int i;
 
@@ -233,21 +233,17 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
 		struct xdp_frame *xdp = frames[i];
 
 		if (!txr || !bnxt_tx_avail(bp, txr) ||
-		    !(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP)) {
-			xdp_return_frame_rx_napi(xdp);
-			drops++;
-			continue;
-		}
+		    !(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP))
+			break;
 
 		mapping = dma_map_single(&pdev->dev, xdp->data, xdp->len,
 					 DMA_TO_DEVICE);
 
-		if (dma_mapping_error(&pdev->dev, mapping)) {
-			xdp_return_frame_rx_napi(xdp);
-			drops++;
-			continue;
-		}
+		if (dma_mapping_error(&pdev->dev, mapping))
+			break;
+
 		__bnxt_xmit_xdp_redirect(bp, txr, mapping, xdp->len, xdp);
+		nxmit++;
 	}
 
 	if (flags & XDP_XMIT_FLUSH) {
@@ -256,7 +252,7 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
 		bnxt_db_write(bp, &txr->tx_db, txr->tx_prod);
 	}
 
-	return num_frames - drops;
+	return nxmit;
 }
 
 /* Under rtnl_lock */
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index d8e568f6caf3..6e52a91606b3 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -3047,7 +3047,7 @@ static int dpaa_xdp_xmit(struct net_device *net_dev, int n,
 			 struct xdp_frame **frames, u32 flags)
 {
 	struct xdp_frame *xdpf;
-	int i, err, drops = 0;
+	int i, nxmit = 0;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
@@ -3057,14 +3057,12 @@ static int dpaa_xdp_xmit(struct net_device *net_dev, int n,
 
 	for (i = 0; i < n; i++) {
 		xdpf = frames[i];
-		err = dpaa_xdp_xmit_frame(net_dev, xdpf);
-		if (err) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (dpaa_xdp_xmit_frame(net_dev, xdpf))
+			break;
+		nxmit++;
 	}
 
-	return n - drops;
+	return nxmit;
 }
 
 static int dpaa_ts_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
index 41e225baf571..f7cd1260cd52 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -2422,8 +2422,6 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
 	percpu_stats->tx_packets += enqueued;
 	for (i = 0; i < enqueued; i++)
 		percpu_stats->tx_bytes += dpaa2_fd_get_len(&fds[i]);
-	for (i = enqueued; i < n; i++)
-		xdp_return_frame_rx_napi(frames[i]);
 
 	return enqueued;
 }
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 2574e78f7597..0b87988bd170 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -3734,8 +3734,8 @@ netdev_tx_t i40e_lan_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
  * @frames: array of XDP buffer pointers
  * @flags: XDP extra info
  *
- * Returns number of frames successfully sent. Frames that fail are
- * free'ed via XDP return API.
+ * Returns number of frames successfully sent. Failed frames
+ * will be free'ed by XDP core.
  *
  * For error cases, a negative errno code is returned and no-frames
  * are transmitted (caller must handle freeing frames).
@@ -3748,7 +3748,7 @@ int i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 	struct i40e_vsi *vsi = np->vsi;
 	struct i40e_pf *pf = vsi->back;
 	struct i40e_ring *xdp_ring;
-	int drops = 0;
+	int nxmit = 0;
 	int i;
 
 	if (test_bit(__I40E_VSI_DOWN, vsi->state))
@@ -3768,14 +3768,13 @@ int i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 		int err;
 
 		err = i40e_xmit_xdp_ring(xdpf, xdp_ring);
-		if (err != I40E_XDP_TX) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (err != I40E_XDP_TX)
+			break;
+		nxmit++;
 	}
 
 	if (unlikely(flags & XDP_XMIT_FLUSH))
 		i40e_xdp_ring_update_tail(xdp_ring);
 
-	return n - drops;
+	return nxmit;
 }
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
index 422f53997c02..30f4bf2096d4 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
@@ -574,8 +574,8 @@ ice_run_xdp(struct ice_ring *rx_ring, struct xdp_buff *xdp,
  * @frames: XDP frames to be transmitted
  * @flags: transmit flags
  *
- * Returns number of frames successfully sent. Frames that fail are
- * free'ed via XDP return API.
+ * Returns number of frames successfully sent. Failed frames
+ * will be free'ed by XDP core.
  * For error cases, a negative errno code is returned and no-frames
  * are transmitted (caller must handle freeing frames).
  */
@@ -587,7 +587,7 @@ ice_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 	unsigned int queue_index = smp_processor_id();
 	struct ice_vsi *vsi = np->vsi;
 	struct ice_ring *xdp_ring;
-	int drops = 0, i;
+	int nxmit = 0, i;
 
 	if (test_bit(__ICE_DOWN, vsi->state))
 		return -ENETDOWN;
@@ -604,16 +604,15 @@ ice_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 		int err;
 
 		err = ice_xmit_xdp_ring(xdpf->data, xdpf->len, xdp_ring);
-		if (err != ICE_XDP_TX) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (err != ICE_XDP_TX)
+			break;
+		nxmit++;
 	}
 
 	if (unlikely(flags & XDP_XMIT_FLUSH))
 		ice_xdp_ring_update_tail(xdp_ring);
 
-	return n - drops;
+	return nxmit;
 }
 
 /**
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 84d4284b8b32..3aa46f15b894 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2934,7 +2934,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
 	int cpu = smp_processor_id();
 	struct igb_ring *tx_ring;
 	struct netdev_queue *nq;
-	int drops = 0;
+	int nxmit = 0;
 	int i;
 
 	if (unlikely(test_bit(__IGB_DOWN, &adapter->state)))
@@ -2961,10 +2961,9 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
 		int err;
 
 		err = igb_xmit_xdp_ring(adapter, tx_ring, xdpf);
-		if (err != IGB_XDP_TX) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (err != IGB_XDP_TX)
+			break;
+		nxmit++;
 	}
 
 	__netif_tx_unlock(nq);
@@ -2972,7 +2971,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
 	if (unlikely(flags & XDP_XMIT_FLUSH))
 		igb_xdp_ring_update_tail(tx_ring);
 
-	return n - drops;
+	return nxmit;
 }
 
 static const struct net_device_ops igb_netdev_ops = {
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index e08c01525fd2..90c8a7896220 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -10190,7 +10190,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
 {
 	struct ixgbe_adapter *adapter = netdev_priv(dev);
 	struct ixgbe_ring *ring;
-	int drops = 0;
+	int nxmit = 0;
 	int i;
 
 	if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state)))
@@ -10214,16 +10214,15 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
 		int err;
 
 		err = ixgbe_xmit_xdp_ring(adapter, xdpf);
-		if (err != IXGBE_XDP_TX) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (err != IXGBE_XDP_TX)
+			break;
+		nxmit++;
 	}
 
 	if (unlikely(flags & XDP_XMIT_FLUSH))
 		ixgbe_xdp_ring_update_tail(ring);
 
-	return n - drops;
+	return nxmit;
 }
 
 static const struct net_device_ops ixgbe_netdev_ops = {
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 6290bfb6494e..a1dcd4de3057 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -2134,7 +2134,7 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
 {
 	struct mvneta_port *pp = netdev_priv(dev);
 	struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
-	int i, nxmit_byte = 0, nxmit = num_frame;
+	int i, nxmit_byte = 0, nxmit = 0;
 	int cpu = smp_processor_id();
 	struct mvneta_tx_queue *txq;
 	struct netdev_queue *nq;
@@ -2152,12 +2152,11 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
 	__netif_tx_lock(nq, cpu);
 	for (i = 0; i < num_frame; i++) {
 		ret = mvneta_xdp_submit_frame(pp, txq, frames[i], true);
-		if (ret == MVNETA_XDP_TX) {
-			nxmit_byte += frames[i]->len;
-		} else {
-			xdp_return_frame_rx_napi(frames[i]);
-			nxmit--;
-		}
+		if (ret != MVNETA_XDP_TX)
+			break;
+
+		nxmit_byte += frames[i]->len;
+		nxmit++;
 	}
 
 	if (unlikely(flags & XDP_XMIT_FLUSH))
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index 143522908477..6827369c6d00 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -3393,7 +3393,7 @@ mvpp2_xdp_xmit(struct net_device *dev, int num_frame,
 	       struct xdp_frame **frames, u32 flags)
 {
 	struct mvpp2_port *port = netdev_priv(dev);
-	int i, nxmit_byte = 0, nxmit = num_frame;
+	int i, nxmit_byte = 0, nxmit = 0;
 	struct mvpp2_pcpu_stats *stats;
 	u16 txq_id;
 	u32 ret;
@@ -3411,12 +3411,11 @@ mvpp2_xdp_xmit(struct net_device *dev, int num_frame,
 
 	for (i = 0; i < num_frame; i++) {
 		ret = mvpp2_xdp_submit_frame(port, txq_id, frames[i], true);
-		if (ret == MVPP2_XDP_TX) {
-			nxmit_byte += frames[i]->len;
-		} else {
-			xdp_return_frame_rx_napi(frames[i]);
-			nxmit--;
-		}
+		if (ret != MVPP2_XDP_TX)
+			break;
+
+		nxmit_byte += frames[i]->len;
+		nxmit++;
 	}
 
 	if (likely(nxmit > 0))
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index 2e3e78b0f333..2f0df5cc1a2d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -500,7 +500,7 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 {
 	struct mlx5e_priv *priv = netdev_priv(dev);
 	struct mlx5e_xdpsq *sq;
-	int drops = 0;
+	int nxmit = 0;
 	int sq_num;
 	int i;
 
@@ -529,11 +529,8 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 		xdptxd.dma_addr = dma_map_single(sq->pdev, xdptxd.data,
 						 xdptxd.len, DMA_TO_DEVICE);
 
-		if (unlikely(dma_mapping_error(sq->pdev, xdptxd.dma_addr))) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-			continue;
-		}
+		if (unlikely(dma_mapping_error(sq->pdev, xdptxd.dma_addr)))
+			break;
 
 		xdpi.mode           = MLX5E_XDP_XMIT_MODE_FRAME;
 		xdpi.frame.xdpf     = xdpf;
@@ -544,9 +541,9 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 		if (unlikely(!ret)) {
 			dma_unmap_single(sq->pdev, xdptxd.dma_addr,
 					 xdptxd.len, DMA_TO_DEVICE);
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
+			break;
 		}
+		nxmit++;
 	}
 
 	if (flags & XDP_XMIT_FLUSH) {
@@ -555,7 +552,7 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 		mlx5e_xmit_xdp_doorbell(sq);
 	}
 
-	return n - drops;
+	return nxmit;
 }
 
 void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq)
diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c
index 70c8d3cd85c0..9d75776bb995 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_fp.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c
@@ -345,7 +345,7 @@ int qede_xdp_transmit(struct net_device *dev, int n_frames,
 	struct qede_tx_queue *xdp_tx;
 	struct xdp_frame *xdpf;
 	dma_addr_t mapping;
-	int i, drops = 0;
+	int i, nxmit = 0;
 	u16 xdp_prod;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
@@ -364,18 +364,13 @@ int qede_xdp_transmit(struct net_device *dev, int n_frames,
 
 		mapping = dma_map_single(dmadev, xdpf->data, xdpf->len,
 					 DMA_TO_DEVICE);
-		if (unlikely(dma_mapping_error(dmadev, mapping))) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-
-			continue;
-		}
+		if (unlikely(dma_mapping_error(dmadev, mapping)))
+			break;
 
 		if (unlikely(qede_xdp_xmit(xdp_tx, mapping, 0, xdpf->len,
-					   NULL, xdpf))) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+					   NULL, xdpf)))
+			break;
+		nxmit++;
 	}
 
 	if (flags & XDP_XMIT_FLUSH) {
@@ -387,7 +382,7 @@ int qede_xdp_transmit(struct net_device *dev, int n_frames,
 
 	spin_unlock(&xdp_tx->xdp_tx_lock);
 
-	return n_frames - drops;
+	return nxmit;
 }
 
 int qede_txq_has_work(struct qede_tx_queue *txq)
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c
index 1665529a7271..0c6650d2e239 100644
--- a/drivers/net/ethernet/sfc/tx.c
+++ b/drivers/net/ethernet/sfc/tx.c
@@ -412,14 +412,6 @@ netdev_tx_t __efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb
 	return NETDEV_TX_OK;
 }
 
-static void efx_xdp_return_frames(int n,  struct xdp_frame **xdpfs)
-{
-	int i;
-
-	for (i = 0; i < n; i++)
-		xdp_return_frame_rx_napi(xdpfs[i]);
-}
-
 /* Transmit a packet from an XDP buffer
  *
  * Returns number of packets sent on success, error code otherwise.
@@ -492,12 +484,7 @@ int efx_xdp_tx_buffers(struct efx_nic *efx, int n, struct xdp_frame **xdpfs,
 	if (flush && i > 0)
 		efx_nic_push_buffers(tx_queue);
 
-	if (i == 0)
-		return -EIO;
-
-	efx_xdp_return_frames(n - i, xdpfs + i);
-
-	return i;
+	return i == 0 ? -EIO : i;
 }
 
 /* Initiate a packet transmission.  We use one channel per CPU
diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c
index 3c53051bdacf..6191fa565a5c 100644
--- a/drivers/net/ethernet/socionext/netsec.c
+++ b/drivers/net/ethernet/socionext/netsec.c
@@ -1757,8 +1757,7 @@ static int netsec_xdp_xmit(struct net_device *ndev, int n,
 {
 	struct netsec_priv *priv = netdev_priv(ndev);
 	struct netsec_desc_ring *tx_ring = &priv->desc_ring[NETSEC_RING_TX];
-	int drops = 0;
-	int i;
+	int i, nxmit = 0;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
@@ -1770,11 +1769,10 @@ static int netsec_xdp_xmit(struct net_device *ndev, int n,
 
 		err = netsec_xdp_queue_one(priv, xdpf, true);
 		if (err != NETSEC_XDP_TX) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		} else {
-			tx_ring->xdp_xmit++;
-		}
+			break;
+
+		tx_ring->xdp_xmit++;
+		nxmit++;
 	}
 	spin_unlock(&tx_ring->lock);
 
@@ -1783,7 +1781,7 @@ static int netsec_xdp_xmit(struct net_device *ndev, int n,
 		tx_ring->xdp_xmit = 0;
 	}
 
-	return n - drops;
+	return nxmit;
 }
 
 static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 5239318e9686..667c255a3e4c 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -1125,25 +1125,23 @@ static int cpsw_ndo_xdp_xmit(struct net_device *ndev, int n,
 	struct cpsw_priv *priv = netdev_priv(ndev);
 	struct cpsw_common *cpsw = priv->cpsw;
 	struct xdp_frame *xdpf;
-	int i, drops = 0, port;
+	int i, nxmit = 0, port;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
 
 	for (i = 0; i < n; i++) {
 		xdpf = frames[i];
-		if (xdpf->len < CPSW_MIN_PACKET_SIZE) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-			continue;
-		}
+		if (xdpf->len < CPSW_MIN_PACKET_SIZE)
+			break;
 
 		port = priv->emac_port + cpsw->data.dual_emac;
 		if (cpsw_xdp_tx_frame(priv, xdpf, NULL, port))
-			drops++;
+			break;
+		nxmit++;
 	}
 
-	return n - drops;
+	return nxmit;
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c
index 94747f82c60b..268d8d85885a 100644
--- a/drivers/net/ethernet/ti/cpsw_new.c
+++ b/drivers/net/ethernet/ti/cpsw_new.c
@@ -1095,24 +1095,22 @@ static int cpsw_ndo_xdp_xmit(struct net_device *ndev, int n,
 {
 	struct cpsw_priv *priv = netdev_priv(ndev);
 	struct xdp_frame *xdpf;
-	int i, drops = 0;
+	int i, nxmit = 0;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
 
 	for (i = 0; i < n; i++) {
 		xdpf = frames[i];
-		if (xdpf->len < CPSW_MIN_PACKET_SIZE) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-			continue;
-		}
+		if (xdpf->len < CPSW_MIN_PACKET_SIZE)
+			break;
 
 		if (cpsw_xdp_tx_frame(priv, xdpf, NULL, priv->emac_port))
-			drops++;
+			break;
+		nxmit++;
 	}
 
-	return n - drops;
+	return nxmit;
 }
 
 static int cpsw_get_port_parent_id(struct net_device *ndev,
diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c
index 99f44563e10f..5c0485f45551 100644
--- a/drivers/net/ethernet/ti/cpsw_priv.c
+++ b/drivers/net/ethernet/ti/cpsw_priv.c
@@ -1305,19 +1305,15 @@ int cpsw_xdp_tx_frame(struct cpsw_priv *priv, struct xdp_frame *xdpf,
 		ret = cpdma_chan_submit_mapped(txch, cpsw_xdpf_to_handle(xdpf),
 					       dma, xdpf->len, port);
 	} else {
-		if (sizeof(*xmeta) > xdpf->headroom) {
-			xdp_return_frame_rx_napi(xdpf);
+		if (sizeof(*xmeta) > xdpf->headroom)
 			return -EINVAL;
-		}
 
 		ret = cpdma_chan_submit(txch, cpsw_xdpf_to_handle(xdpf),
 					xdpf->data, xdpf->len, port);
 	}
 
-	if (ret) {
+	if (ret)
 		priv->ndev->stats.tx_dropped++;
-		xdp_return_frame_rx_napi(xdpf);
-	}
 
 	return ret;
 }
@@ -1350,7 +1346,8 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
 		if (unlikely(!xdpf))
 			goto drop;
 
-		cpsw_xdp_tx_frame(priv, xdpf, page, port);
+		if (cpsw_xdp_tx_frame(priv, xdpf, page, port))
+			xdp_return_frame_rx_napi(xdpf);
 		break;
 	case XDP_REDIRECT:
 		if (xdp_do_redirect(ndev, xdp, prog))
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 62690baa19bc..00e7fd7798e3 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1181,8 +1181,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
 	struct tun_struct *tun = netdev_priv(dev);
 	struct tun_file *tfile;
 	u32 numqueues;
-	int drops = 0;
-	int cnt = n;
+	int nxmit = 0;
 	int i;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
@@ -1212,9 +1211,9 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
 
 		if (__ptr_ring_produce(&tfile->tx_ring, frame)) {
 			atomic_long_inc(&dev->tx_dropped);
-			xdp_return_frame_rx_napi(xdp);
-			drops++;
+			break;
 		}
+		nxmit++;
 	}
 	spin_unlock(&tfile->tx_ring.producer_lock);
 
@@ -1222,17 +1221,21 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
 		__tun_xdp_flush_tfile(tfile);
 
 	rcu_read_unlock();
-	return cnt - drops;
+	return nxmit;
 }
 
 static int tun_xdp_tx(struct net_device *dev, struct xdp_buff *xdp)
 {
 	struct xdp_frame *frame = xdp_convert_buff_to_frame(xdp);
+	int nxmit;
 
 	if (unlikely(!frame))
 		return -EOVERFLOW;
 
-	return tun_xdp_xmit(dev, 1, &frame, XDP_XMIT_FLUSH);
+	nxmit = tun_xdp_xmit(dev, 1, &frame, XDP_XMIT_FLUSH);
+	if (!nxmit)
+		xdp_return_frame_rx_napi(frame);
+	return nxmit;
 }
 
 static const struct net_device_ops tap_netdev_ops = {
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index aa1a66ad2ce5..36293a2c3618 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -434,7 +434,7 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
 			 u32 flags, bool ndo_xmit)
 {
 	struct veth_priv *rcv_priv, *priv = netdev_priv(dev);
-	int i, ret = -ENXIO, drops = 0;
+	int i, ret = -ENXIO, nxmit = 0;
 	struct net_device *rcv;
 	unsigned int max_len;
 	struct veth_rq *rq;
@@ -464,21 +464,20 @@ static int veth_xdp_xmit(struct net_device *dev, int n,
 		void *ptr = veth_xdp_to_ptr(frame);
 
 		if (unlikely(frame->len > max_len ||
-			     __ptr_ring_produce(&rq->xdp_ring, ptr))) {
-			xdp_return_frame_rx_napi(frame);
-			drops++;
-		}
+			     __ptr_ring_produce(&rq->xdp_ring, ptr)))
+			break;
+		nxmit++;
 	}
 	spin_unlock(&rq->xdp_ring.producer_lock);
 
 	if (flags & XDP_XMIT_FLUSH)
 		__veth_xdp_flush(rq);
 
-	ret = n - drops;
+	ret = nxmit;
 	if (ndo_xmit) {
 		u64_stats_update_begin(&rq->stats.syncp);
-		rq->stats.vs.peer_tq_xdp_xmit += n - drops;
-		rq->stats.vs.peer_tq_xdp_xmit_err += drops;
+		rq->stats.vs.peer_tq_xdp_xmit += nxmit;
+		rq->stats.vs.peer_tq_xdp_xmit_err += n - nxmit;
 		u64_stats_update_end(&rq->stats.syncp);
 	}
 
@@ -505,20 +504,24 @@ static int veth_ndo_xdp_xmit(struct net_device *dev, int n,
 
 static void veth_xdp_flush_bq(struct veth_rq *rq, struct veth_xdp_tx_bq *bq)
 {
-	int sent, i, err = 0;
+	int sent, i, err = 0, drops;
 
 	sent = veth_xdp_xmit(rq->dev, bq->count, bq->q, 0, false);
 	if (sent < 0) {
 		err = sent;
 		sent = 0;
-		for (i = 0; i < bq->count; i++)
+	}
+
+	drops = bq->count - sent;
+	if (unlikely(drops > 0)) {
+		for (i = sent; i < bq->count; i++)
 			xdp_return_frame(bq->q[i]);
 	}
-	trace_xdp_bulk_tx(rq->dev, sent, bq->count - sent, err);
+	trace_xdp_bulk_tx(rq->dev, sent, drops, err);
 
 	u64_stats_update_begin(&rq->stats.syncp);
 	rq->stats.vs.xdp_tx += sent;
-	rq->stats.vs.xdp_tx_err += bq->count - sent;
+	rq->stats.vs.xdp_tx_err += drops;
 	u64_stats_update_end(&rq->stats.syncp);
 
 	bq->count = 0;
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index ba8e63792549..ea87830f21d2 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -499,10 +499,10 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 	unsigned int len;
 	int packets = 0;
 	int bytes = 0;
-	int drops = 0;
+	int nxmit = 0;
 	int kicks = 0;
-	int ret, err;
 	void *ptr;
+	int ret;
 	int i;
 
 	/* Only allow ndo_xdp_xmit if XDP is loaded on dev, as this
@@ -516,7 +516,6 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) {
 		ret = -EINVAL;
-		drops = n;
 		goto out;
 	}
 
@@ -539,13 +538,11 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 	for (i = 0; i < n; i++) {
 		struct xdp_frame *xdpf = frames[i];
 
-		err = __virtnet_xdp_xmit_one(vi, sq, xdpf);
-		if (err) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (__virtnet_xdp_xmit_one(vi, sq, xdpf))
+			break;
+		nxmit++;
 	}
-	ret = n - drops;
+	ret = nxmit;
 
 	if (flags & XDP_XMIT_FLUSH) {
 		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
@@ -556,7 +553,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 	sq->stats.bytes += bytes;
 	sq->stats.packets += packets;
 	sq->stats.xdp_tx += n;
-	sq->stats.xdp_tx_drops += drops;
+	sq->stats.xdp_tx_drops += n - nxmit;
 	sq->stats.kicks += kicks;
 	u64_stats_update_end(&sq->stats.syncp);
 
@@ -709,7 +706,9 @@ static struct sk_buff *receive_small(struct net_device *dev,
 			if (unlikely(!xdpf))
 				goto err_xdp;
 			err = virtnet_xdp_xmit(dev, 1, &xdpf, 0);
-			if (unlikely(err < 0)) {
+			if (unlikely(!err)) {
+				xdp_return_frame_rx_napi(xdpf);
+			} else if (unlikely(err < 0)) {
 				trace_xdp_exception(vi->dev, xdp_prog, act);
 				goto err_xdp;
 			}
@@ -895,7 +894,9 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
 			if (unlikely(!xdpf))
 				goto err_xdp;
 			err = virtnet_xdp_xmit(dev, 1, &xdpf, 0);
-			if (unlikely(err < 0)) {
+			if (unlikely(!err)) {
+				xdp_return_frame_rx_napi(xdpf);
+			} else if (unlikely(err < 0)) {
 				trace_xdp_exception(vi->dev, xdp_prog, act);
 				if (unlikely(xdp_page != page))
 					put_page(xdp_page);
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 6ef2adbd283a..cb172c3e38d9 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -608,8 +608,8 @@ static int xennet_xdp_xmit(struct net_device *dev, int n,
 	struct netfront_info *np = netdev_priv(dev);
 	struct netfront_queue *queue = NULL;
 	unsigned long irq_flags;
-	int drops = 0;
-	int i, err;
+	int nxmit = 0;
+	int i;
 
 	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
 		return -EINVAL;
@@ -622,15 +622,13 @@ static int xennet_xdp_xmit(struct net_device *dev, int n,
 
 		if (!xdpf)
 			continue;
-		err = xennet_xdp_xmit_one(dev, queue, xdpf);
-		if (err) {
-			xdp_return_frame_rx_napi(xdpf);
-			drops++;
-		}
+		if (xennet_xdp_xmit_one(dev, queue, xdpf))
+			break;
+		nxmit++;
 	}
 	spin_unlock_irqrestore(&queue->tx_lock, irq_flags);
 
-	return n - drops;
+	return nxmit;
 }
 
 
@@ -875,7 +873,9 @@ static u32 xennet_run_xdp(struct netfront_queue *queue, struct page *pdata,
 		get_page(pdata);
 		xdpf = xdp_convert_buff_to_frame(xdp);
 		err = xennet_xdp_xmit(queue->info->netdev, 1, &xdpf, 0);
-		if (unlikely(err < 0))
+		if (unlikely(!err))
+			xdp_return_frame_rx_napi(xdpf);
+		else if (unlikely(err < 0))
 			trace_xdp_exception(queue->info->netdev, prog, act);
 		break;
 	case XDP_REDIRECT:
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c
index f6e9c68afdd4..3dd1bb80effd 100644
--- a/kernel/bpf/devmap.c
+++ b/kernel/bpf/devmap.c
@@ -344,29 +344,26 @@ static void bq_xmit_all(struct xdp_dev_bulk_queue *bq, u32 flags)
 
 	sent = dev->netdev_ops->ndo_xdp_xmit(dev, bq->count, bq->q, flags);
 	if (sent < 0) {
+		/* If ndo_xdp_xmit fails with an errno, no frames have
+		 * been xmit'ed.
+		 */
 		err = sent;
 		sent = 0;
-		goto error;
 	}
+
 	drops = bq->count - sent;
-out:
-	bq->count = 0;
+	if (unlikely(drops > 0)) {
+		/* If not all frames have been transmitted, it is our
+		 * responsibility to free them
+		 */
+		for (i = sent; i < bq->count; i++)
+			xdp_return_frame_rx_napi(bq->q[i]);
+	}
 
+	bq->count = 0;
 	trace_xdp_devmap_xmit(bq->dev_rx, dev, sent, drops, err);
 	bq->dev_rx = NULL;
 	__list_del_clearprev(&bq->flush_node);
-	return;
-error:
-	/* If ndo_xdp_xmit fails with an errno, no frames have been
-	 * xmit'ed and it's our responsibility to them free all.
-	 */
-	for (i = 0; i < bq->count; i++) {
-		struct xdp_frame *xdpf = bq->q[i];
-
-		xdp_return_frame_rx_napi(xdpf);
-		drops++;
-	}
-	goto out;
 }
 
 /* __dev_flush is called from xdp_do_flush() which _must_ be signaled
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT
  2021-02-10 14:18 [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT Lorenzo Bianconi
@ 2021-02-10 15:29 ` Jesper Dangaard Brouer
  2021-02-10 16:23 ` kernel test robot
  2021-02-10 18:19 ` kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Jesper Dangaard Brouer @ 2021-02-10 15:29 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: bpf, netdev, davem, kuba, ast, daniel, lorenzo.bianconi, toke,
	Freysteinn.Alfredsson, brouer


Typo in subject line for devmap.

On Wed, 10 Feb 2021 15:18:14 +0100
Lorenzo Bianconi <lorenzo@kernel.org> wrote:

> Move XDP_REDIRECT error path handling from each XDP ethernet driver to
> devmap code. According to the new APIs, the driver running the
> ndo_xdp_xmit pointer, will break tx loop whenever the hw reports a tx
> error and it will just return to devmap caller the number of successfully
> transmitted frames. It will be devmap responsability to free dropped frames.

I think you should start with explaining the "why change".

Copy pasted from design doc[1]:
 [1] https://github.com/xdp-project/xdp-project/blob/master/areas/core/redesign01_ndo_xdp_xmit.org#why-change

Why change: We want to change the current drop semantics, because it
will allow us to implement better queue overflow handling. This is
working towards the larger goal of a XDP TX queue-hook

> Move each XDP ndo_xdp_xmit capable driver to the new APIs:
> - veth
> - virtio-net
> - mvneta
> - mvpp2
> - socionext
> - amazon ena
> - bnxt
> - freescale (dpaa2, dpaa)
> - xen-frontend
> - qede
> - ice
> - igb
> - ixgbe
> - i40e
> - mlx5
> - ti (cpsw, cpsw-new)
> - tun
> - sfc
> 
> This is a preliminary patch to introduce a XDP_TX queue hook used to
> managed pending frames that has not been transmitted by the hw.
> More details about the new ndo_xdp_xmit design can be found here [0].
> 
> [0] https://github.com/xdp-project/xdp-project/blob/master/areas/core/redesign01_ndo_xdp_xmit.org



-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Principal Kernel Engineer at Red Hat
  LinkedIn: http://www.linkedin.com/in/brouer


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT
  2021-02-10 14:18 [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT Lorenzo Bianconi
  2021-02-10 15:29 ` Jesper Dangaard Brouer
@ 2021-02-10 16:23 ` kernel test robot
  2021-02-10 18:19 ` kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-02-10 16:23 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 40229 bytes --]

Hi Lorenzo,

[FYI, it's a private test report for your RFC patch.]
[auto build test ERROR on bpf-next/master]

url:    https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/bpf-devmap-move-drop-error-path-to-devmpap-for-XDP_REDIRECT/20210210-222154
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
config: arm-randconfig-s032-20210209 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.3-215-g0fb77bb6-dirty
        # https://github.com/0day-ci/linux/commit/96ef538bb5cf75f19f3973722e4f66c7f65781db
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Lorenzo-Bianconi/bpf-devmap-move-drop-error-path-to-devmpap-for-XDP_REDIRECT/20210210-222154
        git checkout 96ef538bb5cf75f19f3973722e4f66c7f65781db
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   drivers/net/ethernet/socionext/netsec.c: In function 'netsec_xdp_xmit':
>> drivers/net/ethernet/socionext/netsec.c:1787:12: error: invalid storage class for function 'netsec_xdp_setup'
    1787 | static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
         |            ^~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1787:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    1787 | static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
         | ^~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1813:12: error: invalid storage class for function 'netsec_xdp'
    1813 | static int netsec_xdp(struct net_device *ndev, struct netdev_bpf *xdp)
         |            ^~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1836:14: error: initializer element is not constant
    1836 |  .ndo_bpf  = netsec_xdp,
         |              ^~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:1836:14: note: (near initialization for 'netsec_netdev_ops.ndo_bpf')
>> drivers/net/ethernet/socionext/netsec.c:1839:12: error: invalid storage class for function 'netsec_of_probe'
    1839 | static int netsec_of_probe(struct platform_device *pdev,
         |            ^~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1868:12: error: invalid storage class for function 'netsec_acpi_probe'
    1868 | static int netsec_acpi_probe(struct platform_device *pdev,
         |            ^~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1900:13: error: invalid storage class for function 'netsec_unregister_mdio'
    1900 | static void netsec_unregister_mdio(struct netsec_priv *priv)
         |             ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1912:12: error: invalid storage class for function 'netsec_register_mdio'
    1912 | static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
         |            ^~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1977:12: error: invalid storage class for function 'netsec_probe'
    1977 | static int netsec_probe(struct platform_device *pdev)
         |            ^~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2140:12: error: invalid storage class for function 'netsec_remove'
    2140 | static int netsec_remove(struct platform_device *pdev)
         |            ^~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2157:12: error: invalid storage class for function 'netsec_runtime_suspend'
    2157 | static int netsec_runtime_suspend(struct device *dev)
         |            ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2168:12: error: invalid storage class for function 'netsec_runtime_resume'
    2168 | static int netsec_runtime_resume(struct device *dev)
         |            ^~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/device.h:25,
                    from include/linux/platform_device.h:13,
                    from drivers/net/ethernet/socionext/netsec.c:5:
   drivers/net/ethernet/socionext/netsec.c:2182:21: error: initializer element is not constant
    2182 |  SET_RUNTIME_PM_OPS(netsec_runtime_suspend, netsec_runtime_resume, NULL)
         |                     ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/pm.h:342:21: note: in definition of macro 'SET_RUNTIME_PM_OPS'
     342 |  .runtime_suspend = suspend_fn, \
         |                     ^~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2182:21: note: (near initialization for 'netsec_pm_ops.runtime_suspend')
    2182 |  SET_RUNTIME_PM_OPS(netsec_runtime_suspend, netsec_runtime_resume, NULL)
         |                     ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/pm.h:342:21: note: in definition of macro 'SET_RUNTIME_PM_OPS'
     342 |  .runtime_suspend = suspend_fn, \
         |                     ^~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2182:45: error: initializer element is not constant
    2182 |  SET_RUNTIME_PM_OPS(netsec_runtime_suspend, netsec_runtime_resume, NULL)
         |                                             ^~~~~~~~~~~~~~~~~~~~~
   include/linux/pm.h:343:20: note: in definition of macro 'SET_RUNTIME_PM_OPS'
     343 |  .runtime_resume = resume_fn, \
         |                    ^~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2182:45: note: (near initialization for 'netsec_pm_ops.runtime_resume')
    2182 |  SET_RUNTIME_PM_OPS(netsec_runtime_suspend, netsec_runtime_resume, NULL)
         |                                             ^~~~~~~~~~~~~~~~~~~~~
   include/linux/pm.h:343:20: note: in definition of macro 'SET_RUNTIME_PM_OPS'
     343 |  .runtime_resume = resume_fn, \
         |                    ^~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2189:1: warning: 'alias' attribute ignored [-Wattributes]
    2189 | MODULE_DEVICE_TABLE(of, netsec_dt_ids);
         | ^~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2200:11: error: initializer element is not constant
    2200 |  .probe = netsec_probe,
         |           ^~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2200:11: note: (near initialization for 'netsec_driver.probe')
   drivers/net/ethernet/socionext/netsec.c:2201:12: error: initializer element is not constant
    2201 |  .remove = netsec_remove,
         |            ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2201:12: note: (near initialization for 'netsec_driver.remove')
   In file included from include/linux/device.h:32,
                    from include/linux/platform_device.h:13,
                    from drivers/net/ethernet/socionext/netsec.c:5:
>> drivers/net/ethernet/socionext/netsec.c:2209:24: error: invalid storage class for function 'netsec_driver_init'
    2209 | module_platform_driver(netsec_driver);
         |                        ^~~~~~~~~~~~~
   include/linux/device/driver.h:259:19: note: in definition of macro 'module_driver'
     259 | static int __init __driver##_init(void) \
         |                   ^~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/module.h:132:42: error: invalid storage class for function '__inittest'
     132 |  static inline initcall_t __maybe_unused __inittest(void)  \
         |                                          ^~~~~~~~~~
   include/linux/device/driver.h:263:1: note: in expansion of macro 'module_init'
     263 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: warning: 'alias' attribute ignored [-Wattributes]
   In file included from include/linux/device.h:32,
                    from include/linux/platform_device.h:13,
                    from drivers/net/ethernet/socionext/netsec.c:5:
>> drivers/net/ethernet/socionext/netsec.c:2209:24: error: invalid storage class for function 'netsec_driver_exit'
    2209 | module_platform_driver(netsec_driver);
         |                        ^~~~~~~~~~~~~
   include/linux/device/driver.h:264:20: note: in definition of macro 'module_driver'
     264 | static void __exit __driver##_exit(void) \
         |                    ^~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
>> include/linux/device/driver.h:264:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     264 | static void __exit __driver##_exit(void) \
         | ^~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/module.h:138:42: error: invalid storage class for function '__exittest'
     138 |  static inline exitcall_t __maybe_unused __exittest(void)  \
         |                                          ^~~~~~~~~~
   include/linux/device/driver.h:268:1: note: in expansion of macro 'module_exit'
     268 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: warning: 'alias' attribute ignored [-Wattributes]
   In file included from include/linux/module.h:21,
                    from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/moduleparam.h:24:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
      24 |  static const char __UNIQUE_ID(name)[]      \
         |  ^~~~~~
   include/linux/module.h:163:32: note: in expansion of macro '__MODULE_INFO'
     163 | #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
         |                                ^~~~~~~~~~~~~
   include/linux/module.h:233:32: note: in expansion of macro 'MODULE_INFO'
     233 | #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
         |                                ^~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2211:1: note: in expansion of macro 'MODULE_AUTHOR'
    2211 | MODULE_AUTHOR("Jassi Brar <jaswinder.singh@linaro.org>");
         | ^~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2214:1: error: expected declaration or statement at end of input
    2214 | MODULE_LICENSE("GPL");
         | ^~~~~~~~~~~~~~
   At top level:
   drivers/net/ethernet/socionext/netsec.c:1755:12: warning: 'netsec_xdp_xmit' defined but not used [-Wunused-function]
    1755 | static int netsec_xdp_xmit(struct net_device *ndev, int n,
         |            ^~~~~~~~~~~~~~~


vim +/netsec_xdp_setup +1787 drivers/net/ethernet/socionext/netsec.c

ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1786  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1787  static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1788  			    struct netlink_ext_ack *extack)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1789  {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1790  	struct net_device *dev = priv->ndev;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1791  	struct bpf_prog *old_prog;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1792  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1793  	/* For now just support only the usual MTU sized frames */
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1794  	if (prog && dev->mtu > 1500) {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1795  		NL_SET_ERR_MSG_MOD(extack, "Jumbo frames not supported on XDP");
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1796  		return -EOPNOTSUPP;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1797  	}
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1798  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1799  	if (netif_running(dev))
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1800  		netsec_netdev_stop(dev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1801  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1802  	/* Detach old prog, if any */
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1803  	old_prog = xchg(&priv->xdp_prog, prog);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1804  	if (old_prog)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1805  		bpf_prog_put(old_prog);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1806  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1807  	if (netif_running(dev))
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1808  		netsec_netdev_open(dev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1809  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1810  	return 0;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1811  }
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1812  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1813  static int netsec_xdp(struct net_device *ndev, struct netdev_bpf *xdp)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1814  {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1815  	struct netsec_priv *priv = netdev_priv(ndev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1816  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1817  	switch (xdp->command) {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1818  	case XDP_SETUP_PROG:
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1819  		return netsec_xdp_setup(priv, xdp->prog, xdp->extack);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1820  	default:
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1821  		return -EINVAL;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1822  	}
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1823  }
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1824  
533dd11a12f698c Jassi Brar       2018-01-06  1825  static const struct net_device_ops netsec_netdev_ops = {
533dd11a12f698c Jassi Brar       2018-01-06  1826  	.ndo_init		= netsec_netdev_init,
533dd11a12f698c Jassi Brar       2018-01-06  1827  	.ndo_uninit		= netsec_netdev_uninit,
533dd11a12f698c Jassi Brar       2018-01-06  1828  	.ndo_open		= netsec_netdev_open,
533dd11a12f698c Jassi Brar       2018-01-06  1829  	.ndo_stop		= netsec_netdev_stop,
533dd11a12f698c Jassi Brar       2018-01-06  1830  	.ndo_start_xmit		= netsec_netdev_start_xmit,
533dd11a12f698c Jassi Brar       2018-01-06  1831  	.ndo_set_features	= netsec_netdev_set_features,
533dd11a12f698c Jassi Brar       2018-01-06  1832  	.ndo_set_mac_address    = eth_mac_addr,
533dd11a12f698c Jassi Brar       2018-01-06  1833  	.ndo_validate_addr	= eth_validate_addr,
c5d19a6ecfce72d Heiner Kallweit  2020-01-21  1834  	.ndo_do_ioctl		= phy_do_ioctl,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1835  	.ndo_xdp_xmit		= netsec_xdp_xmit,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1836  	.ndo_bpf		= netsec_xdp,
533dd11a12f698c Jassi Brar       2018-01-06  1837  };
533dd11a12f698c Jassi Brar       2018-01-06  1838  
533dd11a12f698c Jassi Brar       2018-01-06 @1839  static int netsec_of_probe(struct platform_device *pdev,
8e850f25b5812ae Masahisa Kojima  2018-10-23  1840  			   struct netsec_priv *priv, u32 *phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1841  {
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1842  	int err;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1843  
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1844  	err = of_get_phy_mode(pdev->dev.of_node, &priv->phy_interface);
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1845  	if (err) {
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1846  		dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1847  		return err;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1848  	}
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1849  
533dd11a12f698c Jassi Brar       2018-01-06  1850  	priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
533dd11a12f698c Jassi Brar       2018-01-06  1851  	if (!priv->phy_np) {
533dd11a12f698c Jassi Brar       2018-01-06  1852  		dev_err(&pdev->dev, "missing required property 'phy-handle'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1853  		return -EINVAL;
533dd11a12f698c Jassi Brar       2018-01-06  1854  	}
533dd11a12f698c Jassi Brar       2018-01-06  1855  
8e850f25b5812ae Masahisa Kojima  2018-10-23  1856  	*phy_addr = of_mdio_parse_addr(&pdev->dev, priv->phy_np);
8e850f25b5812ae Masahisa Kojima  2018-10-23  1857  
533dd11a12f698c Jassi Brar       2018-01-06  1858  	priv->clk = devm_clk_get(&pdev->dev, NULL); /* get by 'phy_ref_clk' */
533dd11a12f698c Jassi Brar       2018-01-06  1859  	if (IS_ERR(priv->clk)) {
533dd11a12f698c Jassi Brar       2018-01-06  1860  		dev_err(&pdev->dev, "phy_ref_clk not found\n");
533dd11a12f698c Jassi Brar       2018-01-06  1861  		return PTR_ERR(priv->clk);
533dd11a12f698c Jassi Brar       2018-01-06  1862  	}
533dd11a12f698c Jassi Brar       2018-01-06  1863  	priv->freq = clk_get_rate(priv->clk);
533dd11a12f698c Jassi Brar       2018-01-06  1864  
533dd11a12f698c Jassi Brar       2018-01-06  1865  	return 0;
533dd11a12f698c Jassi Brar       2018-01-06  1866  }
533dd11a12f698c Jassi Brar       2018-01-06  1867  
533dd11a12f698c Jassi Brar       2018-01-06 @1868  static int netsec_acpi_probe(struct platform_device *pdev,
533dd11a12f698c Jassi Brar       2018-01-06  1869  			     struct netsec_priv *priv, u32 *phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1870  {
533dd11a12f698c Jassi Brar       2018-01-06  1871  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1872  
533dd11a12f698c Jassi Brar       2018-01-06  1873  	if (!IS_ENABLED(CONFIG_ACPI))
533dd11a12f698c Jassi Brar       2018-01-06  1874  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1875  
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1876  	/* ACPI systems are assumed to configure the PHY in firmware, so
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1877  	 * there is really no need to discover the PHY mode from the DSDT.
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1878  	 * Since firmware is known to exist in the field that configures the
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1879  	 * PHY correctly but passes the wrong mode string in the phy-mode
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1880  	 * device property, we have no choice but to ignore it.
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1881  	 */
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1882  	priv->phy_interface = PHY_INTERFACE_MODE_NA;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1883  
533dd11a12f698c Jassi Brar       2018-01-06  1884  	ret = device_property_read_u32(&pdev->dev, "phy-channel", phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  1885  	if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1886  		dev_err(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1887  			"missing required property 'phy-channel'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1888  		return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1889  	}
533dd11a12f698c Jassi Brar       2018-01-06  1890  
533dd11a12f698c Jassi Brar       2018-01-06  1891  	ret = device_property_read_u32(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1892  				       "socionext,phy-clock-frequency",
533dd11a12f698c Jassi Brar       2018-01-06  1893  				       &priv->freq);
533dd11a12f698c Jassi Brar       2018-01-06  1894  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  1895  		dev_err(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1896  			"missing required property 'socionext,phy-clock-frequency'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1897  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1898  }
533dd11a12f698c Jassi Brar       2018-01-06  1899  
533dd11a12f698c Jassi Brar       2018-01-06 @1900  static void netsec_unregister_mdio(struct netsec_priv *priv)
533dd11a12f698c Jassi Brar       2018-01-06  1901  {
533dd11a12f698c Jassi Brar       2018-01-06  1902  	struct phy_device *phydev = priv->phydev;
533dd11a12f698c Jassi Brar       2018-01-06  1903  
533dd11a12f698c Jassi Brar       2018-01-06  1904  	if (!dev_of_node(priv->dev) && phydev) {
533dd11a12f698c Jassi Brar       2018-01-06  1905  		phy_device_remove(phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1906  		phy_device_free(phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1907  	}
533dd11a12f698c Jassi Brar       2018-01-06  1908  
533dd11a12f698c Jassi Brar       2018-01-06  1909  	mdiobus_unregister(priv->mii_bus);
533dd11a12f698c Jassi Brar       2018-01-06  1910  }
533dd11a12f698c Jassi Brar       2018-01-06  1911  
533dd11a12f698c Jassi Brar       2018-01-06 @1912  static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1913  {
533dd11a12f698c Jassi Brar       2018-01-06  1914  	struct mii_bus *bus;
533dd11a12f698c Jassi Brar       2018-01-06  1915  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1916  
533dd11a12f698c Jassi Brar       2018-01-06  1917  	bus = devm_mdiobus_alloc(priv->dev);
533dd11a12f698c Jassi Brar       2018-01-06  1918  	if (!bus)
533dd11a12f698c Jassi Brar       2018-01-06  1919  		return -ENOMEM;
533dd11a12f698c Jassi Brar       2018-01-06  1920  
533dd11a12f698c Jassi Brar       2018-01-06  1921  	snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(priv->dev));
533dd11a12f698c Jassi Brar       2018-01-06  1922  	bus->priv = priv;
533dd11a12f698c Jassi Brar       2018-01-06  1923  	bus->name = "SNI NETSEC MDIO";
533dd11a12f698c Jassi Brar       2018-01-06  1924  	bus->read = netsec_phy_read;
533dd11a12f698c Jassi Brar       2018-01-06  1925  	bus->write = netsec_phy_write;
533dd11a12f698c Jassi Brar       2018-01-06  1926  	bus->parent = priv->dev;
533dd11a12f698c Jassi Brar       2018-01-06  1927  	priv->mii_bus = bus;
533dd11a12f698c Jassi Brar       2018-01-06  1928  
533dd11a12f698c Jassi Brar       2018-01-06  1929  	if (dev_of_node(priv->dev)) {
533dd11a12f698c Jassi Brar       2018-01-06  1930  		struct device_node *mdio_node, *parent = dev_of_node(priv->dev);
533dd11a12f698c Jassi Brar       2018-01-06  1931  
533dd11a12f698c Jassi Brar       2018-01-06  1932  		mdio_node = of_get_child_by_name(parent, "mdio");
533dd11a12f698c Jassi Brar       2018-01-06  1933  		if (mdio_node) {
533dd11a12f698c Jassi Brar       2018-01-06  1934  			parent = mdio_node;
533dd11a12f698c Jassi Brar       2018-01-06  1935  		} else {
533dd11a12f698c Jassi Brar       2018-01-06  1936  			/* older f/w doesn't populate the mdio subnode,
533dd11a12f698c Jassi Brar       2018-01-06  1937  			 * allow relaxed upgrade of f/w in due time.
533dd11a12f698c Jassi Brar       2018-01-06  1938  			 */
533dd11a12f698c Jassi Brar       2018-01-06  1939  			dev_info(priv->dev, "Upgrade f/w for mdio subnode!\n");
533dd11a12f698c Jassi Brar       2018-01-06  1940  		}
533dd11a12f698c Jassi Brar       2018-01-06  1941  
533dd11a12f698c Jassi Brar       2018-01-06  1942  		ret = of_mdiobus_register(bus, parent);
533dd11a12f698c Jassi Brar       2018-01-06  1943  		of_node_put(mdio_node);
533dd11a12f698c Jassi Brar       2018-01-06  1944  
533dd11a12f698c Jassi Brar       2018-01-06  1945  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1946  			dev_err(priv->dev, "mdiobus register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1947  			return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1948  		}
533dd11a12f698c Jassi Brar       2018-01-06  1949  	} else {
533dd11a12f698c Jassi Brar       2018-01-06  1950  		/* Mask out all PHYs from auto probing. */
533dd11a12f698c Jassi Brar       2018-01-06  1951  		bus->phy_mask = ~0;
533dd11a12f698c Jassi Brar       2018-01-06  1952  		ret = mdiobus_register(bus);
533dd11a12f698c Jassi Brar       2018-01-06  1953  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1954  			dev_err(priv->dev, "mdiobus register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1955  			return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1956  		}
533dd11a12f698c Jassi Brar       2018-01-06  1957  
533dd11a12f698c Jassi Brar       2018-01-06  1958  		priv->phydev = get_phy_device(bus, phy_addr, false);
533dd11a12f698c Jassi Brar       2018-01-06  1959  		if (IS_ERR(priv->phydev)) {
533dd11a12f698c Jassi Brar       2018-01-06  1960  			ret = PTR_ERR(priv->phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1961  			dev_err(priv->dev, "get_phy_device err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1962  			priv->phydev = NULL;
533dd11a12f698c Jassi Brar       2018-01-06  1963  			return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1964  		}
533dd11a12f698c Jassi Brar       2018-01-06  1965  
533dd11a12f698c Jassi Brar       2018-01-06  1966  		ret = phy_device_register(priv->phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1967  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1968  			mdiobus_unregister(bus);
533dd11a12f698c Jassi Brar       2018-01-06  1969  			dev_err(priv->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1970  				"phy_device_register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1971  		}
533dd11a12f698c Jassi Brar       2018-01-06  1972  	}
533dd11a12f698c Jassi Brar       2018-01-06  1973  
533dd11a12f698c Jassi Brar       2018-01-06  1974  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1975  }
533dd11a12f698c Jassi Brar       2018-01-06  1976  
533dd11a12f698c Jassi Brar       2018-01-06 @1977  static int netsec_probe(struct platform_device *pdev)
533dd11a12f698c Jassi Brar       2018-01-06  1978  {
533dd11a12f698c Jassi Brar       2018-01-06  1979  	struct resource *mmio_res, *eeprom_res, *irq_res;
533dd11a12f698c Jassi Brar       2018-01-06  1980  	u8 *mac, macbuf[ETH_ALEN];
533dd11a12f698c Jassi Brar       2018-01-06  1981  	struct netsec_priv *priv;
533dd11a12f698c Jassi Brar       2018-01-06  1982  	u32 hw_ver, phy_addr = 0;
533dd11a12f698c Jassi Brar       2018-01-06  1983  	struct net_device *ndev;
533dd11a12f698c Jassi Brar       2018-01-06  1984  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1985  
533dd11a12f698c Jassi Brar       2018-01-06  1986  	mmio_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
533dd11a12f698c Jassi Brar       2018-01-06  1987  	if (!mmio_res) {
533dd11a12f698c Jassi Brar       2018-01-06  1988  		dev_err(&pdev->dev, "No MMIO resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  1989  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1990  	}
533dd11a12f698c Jassi Brar       2018-01-06  1991  
533dd11a12f698c Jassi Brar       2018-01-06  1992  	eeprom_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
533dd11a12f698c Jassi Brar       2018-01-06  1993  	if (!eeprom_res) {
533dd11a12f698c Jassi Brar       2018-01-06  1994  		dev_info(&pdev->dev, "No EEPROM resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  1995  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1996  	}
533dd11a12f698c Jassi Brar       2018-01-06  1997  
533dd11a12f698c Jassi Brar       2018-01-06  1998  	irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
533dd11a12f698c Jassi Brar       2018-01-06  1999  	if (!irq_res) {
533dd11a12f698c Jassi Brar       2018-01-06  2000  		dev_err(&pdev->dev, "No IRQ resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  2001  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2002  	}
533dd11a12f698c Jassi Brar       2018-01-06  2003  
533dd11a12f698c Jassi Brar       2018-01-06  2004  	ndev = alloc_etherdev(sizeof(*priv));
533dd11a12f698c Jassi Brar       2018-01-06  2005  	if (!ndev)
533dd11a12f698c Jassi Brar       2018-01-06  2006  		return -ENOMEM;
533dd11a12f698c Jassi Brar       2018-01-06  2007  
533dd11a12f698c Jassi Brar       2018-01-06  2008  	priv = netdev_priv(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2009  
533dd11a12f698c Jassi Brar       2018-01-06  2010  	spin_lock_init(&priv->reglock);
533dd11a12f698c Jassi Brar       2018-01-06  2011  	SET_NETDEV_DEV(ndev, &pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2012  	platform_set_drvdata(pdev, priv);
533dd11a12f698c Jassi Brar       2018-01-06  2013  	ndev->irq = irq_res->start;
533dd11a12f698c Jassi Brar       2018-01-06  2014  	priv->dev = &pdev->dev;
533dd11a12f698c Jassi Brar       2018-01-06  2015  	priv->ndev = ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2016  
533dd11a12f698c Jassi Brar       2018-01-06  2017  	priv->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV |
533dd11a12f698c Jassi Brar       2018-01-06  2018  			   NETIF_MSG_LINK | NETIF_MSG_PROBE;
533dd11a12f698c Jassi Brar       2018-01-06  2019  
533dd11a12f698c Jassi Brar       2018-01-06  2020  	priv->ioaddr = devm_ioremap(&pdev->dev, mmio_res->start,
533dd11a12f698c Jassi Brar       2018-01-06  2021  				    resource_size(mmio_res));
533dd11a12f698c Jassi Brar       2018-01-06  2022  	if (!priv->ioaddr) {
533dd11a12f698c Jassi Brar       2018-01-06  2023  		dev_err(&pdev->dev, "devm_ioremap() failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2024  		ret = -ENXIO;
533dd11a12f698c Jassi Brar       2018-01-06  2025  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2026  	}
533dd11a12f698c Jassi Brar       2018-01-06  2027  
533dd11a12f698c Jassi Brar       2018-01-06  2028  	priv->eeprom_base = devm_ioremap(&pdev->dev, eeprom_res->start,
533dd11a12f698c Jassi Brar       2018-01-06  2029  					 resource_size(eeprom_res));
533dd11a12f698c Jassi Brar       2018-01-06  2030  	if (!priv->eeprom_base) {
533dd11a12f698c Jassi Brar       2018-01-06  2031  		dev_err(&pdev->dev, "devm_ioremap() failed for EEPROM\n");
533dd11a12f698c Jassi Brar       2018-01-06  2032  		ret = -ENXIO;
533dd11a12f698c Jassi Brar       2018-01-06  2033  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2034  	}
533dd11a12f698c Jassi Brar       2018-01-06  2035  
533dd11a12f698c Jassi Brar       2018-01-06  2036  	mac = device_get_mac_address(&pdev->dev, macbuf, sizeof(macbuf));
533dd11a12f698c Jassi Brar       2018-01-06  2037  	if (mac)
533dd11a12f698c Jassi Brar       2018-01-06  2038  		ether_addr_copy(ndev->dev_addr, mac);
533dd11a12f698c Jassi Brar       2018-01-06  2039  
533dd11a12f698c Jassi Brar       2018-01-06  2040  	if (priv->eeprom_base &&
533dd11a12f698c Jassi Brar       2018-01-06  2041  	    (!mac || !is_valid_ether_addr(ndev->dev_addr))) {
533dd11a12f698c Jassi Brar       2018-01-06  2042  		void __iomem *macp = priv->eeprom_base +
533dd11a12f698c Jassi Brar       2018-01-06  2043  					NETSEC_EEPROM_MAC_ADDRESS;
533dd11a12f698c Jassi Brar       2018-01-06  2044  
533dd11a12f698c Jassi Brar       2018-01-06  2045  		ndev->dev_addr[0] = readb(macp + 3);
533dd11a12f698c Jassi Brar       2018-01-06  2046  		ndev->dev_addr[1] = readb(macp + 2);
533dd11a12f698c Jassi Brar       2018-01-06  2047  		ndev->dev_addr[2] = readb(macp + 1);
533dd11a12f698c Jassi Brar       2018-01-06  2048  		ndev->dev_addr[3] = readb(macp + 0);
533dd11a12f698c Jassi Brar       2018-01-06  2049  		ndev->dev_addr[4] = readb(macp + 7);
533dd11a12f698c Jassi Brar       2018-01-06  2050  		ndev->dev_addr[5] = readb(macp + 6);
533dd11a12f698c Jassi Brar       2018-01-06  2051  	}
533dd11a12f698c Jassi Brar       2018-01-06  2052  
533dd11a12f698c Jassi Brar       2018-01-06  2053  	if (!is_valid_ether_addr(ndev->dev_addr)) {
533dd11a12f698c Jassi Brar       2018-01-06  2054  		dev_warn(&pdev->dev, "No MAC address found, using random\n");
533dd11a12f698c Jassi Brar       2018-01-06  2055  		eth_hw_addr_random(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2056  	}
533dd11a12f698c Jassi Brar       2018-01-06  2057  
533dd11a12f698c Jassi Brar       2018-01-06  2058  	if (dev_of_node(&pdev->dev))
8e850f25b5812ae Masahisa Kojima  2018-10-23  2059  		ret = netsec_of_probe(pdev, priv, &phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2060  	else
533dd11a12f698c Jassi Brar       2018-01-06  2061  		ret = netsec_acpi_probe(pdev, priv, &phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2062  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  2063  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2064  
8e850f25b5812ae Masahisa Kojima  2018-10-23  2065  	priv->phy_addr = phy_addr;
8e850f25b5812ae Masahisa Kojima  2018-10-23  2066  
533dd11a12f698c Jassi Brar       2018-01-06  2067  	if (!priv->freq) {
533dd11a12f698c Jassi Brar       2018-01-06  2068  		dev_err(&pdev->dev, "missing PHY reference clock frequency\n");
533dd11a12f698c Jassi Brar       2018-01-06  2069  		ret = -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2070  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2071  	}
533dd11a12f698c Jassi Brar       2018-01-06  2072  
533dd11a12f698c Jassi Brar       2018-01-06  2073  	/* default for throughput */
533dd11a12f698c Jassi Brar       2018-01-06  2074  	priv->et_coalesce.rx_coalesce_usecs = 500;
533dd11a12f698c Jassi Brar       2018-01-06  2075  	priv->et_coalesce.rx_max_coalesced_frames = 8;
533dd11a12f698c Jassi Brar       2018-01-06  2076  	priv->et_coalesce.tx_coalesce_usecs = 500;
533dd11a12f698c Jassi Brar       2018-01-06  2077  	priv->et_coalesce.tx_max_coalesced_frames = 8;
533dd11a12f698c Jassi Brar       2018-01-06  2078  
533dd11a12f698c Jassi Brar       2018-01-06  2079  	ret = device_property_read_u32(&pdev->dev, "max-frame-size",
533dd11a12f698c Jassi Brar       2018-01-06  2080  				       &ndev->max_mtu);
533dd11a12f698c Jassi Brar       2018-01-06  2081  	if (ret < 0)
533dd11a12f698c Jassi Brar       2018-01-06  2082  		ndev->max_mtu = ETH_DATA_LEN;
533dd11a12f698c Jassi Brar       2018-01-06  2083  
533dd11a12f698c Jassi Brar       2018-01-06  2084  	/* runtime_pm coverage just for probe, open/close also cover it */
533dd11a12f698c Jassi Brar       2018-01-06  2085  	pm_runtime_enable(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2086  	pm_runtime_get_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2087  
533dd11a12f698c Jassi Brar       2018-01-06  2088  	hw_ver = netsec_read(priv, NETSEC_REG_F_TAIKI_VER);
533dd11a12f698c Jassi Brar       2018-01-06  2089  	/* this driver only supports F_TAIKI style NETSEC */
533dd11a12f698c Jassi Brar       2018-01-06  2090  	if (NETSEC_F_NETSEC_VER_MAJOR_NUM(hw_ver) !=
533dd11a12f698c Jassi Brar       2018-01-06  2091  	    NETSEC_F_NETSEC_VER_MAJOR_NUM(NETSEC_REG_NETSEC_VER_F_TAIKI)) {
533dd11a12f698c Jassi Brar       2018-01-06  2092  		ret = -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2093  		goto pm_disable;
533dd11a12f698c Jassi Brar       2018-01-06  2094  	}
533dd11a12f698c Jassi Brar       2018-01-06  2095  
533dd11a12f698c Jassi Brar       2018-01-06  2096  	dev_info(&pdev->dev, "hardware revision %d.%d\n",
533dd11a12f698c Jassi Brar       2018-01-06  2097  		 hw_ver >> 16, hw_ver & 0xffff);
533dd11a12f698c Jassi Brar       2018-01-06  2098  
b6311b7bea41963 Ilias Apalodimas 2018-08-10  2099  	netif_napi_add(ndev, &priv->napi, netsec_napi_poll, NAPI_POLL_WEIGHT);
533dd11a12f698c Jassi Brar       2018-01-06  2100  
533dd11a12f698c Jassi Brar       2018-01-06  2101  	ndev->netdev_ops = &netsec_netdev_ops;
533dd11a12f698c Jassi Brar       2018-01-06  2102  	ndev->ethtool_ops = &netsec_ethtool_ops;
533dd11a12f698c Jassi Brar       2018-01-06  2103  
533dd11a12f698c Jassi Brar       2018-01-06  2104  	ndev->features |= NETIF_F_HIGHDMA | NETIF_F_RXCSUM | NETIF_F_GSO |
533dd11a12f698c Jassi Brar       2018-01-06  2105  				NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
533dd11a12f698c Jassi Brar       2018-01-06  2106  	ndev->hw_features = ndev->features;
533dd11a12f698c Jassi Brar       2018-01-06  2107  
533dd11a12f698c Jassi Brar       2018-01-06  2108  	priv->rx_cksum_offload_flag = true;
533dd11a12f698c Jassi Brar       2018-01-06  2109  
533dd11a12f698c Jassi Brar       2018-01-06  2110  	ret = netsec_register_mdio(priv, phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2111  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  2112  		goto unreg_napi;
533dd11a12f698c Jassi Brar       2018-01-06  2113  
312564269535892 Ard Biesheuvel   2018-05-25  2114  	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40)))
312564269535892 Ard Biesheuvel   2018-05-25  2115  		dev_warn(&pdev->dev, "Failed to set DMA mask\n");
533dd11a12f698c Jassi Brar       2018-01-06  2116  
533dd11a12f698c Jassi Brar       2018-01-06  2117  	ret = register_netdev(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2118  	if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  2119  		netif_err(priv, probe, ndev, "register_netdev() failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2120  		goto unreg_mii;
533dd11a12f698c Jassi Brar       2018-01-06  2121  	}
533dd11a12f698c Jassi Brar       2018-01-06  2122  
533dd11a12f698c Jassi Brar       2018-01-06  2123  	pm_runtime_put_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2124  	return 0;
533dd11a12f698c Jassi Brar       2018-01-06  2125  
533dd11a12f698c Jassi Brar       2018-01-06  2126  unreg_mii:
533dd11a12f698c Jassi Brar       2018-01-06  2127  	netsec_unregister_mdio(priv);
533dd11a12f698c Jassi Brar       2018-01-06  2128  unreg_napi:
533dd11a12f698c Jassi Brar       2018-01-06  2129  	netif_napi_del(&priv->napi);
533dd11a12f698c Jassi Brar       2018-01-06  2130  pm_disable:
533dd11a12f698c Jassi Brar       2018-01-06  2131  	pm_runtime_put_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2132  	pm_runtime_disable(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2133  free_ndev:
533dd11a12f698c Jassi Brar       2018-01-06  2134  	free_netdev(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2135  	dev_err(&pdev->dev, "init failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2136  
533dd11a12f698c Jassi Brar       2018-01-06  2137  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  2138  }
533dd11a12f698c Jassi Brar       2018-01-06  2139  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 43101 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT
  2021-02-10 14:18 [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT Lorenzo Bianconi
  2021-02-10 15:29 ` Jesper Dangaard Brouer
  2021-02-10 16:23 ` kernel test robot
@ 2021-02-10 18:19 ` kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-02-10 18:19 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 37757 bytes --]

Hi Lorenzo,

[FYI, it's a private test report for your RFC patch.]
[auto build test ERROR on bpf-next/master]

url:    https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/bpf-devmap-move-drop-error-path-to-devmpap-for-XDP_REDIRECT/20210210-222154
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
config: c6x-randconfig-r011-20210209 (attached as .config)
compiler: c6x-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/96ef538bb5cf75f19f3973722e4f66c7f65781db
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Lorenzo-Bianconi/bpf-devmap-move-drop-error-path-to-devmpap-for-XDP_REDIRECT/20210210-222154
        git checkout 96ef538bb5cf75f19f3973722e4f66c7f65781db
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=c6x 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   drivers/net/ethernet/socionext/netsec.c: In function 'netsec_xdp_xmit':
>> drivers/net/ethernet/socionext/netsec.c:1787:12: error: invalid storage class for function 'netsec_xdp_setup'
    1787 | static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
         |            ^~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1787:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    1787 | static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
         | ^~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1813:12: error: invalid storage class for function 'netsec_xdp'
    1813 | static int netsec_xdp(struct net_device *ndev, struct netdev_bpf *xdp)
         |            ^~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1836:14: error: initializer element is not constant
    1836 |  .ndo_bpf  = netsec_xdp,
         |              ^~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:1836:14: note: (near initialization for 'netsec_netdev_ops.ndo_bpf')
>> drivers/net/ethernet/socionext/netsec.c:1839:12: error: invalid storage class for function 'netsec_of_probe'
    1839 | static int netsec_of_probe(struct platform_device *pdev,
         |            ^~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1868:12: error: invalid storage class for function 'netsec_acpi_probe'
    1868 | static int netsec_acpi_probe(struct platform_device *pdev,
         |            ^~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1900:13: error: invalid storage class for function 'netsec_unregister_mdio'
    1900 | static void netsec_unregister_mdio(struct netsec_priv *priv)
         |             ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1912:12: error: invalid storage class for function 'netsec_register_mdio'
    1912 | static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
         |            ^~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:1977:12: error: invalid storage class for function 'netsec_probe'
    1977 | static int netsec_probe(struct platform_device *pdev)
         |            ^~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2140:12: error: invalid storage class for function 'netsec_remove'
    2140 | static int netsec_remove(struct platform_device *pdev)
         |            ^~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2189:1: warning: 'alias' attribute ignored [-Wattributes]
    2189 | MODULE_DEVICE_TABLE(of, netsec_dt_ids);
         | ^~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2200:11: error: initializer element is not constant
    2200 |  .probe = netsec_probe,
         |           ^~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2200:11: note: (near initialization for 'netsec_driver.probe')
   drivers/net/ethernet/socionext/netsec.c:2201:12: error: initializer element is not constant
    2201 |  .remove = netsec_remove,
         |            ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2201:12: note: (near initialization for 'netsec_driver.remove')
   In file included from include/linux/device.h:32,
                    from include/linux/platform_device.h:13,
                    from drivers/net/ethernet/socionext/netsec.c:5:
>> drivers/net/ethernet/socionext/netsec.c:2209:24: error: invalid storage class for function 'netsec_driver_init'
    2209 | module_platform_driver(netsec_driver);
         |                        ^~~~~~~~~~~~~
   include/linux/device/driver.h:259:19: note: in definition of macro 'module_driver'
     259 | static int __init __driver##_init(void) \
         |                   ^~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/module.h:132:42: error: invalid storage class for function '__inittest'
     132 |  static inline initcall_t __maybe_unused __inittest(void)  \
         |                                          ^~~~~~~~~~
   include/linux/device/driver.h:263:1: note: in expansion of macro 'module_init'
     263 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: warning: 'alias' attribute ignored [-Wattributes]
   In file included from include/linux/device.h:32,
                    from include/linux/platform_device.h:13,
                    from drivers/net/ethernet/socionext/netsec.c:5:
>> drivers/net/ethernet/socionext/netsec.c:2209:24: error: invalid storage class for function 'netsec_driver_exit'
    2209 | module_platform_driver(netsec_driver);
         |                        ^~~~~~~~~~~~~
   include/linux/device/driver.h:264:20: note: in definition of macro 'module_driver'
     264 | static void __exit __driver##_exit(void) \
         |                    ^~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
>> include/linux/device/driver.h:264:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     264 | static void __exit __driver##_exit(void) \
         | ^~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/module.h:138:42: error: invalid storage class for function '__exittest'
     138 |  static inline exitcall_t __maybe_unused __exittest(void)  \
         |                                          ^~~~~~~~~~
   include/linux/device/driver.h:268:1: note: in expansion of macro 'module_exit'
     268 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/platform_device.h:257:2: note: in expansion of macro 'module_driver'
     257 |  module_driver(__platform_driver, platform_driver_register, \
         |  ^~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: note: in expansion of macro 'module_platform_driver'
    2209 | module_platform_driver(netsec_driver);
         | ^~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2209:1: warning: 'alias' attribute ignored [-Wattributes]
   In file included from include/linux/module.h:21,
                    from include/linux/phy.h:22,
                    from include/linux/of_mdio.h:12,
                    from drivers/net/ethernet/socionext/netsec.c:8:
>> include/linux/moduleparam.h:24:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
      24 |  static const char __UNIQUE_ID(name)[]      \
         |  ^~~~~~
   include/linux/module.h:163:32: note: in expansion of macro '__MODULE_INFO'
     163 | #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
         |                                ^~~~~~~~~~~~~
   include/linux/module.h:233:32: note: in expansion of macro 'MODULE_INFO'
     233 | #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
         |                                ^~~~~~~~~~~
   drivers/net/ethernet/socionext/netsec.c:2211:1: note: in expansion of macro 'MODULE_AUTHOR'
    2211 | MODULE_AUTHOR("Jassi Brar <jaswinder.singh@linaro.org>");
         | ^~~~~~~~~~~~~
>> drivers/net/ethernet/socionext/netsec.c:2214:1: error: expected declaration or statement at end of input
    2214 | MODULE_LICENSE("GPL");
         | ^~~~~~~~~~~~~~
   At top level:
   drivers/net/ethernet/socionext/netsec.c:1755:12: warning: 'netsec_xdp_xmit' defined but not used [-Wunused-function]
    1755 | static int netsec_xdp_xmit(struct net_device *ndev, int n,
         |            ^~~~~~~~~~~~~~~


vim +/netsec_xdp_setup +1787 drivers/net/ethernet/socionext/netsec.c

ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1786  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1787  static int netsec_xdp_setup(struct netsec_priv *priv, struct bpf_prog *prog,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1788  			    struct netlink_ext_ack *extack)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1789  {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1790  	struct net_device *dev = priv->ndev;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1791  	struct bpf_prog *old_prog;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1792  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1793  	/* For now just support only the usual MTU sized frames */
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1794  	if (prog && dev->mtu > 1500) {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1795  		NL_SET_ERR_MSG_MOD(extack, "Jumbo frames not supported on XDP");
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1796  		return -EOPNOTSUPP;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1797  	}
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1798  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1799  	if (netif_running(dev))
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1800  		netsec_netdev_stop(dev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1801  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1802  	/* Detach old prog, if any */
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1803  	old_prog = xchg(&priv->xdp_prog, prog);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1804  	if (old_prog)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1805  		bpf_prog_put(old_prog);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1806  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1807  	if (netif_running(dev))
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1808  		netsec_netdev_open(dev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1809  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1810  	return 0;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1811  }
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1812  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1813  static int netsec_xdp(struct net_device *ndev, struct netdev_bpf *xdp)
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1814  {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1815  	struct netsec_priv *priv = netdev_priv(ndev);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1816  
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1817  	switch (xdp->command) {
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1818  	case XDP_SETUP_PROG:
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1819  		return netsec_xdp_setup(priv, xdp->prog, xdp->extack);
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1820  	default:
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1821  		return -EINVAL;
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1822  	}
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1823  }
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1824  
533dd11a12f698c Jassi Brar       2018-01-06  1825  static const struct net_device_ops netsec_netdev_ops = {
533dd11a12f698c Jassi Brar       2018-01-06  1826  	.ndo_init		= netsec_netdev_init,
533dd11a12f698c Jassi Brar       2018-01-06  1827  	.ndo_uninit		= netsec_netdev_uninit,
533dd11a12f698c Jassi Brar       2018-01-06  1828  	.ndo_open		= netsec_netdev_open,
533dd11a12f698c Jassi Brar       2018-01-06  1829  	.ndo_stop		= netsec_netdev_stop,
533dd11a12f698c Jassi Brar       2018-01-06  1830  	.ndo_start_xmit		= netsec_netdev_start_xmit,
533dd11a12f698c Jassi Brar       2018-01-06  1831  	.ndo_set_features	= netsec_netdev_set_features,
533dd11a12f698c Jassi Brar       2018-01-06  1832  	.ndo_set_mac_address    = eth_mac_addr,
533dd11a12f698c Jassi Brar       2018-01-06  1833  	.ndo_validate_addr	= eth_validate_addr,
c5d19a6ecfce72d Heiner Kallweit  2020-01-21  1834  	.ndo_do_ioctl		= phy_do_ioctl,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29  1835  	.ndo_xdp_xmit		= netsec_xdp_xmit,
ba2b232108d3c29 Ilias Apalodimas 2019-06-29 @1836  	.ndo_bpf		= netsec_xdp,
533dd11a12f698c Jassi Brar       2018-01-06  1837  };
533dd11a12f698c Jassi Brar       2018-01-06  1838  
533dd11a12f698c Jassi Brar       2018-01-06 @1839  static int netsec_of_probe(struct platform_device *pdev,
8e850f25b5812ae Masahisa Kojima  2018-10-23  1840  			   struct netsec_priv *priv, u32 *phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1841  {
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1842  	int err;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1843  
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1844  	err = of_get_phy_mode(pdev->dev.of_node, &priv->phy_interface);
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1845  	if (err) {
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1846  		dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1847  		return err;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1848  	}
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1849  
533dd11a12f698c Jassi Brar       2018-01-06  1850  	priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
533dd11a12f698c Jassi Brar       2018-01-06  1851  	if (!priv->phy_np) {
533dd11a12f698c Jassi Brar       2018-01-06  1852  		dev_err(&pdev->dev, "missing required property 'phy-handle'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1853  		return -EINVAL;
533dd11a12f698c Jassi Brar       2018-01-06  1854  	}
533dd11a12f698c Jassi Brar       2018-01-06  1855  
8e850f25b5812ae Masahisa Kojima  2018-10-23  1856  	*phy_addr = of_mdio_parse_addr(&pdev->dev, priv->phy_np);
8e850f25b5812ae Masahisa Kojima  2018-10-23  1857  
533dd11a12f698c Jassi Brar       2018-01-06  1858  	priv->clk = devm_clk_get(&pdev->dev, NULL); /* get by 'phy_ref_clk' */
533dd11a12f698c Jassi Brar       2018-01-06  1859  	if (IS_ERR(priv->clk)) {
533dd11a12f698c Jassi Brar       2018-01-06  1860  		dev_err(&pdev->dev, "phy_ref_clk not found\n");
533dd11a12f698c Jassi Brar       2018-01-06  1861  		return PTR_ERR(priv->clk);
533dd11a12f698c Jassi Brar       2018-01-06  1862  	}
533dd11a12f698c Jassi Brar       2018-01-06  1863  	priv->freq = clk_get_rate(priv->clk);
533dd11a12f698c Jassi Brar       2018-01-06  1864  
533dd11a12f698c Jassi Brar       2018-01-06  1865  	return 0;
533dd11a12f698c Jassi Brar       2018-01-06  1866  }
533dd11a12f698c Jassi Brar       2018-01-06  1867  
533dd11a12f698c Jassi Brar       2018-01-06 @1868  static int netsec_acpi_probe(struct platform_device *pdev,
533dd11a12f698c Jassi Brar       2018-01-06  1869  			     struct netsec_priv *priv, u32 *phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1870  {
533dd11a12f698c Jassi Brar       2018-01-06  1871  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1872  
533dd11a12f698c Jassi Brar       2018-01-06  1873  	if (!IS_ENABLED(CONFIG_ACPI))
533dd11a12f698c Jassi Brar       2018-01-06  1874  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1875  
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1876  	/* ACPI systems are assumed to configure the PHY in firmware, so
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1877  	 * there is really no need to discover the PHY mode from the DSDT.
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1878  	 * Since firmware is known to exist in the field that configures the
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1879  	 * PHY correctly but passes the wrong mode string in the phy-mode
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1880  	 * device property, we have no choice but to ignore it.
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1881  	 */
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1882  	priv->phy_interface = PHY_INTERFACE_MODE_NA;
acd7aaf51b20263 Ard Biesheuvel   2020-10-18  1883  
533dd11a12f698c Jassi Brar       2018-01-06  1884  	ret = device_property_read_u32(&pdev->dev, "phy-channel", phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  1885  	if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1886  		dev_err(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1887  			"missing required property 'phy-channel'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1888  		return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1889  	}
533dd11a12f698c Jassi Brar       2018-01-06  1890  
533dd11a12f698c Jassi Brar       2018-01-06  1891  	ret = device_property_read_u32(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1892  				       "socionext,phy-clock-frequency",
533dd11a12f698c Jassi Brar       2018-01-06  1893  				       &priv->freq);
533dd11a12f698c Jassi Brar       2018-01-06  1894  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  1895  		dev_err(&pdev->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1896  			"missing required property 'socionext,phy-clock-frequency'\n");
533dd11a12f698c Jassi Brar       2018-01-06  1897  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1898  }
533dd11a12f698c Jassi Brar       2018-01-06  1899  
533dd11a12f698c Jassi Brar       2018-01-06 @1900  static void netsec_unregister_mdio(struct netsec_priv *priv)
533dd11a12f698c Jassi Brar       2018-01-06  1901  {
533dd11a12f698c Jassi Brar       2018-01-06  1902  	struct phy_device *phydev = priv->phydev;
533dd11a12f698c Jassi Brar       2018-01-06  1903  
533dd11a12f698c Jassi Brar       2018-01-06  1904  	if (!dev_of_node(priv->dev) && phydev) {
533dd11a12f698c Jassi Brar       2018-01-06  1905  		phy_device_remove(phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1906  		phy_device_free(phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1907  	}
533dd11a12f698c Jassi Brar       2018-01-06  1908  
533dd11a12f698c Jassi Brar       2018-01-06  1909  	mdiobus_unregister(priv->mii_bus);
533dd11a12f698c Jassi Brar       2018-01-06  1910  }
533dd11a12f698c Jassi Brar       2018-01-06  1911  
533dd11a12f698c Jassi Brar       2018-01-06 @1912  static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
533dd11a12f698c Jassi Brar       2018-01-06  1913  {
533dd11a12f698c Jassi Brar       2018-01-06  1914  	struct mii_bus *bus;
533dd11a12f698c Jassi Brar       2018-01-06  1915  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1916  
533dd11a12f698c Jassi Brar       2018-01-06  1917  	bus = devm_mdiobus_alloc(priv->dev);
533dd11a12f698c Jassi Brar       2018-01-06  1918  	if (!bus)
533dd11a12f698c Jassi Brar       2018-01-06  1919  		return -ENOMEM;
533dd11a12f698c Jassi Brar       2018-01-06  1920  
533dd11a12f698c Jassi Brar       2018-01-06  1921  	snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(priv->dev));
533dd11a12f698c Jassi Brar       2018-01-06  1922  	bus->priv = priv;
533dd11a12f698c Jassi Brar       2018-01-06  1923  	bus->name = "SNI NETSEC MDIO";
533dd11a12f698c Jassi Brar       2018-01-06  1924  	bus->read = netsec_phy_read;
533dd11a12f698c Jassi Brar       2018-01-06  1925  	bus->write = netsec_phy_write;
533dd11a12f698c Jassi Brar       2018-01-06  1926  	bus->parent = priv->dev;
533dd11a12f698c Jassi Brar       2018-01-06  1927  	priv->mii_bus = bus;
533dd11a12f698c Jassi Brar       2018-01-06  1928  
533dd11a12f698c Jassi Brar       2018-01-06  1929  	if (dev_of_node(priv->dev)) {
533dd11a12f698c Jassi Brar       2018-01-06  1930  		struct device_node *mdio_node, *parent = dev_of_node(priv->dev);
533dd11a12f698c Jassi Brar       2018-01-06  1931  
533dd11a12f698c Jassi Brar       2018-01-06  1932  		mdio_node = of_get_child_by_name(parent, "mdio");
533dd11a12f698c Jassi Brar       2018-01-06  1933  		if (mdio_node) {
533dd11a12f698c Jassi Brar       2018-01-06  1934  			parent = mdio_node;
533dd11a12f698c Jassi Brar       2018-01-06  1935  		} else {
533dd11a12f698c Jassi Brar       2018-01-06  1936  			/* older f/w doesn't populate the mdio subnode,
533dd11a12f698c Jassi Brar       2018-01-06  1937  			 * allow relaxed upgrade of f/w in due time.
533dd11a12f698c Jassi Brar       2018-01-06  1938  			 */
533dd11a12f698c Jassi Brar       2018-01-06  1939  			dev_info(priv->dev, "Upgrade f/w for mdio subnode!\n");
533dd11a12f698c Jassi Brar       2018-01-06  1940  		}
533dd11a12f698c Jassi Brar       2018-01-06  1941  
533dd11a12f698c Jassi Brar       2018-01-06  1942  		ret = of_mdiobus_register(bus, parent);
533dd11a12f698c Jassi Brar       2018-01-06  1943  		of_node_put(mdio_node);
533dd11a12f698c Jassi Brar       2018-01-06  1944  
533dd11a12f698c Jassi Brar       2018-01-06  1945  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1946  			dev_err(priv->dev, "mdiobus register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1947  			return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1948  		}
533dd11a12f698c Jassi Brar       2018-01-06  1949  	} else {
533dd11a12f698c Jassi Brar       2018-01-06  1950  		/* Mask out all PHYs from auto probing. */
533dd11a12f698c Jassi Brar       2018-01-06  1951  		bus->phy_mask = ~0;
533dd11a12f698c Jassi Brar       2018-01-06  1952  		ret = mdiobus_register(bus);
533dd11a12f698c Jassi Brar       2018-01-06  1953  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1954  			dev_err(priv->dev, "mdiobus register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1955  			return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1956  		}
533dd11a12f698c Jassi Brar       2018-01-06  1957  
533dd11a12f698c Jassi Brar       2018-01-06  1958  		priv->phydev = get_phy_device(bus, phy_addr, false);
533dd11a12f698c Jassi Brar       2018-01-06  1959  		if (IS_ERR(priv->phydev)) {
533dd11a12f698c Jassi Brar       2018-01-06  1960  			ret = PTR_ERR(priv->phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1961  			dev_err(priv->dev, "get_phy_device err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1962  			priv->phydev = NULL;
533dd11a12f698c Jassi Brar       2018-01-06  1963  			return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1964  		}
533dd11a12f698c Jassi Brar       2018-01-06  1965  
533dd11a12f698c Jassi Brar       2018-01-06  1966  		ret = phy_device_register(priv->phydev);
533dd11a12f698c Jassi Brar       2018-01-06  1967  		if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  1968  			mdiobus_unregister(bus);
533dd11a12f698c Jassi Brar       2018-01-06  1969  			dev_err(priv->dev,
533dd11a12f698c Jassi Brar       2018-01-06  1970  				"phy_device_register err(%d)\n", ret);
533dd11a12f698c Jassi Brar       2018-01-06  1971  		}
533dd11a12f698c Jassi Brar       2018-01-06  1972  	}
533dd11a12f698c Jassi Brar       2018-01-06  1973  
533dd11a12f698c Jassi Brar       2018-01-06  1974  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  1975  }
533dd11a12f698c Jassi Brar       2018-01-06  1976  
533dd11a12f698c Jassi Brar       2018-01-06 @1977  static int netsec_probe(struct platform_device *pdev)
533dd11a12f698c Jassi Brar       2018-01-06  1978  {
533dd11a12f698c Jassi Brar       2018-01-06  1979  	struct resource *mmio_res, *eeprom_res, *irq_res;
533dd11a12f698c Jassi Brar       2018-01-06  1980  	u8 *mac, macbuf[ETH_ALEN];
533dd11a12f698c Jassi Brar       2018-01-06  1981  	struct netsec_priv *priv;
533dd11a12f698c Jassi Brar       2018-01-06  1982  	u32 hw_ver, phy_addr = 0;
533dd11a12f698c Jassi Brar       2018-01-06  1983  	struct net_device *ndev;
533dd11a12f698c Jassi Brar       2018-01-06  1984  	int ret;
533dd11a12f698c Jassi Brar       2018-01-06  1985  
533dd11a12f698c Jassi Brar       2018-01-06  1986  	mmio_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
533dd11a12f698c Jassi Brar       2018-01-06  1987  	if (!mmio_res) {
533dd11a12f698c Jassi Brar       2018-01-06  1988  		dev_err(&pdev->dev, "No MMIO resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  1989  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1990  	}
533dd11a12f698c Jassi Brar       2018-01-06  1991  
533dd11a12f698c Jassi Brar       2018-01-06  1992  	eeprom_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
533dd11a12f698c Jassi Brar       2018-01-06  1993  	if (!eeprom_res) {
533dd11a12f698c Jassi Brar       2018-01-06  1994  		dev_info(&pdev->dev, "No EEPROM resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  1995  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  1996  	}
533dd11a12f698c Jassi Brar       2018-01-06  1997  
533dd11a12f698c Jassi Brar       2018-01-06  1998  	irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
533dd11a12f698c Jassi Brar       2018-01-06  1999  	if (!irq_res) {
533dd11a12f698c Jassi Brar       2018-01-06  2000  		dev_err(&pdev->dev, "No IRQ resource found.\n");
533dd11a12f698c Jassi Brar       2018-01-06  2001  		return -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2002  	}
533dd11a12f698c Jassi Brar       2018-01-06  2003  
533dd11a12f698c Jassi Brar       2018-01-06  2004  	ndev = alloc_etherdev(sizeof(*priv));
533dd11a12f698c Jassi Brar       2018-01-06  2005  	if (!ndev)
533dd11a12f698c Jassi Brar       2018-01-06  2006  		return -ENOMEM;
533dd11a12f698c Jassi Brar       2018-01-06  2007  
533dd11a12f698c Jassi Brar       2018-01-06  2008  	priv = netdev_priv(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2009  
533dd11a12f698c Jassi Brar       2018-01-06  2010  	spin_lock_init(&priv->reglock);
533dd11a12f698c Jassi Brar       2018-01-06  2011  	SET_NETDEV_DEV(ndev, &pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2012  	platform_set_drvdata(pdev, priv);
533dd11a12f698c Jassi Brar       2018-01-06  2013  	ndev->irq = irq_res->start;
533dd11a12f698c Jassi Brar       2018-01-06  2014  	priv->dev = &pdev->dev;
533dd11a12f698c Jassi Brar       2018-01-06  2015  	priv->ndev = ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2016  
533dd11a12f698c Jassi Brar       2018-01-06  2017  	priv->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV |
533dd11a12f698c Jassi Brar       2018-01-06  2018  			   NETIF_MSG_LINK | NETIF_MSG_PROBE;
533dd11a12f698c Jassi Brar       2018-01-06  2019  
533dd11a12f698c Jassi Brar       2018-01-06  2020  	priv->ioaddr = devm_ioremap(&pdev->dev, mmio_res->start,
533dd11a12f698c Jassi Brar       2018-01-06  2021  				    resource_size(mmio_res));
533dd11a12f698c Jassi Brar       2018-01-06  2022  	if (!priv->ioaddr) {
533dd11a12f698c Jassi Brar       2018-01-06  2023  		dev_err(&pdev->dev, "devm_ioremap() failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2024  		ret = -ENXIO;
533dd11a12f698c Jassi Brar       2018-01-06  2025  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2026  	}
533dd11a12f698c Jassi Brar       2018-01-06  2027  
533dd11a12f698c Jassi Brar       2018-01-06  2028  	priv->eeprom_base = devm_ioremap(&pdev->dev, eeprom_res->start,
533dd11a12f698c Jassi Brar       2018-01-06  2029  					 resource_size(eeprom_res));
533dd11a12f698c Jassi Brar       2018-01-06  2030  	if (!priv->eeprom_base) {
533dd11a12f698c Jassi Brar       2018-01-06  2031  		dev_err(&pdev->dev, "devm_ioremap() failed for EEPROM\n");
533dd11a12f698c Jassi Brar       2018-01-06  2032  		ret = -ENXIO;
533dd11a12f698c Jassi Brar       2018-01-06  2033  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2034  	}
533dd11a12f698c Jassi Brar       2018-01-06  2035  
533dd11a12f698c Jassi Brar       2018-01-06  2036  	mac = device_get_mac_address(&pdev->dev, macbuf, sizeof(macbuf));
533dd11a12f698c Jassi Brar       2018-01-06  2037  	if (mac)
533dd11a12f698c Jassi Brar       2018-01-06  2038  		ether_addr_copy(ndev->dev_addr, mac);
533dd11a12f698c Jassi Brar       2018-01-06  2039  
533dd11a12f698c Jassi Brar       2018-01-06  2040  	if (priv->eeprom_base &&
533dd11a12f698c Jassi Brar       2018-01-06  2041  	    (!mac || !is_valid_ether_addr(ndev->dev_addr))) {
533dd11a12f698c Jassi Brar       2018-01-06  2042  		void __iomem *macp = priv->eeprom_base +
533dd11a12f698c Jassi Brar       2018-01-06  2043  					NETSEC_EEPROM_MAC_ADDRESS;
533dd11a12f698c Jassi Brar       2018-01-06  2044  
533dd11a12f698c Jassi Brar       2018-01-06  2045  		ndev->dev_addr[0] = readb(macp + 3);
533dd11a12f698c Jassi Brar       2018-01-06  2046  		ndev->dev_addr[1] = readb(macp + 2);
533dd11a12f698c Jassi Brar       2018-01-06  2047  		ndev->dev_addr[2] = readb(macp + 1);
533dd11a12f698c Jassi Brar       2018-01-06  2048  		ndev->dev_addr[3] = readb(macp + 0);
533dd11a12f698c Jassi Brar       2018-01-06  2049  		ndev->dev_addr[4] = readb(macp + 7);
533dd11a12f698c Jassi Brar       2018-01-06  2050  		ndev->dev_addr[5] = readb(macp + 6);
533dd11a12f698c Jassi Brar       2018-01-06  2051  	}
533dd11a12f698c Jassi Brar       2018-01-06  2052  
533dd11a12f698c Jassi Brar       2018-01-06  2053  	if (!is_valid_ether_addr(ndev->dev_addr)) {
533dd11a12f698c Jassi Brar       2018-01-06  2054  		dev_warn(&pdev->dev, "No MAC address found, using random\n");
533dd11a12f698c Jassi Brar       2018-01-06  2055  		eth_hw_addr_random(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2056  	}
533dd11a12f698c Jassi Brar       2018-01-06  2057  
533dd11a12f698c Jassi Brar       2018-01-06  2058  	if (dev_of_node(&pdev->dev))
8e850f25b5812ae Masahisa Kojima  2018-10-23  2059  		ret = netsec_of_probe(pdev, priv, &phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2060  	else
533dd11a12f698c Jassi Brar       2018-01-06  2061  		ret = netsec_acpi_probe(pdev, priv, &phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2062  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  2063  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2064  
8e850f25b5812ae Masahisa Kojima  2018-10-23  2065  	priv->phy_addr = phy_addr;
8e850f25b5812ae Masahisa Kojima  2018-10-23  2066  
533dd11a12f698c Jassi Brar       2018-01-06  2067  	if (!priv->freq) {
533dd11a12f698c Jassi Brar       2018-01-06  2068  		dev_err(&pdev->dev, "missing PHY reference clock frequency\n");
533dd11a12f698c Jassi Brar       2018-01-06  2069  		ret = -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2070  		goto free_ndev;
533dd11a12f698c Jassi Brar       2018-01-06  2071  	}
533dd11a12f698c Jassi Brar       2018-01-06  2072  
533dd11a12f698c Jassi Brar       2018-01-06  2073  	/* default for throughput */
533dd11a12f698c Jassi Brar       2018-01-06  2074  	priv->et_coalesce.rx_coalesce_usecs = 500;
533dd11a12f698c Jassi Brar       2018-01-06  2075  	priv->et_coalesce.rx_max_coalesced_frames = 8;
533dd11a12f698c Jassi Brar       2018-01-06  2076  	priv->et_coalesce.tx_coalesce_usecs = 500;
533dd11a12f698c Jassi Brar       2018-01-06  2077  	priv->et_coalesce.tx_max_coalesced_frames = 8;
533dd11a12f698c Jassi Brar       2018-01-06  2078  
533dd11a12f698c Jassi Brar       2018-01-06  2079  	ret = device_property_read_u32(&pdev->dev, "max-frame-size",
533dd11a12f698c Jassi Brar       2018-01-06  2080  				       &ndev->max_mtu);
533dd11a12f698c Jassi Brar       2018-01-06  2081  	if (ret < 0)
533dd11a12f698c Jassi Brar       2018-01-06  2082  		ndev->max_mtu = ETH_DATA_LEN;
533dd11a12f698c Jassi Brar       2018-01-06  2083  
533dd11a12f698c Jassi Brar       2018-01-06  2084  	/* runtime_pm coverage just for probe, open/close also cover it */
533dd11a12f698c Jassi Brar       2018-01-06  2085  	pm_runtime_enable(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2086  	pm_runtime_get_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2087  
533dd11a12f698c Jassi Brar       2018-01-06  2088  	hw_ver = netsec_read(priv, NETSEC_REG_F_TAIKI_VER);
533dd11a12f698c Jassi Brar       2018-01-06  2089  	/* this driver only supports F_TAIKI style NETSEC */
533dd11a12f698c Jassi Brar       2018-01-06  2090  	if (NETSEC_F_NETSEC_VER_MAJOR_NUM(hw_ver) !=
533dd11a12f698c Jassi Brar       2018-01-06  2091  	    NETSEC_F_NETSEC_VER_MAJOR_NUM(NETSEC_REG_NETSEC_VER_F_TAIKI)) {
533dd11a12f698c Jassi Brar       2018-01-06  2092  		ret = -ENODEV;
533dd11a12f698c Jassi Brar       2018-01-06  2093  		goto pm_disable;
533dd11a12f698c Jassi Brar       2018-01-06  2094  	}
533dd11a12f698c Jassi Brar       2018-01-06  2095  
533dd11a12f698c Jassi Brar       2018-01-06  2096  	dev_info(&pdev->dev, "hardware revision %d.%d\n",
533dd11a12f698c Jassi Brar       2018-01-06  2097  		 hw_ver >> 16, hw_ver & 0xffff);
533dd11a12f698c Jassi Brar       2018-01-06  2098  
b6311b7bea41963 Ilias Apalodimas 2018-08-10  2099  	netif_napi_add(ndev, &priv->napi, netsec_napi_poll, NAPI_POLL_WEIGHT);
533dd11a12f698c Jassi Brar       2018-01-06  2100  
533dd11a12f698c Jassi Brar       2018-01-06  2101  	ndev->netdev_ops = &netsec_netdev_ops;
533dd11a12f698c Jassi Brar       2018-01-06  2102  	ndev->ethtool_ops = &netsec_ethtool_ops;
533dd11a12f698c Jassi Brar       2018-01-06  2103  
533dd11a12f698c Jassi Brar       2018-01-06  2104  	ndev->features |= NETIF_F_HIGHDMA | NETIF_F_RXCSUM | NETIF_F_GSO |
533dd11a12f698c Jassi Brar       2018-01-06  2105  				NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
533dd11a12f698c Jassi Brar       2018-01-06  2106  	ndev->hw_features = ndev->features;
533dd11a12f698c Jassi Brar       2018-01-06  2107  
533dd11a12f698c Jassi Brar       2018-01-06  2108  	priv->rx_cksum_offload_flag = true;
533dd11a12f698c Jassi Brar       2018-01-06  2109  
533dd11a12f698c Jassi Brar       2018-01-06  2110  	ret = netsec_register_mdio(priv, phy_addr);
533dd11a12f698c Jassi Brar       2018-01-06  2111  	if (ret)
533dd11a12f698c Jassi Brar       2018-01-06  2112  		goto unreg_napi;
533dd11a12f698c Jassi Brar       2018-01-06  2113  
312564269535892 Ard Biesheuvel   2018-05-25  2114  	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40)))
312564269535892 Ard Biesheuvel   2018-05-25  2115  		dev_warn(&pdev->dev, "Failed to set DMA mask\n");
533dd11a12f698c Jassi Brar       2018-01-06  2116  
533dd11a12f698c Jassi Brar       2018-01-06  2117  	ret = register_netdev(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2118  	if (ret) {
533dd11a12f698c Jassi Brar       2018-01-06  2119  		netif_err(priv, probe, ndev, "register_netdev() failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2120  		goto unreg_mii;
533dd11a12f698c Jassi Brar       2018-01-06  2121  	}
533dd11a12f698c Jassi Brar       2018-01-06  2122  
533dd11a12f698c Jassi Brar       2018-01-06  2123  	pm_runtime_put_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2124  	return 0;
533dd11a12f698c Jassi Brar       2018-01-06  2125  
533dd11a12f698c Jassi Brar       2018-01-06  2126  unreg_mii:
533dd11a12f698c Jassi Brar       2018-01-06  2127  	netsec_unregister_mdio(priv);
533dd11a12f698c Jassi Brar       2018-01-06  2128  unreg_napi:
533dd11a12f698c Jassi Brar       2018-01-06  2129  	netif_napi_del(&priv->napi);
533dd11a12f698c Jassi Brar       2018-01-06  2130  pm_disable:
533dd11a12f698c Jassi Brar       2018-01-06  2131  	pm_runtime_put_sync(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2132  	pm_runtime_disable(&pdev->dev);
533dd11a12f698c Jassi Brar       2018-01-06  2133  free_ndev:
533dd11a12f698c Jassi Brar       2018-01-06  2134  	free_netdev(ndev);
533dd11a12f698c Jassi Brar       2018-01-06  2135  	dev_err(&pdev->dev, "init failed\n");
533dd11a12f698c Jassi Brar       2018-01-06  2136  
533dd11a12f698c Jassi Brar       2018-01-06  2137  	return ret;
533dd11a12f698c Jassi Brar       2018-01-06  2138  }
533dd11a12f698c Jassi Brar       2018-01-06  2139  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37468 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-02-10 18:19 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-10 14:18 [RFC bpf-next] bpf: devmap: move drop error path to devmpap for XDP_REDIRECT Lorenzo Bianconi
2021-02-10 15:29 ` Jesper Dangaard Brouer
2021-02-10 16:23 ` kernel test robot
2021-02-10 18:19 ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.