Lines Matching refs:phy

51 static inline int __sungem_phy_read(struct mii_phy* phy, int id, int reg)
53 return phy->mdio_read(phy->dev, id, reg);
56 static inline void __sungem_phy_write(struct mii_phy* phy, int id, int reg, int val)
58 phy->mdio_write(phy->dev, id, reg, val);
61 static inline int sungem_phy_read(struct mii_phy* phy, int reg)
63 return phy->mdio_read(phy->dev, phy->mii_id, reg);
66 static inline void sungem_phy_write(struct mii_phy* phy, int reg, int val)
68 phy->mdio_write(phy->dev, phy->mii_id, reg, val);
71 static int reset_one_mii_phy(struct mii_phy* phy, int phy_id)
76 val = __sungem_phy_read(phy, phy_id, MII_BMCR);
79 __sungem_phy_write(phy, phy_id, MII_BMCR, val);
84 val = __sungem_phy_read(phy, phy_id, MII_BMCR);
90 __sungem_phy_write(phy, phy_id, MII_BMCR, val & ~BMCR_ISOLATE);
95 static int bcm5201_init(struct mii_phy* phy)
99 data = sungem_phy_read(phy, MII_BCM5201_MULTIPHY);
101 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, data);
103 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0);
108 static int bcm5201_suspend(struct mii_phy* phy)
110 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0);
111 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE);
116 static int bcm5221_init(struct mii_phy* phy)
120 data = sungem_phy_read(phy, MII_BCM5221_TEST);
121 sungem_phy_write(phy, MII_BCM5221_TEST,
124 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2);
125 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2,
128 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
129 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
132 data = sungem_phy_read(phy, MII_BCM5221_TEST);
133 sungem_phy_write(phy, MII_BCM5221_TEST,
139 static int bcm5221_suspend(struct mii_phy* phy)
143 data = sungem_phy_read(phy, MII_BCM5221_TEST);
144 sungem_phy_write(phy, MII_BCM5221_TEST,
147 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
148 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
154 static int bcm5241_init(struct mii_phy* phy)
158 data = sungem_phy_read(phy, MII_BCM5221_TEST);
159 sungem_phy_write(phy, MII_BCM5221_TEST,
162 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2);
163 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2,
166 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
167 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
170 data = sungem_phy_read(phy, MII_BCM5221_TEST);
171 sungem_phy_write(phy, MII_BCM5221_TEST,
177 static int bcm5241_suspend(struct mii_phy* phy)
181 data = sungem_phy_read(phy, MII_BCM5221_TEST);
182 sungem_phy_write(phy, MII_BCM5221_TEST,
185 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
186 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
192 static int bcm5400_init(struct mii_phy* phy)
197 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL);
199 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data);
201 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
203 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
208 (void)reset_one_mii_phy(phy, 0x1f);
210 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY);
212 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data);
214 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL);
216 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data);
221 static int bcm5400_suspend(struct mii_phy* phy)
224 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
229 static int bcm5401_init(struct mii_phy* phy)
234 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f;
247 sungem_phy_write(phy, 0x18, 0x0c20);
248 sungem_phy_write(phy, 0x17, 0x0012);
249 sungem_phy_write(phy, 0x15, 0x1804);
250 sungem_phy_write(phy, 0x17, 0x0013);
251 sungem_phy_write(phy, 0x15, 0x1204);
252 sungem_phy_write(phy, 0x17, 0x8006);
253 sungem_phy_write(phy, 0x15, 0x0132);
254 sungem_phy_write(phy, 0x17, 0x8006);
255 sungem_phy_write(phy, 0x15, 0x0232);
256 sungem_phy_write(phy, 0x17, 0x201f);
257 sungem_phy_write(phy, 0x15, 0x0a20);
261 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
263 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
268 (void)reset_one_mii_phy(phy, 0x1f);
270 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY);
272 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data);
277 static int bcm5401_suspend(struct mii_phy* phy)
280 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
285 static int bcm5411_init(struct mii_phy* phy)
292 sungem_phy_write(phy, 0x1c, 0x8c23);
293 sungem_phy_write(phy, 0x1c, 0x8ca3);
294 sungem_phy_write(phy, 0x1c, 0x8c23);
299 sungem_phy_write(phy, MII_BMCR, BMCR_RESET);
300 sungem_phy_write(phy, MII_BMCR, 0x1340);
302 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
304 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
309 (void)reset_one_mii_phy(phy, 0x1f);
314 static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise)
318 phy->autoneg = 1;
319 phy->speed = SPEED_10;
320 phy->duplex = DUPLEX_HALF;
321 phy->pause = 0;
322 phy->advertising = advertise;
325 adv = sungem_phy_read(phy, MII_ADVERTISE);
335 sungem_phy_write(phy, MII_ADVERTISE, adv);
338 ctl = sungem_phy_read(phy, MII_BMCR);
340 sungem_phy_write(phy, MII_BMCR, ctl);
345 static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd)
349 phy->autoneg = 0;
350 phy->speed = speed;
351 phy->duplex = fd;
352 phy->pause = 0;
354 ctl = sungem_phy_read(phy, MII_BMCR);
358 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET);
373 sungem_phy_write(phy, MII_BMCR, ctl);
378 static int genmii_poll_link(struct mii_phy *phy)
382 (void)sungem_phy_read(phy, MII_BMSR);
383 status = sungem_phy_read(phy, MII_BMSR);
386 if (phy->autoneg && !(status & BMSR_ANEGCOMPLETE))
391 static int genmii_read_link(struct mii_phy *phy)
395 if (phy->autoneg) {
396 lpa = sungem_phy_read(phy, MII_LPA);
399 phy->duplex = DUPLEX_FULL;
401 phy->duplex = DUPLEX_HALF;
403 phy->speed = SPEED_100;
405 phy->speed = SPEED_10;
406 phy->pause = 0;
415 static int generic_suspend(struct mii_phy* phy)
417 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
422 static int bcm5421_init(struct mii_phy* phy)
427 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2));
433 sungem_phy_write(phy, 0x18, 0x1007);
434 data = sungem_phy_read(phy, 0x18);
435 sungem_phy_write(phy, 0x18, data | 0x0400);
436 sungem_phy_write(phy, 0x18, 0x0007);
437 data = sungem_phy_read(phy, 0x18);
438 sungem_phy_write(phy, 0x18, data | 0x0800);
439 sungem_phy_write(phy, 0x17, 0x000a);
440 data = sungem_phy_read(phy, 0x15);
441 sungem_phy_write(phy, 0x15, data | 0x0200);
446 sungem_phy_write(phy, 4, 0x01e1);
447 sungem_phy_write(phy, 9, 0x0300);
452 if (phy->platform_data) {
453 struct device_node *np = of_get_parent(phy->platform_data);
460 sungem_phy_write(phy, 0x1c, 0x9002);
461 sungem_phy_write(phy, 0x1c, 0xa821);
462 sungem_phy_write(phy, 0x1c, 0x941d);
470 static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise)
474 phy->autoneg = 1;
475 phy->speed = SPEED_10;
476 phy->duplex = DUPLEX_HALF;
477 phy->pause = 0;
478 phy->advertising = advertise;
481 adv = sungem_phy_read(phy, MII_ADVERTISE);
495 sungem_phy_write(phy, MII_ADVERTISE, adv);
498 adv = sungem_phy_read(phy, MII_1000BASETCONTROL);
504 sungem_phy_write(phy, MII_1000BASETCONTROL, adv);
507 ctl = sungem_phy_read(phy, MII_BMCR);
509 sungem_phy_write(phy, MII_BMCR, ctl);
514 static int bcm54xx_setup_forced(struct mii_phy *phy, int speed, int fd)
518 phy->autoneg = 0;
519 phy->speed = speed;
520 phy->duplex = fd;
521 phy->pause = 0;
523 ctl = sungem_phy_read(phy, MII_BMCR);
527 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET);
544 sungem_phy_write(phy, MII_BMCR, ctl);
549 static int bcm54xx_read_link(struct mii_phy *phy)
554 if (phy->autoneg) {
555 val = sungem_phy_read(phy, MII_BCM5400_AUXSTATUS);
558 phy->duplex = phy_BCM5400_link_table[link_mode][0] ?
560 phy->speed = phy_BCM5400_link_table[link_mode][2] ?
564 val = sungem_phy_read(phy, MII_LPA);
565 phy->pause = (phy->duplex == DUPLEX_FULL) &&
575 static int marvell88e1111_init(struct mii_phy* phy)
580 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f;
582 sungem_phy_write(phy, 0x1d, 0x000a);
583 sungem_phy_write(phy, 0x1e, 0x0821);
585 sungem_phy_write(phy, 0x1d, 0x0006);
586 sungem_phy_write(phy, 0x1e, 0x8600);
588 sungem_phy_write(phy, 0x1d, 0x000b);
589 sungem_phy_write(phy, 0x1e, 0x0100);
591 sungem_phy_write(phy, 0x1d, 0x0004);
592 sungem_phy_write(phy, 0x1e, 0x4850);
599 static int bcm5421_poll_link(struct mii_phy* phy)
605 sungem_phy_write(phy, MII_NCONFIG, 0x1000);
606 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
611 return genmii_poll_link(phy);
614 sungem_phy_write(phy, MII_NCONFIG, 0x2000);
615 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
623 static int bcm5421_read_link(struct mii_phy* phy)
629 sungem_phy_write(phy, MII_NCONFIG, 0x1000);
630 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
635 return bcm54xx_read_link(phy);
637 phy->speed = SPEED_1000;
640 sungem_phy_write(phy, MII_NCONFIG, 0x2000);
641 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
644 phy->duplex |= DUPLEX_HALF;
646 phy->duplex |= DUPLEX_FULL;
651 static int bcm5421_enable_fiber(struct mii_phy* phy, int autoneg)
654 sungem_phy_write(phy, MII_NCONFIG, 0x9020);
656 sungem_phy_write(phy, MII_NCONFIG, 0x945f);
660 sungem_phy_write(phy, MII_NCONFIG, 0xfc01);
661 sungem_phy_write(phy, 0x0b, 0x0004);
664 phy->autoneg = autoneg;
672 static int bcm5461_poll_link(struct mii_phy* phy)
678 sungem_phy_write(phy, MII_NCONFIG, 0x7c00);
679 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
684 return genmii_poll_link(phy);
687 sungem_phy_write(phy, MII_NCONFIG, 0x7000);
688 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
698 static int bcm5461_read_link(struct mii_phy* phy)
704 sungem_phy_write(phy, MII_NCONFIG, 0x7c00);
705 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
710 return bcm54xx_read_link(phy);
713 phy->speed = SPEED_1000;
716 sungem_phy_write(phy, MII_NCONFIG, 0x7000);
717 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
720 phy->duplex |= DUPLEX_FULL;
722 phy->duplex |= DUPLEX_HALF;
727 static int bcm5461_enable_fiber(struct mii_phy* phy, int autoneg)
730 sungem_phy_write(phy, MII_NCONFIG, 0xfc0b);
734 sungem_phy_write(phy, MII_ADVERTISE, 0x01e0);
735 sungem_phy_write(phy, MII_BMCR, 0x1140);
738 sungem_phy_write(phy, MII_BMCR, 0x0140);
741 phy->autoneg = autoneg;
746 static int marvell_setup_aneg(struct mii_phy *phy, u32 advertise)
750 phy->autoneg = 1;
751 phy->speed = SPEED_10;
752 phy->duplex = DUPLEX_HALF;
753 phy->pause = 0;
754 phy->advertising = advertise;
757 adv = sungem_phy_read(phy, MII_ADVERTISE);
771 sungem_phy_write(phy, MII_ADVERTISE, adv);
779 adv = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL);
787 sungem_phy_write(phy, MII_1000BASETCONTROL, adv);
790 ctl = sungem_phy_read(phy, MII_BMCR);
792 sungem_phy_write(phy, MII_BMCR, ctl);
797 static int marvell_setup_forced(struct mii_phy *phy, int speed, int fd)
801 phy->autoneg = 0;
802 phy->speed = speed;
803 phy->duplex = fd;
804 phy->pause = 0;
806 ctl = sungem_phy_read(phy, MII_BMCR);
829 ctl2 = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL);
838 sungem_phy_write(phy, MII_1000BASETCONTROL, ctl2);
842 sungem_phy_write(phy, MII_BMCR, ctl);
847 static int marvell_read_link(struct mii_phy *phy)
851 if (phy->autoneg) {
852 status = sungem_phy_read(phy, MII_M1011_PHY_SPEC_STATUS);
856 phy->speed = SPEED_1000;
858 phy->speed = SPEED_100;
860 phy->speed = SPEED_10;
862 phy->duplex = DUPLEX_FULL;
864 phy->duplex = DUPLEX_HALF;
867 phy->pause = (status & pmask) == pmask;
1161 int sungem_phy_probe(struct mii_phy *phy, int mii_id)
1171 phy->mii_id = mii_id;
1174 rc = reset_one_mii_phy(phy, mii_id);
1179 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2));
1189 phy->def = def;
1193 phy->speed = 0;
1194 phy->duplex = 0;
1195 phy->pause = 0;
1196 phy->advertising = 0;