All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch net-next v4 00/13] net: extend devlink port attrs with switch ID
@ 2019-04-03 12:24 Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 01/13] net: devlink: convert devlink_port_attrs bools to bits Jiri Pirko
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Extend devlink port attrs to contain switch ID and change drivers that
register devlink ports to use that.

Jiri Pirko (13):
  net: devlink: convert devlink_port_attrs bools to bits
  net: devlink: extend port attrs for switch ID
  net: devlink: introduce devlink_compat_switch_id_get() helper
  mlxsw: Pass switch ID through devlink_port_attrs_set()
  mlxsw: Remove ndo_get_port_parent_id implementation
  bnxt: move bp->switch_id initialization to PF probe
  bnxt: pass switch ID through devlink_port_attrs_set()
  bnxt: remove ndo_get_port_parent_id implementation for physical ports
  nfp: pass switch ID through devlink_port_attrs_set()
  nfp: remove ndo_get_port_parent_id implementation
  mlxsw: switch_ib: Pass valid HW id down to mlxsw_core_port_init()
  dsa: pass switch ID through devlink_port_attrs_set()
  net: devlink: add warning for ndo_get_port_parent_id set when not
    needed

 drivers/net/ethernet/broadcom/bnxt/bnxt.c     | 26 ++++++++-
 .../net/ethernet/broadcom/bnxt/bnxt_devlink.c |  3 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 25 ---------
 drivers/net/ethernet/mellanox/mlxsw/core.c    |  7 ++-
 drivers/net/ethernet/mellanox/mlxsw/core.h    |  4 +-
 drivers/net/ethernet/mellanox/mlxsw/minimal.c | 17 ++----
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 17 ++----
 .../net/ethernet/mellanox/mlxsw/switchib.c    | 22 +++++++-
 .../net/ethernet/mellanox/mlxsw/switchx2.c    | 16 +-----
 .../net/ethernet/netronome/nfp/nfp_devlink.c  |  5 +-
 .../ethernet/netronome/nfp/nfp_net_common.c   |  1 -
 .../net/ethernet/netronome/nfp/nfp_net_repr.c |  1 -
 drivers/net/ethernet/netronome/nfp/nfp_port.c | 16 ------
 include/net/devlink.h                         | 19 +++++--
 net/core/dev.c                                | 15 ++++--
 net/core/devlink.c                            | 53 +++++++++++++++++--
 net/dsa/dsa2.c                                |  4 +-
 net/dsa/slave.c                               |  7 +++
 18 files changed, 155 insertions(+), 103 deletions(-)

-- 
2.17.2


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

* [patch net-next v4 01/13] net: devlink: convert devlink_port_attrs bools to bits
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 02/13] net: devlink: extend port attrs for switch ID Jiri Pirko
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

In order to save space in the struct, convert bools to bits.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 include/net/devlink.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 31d5cec4d06b..4a1e3452a4ce 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -41,10 +41,10 @@ struct devlink {
 };
 
 struct devlink_port_attrs {
-	bool set;
+	u8 set:1,
+	   split:1;
 	enum devlink_port_flavour flavour;
 	u32 port_number; /* same value as "split group" */
-	bool split;
 	u32 split_subport_number;
 };
 
-- 
2.17.2


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

* [patch net-next v4 02/13] net: devlink: extend port attrs for switch ID
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 01/13] net: devlink: convert devlink_port_attrs bools to bits Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 03/13] net: devlink: introduce devlink_compat_switch_id_get() helper Jiri Pirko
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Extend devlink_port_attrs_set() to pass switch ID for ports which are
part of switch and store it in port attrs. For other ports, this is
NULL.

Note that this allows the driver to group devlink ports into one or more
switches according to the actual topology.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- removed bits exposing switch_id to userspace
rfc->v1:
- included bnxt bits
- rebased
---
 .../net/ethernet/broadcom/bnxt/bnxt_devlink.c    |  2 +-
 drivers/net/ethernet/mellanox/mlxsw/core.c       |  3 ++-
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c |  2 +-
 include/net/devlink.h                            |  8 ++++++--
 net/core/devlink.c                               | 16 +++++++++++++++-
 net/dsa/dsa2.c                                   |  2 +-
 6 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index ab6fd05c462b..36ec4cb45276 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -230,7 +230,7 @@ int bnxt_dl_register(struct bnxt *bp)
 	}
 
 	devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-			       bp->pf.port_id, false, 0);
+			       bp->pf.port_id, false, 0, NULL, 0);
 	rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
 	if (rc) {
 		netdev_err(bp->dev, "devlink_port_register failed");
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index e55b4aa91e3b..d01bd9d71b90 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1730,7 +1730,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
 
 	mlxsw_core_port->local_port = local_port;
 	devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-			       port_number, split, split_port_subnumber);
