mirror of https://gitee.com/openkylin/linux.git
ixgbe: Correctly set SAN MAC RAR pool to default pool of PF
This change corrects an issue in which an FCoE enabled adapter was always setting the FCoE SAN MAC MPSAR register to 0x1. This results in the first VF being assigned the SAN MAC address in the case of SR-IOV and as such is incorrect. To resolve this I am adding a new function that will update the SAN MAC pool address after reset. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
7c8ae65a62
commit
7fa7c9dcad
|
@ -1025,6 +1025,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|||
hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1,
|
||||
hw->mac.san_addr, 0, IXGBE_RAH_AV);
|
||||
|
||||
/* Save the SAN MAC RAR index */
|
||||
hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;
|
||||
|
||||
/* Reserve the last RAR for the SAN MAC address */
|
||||
hw->mac.num_rar_entries--;
|
||||
}
|
||||
|
@ -2106,6 +2109,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|||
.set_rar = &ixgbe_set_rar_generic,
|
||||
.clear_rar = &ixgbe_clear_rar_generic,
|
||||
.set_vmdq = &ixgbe_set_vmdq_generic,
|
||||
.set_vmdq_san_mac = &ixgbe_set_vmdq_san_mac_generic,
|
||||
.clear_vmdq = &ixgbe_clear_vmdq_generic,
|
||||
.init_rx_addrs = &ixgbe_init_rx_addrs_generic,
|
||||
.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
|
||||
|
|
|
@ -2847,6 +2847,31 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function should only be involved in the IOV mode.
|
||||
* In IOV mode, Default pool is next pool after the number of
|
||||
* VFs advertized and not 0.
|
||||
* MPSAR table needs to be updated for SAN_MAC RAR [hw->mac.san_mac_rar_index]
|
||||
*
|
||||
* ixgbe_set_vmdq_san_mac - Associate default VMDq pool index with a rx address
|
||||
* @hw: pointer to hardware struct
|
||||
* @vmdq: VMDq pool index
|
||||
**/
|
||||
s32 ixgbe_set_vmdq_san_mac_generic(struct ixgbe_hw *hw, u32 vmdq)
|
||||
{
|
||||
u32 rar = hw->mac.san_mac_rar_index;
|
||||
|
||||
if (vmdq < 32) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 1 << vmdq);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0);
|
||||
} else {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 1 << (vmdq - 32));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_init_uta_tables_generic - Initialize the Unicast Table Array
|
||||
* @hw: pointer to hardware structure
|
||||
|
|
|
@ -85,6 +85,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask);
|
|||
void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask);
|
||||
s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr);
|
||||
s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
s32 ixgbe_set_vmdq_san_mac_generic(struct ixgbe_hw *hw, u32 vmdq);
|
||||
s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan,
|
||||
|
|
|
@ -4119,6 +4119,10 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
|
|||
|
||||
/* reprogram the RAR[0] in case user changed it. */
|
||||
hw->mac.ops.set_rar(hw, 0, hw->mac.addr, VMDQ_P(0), IXGBE_RAH_AV);
|
||||
|
||||
/* update SAN MAC vmdq pool selection */
|
||||
if (hw->mac.san_mac_rar_index)
|
||||
hw->mac.ops.set_vmdq_san_mac(hw, VMDQ_P(0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6509,12 +6513,15 @@ static int ixgbe_add_sanmac_netdev(struct net_device *dev)
|
|||
{
|
||||
int err = 0;
|
||||
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
||||
struct ixgbe_mac_info *mac = &adapter->hw.mac;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
||||
if (is_valid_ether_addr(mac->san_addr)) {
|
||||
if (is_valid_ether_addr(hw->mac.san_addr)) {
|
||||
rtnl_lock();
|
||||
err = dev_addr_add(dev, mac->san_addr, NETDEV_HW_ADDR_T_SAN);
|
||||
err = dev_addr_add(dev, hw->mac.san_addr, NETDEV_HW_ADDR_T_SAN);
|
||||
rtnl_unlock();
|
||||
|
||||
/* update SAN MAC vmdq pool selection */
|
||||
hw->mac.ops.set_vmdq_san_mac(hw, VMDQ_P(0));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -2847,6 +2847,7 @@ struct ixgbe_mac_operations {
|
|||
s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32, u32);
|
||||
s32 (*clear_rar)(struct ixgbe_hw *, u32);
|
||||
s32 (*set_vmdq)(struct ixgbe_hw *, u32, u32);
|
||||
s32 (*set_vmdq_san_mac)(struct ixgbe_hw *, u32);
|
||||
s32 (*clear_vmdq)(struct ixgbe_hw *, u32, u32);
|
||||
s32 (*init_rx_addrs)(struct ixgbe_hw *);
|
||||
s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
|
||||
|
@ -2922,6 +2923,7 @@ struct ixgbe_mac_info {
|
|||
bool orig_link_settings_stored;
|
||||
bool autotry_restart;
|
||||
u8 flags;
|
||||
u8 san_mac_rar_index;
|
||||
struct ixgbe_thermal_sensor_data thermal_sensor_data;
|
||||
};
|
||||
|
||||
|
|
|
@ -156,6 +156,9 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||
hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1,
|
||||
hw->mac.san_addr, 0, IXGBE_RAH_AV);
|
||||
|
||||
/* Save the SAN MAC RAR index */
|
||||
hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;
|
||||
|
||||
/* Reserve the last RAR for the SAN MAC address */
|
||||
hw->mac.num_rar_entries--;
|
||||
}
|
||||
|
@ -832,6 +835,7 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
|
|||
.set_rar = &ixgbe_set_rar_generic,
|
||||
.clear_rar = &ixgbe_clear_rar_generic,
|
||||
.set_vmdq = &ixgbe_set_vmdq_generic,
|
||||
.set_vmdq_san_mac = &ixgbe_set_vmdq_san_mac_generic,
|
||||
.clear_vmdq = &ixgbe_clear_vmdq_generic,
|
||||
.init_rx_addrs = &ixgbe_init_rx_addrs_generic,
|
||||
.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
|
||||
|
|
Loading…
Reference in New Issue