Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c58c47a authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

ixgbevf: convert to use netdev_for_each_mc_addr

parent 2853eb89
Loading
Loading
Loading
Loading
+1 −23
Original line number Original line Diff line number Diff line
@@ -1495,22 +1495,6 @@ static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
	}
	}
}
}


static u8 *ixgbevf_addr_list_itr(struct ixgbe_hw *hw, u8 **mc_addr_ptr,
				 u32 *vmdq)
{
	struct dev_mc_list *mc_ptr;
	u8 *addr = *mc_addr_ptr;
	*vmdq = 0;

	mc_ptr = container_of(addr, struct dev_mc_list, dmi_addr[0]);
	if (mc_ptr->next)
		*mc_addr_ptr = mc_ptr->next->dmi_addr;
	else
		*mc_addr_ptr = NULL;

	return addr;
}

/**
/**
 * ixgbevf_set_rx_mode - Multicast set
 * ixgbevf_set_rx_mode - Multicast set
 * @netdev: network interface device structure
 * @netdev: network interface device structure
@@ -1523,16 +1507,10 @@ static void ixgbevf_set_rx_mode(struct net_device *netdev)
{
{
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;
	u8 *addr_list = NULL;
	int addr_count = 0;


	/* reprogram multicast list */
	/* reprogram multicast list */
	addr_count = netdev_mc_count(netdev);
	if (addr_count)
		addr_list = netdev->mc_list->dmi_addr;
	if (hw->mac.ops.update_mc_addr_list)
	if (hw->mac.ops.update_mc_addr_list)
		hw->mac.ops.update_mc_addr_list(hw, addr_list, addr_count,
		hw->mac.ops.update_mc_addr_list(hw, netdev);
						ixgbevf_addr_list_itr);
}
}


static void ixgbevf_napi_enable_all(struct ixgbevf_adapter *adapter)
static void ixgbevf_napi_enable_all(struct ixgbevf_adapter *adapter)
+12 −12
Original line number Original line Diff line number Diff line
@@ -252,22 +252,18 @@ static s32 ixgbevf_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr,
/**
/**
 *  ixgbevf_update_mc_addr_list_vf - Update Multicast addresses
 *  ixgbevf_update_mc_addr_list_vf - Update Multicast addresses
 *  @hw: pointer to the HW structure
 *  @hw: pointer to the HW structure
 *  @mc_addr_list: array of multicast addresses to program
 *  @netdev: pointer to net device structure
 *  @mc_addr_count: number of multicast addresses to program
 *  @next: caller supplied function to return next address in list
 *
 *
 *  Updates the Multicast Table Array.
 *  Updates the Multicast Table Array.
 **/
 **/
static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw,
					u32 mc_addr_count,
					  struct net_device *netdev)
					ixgbe_mc_addr_itr next)
{
{
	struct dev_addr_list *dmi;
	struct ixgbe_mbx_info *mbx = &hw->mbx;
	struct ixgbe_mbx_info *mbx = &hw->mbx;
	u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
	u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
	u16 *vector_list = (u16 *)&msgbuf[1];
	u16 *vector_list = (u16 *)&msgbuf[1];
	u32 vector;
	u32 cnt, i;
	u32 cnt, i;
	u32 vmdq;


	/* Each entry in the list uses 1 16 bit word.  We have 30
	/* Each entry in the list uses 1 16 bit word.  We have 30
	 * 16 bit words available in our HW msg buffer (minus 1 for the
	 * 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,
	 * addresses except for in large enterprise network environments.
	 * addresses except for in large enterprise network environments.
	 */
	 */


	cnt = (mc_addr_count > 30) ? 30 : mc_addr_count;
	cnt = netdev_mc_count(netdev);
	if (cnt > 30)
		cnt = 30;
	msgbuf[0] = IXGBE_VF_SET_MULTICAST;
	msgbuf[0] = IXGBE_VF_SET_MULTICAST;
	msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT;
	msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT;


	for (i = 0; i < cnt; i++) {
	i = 0;
		vector = ixgbevf_mta_vector(hw, next(hw, &mc_addr_list, &vmdq));
	netdev_for_each_mc_addr(dmi, netdev) {
		vector_list[i] = vector;
		if (i == cnt)
			break;
		vector_list[i++] = ixgbevf_mta_vector(hw, dmi->dmi_addr);
	}
	}


	mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE);
	mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE);
+2 −2
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/if_ether.h>
#include <linux/if_ether.h>
#include <linux/netdevice.h>


#include "defines.h"
#include "defines.h"
#include "regs.h"
#include "regs.h"
@@ -62,8 +63,7 @@ struct ixgbe_mac_operations {
	/* RAR, Multicast, VLAN */
	/* RAR, Multicast, VLAN */
	s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32);
	s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32);
	s32 (*init_rx_addrs)(struct ixgbe_hw *);
	s32 (*init_rx_addrs)(struct ixgbe_hw *);
	s32 (*update_mc_addr_list)(struct ixgbe_hw *, u8 *, u32,
	s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
				   ixgbe_mc_addr_itr);
	s32 (*enable_mc)(struct ixgbe_hw *);
	s32 (*enable_mc)(struct ixgbe_hw *);
	s32 (*disable_mc)(struct ixgbe_hw *);
	s32 (*disable_mc)(struct ixgbe_hw *);
	s32 (*clear_vfta)(struct ixgbe_hw *);
	s32 (*clear_vfta)(struct ixgbe_hw *);