int bnxt_dl_register(struct bnxt *bp)
 {
+       struct devlink_port_attrs attrs = {};
        struct devlink *dl;
        int rc;
 
        if (!BNXT_PF(bp))
                return 0;
 
-       devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              bp->pf.port_id, false, 0, bp->dsn,
-                              sizeof(bp->dsn));
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       attrs.phys.port_number = bp->pf.port_id;
+       memcpy(attrs.switch_id.id, bp->dsn, sizeof(bp->dsn));
+       attrs.switch_id.id_len = sizeof(bp->dsn);
+       devlink_port_attrs_set(&bp->dl_port, &attrs);
        rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
        if (rc) {
                netdev_err(bp->dev, "devlink_port_register failed\n");
 
        struct devlink *devlink = priv_to_devlink(pf);
        struct ice_vsi *vsi = ice_get_main_vsi(pf);
        struct device *dev = ice_pf_to_dev(pf);
+       struct devlink_port_attrs attrs = {};
        int err;
 
        if (!vsi) {
                return -EIO;
        }
 
-       devlink_port_attrs_set(&pf->devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              pf->hw.pf_id, false, 0, NULL, 0);
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       attrs.phys.port_number = pf->hw.pf_id;
+       devlink_port_attrs_set(&pf->devlink_port, &attrs);
        err = devlink_port_register(devlink, &pf->devlink_port, pf->hw.pf_id);
        if (err) {
                dev_err(dev, "devlink_port_register failed: %d\n", err);
 
 int mlx5e_devlink_port_register(struct mlx5e_priv *priv)
 {
        struct devlink *devlink = priv_to_devlink(priv->mdev);
+       struct devlink_port_attrs attrs = {};
 
-       if (mlx5_core_is_pf(priv->mdev))
-               devlink_port_attrs_set(&priv->dl_port,
-                                      DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                                      PCI_FUNC(priv->mdev->pdev->devfn),
-                                      false, 0,
-                                      NULL, 0);
-       else
-               devlink_port_attrs_set(&priv->dl_port,
-                                      DEVLINK_PORT_FLAVOUR_VIRTUAL,
-                                      0, false, 0, NULL, 0);
+       if (mlx5_core_is_pf(priv->mdev)) {
+               attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+               attrs.phys.port_number = PCI_FUNC(priv->mdev->pdev->devfn);
+       } else {
+               attrs.flavour = DEVLINK_PORT_FLAVOUR_VIRTUAL;
+       }
+
+       devlink_port_attrs_set(&priv->dl_port, &attrs);
 
        return devlink_port_register(devlink, &priv->dl_port, 1);
 }
 
 {
        struct devlink *devlink = priv_to_devlink(dev);
        struct mlx5_eswitch_rep *rep = rpriv->rep;
+       struct devlink_port_attrs attrs = {};
        struct netdev_phys_item_id ppid = {};
        unsigned int dl_port_index = 0;
        u16 pfnum;
        mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid);
        dl_port_index = mlx5_esw_vport_to_devlink_port_index(dev, rep->vport);
        pfnum = PCI_FUNC(dev->pdev->devfn);
-
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       attrs.phys.port_number = pfnum;
+       memcpy(attrs.switch_id.id, &ppid.id[0], ppid.id_len);
+       attrs.switch_id.id_len = ppid.id_len;
        if (rep->vport == MLX5_VPORT_UPLINK)
-               devlink_port_attrs_set(&rpriv->dl_port,
-                                      DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                                      pfnum, false, 0,
-                                      &ppid.id[0], ppid.id_len);
+               devlink_port_attrs_set(&rpriv->dl_port, &attrs);
        else if (rep->vport == MLX5_VPORT_PF)
-               devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
-                                             &ppid.id[0], ppid.id_len,
-                                             pfnum);
+               devlink_port_attrs_pci_pf_set(&rpriv->dl_port, pfnum);
        else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch, rpriv->rep->vport))
                devlink_port_attrs_pci_vf_set(&rpriv->dl_port,
-                                             &ppid.id[0], ppid.id_len,
                                              pfnum, rep->vport - 1);
 
        return devlink_port_register(devlink, &rpriv->dl_port, dl_port_index);
 
        struct mlxsw_core_port *mlxsw_core_port =
                                        &mlxsw_core->ports[local_port];
        struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
+       struct devlink_port_attrs attrs = {};
        int err;
 
