Merge branch 'core/xen' into x86/xen
[safe/jmp/linux-2.6] / drivers / net / igb / e1000_82575.c
index e6dd387..f5e2e72 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007 Intel Corporation.
+  Copyright(c) 2007 - 2008 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -31,6 +31,7 @@
 
 #include <linux/types.h>
 #include <linux/slab.h>
+#include <linux/if_ether.h>
 
 #include "e1000_mac.h"
 #include "e1000_82575.h"
@@ -45,7 +46,6 @@ static s32  igb_get_cfg_done_82575(struct e1000_hw *);
 static s32  igb_init_hw_82575(struct e1000_hw *);
 static s32  igb_phy_hw_reset_sgmii_82575(struct e1000_hw *);
 static s32  igb_read_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16 *);
-static void igb_rar_set_82575(struct e1000_hw *, u8 *, u32);
 static s32  igb_reset_hw_82575(struct e1000_hw *);
 static s32  igb_set_d0_lplu_state_82575(struct e1000_hw *, bool);
 static s32  igb_setup_copper_link_82575(struct e1000_hw *);
@@ -84,6 +84,11 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
        case E1000_DEV_ID_82575GB_QUAD_COPPER:
                mac->type = e1000_82575;
                break;
+       case E1000_DEV_ID_82576:
+       case E1000_DEV_ID_82576_FIBER:
+       case E1000_DEV_ID_82576_SERDES:
+               mac->type = e1000_82576;
+               break;
        default:
                return -E1000_ERR_MAC_INIT;
                break;
@@ -128,6 +133,8 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
        mac->mta_reg_count = 128;
        /* Set rar entry count */
        mac->rar_entry_count = E1000_RAR_ENTRIES_82575;
+       if (mac->type == e1000_82576)
+               mac->rar_entry_count = E1000_RAR_ENTRIES_82576;
        /* Set if part includes ASF firmware */
        mac->asf_firmware_present = true;
        /* Set if manageability features are enabled. */
@@ -272,7 +279,7 @@ static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
        u32 i, i2ccmd = 0;
 
        if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) {
-               hw_dbg(hw, "PHY Address %u is out of range\n", offset);
+               hw_dbg("PHY Address %u is out of range\n", offset);
                return -E1000_ERR_PARAM;
        }
 
@@ -295,11 +302,11 @@ static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
                        break;
        }
        if (!(i2ccmd & E1000_I2CCMD_READY)) {
-               hw_dbg(hw, "I2CCMD Read did not complete\n");
+               hw_dbg("I2CCMD Read did not complete\n");
                return -E1000_ERR_PHY;
        }
        if (i2ccmd & E1000_I2CCMD_ERROR) {
-               hw_dbg(hw, "I2CCMD Error bit set\n");
+               hw_dbg("I2CCMD Error bit set\n");
                return -E1000_ERR_PHY;
        }
 
@@ -326,7 +333,7 @@ static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
        u16 phy_data_swapped;
 
        if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) {
-               hw_dbg(hw, "PHY Address %d is out of range\n", offset);
+               hw_dbg("PHY Address %d is out of range\n", offset);
                return -E1000_ERR_PARAM;
        }
 
@@ -353,11 +360,11 @@ static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
                        break;
        }
        if (!(i2ccmd & E1000_I2CCMD_READY)) {
-               hw_dbg(hw, "I2CCMD Write did not complete\n");
+               hw_dbg("I2CCMD Write did not complete\n");
                return -E1000_ERR_PHY;
        }
        if (i2ccmd & E1000_I2CCMD_ERROR) {
-               hw_dbg(hw, "I2CCMD Error bit set\n");
+               hw_dbg("I2CCMD Error bit set\n");
                return -E1000_ERR_PHY;
        }
 
@@ -368,7 +375,7 @@ static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
  *  igb_get_phy_id_82575 - Retrieve PHY addr and id
  *  @hw: pointer to the HW structure
  *
- *  Retreives the PHY address and ID for both PHY's which do and do not use
+ *  Retrieves the PHY address and ID for both PHY's which do and do not use
  *  sgmi interface.
  **/
 static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
