diff options
author | Nithin Sujir <nsujir@broadcom.com> | 2013-05-13 07:04:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-14 14:32:04 -0400 |
commit | 44f3b503c16425c8e9db4bbaa2fc9cd0c9d0ba91 (patch) | |
tree | cdf4418223656681ad570c8e6aefec4bf17c1425 | |
parent | dbbffe6898fd0d7bac66ded5d3c58835b13ddefc (diff) |
tg3: Skip powering down function 0 on certain serdes devices
On the 5718, 5719 and 5720 serdes devices, powering down function 0
results in all the other ports being powered down. Add code to skip
function 0 power down.
v2:
- Modify tg3_phy_power_bug() function to use a switch instead of a
complicated if statement. Suggested by Joe Perches.
Cc: <stable@vger.kernel.org>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 728d42ab2a76..781be7660125 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -2957,6 +2957,31 @@ static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed) | |||
2957 | return 0; | 2957 | return 0; |
2958 | } | 2958 | } |
2959 | 2959 | ||
2960 | static bool tg3_phy_power_bug(struct tg3 *tp) | ||
2961 | { | ||
2962 | switch (tg3_asic_rev(tp)) { | ||
2963 | case ASIC_REV_5700: | ||
2964 | case ASIC_REV_5704: | ||
2965 | return true; | ||
2966 | case ASIC_REV_5780: | ||
2967 | if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) | ||
2968 | return true; | ||
2969 | return false; | ||
2970 | case ASIC_REV_5717: | ||
2971 | if (!tp->pci_fn) | ||
2972 | return true; | ||
2973 | return false; | ||
2974 | case ASIC_REV_5719: | ||
2975 | case ASIC_REV_5720: | ||
2976 | if ((tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && | ||
2977 | !tp->pci_fn) | ||
2978 | return true; | ||
2979 | return false; | ||
2980 | } | ||
2981 | |||
2982 | return false; | ||
2983 | } | ||
2984 | |||
2960 | static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) | 2985 | static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) |
2961 | { | 2986 | { |
2962 | u32 val; | 2987 | u32 val; |
@@ -3016,12 +3041,7 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) | |||
3016 | /* The PHY should not be powered down on some chips because | 3041 | /* The PHY should not be powered down on some chips because |
3017 | * of bugs. | 3042 | * of bugs. |
3018 | */ | 3043 | */ |
3019 | if (tg3_asic_rev(tp) == ASIC_REV_5700 || | 3044 | if (tg3_phy_power_bug(tp)) |
3020 | tg3_asic_rev(tp) == ASIC_REV_5704 || | ||
3021 | (tg3_asic_rev(tp) == ASIC_REV_5780 && | ||
3022 | (tp->phy_flags & TG3_PHYFLG_MII_SERDES)) || | ||
3023 | (tg3_asic_rev(tp) == ASIC_REV_5717 && | ||
3024 | !tp->pci_fn)) | ||
3025 | return; | 3045 | return; |
3026 | 3046 | ||
3027 | if (tg3_chip_rev(tp) == CHIPREV_5784_AX || | 3047 | if (tg3_chip_rev(tp) == CHIPREV_5784_AX || |