Skip to content

Commit b36cdb4

Browse files
ogerlitzSaeed Mahameed
authored andcommitted
net/mlx5e: Handle port mtu/link, dcb and lag for uplink reps
Take care of setup/teardown for the port link, dcb, lag as well as dealing with port mtu and carrier for e-switch uplink representors. This is achieved by adding a dedicated profile instance for uplink representors which includes the enable/disable and more profile routines which are invoked by the general mlx5e code for netdev attach/detach. Signed-off-by: Or Gerlitz <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent aec002f commit b36cdb4

File tree

3 files changed

+102
-20
lines changed

3 files changed

+102
-20
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ int mlx5e_create_tis(struct mlx5_core_dev *mdev, int tc,
940940
void mlx5e_destroy_tis(struct mlx5_core_dev *mdev, u32 tisn);
941941

942942
int mlx5e_create_tises(struct mlx5e_priv *priv);
943+
void mlx5e_update_carrier(struct mlx5e_priv *priv);
943944
int mlx5e_close(struct net_device *netdev);
944945
int mlx5e_open(struct net_device *netdev);
945946
void mlx5e_update_ndo_stats(struct mlx5e_priv *priv);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params)
225225
MLX5_WQ_TYPE_CYCLIC;
226226
}
227227

228-
static void mlx5e_update_carrier(struct mlx5e_priv *priv)
228+
void mlx5e_update_carrier(struct mlx5e_priv *priv)
229229
{
230230
struct mlx5_core_dev *mdev = priv->mdev;
231231
u8 port_state;

drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

Lines changed: 100 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,19 +1194,20 @@ static int mlx5e_vf_rep_change_mtu(struct net_device *netdev, int new_mtu)
11941194
return mlx5e_change_mtu(netdev, new_mtu, NULL);
11951195
}
11961196

1197-
static int mlx5e_uplink_rep_open(struct net_device *dev)
1197+
static int mlx5e_uplink_rep_change_mtu(struct net_device *netdev, int new_mtu)
11981198
{
1199-
int err;
1200-
1201-
err = mlx5e_open(dev);
1202-
if (!err)
1203-
netif_carrier_on(dev);
1204-
return err;
1199+
return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
12051200
}
12061201

1207-
static int mlx5e_uplink_rep_change_mtu(struct net_device *netdev, int new_mtu)
1202+
static int mlx5e_uplink_rep_set_mac(struct net_device *netdev, void *addr)
12081203
{
1209-
return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
1204+
struct sockaddr *saddr = addr;
1205+
1206+
if (!is_valid_ether_addr(saddr->sa_data))
1207+
return -EADDRNOTAVAIL;
1208+
1209+
ether_addr_copy(netdev->dev_addr, saddr->sa_data);
1210+
return 0;
12101211
}
12111212

12121213
static const struct switchdev_ops mlx5e_rep_switchdev_ops = {
@@ -1226,9 +1227,10 @@ static const struct net_device_ops mlx5e_netdev_ops_vf_rep = {
12261227
};
12271228

12281229
static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
1229-
.ndo_open = mlx5e_uplink_rep_open,
1230+
.ndo_open = mlx5e_open,
12301231
.ndo_stop = mlx5e_close,
12311232
.ndo_start_xmit = mlx5e_xmit,
1233+
.ndo_set_mac_address = mlx5e_uplink_rep_set_mac,
12321234
.ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name,
12331235
.ndo_setup_tc = mlx5e_rep_setup_tc,
12341236
.ndo_get_stats64 = mlx5e_get_stats,
@@ -1280,13 +1282,16 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
12801282
struct mlx5e_rep_priv *rpriv = priv->ppriv;
12811283
struct mlx5_eswitch_rep *rep = rpriv->rep;
12821284
struct mlx5_core_dev *mdev = priv->mdev;
1283-
u16 max_mtu;
12841285

12851286
if (rep->vport == FDB_UPLINK_VPORT) {
12861287
SET_NETDEV_DEV(netdev, &priv->mdev->pdev->dev);
12871288
netdev->netdev_ops = &mlx5e_netdev_ops_uplink_rep;
12881289
/* we want a persistent mac for the uplink rep */
12891290
mlx5_query_nic_vport_mac_address(mdev, 0, netdev->dev_addr);
1291+
#ifdef CONFIG_MLX5_CORE_EN_DCB
1292+
if (MLX5_CAP_GEN(mdev, qos))
1293+
netdev->dcbnl_ops = &mlx5e_dcbnl_ops;
1294+
#endif
12901295
} else {
12911296
netdev->netdev_ops = &mlx5e_netdev_ops_vf_rep;
12921297
eth_hw_addr_random(netdev);
@@ -1310,10 +1315,6 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
13101315
netdev->hw_features |= NETIF_F_RXCSUM;
13111316

13121317
netdev->features |= netdev->hw_features;
1313-
1314-
netdev->min_mtu = ETH_MIN_MTU;
1315-
mlx5_query_port_max_mtu(mdev, &max_mtu, 1);
1316-
netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu);
13171318
}
13181319

13191320
static int mlx5e_rep_get_default_num_channels(struct mlx5_eswitch_rep *rep,
@@ -1520,24 +1521,103 @@ static void mlx5e_cleanup_rep_tx(struct mlx5e_priv *priv)
15201521
}
15211522
}
15221523