@@ -397,9 +404,8 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
        for (phy->addr = 1; phy->addr < 8; phy->addr++) {
                ret_val = igb_read_phy_reg_sgmii_82575(hw, PHY_ID1, &phy_id);
                if (ret_val == 0) {
-                       hw_dbg(hw, "Vendor ID 0x%08X read at address %u\n",
-                                 phy_id,
-                                 phy->addr);
+                       hw_dbg("Vendor ID 0x%08X read at address %u\n",
+                              phy_id, phy->addr);
                        /*
                         * At the time of this writing, The M88 part is
                         * the only supported SGMII PHY product.
@@ -407,8 +413,7 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
                        if (phy_id == M88_VENDOR)
                                break;
                } else {
-                       hw_dbg(hw, "PHY address %u was unreadable\n",
-                                 phy->addr);
+                       hw_dbg("PHY address %u was unreadable\n", phy->addr);
                }
        }
 
@@ -440,7 +445,7 @@ static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *hw)
         * available to us at this time.
         */
 
-       hw_dbg(hw, "Soft resetting SGMII attached PHY...\n");
+       hw_dbg("Soft resetting SGMII attached PHY...\n");
 
        /*
         * SFP documentation requires the following to configure the SPF module
@@ -475,34 +480,29 @@ static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active)
        s32 ret_val;
        u16 data;
 
-       ret_val = hw->phy.ops.read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
-                                          &data);
+       ret_val = phy->ops.read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data);
        if (ret_val)
                goto out;
 
        if (active) {
                data |= IGP02E1000_PM_D0_LPLU;
-               ret_val = hw->phy.ops.write_phy_reg(hw,
-                                             IGP02E1000_PHY_POWER_MGMT,
-                                             data);
+               ret_val = phy->ops.write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
+                                                data);
                if (ret_val)
                        goto out;
 
                /* When LPLU is enabled, we should disable SmartSpeed */
-               ret_val = hw->phy.ops.read_phy_reg(hw,
-                                            IGP01E1000_PHY_PORT_CONFIG,
-                                            &data);
+               ret_val = phy->ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                               &data);
                data &= ~IGP01E1000_PSCFR_SMART_SPEED;
-               ret_val = hw->phy.ops.write_phy_reg(hw,
-                                             IGP01E1000_PHY_PORT_CONFIG,
-                                             data);
+               ret_val = phy->ops.write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                                data);
                if (ret_val)
                        goto out;
        } else {
                data &= ~IGP02E1000_PM_D0_LPLU;
-               ret_val = hw->phy.ops.write_phy_reg(hw,
-                                             IGP02E1000_PHY_POWER_MGMT,
-                                             data);
+               ret_val = phy->ops.write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
+                                                data);
                /*
                 * LPLU and SmartSpeed are mutually exclusive.  LPLU is used
                 * during Dx states where the power conservation is most
@@ -510,29 +510,25 @@ static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active)
                 * SmartSpeed, so performance is maintained.
                 */
                if (phy->smart_speed == e1000_smart_speed_on) {
-                       ret_val = hw->phy.ops.read_phy_reg(hw,
-                                                    IGP01E1000_PHY_PORT_CONFIG,
-                                                    &data);
+                       ret_val = phy->ops.read_phy_reg(hw,
+                                       IGP01E1000_PHY_PORT_CONFIG, &data);
                        if (ret_val)
                                goto out;
 
                        data |= IGP01E1000_PSCFR_SMART_SPEED;
-                       ret_val = hw->phy.ops.write_phy_reg(hw,
-                                                    IGP01E1000_PHY_PORT_CONFIG,
-                                                    data);
+                       ret_val = phy->ops.write_phy_reg(hw,
+                                       IGP01E1000_PHY_PORT_CONFIG, data);
                        if (ret_val)
                                goto out;
                } else if (phy->smart_speed == e1000_smart_speed_off) {
-                       ret_val = hw->phy.ops.read_phy_reg(hw,
-                                                    IGP01E1000_PHY_PORT_CONFIG,
-                                                    &data);
+                       ret_val = phy->ops.read_phy_reg(hw,
+                                       IGP01E1000_PHY_PORT_CONFIG, &data);
                        if (ret_val)
                                goto out;
 
                        data &= ~IGP01E1000_PSCFR_SMART_SPEED;
-                       ret_val = hw->phy.ops.write_phy_reg(hw,
-                                                    IGP01E1000_PHY_PORT_CONFIG,
-                                                    data);
+                       ret_val = phy->ops.write_phy_reg(hw,
+                                       IGP01E1000_PHY_PORT_CONFIG, data);
                        if (ret_val)
                                goto out;
                }
