@@ -1194,19 +1194,20 @@ static int mlx5e_vf_rep_change_mtu(struct net_device *netdev, int new_mtu)
1194
1194
return mlx5e_change_mtu (netdev , new_mtu , NULL );
1195
1195
}
1196
1196
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 )
1198
1198
{
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 );
1205
1200
}
1206
1201
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 )
1208
1203
{
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 ;
1210
1211
}
1211
1212
1212
1213
static const struct switchdev_ops mlx5e_rep_switchdev_ops = {
@@ -1226,9 +1227,10 @@ static const struct net_device_ops mlx5e_netdev_ops_vf_rep = {
1226
1227
};
1227
1228
1228
1229
static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
1229
- .ndo_open = mlx5e_uplink_rep_open ,
1230
+ .ndo_open = mlx5e_open ,
1230
1231
.ndo_stop = mlx5e_close ,
1231
1232
.ndo_start_xmit = mlx5e_xmit ,
1233
+ .ndo_set_mac_address = mlx5e_uplink_rep_set_mac ,
1232
1234
.ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name ,
1233
1235
.ndo_setup_tc = mlx5e_rep_setup_tc ,
1234
1236
.ndo_get_stats64 = mlx5e_get_stats ,
@@ -1280,13 +1282,16 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
1280
1282
struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
1281
1283
struct mlx5_eswitch_rep * rep = rpriv -> rep ;
1282
1284
struct mlx5_core_dev * mdev = priv -> mdev ;
1283
- u16 max_mtu ;
1284
1285
1285
1286
if (rep -> vport == FDB_UPLINK_VPORT ) {
1286
1287
SET_NETDEV_DEV (netdev , & priv -> mdev -> pdev -> dev );
1287
1288
netdev -> netdev_ops = & mlx5e_netdev_ops_uplink_rep ;
1288
1289
/* we want a persistent mac for the uplink rep */
1289
1290
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
1290
1295
} else {
1291
1296
netdev -> netdev_ops = & mlx5e_netdev_ops_vf_rep ;
1292
1297
eth_hw_addr_random (netdev );
@@ -1310,10 +1315,6 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
1310
1315
netdev -> hw_features |= NETIF_F_RXCSUM ;
1311
1316
1312
1317
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 );
1317
1318
}
1318
1319
1319
1320
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)
1520
1521
}
1521
1522
}
1522
1523
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 = {
1524
1587
.init = mlx5e_init_rep ,
1525
1588
.cleanup = mlx5e_cleanup_rep ,
1526
1589
.init_rx = mlx5e_init_rep_rx ,
1527
1590
.cleanup_rx = mlx5e_cleanup_rep_rx ,
1528
1591
.init_tx = mlx5e_init_rep_tx ,
1529
1592
.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 ,
1532
1595
.rx_handlers .handle_rx_cqe = mlx5e_handle_rx_cqe_rep ,
1533
1596
.rx_handlers .handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq ,
1534
1597
.max_tc = 1 ,
1535
1598
};
1536
1599
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
+
1537
1616
/* e-Switch vport representors */
1538
1617
static int
1539
1618
mlx5e_vport_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
1540
1619
{
1620
+ const struct mlx5e_profile * profile ;
1541
1621
struct mlx5e_rep_priv * rpriv ;
1542
1622
struct net_device * netdev ;
1543
1623
int nch , err ;
@@ -1550,7 +1630,8 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1550
1630
rpriv -> rep = rep ;
1551
1631
1552
1632
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 );
1554
1635
if (!netdev ) {
1555
1636
pr_warn ("Failed to create representor netdev for vport %d\n" ,
1556
1637
rep -> vport );
0 commit comments