+			       port_number, split, split_port_subnumber,
+			       NULL, 0);
 	err = devlink_port_register(devlink, devlink_port, local_port);
 	if (err)
 		memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index 919da0d84fb4..15c4d2e0c86e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -364,7 +364,7 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
 
 	devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       eth_port.label_port, eth_port.is_split,
-			       eth_port.label_subport);
+			       eth_port.label_subport, NULL, 0);
 
 	devlink = priv_to_devlink(app->pf);
 
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 4a1e3452a4ce..0f7968761204 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -42,10 +42,12 @@ struct devlink {
 
 struct devlink_port_attrs {
 	u8 set:1,
-	   split:1;
+	   split:1,
+	   switch_port:1;
 	enum devlink_port_flavour flavour;
 	u32 port_number; /* same value as "split group" */
 	u32 split_subport_number;
+	struct netdev_phys_item_id switch_id;
 };
 
 struct devlink_port {
@@ -582,7 +584,9 @@ void devlink_port_type_clear(struct devlink_port *devlink_port);
 void devlink_port_attrs_set(struct devlink_port *devlink_port,
 			    enum devlink_port_flavour flavour,
 			    u32 port_number, bool split,
-			    u32 split_subport_number);
+			    u32 split_subport_number,
+			    const unsigned char *switch_id,
+			    unsigned char switch_id_len);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
 			u32 size, u16 ingress_pools_count,
 			u16 egress_pools_count, u16 ingress_tc_count,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index dc3a99148ee7..5b2eb186bb92 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5414,11 +5414,16 @@ EXPORT_SYMBOL_GPL(devlink_port_type_clear);
  *	@split: indicates if this is split port
  *	@split_subport_number: if the port is split, this is the number
  *	                       of subport.
+ *	@switch_id: if the port is part of switch, this is buffer with ID,
+ *	            otwerwise this is NULL
+ *	@switch_id_len: length of the switch_id buffer
  */
 void devlink_port_attrs_set(struct devlink_port *devlink_port,
 			    enum devlink_port_flavour flavour,
 			    u32 port_number, bool split,
-			    u32 split_subport_number)
+			    u32 split_subport_number,
+			    const unsigned char *switch_id,
+			    unsigned char switch_id_len)
 {
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 
@@ -5429,6 +5434,15 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
 	attrs->port_number = port_number;
 	attrs->split = split;
 	attrs->split_subport_number = split_subport_number;
+	if (switch_id) {
+		attrs->switch_port = true;
+		if (WARN_ON(switch_id_len > MAX_PHYS_ITEM_ID_LEN))
+			switch_id_len = MAX_PHYS_ITEM_ID_LEN;
+		memcpy(attrs->switch_id.id, switch_id, switch_id_len);
+		attrs->switch_id.id_len = switch_id_len;
+	} else {
+		attrs->switch_port = false;
+	}
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
 
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 0e1cce460406..4493b2ff3438 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -286,7 +286,7 @@ static int dsa_port_setup(struct dsa_port *dp)
 	 * independent from front panel port numbers.
 	 */
 	devlink_port_attrs_set(&dp->devlink_port, flavour,
-			       dp->index, false, 0);
+			       dp->index, false, 0, NULL, 0);
 	err = devlink_port_register(ds->devlink, &dp->devlink_port,
 				    dp->index);
 	if (err)
-- 
2.17.2


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

