From: Danielle Ratson <[email protected]>

Add a new devlink port attribute that indicates the port's width.
Drivers are expected to set it via devlink_port_attrs_set(), before
registering the port.

The attribute is not passed to user space in case the width is invalid
(0).

Signed-off-by: Danielle Ratson <[email protected]>
Reviewed-by: Jiri Pirko <[email protected]>
Signed-off-by: Ido Schimmel <[email protected]>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c    | 2 +-
 drivers/net/ethernet/intel/ice/ice_devlink.c         | 2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c | 4 ++--
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c     | 2 +-
 drivers/net/ethernet/mellanox/mlxsw/core.c           | 2 +-
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c     | 2 +-
 drivers/net/ethernet/pensando/ionic/ionic_devlink.c  | 2 +-
 drivers/net/netdevsim/dev.c                          | 2 +-
 include/net/devlink.h                                | 2 ++
 include/uapi/linux/devlink.h                         | 2 ++
 net/core/devlink.c                                   | 7 +++++++
 net/dsa/dsa2.c                                       | 6 +++---
 12 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index a812beb46325..25d577433dbf 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -714,7 +714,7 @@ int bnxt_dl_register(struct bnxt *bp)
                return 0;
 
        devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              bp->pf.port_id, false, 0, bp->dsn,
+                              bp->pf.port_id, false, 0, 0, bp->dsn,
                               sizeof(bp->dsn));
        rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
        if (rc) {
diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c 
b/drivers/net/ethernet/intel/ice/ice_devlink.c
index c6833944b90a..a46ebeb249b8 100644
--- a/drivers/net/ethernet/intel/ice/ice_devlink.c
+++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
@@ -297,7 +297,7 @@ int ice_devlink_create_port(struct ice_pf *pf)
        }
 
        devlink_port_attrs_set(&pf->devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              pf->hw.pf_id, false, 0, NULL, 0);
+                              pf->hw.pf_id, false, 0, 0, NULL, 0);
        err = devlink_port_register(devlink, &pf->devlink_port, pf->hw.pf_id);
        if (err) {
                dev_err(dev, "devlink_port_register failed: %d\n", err);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c
index f8b2de4b04be..365f2df6d851 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c
@@ -11,12 +11,12 @@ int mlx5e_devlink_port_register(struct mlx5e_priv *priv)
                devlink_port_attrs_set(&priv->dl_port,
                                       DEVLINK_PORT_FLAVOUR_PHYSICAL,
                                       PCI_FUNC(priv->mdev->pdev->devfn),
-                                      false, 0,
+                                      false, 0, 0,
                                       NULL, 0);
        else
                devlink_port_attrs_set(&priv->dl_port,
                                       DEVLINK_PORT_FLAVOUR_VIRTUAL,
-                                      0, false, 0, NULL, 0);
+                                      0, false, 0, 0, NULL, 0);
 
        return devlink_port_register(devlink, &priv->dl_port, 1);
 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 52351c105627..cf54c88a90d1 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -2050,7 +2050,7 @@ static int register_devlink_port(struct mlx5_core_dev 
*dev,
        if (rep->vport == MLX5_VPORT_UPLINK)
                devlink_port_attrs_set(&rpriv->dl_port,
                                       DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                                      pfnum, false, 0,
+                                      pfnum, false, 0, 0,
                                       &ppid.id[0], ppid.id_len);
        else if (rep->vport == MLX5_VPORT_PF)
                devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c 
b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 8f1ef90c7f5a..df011c1d0712 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -2134,7 +2134,7 @@ static 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, flavour, port_number,
-                              split, split_port_subnumber,
+                              split, split_port_subnumber, width,
                               switch_id, switch_id_len);
        err = devlink_port_register(devlink, devlink_port, local_port);
        if (err)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c 
b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index 07dbf4d72227..65ecd0bdc8be 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -368,7 +368,7 @@ int nfp_devlink_port_register(struct nfp_app *app, struct 
nfp_port *port)
        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, serial, serial_len);
