diff options
author | Huang, Xiong <xiong@qca.qualcomm.com> | 2012-04-25 16:27:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-26 05:03:32 -0400 |
commit | ce5b972bc840d024289c73a096d61cfdf57eff2e (patch) | |
tree | 6d51dab262288aa3ac1d33b8cfce5e224d4112b0 /drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |
parent | 7c6c44f064adf11628c8815cab02f3bdf95ef8bc (diff) |
atl1c: update PHY reset related routine
Many magic data are re-configured for PHY during its reset operation
based on chip type to get better compability and stability.
REG_PHY_CTRL register may be configured by BIOS before enter OS.
so, the driver can't directly write to it without any Read-Op.
this change also affect suspend and phy_disable routines.
PHY debug ports and extension registers are refined as well.
Signed-off-by: xiong <xiong@qca.qualcomm.com>
Tested-by: Liu David <dwliu@qca.qualcomm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/atheros/atl1c/atl1c_main.c')
-rw-r--r-- | drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c index 8a1d2f90eb1..995da221fc5 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |||
@@ -2314,6 +2314,7 @@ static int atl1c_suspend(struct device *dev) | |||
2314 | u32 wol_ctrl_data = 0; | 2314 | u32 wol_ctrl_data = 0; |
2315 | u16 mii_intr_status_data = 0; | 2315 | u16 mii_intr_status_data = 0; |
2316 | u32 wufc = adapter->wol; | 2316 | u32 wufc = adapter->wol; |
2317 | u32 phy_ctrl_data; | ||
2317 | 2318 | ||
2318 | atl1c_disable_l0s_l1(hw); | 2319 | atl1c_disable_l0s_l1(hw); |
2319 | if (netif_running(netdev)) { | 2320 | if (netif_running(netdev)) { |
@@ -2328,6 +2329,7 @@ static int atl1c_suspend(struct device *dev) | |||
2328 | 2329 | ||
2329 | AT_READ_REG(hw, REG_MASTER_CTRL, &master_ctrl_data); | 2330 | AT_READ_REG(hw, REG_MASTER_CTRL, &master_ctrl_data); |
2330 | AT_READ_REG(hw, REG_MAC_CTRL, &mac_ctrl_data); | 2331 | AT_READ_REG(hw, REG_MAC_CTRL, &mac_ctrl_data); |
2332 | AT_READ_REG(hw, REG_GPHY_CTRL, &phy_ctrl_data); | ||
2331 | 2333 | ||
2332 | master_ctrl_data &= ~MASTER_CTRL_CLK_SEL_DIS; | 2334 | master_ctrl_data &= ~MASTER_CTRL_CLK_SEL_DIS; |
2333 | mac_ctrl_data &= ~(MAC_CTRL_PRMLEN_MASK << MAC_CTRL_PRMLEN_SHIFT); | 2335 | mac_ctrl_data &= ~(MAC_CTRL_PRMLEN_MASK << MAC_CTRL_PRMLEN_SHIFT); |
@@ -2336,9 +2338,13 @@ static int atl1c_suspend(struct device *dev) | |||
2336 | MAC_CTRL_PRMLEN_SHIFT); | 2338 | MAC_CTRL_PRMLEN_SHIFT); |
2337 | mac_ctrl_data &= ~(MAC_CTRL_SPEED_MASK << MAC_CTRL_SPEED_SHIFT); | 2339 | mac_ctrl_data &= ~(MAC_CTRL_SPEED_MASK << MAC_CTRL_SPEED_SHIFT); |
2338 | mac_ctrl_data &= ~MAC_CTRL_DUPLX; | 2340 | mac_ctrl_data &= ~MAC_CTRL_DUPLX; |
2341 | phy_ctrl_data &= ~(GPHY_CTRL_EXT_RESET | GPHY_CTRL_CLS); | ||
2342 | phy_ctrl_data |= GPHY_CTRL_SEL_ANA_RST | GPHY_CTRL_HIB_PULSE | | ||
2343 | GPHY_CTRL_HIB_EN; | ||
2339 | 2344 | ||
2340 | if (wufc) { | 2345 | if (wufc) { |
2341 | mac_ctrl_data |= MAC_CTRL_RX_EN; | 2346 | mac_ctrl_data |= MAC_CTRL_RX_EN; |
2347 | phy_ctrl_data |= GPHY_CTRL_EXT_RESET; | ||
2342 | if (adapter->link_speed == SPEED_1000 || | 2348 | if (adapter->link_speed == SPEED_1000 || |
2343 | adapter->link_speed == SPEED_0) { | 2349 | adapter->link_speed == SPEED_0) { |
2344 | mac_ctrl_data |= atl1c_mac_speed_1000 << | 2350 | mac_ctrl_data |= atl1c_mac_speed_1000 << |
@@ -2381,23 +2387,20 @@ static int atl1c_suspend(struct device *dev) | |||
2381 | dev_dbg(&pdev->dev, | 2387 | dev_dbg(&pdev->dev, |
2382 | "%s: suspend MAC=0x%x\n", | 2388 | "%s: suspend MAC=0x%x\n", |
2383 | atl1c_driver_name, mac_ctrl_data); | 2389 | atl1c_driver_name, mac_ctrl_data); |
2384 | AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data); | ||
2385 | AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data); | ||
2386 | AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data); | ||
2387 | |||
2388 | AT_WRITE_REG(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT | | ||
2389 | GPHY_CTRL_EXT_RESET); | ||
2390 | } else { | 2390 | } else { |
2391 | AT_WRITE_REG(hw, REG_GPHY_CTRL, GPHY_CTRL_POWER_SAVING); | ||
2392 | master_ctrl_data |= MASTER_CTRL_CLK_SEL_DIS; | 2391 | master_ctrl_data |= MASTER_CTRL_CLK_SEL_DIS; |
2393 | mac_ctrl_data |= atl1c_mac_speed_10_100 << MAC_CTRL_SPEED_SHIFT; | 2392 | mac_ctrl_data |= atl1c_mac_speed_10_100 << MAC_CTRL_SPEED_SHIFT; |
2394 | mac_ctrl_data |= MAC_CTRL_DUPLX; | 2393 | mac_ctrl_data |= MAC_CTRL_DUPLX; |
2395 | AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data); | 2394 | phy_ctrl_data |= GPHY_CTRL_PHY_IDDQ | GPHY_CTRL_PWDOWN_HW; |
2396 | AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data); | 2395 | wol_ctrl_data = 0; |
2397 | AT_WRITE_REG(hw, REG_WOL_CTRL, 0); | ||
2398 | hw->phy_configured = false; /* re-init PHY when resume */ | 2396 | hw->phy_configured = false; /* re-init PHY when resume */ |
2399 | } | 2397 | } |
2400 | 2398 | ||
2399 | AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data); | ||
2400 | AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data); | ||
2401 | AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data); | ||
2402 | AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data); | ||
2403 | |||
2401 | return 0; | 2404 | return 0; |
2402 | } | 2405 | } |
2403 | 2406 | ||