@@ -546,7 +542,7 @@ out:
  *  igb_acquire_nvm_82575 - Request for access to EEPROM
  *  @hw: pointer to the HW structure
  *
- *  Acquire the necessary semaphores for exclussive access to the EEPROM.
+ *  Acquire the necessary semaphores for exclusive access to the EEPROM.
  *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
  *  Return successful if access grant bit set, else clear the request for
  *  EEPROM access and return -E1000_ERR_NVM (-1).
@@ -617,7 +613,7 @@ static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask)
        }
 
        if (i == timeout) {
-               hw_dbg(hw, "Can't access resource, SW_FW_SYNC timeout.\n");
+               hw_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n");
                ret_val = -E1000_ERR_SWFW_SYNC;
                goto out;
        }
@@ -679,7 +675,7 @@ static s32 igb_get_cfg_done_82575(struct e1000_hw *hw)
                timeout--;
        }
        if (!timeout)
-               hw_dbg(hw, "MNG configuration cycle has not completed.\n");
+               hw_dbg("MNG configuration cycle has not completed.\n");
 
        /* If EEPROM is not marked present, init the PHY manually */
        if (((rd32(E1000_EECD) & E1000_EECD_PRES) == 0) &&
@@ -705,20 +701,19 @@ static s32 igb_check_for_link_82575(struct e1000_hw *hw)
        if ((hw->phy.media_type != e1000_media_type_copper) ||
            (igb_sgmii_active_82575(hw)))
                ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed,
-                                                              &duplex);
+                                                            &duplex);
        else
                ret_val = igb_check_for_copper_link(hw);
 
        return ret_val;
 }
-
 /**
  *  igb_get_pcs_speed_and_duplex_82575 - Retrieve current speed/duplex
  *  @hw: pointer to the HW structure
  *  @speed: stores the current speed
  *  @duplex: stores the current duplex
  *
- *  Using the physical coding sub-layer (PCS), retreive the current speed and
+ *  Using the physical coding sub-layer (PCS), retrieve the current speed and
  *  duplex, then store the values in the pointers provided.
  **/
 static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed,
@@ -768,18 +763,129 @@ static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed,
 }
 
 /**
- *  igb_rar_set_82575 - Set receive address register
+ *  igb_init_rx_addrs_82575 - Initialize receive address's
+ *  @hw: pointer to the HW structure
+ *  @rar_count: receive address registers
+ *
+ *  Setups the receive address registers by setting the base receive address
+ *  register to the devices MAC address and clearing all the other receive
+ *  address registers to 0.
+ **/
+static void igb_init_rx_addrs_82575(struct e1000_hw *hw, u16 rar_count)
+{
+       u32 i;
+       u8 addr[6] = {0,0,0,0,0,0};
+       /*
+        * This function is essentially the same as that of
+        * e1000_init_rx_addrs_generic. However it also takes care
+        * of the special case where the register offset of the
+        * second set of RARs begins elsewhere. This is implicitly taken care by
+        * function e1000_rar_set_generic.
+        */
+
+       hw_dbg("e1000_init_rx_addrs_82575");
+
+       /* Setup the receive address */
+       hw_dbg("Programming MAC Address into RAR[0]\n");
+       hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
+
+       /* Zero out the other (rar_entry_count - 1) receive addresses */
+       hw_dbg("Clearing RAR[1-%u]\n", rar_count-1);
+       for (i = 1; i < rar_count; i++)
+           hw->mac.ops.rar_set(hw, addr, i);
+}
+
+/**
+ *  igb_update_mc_addr_list_82575 - Update Multicast addresses
+ *  @hw: pointer to the HW structure
+ *  @mc_addr_list: array of multicast addresses to program
+ *  @mc_addr_count: number of multicast addresses to program
+ *  @rar_used_count: the first RAR register free to program
+ *  @rar_count: total number of supported Receive Address Registers
+ *
+ *  Updates the Receive Address Registers and Multicast Table Array.
+ *  The caller must have a packed mc_addr_list of multicast addresses.
+ *  The parameter rar_count will usually be hw->mac.rar_entry_count
+ *  unless there are workarounds that change this.
+ **/
+void igb_update_mc_addr_list_82575(struct e1000_hw *hw,
+                                   u8 *mc_addr_list, u32 mc_addr_count,
+                                   u32 rar_used_count, u32 rar_count)
+{
+       u32 hash_value;
+       u32 i;
+       u8 addr[6] = {0,0,0,0,0,0};
+       /*
+        * This function is essentially the same as that of 
+        * igb_update_mc_addr_list_generic. However it also takes care 
+        * of the special case where the register offset of the 
+        * second set of RARs begins elsewhere. This is implicitly taken care by 
+        * function e1000_rar_set_generic.
+        */
+
+       /*
+        * Load the first set of multicast addresses into the exact
+        * filters (RAR).  If there are not enough to fill the RAR
+        * array, clear the filters.
+        */
+       for (i = rar_used_count; i < rar_count; i++) {
+               if (mc_addr_count) {
+                       igb_rar_set(hw, mc_addr_list, i);
+                       mc_addr_count--;
+                       mc_addr_list += ETH_ALEN;
+               } else {
+                       igb_rar_set(hw, addr, i);
+               }
+       }
+
+       /* Clear the old settings from the MTA */
+       hw_dbg("Clearing MTA\n");
+       for (i = 0; i < hw->mac.mta_reg_count; i++) {
+               array_wr32(E1000_MTA, i, 0);
+               wrfl();
+       }
+
+       /* Load any remaining multicast addresses into the hash table. */
+       for (; mc_addr_count > 0; mc_addr_count--) {
+               hash_value = igb_hash_mc_addr(hw, mc_addr_list);
+               hw_dbg("Hash value = 0x%03X\n", hash_value);
+               igb_mta_set(hw, hash_value);
+               mc_addr_list += ETH_ALEN;
+       }
+}
+
+/**
+ *  igb_shutdown_fiber_serdes_link_82575 - Remove link during power down
  *  @hw: pointer to the HW structure
- *  @addr: pointer to the receive address
- *  @index: receive address array register
  *
- *  Sets the receive address array register at index to the address passed
- *  in by addr.
+ *  In the case of fiber serdes, shut down optics and PCS on driver unload
+ *  when management pass thru is not enabled.
  **/
