Lines Matching refs:phy

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