+       attrs.split = split;
+       attrs.flavour = flavour;
+       attrs.phys.port_number = port_number;
+       attrs.phys.split_subport_number = split_port_subnumber;
+       memcpy(attrs.switch_id.id, switch_id, switch_id_len);
+       attrs.switch_id.id_len = switch_id_len;
        mlxsw_core_port->local_port = local_port;
-       devlink_port_attrs_set(devlink_port, flavour, port_number,
-                              split, split_port_subnumber,
-                              switch_id, switch_id_len);
+       devlink_port_attrs_set(devlink_port, &attrs);
        err = devlink_port_register(devlink, devlink_port, local_port);
        if (err)
                memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
 
 
 int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
 {
+       struct devlink_port_attrs attrs = {};
        struct nfp_eth_table_port eth_port;
        struct devlink *devlink;
        const u8 *serial;
        if (ret)
                return ret;
 
+       attrs.split = eth_port.is_split;
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       attrs.phys.port_number = eth_port.label_port;
+       attrs.phys.split_subport_number = eth_port.label_subport;
        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);
+       memcpy(attrs.switch_id.id, serial, serial_len);
+       attrs.switch_id.id_len = serial_len;
+       devlink_port_attrs_set(&port->dl_port, &attrs);
 
        devlink = priv_to_devlink(app->pf);
 
 
 int ionic_devlink_register(struct ionic *ionic)
 {
        struct devlink *dl = priv_to_devlink(ionic);
+       struct devlink_port_attrs attrs = {};
        int err;
 
        err = devlink_register(dl, ionic->dev);
                return err;
        }
 
-       devlink_port_attrs_set(&ionic->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              0, false, 0, NULL, 0);
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       devlink_port_attrs_set(&ionic->dl_port, &attrs);
        err = devlink_port_register(dl, &ionic->dl_port, 0);
        if (err)
                dev_err(ionic->dev, "devlink_port_register failed: %d\n", err);
 
 static int __nsim_dev_port_add(struct nsim_dev *nsim_dev,
                               unsigned int port_index)
 {
+       struct devlink_port_attrs attrs = {};
        struct nsim_dev_port *nsim_dev_port;
        struct devlink_port *devlink_port;
        int err;
        nsim_dev_port->port_index = port_index;
 
        devlink_port = &nsim_dev_port->devlink_port;
-       devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-                              port_index + 1, 0, 0,
-                              nsim_dev->switch_id.id,
-                              nsim_dev->switch_id.id_len);
+       attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+       attrs.phys.port_number = port_index + 1;
+       memcpy(attrs.switch_id.id, nsim_dev->switch_id.id, nsim_dev->switch_id.id_len);
+       attrs.switch_id.id_len = nsim_dev->switch_id.id_len;
+       devlink_port_attrs_set(devlink_port, &attrs);
        err = devlink_port_register(priv_to_devlink(nsim_dev), devlink_port,
                                    port_index);
        if (err)
 
                          * A physical port which is visible to the user
                          * for a given port flavour.
                          */
-       u32 split_subport_number;
+       u32 split_subport_number; /* If the port is split, this is the number of subport. */
 };
 
 struct devlink_port_pci_pf_attrs {
        u16 vf; /* Associated PCI VF for of the PCI PF for this port. */
 };
 
+/**
+ * struct devlink_port_attrs - devlink port object
+ * @flavour: flavour of the port
+ * @split: indicates if this is split port
+ * @switch_id: if the port is part of switch, this is buffer with ID, otherwise this is NULL
+ */
 struct devlink_port_attrs {
        u8 split:1;
        enum devlink_port_flavour flavour;
                              struct ib_device *ibdev);
 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,
-                           const unsigned char *switch_id,
-                           unsigned char switch_id_len);
-void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
-                                  const unsigned char *switch_id,
-                                  unsigned char switch_id_len, u16 pf);
+                           struct devlink_port_attrs *devlink_port_attrs);
+void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u16 pf);
 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port,
-                                  const unsigned char *switch_id,
-                                  unsigned char switch_id_len,
                                   u16 pf, u16 vf);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
 
 EXPORT_SYMBOL_GPL(devlink_port_type_clear);
 
 static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
