|
@@ -48,7 +48,11 @@ int ixgbe_set_vf_multicasts(struct ixgbe_adapter *adapter,
|
|
|
int entries, u16 *hash_list, u32 vf)
|
|
|
{
|
|
|
struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
int i;
|
|
|
+ u32 vector_bit;
|
|
|
+ u32 vector_reg;
|
|
|
+ u32 mta_reg;
|
|
|
|
|
|
/* only so many hash values supported */
|
|
|
entries = min(entries, IXGBE_MAX_VF_MC_ENTRIES);
|
|
@@ -68,8 +72,13 @@ int ixgbe_set_vf_multicasts(struct ixgbe_adapter *adapter,
|
|
|
vfinfo->vf_mc_hashes[i] = hash_list[i];;
|
|
|
}
|
|
|
|
|
|
- /* Flush and reset the mta with the new values */
|
|
|
- ixgbe_set_rx_mode(adapter->netdev);
|
|
|
+ for (i = 0; i < vfinfo->num_vf_mc_hashes; i++) {
|
|
|
+ vector_reg = (vfinfo->vf_mc_hashes[i] >> 5) & 0x7F;
|
|
|
+ vector_bit = vfinfo->vf_mc_hashes[i] & 0x1F;
|
|
|
+ mta_reg = IXGBE_READ_REG(hw, IXGBE_MTA(vector_reg));
|
|
|
+ mta_reg |= (1 << vector_bit);
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_MTA(vector_reg), mta_reg);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|