Signed-off-by: Jiri Pirko <jpirko@xxxxxxxxxx> --- drivers/net/e1000e/netdev.c | 34 +++++++++++++++++++--------------- 1 files changed, 19 insertions(+), 15 deletions(-) diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 3769248..97cd106 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c @@ -2529,6 +2529,17 @@ static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, } /** + * e1000_mc_walker - helper function + **/ +static void e1000_mc_walker(void *data, unsigned char *addr) +{ + u8 **mta_list_i = data; + + memcpy(*mta_list_i, addr, ETH_ALEN); + *mta_list_i += ETH_ALEN; +} + +/** * e1000_set_multi - Multicast and Promiscuous mode set * @netdev: network interface device structure * @@ -2542,10 +2553,9 @@ static void e1000_set_multi(struct net_device *netdev) struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; struct e1000_mac_info *mac = &hw->mac; - struct dev_mc_list *mc_ptr; - u8 *mta_list; + u8 *mta_list, *mta_list_i; u32 rctl; - int i; + int mc_count; /* Check for Promiscuous and All Multicast modes */ @@ -2567,23 +2577,17 @@ static void e1000_set_multi(struct net_device *netdev) ew32(RCTL, rctl); - if (netdev->mc_count) { - mta_list = kmalloc(netdev->mc_count * 6, GFP_ATOMIC); + mc_count = netdev_mc_count(netdev); + if (mc_count) { + mta_list = kmalloc(mc_count * ETH_ALEN, GFP_ATOMIC); if (!mta_list) return; /* prepare a packed array of only addresses. */ - mc_ptr = netdev->mc_list; - - for (i = 0; i < netdev->mc_count; i++) { - if (!mc_ptr) - break; - memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, - ETH_ALEN); - mc_ptr = mc_ptr->next; - } + mta_list_i = mta_list; + netdev_mc_walk(netdev, e1000_mc_walker, &mta_list_i); - e1000_update_mc_addr_list(hw, mta_list, i, 1, + e1000_update_mc_addr_list(hw, mta_list, mc_count, 1, mac->rar_entry_count); kfree(mta_list); } else { -- 1.6.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html