1523-
static const struct mlx5e_profile mlx5e_rep_profile = {
1524+
static void mlx5e_vf_rep_enable(struct mlx5e_priv *priv)
1525+
{
1526+
struct net_device *netdev = priv->netdev;
1527+
struct mlx5_core_dev *mdev = priv->mdev;
1528+
u16 max_mtu;
1529+
1530+
netdev->min_mtu = ETH_MIN_MTU;
1531+
mlx5_query_port_max_mtu(mdev, &max_mtu, 1);
1532+
netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu);
1533+
}
1534+
1535+
static int uplink_rep_async_event(struct notifier_block *nb, unsigned long event, void *data)
1536+
{
1537+
struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, events_nb);
1538+
struct mlx5_eqe *eqe = data;
1539+
1540+
if (event != MLX5_EVENT_TYPE_PORT_CHANGE)
1541+
return NOTIFY_DONE;
1542+
1543+
switch (eqe->sub_type) {
1544+
case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
1545+
case MLX5_PORT_CHANGE_SUBTYPE_ACTIVE:
1546+
queue_work(priv->wq, &priv->update_carrier_work);
1547+
break;
1548+
default:
1549+
return NOTIFY_DONE;
1550+
}
1551+
1552+
return NOTIFY_OK;
1553+
}
1554+
1555+
static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
1556+
{
1557+
struct net_device *netdev = priv->netdev;
1558+
struct mlx5_core_dev *mdev = priv->mdev;
1559+
u16 max_mtu;
1560+
1561+
netdev->min_mtu = ETH_MIN_MTU;
1562+
mlx5_query_port_max_mtu(priv->mdev, &max_mtu, 1);
1563+
netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu);
1564+
mlx5e_set_dev_port_mtu(priv);
1565+
1566+
mlx5_lag_add(mdev, netdev);
1567+
priv->events_nb.notifier_call = uplink_rep_async_event;
1568+
mlx5_notifier_register(mdev, &priv->events_nb);
1569+
#ifdef CONFIG_MLX5_CORE_EN_DCB
1570+
mlx5e_dcbnl_initialize(priv);
1571+
mlx5e_dcbnl_init_app(priv);
1572+
#endif
1573+
}
1574+
1575+
static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
1576+
{
1577+
struct mlx5_core_dev *mdev = priv->mdev;
1578+
1579+
#ifdef CONFIG_MLX5_CORE_EN_DCB
1580+
mlx5e_dcbnl_delete_app(priv);
1581+
#endif
1582+
mlx5_notifier_unregister(mdev, &priv->events_nb);
1583+
mlx5_lag_remove(mdev);
1584+
}
1585+
1586+
static const struct mlx5e_profile mlx5e_vf_rep_profile = {
15241587
.init = mlx5e_init_rep,
15251588
.cleanup = mlx5e_cleanup_rep,
15261589
.init_rx = mlx5e_init_rep_rx,
15271590
.cleanup_rx = mlx5e_cleanup_rep_rx,
15281591
.init_tx = mlx5e_init_rep_tx,
15291592
.cleanup_tx = mlx5e_cleanup_rep_tx,
1530-
.update_stats = mlx5e_rep_update_hw_counters,
1531-
.update_carrier = NULL,
1593+
.enable = mlx5e_vf_rep_enable,
1594+
.update_stats = mlx5e_vf_rep_update_hw_counters,
15321595
.rx_handlers.handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
15331596
.rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
15341597
.max_tc = 1,
15351598
};
15361599

1600+
static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
1601+
.init = mlx5e_init_rep,
1602+
.cleanup = mlx5e_cleanup_rep,
1603+
.init_rx = mlx5e_init_rep_rx,
1604+
.cleanup_rx = mlx5e_cleanup_rep_rx,
1605+
.init_tx = mlx5e_init_rep_tx,
1606+
.cleanup_tx = mlx5e_cleanup_rep_tx,
1607+
.enable = mlx5e_uplink_rep_enable,
1608+
.disable = mlx5e_uplink_rep_disable,
1609+
.update_stats = mlx5e_uplink_rep_update_hw_counters,
1610+
.update_carrier = mlx5e_update_carrier,
1611+
.rx_handlers.handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
1612+
.rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
1613+
.max_tc = MLX5E_MAX_NUM_TC,
1614+
};
1615+
15371616
/* e-Switch vport representors */
15381617
static int
15391618
mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
15401619
{
1620+
const struct mlx5e_profile *profile;
15411621
struct mlx5e_rep_priv *rpriv;
15421622
struct net_device *netdev;
15431623
int nch, err;
@@ -1550,7 +1630,8 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
15501630
rpriv->rep = rep;
15511631

15521632
nch = mlx5e_get_max_num_channels(dev);
1553-
netdev = mlx5e_create_netdev(dev, &mlx5e_rep_profile, nch, rpriv);
1633+
profile = (rep->vport == FDB_UPLINK_VPORT) ? &mlx5e_uplink_rep_profile : &mlx5e_vf_rep_profile;
1634+
netdev = mlx5e_create_netdev(dev, profile, nch, rpriv);
15541635
if (!netdev) {
15551636
pr_warn("Failed to create representor netdev for vport %d\n",
15561637
rep->vport);

0 commit comments

Comments
 (0)