* [patch net-next v4 03/13] net: devlink: introduce devlink_compat_switch_id_get() helper
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 01/13] net: devlink: convert devlink_port_attrs bools to bits Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 02/13] net: devlink: extend port attrs for switch ID Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 04/13] mlxsw: Pass switch ID through devlink_port_attrs_set() Jiri Pirko
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Introduce devlink_compat_switch_id_get() helper which fills up switch_id
according to passed netdev pointer. Call it directly from
dev_get_port_parent_id() as a fallback when ndo_get_port_parent_id
is not defined for given netdev.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v3->v4:
- continue to devlink compat helper in case ndo returns -EOPNOTSUPP
rfc->v1:
- don't take devlink mutexes
- rebase
---
 include/net/devlink.h |  9 +++++++++
 net/core/dev.c        | 15 +++++++++++----
 net/core/devlink.c    | 19 +++++++++++++++++++
 3 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 0f7968761204..70c7d1ac8344 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -743,6 +743,8 @@ void devlink_compat_running_version(struct net_device *dev,
 int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
 int devlink_compat_phys_port_name_get(struct net_device *dev,
 				      char *name, size_t len);
+int devlink_compat_switch_id_get(struct net_device *dev,
+				 struct netdev_phys_item_id *ppid);
 
 #else
 
@@ -764,6 +766,13 @@ devlink_compat_phys_port_name_get(struct net_device *dev,
 	return -EOPNOTSUPP;
 }
 
+static inline int
+devlink_compat_switch_id_get(struct net_device *dev,
+			     struct netdev_phys_item_id *ppid)
+{
+	return -EOPNOTSUPP;
+}
+
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
diff --git a/net/core/dev.c b/net/core/dev.c
index d5b1315218d3..26414ecc6562 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7901,13 +7901,20 @@ int dev_get_port_parent_id(struct net_device *dev,
 	struct netdev_phys_item_id first = { };
 	struct net_device *lower_dev;
 	struct list_head *iter;
-	int err = -EOPNOTSUPP;
+	int err;
+
+	if (ops->ndo_get_port_parent_id) {
+		err = ops->ndo_get_port_parent_id(dev, ppid);
+		if (err != -EOPNOTSUPP)
+			return err;
+	}
 
-	if (ops->ndo_get_port_parent_id)
-		return ops->ndo_get_port_parent_id(dev, ppid);
+	err = devlink_compat_switch_id_get(dev, ppid);
+	if (!err || err != -EOPNOTSUPP)
+		return err;
 
 	if (!recurse)
-		return err;
+		return -EOPNOTSUPP;
 
 	netdev_for_each_lower_dev(dev, lower_dev, iter) {
 		err = dev_get_port_parent_id(lower_dev, ppid, recurse);
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 5b2eb186bb92..d9fbf94ea2a3 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6508,6 +6508,25 @@ int devlink_compat_phys_port_name_get(struct net_device *dev,
 	return __devlink_port_phys_port_name_get(devlink_port, name, len);
 }
 
+int devlink_compat_switch_id_get(struct net_device *dev,
+				 struct netdev_phys_item_id *ppid)
+{
+	struct devlink_port *devlink_port;
+
+	/* RTNL mutex is held here which ensures that devlink_port
+	 * instance cannot disappear in the middle. No need to take
+	 * any devlink lock as only permanent values are accessed.
+	 */
+	ASSERT_RTNL();
+	devlink_port = netdev_to_devlink_port(dev);
+	if (!devlink_port || !devlink_port->attrs.switch_port)
+		return -EOPNOTSUPP;
+
+	memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));
+
+	return 0;
+}
+
 static int __init devlink_init(void)
 {
 	return genl_register_family(&devlink_nl_family);
-- 
2.17.2


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

* [patch net-next v4 04/13] mlxsw: Pass switch ID through devlink_port_attrs_set()
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (2 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 03/13] net: devlink: introduce devlink_compat_switch_id_get() helper Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 05/13] mlxsw: Remove ndo_get_port_parent_id implementation Jiri Pirko
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Pass the switch ID down the to devlink through devlink_port_attrs_set()
so it can be used by devlink_compat_switch_id_get().

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c     | 6 ++++--
 drivers/net/ethernet/mellanox/mlxsw/core.h     | 4 +++-
 drivers/net/ethernet/mellanox/mlxsw/minimal.c  | 4 +++-
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 4 +++-
 drivers/net/ethernet/mellanox/mlxsw/switchib.c | 2 +-
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c | 3 ++-
 6 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index d01bd9d71b90..027e393c7cb2 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1720,7 +1720,9 @@ EXPORT_SYMBOL(mlxsw_core_res_get);
 
 int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
 			 u32 port_number, bool split,
-			 u32 split_port_subnumber)
+			 u32 split_port_subnumber,
+			 const unsigned char *switch_id,
+			 unsigned char switch_id_len)
 {
 	struct devlink *devlink = priv_to_devlink(mlxsw_core);
 	struct mlxsw_core_port *mlxsw_core_port =
@@ -1731,7 +1733,7 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
 	mlxsw_core_port->local_port = local_port;
 	devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       port_number, split, split_port_subnumber,
-			       NULL, 0);
+			       switch_id, switch_id_len);
 	err = devlink_port_register(devlink, devlink_port, local_port);
 	if (err)
 		memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
index e8c424da534c..d51dfc3560b6 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -166,7 +166,9 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
 void *mlxsw_core_port_driver_priv(struct mlxsw_core_port *mlxsw_core_port);
 int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
 			 u32 port_number, bool split,
-			 u32 split_port_subnumber);
+			 u32 split_port_subnumber,
+			 const unsigned char *switch_id,
+			 unsigned char switch_id_len);
 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
 			     void *port_driver_priv, struct net_device *dev);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/minimal.c b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
