* [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.