-static void igb_rar_set_82575(struct e1000_hw *hw, u8 *addr, u32 index)
+void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw)
 {
-       if (index < E1000_RAR_ENTRIES_82575)
-               igb_rar_set(hw, addr, index);
+       u32 reg;
+
+       if (hw->mac.type != e1000_82576 ||
+           (hw->phy.media_type != e1000_media_type_fiber &&
+            hw->phy.media_type != e1000_media_type_internal_serdes))
+               return;
+
+       /* if the management interface is not enabled, then power down */
+       if (!igb_enable_mng_pass_thru(hw)) {
+               /* Disable PCS to turn off link */
+               reg = rd32(E1000_PCS_CFG0);
+               reg &= ~E1000_PCS_CFG_PCS_EN;
+               wr32(E1000_PCS_CFG0, reg);
+
+               /* shutdown the laser */
+               reg = rd32(E1000_CTRL_EXT);
+               reg |= E1000_CTRL_EXT_SDP7_DATA;
+               wr32(E1000_CTRL_EXT, reg);
+
+               /* flush the write to verify completion */
+               wrfl();
+               msleep(1);
+       }
 
        return;
 }
@@ -802,9 +908,9 @@ static s32 igb_reset_hw_82575(struct e1000_hw *hw)
         */
        ret_val = igb_disable_pcie_master(hw);
        if (ret_val)
-               hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
+               hw_dbg("PCI-E Master disable polling has failed.\n");
 
-       hw_dbg(hw, "Masking off all interrupts\n");
+       hw_dbg("Masking off all interrupts\n");
        wr32(E1000_IMC, 0xffffffff);
 
        wr32(E1000_RCTL, 0);
@@ -815,7 +921,7 @@ static s32 igb_reset_hw_82575(struct e1000_hw *hw)
 
        ctrl = rd32(E1000_CTRL);
 
-       hw_dbg(hw, "Issuing a global reset to MAC\n");
+       hw_dbg("Issuing a global reset to MAC\n");
        wr32(E1000_CTRL, ctrl | E1000_CTRL_RST);
 
        ret_val = igb_get_auto_rd_done(hw);
@@ -825,7 +931,7 @@ static s32 igb_reset_hw_82575(struct e1000_hw *hw)
                 * return with an error. This can happen in situations
                 * where there is no eeprom and prevents getting link.
                 */
-               hw_dbg(hw, "Auto Read Done did not complete\n");
+               hw_dbg("Auto Read Done did not complete\n");
        }
 
        /* If EEPROM is not present, run manual init scripts */