index ec5f5a66b607..bd96211602a4 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/minimal.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
@@ -151,7 +151,9 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module)
 	int err;
 
 	err = mlxsw_core_port_init(mlxsw_m->core, local_port,
-				   module + 1, false, 0);
+				   module + 1, false, 0,
+				   mlxsw_m->base_mac,
+				   sizeof(mlxsw_m->base_mac));
 	if (err) {
 		dev_err(mlxsw_m->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 8b9a6870dbc2..2dbcc8e5e130 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -3392,7 +3392,9 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
 	int err;
 
 	err = mlxsw_core_port_init(mlxsw_sp->core, local_port,
-				   module + 1, split, lane / width);
+				   module + 1, split, lane / width,
+				   mlxsw_sp->base_mac,
+				   sizeof(mlxsw_sp->base_mac));
 	if (err) {
 		dev_err(mlxsw_sp->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchib.c b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
index e1e7e0dd808d..b22caa154310 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchib.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
@@ -268,7 +268,7 @@ static int mlxsw_sib_port_create(struct mlxsw_sib *mlxsw_sib, u8 local_port,
 	int err;
 
 	err = mlxsw_core_port_init(mlxsw_sib->core, local_port,
-				   module + 1, false, 0);
+				   module + 1, false, 0, NULL, 0);
 	if (err) {
 		dev_err(mlxsw_sib->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 5312dc1f339b..5397616fcda8 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -1128,7 +1128,8 @@ static int mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port,
 	int err;
 
 	err = mlxsw_core_port_init(mlxsw_sx->core, local_port,
-				   module + 1, false, 0);
+				   module + 1, false, 0,
+				   mlxsw_sx->hw_id, sizeof(mlxsw_sx->hw_id));
 	if (err) {
 		dev_err(mlxsw_sx->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
-- 
2.17.2


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

* [patch net-next v4 05/13] mlxsw: Remove ndo_get_port_parent_id implementation
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (3 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 04/13] mlxsw: Pass switch ID through devlink_port_attrs_set() Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 06/13] bnxt: move bp->switch_id initialization to PF probe Jiri Pirko
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Remove implementation of get_port_parent_id ndo and rely on core calling
into devlink for the information directly.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/minimal.c  | 13 -------------
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 13 -------------
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c | 13 -------------
 3 files changed, 39 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/minimal.c b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
index bd96211602a4..cf2114273b72 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/minimal.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
@@ -51,18 +51,6 @@ static int mlxsw_m_port_dummy_open_stop(struct net_device *dev)
 	return 0;
 }
 
-static int mlxsw_m_port_get_port_parent_id(struct net_device *dev,
-					   struct netdev_phys_item_id *ppid)
-{
-	struct mlxsw_m_port *mlxsw_m_port = netdev_priv(dev);
-	struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m;
-
-	ppid->id_len = sizeof(mlxsw_m->base_mac);
-	memcpy(&ppid->id, &mlxsw_m->base_mac, ppid->id_len);
-
-	return 0;
-}
-
 static struct devlink_port *
 mlxsw_m_port_get_devlink_port(struct net_device *dev)
 {
@@ -76,7 +64,6 @@ mlxsw_m_port_get_devlink_port(struct net_device *dev)
 static const struct net_device_ops mlxsw_m_port_netdev_ops = {
 	.ndo_open		= mlxsw_m_port_dummy_open_stop,
 	.ndo_stop		= mlxsw_m_port_dummy_open_stop,
-	.ndo_get_port_parent_id	= mlxsw_m_port_get_port_parent_id,
 	.ndo_get_devlink_port	= mlxsw_m_port_get_devlink_port,
 };
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 2dbcc8e5e130..fc325f1213fb 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -1704,18 +1704,6 @@ static int mlxsw_sp_set_features(struct net_device *dev,
 				       mlxsw_sp_feature_hw_tc);
 }
 
-static int mlxsw_sp_port_get_port_parent_id(struct net_device *dev,
-					    struct netdev_phys_item_id *ppid)
-{
-	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
-	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
-
-	ppid->id_len = sizeof(mlxsw_sp->base_mac);
-	memcpy(&ppid->id, &mlxsw_sp->base_mac, ppid->id_len);
-
-	return 0;
-}
-
 static struct devlink_port *
 mlxsw_sp_port_get_devlink_port(struct net_device *dev)
 {
@@ -1740,7 +1728,6 @@ static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
 	.ndo_vlan_rx_add_vid	= mlxsw_sp_port_add_vid,
 	.ndo_vlan_rx_kill_vid	= mlxsw_sp_port_kill_vid,
 	.ndo_set_features	= mlxsw_sp_set_features,
-	.ndo_get_port_parent_id	= mlxsw_sp_port_get_port_parent_id,
 	.ndo_get_devlink_port	= mlxsw_sp_port_get_devlink_port,
 };
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 5397616fcda8..fc4f19167262 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -379,18 +379,6 @@ mlxsw_sx_port_get_stats64(struct net_device *dev,
 	stats->tx_dropped	= tx_dropped;
 }
 
-static int mlxsw_sx_port_get_port_parent_id(struct net_device *dev,
-					    struct netdev_phys_item_id *ppid)
-{
-	struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
-	struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
-
-	ppid->id_len = sizeof(mlxsw_sx->hw_id);
-	memcpy(&ppid->id, &mlxsw_sx->hw_id, ppid->id_len);
-
-	return 0;
-}
-
 static struct devlink_port *
 mlxsw_sx_port_get_devlink_port(struct net_device *dev)
 {
@@ -407,7 +395,6 @@ static const struct net_device_ops mlxsw_sx_port_netdev_ops = {
 	.ndo_start_xmit		= mlxsw_sx_port_xmit,
 	.ndo_change_mtu		= mlxsw_sx_port_change_mtu,
 	.ndo_get_stats64	= mlxsw_sx_port_get_stats64,
-	.ndo_get_port_parent_id	= mlxsw_sx_port_get_port_parent_id,
 	.ndo_get_devlink_port	= mlxsw_sx_port_get_devlink_port,
 };
 
-- 
2.17.2


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

* [patch net-next v4 06/13] bnxt: move bp->switch_id initialization to PF probe
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (4 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 05/13] mlxsw: Remove ndo_get_port_parent_id implementation Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 07/13] bnxt: pass switch ID through devlink_port_attrs_set() Jiri Pirko
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Currently the switch_id is being only initialized when switching eswitch
mode from "legacy" to "switchdev". However, nothing prevents the id to
be initialized from the very beginning. Physical ports can show it even
in "legacy" mode.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v3->v4:
- new patch
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c     | 25 +++++++++++++++++++
 drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 25 -------------------
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index d22691403d28..6131b9963709 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -10429,6 +10429,26 @@ static int bnxt_init_mac_addr(struct bnxt *bp)
 	return rc;
 }
 
+static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
+{
+	struct pci_dev *pdev = bp->pdev;
+	int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN);
+	u32 dw;
+
+	if (!pos) {
+		netdev_info(bp->dev, "Unable do read adapter's DSN");
+		return -EOPNOTSUPP;
+	}
+
+	/* DSN (two dw) is at an offset of 4 from the cap pos */
+	pos += 4;
+	pci_read_config_dword(pdev, pos, &dw);
+	put_unaligned_le32(dw, &dsn[0]);
+	pci_read_config_dword(pdev, pos + 4, &dw);
+	put_unaligned_le32(dw, &dsn[4]);
+	return 0;
+}
+
 static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
 	static int version_printed;
@@ -10569,6 +10589,11 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 		goto init_err_pci_clean;
 	}
 
+	/* Read the adapter's DSN to use as the eswitch switch_id */
+	rc = bnxt_pcie_dsn_get(bp, bp->switch_id);
+	if (rc)
+		goto init_err_pci_clean;
+
 	bnxt_hwrm_func_qcfg(bp);
 	bnxt_hwrm_vnic_qcaps(bp);
 	bnxt_hwrm_port_led_qcaps(bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
index 2bdd2da9aac7..f760921389a3 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
@@ -406,26 +406,6 @@ static void bnxt_vf_rep_netdev_init(struct bnxt *bp, struct bnxt_vf_rep *vf_rep,
 	dev->min_mtu = ETH_ZLEN;
 }
 
-static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
-{
-	struct pci_dev *pdev = bp->pdev;
-	int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN);
-	u32 dw;
-
-	if (!pos) {
-		netdev_info(bp->dev, "Unable do read adapter's DSN");
-		return -EOPNOTSUPP;
-	}
-
-	/* DSN (two dw) is at an offset of 4 from the cap pos */
-	pos += 4;
-	pci_read_config_dword(pdev, pos, &dw);
-	put_unaligned_le32(dw, &dsn[0]);
-	pci_read_config_dword(pdev, pos + 4, &dw);
-	put_unaligned_le32(dw, &dsn[4]);
-	return 0;
-}
-
 static int bnxt_vf_reps_create(struct bnxt *bp)
 {
 	u16 *cfa_code_map = NULL, num_vfs = pci_num_vf(bp->pdev);
@@ -490,11 +470,6 @@ static int bnxt_vf_reps_create(struct bnxt *bp)
 		}
 	}
 
