]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/e1000e/ich8lan.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / net / e1000e / ich8lan.c
index e3374d9a2472a2af316ca137305a53162f62e882..fb46974cfec1afd122edea3f3aa8a4058b8d1928 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2010 Intel Corporation.
+  Copyright(c) 1999 - 2011 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,
@@ -321,7 +321,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
        }
 
        /*
-        * Reset the PHY before any acccess to it.  Doing so, ensures that
+        * Reset the PHY before any access to it.  Doing so, ensures that
         * the PHY is in a known good state before we read/write PHY registers.
         * The generic reset is sufficient here, because we haven't determined
         * the PHY type yet.
@@ -338,12 +338,17 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
        }
 
        phy->id = e1000_phy_unknown;
-       ret_val = e1000e_get_phy_id(hw);
-       if (ret_val)
-               goto out;
-       if ((phy->id == 0) || (phy->id == PHY_REVISION_MASK)) {
+       switch (hw->mac.type) {
+       default:
+               ret_val = e1000e_get_phy_id(hw);
+               if (ret_val)
+                       goto out;
+               if ((phy->id != 0) && (phy->id != PHY_REVISION_MASK))
+                       break;
+               /* fall-through */
+       case e1000_pch2lan:
                /*
-                * In case the PHY needs to be in mdio slow mode (eg. 82577),
+                * In case the PHY needs to be in mdio slow mode,
                 * set slow mode and try to get the PHY id again.
                 */
                ret_val = e1000_set_mdio_slow_mode_hv(hw);
@@ -352,6 +357,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
                ret_val = e1000e_get_phy_id(hw);
                if (ret_val)
                        goto out;
+               break;
        }
        phy->type = e1000e_get_phy_type_from_id(phy->id);
 
@@ -1389,22 +1395,6 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw)
        }
 }
 
-static u32 e1000_calc_rx_da_crc(u8 mac[])
-{
-       u32 poly = 0xEDB88320;  /* Polynomial for 802.3 CRC calculation */
-       u32 i, j, mask, crc;
-
-       crc = 0xffffffff;
-       for (i = 0; i < 6; i++) {
-               crc = crc ^ mac[i];
-               for (j = 8; j > 0; j--) {
-                       mask = (crc & 1) * (-1);
-                       crc = (crc >> 1) ^ (poly & mask);
-               }
-       }
-       return ~crc;
-}
-
 /**
  *  e1000_lv_jumbo_workaround_ich8lan - required for jumbo frame operation
  *  with 82579 PHY
@@ -1447,8 +1437,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                        mac_addr[4] = (addr_high & 0xFF);
                        mac_addr[5] = ((addr_high >> 8) & 0xFF);
 
-                       ew32(PCH_RAICC(i),
-                                       e1000_calc_rx_da_crc(mac_addr));
+                       ew32(PCH_RAICC(i), ~ether_crc_le(ETH_ALEN, mac_addr));
                }
 
                /* Write Rx addresses to the PHY */
@@ -2303,11 +2292,10 @@ static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
                 */
                if (ret_val == 0) {
                        flash_data = er32flash(ICH_FLASH_FDATA0);
-                       if (size == 1) {
+                       if (size == 1)
                                *data = (u8)(flash_data & 0x000000FF);
-                       } else if (size == 2) {
+                       else if (size == 2)
                                *data = (u16)(flash_data & 0x0000FFFF);
-                       }
                        break;
                } else {
                        /*
@@ -2972,7 +2960,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
 {
        struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
        u16 reg;
-       u32 ctrl, icr, kab;
+       u32 ctrl, kab;
        s32 ret_val;
 
        /*
@@ -3062,7 +3050,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
                ew32(CRC_OFFSET, 0x65656565);
 
        ew32(IMC, 0xffffffff);
-       icr = er32(ICR);
+       er32(ICR);
 
        kab = er32(KABGTXD);
        kab |= E1000_KABGTXD_BGSQLBIAS;
@@ -3113,7 +3101,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
         * Reset the phy after disabling host wakeup to reset the Rx buffer.
         */
        if (hw->phy.type == e1000_phy_82578) {
-               hw->phy.ops.read_reg(hw, BM_WUC, &i);
+               e1e_rphy(hw, BM_WUC, &i);
                ret_val = e1000_phy_hw_reset_ich8lan(hw);
                if (ret_val)
                        return ret_val;
@@ -3271,9 +3259,8 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)
            (hw->phy.type == e1000_phy_82577)) {
                ew32(FCRTV_PCH, hw->fc.refresh_time);
 
-               ret_val = hw->phy.ops.write_reg(hw,
-                                            PHY_REG(BM_PORT_CTRL_PAGE, 27),
-                                            hw->fc.pause_time);
+               ret_val = e1e_wphy(hw, PHY_REG(BM_PORT_CTRL_PAGE, 27),
+                                  hw->fc.pause_time);
                if (ret_val)
                        return ret_val;
        }
