diff options
author | David S. Miller <davem@davemloft.net> | 2013-02-10 19:05:49 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-10 19:05:49 -0500 |
commit | b185af000984b41be45537780a456e2b979bfc17 (patch) | |
tree | 369ce5a8bc423bee721f5f464fe3fbc4b9a95a0a | |
parent | 836dc9e3fbbab0c30aa6e664417225f5c1fb1c39 (diff) | |
parent | 4521e1a94279ce610d3f9b7945c17d581f804242 (diff) |
Merge branch 'davem.r8169' of git://violet.fr.zoreil.com/romieu/linux
Revert two power saving r8169 changes to fix some regressions
reported.
Reported-by: Jörg Otte <jrg.otte@gmail.com>
Tested-by: Jörg Otte <jrg.otte@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 86 |
1 files changed, 19 insertions, 67 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 11702324a071..998974f78742 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -450,7 +450,6 @@ enum rtl8168_registers { | |||
450 | #define PWM_EN (1 << 22) | 450 | #define PWM_EN (1 << 22) |
451 | #define RXDV_GATED_EN (1 << 19) | 451 | #define RXDV_GATED_EN (1 << 19) |
452 | #define EARLY_TALLY_EN (1 << 16) | 452 | #define EARLY_TALLY_EN (1 << 16) |
453 | #define FORCE_CLK (1 << 15) /* force clock request */ | ||
454 | }; | 453 | }; |
455 | 454 | ||
456 | enum rtl_register_content { | 455 | enum rtl_register_content { |
@@ -514,7 +513,6 @@ enum rtl_register_content { | |||
514 | PMEnable = (1 << 0), /* Power Management Enable */ | 513 | PMEnable = (1 << 0), /* Power Management Enable */ |
515 | 514 | ||
516 | /* Config2 register p. 25 */ | 515 | /* Config2 register p. 25 */ |
517 | ClkReqEn = (1 << 7), /* Clock Request Enable */ | ||
518 | MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */ | 516 | MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */ |
519 | PCI_Clock_66MHz = 0x01, | 517 | PCI_Clock_66MHz = 0x01, |
520 | PCI_Clock_33MHz = 0x00, | 518 | PCI_Clock_33MHz = 0x00, |
@@ -535,7 +533,6 @@ enum rtl_register_content { | |||
535 | Spi_en = (1 << 3), | 533 | Spi_en = (1 << 3), |
536 | LanWake = (1 << 1), /* LanWake enable/disable */ | 534 | LanWake = (1 << 1), /* LanWake enable/disable */ |
537 | PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */ | 535 | PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */ |
538 | ASPM_en = (1 << 0), /* ASPM enable */ | ||
539 | 536 | ||
540 | /* TBICSR p.28 */ | 537 | /* TBICSR p.28 */ |
541 | TBIReset = 0x80000000, | 538 | TBIReset = 0x80000000, |
@@ -684,7 +681,6 @@ enum features { | |||
684 | RTL_FEATURE_WOL = (1 << 0), | 681 | RTL_FEATURE_WOL = (1 << 0), |
685 | RTL_FEATURE_MSI = (1 << 1), | 682 | RTL_FEATURE_MSI = (1 << 1), |
686 | RTL_FEATURE_GMII = (1 << 2), | 683 | RTL_FEATURE_GMII = (1 << 2), |
687 | RTL_FEATURE_FW_LOADED = (1 << 3), | ||
688 | }; | 684 | }; |
689 | 685 | ||
690 | struct rtl8169_counters { | 686 | struct rtl8169_counters { |
@@ -2389,10 +2385,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp) | |||
2389 | struct rtl_fw *rtl_fw = tp->rtl_fw; | 2385 | struct rtl_fw *rtl_fw = tp->rtl_fw; |
2390 | 2386 | ||
2391 | /* TODO: release firmware once rtl_phy_write_fw signals failures. */ | 2387 | /* TODO: release firmware once rtl_phy_write_fw signals failures. */ |
2392 | if (!IS_ERR_OR_NULL(rtl_fw)) { | 2388 | if (!IS_ERR_OR_NULL(rtl_fw)) |
2393 | rtl_phy_write_fw(tp, rtl_fw); | 2389 | rtl_phy_write_fw(tp, rtl_fw); |
2394 | tp->features |= RTL_FEATURE_FW_LOADED; | ||
2395 | } | ||
2396 | } | 2390 | } |
2397 | 2391 | ||
2398 | static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) | 2392 | static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) |
@@ -2403,31 +2397,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) | |||
2403 | rtl_apply_firmware(tp); | 2397 | rtl_apply_firmware(tp); |
2404 | } | 2398 | } |
2405 | 2399 | ||
2406 | static void r810x_aldps_disable(struct rtl8169_private *tp) | ||
2407 | { | ||
2408 | rtl_writephy(tp, 0x1f, 0x0000); | ||
2409 | rtl_writephy(tp, 0x18, 0x0310); | ||
2410 | msleep(100); | ||
2411 | } | ||
2412 | |||
2413 | static void r810x_aldps_enable(struct rtl8169_private *tp) | ||
2414 | { | ||
2415 | if (!(tp->features & RTL_FEATURE_FW_LOADED)) | ||
2416 | return; | ||
2417 | |||
2418 | rtl_writephy(tp, 0x1f, 0x0000); | ||
2419 | rtl_writephy(tp, 0x18, 0x8310); | ||
2420 | } | ||
2421 | |||
2422 | static void r8168_aldps_enable_1(struct rtl8169_private *tp) | ||
2423 | { | ||
2424 | if (!(tp->features & RTL_FEATURE_FW_LOADED)) | ||
2425 | return; | ||
2426 | |||
2427 | rtl_writephy(tp, 0x1f, 0x0000); | ||
2428 | rtl_w1w0_phy(tp, 0x15, 0x1000, 0x0000); | ||
2429 | } | ||
2430 | |||
2431 | static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) | 2400 | static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) |
2432 | { | 2401 | { |
2433 | static const struct phy_reg phy_reg_init[] = { | 2402 | static const struct phy_reg phy_reg_init[] = { |
@@ -3218,8 +3187,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp) | |||
3218 | rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); | 3187 | rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); |
3219 | rtl_writephy(tp, 0x1f, 0x0000); | 3188 | rtl_writephy(tp, 0x1f, 0x0000); |
3220 | 3189 | ||
3221 | r8168_aldps_enable_1(tp); | ||
3222 | |||
3223 | /* Broken BIOS workaround: feed GigaMAC registers with MAC address. */ | 3190 | /* Broken BIOS workaround: feed GigaMAC registers with MAC address. */ |
3224 | rtl_rar_exgmac_set(tp, tp->dev->dev_addr); | 3191 | rtl_rar_exgmac_set(tp, tp->dev->dev_addr); |
3225 | } | 3192 | } |
@@ -3294,8 +3261,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp) | |||
3294 | rtl_writephy(tp, 0x05, 0x8b85); | 3261 | rtl_writephy(tp, 0x05, 0x8b85); |
3295 | rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000); | 3262 | rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000); |
3296 | rtl_writephy(tp, 0x1f, 0x0000); | 3263 | rtl_writephy(tp, 0x1f, 0x0000); |
3297 | |||
3298 | r8168_aldps_enable_1(tp); | ||
3299 | } | 3264 | } |
3300 | 3265 | ||
3301 | static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) | 3266 | static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) |
@@ -3303,8 +3268,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) | |||
3303 | rtl_apply_firmware(tp); | 3268 | rtl_apply_firmware(tp); |
3304 | 3269 | ||
3305 | rtl8168f_hw_phy_config(tp); | 3270 | rtl8168f_hw_phy_config(tp); |
3306 | |||
3307 | r8168_aldps_enable_1(tp); | ||
3308 | } | 3271 | } |
3309 | 3272 | ||
3310 | static void rtl8411_hw_phy_config(struct rtl8169_private *tp) | 3273 | static void rtl8411_hw_phy_config(struct rtl8169_private *tp) |
@@ -3402,8 +3365,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp) | |||
3402 | rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001); | 3365 | rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001); |
3403 | rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); | 3366 | rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); |
3404 | rtl_writephy(tp, 0x1f, 0x0000); | 3367 | rtl_writephy(tp, 0x1f, 0x0000); |
3405 | |||
3406 | r8168_aldps_enable_1(tp); | ||
3407 | } | 3368 | } |
3408 | 3369 | ||
3409 | static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp) | 3370 | static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp) |
@@ -3489,19 +3450,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp) | |||
3489 | }; | 3450 | }; |
3490 | 3451 | ||
3491 | /* Disable ALDPS before ram code */ | 3452 | /* Disable ALDPS before ram code */ |
3492 | r810x_aldps_disable(tp); | 3453 | rtl_writephy(tp, 0x1f, 0x0000); |
3454 | rtl_writephy(tp, 0x18, 0x0310); | ||
3455 | msleep(100); | ||
3493 | 3456 | ||
3494 | rtl_apply_firmware(tp); | 3457 | rtl_apply_firmware(tp); |
3495 | 3458 | ||
3496 | rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); | 3459 | rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); |
3497 | |||
3498 | r810x_aldps_enable(tp); | ||
3499 | } | 3460 | } |
3500 | 3461 | ||
3501 | static void rtl8402_hw_phy_config(struct rtl8169_private *tp) | 3462 | static void rtl8402_hw_phy_config(struct rtl8169_private *tp) |
3502 | { | 3463 | { |
3503 | /* Disable ALDPS before setting firmware */ | 3464 | /* Disable ALDPS before setting firmware */ |
3504 | r810x_aldps_disable(tp); | 3465 | rtl_writephy(tp, 0x1f, 0x0000); |
3466 | rtl_writephy(tp, 0x18, 0x0310); | ||
3467 | msleep(20); | ||
3505 | 3468 | ||
3506 | rtl_apply_firmware(tp); | 3469 | rtl_apply_firmware(tp); |
3507 | 3470 | ||
@@ -3511,8 +3474,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp) | |||
3511 | rtl_writephy(tp, 0x10, 0x401f); | 3474 | rtl_writephy(tp, 0x10, 0x401f); |
3512 | rtl_writephy(tp, 0x19, 0x7030); | 3475 | rtl_writephy(tp, 0x19, 0x7030); |
3513 | rtl_writephy(tp, 0x1f, 0x0000); | 3476 | rtl_writephy(tp, 0x1f, 0x0000); |
3514 | |||
3515 | r810x_aldps_enable(tp); | ||
3516 | } | 3477 | } |
3517 | 3478 | ||
3518 | static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) | 3479 | static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) |
@@ -3525,7 +3486,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) | |||
3525 | }; | 3486 | }; |
3526 | 3487 | ||
3527 | /* Disable ALDPS before ram code */ | 3488 | /* Disable ALDPS before ram code */ |
3528 | r810x_aldps_disable(tp); | 3489 | rtl_writephy(tp, 0x1f, 0x0000); |
3490 | rtl_writephy(tp, 0x18, 0x0310); | ||
3491 | msleep(100); | ||
3529 | 3492 | ||
3530 | rtl_apply_firmware(tp); | 3493 | rtl_apply_firmware(tp); |
3531 | 3494 | ||
@@ -3533,8 +3496,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) | |||
3533 | rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); | 3496 | rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); |
3534 | 3497 | ||
3535 | rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); | 3498 | rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); |
3536 | |||
3537 | r810x_aldps_enable(tp); | ||
3538 | } | 3499 | } |
3539 | 3500 | ||
3540 | static void rtl_hw_phy_config(struct net_device *dev) | 3501 | static void rtl_hw_phy_config(struct net_device *dev) |
@@ -5051,6 +5012,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp) | |||
5051 | 5012 | ||
5052 | RTL_W8(MaxTxPacketSize, EarlySize); | 5013 | RTL_W8(MaxTxPacketSize, EarlySize); |
5053 | 5014 | ||
5015 | rtl_disable_clock_request(pdev); | ||
5016 | |||
5054 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); | 5017 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); |
5055 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); | 5018 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); |
5056 | 5019 | ||
@@ -5059,8 +5022,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp) | |||
5059 | 5022 | ||
5060 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); | 5023 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); |
5061 | RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); | 5024 | RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); |
5062 | RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); | 5025 | RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en); |
5063 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5064 | } | 5026 | } |
5065 | 5027 | ||
5066 | static void rtl_hw_start_8168f(struct rtl8169_private *tp) | 5028 | static void rtl_hw_start_8168f(struct rtl8169_private *tp) |
@@ -5085,12 +5047,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp) | |||
5085 | 5047 | ||
5086 | RTL_W8(MaxTxPacketSize, EarlySize); | 5048 | RTL_W8(MaxTxPacketSize, EarlySize); |
5087 | 5049 | ||
5050 | rtl_disable_clock_request(pdev); | ||
5051 | |||
5088 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); | 5052 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); |
5089 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); | 5053 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); |
5090 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); | 5054 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); |
5091 | RTL_W32(MISC, RTL_R32(MISC) | PWM_EN | FORCE_CLK); | 5055 | RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); |
5092 | RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); | 5056 | RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en); |
5093 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5094 | } | 5057 | } |
5095 | 5058 | ||
5096 | static void rtl_hw_start_8168f_1(struct rtl8169_private *tp) | 5059 | static void rtl_hw_start_8168f_1(struct rtl8169_private *tp) |
@@ -5147,10 +5110,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp) | |||
5147 | rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC); | 5110 | rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC); |
5148 | 5111 | ||
5149 | RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); | 5112 | RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); |
5150 | RTL_W32(MISC, (RTL_R32(MISC) | FORCE_CLK) & ~RXDV_GATED_EN); | 5113 | RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN); |
5151 | RTL_W8(MaxTxPacketSize, EarlySize); | 5114 | RTL_W8(MaxTxPacketSize, EarlySize); |
5152 | RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); | ||
5153 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5154 | 5115 | ||
5155 | rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); | 5116 | rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); |
5156 | rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); | 5117 | rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); |
@@ -5366,9 +5327,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp) | |||
5366 | 5327 | ||
5367 | RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); | 5328 | RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); |
5368 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); | 5329 | RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); |
5369 | RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); | ||
5370 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5371 | RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK); | ||
5372 | 5330 | ||
5373 | rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1)); | 5331 | rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1)); |
5374 | } | 5332 | } |
@@ -5394,9 +5352,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp) | |||
5394 | 5352 | ||
5395 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); | 5353 | RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); |
5396 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); | 5354 | RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); |
5397 | RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); | ||
5398 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5399 | RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK); | ||
5400 | 5355 | ||
5401 | rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402)); | 5356 | rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402)); |
5402 | 5357 | ||
@@ -5418,10 +5373,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp) | |||
5418 | /* Force LAN exit from ASPM if Rx/Tx are not idle */ | 5373 | /* Force LAN exit from ASPM if Rx/Tx are not idle */ |
5419 | RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800); | 5374 | RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800); |
5420 | 5375 | ||
5421 | RTL_W32(MISC, | 5376 | RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN); |
5422 | (RTL_R32(MISC) | DISABLE_LAN_EN | FORCE_CLK) & ~EARLY_TALLY_EN); | ||
5423 | RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); | ||
5424 | RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); | ||
5425 | RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); | 5377 | RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); |
5426 | RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN); | 5378 | RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN); |
5427 | } | 5379 | } |