-	/* Read the adapter's DSN to use as the eswitch switch_id */
-	rc = bnxt_pcie_dsn_get(bp, bp->switch_id);
-	if (rc)
-		goto err;
-
 	/* publish cfa_code_map only after all VF-reps have been initialized */
 	bp->cfa_code_map = cfa_code_map;
 	bp->eswitch_mode = DEVLINK_ESWITCH_MODE_SWITCHDEV;
-- 
2.17.2


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

* [patch net-next v4 07/13] bnxt: pass switch ID through devlink_port_attrs_set()
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (5 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 06/13] bnxt: move bp->switch_id initialization to PF probe Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 08/13] bnxt: remove ndo_get_port_parent_id implementation for physical ports Jiri Pirko
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Pass the switch ID down the to devlink through devlink_port_attrs_set()
so it can be used by devlink_compat_switch_id_get().

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
rfc->v1:
- new patch
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index 36ec4cb45276..549c90d3e465 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -230,7 +230,8 @@ int bnxt_dl_register(struct bnxt *bp)
 	}
 
 	devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-			       bp->pf.port_id, false, 0, NULL, 0);
+			       bp->pf.port_id, false, 0,
+			       bp->switch_id, sizeof(bp->switch_id));
 	rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
 	if (rc) {
 		netdev_err(bp->dev, "devlink_port_register failed");
-- 
2.17.2


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

* [patch net-next v4 08/13] bnxt: remove ndo_get_port_parent_id implementation for physical ports
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (6 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 07/13] bnxt: pass switch ID through devlink_port_attrs_set() Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 09/13] nfp: pass switch ID through devlink_port_attrs_set() Jiri Pirko
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Remove implementation of get_port_parent_id ndo and rely on core calling
into devlink for the information directly.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 6131b9963709..4feac114b779 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -10104,7 +10104,6 @@ static const struct net_device_ops bnxt_netdev_ops = {
 	.ndo_bpf		= bnxt_xdp,
 	.ndo_bridge_getlink	= bnxt_bridge_getlink,
 	.ndo_bridge_setlink	= bnxt_bridge_setlink,
-	.ndo_get_port_parent_id	= bnxt_get_port_parent_id,
 	.ndo_get_devlink_port	= bnxt_get_devlink_port,
 };
 
