aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/e1000e/82571.c28
-rw-r--r--drivers/net/e1000e/e1000.h4
-rw-r--r--drivers/net/e1000e/hw.h6
-rw-r--r--drivers/net/e1000e/lib.c58
-rw-r--r--drivers/net/e1000e/netdev.c20
5 files changed, 27 insertions, 89 deletions
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c
index 7674a91824b..3c95acb3a87 100644
--- a/drivers/net/e1000e/82571.c
+++ b/drivers/net/e1000e/82571.c
@@ -1234,32 +1234,6 @@ static s32 e1000_led_on_82574(struct e1000_hw *hw)
1234} 1234}
1235 1235
1236/** 1236/**
1237 * e1000_update_mc_addr_list_82571 - Update Multicast addresses
1238 * @hw: pointer to the HW structure
1239 * @mc_addr_list: array of multicast addresses to program
1240 * @mc_addr_count: number of multicast addresses to program
1241 * @rar_used_count: the first RAR register free to program
1242 * @rar_count: total number of supported Receive Address Registers
1243 *
1244 * Updates the Receive Address Registers and Multicast Table Array.
1245 * The caller must have a packed mc_addr_list of multicast addresses.
1246 * The parameter rar_count will usually be hw->mac.rar_entry_count
1247 * unless there are workarounds that change this.
1248 **/
1249static void e1000_update_mc_addr_list_82571(struct e1000_hw *hw,
1250 u8 *mc_addr_list,
1251 u32 mc_addr_count,
1252 u32 rar_used_count,
1253 u32 rar_count)
1254{
1255 if (e1000e_get_laa_state_82571(hw))
1256 rar_count--;
1257
1258 e1000e_update_mc_addr_list_generic(hw, mc_addr_list, mc_addr_count,
1259 rar_used_count, rar_count);
1260}
1261
1262/**
1263 * e1000_setup_link_82571 - Setup flow control and link settings 1237 * e1000_setup_link_82571 - Setup flow control and link settings
1264 * @hw: pointer to the HW structure 1238 * @hw: pointer to the HW structure
1265 * 1239 *
@@ -1731,7 +1705,7 @@ static struct e1000_mac_operations e82571_mac_ops = {
1731 /* .get_link_up_info: media type dependent */ 1705 /* .get_link_up_info: media type dependent */
1732 /* .led_on: mac type dependent */ 1706 /* .led_on: mac type dependent */
1733 .led_off = e1000e_led_off_generic, 1707 .led_off = e1000e_led_off_generic,
1734 .update_mc_addr_list = e1000_update_mc_addr_list_82571, 1708 .update_mc_addr_list = e1000e_update_mc_addr_list_generic,
1735 .write_vfta = e1000_write_vfta_generic, 1709 .write_vfta = e1000_write_vfta_generic,
1736 .clear_vfta = e1000_clear_vfta_82571, 1710 .clear_vfta = e1000_clear_vfta_82571,
1737 .reset_hw = e1000_reset_hw_82571, 1711 .reset_hw = e1000_reset_hw_82571,
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h
index 8b311ce0400..aec378e7441 100644
--- a/drivers/net/e1000e/e1000.h
+++ b/drivers/net/e1000e/e1000.h
@@ -518,9 +518,7 @@ extern void e1000_clear_vfta_generic(struct e1000_hw *hw);
518extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); 518extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count);
519extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, 519extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
520 u8 *mc_addr_list, 520 u8 *mc_addr_list,
521 u32 mc_addr_count, 521 u32 mc_addr_count);
522 u32 rar_used_count,
523 u32 rar_count);
524extern void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); 522extern void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index);
525extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw); 523extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw);
526extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop); 524extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop);
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h
index 9cac5d9b94b..8bdcd5f24ef 100644
--- a/drivers/net/e1000e/hw.h
+++ b/drivers/net/e1000e/hw.h
@@ -753,7 +753,7 @@ struct e1000_mac_operations {
753 s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); 753 s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *);
754 s32 (*led_on)(struct e1000_hw *); 754 s32 (*led_on)(struct e1000_hw *);
755 s32 (*led_off)(struct e1000_hw *); 755 s32 (*led_off)(struct e1000_hw *);
756 void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32, u32, u32); 756 void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32);
757 s32 (*reset_hw)(struct e1000_hw *); 757 s32 (*reset_hw)(struct e1000_hw *);
758 s32 (*init_hw)(struct e1000_hw *); 758 s32 (*init_hw)(struct e1000_hw *);
759 s32 (*setup_link)(struct e1000_hw *); 759 s32 (*setup_link)(struct e1000_hw *);
@@ -819,6 +819,10 @@ struct e1000_mac_info {
819 u16 ifs_ratio; 819 u16 ifs_ratio;
820 u16 ifs_step_size; 820 u16 ifs_step_size;
821 u16 mta_reg_count; 821 u16 mta_reg_count;
822
823 /* Maximum size of the MTA register table in all supported adapters */
824 #define MAX_MTA_REG 128
825 u32 mta_shadow[MAX_MTA_REG];
822 u16 rar_entry_count; 826 u16 rar_entry_count;
823 827
824 u8 forced_speed_duplex; 828 u8 forced_speed_duplex;
diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c
index 5f6b17148d3..2425ed11d5c 100644
--- a/drivers/net/e1000e/lib.c
+++ b/drivers/net/e1000e/lib.c
@@ -340,62 +340,34 @@ static u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
340 * @hw: pointer to the HW structure 340 * @hw: pointer to the HW structure
341 * @mc_addr_list: array of multicast addresses to program 341 * @mc_addr_list: array of multicast addresses to program
342 * @mc_addr_count: number of multicast addresses to program 342 * @mc_addr_count: number of multicast addresses to program
343 * @rar_used_count: the first RAR register free to program
344 * @rar_count: total number of supported Receive Address Registers
345 * 343 *
346 * Updates the Receive Address Registers and Multicast Table Array. 344 * Updates entire Multicast Table Array.
347 * The caller must have a packed mc_addr_list of multicast addresses. 345 * The caller must have a packed mc_addr_list of multicast addresses.
348 * The parameter rar_count will usually be hw->mac.rar_entry_count
349 * unless there are workarounds that change this.
350 **/ 346 **/
351void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, 347void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
352 u8 *mc_addr_list, u32 mc_addr_count, 348 u8 *mc_addr_list, u32 mc_addr_count)
353 u32 rar_used_count, u32 rar_count)
354{ 349{
355 u32 i; 350 u32 hash_value, hash_bit, hash_reg;
356 u32 *mcarray = kzalloc(hw->mac.mta_reg_count * sizeof(u32), GFP_ATOMIC); 351 int i;
357 352
358 if (!mcarray) { 353 /* clear mta_shadow */
359 printk(KERN_ERR "multicast array memory allocation failed\n"); 354 memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
360 return;
361 }
362 355
363 /* 356 /* update mta_shadow from mc_addr_list */
364 * Load the first set of multicast addresses into the exact 357 for (i = 0; (u32) i < mc_addr_count; i++) {
365 * filters (RAR). If there are not enough to fill the RAR
366 * array, clear the filters.
367 */
368 for (i = rar_used_count; i < rar_count; i++) {
369 if (mc_addr_count) {
370 e1000e_rar_set(hw, mc_addr_list, i);
371 mc_addr_count--;
372 mc_addr_list += ETH_ALEN;
373 } else {
374 E1000_WRITE_REG_ARRAY(hw, E1000_RA, i << 1, 0);
375 e1e_flush();
376 E1000_WRITE_REG_ARRAY(hw, E1000_RA, (i << 1) + 1, 0);
377 e1e_flush();
378 }
379 }
380
381 /* Load any remaining multicast addresses into the hash table. */
382 for (; mc_addr_count > 0; mc_addr_count--) {
383 u32 hash_value, hash_reg, hash_bit, mta;
384 hash_value = e1000_hash_mc_addr(hw, mc_addr_list); 358 hash_value = e1000_hash_mc_addr(hw, mc_addr_list);
385 e_dbg("Hash value = 0x%03X\n", hash_value); 359
386 hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); 360 hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
387 hash_bit = hash_value & 0x1F; 361 hash_bit = hash_value & 0x1F;
388 mta = (1 << hash_bit);
389 mcarray[hash_reg] |= mta;
390 mc_addr_list += ETH_ALEN;
391 }
392 362
393 /* write the hash table completely */ 363 hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
394 for (i = 0; i < hw->mac.mta_reg_count; i++) 364 mc_addr_list += (ETH_ALEN);
395 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, mcarray[i]); 365 }
396 366
367 /* replace the entire MTA table */
368 for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
369 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]);
397 e1e_flush(); 370 e1e_flush();
398 kfree(mcarray);
399} 371}
400 372
401/** 373/**
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 0d5ef4c5c6d..3d57ca5482f 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -2536,22 +2536,14 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
2536 * @hw: pointer to the HW structure 2536 * @hw: pointer to the HW structure
2537 * @mc_addr_list: array of multicast addresses to program 2537 * @mc_addr_list: array of multicast addresses to program
2538 * @mc_addr_count: number of multicast addresses to program 2538 * @mc_addr_count: number of multicast addresses to program
2539 * @rar_used_count: the first RAR register free to program
2540 * @rar_count: total number of supported Receive Address Registers
2541 * 2539 *
2542 * Updates the Receive Address Registers and Multicast Table Array. 2540 * Updates the Multicast Table Array.
2543 * The caller must have a packed mc_addr_list of multicast addresses. 2541 * The caller must have a packed mc_addr_list of multicast addresses.
2544 * The parameter rar_count will usually be hw->mac.rar_entry_count
2545 * unless there are workarounds that change this. Currently no func pointer
2546 * exists and all implementations are handled in the generic version of this
2547 * function.
2548 **/ 2542 **/
2549static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, 2543static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
2550 u32 mc_addr_count, u32 rar_used_count, 2544 u32 mc_addr_count)
2551 u32 rar_count)
2552{ 2545{
2553 hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count, 2546 hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count);
2554 rar_used_count, rar_count);
2555} 2547}
2556 2548
2557/** 2549/**
@@ -2567,7 +2559,6 @@ static void e1000_set_multi(struct net_device *netdev)
2567{ 2559{
2568 struct e1000_adapter *adapter = netdev_priv(netdev); 2560 struct e1000_adapter *adapter = netdev_priv(netdev);
2569 struct e1000_hw *hw = &adapter->hw; 2561 struct e1000_hw *hw = &adapter->hw;
2570 struct e1000_mac_info *mac = &hw->mac;
2571 struct dev_mc_list *mc_ptr; 2562 struct dev_mc_list *mc_ptr;
2572 u8 *mta_list; 2563 u8 *mta_list;
2573 u32 rctl; 2564 u32 rctl;
@@ -2609,15 +2600,14 @@ static void e1000_set_multi(struct net_device *netdev)
2609 mc_ptr = mc_ptr->next; 2600 mc_ptr = mc_ptr->next;
2610 } 2601 }
2611 2602
2612 e1000_update_mc_addr_list(hw, mta_list, i, 1, 2603 e1000_update_mc_addr_list(hw, mta_list, i);
2613 mac->rar_entry_count);
2614 kfree(mta_list); 2604 kfree(mta_list);
2615 } else { 2605 } else {
2616 /* 2606 /*
2617 * if we're called from probe, we might not have 2607 * if we're called from probe, we might not have
2618 * anything to do here, so clear out the list 2608 * anything to do here, so clear out the list
2619 */ 2609 */
2620 e1000_update_mc_addr_list(hw, NULL, 0, 1, mac->rar_entry_count); 2610 e1000_update_mc_addr_list(hw, NULL, 0);
2621 } 2611 }
2622} 2612}
2623 2613