aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
diff options
context:
space:
mode:
authorHuang, Xiong <xiong@qca.qualcomm.com>2012-04-25 16:27:14 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-26 05:03:32 -0400
commitce5b972bc840d024289c73a096d61cfdf57eff2e (patch)
tree6d51dab262288aa3ac1d33b8cfce5e224d4112b0 /drivers/net/ethernet/atheros/atl1c/atl1c_main.c
parent7c6c44f064adf11628c8815cab02f3bdf95ef8bc (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.c23
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