Commit 8998763a authored by Ngai-Mint Kwan's avatar Ngai-Mint Kwan Committed by Jeff Kirsher

fm10k: Fix multicast mode sync issues

Multicast mode checking is no longer a requirement to perform unicast
and multicast address syncs. Specifically, a device operating in
promiscuous and/or all multicast mode is not excluded. The issue occurs
when the netdev is pre-configured to either multicast mode and is
enabled for the first time. The multicast-group table in the Switch
Manager will be missing obvious multicast entries associated to this
netdev.

Changes were also made to disallow unicast and multicast syncs with
VLAN 0. The Switch Manager considers VLAN 0 to be an invalid entry.
Requests with VLAN 0 by the netdev are only generated when the driver is
freshly installed and the default VID is not set.
Signed-off-by: default avatarNgai-Mint Kwan <ngai-mint.kwan@intel.com>
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarKrishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 9de6a1a6
...@@ -877,7 +877,7 @@ static int __fm10k_uc_sync(struct net_device *dev, ...@@ -877,7 +877,7 @@ static int __fm10k_uc_sync(struct net_device *dev,
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
/* update table with current entries */ /* update table with current entries */
for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 0; for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 1;
vid < VLAN_N_VID; vid < VLAN_N_VID;
vid = fm10k_find_next_vlan(interface, vid)) { vid = fm10k_find_next_vlan(interface, vid)) {
err = hw->mac.ops.update_uc_addr(hw, glort, addr, err = hw->mac.ops.update_uc_addr(hw, glort, addr,
...@@ -940,7 +940,7 @@ static int __fm10k_mc_sync(struct net_device *dev, ...@@ -940,7 +940,7 @@ static int __fm10k_mc_sync(struct net_device *dev,
u16 vid, glort = interface->glort; u16 vid, glort = interface->glort;
/* update table with current entries */ /* update table with current entries */
for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 0; for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 1;
vid < VLAN_N_VID; vid < VLAN_N_VID;
vid = fm10k_find_next_vlan(interface, vid)) { vid = fm10k_find_next_vlan(interface, vid)) {
hw->mac.ops.update_mc_addr(hw, glort, addr, vid, sync); hw->mac.ops.update_mc_addr(hw, glort, addr, vid, sync);
...@@ -995,11 +995,8 @@ static void fm10k_set_rx_mode(struct net_device *dev) ...@@ -995,11 +995,8 @@ static void fm10k_set_rx_mode(struct net_device *dev)
} }
/* synchronize all of the addresses */ /* synchronize all of the addresses */
if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
__dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync); __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
__dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
}
fm10k_mbx_unlock(interface); fm10k_mbx_unlock(interface);
} }
...@@ -1037,7 +1034,7 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface) ...@@ -1037,7 +1034,7 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
hw->mac.ops.update_vlan(hw, 0, 0, true); hw->mac.ops.update_vlan(hw, 0, 0, true);
/* update table with current entries */ /* update table with current entries */
for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 0; for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 1;
vid < VLAN_N_VID; vid < VLAN_N_VID;
vid = fm10k_find_next_vlan(interface, vid)) { vid = fm10k_find_next_vlan(interface, vid)) {
hw->mac.ops.update_vlan(hw, vid, 0, true); hw->mac.ops.update_vlan(hw, vid, 0, true);
...@@ -1049,11 +1046,8 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface) ...@@ -1049,11 +1046,8 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode); hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode);
/* synchronize all of the addresses */ /* synchronize all of the addresses */
if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync);
__dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync); __dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync);
if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
__dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync);
}
fm10k_mbx_unlock(interface); fm10k_mbx_unlock(interface);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment