Lines Matching refs:phy

50 static inline int __sungem_phy_read(struct mii_phy* phy, int id, int reg)  in __sungem_phy_read()  argument
52 return phy->mdio_read(phy->dev, id, reg); in __sungem_phy_read()
55 static inline void __sungem_phy_write(struct mii_phy* phy, int id, int reg, int val) in __sungem_phy_write() argument
57 phy->mdio_write(phy->dev, id, reg, val); in __sungem_phy_write()
60 static inline int sungem_phy_read(struct mii_phy* phy, int reg) in sungem_phy_read() argument
62 return phy->mdio_read(phy->dev, phy->mii_id, reg); in sungem_phy_read()
65 static inline void sungem_phy_write(struct mii_phy* phy, int reg, int val) in sungem_phy_write() argument
67 phy->mdio_write(phy->dev, phy->mii_id, reg, val); in sungem_phy_write()
70 static int reset_one_mii_phy(struct mii_phy* phy, int phy_id) in reset_one_mii_phy() argument
75 val = __sungem_phy_read(phy, phy_id, MII_BMCR); in reset_one_mii_phy()
78 __sungem_phy_write(phy, phy_id, MII_BMCR, val); in reset_one_mii_phy()
83 val = __sungem_phy_read(phy, phy_id, MII_BMCR); in reset_one_mii_phy()
89 __sungem_phy_write(phy, phy_id, MII_BMCR, val & ~BMCR_ISOLATE); in reset_one_mii_phy()
94 static int bcm5201_init(struct mii_phy* phy) in bcm5201_init() argument
98 data = sungem_phy_read(phy, MII_BCM5201_MULTIPHY); in bcm5201_init()
100 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, data); in bcm5201_init()
102 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0); in bcm5201_init()
107 static int bcm5201_suspend(struct mii_phy* phy) in bcm5201_suspend() argument
109 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0); in bcm5201_suspend()
110 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE); in bcm5201_suspend()
115 static int bcm5221_init(struct mii_phy* phy) in bcm5221_init() argument
119 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_init()
120 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_init()
123 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2); in bcm5221_init()
124 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2, in bcm5221_init()
127 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5221_init()
128 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5221_init()
131 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_init()
132 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_init()
138 static int bcm5221_suspend(struct mii_phy* phy) in bcm5221_suspend() argument
142 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_suspend()
143 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_suspend()
146 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5221_suspend()
147 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5221_suspend()
153 static int bcm5241_init(struct mii_phy* phy) in bcm5241_init() argument
157 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_init()
158 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_init()
161 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2); in bcm5241_init()
162 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2, in bcm5241_init()
165 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5241_init()
166 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5241_init()
169 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_init()
170 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_init()
176 static int bcm5241_suspend(struct mii_phy* phy) in bcm5241_suspend() argument
180 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_suspend()
181 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_suspend()
184 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5241_suspend()
185 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5241_suspend()
191 static int bcm5400_init(struct mii_phy* phy) in bcm5400_init() argument
196 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL); in bcm5400_init()
198 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data); in bcm5400_init()
200 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5400_init()
202 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5400_init()
207 (void)reset_one_mii_phy(phy, 0x1f); in bcm5400_init()
209 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY); in bcm5400_init()
211 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data); in bcm5400_init()
213 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL); in bcm5400_init()
215 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data); in bcm5400_init()
220 static int bcm5400_suspend(struct mii_phy* phy) in bcm5400_suspend() argument
223 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in bcm5400_suspend()
228 static int bcm5401_init(struct mii_phy* phy) in bcm5401_init() argument
233 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f; in bcm5401_init()
246 sungem_phy_write(phy, 0x18, 0x0c20); in bcm5401_init()
247 sungem_phy_write(phy, 0x17, 0x0012); in bcm5401_init()
248 sungem_phy_write(phy, 0x15, 0x1804); in bcm5401_init()
249 sungem_phy_write(phy, 0x17, 0x0013); in bcm5401_init()
250 sungem_phy_write(phy, 0x15, 0x1204); in bcm5401_init()
251 sungem_phy_write(phy, 0x17, 0x8006); in bcm5401_init()
252 sungem_phy_write(phy, 0x15, 0x0132); in bcm5401_init()
253 sungem_phy_write(phy, 0x17, 0x8006); in bcm5401_init()
254 sungem_phy_write(phy, 0x15, 0x0232); in bcm5401_init()
255 sungem_phy_write(phy, 0x17, 0x201f); in bcm5401_init()
256 sungem_phy_write(phy, 0x15, 0x0a20); in bcm5401_init()
260 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5401_init()
262 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5401_init()
267 (void)reset_one_mii_phy(phy, 0x1f); in bcm5401_init()
269 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY); in bcm5401_init()
271 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data); in bcm5401_init()
276 static int bcm5401_suspend(struct mii_phy* phy) in bcm5401_suspend() argument
279 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in bcm5401_suspend()
284 static int bcm5411_init(struct mii_phy* phy) in bcm5411_init() argument
291 sungem_phy_write(phy, 0x1c, 0x8c23); in bcm5411_init()
292 sungem_phy_write(phy, 0x1c, 0x8ca3); in bcm5411_init()
293 sungem_phy_write(phy, 0x1c, 0x8c23); in bcm5411_init()
298 sungem_phy_write(phy, MII_BMCR, BMCR_RESET); in bcm5411_init()
299 sungem_phy_write(phy, MII_BMCR, 0x1340); in bcm5411_init()
301 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5411_init()
303 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5411_init()
308 (void)reset_one_mii_phy(phy, 0x1f); in bcm5411_init()
313 static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) in genmii_setup_aneg() argument
317 phy->autoneg = 1; in genmii_setup_aneg()
318 phy->speed = SPEED_10; in genmii_setup_aneg()
319 phy->duplex = DUPLEX_HALF; in genmii_setup_aneg()
320 phy->pause = 0; in genmii_setup_aneg()
321 phy->advertising = advertise; in genmii_setup_aneg()
324 adv = sungem_phy_read(phy, MII_ADVERTISE); in genmii_setup_aneg()
334 sungem_phy_write(phy, MII_ADVERTISE, adv); in genmii_setup_aneg()
337 ctl = sungem_phy_read(phy, MII_BMCR); in genmii_setup_aneg()
339 sungem_phy_write(phy, MII_BMCR, ctl); in genmii_setup_aneg()
344 static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) in genmii_setup_forced() argument
348 phy->autoneg = 0; in genmii_setup_forced()
349 phy->speed = speed; in genmii_setup_forced()
350 phy->duplex = fd; in genmii_setup_forced()
351 phy->pause = 0; in genmii_setup_forced()
353 ctl = sungem_phy_read(phy, MII_BMCR); in genmii_setup_forced()
357 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET); in genmii_setup_forced()
372 sungem_phy_write(phy, MII_BMCR, ctl); in genmii_setup_forced()
377 static int genmii_poll_link(struct mii_phy *phy) in genmii_poll_link() argument
381 (void)sungem_phy_read(phy, MII_BMSR); in genmii_poll_link()
382 status = sungem_phy_read(phy, MII_BMSR); in genmii_poll_link()
385 if (phy->autoneg && !(status & BMSR_ANEGCOMPLETE)) in genmii_poll_link()
390 static int genmii_read_link(struct mii_phy *phy) in genmii_read_link() argument
394 if (phy->autoneg) { in genmii_read_link()
395 lpa = sungem_phy_read(phy, MII_LPA); in genmii_read_link()
398 phy->duplex = DUPLEX_FULL; in genmii_read_link()
400 phy->duplex = DUPLEX_HALF; in genmii_read_link()
402 phy->speed = SPEED_100; in genmii_read_link()
404 phy->speed = SPEED_10; in genmii_read_link()
405 phy->pause = 0; in genmii_read_link()
414 static int generic_suspend(struct mii_phy* phy) in generic_suspend() argument
416 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in generic_suspend()
421 static int bcm5421_init(struct mii_phy* phy) in bcm5421_init() argument
426 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2)); in bcm5421_init()
432 sungem_phy_write(phy, 0x18, 0x1007); in bcm5421_init()
433 data = sungem_phy_read(phy, 0x18); in bcm5421_init()
434 sungem_phy_write(phy, 0x18, data | 0x0400); in bcm5421_init()
435 sungem_phy_write(phy, 0x18, 0x0007); in bcm5421_init()
436 data = sungem_phy_read(phy, 0x18); in bcm5421_init()
437 sungem_phy_write(phy, 0x18, data | 0x0800); in bcm5421_init()
438 sungem_phy_write(phy, 0x17, 0x000a); in bcm5421_init()
439 data = sungem_phy_read(phy, 0x15); in bcm5421_init()
440 sungem_phy_write(phy, 0x15, data | 0x0200); in bcm5421_init()
445 sungem_phy_write(phy, 4, 0x01e1); in bcm5421_init()
446 sungem_phy_write(phy, 9, 0x0300); in bcm5421_init()
451 if (phy->platform_data) { in bcm5421_init()
452 struct device_node *np = of_get_parent(phy->platform_data); in bcm5421_init()
458 sungem_phy_write(phy, 0x1c, 0x9002); in bcm5421_init()
459 sungem_phy_write(phy, 0x1c, 0xa821); in bcm5421_init()
460 sungem_phy_write(phy, 0x1c, 0x941d); in bcm5421_init()
468 static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise) in bcm54xx_setup_aneg() argument
472 phy->autoneg = 1; in bcm54xx_setup_aneg()
473 phy->speed = SPEED_10; in bcm54xx_setup_aneg()
474 phy->duplex = DUPLEX_HALF; in bcm54xx_setup_aneg()
475 phy->pause = 0; in bcm54xx_setup_aneg()
476 phy->advertising = advertise; in bcm54xx_setup_aneg()
479 adv = sungem_phy_read(phy, MII_ADVERTISE); in bcm54xx_setup_aneg()
493 sungem_phy_write(phy, MII_ADVERTISE, adv); in bcm54xx_setup_aneg()
496 adv = sungem_phy_read(phy, MII_1000BASETCONTROL); in bcm54xx_setup_aneg()
502 sungem_phy_write(phy, MII_1000BASETCONTROL, adv); in bcm54xx_setup_aneg()
505 ctl = sungem_phy_read(phy, MII_BMCR); in bcm54xx_setup_aneg()
507 sungem_phy_write(phy, MII_BMCR, ctl); in bcm54xx_setup_aneg()
512 static int bcm54xx_setup_forced(struct mii_phy *phy, int speed, int fd) in bcm54xx_setup_forced() argument
516 phy->autoneg = 0; in bcm54xx_setup_forced()
517 phy->speed = speed; in bcm54xx_setup_forced()
518 phy->duplex = fd; in bcm54xx_setup_forced()
519 phy->pause = 0; in bcm54xx_setup_forced()
521 ctl = sungem_phy_read(phy, MII_BMCR); in bcm54xx_setup_forced()
525 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET); in bcm54xx_setup_forced()
542 sungem_phy_write(phy, MII_BMCR, ctl); in bcm54xx_setup_forced()
547 static int bcm54xx_read_link(struct mii_phy *phy) in bcm54xx_read_link() argument
552 if (phy->autoneg) { in bcm54xx_read_link()
553 val = sungem_phy_read(phy, MII_BCM5400_AUXSTATUS); in bcm54xx_read_link()
556 phy->duplex = phy_BCM5400_link_table[link_mode][0] ? in bcm54xx_read_link()
558 phy->speed = phy_BCM5400_link_table[link_mode][2] ? in bcm54xx_read_link()
562 val = sungem_phy_read(phy, MII_LPA); in bcm54xx_read_link()
563 phy->pause = (phy->duplex == DUPLEX_FULL) && in bcm54xx_read_link()
573 static int marvell88e1111_init(struct mii_phy* phy) in marvell88e1111_init() argument
578 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f; in marvell88e1111_init()
580 sungem_phy_write(phy, 0x1d, 0x000a); in marvell88e1111_init()
581 sungem_phy_write(phy, 0x1e, 0x0821); in marvell88e1111_init()
583 sungem_phy_write(phy, 0x1d, 0x0006); in marvell88e1111_init()
584 sungem_phy_write(phy, 0x1e, 0x8600); in marvell88e1111_init()
586 sungem_phy_write(phy, 0x1d, 0x000b); in marvell88e1111_init()
587 sungem_phy_write(phy, 0x1e, 0x0100); in marvell88e1111_init()
589 sungem_phy_write(phy, 0x1d, 0x0004); in marvell88e1111_init()
590 sungem_phy_write(phy, 0x1e, 0x4850); in marvell88e1111_init()
597 static int bcm5421_poll_link(struct mii_phy* phy) in bcm5421_poll_link() argument
603 sungem_phy_write(phy, MII_NCONFIG, 0x1000); in bcm5421_poll_link()
604 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_poll_link()
609 return genmii_poll_link(phy); in bcm5421_poll_link()
612 sungem_phy_write(phy, MII_NCONFIG, 0x2000); in bcm5421_poll_link()
613 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_poll_link()
621 static int bcm5421_read_link(struct mii_phy* phy) in bcm5421_read_link() argument
627 sungem_phy_write(phy, MII_NCONFIG, 0x1000); in bcm5421_read_link()
628 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_read_link()
633 return bcm54xx_read_link(phy); in bcm5421_read_link()
635 phy->speed = SPEED_1000; in bcm5421_read_link()
638 sungem_phy_write(phy, MII_NCONFIG, 0x2000); in bcm5421_read_link()
639 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_read_link()
642 phy->duplex |= DUPLEX_HALF; in bcm5421_read_link()
644 phy->duplex |= DUPLEX_FULL; in bcm5421_read_link()
649 static int bcm5421_enable_fiber(struct mii_phy* phy, int autoneg) in bcm5421_enable_fiber() argument
652 sungem_phy_write(phy, MII_NCONFIG, 0x9020); in bcm5421_enable_fiber()
654 sungem_phy_write(phy, MII_NCONFIG, 0x945f); in bcm5421_enable_fiber()
658 sungem_phy_write(phy, MII_NCONFIG, 0xfc01); in bcm5421_enable_fiber()
659 sungem_phy_write(phy, 0x0b, 0x0004); in bcm5421_enable_fiber()
662 phy->autoneg = autoneg; in bcm5421_enable_fiber()
670 static int bcm5461_poll_link(struct mii_phy* phy) in bcm5461_poll_link() argument
676 sungem_phy_write(phy, MII_NCONFIG, 0x7c00); in bcm5461_poll_link()
677 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_poll_link()
682 return genmii_poll_link(phy); in bcm5461_poll_link()
685 sungem_phy_write(phy, MII_NCONFIG, 0x7000); in bcm5461_poll_link()
686 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_poll_link()
696 static int bcm5461_read_link(struct mii_phy* phy) in bcm5461_read_link() argument
702 sungem_phy_write(phy, MII_NCONFIG, 0x7c00); in bcm5461_read_link()
703 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_read_link()
708 return bcm54xx_read_link(phy); in bcm5461_read_link()
711 phy->speed = SPEED_1000; in bcm5461_read_link()
714 sungem_phy_write(phy, MII_NCONFIG, 0x7000); in bcm5461_read_link()
715 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_read_link()
718 phy->duplex |= DUPLEX_FULL; in bcm5461_read_link()
720 phy->duplex |= DUPLEX_HALF; in bcm5461_read_link()
725 static int bcm5461_enable_fiber(struct mii_phy* phy, int autoneg) in bcm5461_enable_fiber() argument
728 sungem_phy_write(phy, MII_NCONFIG, 0xfc0b); in bcm5461_enable_fiber()
732 sungem_phy_write(phy, MII_ADVERTISE, 0x01e0); in bcm5461_enable_fiber()
733 sungem_phy_write(phy, MII_BMCR, 0x1140); in bcm5461_enable_fiber()
736 sungem_phy_write(phy, MII_BMCR, 0x0140); in bcm5461_enable_fiber()
739 phy->autoneg = autoneg; in bcm5461_enable_fiber()
744 static int marvell_setup_aneg(struct mii_phy *phy, u32 advertise) in marvell_setup_aneg() argument
748 phy->autoneg = 1; in marvell_setup_aneg()
749 phy->speed = SPEED_10; in marvell_setup_aneg()
750 phy->duplex = DUPLEX_HALF; in marvell_setup_aneg()
751 phy->pause = 0; in marvell_setup_aneg()
752 phy->advertising = advertise; in marvell_setup_aneg()
755 adv = sungem_phy_read(phy, MII_ADVERTISE); in marvell_setup_aneg()
769 sungem_phy_write(phy, MII_ADVERTISE, adv); in marvell_setup_aneg()
777 adv = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL); in marvell_setup_aneg()
785 sungem_phy_write(phy, MII_1000BASETCONTROL, adv); in marvell_setup_aneg()
788 ctl = sungem_phy_read(phy, MII_BMCR); in marvell_setup_aneg()
790 sungem_phy_write(phy, MII_BMCR, ctl); in marvell_setup_aneg()
795 static int marvell_setup_forced(struct mii_phy *phy, int speed, int fd) in marvell_setup_forced() argument
799 phy->autoneg = 0; in marvell_setup_forced()
800 phy->speed = speed; in marvell_setup_forced()
801 phy->duplex = fd; in marvell_setup_forced()
802 phy->pause = 0; in marvell_setup_forced()
804 ctl = sungem_phy_read(phy, MII_BMCR); in marvell_setup_forced()
827 ctl2 = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL); in marvell_setup_forced()
836 sungem_phy_write(phy, MII_1000BASETCONTROL, ctl2); in marvell_setup_forced()
840 sungem_phy_write(phy, MII_BMCR, ctl); in marvell_setup_forced()
845 static int marvell_read_link(struct mii_phy *phy) in marvell_read_link() argument
849 if (phy->autoneg) { in marvell_read_link()
850 status = sungem_phy_read(phy, MII_M1011_PHY_SPEC_STATUS); in marvell_read_link()
854 phy->speed = SPEED_1000; in marvell_read_link()
856 phy->speed = SPEED_100; in marvell_read_link()
858 phy->speed = SPEED_10; in marvell_read_link()
860 phy->duplex = DUPLEX_FULL; in marvell_read_link()
862 phy->duplex = DUPLEX_HALF; in marvell_read_link()
865 phy->pause = (status & pmask) == pmask; in marvell_read_link()
1159 int sungem_phy_probe(struct mii_phy *phy, int mii_id) in sungem_phy_probe() argument
1169 phy->mii_id = mii_id; in sungem_phy_probe()
1172 rc = reset_one_mii_phy(phy, mii_id); in sungem_phy_probe()
1177 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2)); in sungem_phy_probe()
1187 phy->def = def; in sungem_phy_probe()
1191 phy->speed = 0; in sungem_phy_probe()
1192 phy->duplex = 0; in sungem_phy_probe()
1193 phy->pause = 0; in sungem_phy_probe()
1194 phy->advertising = 0; in sungem_phy_probe()