From: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>

Signed-off-by: Philippe Gerum <r...@xenomai.org>
---
 kernel/drivers/net/drivers/igb/e1000_mac.c |  6 ++---
 kernel/drivers/net/drivers/igb/e1000_mac.h |  2 +-
 kernel/drivers/net/drivers/igb/igb_main.c  | 30 +++++-----------------
 3 files changed, 11 insertions(+), 27 deletions(-)

diff --git a/kernel/drivers/net/drivers/igb/e1000_mac.c 
b/kernel/drivers/net/drivers/igb/e1000_mac.c
index 500c92877..765604d5f 100644
--- a/kernel/drivers/net/drivers/igb/e1000_mac.c
+++ b/kernel/drivers/net/drivers/igb/e1000_mac.c
@@ -440,7 +440,7 @@ static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 
*mc_addr)
  *  The caller must have a packed mc_addr_list of multicast addresses.
  **/
 void igb_update_mc_addr_list(struct e1000_hw *hw,
-                            u8 *mc_addr_list, u32 mc_addr_count)
+                            struct rtdev_mc_list *mc_addr, u32 mc_addr_count)
 {
        u32 hash_value, hash_bit, hash_reg;
        int i;
@@ -450,13 +450,13 @@ void igb_update_mc_addr_list(struct e1000_hw *hw,
 
        /* update mta_shadow from mc_addr_list */
        for (i = 0; (u32) i < mc_addr_count; i++) {
-               hash_value = igb_hash_mc_addr(hw, mc_addr_list);
+               hash_value = igb_hash_mc_addr(hw, mc_addr->dmi_addr);
 
                hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
                hash_bit = hash_value & 0x1F;
 
                hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
-               mc_addr_list += (ETH_ALEN);
+               mc_addr = mc_addr->next;
        }
 
        /* replace the entire MTA table */
diff --git a/kernel/drivers/net/drivers/igb/e1000_mac.h 
b/kernel/drivers/net/drivers/igb/e1000_mac.h
index b50d57c5d..a3ad413a0 100644
--- a/kernel/drivers/net/drivers/igb/e1000_mac.h
+++ b/kernel/drivers/net/drivers/igb/e1000_mac.h
@@ -49,7 +49,7 @@ s32  igb_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 
*speed,
 s32  igb_id_led_init(struct e1000_hw *hw);
 s32  igb_led_off(struct e1000_hw *hw);
 void igb_update_mc_addr_list(struct e1000_hw *hw,
-                            u8 *mc_addr_list, u32 mc_addr_count);
+                       struct rtdev_mc_list *mc_addr, u32 mc_addr_count);
 s32  igb_setup_link(struct e1000_hw *hw);
 s32  igb_validate_mdi_setting(struct e1000_hw *hw);
 s32  igb_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg,
diff --git a/kernel/drivers/net/drivers/igb/igb_main.c 
b/kernel/drivers/net/drivers/igb/igb_main.c
index 1dc4732ee..9a3998719 100644
--- a/kernel/drivers/net/drivers/igb/igb_main.c
+++ b/kernel/drivers/net/drivers/igb/igb_main.c
@@ -2070,8 +2070,8 @@ static int igb_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
        netdev->map_rtskb = igb_map_rtskb;
        netdev->unmap_rtskb = igb_unmap_rtskb;
        netdev->do_ioctl = igb_ioctl;
+       netdev->set_multicast_list = igb_set_rx_mode;
 #if 0
-       netdev->set_multicast_list = igb_set_multi;
        netdev->set_mac_address = igb_set_mac;
        netdev->change_mtu = igb_change_mtu;
 
@@ -3370,34 +3370,18 @@ static int igb_write_mc_addr_list(struct rtnet_device 
*netdev)
 {
        struct igb_adapter *adapter = rtnetdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
-#if 0
-       struct netdev_hw_addr *ha;
-       u8  *mta_list;
-       int i;
-       if (netdev_mc_empty(netdev)) {
+       struct rtdev_mc_list *mc_addr = netdev->mc_list;
+       unsigned mc_addr_count = netdev->mc_count;
+
+       if (!mc_addr_count) {
                /* nothing to program, so clear mc list */
                igb_update_mc_addr_list(hw, NULL, 0);
-               igb_restore_vf_multicasts(adapter);
                return 0;
        }
 
-       mta_list = kzalloc(netdev_mc_count(netdev) * 6, GFP_ATOMIC);
-       if (!mta_list)
-               return -ENOMEM;
-
-       /* The shared function expects a packed array of only addresses. */
-       i = 0;
-       netdev_for_each_mc_addr(ha, netdev)
-               memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN);
+       igb_update_mc_addr_list(hw, mc_addr, mc_addr_count);
 
-       igb_update_mc_addr_list(hw, mta_list, i);
-       kfree(mta_list);
-
-       return netdev_mc_count(netdev);
-#else
-       igb_update_mc_addr_list(hw, NULL, 0);
-       return 0;
-#endif
+       return mc_addr_count;
 }
 
 /**
-- 
2.17.1


Reply via email to