@@ -3337,8 +3324,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
                        return ret_val;
                break;
        case e1000_phy_ife:
-               ret_val = hw->phy.ops.read_reg(hw, IFE_PHY_MDIX_CONTROL,
-                                              &reg_data);
+               ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &reg_data);
                if (ret_val)
                        return ret_val;
 
@@ -3356,8 +3342,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
                        reg_data |= IFE_PMC_AUTO_MDIX;
                        break;
                }
-               ret_val = hw->phy.ops.write_reg(hw, IFE_PHY_MDIX_CONTROL,
-                                               reg_data);
+               ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, reg_data);
                if (ret_val)
                        return ret_val;
                break;
@@ -3591,7 +3576,7 @@ void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw)
        ew32(PHY_CTRL, phy_ctrl);
 
        if (hw->mac.type >= e1000_pchlan) {
-               e1000_oem_bits_config_ich8lan(hw, true);
+               e1000_oem_bits_config_ich8lan(hw, false);
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
                        return;
@@ -3641,7 +3626,8 @@ static s32 e1000_led_off_ich8lan(struct e1000_hw *hw)
 {
        if (hw->phy.type == e1000_phy_ife)
                return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED,
-                              (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF));
+                               (IFE_PSCL_PROBE_MODE |
+                                IFE_PSCL_PROBE_LEDS_OFF));
 
        ew32(LEDCTL, hw->mac.ledctl_mode1);
        return 0;
@@ -3655,8 +3641,7 @@ static s32 e1000_led_off_ich8lan(struct e1000_hw *hw)
  **/
 static s32 e1000_setup_led_pchlan(struct e1000_hw *hw)
 {
-       return hw->phy.ops.write_reg(hw, HV_LED_CONFIG,
-                                       (u16)hw->mac.ledctl_mode1);
+       return e1e_wphy(hw, HV_LED_CONFIG, (u16)hw->mac.ledctl_mode1);
 }
 
 /**
@@ -3667,8 +3652,7 @@ static s32 e1000_setup_led_pchlan(struct e1000_hw *hw)
  **/
 static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw)
 {
-       return hw->phy.ops.write_reg(hw, HV_LED_CONFIG,
-                                       (u16)hw->mac.ledctl_default);
+       return e1e_wphy(hw, HV_LED_CONFIG, (u16)hw->mac.ledctl_default);
 }
 
 /**
@@ -3699,7 +3683,7 @@ static s32 e1000_led_on_pchlan(struct e1000_hw *hw)
                }
        }
 
-       return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data);
+       return e1e_wphy(hw, HV_LED_CONFIG, data);
 }
 
 /**
@@ -3730,7 +3714,7 @@ static s32 e1000_led_off_pchlan(struct e1000_hw *hw)
                }
        }
 
-       return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data);
+       return e1e_wphy(hw, HV_LED_CONFIG, data);
 }
 
 /**
@@ -3839,20 +3823,20 @@ static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw)
        if ((hw->phy.type == e1000_phy_82578) ||
            (hw->phy.type == e1000_phy_82579) ||
            (hw->phy.type == e1000_phy_82577)) {
-               hw->phy.ops.read_reg(hw, HV_SCC_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_SCC_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_ECOL_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_ECOL_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_MCC_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_MCC_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_LATECOL_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_LATECOL_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_COLC_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_COLC_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_DC_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_DC_LOWER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_TNCRS_UPPER, &phy_data);
-               hw->phy.ops.read_reg(hw, HV_TNCRS_LOWER, &phy_data);
+               e1e_rphy(hw, HV_SCC_UPPER, &phy_data);
+               e1e_rphy(hw, HV_SCC_LOWER, &phy_data);
+               e1e_rphy(hw, HV_ECOL_UPPER, &phy_data);
+               e1e_rphy(hw, HV_ECOL_LOWER, &phy_data);
+               e1e_rphy(hw, HV_MCC_UPPER, &phy_data);
+               e1e_rphy(hw, HV_MCC_LOWER, &phy_data);
+               e1e_rphy(hw, HV_LATECOL_UPPER, &phy_data);
+               e1e_rphy(hw, HV_LATECOL_LOWER, &phy_data);
+               e1e_rphy(hw, HV_COLC_UPPER, &phy_data);
+               e1e_rphy(hw, HV_COLC_LOWER, &phy_data);
+               e1e_rphy(hw, HV_DC_UPPER, &phy_data);
+               e1e_rphy(hw, HV_DC_LOWER, &phy_data);
+               e1e_rphy(hw, HV_TNCRS_UPPER, &phy_data);
+               e1e_rphy(hw, HV_TNCRS_LOWER, &phy_data);
        }
 }