diff options
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 3f5c350716bb..0bd1294ba517 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | |||
@@ -1871,7 +1871,12 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, | |||
1871 | if (enable_addr != 0) | 1871 | if (enable_addr != 0) |
1872 | rar_high |= IXGBE_RAH_AV; | 1872 | rar_high |= IXGBE_RAH_AV; |
1873 | 1873 | ||
1874 | /* Record lower 32 bits of MAC address and then make | ||
1875 | * sure that write is flushed to hardware before writing | ||
1876 | * the upper 16 bits and setting the valid bit. | ||
1877 | */ | ||
1874 | IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low); | 1878 | IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low); |
1879 | IXGBE_WRITE_FLUSH(hw); | ||
1875 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); | 1880 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); |
1876 | 1881 | ||
1877 | return 0; | 1882 | return 0; |
@@ -1903,8 +1908,13 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index) | |||
1903 | rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index)); | 1908 | rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index)); |
1904 | rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV); | 1909 | rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV); |
1905 | 1910 | ||
1906 | IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0); | 1911 | /* Clear the address valid bit and upper 16 bits of the address |
1912 | * before clearing the lower bits. This way we aren't updating | ||
1913 | * a live filter. | ||
1914 | */ | ||
1907 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); | 1915 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); |
1916 | IXGBE_WRITE_FLUSH(hw); | ||
1917 | IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0); | ||
1908 | 1918 | ||
1909 | /* clear VMDq pool/queue selection for this RAR */ | 1919 | /* clear VMDq pool/queue selection for this RAR */ |
1910 | hw->mac.ops.clear_vmdq(hw, index, IXGBE_CLEAR_VMDQ_ALL); | 1920 | hw->mac.ops.clear_vmdq(hw, index, IXGBE_CLEAR_VMDQ_ALL); |