-- 
2.17.2


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

* [patch net-next v4 09/13] nfp: pass switch ID through devlink_port_attrs_set()
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (7 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 08/13] bnxt: remove ndo_get_port_parent_id implementation for physical ports Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 10/13] nfp: remove ndo_get_port_parent_id implementation Jiri Pirko
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Pass the switch ID down the to devlink through devlink_port_attrs_set()
so it can be used by devlink_compat_switch_id_get().

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index 15c4d2e0c86e..8e7591241e7c 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -354,6 +354,8 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
 {
 	struct nfp_eth_table_port eth_port;
 	struct devlink *devlink;
+	const u8 *serial;
+	int serial_len;
 	int ret;
 
 	rtnl_lock();
@@ -362,9 +364,10 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
 	if (ret)
 		return ret;
 
+	serial_len = nfp_cpp_serial(port->app->cpp, &serial);
 	devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       eth_port.label_port, eth_port.is_split,
-			       eth_port.label_subport, NULL, 0);
+			       eth_port.label_subport, serial, serial_len);
 
 	devlink = priv_to_devlink(app->pf);
 
-- 
2.17.2


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

* [patch net-next v4 10/13] nfp: remove ndo_get_port_parent_id implementation
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (8 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 09/13] nfp: pass switch ID through devlink_port_attrs_set() Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 11/13] mlxsw: switch_ib: Pass valid HW id down to mlxsw_core_port_init() Jiri Pirko
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Remove implementation of get_port_parent_id ndo and rely on core calling
into devlink for the information directly.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 .../net/ethernet/netronome/nfp/nfp_net_common.c  |  1 -
 .../net/ethernet/netronome/nfp/nfp_net_repr.c    |  1 -
 drivers/net/ethernet/netronome/nfp/nfp_port.c    | 16 ----------------
 3 files changed, 18 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 961cd5e7bf2b..bde9695b9f8a 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -3533,7 +3533,6 @@ const struct net_device_ops nfp_net_netdev_ops = {
 	.ndo_udp_tunnel_add	= nfp_net_add_vxlan_port,
 	.ndo_udp_tunnel_del	= nfp_net_del_vxlan_port,
 	.ndo_bpf		= nfp_net_xdp,
-	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
 	.ndo_get_devlink_port	= nfp_devlink_get_devlink_port,
 };
 
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
index bf621674f583..c3ad083d36c6 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
@@ -272,7 +272,6 @@ const struct net_device_ops nfp_repr_netdev_ops = {
 	.ndo_fix_features	= nfp_repr_fix_features,
 	.ndo_set_features	= nfp_port_set_features,
 	.ndo_set_mac_address    = eth_mac_addr,
-	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
 	.ndo_get_devlink_port	= nfp_devlink_get_devlink_port,
 };
 
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.c b/drivers/net/ethernet/netronome/nfp/nfp_port.c
index 93c5bfc0510b..fcd16877e6e0 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_port.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.c
@@ -30,22 +30,6 @@ struct nfp_port *nfp_port_from_netdev(struct net_device *netdev)
 	return NULL;
 }
 