@@ -856,18 +962,18 @@ static s32 igb_init_hw_82575(struct e1000_hw *hw)
        /* Initialize identification LED */
        ret_val = igb_id_led_init(hw);
        if (ret_val) {
-               hw_dbg(hw, "Error initializing identification LED\n");
+               hw_dbg("Error initializing identification LED\n");
                /* This is not fatal and we should not stop init due to this */
        }
 
        /* Disabling VLAN filtering */
-       hw_dbg(hw, "Initializing the IEEE VLAN\n");
+       hw_dbg("Initializing the IEEE VLAN\n");
        igb_clear_vfta(hw);
 
        /* Setup the receive address */
-       igb_init_rx_addrs(hw, rar_count);
+       igb_init_rx_addrs_82575(hw, rar_count);
        /* Zero out the Multicast HASH table */
-       hw_dbg(hw, "Zeroing the MTA\n");
+       hw_dbg("Zeroing the MTA\n");
        for (i = 0; i < mac->mta_reg_count; i++)
                array_wr32(E1000_MTA, i, 0);
 
@@ -937,10 +1043,10 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
                 * PHY will be set to 10H, 10F, 100H or 100F
                 * depending on user settings.
                 */
-               hw_dbg(hw, "Forcing Speed and Duplex\n");
+               hw_dbg("Forcing Speed and Duplex\n");
                ret_val = igb_phy_force_speed_duplex(hw);
                if (ret_val) {
-                       hw_dbg(hw, "Error Forcing Speed and Duplex\n");
+                       hw_dbg("Error Forcing Speed and Duplex\n");
                        goto out;
                }
        }
@@ -953,20 +1059,17 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
         * Check link status. Wait up to 100 microseconds for link to become
         * valid.
         */
-       ret_val = igb_phy_has_link(hw,
-                                            COPPER_LINK_UP_LIMIT,
-                                            10,
-                                            &link);
+       ret_val = igb_phy_has_link(hw, COPPER_LINK_UP_LIMIT, 10, &link);
        if (ret_val)
                goto out;
 
        if (link) {
-               hw_dbg(hw, "Valid link established!!!\n");
+               hw_dbg("Valid link established!!!\n");
                /* Config the MAC and PHY after link is up */
                igb_config_collision_dist(hw);
                ret_val = igb_config_fc_after_link_up(hw);
        } else {
-               hw_dbg(hw, "Unable to establish link!!!\n");
+               hw_dbg("Unable to establish link!!!\n");
        }
 
 out:
@@ -1022,7 +1125,7 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
                       E1000_PCS_LCTL_FDV_FULL |      /* SerDes Full duplex */
                       E1000_PCS_LCTL_AN_ENABLE |     /* Enable Autoneg */
                       E1000_PCS_LCTL_AN_RESTART;     /* Restart autoneg */
-               hw_dbg(hw, "Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg);
+               hw_dbg("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg);
        } else {
                /* Set PCS register for forced speed */
                reg |= E1000_PCS_LCTL_FLV_LINK_UP |   /* Force link up */
@@ -1030,8 +1133,14 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
                       E1000_PCS_LCTL_FDV_FULL |      /* SerDes Full duplex */
                       E1000_PCS_LCTL_FSD |           /* Force Speed */
                       E1000_PCS_LCTL_FORCE_LINK;     /* Force Link */
-               hw_dbg(hw, "Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg);
+               hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg);
+       }
+
+       if (hw->mac.type == e1000_82576) {
+               reg |= E1000_PCS_LCTL_FORCE_FCTRL;
+               igb_force_mac_fc(hw);
        }
+
        wr32(E1000_PCS_LCTL, reg);
 
        return 0;
@@ -1071,7 +1180,7 @@ static s32 igb_configure_pcs_link_82575(struct e1000_hw *hw)
                 */
                reg |= E1000_PCS_LCTL_AN_RESTART | E1000_PCS_LCTL_AN_ENABLE;
        } else {
-               /* Set PCS regiseter for forced speed */
+               /* Set PCS register for forced speed */
 
                /* Turn off bits for full duplex, speed, and autoneg */
                reg &= ~(E1000_PCS_LCTL_FSV_1000 |
@@ -1092,8 +1201,7 @@ static s32 igb_configure_pcs_link_82575(struct e1000_hw *hw)
                       E1000_PCS_LCTL_FORCE_LINK |
                       E1000_PCS_LCTL_FLV_LINK_UP;
 
-               hw_dbg(hw,
-                      "Wrote 0x%08X to PCS_LCTL to configure forced link\n",
+               hw_dbg("Wrote 0x%08X to PCS_LCTL to configure forced link\n",
                       reg);
        }
        wr32(E1000_PCS_LCTL, reg);
@@ -1138,7 +1246,7 @@ out:
 static s32 igb_reset_init_script_82575(struct e1000_hw *hw)
 {
        if (hw->mac.type == e1000_82575) {
-               hw_dbg(hw, "Running reset init script for 82575\n");
+               hw_dbg("Running reset init script for 82575\n");
                /* SerDes configuration via SERDESCTRL */
                igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x00, 0x0C);
                igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x01, 0x78);
@@ -1242,11 +1350,84 @@ static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw)
                temp = rd32(E1000_SCVPC);
 }
 
