aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2009-07-01 09:27:55 -0400
committerDavid S. Miller <davem@davemloft.net>2009-07-03 23:09:29 -0400
commitfc0c7760aea07c74af3395ad18f96ba62eecac36 (patch)
tree1bd5eb14f0829a5bd0b6ff6898ae6634f465b083 /drivers
parente65fa87c225fadd1980068b7d360e08ac0e985dd (diff)
e1000e: delay after LCD reset and proper checks for PHY configuration done
A previous workaround for 82578 to avoid link stall causes some PHY registers to get cleared inadvertently. Add a delay after all LCD resets to make sure PHY registers are in a stable state before continuing. Also, after resets check the EEC register for the state of PHY configuration performed by the MAC for ICH9 and earlier parts (as done before), but check the LAN_INIT_DONE bit in the STATUS register for ICH10 and newer parts (EEC doesn't exist in these newer parts). Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/e1000e/defines.h1
-rw-r--r--drivers/net/e1000e/ich8lan.c125
2 files changed, 82 insertions, 44 deletions
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h
index 4329ec34b178..c0f185beb8bc 100644
--- a/drivers/net/e1000e/defines.h
+++ b/drivers/net/e1000e/defines.h
@@ -238,6 +238,7 @@
238#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ 238#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */
239#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ 239#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */
240#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */ 240#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */
241#define E1000_STATUS_PHYRA 0x00000400 /* PHY Reset Asserted */
241#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */ 242#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */
242 243
243/* Constants used to interpret the masked PCI-X bus speed. */ 244/* Constants used to interpret the masked PCI-X bus speed. */
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
index 9e23f50fb9cd..438778fef5ac 100644
--- a/drivers/net/e1000e/ich8lan.c
+++ b/drivers/net/e1000e/ich8lan.c
@@ -694,6 +694,38 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
694} 694}
695 695
696/** 696/**
697 * e1000_lan_init_done_ich8lan - Check for PHY config completion
698 * @hw: pointer to the HW structure
699 *
700 * Check the appropriate indication the MAC has finished configuring the
701 * PHY after a software reset.
702 **/
703static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw)
704{
705 u32 data, loop = E1000_ICH8_LAN_INIT_TIMEOUT;
706
707 /* Wait for basic configuration completes before proceeding */
708 do {
709 data = er32(STATUS);
710 data &= E1000_STATUS_LAN_INIT_DONE;
711 udelay(100);
712 } while ((!data) && --loop);
713
714 /*
715 * If basic configuration is incomplete before the above loop
716 * count reaches 0, loading the configuration from NVM will
717 * leave the PHY in a bad state possibly resulting in no link.
718 */
719 if (loop == 0)
720 hw_dbg(hw, "LAN_INIT_DONE not set, increase timeout\n");
721
722 /* Clear the Init Done bit for the next init event */
723 data = er32(STATUS);
724 data &= ~E1000_STATUS_LAN_INIT_DONE;
725 ew32(STATUS, data);
726}
727
728/**
697 * e1000_phy_hw_reset_ich8lan - Performs a PHY reset 729 * e1000_phy_hw_reset_ich8lan - Performs a PHY reset
698 * @hw: pointer to the HW structure 730 * @hw: pointer to the HW structure
699 * 731 *
@@ -707,13 +739,15 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
707 u32 i; 739 u32 i;
708 u32 data, cnf_size, cnf_base_addr, sw_cfg_mask; 740 u32 data, cnf_size, cnf_base_addr, sw_cfg_mask;
709 s32 ret_val; 741 s32 ret_val;
710 u16 loop = E1000_ICH8_LAN_INIT_TIMEOUT;
711 u16 word_addr, reg_data, reg_addr, phy_page = 0; 742 u16 word_addr, reg_data, reg_addr, phy_page = 0;
712 743
713 ret_val = e1000e_phy_hw_reset_generic(hw); 744 ret_val = e1000e_phy_hw_reset_generic(hw);
714 if (ret_val) 745 if (ret_val)
715 return ret_val; 746 return ret_val;
716 747
748 /* Allow time for h/w to get to a quiescent state after reset */
749 mdelay(10);
750
717 if (hw->mac.type == e1000_pchlan) { 751 if (hw->mac.type == e1000_pchlan) {
718 ret_val = e1000_hv_phy_workarounds_ich8lan(hw); 752 ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
719 if (ret_val) 753 if (ret_val)
@@ -741,26 +775,8 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
741 if (!(data & sw_cfg_mask)) 775 if (!(data & sw_cfg_mask))
742 return 0; 776 return 0;
743 777
744 /* Wait for basic configuration completes before proceeding*/ 778 /* Wait for basic configuration completes before proceeding */
745 do { 779 e1000_lan_init_done_ich8lan(hw);
746 data = er32(STATUS);
747 data &= E1000_STATUS_LAN_INIT_DONE;
748 udelay(100);
749 } while ((!data) && --loop);
750
751 /*
752 * If basic configuration is incomplete before the above loop
753 * count reaches 0, loading the configuration from NVM will
754 * leave the PHY in a bad state possibly resulting in no link.
755 */
756 if (loop == 0) {
757 hw_dbg(hw, "LAN_INIT_DONE not set, increase timeout\n");
758 }
759
760 /* Clear the Init Done bit for the next init event */
761 data = er32(STATUS);
762 data &= ~E1000_STATUS_LAN_INIT_DONE;
763 ew32(STATUS, data);
764 780
765 /* 781 /*
766 * Make sure HW does not configure LCD from PHY 782 * Make sure HW does not configure LCD from PHY
@@ -2143,6 +2159,12 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
2143 ctrl = er32(CTRL); 2159 ctrl = er32(CTRL);
2144 2160
2145 if (!e1000_check_reset_block(hw)) { 2161 if (!e1000_check_reset_block(hw)) {
2162 /* Clear PHY Reset Asserted bit */
2163 if (hw->mac.type >= e1000_pchlan) {
2164 u32 status = er32(STATUS);
2165 ew32(STATUS, status & ~E1000_STATUS_PHYRA);
2166 }
2167
2146 /* 2168 /*
2147 * PHY HW reset requires MAC CORE reset at the same 2169 * PHY HW reset requires MAC CORE reset at the same
2148 * time to make sure the interface between MAC and the 2170 * time to make sure the interface between MAC and the
@@ -2156,21 +2178,24 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
2156 ew32(CTRL, (ctrl | E1000_CTRL_RST)); 2178 ew32(CTRL, (ctrl | E1000_CTRL_RST));
2157 msleep(20); 2179 msleep(20);
2158 2180
2159 if (!ret_val) { 2181 if (!ret_val)
2160 /* release the swflag because it is not reset by
2161 * hardware reset
2162 */
2163 e1000_release_swflag_ich8lan(hw); 2182 e1000_release_swflag_ich8lan(hw);
2164 }
2165 2183
2166 ret_val = e1000e_get_auto_rd_done(hw); 2184 if (ctrl & E1000_CTRL_PHY_RST)
2167 if (ret_val) { 2185 ret_val = hw->phy.ops.get_cfg_done(hw);
2168 /* 2186
2169 * When auto config read does not complete, do not 2187 if (hw->mac.type >= e1000_ich10lan) {
2170 * return with an error. This can happen in situations 2188 e1000_lan_init_done_ich8lan(hw);
2171 * where there is no eeprom and prevents getting link. 2189 } else {
2172 */ 2190 ret_val = e1000e_get_auto_rd_done(hw);
2173 hw_dbg(hw, "Auto Read Done did not complete\n"); 2191 if (ret_val) {
2192 /*
2193 * When auto config read does not complete, do not
2194 * return with an error. This can happen in situations
2195 * where there is no eeprom and prevents getting link.
2196 */
2197 hw_dbg(hw, "Auto Read Done did not complete\n");
2198 }
2174 } 2199 }
2175 2200
2176 ew32(IMC, 0xffffffff); 2201 ew32(IMC, 0xffffffff);
@@ -2222,6 +2247,18 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
2222 for (i = 0; i < mac->mta_reg_count; i++) 2247 for (i = 0; i < mac->mta_reg_count; i++)
2223 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); 2248 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
2224 2249
2250 /*
2251 * The 82578 Rx buffer will stall if wakeup is enabled in host and
2252 * the ME. Reading the BM_WUC register will clear the host wakeup bit.
2253 * Reset the phy after disabling host wakeup to reset the Rx buffer.
2254 */
2255 if (hw->phy.type == e1000_phy_82578) {
2256 hw->phy.ops.read_phy_reg(hw, BM_WUC, &i);
2257 ret_val = e1000_phy_hw_reset_ich8lan(hw);
2258 if (ret_val)
2259 return ret_val;
2260 }
2261
2225 /* Setup link and flow control */ 2262 /* Setup link and flow control */
2226 ret_val = e1000_setup_link_ich8lan(hw); 2263 ret_val = e1000_setup_link_ich8lan(hw);
2227 2264
@@ -2254,16 +2291,6 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
2254 ew32(CTRL_EXT, ctrl_ext); 2291 ew32(CTRL_EXT, ctrl_ext);
2255 2292
2256 /* 2293 /*
2257 * The 82578 Rx buffer will stall if wakeup is enabled in host and
2258 * the ME. Reading the BM_WUC register will clear the host wakeup bit.
2259 * Reset the phy after disabling host wakeup to reset the Rx buffer.
2260 */
2261 if (hw->phy.type == e1000_phy_82578) {
2262 e1e_rphy(hw, BM_WUC, &i);
2263 e1000e_phy_hw_reset_generic(hw);
2264 }
2265
2266 /*
2267 * Clear all of the statistics registers (clear on read). It is 2294 * Clear all of the statistics registers (clear on read). It is
2268 * important that we do this after we have tried to establish link 2295 * important that we do this after we have tried to establish link
2269 * because the symbol error count will increment wildly if there 2296 * because the symbol error count will increment wildly if there
@@ -2850,6 +2877,16 @@ static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw)
2850{ 2877{
2851 u32 bank = 0; 2878 u32 bank = 0;
2852 2879
2880 if (hw->mac.type >= e1000_pchlan) {
2881 u32 status = er32(STATUS);
2882
2883 if (status & E1000_STATUS_PHYRA)
2884 ew32(STATUS, status & ~E1000_STATUS_PHYRA);
2885 else
2886 hw_dbg(hw,
2887 "PHY Reset Asserted not set - needs delay\n");
2888 }
2889
2853 e1000e_get_cfg_done(hw); 2890 e1000e_get_cfg_done(hw);
2854 2891
2855 /* If EEPROM is not marked present, init the IGP 3 PHY manually */ 2892 /* If EEPROM is not marked present, init the IGP 3 PHY manually */