Lines Matching refs:phy
47 static inline int __sungem_phy_read(struct mii_phy* phy, int id, int reg)
49 return phy->mdio_read(phy->dev, id, reg);
52 static inline void __sungem_phy_write(struct mii_phy* phy, int id, int reg, int val)
54 phy->mdio_write(phy->dev, id, reg, val);
57 static inline int sungem_phy_read(struct mii_phy* phy, int reg)
59 return phy->mdio_read(phy->dev, phy->mii_id, reg);
62 static inline void sungem_phy_write(struct mii_phy* phy, int reg, int val)
64 phy->mdio_write(phy->dev, phy->mii_id, reg, val);
67 static int reset_one_mii_phy(struct mii_phy* phy, int phy_id)
72 val = __sungem_phy_read(phy, phy_id, MII_BMCR);
75 __sungem_phy_write(phy, phy_id, MII_BMCR, val);
80 val = __sungem_phy_read(phy, phy_id, MII_BMCR);
86 __sungem_phy_write(phy, phy_id, MII_BMCR, val & ~BMCR_ISOLATE);
91 static int bcm5201_init(struct mii_phy* phy)
95 data = sungem_phy_read(phy, MII_BCM5201_MULTIPHY);
97 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, data);
99 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0);
104 static int bcm5201_suspend(struct mii_phy* phy)
106 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0);
107 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE);
112 static int bcm5221_init(struct mii_phy* phy)
116 data = sungem_phy_read(phy, MII_BCM5221_TEST);
117 sungem_phy_write(phy, MII_BCM5221_TEST,
120 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2);
121 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2,
124 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
125 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
128 data = sungem_phy_read(phy, MII_BCM5221_TEST);
129 sungem_phy_write(phy, MII_BCM5221_TEST,
135 static int bcm5221_suspend(struct mii_phy* phy)
139 data = sungem_phy_read(phy, MII_BCM5221_TEST);
140 sungem_phy_write(phy, MII_BCM5221_TEST,
143 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
144 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
150 static int bcm5241_init(struct mii_phy* phy)
154 data = sungem_phy_read(phy, MII_BCM5221_TEST);
155 sungem_phy_write(phy, MII_BCM5221_TEST,
158 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2);
159 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2,
162 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
163 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
166 data = sungem_phy_read(phy, MII_BCM5221_TEST);
167 sungem_phy_write(phy, MII_BCM5221_TEST,
173 static int bcm5241_suspend(struct mii_phy* phy)
177 data = sungem_phy_read(phy, MII_BCM5221_TEST);
178 sungem_phy_write(phy, MII_BCM5221_TEST,
181 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4);
182 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4,
188 static int bcm5400_init(struct mii_phy* phy)
193 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL);
195 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data);
197 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
199 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
204 (void)reset_one_mii_phy(phy, 0x1f);
206 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY);
208 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data);
210 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL);
212 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data);
217 static int bcm5400_suspend(struct mii_phy* phy)
220 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
225 static int bcm5401_init(struct mii_phy* phy)
230 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f;
243 sungem_phy_write(phy, 0x18, 0x0c20);
244 sungem_phy_write(phy, 0x17, 0x0012);
245 sungem_phy_write(phy, 0x15, 0x1804);
246 sungem_phy_write(phy, 0x17, 0x0013);
247 sungem_phy_write(phy, 0x15, 0x1204);
248 sungem_phy_write(phy, 0x17, 0x8006);
249 sungem_phy_write(phy, 0x15, 0x0132);
250 sungem_phy_write(phy, 0x17, 0x8006);
251 sungem_phy_write(phy, 0x15, 0x0232);
252 sungem_phy_write(phy, 0x17, 0x201f);
253 sungem_phy_write(phy, 0x15, 0x0a20);
257 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
259 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
264 (void)reset_one_mii_phy(phy, 0x1f);
266 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY);
268 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data);
273 static int bcm5401_suspend(struct mii_phy* phy)
276 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
281 static int bcm5411_init(struct mii_phy* phy)
288 sungem_phy_write(phy, 0x1c, 0x8c23);
289 sungem_phy_write(phy, 0x1c, 0x8ca3);
290 sungem_phy_write(phy, 0x1c, 0x8c23);
295 sungem_phy_write(phy, MII_BMCR, BMCR_RESET);
296 sungem_phy_write(phy, MII_BMCR, 0x1340);
298 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL);
300 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data);
305 (void)reset_one_mii_phy(phy, 0x1f);
310 static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise)
314 phy->autoneg = 1;
315 phy->speed = SPEED_10;
316 phy->duplex = DUPLEX_HALF;
317 phy->pause = 0;
318 phy->advertising = advertise;
321 adv = sungem_phy_read(phy, MII_ADVERTISE);
331 sungem_phy_write(phy, MII_ADVERTISE, adv);
334 ctl = sungem_phy_read(phy, MII_BMCR);
336 sungem_phy_write(phy, MII_BMCR, ctl);
341 static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd)
345 phy->autoneg = 0;
346 phy->speed = speed;
347 phy->duplex = fd;
348 phy->pause = 0;
350 ctl = sungem_phy_read(phy, MII_BMCR);
354 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET);
369 sungem_phy_write(phy, MII_BMCR, ctl);
374 static int genmii_poll_link(struct mii_phy *phy)
378 (void)sungem_phy_read(phy, MII_BMSR);
379 status = sungem_phy_read(phy, MII_BMSR);
382 if (phy->autoneg && !(status & BMSR_ANEGCOMPLETE))
387 static int genmii_read_link(struct mii_phy *phy)
391 if (phy->autoneg) {
392 lpa = sungem_phy_read(phy, MII_LPA);
395 phy->duplex = DUPLEX_FULL;
397 phy->duplex = DUPLEX_HALF;
399 phy->speed = SPEED_100;
401 phy->speed = SPEED_10;
402 phy->pause = 0;
411 static int generic_suspend(struct mii_phy* phy)
413 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN);
418 static int bcm5421_init(struct mii_phy* phy)
423 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2));
429 sungem_phy_write(phy, 0x18, 0x1007);
430 data = sungem_phy_read(phy, 0x18);
431 sungem_phy_write(phy, 0x18, data | 0x0400);
432 sungem_phy_write(phy, 0x18, 0x0007);
433 data = sungem_phy_read(phy, 0x18);
434 sungem_phy_write(phy, 0x18, data | 0x0800);
435 sungem_phy_write(phy, 0x17, 0x000a);
436 data = sungem_phy_read(phy, 0x15);
437 sungem_phy_write(phy, 0x15, data | 0x0200);
442 sungem_phy_write(phy, 4, 0x01e1);
443 sungem_phy_write(phy, 9, 0x0300);
448 if (phy->platform_data) {
449 struct device_node *np = of_get_parent(phy->platform_data);
456 sungem_phy_write(phy, 0x1c, 0x9002);
457 sungem_phy_write(phy, 0x1c, 0xa821);
458 sungem_phy_write(phy, 0x1c, 0x941d);
466 static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise)
470 phy->autoneg = 1;
471 phy->speed = SPEED_10;
472 phy->duplex = DUPLEX_HALF;
473 phy->pause = 0;
474 phy->advertising = advertise;
477 adv = sungem_phy_read(phy, MII_ADVERTISE);
491 sungem_phy_write(phy, MII_ADVERTISE, adv);
494 adv = sungem_phy_read(phy, MII_1000BASETCONTROL);
500 sungem_phy_write(phy, MII_1000BASETCONTROL, adv);
503 ctl = sungem_phy_read(phy, MII_BMCR);
505 sungem_phy_write(phy, MII_BMCR, ctl);
510 static int bcm54xx_setup_forced(struct mii_phy *phy, int speed, int fd)
514 phy->autoneg = 0;
515 phy->speed = speed;
516 phy->duplex = fd;
517 phy->pause = 0;
519 ctl = sungem_phy_read(phy, MII_BMCR);
523 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET);
540 sungem_phy_write(phy, MII_BMCR, ctl);
545 static int bcm54xx_read_link(struct mii_phy *phy)
550 if (phy->autoneg) {
551 val = sungem_phy_read(phy, MII_BCM5400_AUXSTATUS);
554 phy->duplex = phy_BCM5400_link_table[link_mode][0] ?
556 phy->speed = phy_BCM5400_link_table[link_mode][2] ?
560 val = sungem_phy_read(phy, MII_LPA);
561 phy->pause = (phy->duplex == DUPLEX_FULL) &&
571 static int marvell88e1111_init(struct mii_phy* phy)
576 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f;
578 sungem_phy_write(phy, 0x1d, 0x000a);
579 sungem_phy_write(phy, 0x1e, 0x0821);
581 sungem_phy_write(phy, 0x1d, 0x0006);
582 sungem_phy_write(phy, 0x1e, 0x8600);
584 sungem_phy_write(phy, 0x1d, 0x000b);
585 sungem_phy_write(phy, 0x1e, 0x0100);
587 sungem_phy_write(phy, 0x1d, 0x0004);
588 sungem_phy_write(phy, 0x1e, 0x4850);
595 static int bcm5421_poll_link(struct mii_phy* phy)
601 sungem_phy_write(phy, MII_NCONFIG, 0x1000);
602 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
607 return genmii_poll_link(phy);
610 sungem_phy_write(phy, MII_NCONFIG, 0x2000);
611 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
619 static int bcm5421_read_link(struct mii_phy* phy)
625 sungem_phy_write(phy, MII_NCONFIG, 0x1000);
626 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
631 return bcm54xx_read_link(phy);
633 phy->speed = SPEED_1000;
636 sungem_phy_write(phy, MII_NCONFIG, 0x2000);
637 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
640 phy->duplex |= DUPLEX_HALF;
642 phy->duplex |= DUPLEX_FULL;
647 static int bcm5421_enable_fiber(struct mii_phy* phy, int autoneg)
650 sungem_phy_write(phy, MII_NCONFIG, 0x9020);
652 sungem_phy_write(phy, MII_NCONFIG, 0x945f);
656 sungem_phy_write(phy, MII_NCONFIG, 0xfc01);
657 sungem_phy_write(phy, 0x0b, 0x0004);
660 phy->autoneg = autoneg;
668 static int bcm5461_poll_link(struct mii_phy* phy)
674 sungem_phy_write(phy, MII_NCONFIG, 0x7c00);
675 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
680 return genmii_poll_link(phy);
683 sungem_phy_write(phy, MII_NCONFIG, 0x7000);
684 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
694 static int bcm5461_read_link(struct mii_phy* phy)
700 sungem_phy_write(phy, MII_NCONFIG, 0x7c00);
701 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
706 return bcm54xx_read_link(phy);
709 phy->speed = SPEED_1000;
712 sungem_phy_write(phy, MII_NCONFIG, 0x7000);
713 phy_reg = sungem_phy_read(phy, MII_NCONFIG);
716 phy->duplex |= DUPLEX_FULL;
718 phy->duplex |= DUPLEX_HALF;
723 static int bcm5461_enable_fiber(struct mii_phy* phy, int autoneg)
726 sungem_phy_write(phy, MII_NCONFIG, 0xfc0b);
730 sungem_phy_write(phy, MII_ADVERTISE, 0x01e0);
731 sungem_phy_write(phy, MII_BMCR, 0x1140);
734 sungem_phy_write(phy, MII_BMCR, 0x0140);
737 phy->autoneg = autoneg;
742 static int marvell_setup_aneg(struct mii_phy *phy, u32 advertise)
746 phy->autoneg = 1;
747 phy->speed = SPEED_10;
748 phy->duplex = DUPLEX_HALF;
749 phy->pause = 0;
750 phy->advertising = advertise;
753 adv = sungem_phy_read(phy, MII_ADVERTISE);
767 sungem_phy_write(phy, MII_ADVERTISE, adv);
775 adv = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL);
783 sungem_phy_write(phy, MII_1000BASETCONTROL, adv);
786 ctl = sungem_phy_read(phy, MII_BMCR);
788 sungem_phy_write(phy, MII_BMCR, ctl);
793 static int marvell_setup_forced(struct mii_phy *phy, int speed, int fd)
797 phy->autoneg = 0;
798 phy->speed = speed;
799 phy->duplex = fd;
800 phy->pause = 0;
802 ctl = sungem_phy_read(phy, MII_BMCR);
825 ctl2 = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL);
834 sungem_phy_write(phy, MII_1000BASETCONTROL, ctl2);
838 sungem_phy_write(phy, MII_BMCR, ctl);
843 static int marvell_read_link(struct mii_phy *phy)
847 if (phy->autoneg) {
848 status = sungem_phy_read(phy, MII_M1011_PHY_SPEC_STATUS);
852 phy->speed = SPEED_1000;
854 phy->speed = SPEED_100;
856 phy->speed = SPEED_10;
858 phy->duplex = DUPLEX_FULL;
860 phy->duplex = DUPLEX_HALF;
863 phy->pause = (status & pmask) == pmask;
1157 int sungem_phy_probe(struct mii_phy *phy, int mii_id)
1167 phy->mii_id = mii_id;
1170 rc = reset_one_mii_phy(phy, mii_id);
1175 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2));
1185 phy->def = def;
1189 phy->speed = 0;
1190 phy->duplex = 0;
1191 phy->pause = 0;
1192 phy->advertising = 0;