|
@@ -163,6 +163,11 @@
|
|
|
#define HV_KMRN_MODE_CTRL PHY_REG(769, 16)
|
|
|
#define HV_KMRN_MDIO_SLOW 0x0400
|
|
|
|
|
|
+/* KMRN FIFO Control and Status */
|
|
|
+#define HV_KMRN_FIFO_CTRLSTA PHY_REG(770, 16)
|
|
|
+#define HV_KMRN_FIFO_CTRLSTA_PREAMBLE_MASK 0x7000
|
|
|
+#define HV_KMRN_FIFO_CTRLSTA_PREAMBLE_SHIFT 12
|
|
|
+
|
|
|
/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
|
|
|
/* Offset 04h HSFSTS */
|
|
|
union ich8_hws_flash_status {
|
|
@@ -657,6 +662,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|
|
struct e1000_mac_info *mac = &hw->mac;
|
|
|
s32 ret_val;
|
|
|
bool link;
|
|
|
+ u16 phy_reg;
|
|
|
|
|
|
/*
|
|
|
* We only want to go out to the PHY registers to see if Auto-Neg
|
|
@@ -689,16 +695,35 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|
|
|
|
|
mac->get_link_status = false;
|
|
|
|
|
|
- if (hw->phy.type == e1000_phy_82578) {
|
|
|
- ret_val = e1000_link_stall_workaround_hv(hw);
|
|
|
- if (ret_val)
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- if (hw->mac.type == e1000_pch2lan) {
|
|
|
+ switch (hw->mac.type) {
|
|
|
+ case e1000_pch2lan:
|
|
|
ret_val = e1000_k1_workaround_lv(hw);
|
|
|
if (ret_val)
|
|
|
goto out;
|
|
|
+ /* fall-thru */
|
|
|
+ case e1000_pchlan:
|
|
|
+ if (hw->phy.type == e1000_phy_82578) {
|
|
|
+ ret_val = e1000_link_stall_workaround_hv(hw);
|
|
|
+ if (ret_val)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Workaround for PCHx parts in half-duplex:
|
|
|
+ * Set the number of preambles removed from the packet
|
|
|
+ * when it is passed from the PHY to the MAC to prevent
|
|
|
+ * the MAC from misinterpreting the packet type.
|
|
|
+ */
|
|
|
+ e1e_rphy(hw, HV_KMRN_FIFO_CTRLSTA, &phy_reg);
|
|
|
+ phy_reg &= ~HV_KMRN_FIFO_CTRLSTA_PREAMBLE_MASK;
|
|
|
+
|
|
|
+ if ((er32(STATUS) & E1000_STATUS_FD) != E1000_STATUS_FD)
|
|
|
+ phy_reg |= (1 << HV_KMRN_FIFO_CTRLSTA_PREAMBLE_SHIFT);
|
|
|
+
|
|
|
+ e1e_wphy(hw, HV_KMRN_FIFO_CTRLSTA, phy_reg);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1355,7 +1380,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
|
|
|
return ret_val;
|
|
|
|
|
|
/* Preamble tuning for SSC */
|
|
|
- ret_val = e1e_wphy(hw, PHY_REG(770, 16), 0xA204);
|
|
|
+ ret_val = e1e_wphy(hw, HV_KMRN_FIFO_CTRLSTA, 0xA204);
|
|
|
if (ret_val)
|
|
|
return ret_val;
|
|
|
}
|