diff mbox series

[net-next,07/12] mlxsw: pci: Add PCI ports array

Message ID 45fad23a5d21df36ef77b3a5c3e8f9d8e09540f9.1738665783.git.petrm@nvidia.com (mailing list archive)
State New
Delegated to: Netdev Maintainers
Headers show
Series mlxsw: Preparations for XDP support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/build_clang success Errors and warnings before: 2 this patch: 2
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 66 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2025-02-04--15-00 (tests: 886)

Commit Message

Petr Machata Feb. 4, 2025, 11:05 a.m. UTC
From: Amit Cohen <amcohen@nvidia.com>

A future patch set will add support for XDP in mlxsw driver. When a
packet is received, the Rx local port is provided by the CQE, and we should
check if an XDP program is configured for this port.

To allow quick mapping between local port to netdevice and XDP program,
add an array of mlxsw_pci_port structure. Allocate the array as part of
init, according to maximum number of ports. For now, this structure only
contains pointer to netdevice. Next patches will extend the structure.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/pci.c | 30 +++++++++++++++++++++++
 1 file changed, 30 insertions(+)
diff mbox series

Patch

diff --git a/drivers/net/ethernet/mellanox/mlxsw/pci.c b/drivers/net/ethernet/mellanox/mlxsw/pci.c
index 8af4050d5fc6..563b9c0578f8 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/pci.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/pci.c
@@ -102,6 +102,10 @@  struct mlxsw_pci_queue_type_group {
 	u8 count; /* number of queues in group */
 };
 
+struct mlxsw_pci_port {
+	struct net_device *netdev;
+};
+
 struct mlxsw_pci {
 	struct pci_dev *pdev;
 	u8 __iomem *hw_addr;
@@ -138,6 +142,7 @@  struct mlxsw_pci {
 	struct net_device *napi_dev_tx;
 	struct net_device *napi_dev_rx;
 	unsigned int max_ports;
+	struct mlxsw_pci_port *pci_ports;
 };
 
 static int mlxsw_pci_napi_devs_init(struct mlxsw_pci *mlxsw_pci)
@@ -186,6 +191,24 @@  static int mlxsw_pci_max_ports_set(struct mlxsw_pci *mlxsw_pci)
 	return 0;
 }
 
+static int mlxsw_pci_ports_init(struct mlxsw_pci *mlxsw_pci)
+{
+	struct mlxsw_pci_port *pci_ports;
+
+	pci_ports = kcalloc(mlxsw_pci->max_ports,
+			    sizeof(struct mlxsw_pci_port), GFP_KERNEL);
+	if (!pci_ports)
+		return -ENOMEM;
+
+	mlxsw_pci->pci_ports = pci_ports;
+	return 0;
+}
+
+static void mlxsw_pci_ports_fini(struct mlxsw_pci *mlxsw_pci)
+{
+	kfree(mlxsw_pci->pci_ports);
+}
+
 static char *__mlxsw_pci_queue_elem_get(struct mlxsw_pci_queue *q,
 					size_t elem_size, int elem_index)
 {
@@ -2088,6 +2111,10 @@  static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
 	if (err)
 		goto err_max_ports_set;
 
+	err = mlxsw_pci_ports_init(mlxsw_pci);
+	if (err)
+		goto err_ports_init;
+
 	err = mlxsw_pci_aqs_init(mlxsw_pci, mbox);
 	if (err)
 		goto err_aqs_init;
@@ -2105,6 +2132,8 @@  static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
 err_request_eq_irq:
 	mlxsw_pci_aqs_fini(mlxsw_pci);
 err_aqs_init:
+	mlxsw_pci_ports_fini(mlxsw_pci);
+err_ports_init:
 err_max_ports_set:
 	mlxsw_pci_napi_devs_fini(mlxsw_pci);
 err_napi_devs_init:
@@ -2135,6 +2164,7 @@  static void mlxsw_pci_fini(void *bus_priv)
 
 	free_irq(pci_irq_vector(mlxsw_pci->pdev, 0), mlxsw_pci);
 	mlxsw_pci_aqs_fini(mlxsw_pci);
+	mlxsw_pci_ports_fini(mlxsw_pci);
 	mlxsw_pci_napi_devs_fini(mlxsw_pci);
 	mlxsw_pci_fw_area_fini(mlxsw_pci);
 	mlxsw_pci_free_irq_vectors(mlxsw_pci);