return hash_value;
 }
 
+/**
+ * igb_i21x_hw_doublecheck - double checks potential HW issue in i21X
+ * @hw: pointer to the HW structure
+ *
+ * Checks if multicast array is wrote correctly
+ * If not then rewrites again to register
+ **/
+static void igb_i21x_hw_doublecheck(struct e1000_hw *hw)
+{
+       bool is_failed;
+       int i;
+
+       do {
+               is_failed = false;
+               for (i = hw->mac.mta_reg_count - 1; i >= 0; i--) {
+                       if (array_rd32(E1000_MTA, i) != hw->mac.mta_shadow[i]) {
+                               is_failed = true;
+                               array_wr32(E1000_MTA, i, hw->mac.mta_shadow[i]);
+                               wrfl();
+                               break;
+                       }
+               }
+       } while (is_failed);
+}
+
 /**
  *  igb_update_mc_addr_list - Update Multicast addresses
  *  @hw: pointer to the HW structure
        for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
                array_wr32(E1000_MTA, i, hw->mac.mta_shadow[i]);
        wrfl();
+       if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211)
+               igb_i21x_hw_doublecheck(hw);
 }
 
 /**