aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_common.c12
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);