diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/phy/marvell.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index b1413aed3f98..721a090a01bc 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
@@ -75,6 +75,9 @@ | |||
75 | #define MII_88E1121_PHY_MSCR_TX_DELAY BIT(4) | 75 | #define MII_88E1121_PHY_MSCR_TX_DELAY BIT(4) |
76 | #define MII_88E1121_PHY_MSCR_DELAY_MASK (~(0x3 << 4)) | 76 | #define MII_88E1121_PHY_MSCR_DELAY_MASK (~(0x3 << 4)) |
77 | 77 | ||
78 | #define MII_88EC048_PHY_MSCR1_REG 16 | ||
79 | #define MII_88EC048_PHY_MSCR1_PAD_ODD BIT(6) | ||
80 | |||
78 | #define MII_88E1121_PHY_LED_CTRL 16 | 81 | #define MII_88E1121_PHY_LED_CTRL 16 |
79 | #define MII_88E1121_PHY_LED_PAGE 3 | 82 | #define MII_88E1121_PHY_LED_PAGE 3 |
80 | #define MII_88E1121_PHY_LED_DEF 0x0030 | 83 | #define MII_88E1121_PHY_LED_DEF 0x0030 |
@@ -231,6 +234,31 @@ static int m88e1121_config_aneg(struct phy_device *phydev) | |||
231 | return err; | 234 | return err; |
232 | } | 235 | } |
233 | 236 | ||
237 | static int m88ec048_config_aneg(struct phy_device *phydev) | ||
238 | { | ||
239 | int err, oldpage, mscr; | ||
240 | |||
241 | oldpage = phy_read(phydev, MII_88E1121_PHY_PAGE); | ||
242 | |||
243 | err = phy_write(phydev, MII_88E1121_PHY_PAGE, | ||
244 | MII_88E1121_PHY_MSCR_PAGE); | ||
245 | if (err < 0) | ||
246 | return err; | ||
247 | |||
248 | mscr = phy_read(phydev, MII_88EC048_PHY_MSCR1_REG); | ||
249 | mscr |= MII_88EC048_PHY_MSCR1_PAD_ODD; | ||
250 | |||
251 | err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr); | ||
252 | if (err < 0) | ||
253 | return err; | ||
254 | |||
255 | err = phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage); | ||
256 | if (err < 0) | ||
257 | return err; | ||
258 | |||
259 | return m88e1121_config_aneg(phydev); | ||
260 | } | ||
261 | |||
234 | static int m88e1111_config_init(struct phy_device *phydev) | 262 | static int m88e1111_config_init(struct phy_device *phydev) |
235 | { | 263 | { |
236 | int err; | 264 | int err; |
@@ -622,6 +650,19 @@ static struct phy_driver marvell_drivers[] = { | |||
622 | .driver = { .owner = THIS_MODULE }, | 650 | .driver = { .owner = THIS_MODULE }, |
623 | }, | 651 | }, |
624 | { | 652 | { |
653 | .phy_id = 0x01410e90, | ||
654 | .phy_id_mask = 0xfffffff0, | ||
655 | .name = "Marvell 88EC048", | ||
656 | .features = PHY_GBIT_FEATURES, | ||
657 | .flags = PHY_HAS_INTERRUPT, | ||
658 | .config_aneg = &m88ec048_config_aneg, | ||
659 | .read_status = &marvell_read_status, | ||
660 | .ack_interrupt = &marvell_ack_interrupt, | ||
661 | .config_intr = &marvell_config_intr, | ||
662 | .did_interrupt = &m88e1121_did_interrupt, | ||
663 | .driver = { .owner = THIS_MODULE }, | ||
664 | }, | ||
665 | { | ||
625 | .phy_id = 0x01410cd0, | 666 | .phy_id = 0x01410cd0, |
626 | .phy_id_mask = 0xfffffff0, | 667 | .phy_id_mask = 0xfffffff0, |
627 | .name = "Marvell 88E1145", | 668 | .name = "Marvell 88E1145", |
@@ -686,6 +727,7 @@ static struct mdio_device_id marvell_tbl[] = { | |||
686 | { 0x01410cb0, 0xfffffff0 }, | 727 | { 0x01410cb0, 0xfffffff0 }, |
687 | { 0x01410cd0, 0xfffffff0 }, | 728 | { 0x01410cd0, 0xfffffff0 }, |
688 | { 0x01410e30, 0xfffffff0 }, | 729 | { 0x01410e30, 0xfffffff0 }, |
730 | { 0x01410e90, 0xfffffff0 }, | ||
689 | { } | 731 | { } |
690 | }; | 732 | }; |
691 | 733 | ||