}
 
        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");
 
 
        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));
 
 
        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);
 
 
 
 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 {
 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,
 
  *     @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;
 
        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);
 
 
         * 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)