+                              eth_port.label_subport, 0, serial, serial_len);
 
        devlink = priv_to_devlink(app->pf);
 
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c 
b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
index 273c889faaad..a21a10307ecc 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
@@ -82,7 +82,7 @@ int ionic_devlink_register(struct ionic *ionic)
                return 0;
 
        devlink_port_attrs_set(&ionic->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              0, false, 0, NULL, 0);
+                              0, false, 0, 0, NULL, 0);
        err = devlink_port_register(dl, &ionic->dl_port, 0);
        if (err)
                dev_err(ionic->dev, "devlink_port_register failed: %d\n", err);
diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index 68668a22b9dd..75549640d113 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -893,7 +893,7 @@ static int __nsim_dev_port_add(struct nsim_dev *nsim_dev,
 
        devlink_port = &nsim_dev_port->devlink_port;
        devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              port_index + 1, 0, 0,
+                              port_index + 1, 0, 0, 0,
                               nsim_dev->switch_id.id,
                               nsim_dev->switch_id.id_len);
        err = devlink_port_register(priv_to_devlink(nsim_dev), devlink_port,
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 8ffc1b5cd89b..de374d544671 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -68,6 +68,7 @@ struct devlink_port_attrs {
        u8 set:1,
           split:1,
           switch_port:1;
+       u32 width;
        enum devlink_port_flavour flavour;
        struct netdev_phys_item_id switch_id;
        union {
@@ -972,6 +973,7 @@ 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 width,
                            const unsigned char *switch_id,
                            unsigned char switch_id_len);
 void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index 1ae90e06c06d..69e914e000c4 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -442,6 +442,8 @@ enum devlink_attr {
        DEVLINK_ATTR_TRAP_POLICER_RATE,                 /* u64 */
        DEVLINK_ATTR_TRAP_POLICER_BURST,                /* u64 */
 
+       DEVLINK_ATTR_PORT_WIDTH,                /* u32 */
+
        /* add new attributes above here, update the policy in devlink.c */
 
        __DEVLINK_ATTR_MAX,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 7b76e5fffc10..9887fba60a7a 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -526,6 +526,10 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
 
        if (!attrs->set)
                return 0;
+       if (attrs->width) {
+               if (nla_put_u32(msg, DEVLINK_ATTR_PORT_WIDTH, attrs->width))
+                       return -EMSGSIZE;
+       }
        if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour))
                return -EMSGSIZE;
        switch (devlink_port->attrs.flavour) {
@@ -7408,6 +7412,7 @@ static int __devlink_port_attrs_set(struct devlink_port 
*devlink_port,
  *     @split: indicates if this is split port
  *     @split_subport_number: if the port is split, this is the number
  *                            of subport.
+ *     @width: width of the port. 0 value is not passed to netlink.
  *     @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
@@ -7416,6 +7421,7 @@ 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 width,
                            const unsigned char *switch_id,
                            unsigned char switch_id_len)
 {
@@ -7427,6 +7433,7 @@ void devlink_port_attrs_set(struct devlink_port 
*devlink_port,
        if (ret)
                return;
        attrs->split = split;
+       attrs->width = width;
        attrs->phys.port_number = port_number;
        attrs->phys.split_subport_number = split_subport_number;
 }
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 076908fdd29b..5d9322cb5bf3 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -275,7 +275,7 @@ static int dsa_port_setup(struct dsa_port *dp)
        case DSA_PORT_TYPE_CPU:
                memset(dlp, 0, sizeof(*dlp));
                devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_CPU,
-                                      dp->index, false, 0, id, len);
+                                      dp->index, false, 0, 0, id, len);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;
@@ -295,7 +295,7 @@ static int dsa_port_setup(struct dsa_port *dp)
        case DSA_PORT_TYPE_DSA:
                memset(dlp, 0, sizeof(*dlp));
                devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_DSA,
-                                      dp->index, false, 0, id, len);
+                                      dp->index, false, 0, 0, id, len);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;
@@ -315,7 +315,7 @@ static int dsa_port_setup(struct dsa_port *dp)
        case DSA_PORT_TYPE_USER:
                memset(dlp, 0, sizeof(*dlp));
                devlink_port_attrs_set(dlp, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                                      dp->index, false, 0, id, len);
+                                      dp->index, false, 0, 0, id, len);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;
-- 
2.26.2

Reply via email to