-                                   enum devlink_port_flavour flavour,
-                                   const unsigned char *switch_id,
-                                   unsigned char switch_id_len)
+                                   enum devlink_port_flavour flavour)
 {
        struct devlink_port_attrs *attrs = &devlink_port->attrs;
 
                return -EEXIST;
        devlink_port->attrs_set = true;
        attrs->flavour = flavour;
-       if (switch_id) {
+       if (attrs->switch_id.id_len) {
                devlink_port->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;
+               if (WARN_ON(attrs->switch_id.id_len > MAX_PHYS_ITEM_ID_LEN))
+                       attrs->switch_id.id_len = MAX_PHYS_ITEM_ID_LEN;
        } else {
                devlink_port->switch_port = false;
        }
  *     devlink_port_attrs_set - Set port attributes
  *
  *     @devlink_port: devlink port
- *     @flavour: flavour of the port
- *     @port_number: number of the port that is facing user, for example
- *                   the front panel port number
- *     @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
+ *     @attrs: devlink port attrs
  */
 void devlink_port_attrs_set(struct devlink_port *devlink_port,
-                           enum devlink_port_flavour flavour,
-                           u32 port_number, bool split,
-                           u32 split_subport_number,
-                           const unsigned char *switch_id,
-                           unsigned char switch_id_len)
+                           struct devlink_port_attrs *attrs)
 {
-       struct devlink_port_attrs *attrs = &devlink_port->attrs;
        int ret;
 
-       ret = __devlink_port_attrs_set(devlink_port, flavour,
-                                      switch_id, switch_id_len);
+       devlink_port->attrs = *attrs;
+       ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
        if (ret)
                return;
-       attrs->split = split;
-       attrs->phys.port_number = port_number;
-       attrs->phys.split_subport_number = split_subport_number;
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
 
  *
  *     @devlink_port: devlink port
  *     @pf: associated PF for the devlink port instance
- *     @switch_id: if the port is part of switch, this is buffer with ID,
- *                 otherwise this is NULL
- *     @switch_id_len: length of the switch_id buffer
  */
-void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
-                                  const unsigned char *switch_id,
-                                  unsigned char switch_id_len, u16 pf)
+void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u16 pf)
 {
        struct devlink_port_attrs *attrs = &devlink_port->attrs;
        int ret;
 
        ret = __devlink_port_attrs_set(devlink_port,
-                                      DEVLINK_PORT_FLAVOUR_PCI_PF,
-                                      switch_id, switch_id_len);
+                                      DEVLINK_PORT_FLAVOUR_PCI_PF);
        if (ret)
                return;
 
  *     @devlink_port: devlink port
  *     @pf: associated PF for the devlink port instance
  *     @vf: associated VF of a PF for the devlink port instance
- *     @switch_id: if the port is part of switch, this is buffer with ID,
- *                 otherwise this is NULL
- *     @switch_id_len: length of the switch_id buffer
  */
 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port,
-                                  const unsigned char *switch_id,
-                                  unsigned char switch_id_len,
                                   u16 pf, u16 vf)
 {
        struct devlink_port_attrs *attrs = &devlink_port->attrs;
        int ret;
 
        ret = __devlink_port_attrs_set(devlink_port,
-                                      DEVLINK_PORT_FLAVOUR_PCI_VF,
-                                      switch_id, switch_id_len);
+                                      DEVLINK_PORT_FLAVOUR_PCI_VF);
        if (ret)
                return;
        attrs->pci_vf.pf = pf;
 
        struct devlink_port *dlp = &dp->devlink_port;
        bool dsa_port_link_registered = false;
        bool devlink_port_registered = false;
+       struct devlink_port_attrs attrs = {};
        struct devlink *dl = ds->devlink;
        bool dsa_port_enabled = false;
        int err = 0;
 
+       attrs.phys.port_number = dp->index;
+       memcpy(attrs.switch_id.id, id, len);
+       attrs.switch_id.id_len = len;
+
        if (dp->setup)
                return 0;
 
                break;
        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);
+               attrs.flavour = DEVLINK_PORT_FLAVOUR_CPU;
+               devlink_port_attrs_set(dlp, &attrs);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;
                break;
        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);
+               attrs.flavour = DEVLINK_PORT_FLAVOUR_DSA;
+               devlink_port_attrs_set(dlp, &attrs);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;
                break;
        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);
+               attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+               devlink_port_attrs_set(dlp, &attrs);
                err = devlink_port_register(dl, dlp, dp->index);
                if (err)
                        break;