@@ -1007,6 +1007,7 @@ static int nfp_net_set_config_and_enable(struct nfp_net *nn)
10071007 new_ctrl |= NFP_NET_CFG_CTRL_RINGCFG ;
10081008
10091009 nn_writel (nn , NFP_NET_CFG_CTRL , new_ctrl );
1010+ nn_writel (nn , NFP_NET_CFG_CTRL_WORD1 , nn -> dp .ctrl_w1 );
10101011 err = nfp_net_reconfig (nn , update );
10111012 if (err ) {
10121013 nfp_net_clear_config_and_disable (nn );
@@ -1333,18 +1334,59 @@ int nfp_ctrl_open(struct nfp_net *nn)
13331334 return err ;
13341335}
13351336
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+
13361372static void nfp_net_set_rx_mode (struct net_device * netdev )
13371373{
13381374 struct nfp_net * nn = netdev_priv (netdev );
1339- u32 new_ctrl ;
1375+ u32 new_ctrl , new_ctrl_w1 ;
13401376
13411377 new_ctrl = nn -> dp .ctrl ;
1378+ new_ctrl_w1 = nn -> dp .ctrl_w1 ;
13421379
13431380 if (!netdev_mc_empty (netdev ) || netdev -> flags & IFF_ALLMULTI )
13441381 new_ctrl |= nn -> cap & NFP_NET_CFG_CTRL_L2MC ;
13451382 else
13461383 new_ctrl &= ~NFP_NET_CFG_CTRL_L2MC ;
13471384
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+
13481390 if (netdev -> flags & IFF_PROMISC ) {
13491391 if (nn -> cap & NFP_NET_CFG_CTRL_PROMISC )
13501392 new_ctrl |= NFP_NET_CFG_CTRL_PROMISC ;
@@ -1354,13 +1396,21 @@ static void nfp_net_set_rx_mode(struct net_device *netdev)
13541396 new_ctrl &= ~NFP_NET_CFG_CTRL_PROMISC ;
13551397 }
13561398
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 )
13581404 return ;
13591405
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 );
13611410 nfp_net_reconfig_post (nn , NFP_NET_CFG_UPDATE_GEN );
13621411
13631412 nn -> dp .ctrl = new_ctrl ;
1413+ nn -> dp .ctrl_w1 = new_ctrl_w1 ;
13641414}
13651415
13661416static void nfp_net_rss_init_itbl (struct nfp_net * nn )
@@ -2092,7 +2142,7 @@ void nfp_net_info(struct nfp_net *nn)
20922142 nn -> fw_ver .extend , nn -> fw_ver .class ,
20932143 nn -> fw_ver .major , nn -> fw_ver .minor ,
20942144 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" ,
20962146 nn -> cap ,
20972147 nn -> cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "" ,
20982148 nn -> cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "" ,
@@ -2120,6 +2170,7 @@ void nfp_net_info(struct nfp_net *nn)
21202170 nn -> cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ?
21212171 "RXCSUM_COMPLETE " : "" ,
21222172 nn -> cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "" ,
2173+ nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER ? "MULTICAST_FILTER " : "" ,
21232174 nfp_app_extra_cap (nn -> app , nn ));
21242175}
21252176
@@ -2548,13 +2599,17 @@ int nfp_net_init(struct nfp_net *nn)
25482599 if (nn -> cap & NFP_NET_CFG_CTRL_TXRWB )
25492600 nn -> dp .ctrl |= NFP_NET_CFG_CTRL_TXRWB ;
25502601
2602+ if (nn -> cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER )
2603+ nn -> dp .ctrl_w1 |= NFP_NET_CFG_CTRL_MCAST_FILTER ;
2604+
25512605 /* Stash the re-configuration queue away. First odd queue in TX Bar */
25522606 nn -> qcp_cfg = nn -> tx_bar + NFP_QCP_QUEUE_ADDR_SZ ;
25532607
25542608 /* Make sure the FW knows the netdev is supposed to be disabled here */
25552609 nn_writel (nn , NFP_NET_CFG_CTRL , 0 );
25562610 nn_writeq (nn , NFP_NET_CFG_TXRS_ENABLE , 0 );
25572611 nn_writeq (nn , NFP_NET_CFG_RXRS_ENABLE , 0 );
2612+ nn_writel (nn , NFP_NET_CFG_CTRL_WORD1 , 0 );
25582613 err = nfp_net_reconfig (nn , NFP_NET_CFG_UPDATE_RING |
25592614 NFP_NET_CFG_UPDATE_GEN );
25602615 if (err )
0 commit comments