diff options
-rw-r--r-- | drivers/net/phy/bcm7xxx.c | 31 | ||||
-rw-r--r-- | include/linux/brcmphy.h | 3 |
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c index 29e256a4ed57..e98c510b75c5 100644 --- a/drivers/net/phy/bcm7xxx.c +++ b/drivers/net/phy/bcm7xxx.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/bitops.h> | 15 | #include <linux/bitops.h> |
16 | #include <linux/brcmphy.h> | 16 | #include <linux/brcmphy.h> |
17 | #include <linux/mdio.h> | ||
17 | 18 | ||
18 | /* Broadcom BCM7xxx internal PHY registers */ | 19 | /* Broadcom BCM7xxx internal PHY registers */ |
19 | #define MII_BCM7XXX_CHANNEL_WIDTH 0x2000 | 20 | #define MII_BCM7XXX_CHANNEL_WIDTH 0x2000 |
@@ -167,6 +168,32 @@ static int bcm7xxx_apd_enable(struct phy_device *phydev) | |||
167 | return bcm54xx_shadow_write(phydev, BCM54XX_SHD_APD, val); | 168 | return bcm54xx_shadow_write(phydev, BCM54XX_SHD_APD, val); |
168 | } | 169 | } |
169 | 170 | ||
171 | static int bcm7xxx_eee_enable(struct phy_device *phydev) | ||
172 | { | ||
173 | int val; | ||
174 | |||
175 | val = phy_read_mmd_indirect(phydev, BRCM_CL45VEN_EEE_CONTROL, | ||
176 | MDIO_MMD_AN, phydev->addr); | ||
177 | if (val < 0) | ||
178 | return val; | ||
179 | |||
180 | /* Enable general EEE feature at the PHY level */ | ||
181 | val |= LPI_FEATURE_EN | LPI_FEATURE_EN_DIG1000X; | ||
182 | |||
183 | phy_write_mmd_indirect(phydev, BRCM_CL45VEN_EEE_CONTROL, | ||
184 | MDIO_MMD_AN, phydev->addr, val); | ||
185 | |||
186 | /* Advertise supported modes */ | ||
187 | val = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, | ||
188 | MDIO_MMD_AN, phydev->addr); | ||
189 | |||
190 | val |= (MDIO_AN_EEE_ADV_100TX | MDIO_AN_EEE_ADV_1000T); | ||
191 | phy_write_mmd_indirect(phydev, MDIO_AN_EEE_ADV, | ||
192 | MDIO_MMD_AN, phydev->addr, val); | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
170 | static int bcm7xxx_28nm_config_init(struct phy_device *phydev) | 197 | static int bcm7xxx_28nm_config_init(struct phy_device *phydev) |
171 | { | 198 | { |
172 | int ret; | 199 | int ret; |
@@ -179,6 +206,10 @@ static int bcm7xxx_28nm_config_init(struct phy_device *phydev) | |||
179 | if (ret) | 206 | if (ret) |
180 | return ret; | 207 | return ret; |
181 | 208 | ||
209 | ret = bcm7xxx_eee_enable(phydev); | ||
210 | if (ret) | ||
211 | return ret; | ||
212 | |||
182 | return bcm7xxx_apd_enable(phydev); | 213 | return bcm7xxx_apd_enable(phydev); |
183 | } | 214 | } |
184 | 215 | ||
diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h index 722cf26567fa..ee1431d976fa 100644 --- a/include/linux/brcmphy.h +++ b/include/linux/brcmphy.h | |||
@@ -214,5 +214,8 @@ static inline int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow, | |||
214 | MII_BCM54XX_SHD_DATA(val)); | 214 | MII_BCM54XX_SHD_DATA(val)); |
215 | } | 215 | } |
216 | 216 | ||
217 | #define BRCM_CL45VEN_EEE_CONTROL 0x803d | ||
218 | #define LPI_FEATURE_EN 0x8000 | ||
219 | #define LPI_FEATURE_EN_DIG1000X 0x4000 | ||
217 | 220 | ||
218 | #endif /* _LINUX_BRCMPHY_H */ | 221 | #endif /* _LINUX_BRCMPHY_H */ |