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:40:59 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-26 05:03:32 -0400
commit319d013af0d47e1137ac02f94ad069312514ddfa (patch)
tree4a6942fb0d2d2e85427ea924ac012e74770faea6 /drivers/net/ethernet/atheros/atl1c/atl1c_main.c
parent52a12fc785ef542bc06119d2f1c8e0f7d75e4c76 (diff)
atl1c: add function atl1c_power_saving
This function is used for suspend of S1/S3/S4 and driver remove. It sets MAC/PHY based on the WoL configuation to get lower power consumption. atl1c_phy_power_saving is renamed to atl1c_phy_to_ps_link, this function is just make PHY enter a link/speed mode to eat less power. REG_MAC_CTRL register is 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.c89
1 files changed, 2 insertions, 87 deletions
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
index cb3b3c4b5e18..d03112c3e4e9 100644
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
@@ -24,14 +24,6 @@
24#define ATL1C_DRV_VERSION "1.0.1.0-NAPI" 24#define ATL1C_DRV_VERSION "1.0.1.0-NAPI"
25char atl1c_driver_name[] = "atl1c"; 25char atl1c_driver_name[] = "atl1c";
26char atl1c_driver_version[] = ATL1C_DRV_VERSION; 26char atl1c_driver_version[] = ATL1C_DRV_VERSION;
27#define PCI_DEVICE_ID_ATTANSIC_L2C 0x1062
28#define PCI_DEVICE_ID_ATTANSIC_L1C 0x1063
29#define PCI_DEVICE_ID_ATHEROS_L2C_B 0x2060 /* AR8152 v1.1 Fast 10/100 */
30#define PCI_DEVICE_ID_ATHEROS_L2C_B2 0x2062 /* AR8152 v2.0 Fast 10/100 */
31#define PCI_DEVICE_ID_ATHEROS_L1D 0x1073 /* AR8151 v1.0 Gigabit 1000 */
32#define PCI_DEVICE_ID_ATHEROS_L1D_2_0 0x1083 /* AR8151 v2.0 Gigabit 1000 */
33#define L2CB_V10 0xc0
34#define L2CB_V11 0xc1
35 27
36/* 28/*
37 * atl1c_pci_tbl - PCI Device ID Table 29 * atl1c_pci_tbl - PCI Device ID Table
@@ -2307,12 +2299,7 @@ static int atl1c_suspend(struct device *dev)
2307 struct net_device *netdev = pci_get_drvdata(pdev); 2299 struct net_device *netdev = pci_get_drvdata(pdev);
2308 struct atl1c_adapter *adapter = netdev_priv(netdev); 2300 struct atl1c_adapter *adapter = netdev_priv(netdev);
2309 struct atl1c_hw *hw = &adapter->hw; 2301 struct atl1c_hw *hw = &adapter->hw;
2310 u32 mac_ctrl_data = 0;
2311 u32 master_ctrl_data = 0;
2312 u32 wol_ctrl_data = 0;
2313 u16 mii_intr_status_data = 0;
2314 u32 wufc = adapter->wol; 2302 u32 wufc = adapter->wol;
2315 u32 phy_ctrl_data;
2316 2303
2317 atl1c_disable_l0s_l1(hw); 2304 atl1c_disable_l0s_l1(hw);
2318 if (netif_running(netdev)) { 2305 if (netif_running(netdev)) {
@@ -2322,82 +2309,10 @@ static int atl1c_suspend(struct device *dev)
2322 netif_device_detach(netdev); 2309 netif_device_detach(netdev);
2323 2310
2324 if (wufc) 2311 if (wufc)
2325 if (atl1c_phy_power_saving(hw) != 0) 2312 if (atl1c_phy_to_ps_link(hw) != 0)
2326 dev_dbg(&pdev->dev, "phy power saving failed"); 2313 dev_dbg(&pdev->dev, "phy power saving failed");
2327 2314
2328 AT_READ_REG(hw, REG_MASTER_CTRL, &master_ctrl_data); 2315 atl1c_power_saving(hw, wufc);
2329 AT_READ_REG(hw, REG_MAC_CTRL, &mac_ctrl_data);
2330 AT_READ_REG(hw, REG_GPHY_CTRL, &phy_ctrl_data);
2331
2332 master_ctrl_data &= ~MASTER_CTRL_CLK_SEL_DIS;
2333 mac_ctrl_data &= ~(MAC_CTRL_PRMLEN_MASK << MAC_CTRL_PRMLEN_SHIFT);
2334 mac_ctrl_data |= (((u32)adapter->hw.preamble_len &
2335 MAC_CTRL_PRMLEN_MASK) <<
2336 MAC_CTRL_PRMLEN_SHIFT);
2337 mac_ctrl_data &= ~(MAC_CTRL_SPEED_MASK << MAC_CTRL_SPEED_SHIFT);
2338 mac_ctrl_data &= ~MAC_CTRL_DUPLX;
2339 phy_ctrl_data &= ~(GPHY_CTRL_EXT_RESET | GPHY_CTRL_CLS);
2340 phy_ctrl_data |= GPHY_CTRL_SEL_ANA_RST | GPHY_CTRL_HIB_PULSE |
2341 GPHY_CTRL_HIB_EN;
2342
2343 if (wufc) {
2344 mac_ctrl_data |= MAC_CTRL_RX_EN;
2345 phy_ctrl_data |= GPHY_CTRL_EXT_RESET;
2346 if (adapter->link_speed == SPEED_1000 ||
2347 adapter->link_speed == SPEED_0) {
2348 mac_ctrl_data |= atl1c_mac_speed_1000 <<
2349 MAC_CTRL_SPEED_SHIFT;
2350 mac_ctrl_data |= MAC_CTRL_DUPLX;
2351 } else
2352 mac_ctrl_data |= atl1c_mac_speed_10_100 <<
2353 MAC_CTRL_SPEED_SHIFT;
2354
2355 if (adapter->link_duplex == DUPLEX_FULL)
2356 mac_ctrl_data |= MAC_CTRL_DUPLX;
2357
2358 /* turn on magic packet wol */
2359 if (wufc & AT_WUFC_MAG) {
2360 wol_ctrl_data |= WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
2361 if (hw->nic_type == athr_l2c_b &&
2362 hw->revision_id == L2CB_V11) {
2363 wol_ctrl_data |=
2364 WOL_PATTERN_EN | WOL_PATTERN_PME_EN;
2365 }
2366 }
2367 if (wufc & AT_WUFC_LNKC) {
2368 wol_ctrl_data |= WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN;
2369 /* only link up can wake up */
2370 if (atl1c_write_phy_reg(hw, MII_IER, IER_LINK_UP) != 0) {
2371 dev_dbg(&pdev->dev, "%s: read write phy "
2372 "register failed.\n",
2373 atl1c_driver_name);
2374 }
2375 }
2376 /* clear phy interrupt */
2377 atl1c_read_phy_reg(hw, MII_ISR, &mii_intr_status_data);
2378 /* Config MAC Ctrl register */
2379 __atl1c_vlan_mode(netdev->features, &mac_ctrl_data);
2380
2381 /* magic packet maybe Broadcast&multicast&Unicast frame */
2382 if (wufc & AT_WUFC_MAG)
2383 mac_ctrl_data |= MAC_CTRL_BC_EN;
2384
2385 dev_dbg(&pdev->dev,
2386 "%s: suspend MAC=0x%x\n",
2387 atl1c_driver_name, mac_ctrl_data);
2388 } else {
2389 master_ctrl_data |= MASTER_CTRL_CLK_SEL_DIS;
2390 mac_ctrl_data |= atl1c_mac_speed_10_100 << MAC_CTRL_SPEED_SHIFT;
2391 mac_ctrl_data |= MAC_CTRL_DUPLX;
2392 phy_ctrl_data |= GPHY_CTRL_PHY_IDDQ | GPHY_CTRL_PWDOWN_HW;
2393 wol_ctrl_data = 0;
2394 hw->phy_configured = false; /* re-init PHY when resume */
2395 }
2396
2397 AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data);
2398 AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
2399 AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data);
2400 AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data);
2401 2316
2402 return 0; 2317 return 0;
2403} 2318}