|
@@ -644,6 +644,7 @@ static void sky2_phy_power_up(struct sky2_hw *hw, unsigned port)
|
|
|
{
|
|
|
u32 reg1;
|
|
|
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
|
|
reg1 &= ~phy_power[port];
|
|
|
|
|
@@ -651,6 +652,7 @@ static void sky2_phy_power_up(struct sky2_hw *hw, unsigned port)
|
|
|
reg1 |= coma_mode[port];
|
|
|
|
|
|
sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
sky2_pci_read32(hw, PCI_DEV_REG1);
|
|
|
|
|
|
if (hw->chip_id == CHIP_ID_YUKON_FE)
|
|
@@ -707,9 +709,11 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port)
|
|
|
gm_phy_write(hw, port, PHY_MARV_CTRL, PHY_CT_PDOWN);
|
|
|
}
|
|
|
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
|
|
reg1 |= phy_power[port]; /* set PHY to PowerDown/COMA Mode */
|
|
|
sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
}
|
|
|
|
|
|
/* Force a renegotiation */
|
|
@@ -2149,7 +2153,9 @@ static void sky2_qlink_intr(struct sky2_hw *hw)
|
|
|
|
|
|
/* reset PHY Link Detect */
|
|
|
phy = sky2_pci_read16(hw, PSM_CONFIG_REG4);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
sky2_pci_write16(hw, PSM_CONFIG_REG4, phy | 1);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
|
|
|
sky2_link_up(sky2);
|
|
|
}
|
|
@@ -2640,6 +2646,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
|
if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
|
|
|
u16 pci_err;
|
|
|
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
pci_err = sky2_pci_read16(hw, PCI_STATUS);
|
|
|
if (net_ratelimit())
|
|
|
dev_err(&pdev->dev, "PCI hardware error (0x%x)\n",
|
|
@@ -2647,12 +2654,14 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
|
|
|
|
sky2_pci_write16(hw, PCI_STATUS,
|
|
|
pci_err | PCI_STATUS_ERROR_BITS);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
}
|
|
|
|
|
|
if (status & Y2_IS_PCI_EXP) {
|
|
|
/* PCI-Express uncorrectable Error occurred */
|
|
|
u32 err;
|
|
|
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
err = sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
|
|
|
sky2_write32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS,
|
|
|
0xfffffffful);
|
|
@@ -2660,6 +2669,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
|
dev_err(&pdev->dev, "PCI Express error (0x%x)\n", err);
|
|
|
|
|
|
sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
}
|
|
|
|
|
|
if (status & Y2_HWE_L1_MASK)
|
|
@@ -3038,6 +3048,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|
|
}
|
|
|
|
|
|
sky2_power_on(hw);
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
|
|
|
for (i = 0; i < hw->ports; i++) {
|
|
|
sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
|
|
@@ -3074,6 +3085,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|
|
reg <<= PSM_CONFIG_REG4_TIMER_PHY_LINK_DETECT_BASE;
|
|
|
|
|
|
/* reset PHY Link Detect */
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
|
sky2_pci_write16(hw, PSM_CONFIG_REG4,
|
|
|
reg | PSM_CONFIG_REG4_RST_PHY_LINK_DETECT);
|
|
|
sky2_pci_write16(hw, PSM_CONFIG_REG4, reg);
|
|
@@ -3091,6 +3103,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|
|
/* restore the PCIe Link Control register */
|
|
|
sky2_pci_write16(hw, cap + PCI_EXP_LNKCTL, reg);
|
|
|
}
|
|
|
+ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
|
|
|
/* re-enable PEX PM in PEX PHY debug reg. 8 (clear bit 12) */
|
|
|
sky2_write32(hw, Y2_PEX_PHY_DATA, PEX_DB_ACCESS | (0x08UL << 16));
|
|
@@ -3230,6 +3243,27 @@ static inline u8 sky2_wol_supported(const struct sky2_hw *hw)
|
|
|
return sky2_is_copper(hw) ? (WAKE_PHY | WAKE_MAGIC) : 0;
|
|
|
}
|
|
|
|
|
|
+static void sky2_hw_set_wol(struct sky2_hw *hw)
|
|
|
+{
|
|
|
+ int wol = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < hw->ports; i++) {
|
|
|
+ struct net_device *dev = hw->dev[i];
|
|
|
+ struct sky2_port *sky2 = netdev_priv(dev);
|
|
|
+
|
|
|
+ if (sky2->wol)
|
|
|
+ wol = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (hw->chip_id == CHIP_ID_YUKON_EC_U ||
|
|
|
+ hw->chip_id == CHIP_ID_YUKON_EX ||
|
|
|
+ hw->chip_id == CHIP_ID_YUKON_FE_P)
|
|
|
+ sky2_write32(hw, B0_CTST, wol ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
|
|
|
+
|
|
|
+ device_set_wakeup_enable(&hw->pdev->dev, wol);
|
|
|
+}
|
|
|
+
|
|
|
static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
|
{
|
|
|
const struct sky2_port *sky2 = netdev_priv(dev);
|
|
@@ -3249,13 +3283,7 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
|
|
|
|
sky2->wol = wol->wolopts;
|
|
|
|
|
|
- if (hw->chip_id == CHIP_ID_YUKON_EC_U ||
|
|
|
- hw->chip_id == CHIP_ID_YUKON_EX ||
|
|
|
- hw->chip_id == CHIP_ID_YUKON_FE_P)
|
|
|
- sky2_write32(hw, B0_CTST, sky2->wol
|
|
|
- ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
|
|
|
-
|
|
|
- device_set_wakeup_enable(&hw->pdev->dev, sky2->wol);
|
|
|
+ sky2_hw_set_wol(hw);
|
|
|
|
|
|
if (!netif_running(dev))
|
|
|
sky2_wol_init(sky2);
|