-int nfp_port_get_port_parent_id(struct net_device *netdev,
-				struct netdev_phys_item_id *ppid)
-{
-	struct nfp_port *port;
-	const u8 *serial;
-
-	port = nfp_port_from_netdev(netdev);
-	if (!port)
-		return -EOPNOTSUPP;
-
-	ppid->id_len = nfp_cpp_serial(port->app->cpp, &serial);
-	memcpy(&ppid->id, serial, ppid->id_len);
-
-	return 0;
-}
-
 int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
 		      void *type_data)
 {
-- 
2.17.2


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

* [patch net-next v4 11/13] mlxsw: switch_ib: Pass valid HW id down to mlxsw_core_port_init()
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (9 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 10/13] nfp: remove ndo_get_port_parent_id implementation Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 12/13] dsa: pass switch ID through devlink_port_attrs_set() Jiri Pirko
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Obtain HW id and pass it down to mlxsw_core_port_init() as it would be
used as switch_id in devlink and exposed to user.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 .../net/ethernet/mellanox/mlxsw/switchib.c    | 22 ++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchib.c b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
index b22caa154310..0d9356b3f65d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchib.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
@@ -30,6 +30,7 @@ struct mlxsw_sib {
 	struct mlxsw_sib_port **ports;
 	struct mlxsw_core *core;
 	const struct mlxsw_bus_info *bus_info;
+	u8 hw_id[ETH_ALEN];
 };
 
 struct mlxsw_sib_port {
@@ -102,6 +103,18 @@ mlxsw_sib_tx_v1_hdr_construct(struct sk_buff *skb,
 	mlxsw_tx_v1_hdr_type_set(txhdr, MLXSW_TXHDR_TYPE_CONTROL);
 }
 
+static int mlxsw_sib_hw_id_get(struct mlxsw_sib *mlxsw_sib)
+{
+	char spad_pl[MLXSW_REG_SPAD_LEN] = {0};
+	int err;
+
+	err = mlxsw_reg_query(mlxsw_sib->core, MLXSW_REG(spad), spad_pl);
+	if (err)
+		return err;
+	mlxsw_reg_spad_base_mac_memcpy_from(spad_pl, mlxsw_sib->hw_id);
+	return 0;
+}
+
 static int
 mlxsw_sib_port_admin_status_set(struct mlxsw_sib_port *mlxsw_sib_port,
 				bool is_up)
@@ -268,7 +281,8 @@ static int mlxsw_sib_port_create(struct mlxsw_sib *mlxsw_sib, u8 local_port,
 	int err;
 
 	err = mlxsw_core_port_init(mlxsw_sib->core, local_port,
-				   module + 1, false, 0, NULL, 0);
+				   module + 1, false, 0,
+				   mlxsw_sib->hw_id, sizeof(mlxsw_sib->hw_id));
 	if (err) {
 		dev_err(mlxsw_sib->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
@@ -440,6 +454,12 @@ static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core,
 	mlxsw_sib->core = mlxsw_core;
 	mlxsw_sib->bus_info = mlxsw_bus_info;
 
+	err = mlxsw_sib_hw_id_get(mlxsw_sib);
+	if (err) {
+		dev_err(mlxsw_sib->bus_info->dev, "Failed to get switch HW ID\n");
+		return err;
+	}
+
 	err = mlxsw_sib_ports_create(mlxsw_sib);
 	if (err) {
 		dev_err(mlxsw_sib->bus_info->dev, "Failed to create ports\n");
-- 
2.17.2


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

* [patch net-next v4 12/13] dsa: pass switch ID through devlink_port_attrs_set()
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (10 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 11/13] mlxsw: switch_ib: Pass valid HW id down to mlxsw_core_port_init() Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-03 12:24 ` [patch net-next v4 13/13] net: devlink: add warning for ndo_get_port_parent_id set when not needed Jiri Pirko
  2019-04-05  0:42 ` [patch net-next v4 00/13] net: extend devlink port attrs with switch ID David Miller
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Pass the switch ID down the to devlink through devlink_port_attrs_set()
so it can be used by devlink_compat_switch_id_get(). Leave
ndo_get_port_parent_id implementation only for legacy.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v2->v3:
- fix parent id ndo compilation issue
---
 net/dsa/dsa2.c  | 4 +++-
 net/dsa/slave.c | 7 +++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 4493b2ff3438..d122f1bcdab2 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -260,6 +260,7 @@ static int dsa_port_setup(struct dsa_port *dp)
 {
 	enum devlink_port_flavour flavour;
 	struct dsa_switch *ds = dp->ds;
+	struct dsa_switch_tree *dst = ds->dst;
 	int err;
 
 	if (dp->type == DSA_PORT_TYPE_UNUSED)
@@ -286,7 +287,8 @@ static int dsa_port_setup(struct dsa_port *dp)
 	 * independent from front panel port numbers.
 	 */
 	devlink_port_attrs_set(&dp->devlink_port, flavour,
-			       dp->index, false, 0, NULL, 0);
+			       dp->index, false, 0,
+			       (const char *) &dst->index, sizeof(dst->index));
 	err = devlink_port_register(ds->devlink, &dp->devlink_port,
 				    dp->index);
 	if (err)
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index f83525909c57..ce26dddc8270 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -379,6 +379,13 @@ static int dsa_slave_get_port_parent_id(struct net_device *dev,
 	struct dsa_switch *ds = dp->ds;
 	struct dsa_switch_tree *dst = ds->dst;
 
+	/* For non-legacy ports, devlink is used and it takes
+	 * care of the name generation. This ndo implementation
+	 * should be removed with legacy support.
+	 */
+	if (dp->ds->devlink)
+		return -EOPNOTSUPP;
+
 	ppid->id_len = sizeof(dst->index);
 	memcpy(&ppid->id, &dst->index, ppid->id_len);
 
-- 
2.17.2


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

* [patch net-next v4 13/13] net: devlink: add warning for ndo_get_port_parent_id set when not needed
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (11 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 12/13] dsa: pass switch ID through devlink_port_attrs_set() Jiri Pirko
@ 2019-04-03 12:24 ` Jiri Pirko
  2019-04-05  0:42 ` [patch net-next v4 00/13] net: extend devlink port attrs with switch ID David Miller
  13 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2019-04-03 12:24 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@mellanox.com>

Currently if the driver registers devlink port instance, he should set
the devlink port attributes as well. Then the devlink core is able to
obtain switch id itself, no need for driver to implement the ndo.
Once all drivers will implement devlink port registration, this ndo
should be removed. This warning guides new drivers to do things as
they should be done.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v3->v4:
- fix warning to be done in case ndo is defined and returns -EOPNOTSUPP
rfc->v1:
- new patch
---
 net/core/devlink.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index d9fbf94ea2a3..b2715a187a11 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5358,24 +5358,38 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port,
 void devlink_port_type_eth_set(struct devlink_port *devlink_port,
 			       struct net_device *netdev)
 {
+	const struct net_device_ops *ops = netdev->netdev_ops;
+
 	/* If driver registers devlink port, it should set devlink port
 	 * attributes accordingly so the compat functions are called
 	 * and the original ops are not used.
 	 */
-	if (netdev->netdev_ops->ndo_get_phys_port_name) {
+	if (ops->ndo_get_phys_port_name) {
 		/* Some drivers use the same set of ndos for netdevs
 		 * that have devlink_port registered and also for
 		 * those who don't. Make sure that ndo_get_phys_port_name
 		 * returns -EOPNOTSUPP here in case it is defined.
 		 * Warn if not.
 		 */
-		const struct net_device_ops *ops = netdev->netdev_ops;
 		char name[IFNAMSIZ];
 		int err;
 
 		err = ops->ndo_get_phys_port_name(netdev, name, sizeof(name));
 		WARN_ON(err != -EOPNOTSUPP);
 	}
+	if (ops->ndo_get_port_parent_id) {
+		/* Some drivers use the same set of ndos for netdevs
+		 * that have devlink_port registered and also for
+		 * those who don't. Make sure that ndo_get_port_parent_id
+		 * returns -EOPNOTSUPP here in case it is defined.
+		 * Warn if not.
+		 */
+		struct netdev_phys_item_id ppid;
+		int err;
+
+		err = ops->ndo_get_port_parent_id(netdev, &ppid);
+		WARN_ON(err != -EOPNOTSUPP);
+	}
 	__devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, netdev);
 }
 EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
-- 
2.17.2


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

* Re: [patch net-next v4 00/13] net: extend devlink port attrs with switch ID
  2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
                   ` (12 preceding siblings ...)
  2019-04-03 12:24 ` [patch net-next v4 13/13] net: devlink: add warning for ndo_get_port_parent_id set when not needed Jiri Pirko
@ 2019-04-05  0:42 ` David Miller
  13 siblings, 0 replies; 15+ messages in thread
From: David Miller @ 2019-04-05  0:42 UTC (permalink / raw)
  To: jiri
  Cc: netdev, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew,
	vivien.didelot, michael.chan

From: Jiri Pirko <jiri@resnulli.us>
Date: Wed,  3 Apr 2019 14:24:14 +0200

> From: Jiri Pirko <jiri@mellanox.com>
> 
> Extend devlink port attrs to contain switch ID and change drivers that
> register devlink ports to use that.

Series applied, thanks Jiri.

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

end of thread, other threads:[~2019-04-05  0:42 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-03 12:24 [patch net-next v4 00/13] net: extend devlink port attrs with switch ID Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 01/13] net: devlink: convert devlink_port_attrs bools to bits Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 02/13] net: devlink: extend port attrs for switch ID Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 03/13] net: devlink: introduce devlink_compat_switch_id_get() helper Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 04/13] mlxsw: Pass switch ID through devlink_port_attrs_set() Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 05/13] mlxsw: Remove ndo_get_port_parent_id implementation Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 06/13] bnxt: move bp->switch_id initialization to PF probe Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 07/13] bnxt: pass switch ID through devlink_port_attrs_set() Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 08/13] bnxt: remove ndo_get_port_parent_id implementation for physical ports Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 09/13] nfp: pass switch ID through devlink_port_attrs_set() Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 10/13] nfp: remove ndo_get_port_parent_id implementation Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 11/13] mlxsw: switch_ib: Pass valid HW id down to mlxsw_core_port_init() Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 12/13] dsa: pass switch ID through devlink_port_attrs_set() Jiri Pirko
2019-04-03 12:24 ` [patch net-next v4 13/13] net: devlink: add warning for ndo_get_port_parent_id set when not needed Jiri Pirko
2019-04-05  0:42 ` [patch net-next v4 00/13] net: extend devlink port attrs with switch ID David Miller

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.