mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-24 09:59:59 +07:00
Merge branch 'net-extend-devlink-port-attrs-with-switch-ID'
Jiri Pirko says: ==================== net: extend devlink port attrs with switch ID Extend devlink port attrs to contain switch ID and change drivers that register devlink ports to use that. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
6124d0670d
@ -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,
|
||||
};
|
||||
|
||||
@ -10429,6 +10428,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 +10588,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);
|
||||
|
@ -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);
|
||||
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");
|
||||
|
@ -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;
|
||||
|
@ -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 =
|
||||
@ -1730,7 +1732,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,
|
||||
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));
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
@ -151,7 +138,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);
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
@ -3392,7 +3379,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);
|
||||
|
@ -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);
|
||||
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");
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
@ -1128,7 +1115,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);
|
||||
|
@ -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);
|
||||
eth_port.label_subport, serial, serial_len);
|
||||
|
||||
devlink = priv_to_devlink(app->pf);
|
||||
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,11 +41,13 @@ struct devlink {
|
||||
};
|
||||
|
||||
struct devlink_port_attrs {
|
||||
bool set;
|
||||
u8 set:1,
|
||||
split:1,
|
||||
switch_port:1;
|
||||
enum devlink_port_flavour flavour;
|
||||
u32 port_number; /* same value as "split group" */
|
||||
bool split;
|
||||
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,
|
||||
@ -739,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
|
||||
|
||||
@ -760,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_ */
|
||||
|
@ -7900,13 +7900,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)
|
||||
return ops->ndo_get_port_parent_id(dev, ppid);
|
||||
if (ops->ndo_get_port_parent_id) {
|
||||
err = ops->ndo_get_port_parent_id(dev, ppid);
|
||||
if (err != -EOPNOTSUPP)
|
||||
return err;
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -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);
|
||||
@ -5414,11 +5428,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 +5448,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);
|
||||
|
||||
@ -6494,6 +6522,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);
|
||||
|
@ -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);
|
||||
dp->index, false, 0,
|
||||
(const char *) &dst->index, sizeof(dst->index));
|
||||
err = devlink_port_register(ds->devlink, &dp->devlink_port,
|
||||
dp->index);
|
||||
if (err)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user