|
|
@@ -1437,6 +1437,52 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|
|
|
|
|
if (ret_val)
|
|
|
return ret_val;
|
|
|
+
|
|
|
+ if (hw->mac.type == e1000_pch_spt) {
|
|
|
+ u16 data;
|
|
|
+ u16 ptr_gap;
|
|
|
+
|
|
|
+ if (speed == SPEED_1000) {
|
|
|
+ ret_val = hw->phy.ops.acquire(hw);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ ret_val = e1e_rphy_locked(hw,
|
|
|
+ PHY_REG(776, 20),
|
|
|
+ &data);
|
|
|
+ if (ret_val) {
|
|
|
+ hw->phy.ops.release(hw);
|
|
|
+ return ret_val;
|
|
|
+ }
|
|
|
+
|
|
|
+ ptr_gap = (data & (0x3FF << 2)) >> 2;
|
|
|
+ if (ptr_gap < 0x18) {
|
|
|
+ data &= ~(0x3FF << 2);
|
|
|
+ data |= (0x18 << 2);
|
|
|
+ ret_val =
|
|
|
+ e1e_wphy_locked(hw,
|
|
|
+ PHY_REG(776, 20),
|
|
|
+ data);
|
|
|
+ }
|
|
|
+ hw->phy.ops.release(hw);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* I217 Packet Loss issue:
|
|
|
+ * ensure that FEXTNVM4 Beacon Duration is set correctly
|
|
|
+ * on power up.
|
|
|
+ * Set the Beacon Duration for I217 to 8 usec
|
|
|
+ */
|
|
|
+ if ((hw->mac.type == e1000_pch_lpt) || (hw->mac.type == e1000_pch_spt)) {
|
|
|
+ u32 mac_reg;
|
|
|
+
|
|
|
+ mac_reg = er32(FEXTNVM4);
|
|
|
+ mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK;
|
|
|
+ mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC;
|
|
|
+ ew32(FEXTNVM4, mac_reg);
|
|
|
}
|
|
|
|
|
|
/* Work-around I218 hang issue */
|