mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge branch 'net-fix-netdev-to-devlink_port-linkage-and-expose-to-user'
Jiri Pirko says: ==================== net: fix netdev to devlink_port linkage and expose to user Currently, the info about linkage from netdev to the related devlink_port instance is done using ndo_get_devlink_port(). This is not sufficient, as it is up to the driver to implement it and some of them don't do that. Also it leads to a lot of unnecessary boilerplate code in all the drivers. Instead of that, introduce a possibility for driver to expose this relationship by new SET_NETDEV_DEVLINK_PORT macro which stores it into dev->devlink_port. It is ensured by the driver init/fini flows that the devlink_port pointer does not change during the netdev lifetime. Devlink port is always registered before netdev register and unregistered after netdev unregister. Benefit from this linkage setup and remove explicit calls from driver to devlink_port_type_eth_set() and clear(). Many of the driver didn't use it correctly anyway. Let the devlink.c to track associated netdev events and adjust type and type pointer accordingly. Also use this events to to keep track on ifname change and remove RTNL lock taking from devlink_nl_port_fill(). Finally, remove the ndo_get_devlink_port() ndo which is no longer used and expose devlink_port handle as a new netdev netlink attribute to the user. That way, during the ifname->devlink_port lookup, userspace app does not have to dump whole devlink port list and instead it can just do a simple RTM_GETLINK query. ==================== Link: https://lore.kernel.org/r/20221102160211.662752-1-jiri@resnulli.us Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -13073,13 +13073,6 @@ int bnxt_get_port_parent_id(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct devlink_port *bnxt_get_devlink_port(struct net_device *dev)
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
|
||||
return &bp->dl_port;
|
||||
}
|
||||
|
||||
static const struct net_device_ops bnxt_netdev_ops = {
|
||||
.ndo_open = bnxt_open,
|
||||
.ndo_start_xmit = bnxt_start_xmit,
|
||||
@@ -13111,7 +13104,6 @@ static const struct net_device_ops bnxt_netdev_ops = {
|
||||
.ndo_xdp_xmit = bnxt_xdp_xmit,
|
||||
.ndo_bridge_getlink = bnxt_bridge_getlink,
|
||||
.ndo_bridge_setlink = bnxt_bridge_setlink,
|
||||
.ndo_get_devlink_port = bnxt_get_devlink_port,
|
||||
};
|
||||
|
||||
static void bnxt_remove_one(struct pci_dev *pdev)
|
||||
@@ -13122,9 +13114,6 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
||||
if (BNXT_PF(bp))
|
||||
bnxt_sriov_disable(bp);
|
||||
|
||||
if (BNXT_PF(bp))
|
||||
devlink_port_type_clear(&bp->dl_port);
|
||||
|
||||
bnxt_ptp_clear(bp);
|
||||
pci_disable_pcie_error_reporting(pdev);
|
||||
unregister_netdev(dev);
|
||||
@@ -13537,6 +13526,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
return -ENOMEM;
|
||||
|
||||
bp = netdev_priv(dev);
|
||||
SET_NETDEV_DEVLINK_PORT(dev, &bp->dl_port);
|
||||
bp->board_idx = ent->driver_data;
|
||||
bp->msg_enable = BNXT_DEF_MSG_ENABLE;
|
||||
bnxt_set_max_func_irqs(bp, max_irqs);
|
||||
@@ -13712,8 +13702,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (rc)
|
||||
goto init_err_cleanup;
|
||||
|
||||
if (BNXT_PF(bp))
|
||||
devlink_port_type_eth_set(&bp->dl_port, bp->dev);
|
||||
bnxt_dl_fw_reporters_create(bp);
|
||||
|
||||
bnxt_print_device_info(bp);
|
||||
|
||||
@@ -226,25 +226,16 @@ int dpaa2_eth_dl_port_add(struct dpaa2_eth_priv *priv)
|
||||
{
|
||||
struct devlink_port *devlink_port = &priv->devlink_port;
|
||||
struct devlink_port_attrs attrs = {};
|
||||
int err;
|
||||
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
||||
devlink_port_attrs_set(devlink_port, &attrs);
|
||||
|
||||
err = devlink_port_register(priv->devlink, devlink_port, 0);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
devlink_port_type_eth_set(devlink_port, priv->net_dev);
|
||||
|
||||
return 0;
|
||||
return devlink_port_register(priv->devlink, devlink_port, 0);
|
||||
}
|
||||
|
||||
void dpaa2_eth_dl_port_del(struct dpaa2_eth_priv *priv)
|
||||
{
|
||||
struct devlink_port *devlink_port = &priv->devlink_port;
|
||||
|
||||
devlink_port_type_clear(devlink_port);
|
||||
devlink_port_unregister(devlink_port);
|
||||
}
|
||||
|
||||
|
||||
@@ -4791,6 +4791,7 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
|
||||
|
||||
priv = netdev_priv(net_dev);
|
||||
priv->net_dev = net_dev;
|
||||
SET_NETDEV_DEVLINK_PORT(net_dev, &priv->devlink_port);
|
||||
|
||||
priv->iommu_domain = iommu_get_domain_for_dev(dev);
|
||||
|
||||
|
||||
@@ -1178,13 +1178,6 @@ static int fun_xdp(struct net_device *dev, struct netdev_bpf *xdp)
|
||||
}
|
||||
}
|
||||
|
||||
static struct devlink_port *fun_get_devlink_port(struct net_device *netdev)
|
||||
{
|
||||
struct funeth_priv *fp = netdev_priv(netdev);
|
||||
|
||||
return &fp->dl_port;
|
||||
}
|
||||
|
||||
static int fun_init_vports(struct fun_ethdev *ed, unsigned int n)
|
||||
{
|
||||
if (ed->num_vports)
|
||||
@@ -1350,7 +1343,6 @@ static const struct net_device_ops fun_netdev_ops = {
|
||||
.ndo_set_vf_vlan = fun_set_vf_vlan,
|
||||
.ndo_set_vf_rate = fun_set_vf_rate,
|
||||
.ndo_get_vf_config = fun_get_vf_config,
|
||||
.ndo_get_devlink_port = fun_get_devlink_port,
|
||||
};
|
||||
|
||||
#define GSO_ENCAP_FLAGS (NETIF_F_GSO_GRE | NETIF_F_GSO_IPXIP4 | \
|
||||
@@ -1760,6 +1752,7 @@ static int fun_create_netdev(struct fun_ethdev *ed, unsigned int portid)
|
||||
goto free_rss;
|
||||
|
||||
SET_NETDEV_DEV(netdev, fdev->dev);
|
||||
SET_NETDEV_DEVLINK_PORT(netdev, &fp->dl_port);
|
||||
netdev->netdev_ops = &fun_netdev_ops;
|
||||
|
||||
netdev->hw_features = NETIF_F_SG | NETIF_F_RXHASH | NETIF_F_RXCSUM;
|
||||
@@ -1800,9 +1793,6 @@ static int fun_create_netdev(struct fun_ethdev *ed, unsigned int portid)
|
||||
rc = register_netdev(netdev);
|
||||
if (rc)
|
||||
goto unreg_devlink;
|
||||
|
||||
devlink_port_type_eth_set(&fp->dl_port, netdev);
|
||||
|
||||
return 0;
|
||||
|
||||
unreg_devlink:
|
||||
@@ -1827,7 +1817,6 @@ static void fun_destroy_netdev(struct net_device *netdev)
|
||||
struct funeth_priv *fp;
|
||||
|
||||
fp = netdev_priv(netdev);
|
||||
devlink_port_type_clear(&fp->dl_port);
|
||||
unregister_netdev(netdev);
|
||||
devlink_port_unregister(&fp->dl_port);
|
||||
fun_ktls_cleanup(fp);
|
||||
|
||||
@@ -1033,12 +1033,7 @@ int ice_devlink_create_pf_port(struct ice_pf *pf)
|
||||
*/
|
||||
void ice_devlink_destroy_pf_port(struct ice_pf *pf)
|
||||
{
|
||||
struct devlink_port *devlink_port;
|
||||
|
||||
devlink_port = &pf->devlink_port;
|
||||
|
||||
devlink_port_type_clear(devlink_port);
|
||||
devlink_port_unregister(devlink_port);
|
||||
devlink_port_unregister(&pf->devlink_port);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1094,12 +1089,7 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
|
||||
*/
|
||||
void ice_devlink_destroy_vf_port(struct ice_vf *vf)
|
||||
{
|
||||
struct devlink_port *devlink_port;
|
||||
|
||||
devlink_port = &vf->devlink_port;
|
||||
|
||||
devlink_port_type_clear(devlink_port);
|
||||
devlink_port_unregister(devlink_port);
|
||||
devlink_port_unregister(&vf->devlink_port);
|
||||
}
|
||||
|
||||
#define ICE_DEVLINK_READ_BLK_SIZE (1024 * 1024)
|
||||
|
||||
@@ -298,20 +298,6 @@ static int ice_clear_promisc(struct ice_vsi *vsi, u8 promisc_m)
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_get_devlink_port - Get devlink port from netdev
|
||||
* @netdev: the netdevice structure
|
||||
*/
|
||||
static struct devlink_port *ice_get_devlink_port(struct net_device *netdev)
|
||||
{
|
||||
struct ice_pf *pf = ice_netdev_to_pf(netdev);
|
||||
|
||||
if (!ice_is_switchdev_running(pf))
|
||||
return NULL;
|
||||
|
||||
return &pf->devlink_port;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_vsi_sync_fltr - Update the VSI filter list to the HW
|
||||
* @vsi: ptr to the VSI
|
||||
@@ -4603,6 +4589,7 @@ static int ice_register_netdev(struct ice_pf *pf)
|
||||
if (err)
|
||||
goto err_devlink_create;
|
||||
|
||||
SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port);
|
||||
err = register_netdev(vsi->netdev);
|
||||
if (err)
|
||||
goto err_register_netdev;
|
||||
@@ -4611,8 +4598,6 @@ static int ice_register_netdev(struct ice_pf *pf)
|
||||
netif_carrier_off(vsi->netdev);
|
||||
netif_tx_stop_all_queues(vsi->netdev);
|
||||
|
||||
devlink_port_type_eth_set(&pf->devlink_port, vsi->netdev);
|
||||
|
||||
return 0;
|
||||
err_register_netdev:
|
||||
ice_devlink_destroy_pf_port(pf);
|
||||
@@ -9108,5 +9093,4 @@ static const struct net_device_ops ice_netdev_ops = {
|
||||
.ndo_bpf = ice_xdp,
|
||||
.ndo_xdp_xmit = ice_xdp_xmit,
|
||||
.ndo_xsk_wakeup = ice_xsk_wakeup,
|
||||
.ndo_get_devlink_port = ice_get_devlink_port,
|
||||
};
|
||||
|
||||
@@ -134,14 +134,6 @@ static int ice_repr_stop(struct net_device *netdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct devlink_port *
|
||||
ice_repr_get_devlink_port(struct net_device *netdev)
|
||||
{
|
||||
struct ice_repr *repr = ice_netdev_to_repr(netdev);
|
||||
|
||||
return &repr->vf->devlink_port;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_repr_sp_stats64 - get slow path stats for port representor
|
||||
* @dev: network interface device structure
|
||||
@@ -250,7 +242,6 @@ static const struct net_device_ops ice_repr_netdev_ops = {
|
||||
.ndo_open = ice_repr_open,
|
||||
.ndo_stop = ice_repr_stop,
|
||||
.ndo_start_xmit = ice_eswitch_port_start_xmit,
|
||||
.ndo_get_devlink_port = ice_repr_get_devlink_port,
|
||||
.ndo_setup_tc = ice_repr_setup_tc,
|
||||
.ndo_has_offload_stats = ice_repr_ndo_has_offload_stats,
|
||||
.ndo_get_offload_stats = ice_repr_ndo_get_offload_stats,
|
||||
@@ -339,12 +330,11 @@ static int ice_repr_add(struct ice_vf *vf)
|
||||
repr->netdev->max_mtu = ICE_MAX_MTU;
|
||||
|
||||
SET_NETDEV_DEV(repr->netdev, ice_pf_to_dev(vf->pf));
|
||||
SET_NETDEV_DEVLINK_PORT(repr->netdev, &vf->devlink_port);
|
||||
err = ice_repr_reg_netdev(repr->netdev);
|
||||
if (err)
|
||||
goto err_netdev;
|
||||
|
||||
devlink_port_type_eth_set(&vf->devlink_port, repr->netdev);
|
||||
|
||||
ice_virtchnl_set_repr_ops(vf);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -445,23 +445,6 @@ void prestera_devlink_port_unregister(struct prestera_port *port)
|
||||
devlink_port_unregister(&port->dl_port);
|
||||
}
|
||||
|
||||
void prestera_devlink_port_set(struct prestera_port *port)
|
||||
{
|
||||
devlink_port_type_eth_set(&port->dl_port, port->dev);
|
||||
}
|
||||
|
||||
void prestera_devlink_port_clear(struct prestera_port *port)
|
||||
{
|
||||
devlink_port_type_clear(&port->dl_port);
|
||||
}
|
||||
|
||||
struct devlink_port *prestera_devlink_get_port(struct net_device *dev)
|
||||
{
|
||||
struct prestera_port *port = netdev_priv(dev);
|
||||
|
||||
return &port->dl_port;
|
||||
}
|
||||
|
||||
int prestera_devlink_traps_register(struct prestera_switch *sw)
|
||||
{
|
||||
const u32 groups_count = ARRAY_SIZE(prestera_trap_groups_arr);
|
||||
|
||||
@@ -15,11 +15,6 @@ void prestera_devlink_unregister(struct prestera_switch *sw);
|
||||
int prestera_devlink_port_register(struct prestera_port *port);
|
||||
void prestera_devlink_port_unregister(struct prestera_port *port);
|
||||
|
||||
void prestera_devlink_port_set(struct prestera_port *port);
|
||||
void prestera_devlink_port_clear(struct prestera_port *port);
|
||||
|
||||
struct devlink_port *prestera_devlink_get_port(struct net_device *dev);
|
||||
|
||||
void prestera_devlink_trap_report(struct prestera_port *port,
|
||||
struct sk_buff *skb, u8 cpu_code);
|
||||
int prestera_devlink_traps_register(struct prestera_switch *sw);
|
||||
|
||||
@@ -569,7 +569,6 @@ static const struct net_device_ops prestera_netdev_ops = {
|
||||
.ndo_change_mtu = prestera_port_change_mtu,
|
||||
.ndo_get_stats64 = prestera_port_get_stats64,
|
||||
.ndo_set_mac_address = prestera_port_set_mac_address,
|
||||
.ndo_get_devlink_port = prestera_devlink_get_port,
|
||||
};
|
||||
|
||||
int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes)
|
||||
@@ -644,6 +643,7 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
|
||||
dev->netdev_ops = &prestera_netdev_ops;
|
||||
dev->ethtool_ops = &prestera_ethtool_ops;
|
||||
SET_NETDEV_DEV(dev, sw->dev->dev);
|
||||
SET_NETDEV_DEVLINK_PORT(dev, &port->dl_port);
|
||||
|
||||
if (port->caps.transceiver != PRESTERA_PORT_TCVR_SFP)
|
||||
netif_carrier_off(dev);
|
||||
@@ -737,8 +737,6 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
|
||||
if (err)
|
||||
goto err_register_netdev;
|
||||
|
||||
prestera_devlink_port_set(port);
|
||||
|
||||
err = prestera_port_sfp_bind(port);
|
||||
if (err)
|
||||
goto err_sfp_bind;
|
||||
@@ -761,7 +759,6 @@ static void prestera_port_destroy(struct prestera_port *port)
|
||||
struct net_device *dev = port->dev;
|
||||
|
||||
cancel_delayed_work_sync(&port->cached_hw_stats.caching_dw);
|
||||
prestera_devlink_port_clear(port);
|
||||
unregister_netdev(dev);
|
||||
prestera_port_list_del(port);
|
||||
prestera_devlink_port_unregister(port);
|
||||
|
||||
@@ -2337,11 +2337,8 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
||||
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
|
||||
|
||||
/* Unregister device - this will close the port if it was up */
|
||||
if (priv->registered) {
|
||||
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
|
||||
priv->port));
|
||||
if (priv->registered)
|
||||
unregister_netdev(dev);
|
||||
}
|
||||
|
||||
if (priv->allocated)
|
||||
mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE);
|
||||
@@ -3474,6 +3471,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
||||
mdev->profile.prof[priv->port].tx_ppp,
|
||||
mdev->profile.prof[priv->port].tx_pause);
|
||||
|
||||
SET_NETDEV_DEVLINK_PORT(dev,
|
||||
mlx4_get_devlink_port(mdev->dev, priv->port));
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
en_err(priv, "Netdev registration failed for port %d\n", port);
|
||||
@@ -3481,8 +3480,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
||||
}
|
||||
|
||||
priv->registered = 1;
|
||||
devlink_port_type_eth_set(mlx4_get_devlink_port(mdev->dev, priv->port),
|
||||
dev);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -3043,7 +3043,7 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_MLX4_EN) &&
|
||||
dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
|
||||
devlink_port_type_eth_set(&info->devlink_port, NULL);
|
||||
devlink_port_type_eth_set(&info->devlink_port);
|
||||
else if (!IS_ENABLED(CONFIG_MLX4_INFINIBAND) &&
|
||||
dev->caps.port_type[port] == MLX4_PORT_TYPE_IB)
|
||||
devlink_port_type_ib_set(&info->devlink_port, NULL);
|
||||
|
||||
@@ -51,13 +51,6 @@ int mlx5e_devlink_port_register(struct mlx5e_priv *priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void mlx5e_devlink_port_type_eth_set(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct devlink_port *dl_port = mlx5e_devlink_get_dl_port(priv);
|
||||
|
||||
devlink_port_type_eth_set(dl_port, priv->netdev);
|
||||
}
|
||||
|
||||
void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct devlink_port *dl_port = mlx5e_devlink_get_dl_port(priv);
|
||||
@@ -69,13 +62,3 @@ void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv)
|
||||
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW))
|
||||
devl_unlock(devlink);
|
||||
}
|
||||
|
||||
struct devlink_port *mlx5e_get_devlink_port(struct net_device *dev)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (!netif_device_present(dev))
|
||||
return NULL;
|
||||
|
||||
return mlx5e_devlink_get_dl_port(priv);
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
int mlx5e_devlink_port_register(struct mlx5e_priv *priv);
|
||||
void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv);
|
||||
void mlx5e_devlink_port_type_eth_set(struct mlx5e_priv *priv);
|
||||
struct devlink_port *mlx5e_get_devlink_port(struct net_device *dev);
|
||||
|
||||
static inline struct devlink_port *
|
||||
mlx5e_devlink_get_dl_port(struct mlx5e_priv *priv)
|
||||
|
||||
@@ -4897,7 +4897,6 @@ const struct net_device_ops mlx5e_netdev_ops = {
|
||||
.ndo_has_offload_stats = mlx5e_has_offload_stats,
|
||||
.ndo_get_offload_stats = mlx5e_get_offload_stats,
|
||||
#endif
|
||||
.ndo_get_devlink_port = mlx5e_get_devlink_port,
|
||||
};
|
||||
|
||||
static u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 wanted_timeout)
|
||||
@@ -5932,14 +5931,13 @@ static int mlx5e_probe(struct auxiliary_device *adev,
|
||||
goto err_profile_cleanup;
|
||||
}
|
||||
|
||||
SET_NETDEV_DEVLINK_PORT(netdev, mlx5e_devlink_get_dl_port(priv));
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
mlx5_core_err(mdev, "register_netdev failed, %d\n", err);
|
||||
goto err_resume;
|
||||
}
|
||||
|
||||
mlx5e_devlink_port_type_eth_set(priv);
|
||||
|
||||
mlx5e_dcbnl_init_app(priv);
|
||||
mlx5_uplink_netdev_set(mdev, netdev);
|
||||
return 0;
|
||||
|
||||
@@ -607,15 +607,6 @@ static int mlx5e_rep_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
return mlx5e_change_mtu(netdev, new_mtu, NULL);
|
||||
}
|
||||
|
||||
static struct devlink_port *mlx5e_rep_get_devlink_port(struct net_device *netdev)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
struct mlx5_core_dev *dev = priv->mdev;
|
||||
|
||||
return mlx5_esw_offloads_devlink_port(dev->priv.eswitch, rpriv->rep->vport);
|
||||
}
|
||||
|
||||
static int mlx5e_rep_change_carrier(struct net_device *dev, bool new_carrier)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
@@ -644,7 +635,6 @@ static const struct net_device_ops mlx5e_netdev_ops_rep = {
|
||||
.ndo_stop = mlx5e_rep_close,
|
||||
.ndo_start_xmit = mlx5e_xmit,
|
||||
.ndo_setup_tc = mlx5e_rep_setup_tc,
|
||||
.ndo_get_devlink_port = mlx5e_rep_get_devlink_port,
|
||||
.ndo_get_stats64 = mlx5e_rep_get_stats,
|
||||
.ndo_has_offload_stats = mlx5e_rep_has_offload_stats,
|
||||
.ndo_get_offload_stats = mlx5e_rep_get_offload_stats,
|
||||
@@ -1253,37 +1243,20 @@ mlx5e_vport_uplink_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(mlx5_uplink_netdev_get(dev));
|
||||
struct mlx5e_rep_priv *rpriv = mlx5e_rep_to_rep_priv(rep);
|
||||
struct devlink_port *dl_port;
|
||||
int err;
|
||||
|
||||
rpriv->netdev = priv->netdev;
|
||||
|
||||
err = mlx5e_netdev_change_profile(priv, &mlx5e_uplink_rep_profile,
|
||||
rpriv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch, rpriv->rep->vport);
|
||||
if (dl_port)
|
||||
devlink_port_type_eth_set(dl_port, rpriv->netdev);
|
||||
|
||||
return 0;
|
||||
return mlx5e_netdev_change_profile(priv, &mlx5e_uplink_rep_profile,
|
||||
rpriv);
|
||||
}
|
||||
|
||||
static void
|
||||
mlx5e_vport_uplink_rep_unload(struct mlx5e_rep_priv *rpriv)
|
||||
{
|
||||
struct net_device *netdev = rpriv->netdev;
|
||||
struct devlink_port *dl_port;
|
||||
struct mlx5_core_dev *dev;
|
||||
struct mlx5e_priv *priv;
|
||||
|
||||
priv = netdev_priv(netdev);
|
||||
dev = priv->mdev;
|
||||
|
||||
dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch, rpriv->rep->vport);
|
||||
if (dl_port)
|
||||
devlink_port_type_clear(dl_port);
|
||||
mlx5e_netdev_attach_nic_profile(priv);
|
||||
}
|
||||
|
||||
@@ -1326,6 +1299,11 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
|
||||
goto err_cleanup_profile;
|
||||
}
|
||||
|
||||
dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch,
|
||||
rpriv->rep->vport);
|
||||
if (dl_port)
|
||||
SET_NETDEV_DEVLINK_PORT(netdev, dl_port);
|
||||
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
netdev_warn(netdev,
|
||||
@@ -1334,9 +1312,6 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
|
||||
goto err_detach_netdev;
|
||||
}
|
||||
|
||||
dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch, rpriv->rep->vport);
|
||||
if (dl_port)
|
||||
devlink_port_type_eth_set(dl_port, netdev);
|
||||
return 0;
|
||||
|
||||
err_detach_netdev:
|
||||
@@ -1382,8 +1357,6 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
|
||||
struct mlx5e_rep_priv *rpriv = mlx5e_rep_to_rep_priv(rep);
|
||||
struct net_device *netdev = rpriv->netdev;
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5_core_dev *dev = priv->mdev;
|
||||
struct devlink_port *dl_port;
|
||||
void *ppriv = priv->ppriv;
|
||||
|
||||
if (rep->vport == MLX5_VPORT_UPLINK) {
|
||||
@@ -1391,9 +1364,6 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
|
||||
goto free_ppriv;
|
||||
}
|
||||
|
||||
dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch, rpriv->rep->vport);
|
||||
if (dl_port)
|
||||
devlink_port_type_clear(dl_port);
|
||||
unregister_netdev(netdev);
|
||||
mlx5e_detach_netdev(priv);
|
||||
priv->profile->cleanup(priv);
|
||||
|
||||
@@ -3172,29 +3172,17 @@ void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core)
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_cpu_port_fini);
|
||||
|
||||
void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv, struct net_device *dev)
|
||||
void mlxsw_core_port_netdev_link(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv, struct net_device *dev)
|
||||
{
|
||||
struct mlxsw_core_port *mlxsw_core_port =
|
||||
&mlxsw_core->ports[local_port];
|
||||
struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
|
||||
|
||||
mlxsw_core_port->port_driver_priv = port_driver_priv;
|
||||
devlink_port_type_eth_set(devlink_port, dev);
|
||||
SET_NETDEV_DEVLINK_PORT(dev, devlink_port);
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_port_eth_set);
|
||||
|
||||
void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv)
|
||||
{
|
||||
struct mlxsw_core_port *mlxsw_core_port =
|
||||
&mlxsw_core->ports[local_port];
|
||||
struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
|
||||
|
||||
mlxsw_core_port->port_driver_priv = port_driver_priv;
|
||||
devlink_port_type_clear(devlink_port);
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_port_clear);
|
||||
EXPORT_SYMBOL(mlxsw_core_port_netdev_link);
|
||||
|
||||
struct devlink_port *
|
||||
mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
|
||||
|
||||
@@ -264,10 +264,9 @@ int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
|
||||
const unsigned char *switch_id,
|
||||
unsigned char switch_id_len);
|
||||
void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core);
|
||||
void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv, struct net_device *dev);
|
||||
void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv);
|
||||
void mlxsw_core_port_netdev_link(struct mlxsw_core *mlxsw_core, u16 local_port,
|
||||
void *port_driver_priv,
|
||||
struct net_device *dev);
|
||||
struct devlink_port *
|
||||
mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
|
||||
u16 local_port);
|
||||
|
||||
@@ -81,20 +81,9 @@ static int mlxsw_m_port_stop(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct devlink_port *
|
||||
mlxsw_m_port_get_devlink_port(struct net_device *dev)
|
||||
{
|
||||
struct mlxsw_m_port *mlxsw_m_port = netdev_priv(dev);
|
||||
struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m;
|
||||
|
||||
return mlxsw_core_port_devlink_port_get(mlxsw_m->core,
|
||||
mlxsw_m_port->local_port);
|
||||
}
|
||||
|
||||
static const struct net_device_ops mlxsw_m_port_netdev_ops = {
|
||||
.ndo_open = mlxsw_m_port_open,
|
||||
.ndo_stop = mlxsw_m_port_stop,
|
||||
.ndo_get_devlink_port = mlxsw_m_port_get_devlink_port,
|
||||
};
|
||||
|
||||
static void mlxsw_m_module_get_drvinfo(struct net_device *dev,
|
||||
@@ -265,6 +254,8 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u16 local_port, u8 slot_index,
|
||||
SET_NETDEV_DEV(dev, mlxsw_m->bus_info->dev);
|
||||
dev_net_set(dev, mlxsw_core_net(mlxsw_m->core));
|
||||
mlxsw_m_port = netdev_priv(dev);
|
||||
mlxsw_core_port_netdev_link(mlxsw_m->core, local_port,
|
||||
mlxsw_m_port, dev);
|
||||
mlxsw_m_port->dev = dev;
|
||||
mlxsw_m_port->mlxsw_m = mlxsw_m;
|
||||
mlxsw_m_port->local_port = local_port;
|
||||
@@ -298,9 +289,6 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u16 local_port, u8 slot_index,
|
||||
goto err_register_netdev;
|
||||
}
|
||||
|
||||
mlxsw_core_port_eth_set(mlxsw_m->core, mlxsw_m_port->local_port,
|
||||
mlxsw_m_port, dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_register_netdev:
|
||||
@@ -316,7 +304,6 @@ static void mlxsw_m_port_remove(struct mlxsw_m *mlxsw_m, u16 local_port)
|
||||
{
|
||||
struct mlxsw_m_port *mlxsw_m_port = mlxsw_m->ports[local_port];
|
||||
|
||||
mlxsw_core_port_clear(mlxsw_m->core, local_port, mlxsw_m);
|
||||
unregister_netdev(mlxsw_m_port->dev); /* This calls ndo_stop */
|
||||
mlxsw_m->ports[local_port] = NULL;
|
||||
free_netdev(mlxsw_m_port->dev);
|
||||
|
||||
@@ -1259,16 +1259,6 @@ static int mlxsw_sp_set_features(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct devlink_port *
|
||||
mlxsw_sp_port_get_devlink_port(struct net_device *dev)
|
||||
{
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
|
||||
return mlxsw_core_port_devlink_port_get(mlxsw_sp->core,
|
||||
mlxsw_sp_port->local_port);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct ifreq *ifr)
|
||||
{
|
||||
@@ -1342,7 +1332,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_devlink_port = mlxsw_sp_port_get_devlink_port,
|
||||
.ndo_eth_ioctl = mlxsw_sp_port_ioctl,
|
||||
};
|
||||
|
||||
@@ -1651,6 +1640,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
||||
SET_NETDEV_DEV(dev, mlxsw_sp->bus_info->dev);
|
||||
dev_net_set(dev, mlxsw_sp_net(mlxsw_sp));
|
||||
mlxsw_sp_port = netdev_priv(dev);
|
||||
mlxsw_core_port_netdev_link(mlxsw_sp->core, local_port,
|
||||
mlxsw_sp_port, dev);
|
||||
mlxsw_sp_port->dev = dev;
|
||||
mlxsw_sp_port->mlxsw_sp = mlxsw_sp;
|
||||
mlxsw_sp_port->local_port = local_port;
|
||||
@@ -1839,8 +1830,6 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
||||
goto err_register_netdev;
|
||||
}
|
||||
|
||||
mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port,
|
||||
mlxsw_sp_port, dev);
|
||||
mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0);
|
||||
return 0;
|
||||
|
||||
@@ -1897,7 +1886,6 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u16 local_port)
|
||||
|
||||
cancel_delayed_work_sync(&mlxsw_sp_port->periodic_hw_stats.update_dw);
|
||||
cancel_delayed_work_sync(&mlxsw_sp_port->ptp.shaper_dw);
|
||||
mlxsw_core_port_clear(mlxsw_sp->core, local_port, mlxsw_sp);
|
||||
unregister_netdev(mlxsw_sp_port->dev); /* This calls ndo_stop */
|
||||
mlxsw_sp_port_ptp_clear(mlxsw_sp_port);
|
||||
mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, true, true);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user