diff options
Diffstat (limited to 'drivers/net/ixgbevf/vf.c')
-rw-r--r-- | drivers/net/ixgbevf/vf.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/net/ixgbevf/vf.c b/drivers/net/ixgbevf/vf.c index 4b5dec0ec140..f457c52b5ed4 100644 --- a/drivers/net/ixgbevf/vf.c +++ b/drivers/net/ixgbevf/vf.c | |||
@@ -252,22 +252,18 @@ static s32 ixgbevf_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, | |||
252 | /** | 252 | /** |
253 | * ixgbevf_update_mc_addr_list_vf - Update Multicast addresses | 253 | * ixgbevf_update_mc_addr_list_vf - Update Multicast addresses |
254 | * @hw: pointer to the HW structure | 254 | * @hw: pointer to the HW structure |
255 | * @mc_addr_list: array of multicast addresses to program | 255 | * @netdev: pointer to net device structure |
256 | * @mc_addr_count: number of multicast addresses to program | ||
257 | * @next: caller supplied function to return next address in list | ||
258 | * | 256 | * |
259 | * Updates the Multicast Table Array. | 257 | * Updates the Multicast Table Array. |
260 | **/ | 258 | **/ |
261 | static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list, | 259 | static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, |
262 | u32 mc_addr_count, | 260 | struct net_device *netdev) |
263 | ixgbe_mc_addr_itr next) | ||
264 | { | 261 | { |
262 | struct dev_addr_list *dmi; | ||
265 | struct ixgbe_mbx_info *mbx = &hw->mbx; | 263 | struct ixgbe_mbx_info *mbx = &hw->mbx; |
266 | u32 msgbuf[IXGBE_VFMAILBOX_SIZE]; | 264 | u32 msgbuf[IXGBE_VFMAILBOX_SIZE]; |
267 | u16 *vector_list = (u16 *)&msgbuf[1]; | 265 | u16 *vector_list = (u16 *)&msgbuf[1]; |
268 | u32 vector; | ||
269 | u32 cnt, i; | 266 | u32 cnt, i; |
270 | u32 vmdq; | ||
271 | 267 | ||
272 | /* Each entry in the list uses 1 16 bit word. We have 30 | 268 | /* Each entry in the list uses 1 16 bit word. We have 30 |
273 | * 16 bit words available in our HW msg buffer (minus 1 for the | 269 | * 16 bit words available in our HW msg buffer (minus 1 for the |
@@ -278,13 +274,17 @@ static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list, | |||
278 | * addresses except for in large enterprise network environments. | 274 | * addresses except for in large enterprise network environments. |
279 | */ | 275 | */ |
280 | 276 | ||
281 | cnt = (mc_addr_count > 30) ? 30 : mc_addr_count; | 277 | cnt = netdev_mc_count(netdev); |
278 | if (cnt > 30) | ||
279 | cnt = 30; | ||
282 | msgbuf[0] = IXGBE_VF_SET_MULTICAST; | 280 | msgbuf[0] = IXGBE_VF_SET_MULTICAST; |
283 | msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT; | 281 | msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT; |
284 | 282 | ||
285 | for (i = 0; i < cnt; i++) { | 283 | i = 0; |
286 | vector = ixgbevf_mta_vector(hw, next(hw, &mc_addr_list, &vmdq)); | 284 | netdev_for_each_mc_addr(dmi, netdev) { |
287 | vector_list[i] = vector; | 285 | if (i == cnt) |
286 | break; | ||
287 | vector_list[i++] = ixgbevf_mta_vector(hw, dmi->dmi_addr); | ||
288 | } | 288 | } |
289 | 289 | ||
290 | mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE); | 290 | mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE); |