+/**
+ *  igb_rx_fifo_flush_82575 - Clean rx fifo after RX enable
+ *  @hw: pointer to the HW structure
+ *
+ *  After rx enable if managability is enabled then there is likely some
+ *  bad data at the start of the fifo and possibly in the DMA fifo.  This
+ *  function clears the fifos and flushes any packets that came in as rx was
+ *  being enabled.
+ **/
+void igb_rx_fifo_flush_82575(struct e1000_hw *hw)
+{
+       u32 rctl, rlpml, rxdctl[4], rfctl, temp_rctl, rx_enabled;
+       int i, ms_wait;
+
+       if (hw->mac.type != e1000_82575 ||
+           !(rd32(E1000_MANC) & E1000_MANC_RCV_TCO_EN))
+               return;
+
+       /* Disable all RX queues */
+       for (i = 0; i < 4; i++) {
+               rxdctl[i] = rd32(E1000_RXDCTL(i));
+               wr32(E1000_RXDCTL(i),
+                    rxdctl[i] & ~E1000_RXDCTL_QUEUE_ENABLE);
+       }
+       /* Poll all queues to verify they have shut down */
+       for (ms_wait = 0; ms_wait < 10; ms_wait++) {
+               msleep(1);
+               rx_enabled = 0;
+               for (i = 0; i < 4; i++)
+                       rx_enabled |= rd32(E1000_RXDCTL(i));
+               if (!(rx_enabled & E1000_RXDCTL_QUEUE_ENABLE))
+                       break;
+       }
+
+       if (ms_wait == 10)
+               hw_dbg("Queue disable timed out after 10ms\n");
+
+       /* Clear RLPML, RCTL.SBP, RFCTL.LEF, and set RCTL.LPE so that all
+        * incoming packets are rejected.  Set enable and wait 2ms so that
+        * any packet that was coming in as RCTL.EN was set is flushed
+        */
+       rfctl = rd32(E1000_RFCTL);
+       wr32(E1000_RFCTL, rfctl & ~E1000_RFCTL_LEF);
+
+       rlpml = rd32(E1000_RLPML);
+       wr32(E1000_RLPML, 0);
+
+       rctl = rd32(E1000_RCTL);
+       temp_rctl = rctl & ~(E1000_RCTL_EN | E1000_RCTL_SBP);
+       temp_rctl |= E1000_RCTL_LPE;
+
+       wr32(E1000_RCTL, temp_rctl);
+       wr32(E1000_RCTL, temp_rctl | E1000_RCTL_EN);
+       wrfl();
+       msleep(2);
+
+       /* Enable RX queues that were previously enabled and restore our
+        * previous state
+        */
+       for (i = 0; i < 4; i++)
+               wr32(E1000_RXDCTL(i), rxdctl[i]);
+       wr32(E1000_RCTL, rctl);
+       wrfl();
+
+       wr32(E1000_RLPML, rlpml);
+       wr32(E1000_RFCTL, rfctl);
+
+       /* Flush receive errors generated by workaround */
+       rd32(E1000_ROC);
+       rd32(E1000_RNBC);
+       rd32(E1000_MPC);
+}
+
 static struct e1000_mac_operations e1000_mac_ops_82575 = {
        .reset_hw             = igb_reset_hw_82575,
        .init_hw              = igb_init_hw_82575,
        .check_for_link       = igb_check_for_link_82575,
-       .rar_set              = igb_rar_set_82575,
+       .rar_set              = igb_rar_set,
        .read_mac_addr        = igb_read_mac_addr_82575,
        .get_speed_and_duplex = igb_get_speed_and_duplex_copper,
 };