@@ -1007,6 +1007,7 @@ static int nfp_net_set_config_and_enable(struct nfp_net *nn)
1007
1007
new_ctrl |= NFP_NET_CFG_CTRL_RINGCFG ;
1008
1008
1009
1009
nn_writel (nn , NFP_NET_CFG_CTRL , new_ctrl );
1010
+ nn_writel (nn , NFP_NET_CFG_CTRL_WORD1 , nn -> dp .ctrl_w1 );
1010
1011
err = nfp_net_reconfig (nn , update );
1011
1012
if (err ) {
1012
1013
nfp_net_clear_config_and_disable (nn );
@@ -1333,18 +1334,59 @@ int nfp_ctrl_open(struct nfp_net *nn)
1333
1334
return err ;
1334
1335
}
1335
1336
1337
+ static int nfp_net_mc_cfg (struct net_device * netdev , const unsigned char * addr , const u32 cmd )
1338
+ {
1339
+ struct nfp_net * nn = netdev_priv (netdev );
1340
+ int ret ;
1341
+
1342
+ ret = nfp_net_mbox_lock (nn , NFP_NET_CFG_MULTICAST_SZ );
1343
+ if (ret )
1344
+ return ret ;
1345
+
1346
+ nn_writel (nn , nn -> tlv_caps .mbox_off + NFP_NET_CFG_MULTICAST_MAC_HI ,
1347
+ get_unaligned_be32 (addr ));
1348
+ nn_writew (nn , nn -> tlv_caps .mbox_off + NFP_NET_CFG_MULTICAST_MAC_LO ,
1349
+ get_unaligned_be16 (addr + 4 ));
1350
+
1351
+ return nfp_net_mbox_reconfig_and_unlock (nn , cmd );
1352
+ }
1353
+
1354
+ static int nfp_net_mc_sync (struct net_device * netdev , const unsigned char * addr )
1355
+ {
1356
+ struct nfp_net * nn = netdev_priv (netdev );
1357
+
1358
+ if (netdev_mc_count (netdev ) > NFP_NET_CFG_MAC_MC_MAX ) {
1359
+ nn_err (nn , "Requested number of MC addresses (%d) exceeds maximum (%d).\n" ,
1360
+ netdev_mc_count (netdev ), NFP_NET_CFG_MAC_MC_MAX );
1361
+ return - EINVAL ;
1362
+ }
1363
+
1364
+ return nfp_net_mc_cfg (netdev , addr , NFP_NET_CFG_MBOX_CMD_MULTICAST_ADD );
1365
+ }
1366
+
1367
+ static int nfp_net_mc_unsync (struct net_device * netdev , const unsigned char * addr )
1368
+ {
1369
+ return nfp_net_mc_cfg (netdev , addr , NFP_NET_CFG_MBOX_CMD_MULTICAST_DEL );
1370
+ }
1371
+
1336
1372
static void nfp_net_set_rx_mode (struct net_device * netdev )
1337
1373
{
1338
1374
struct nfp_net * nn = netdev_priv (netdev );
1339
- u32 new_ctrl ;
1375
+ u32 new_ctrl , new_ctrl_w1 ;
1340
1376
1341
1377
new_ctrl = nn -> dp .ctrl ;
1378
+ new_ctrl_w1 = nn -> dp .ctrl_w1 ;
1342
1379
1343
1380
if (!netdev_mc_empty (netdev ) || netdev -> flags & IFF_ALLMULTI )
1344
1381
new_ctrl |= nn -> cap & NFP_NET_CFG_CTRL_L2MC ;
1345
1382
else
1346
1383
new_ctrl &= ~NFP_NET_CFG_CTRL_L2MC ;
1347
1384
1385
+ if (netdev -> flags & IFF_ALLMULTI )
1386
+ new_ctrl_w1 &= ~NFP_NET_CFG_CTRL_MCAST_FILTER ;
1387
+ else
1388
+ new_ctrl_w1 |= nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER ;
1389
+
1348
1390
if (netdev -> flags & IFF_PROMISC ) {
1349
1391
if (nn -> cap & NFP_NET_CFG_CTRL_PROMISC )
1350
1392
new_ctrl |= NFP_NET_CFG_CTRL_PROMISC ;
@@ -1354,13 +1396,21 @@ static void nfp_net_set_rx_mode(struct net_device *netdev)
1354
1396
new_ctrl &= ~NFP_NET_CFG_CTRL_PROMISC ;
1355
1397
}
1356
1398
1357
- if (new_ctrl == nn -> dp .ctrl )
1399
+ if ((nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER ) &&
1400
+ __dev_mc_sync (netdev , nfp_net_mc_sync , nfp_net_mc_unsync ))
1401
+ netdev_err (netdev , "Sync mc address failed\n" );
1402
+
1403
+ if (new_ctrl == nn -> dp .ctrl && new_ctrl_w1 == nn -> dp .ctrl_w1 )
1358
1404
return ;
1359
1405
1360
- nn_writel (nn , NFP_NET_CFG_CTRL , new_ctrl );
1406
+ if (new_ctrl != nn -> dp .ctrl )
1407
+ nn_writel (nn , NFP_NET_CFG_CTRL , new_ctrl );
1408
+ if (new_ctrl_w1 != nn -> dp .ctrl_w1 )
1409
+ nn_writel (nn , NFP_NET_CFG_CTRL_WORD1 , new_ctrl_w1 );
1361
1410
nfp_net_reconfig_post (nn , NFP_NET_CFG_UPDATE_GEN );
1362
1411
1363
1412
nn -> dp .ctrl = new_ctrl ;
1413
+ nn -> dp .ctrl_w1 = new_ctrl_w1 ;
1364
1414
}
1365
1415
1366
1416
static void nfp_net_rss_init_itbl (struct nfp_net * nn )
@@ -2092,7 +2142,7 @@ void nfp_net_info(struct nfp_net *nn)
2092
2142
nn -> fw_ver .extend , nn -> fw_ver .class ,
2093
2143
nn -> fw_ver .major , nn -> fw_ver .minor ,
2094
2144
nn -> max_mtu );
2095
- nn_info (nn , "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n" ,
2145
+ nn_info (nn , "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s \n" ,
2096
2146
nn -> cap ,
2097
2147
nn -> cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "" ,
2098
2148
nn -> cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "" ,
@@ -2120,6 +2170,7 @@ void nfp_net_info(struct nfp_net *nn)
2120
2170
nn -> cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ?
2121
2171
"RXCSUM_COMPLETE " : "" ,
2122
2172
nn -> cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "" ,
2173
+ nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER ? "MULTICAST_FILTER " : "" ,
2123
2174
nfp_app_extra_cap (nn -> app , nn ));
2124
2175
}
2125
2176
@@ -2548,13 +2599,17 @@ int nfp_net_init(struct nfp_net *nn)
2548
2599
if (nn -> cap & NFP_NET_CFG_CTRL_TXRWB )
2549
2600
nn -> dp .ctrl |= NFP_NET_CFG_CTRL_TXRWB ;
2550
2601
2602
+ if (nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER )
2603
+ nn -> dp .ctrl_w1 |= NFP_NET_CFG_CTRL_MCAST_FILTER ;
2604
+
2551
2605
/* Stash the re-configuration queue away. First odd queue in TX Bar */
2552
2606
nn -> qcp_cfg = nn -> tx_bar + NFP_QCP_QUEUE_ADDR_SZ ;
2553
2607
2554
2608
/* Make sure the FW knows the netdev is supposed to be disabled here */
2555
2609
nn_writel (nn , NFP_NET_CFG_CTRL , 0 );
2556
2610
nn_writeq (nn , NFP_NET_CFG_TXRS_ENABLE , 0 );
2557
2611
nn_writeq (nn , NFP_NET_CFG_RXRS_ENABLE , 0 );
2612
+ nn_writel (nn , NFP_NET_CFG_CTRL_WORD1 , 0 );
2558
2613
err = nfp_net_reconfig (nn , NFP_NET_CFG_UPDATE_RING |
2559
2614
NFP_NET_CFG_UPDATE_GEN );
2560
2615
if (err )
0 commit comments