Lines Matching +full:phy +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
3 * PHY drivers for the sungem ethernet driver.
7 * (c) 2002-2007, Benjamin Herrenscmidt (benh@kernel.crashing.org)
10 * - Add support for PHYs that provide an IRQ line
11 * - Eventually moved the entire polling state machine in
14 * - On LXT971 & BCM5201, Apple uses some chip specific regs
17 * - Apple has some additional power management code for some
39 /* Link modes of the BCM5400 PHY */
51 static inline int __sungem_phy_read(struct mii_phy* phy, int id, int reg) in __sungem_phy_read() argument
53 return phy->mdio_read(phy->dev, id, reg); in __sungem_phy_read()
56 static inline void __sungem_phy_write(struct mii_phy* phy, int id, int reg, int val) in __sungem_phy_write() argument
58 phy->mdio_write(phy->dev, id, reg, val); in __sungem_phy_write()
61 static inline int sungem_phy_read(struct mii_phy* phy, int reg) in sungem_phy_read() argument
63 return phy->mdio_read(phy->dev, phy->mii_id, reg); in sungem_phy_read()
66 static inline void sungem_phy_write(struct mii_phy* phy, int reg, int val) in sungem_phy_write() argument
68 phy->mdio_write(phy->dev, phy->mii_id, reg, val); in sungem_phy_write()
71 static int reset_one_mii_phy(struct mii_phy* phy, int phy_id) in reset_one_mii_phy() argument
76 val = __sungem_phy_read(phy, phy_id, MII_BMCR); in reset_one_mii_phy()
79 __sungem_phy_write(phy, phy_id, MII_BMCR, val); in reset_one_mii_phy()
83 while (--limit) { in reset_one_mii_phy()
84 val = __sungem_phy_read(phy, phy_id, MII_BMCR); in reset_one_mii_phy()
90 __sungem_phy_write(phy, phy_id, MII_BMCR, val & ~BMCR_ISOLATE); in reset_one_mii_phy()
95 static int bcm5201_init(struct mii_phy* phy) in bcm5201_init() argument
99 data = sungem_phy_read(phy, MII_BCM5201_MULTIPHY); in bcm5201_init()
101 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, data); in bcm5201_init()
103 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0); in bcm5201_init()
108 static int bcm5201_suspend(struct mii_phy* phy) in bcm5201_suspend() argument
110 sungem_phy_write(phy, MII_BCM5201_INTERRUPT, 0); in bcm5201_suspend()
111 sungem_phy_write(phy, MII_BCM5201_MULTIPHY, MII_BCM5201_MULTIPHY_SUPERISOLATE); in bcm5201_suspend()
116 static int bcm5221_init(struct mii_phy* phy) in bcm5221_init() argument
120 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_init()
121 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_init()
124 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2); in bcm5221_init()
125 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2, in bcm5221_init()
128 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5221_init()
129 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5221_init()
132 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_init()
133 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_init()
139 static int bcm5221_suspend(struct mii_phy* phy) in bcm5221_suspend() argument
143 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5221_suspend()
144 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5221_suspend()
147 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5221_suspend()
148 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5221_suspend()
154 static int bcm5241_init(struct mii_phy* phy) in bcm5241_init() argument
158 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_init()
159 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_init()
162 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_STAT2); in bcm5241_init()
163 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_STAT2, in bcm5241_init()
166 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5241_init()
167 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5241_init()
170 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_init()
171 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_init()
177 static int bcm5241_suspend(struct mii_phy* phy) in bcm5241_suspend() argument
181 data = sungem_phy_read(phy, MII_BCM5221_TEST); in bcm5241_suspend()
182 sungem_phy_write(phy, MII_BCM5221_TEST, in bcm5241_suspend()
185 data = sungem_phy_read(phy, MII_BCM5221_SHDOW_AUX_MODE4); in bcm5241_suspend()
186 sungem_phy_write(phy, MII_BCM5221_SHDOW_AUX_MODE4, in bcm5241_suspend()
192 static int bcm5400_init(struct mii_phy* phy) in bcm5400_init() argument
197 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL); in bcm5400_init()
199 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data); in bcm5400_init()
201 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5400_init()
203 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5400_init()
207 /* Reset and configure cascaded 10/100 PHY */ in bcm5400_init()
208 (void)reset_one_mii_phy(phy, 0x1f); in bcm5400_init()
210 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY); in bcm5400_init()
212 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data); in bcm5400_init()
214 data = sungem_phy_read(phy, MII_BCM5400_AUXCONTROL); in bcm5400_init()
216 sungem_phy_write(phy, MII_BCM5400_AUXCONTROL, data); in bcm5400_init()
221 static int bcm5400_suspend(struct mii_phy* phy) in bcm5400_suspend() argument
224 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in bcm5400_suspend()
229 static int bcm5401_init(struct mii_phy* phy) in bcm5401_init() argument
234 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f; in bcm5401_init()
245 * in the tg3.c driver. -DaveM in bcm5401_init()
247 sungem_phy_write(phy, 0x18, 0x0c20); in bcm5401_init()
248 sungem_phy_write(phy, 0x17, 0x0012); in bcm5401_init()
249 sungem_phy_write(phy, 0x15, 0x1804); in bcm5401_init()
250 sungem_phy_write(phy, 0x17, 0x0013); in bcm5401_init()
251 sungem_phy_write(phy, 0x15, 0x1204); in bcm5401_init()
252 sungem_phy_write(phy, 0x17, 0x8006); in bcm5401_init()
253 sungem_phy_write(phy, 0x15, 0x0132); in bcm5401_init()
254 sungem_phy_write(phy, 0x17, 0x8006); in bcm5401_init()
255 sungem_phy_write(phy, 0x15, 0x0232); in bcm5401_init()
256 sungem_phy_write(phy, 0x17, 0x201f); in bcm5401_init()
257 sungem_phy_write(phy, 0x15, 0x0a20); in bcm5401_init()
261 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5401_init()
263 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5401_init()
267 /* Reset and configure cascaded 10/100 PHY */ in bcm5401_init()
268 (void)reset_one_mii_phy(phy, 0x1f); in bcm5401_init()
270 data = __sungem_phy_read(phy, 0x1f, MII_BCM5201_MULTIPHY); in bcm5401_init()
272 __sungem_phy_write(phy, 0x1f, MII_BCM5201_MULTIPHY, data); in bcm5401_init()
277 static int bcm5401_suspend(struct mii_phy* phy) in bcm5401_suspend() argument
280 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in bcm5401_suspend()
285 static int bcm5411_init(struct mii_phy* phy) in bcm5411_init() argument
292 sungem_phy_write(phy, 0x1c, 0x8c23); in bcm5411_init()
293 sungem_phy_write(phy, 0x1c, 0x8ca3); in bcm5411_init()
294 sungem_phy_write(phy, 0x1c, 0x8c23); in bcm5411_init()
299 sungem_phy_write(phy, MII_BMCR, BMCR_RESET); in bcm5411_init()
300 sungem_phy_write(phy, MII_BMCR, 0x1340); in bcm5411_init()
302 data = sungem_phy_read(phy, MII_BCM5400_GB_CONTROL); in bcm5411_init()
304 sungem_phy_write(phy, MII_BCM5400_GB_CONTROL, data); in bcm5411_init()
308 /* Reset and configure cascaded 10/100 PHY */ in bcm5411_init()
309 (void)reset_one_mii_phy(phy, 0x1f); in bcm5411_init()
314 static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) in genmii_setup_aneg() argument
318 phy->autoneg = 1; in genmii_setup_aneg()
319 phy->speed = SPEED_10; in genmii_setup_aneg()
320 phy->duplex = DUPLEX_HALF; in genmii_setup_aneg()
321 phy->pause = 0; in genmii_setup_aneg()
322 phy->advertising = advertise; in genmii_setup_aneg()
325 adv = sungem_phy_read(phy, MII_ADVERTISE); in genmii_setup_aneg()
335 sungem_phy_write(phy, MII_ADVERTISE, adv); in genmii_setup_aneg()
338 ctl = sungem_phy_read(phy, MII_BMCR); in genmii_setup_aneg()
340 sungem_phy_write(phy, MII_BMCR, ctl); in genmii_setup_aneg()
345 static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) in genmii_setup_forced() argument
349 phy->autoneg = 0; in genmii_setup_forced()
350 phy->speed = speed; in genmii_setup_forced()
351 phy->duplex = fd; in genmii_setup_forced()
352 phy->pause = 0; in genmii_setup_forced()
354 ctl = sungem_phy_read(phy, MII_BMCR); in genmii_setup_forced()
357 /* First reset the PHY */ in genmii_setup_forced()
358 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET); in genmii_setup_forced()
369 return -EINVAL; in genmii_setup_forced()
373 sungem_phy_write(phy, MII_BMCR, ctl); in genmii_setup_forced()
378 static int genmii_poll_link(struct mii_phy *phy) in genmii_poll_link() argument
382 (void)sungem_phy_read(phy, MII_BMSR); in genmii_poll_link()
383 status = sungem_phy_read(phy, MII_BMSR); in genmii_poll_link()
386 if (phy->autoneg && !(status & BMSR_ANEGCOMPLETE)) in genmii_poll_link()
391 static int genmii_read_link(struct mii_phy *phy) in genmii_read_link() argument
395 if (phy->autoneg) { in genmii_read_link()
396 lpa = sungem_phy_read(phy, MII_LPA); in genmii_read_link()
399 phy->duplex = DUPLEX_FULL; in genmii_read_link()
401 phy->duplex = DUPLEX_HALF; in genmii_read_link()
403 phy->speed = SPEED_100; in genmii_read_link()
405 phy->speed = SPEED_10; in genmii_read_link()
406 phy->pause = 0; in genmii_read_link()
408 /* On non-aneg, we assume what we put in BMCR is the speed, in genmii_read_link()
409 * though magic-aneg shouldn't prevent this case from occurring in genmii_read_link()
415 static int generic_suspend(struct mii_phy* phy) in generic_suspend() argument
417 sungem_phy_write(phy, MII_BMCR, BMCR_PDOWN); in generic_suspend()
422 static int bcm5421_init(struct mii_phy* phy) in bcm5421_init() argument
427 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2)); in bcm5421_init()
433 sungem_phy_write(phy, 0x18, 0x1007); in bcm5421_init()
434 data = sungem_phy_read(phy, 0x18); in bcm5421_init()
435 sungem_phy_write(phy, 0x18, data | 0x0400); in bcm5421_init()
436 sungem_phy_write(phy, 0x18, 0x0007); in bcm5421_init()
437 data = sungem_phy_read(phy, 0x18); in bcm5421_init()
438 sungem_phy_write(phy, 0x18, data | 0x0800); in bcm5421_init()
439 sungem_phy_write(phy, 0x17, 0x000a); in bcm5421_init()
440 data = sungem_phy_read(phy, 0x15); in bcm5421_init()
441 sungem_phy_write(phy, 0x15, data | 0x0200); in bcm5421_init()
446 sungem_phy_write(phy, 4, 0x01e1); in bcm5421_init()
447 sungem_phy_write(phy, 9, 0x0300); in bcm5421_init()
452 if (phy->platform_data) { in bcm5421_init()
453 struct device_node *np = of_get_parent(phy->platform_data); in bcm5421_init()
455 if (np == NULL || of_get_property(np, "no-autolowpower", NULL)) in bcm5421_init()
458 /* Enable automatic low-power */ in bcm5421_init()
459 sungem_phy_write(phy, 0x1c, 0x9002); in bcm5421_init()
460 sungem_phy_write(phy, 0x1c, 0xa821); in bcm5421_init()
461 sungem_phy_write(phy, 0x1c, 0x941d); in bcm5421_init()
469 static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise) in bcm54xx_setup_aneg() argument
473 phy->autoneg = 1; in bcm54xx_setup_aneg()
474 phy->speed = SPEED_10; in bcm54xx_setup_aneg()
475 phy->duplex = DUPLEX_HALF; in bcm54xx_setup_aneg()
476 phy->pause = 0; in bcm54xx_setup_aneg()
477 phy->advertising = advertise; in bcm54xx_setup_aneg()
480 adv = sungem_phy_read(phy, MII_ADVERTISE); in bcm54xx_setup_aneg()
494 sungem_phy_write(phy, MII_ADVERTISE, adv); in bcm54xx_setup_aneg()
497 adv = sungem_phy_read(phy, MII_1000BASETCONTROL); in bcm54xx_setup_aneg()
503 sungem_phy_write(phy, MII_1000BASETCONTROL, adv); in bcm54xx_setup_aneg()
506 ctl = sungem_phy_read(phy, MII_BMCR); in bcm54xx_setup_aneg()
508 sungem_phy_write(phy, MII_BMCR, ctl); in bcm54xx_setup_aneg()
513 static int bcm54xx_setup_forced(struct mii_phy *phy, int speed, int fd) in bcm54xx_setup_forced() argument
517 phy->autoneg = 0; in bcm54xx_setup_forced()
518 phy->speed = speed; in bcm54xx_setup_forced()
519 phy->duplex = fd; in bcm54xx_setup_forced()
520 phy->pause = 0; in bcm54xx_setup_forced()
522 ctl = sungem_phy_read(phy, MII_BMCR); in bcm54xx_setup_forced()
525 /* First reset the PHY */ in bcm54xx_setup_forced()
526 sungem_phy_write(phy, MII_BMCR, ctl | BMCR_RESET); in bcm54xx_setup_forced()
543 sungem_phy_write(phy, MII_BMCR, ctl); in bcm54xx_setup_forced()
548 static int bcm54xx_read_link(struct mii_phy *phy) in bcm54xx_read_link() argument
553 if (phy->autoneg) { in bcm54xx_read_link()
554 val = sungem_phy_read(phy, MII_BCM5400_AUXSTATUS); in bcm54xx_read_link()
557 phy->duplex = phy_BCM5400_link_table[link_mode][0] ? in bcm54xx_read_link()
559 phy->speed = phy_BCM5400_link_table[link_mode][2] ? in bcm54xx_read_link()
563 val = sungem_phy_read(phy, MII_LPA); in bcm54xx_read_link()
564 phy->pause = (phy->duplex == DUPLEX_FULL) && in bcm54xx_read_link()
567 /* On non-aneg, we assume what we put in BMCR is the speed, in bcm54xx_read_link()
568 * though magic-aneg shouldn't prevent this case from occurring in bcm54xx_read_link()
574 static int marvell88e1111_init(struct mii_phy* phy) in marvell88e1111_init() argument
579 rev = sungem_phy_read(phy, MII_PHYSID2) & 0x000f; in marvell88e1111_init()
581 sungem_phy_write(phy, 0x1d, 0x000a); in marvell88e1111_init()
582 sungem_phy_write(phy, 0x1e, 0x0821); in marvell88e1111_init()
584 sungem_phy_write(phy, 0x1d, 0x0006); in marvell88e1111_init()
585 sungem_phy_write(phy, 0x1e, 0x8600); in marvell88e1111_init()
587 sungem_phy_write(phy, 0x1d, 0x000b); in marvell88e1111_init()
588 sungem_phy_write(phy, 0x1e, 0x0100); in marvell88e1111_init()
590 sungem_phy_write(phy, 0x1d, 0x0004); in marvell88e1111_init()
591 sungem_phy_write(phy, 0x1e, 0x4850); in marvell88e1111_init()
598 static int bcm5421_poll_link(struct mii_phy* phy) in bcm5421_poll_link() argument
601 int mode; in bcm5421_poll_link() local
603 /* find out in what mode we are */ in bcm5421_poll_link()
604 sungem_phy_write(phy, MII_NCONFIG, 0x1000); in bcm5421_poll_link()
605 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_poll_link()
607 mode = (phy_reg & BCM5421_MODE_MASK) >> 5; in bcm5421_poll_link()
609 if ( mode == BCM54XX_COPPER) in bcm5421_poll_link()
610 return genmii_poll_link(phy); in bcm5421_poll_link()
613 sungem_phy_write(phy, MII_NCONFIG, 0x2000); in bcm5421_poll_link()
614 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_poll_link()
622 static int bcm5421_read_link(struct mii_phy* phy) in bcm5421_read_link() argument
625 int mode; in bcm5421_read_link() local
627 /* find out in what mode we are */ in bcm5421_read_link()
628 sungem_phy_write(phy, MII_NCONFIG, 0x1000); in bcm5421_read_link()
629 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_read_link()
631 mode = (phy_reg & BCM5421_MODE_MASK ) >> 5; in bcm5421_read_link()
633 if ( mode == BCM54XX_COPPER) in bcm5421_read_link()
634 return bcm54xx_read_link(phy); in bcm5421_read_link()
636 phy->speed = SPEED_1000; in bcm5421_read_link()
638 /* find out whether we are running half- or full duplex */ in bcm5421_read_link()
639 sungem_phy_write(phy, MII_NCONFIG, 0x2000); in bcm5421_read_link()
640 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5421_read_link()
643 phy->duplex |= DUPLEX_HALF; in bcm5421_read_link()
645 phy->duplex |= DUPLEX_FULL; in bcm5421_read_link()
650 static int bcm5421_enable_fiber(struct mii_phy* phy, int autoneg) in bcm5421_enable_fiber() argument
652 /* enable fiber mode */ in bcm5421_enable_fiber()
653 sungem_phy_write(phy, MII_NCONFIG, 0x9020); in bcm5421_enable_fiber()
655 sungem_phy_write(phy, MII_NCONFIG, 0x945f); in bcm5421_enable_fiber()
659 sungem_phy_write(phy, MII_NCONFIG, 0xfc01); in bcm5421_enable_fiber()
660 sungem_phy_write(phy, 0x0b, 0x0004); in bcm5421_enable_fiber()
663 phy->autoneg = autoneg; in bcm5421_enable_fiber()
671 static int bcm5461_poll_link(struct mii_phy* phy) in bcm5461_poll_link() argument
674 int mode; in bcm5461_poll_link() local
676 /* find out in what mode we are */ in bcm5461_poll_link()
677 sungem_phy_write(phy, MII_NCONFIG, 0x7c00); in bcm5461_poll_link()
678 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_poll_link()
680 mode = (phy_reg & BCM5461_MODE_MASK ) >> 1; in bcm5461_poll_link()
682 if ( mode == BCM54XX_COPPER) in bcm5461_poll_link()
683 return genmii_poll_link(phy); in bcm5461_poll_link()
686 sungem_phy_write(phy, MII_NCONFIG, 0x7000); in bcm5461_poll_link()
687 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_poll_link()
697 static int bcm5461_read_link(struct mii_phy* phy) in bcm5461_read_link() argument
700 int mode; in bcm5461_read_link() local
702 /* find out in what mode we are */ in bcm5461_read_link()
703 sungem_phy_write(phy, MII_NCONFIG, 0x7c00); in bcm5461_read_link()
704 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_read_link()
706 mode = (phy_reg & BCM5461_MODE_MASK ) >> 1; in bcm5461_read_link()
708 if ( mode == BCM54XX_COPPER) { in bcm5461_read_link()
709 return bcm54xx_read_link(phy); in bcm5461_read_link()
712 phy->speed = SPEED_1000; in bcm5461_read_link()
714 /* find out whether we are running half- or full duplex */ in bcm5461_read_link()
715 sungem_phy_write(phy, MII_NCONFIG, 0x7000); in bcm5461_read_link()
716 phy_reg = sungem_phy_read(phy, MII_NCONFIG); in bcm5461_read_link()
719 phy->duplex |= DUPLEX_FULL; in bcm5461_read_link()
721 phy->duplex |= DUPLEX_HALF; in bcm5461_read_link()
726 static int bcm5461_enable_fiber(struct mii_phy* phy, int autoneg) in bcm5461_enable_fiber() argument
728 /* select fiber mode, enable 1000 base-X registers */ in bcm5461_enable_fiber()
729 sungem_phy_write(phy, MII_NCONFIG, 0xfc0b); in bcm5461_enable_fiber()
733 sungem_phy_write(phy, MII_ADVERTISE, 0x01e0); in bcm5461_enable_fiber()
734 sungem_phy_write(phy, MII_BMCR, 0x1140); in bcm5461_enable_fiber()
737 sungem_phy_write(phy, MII_BMCR, 0x0140); in bcm5461_enable_fiber()
740 phy->autoneg = autoneg; in bcm5461_enable_fiber()
745 static int marvell_setup_aneg(struct mii_phy *phy, u32 advertise) in marvell_setup_aneg() argument
749 phy->autoneg = 1; in marvell_setup_aneg()
750 phy->speed = SPEED_10; in marvell_setup_aneg()
751 phy->duplex = DUPLEX_HALF; in marvell_setup_aneg()
752 phy->pause = 0; in marvell_setup_aneg()
753 phy->advertising = advertise; in marvell_setup_aneg()
756 adv = sungem_phy_read(phy, MII_ADVERTISE); in marvell_setup_aneg()
770 sungem_phy_write(phy, MII_ADVERTISE, adv); in marvell_setup_aneg()
778 adv = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL); in marvell_setup_aneg()
786 sungem_phy_write(phy, MII_1000BASETCONTROL, adv); in marvell_setup_aneg()
789 ctl = sungem_phy_read(phy, MII_BMCR); in marvell_setup_aneg()
791 sungem_phy_write(phy, MII_BMCR, ctl); in marvell_setup_aneg()
796 static int marvell_setup_forced(struct mii_phy *phy, int speed, int fd) in marvell_setup_forced() argument
800 phy->autoneg = 0; in marvell_setup_forced()
801 phy->speed = speed; in marvell_setup_forced()
802 phy->duplex = fd; in marvell_setup_forced()
803 phy->pause = 0; in marvell_setup_forced()
805 ctl = sungem_phy_read(phy, MII_BMCR); in marvell_setup_forced()
828 ctl2 = sungem_phy_read(phy, MII_M1011_PHY_SPEC_CONTROL); in marvell_setup_forced()
837 sungem_phy_write(phy, MII_1000BASETCONTROL, ctl2); in marvell_setup_forced()
841 sungem_phy_write(phy, MII_BMCR, ctl); in marvell_setup_forced()
846 static int marvell_read_link(struct mii_phy *phy) in marvell_read_link() argument
850 if (phy->autoneg) { in marvell_read_link()
851 status = sungem_phy_read(phy, MII_M1011_PHY_SPEC_STATUS); in marvell_read_link()
853 return -EAGAIN; in marvell_read_link()
855 phy->speed = SPEED_1000; in marvell_read_link()
857 phy->speed = SPEED_100; in marvell_read_link()
859 phy->speed = SPEED_10; in marvell_read_link()
861 phy->duplex = DUPLEX_FULL; in marvell_read_link()
863 phy->duplex = DUPLEX_HALF; in marvell_read_link()
866 phy->pause = (status & pmask) == pmask; in marvell_read_link()
868 /* On non-aneg, we assume what we put in BMCR is the speed, in marvell_read_link()
869 * though magic-aneg shouldn't prevent this case from occurring in marvell_read_link()
883 * it neither. --BenH.
1022 /* Broadcom BCM 5421 built-in K2 */
1035 .name = "BCM5421-K2",
1060 /* Broadcom BCM 5462 built-in Vesta */
1073 .name = "BCM5462-Vesta",
1160 int sungem_phy_probe(struct mii_phy *phy, int mii_id) in sungem_phy_probe() argument
1168 * may re-probe the PHY regulary in sungem_phy_probe()
1170 phy->mii_id = mii_id; in sungem_phy_probe()
1172 /* Take PHY out of isloate mode and reset it. */ in sungem_phy_probe()
1173 rc = reset_one_mii_phy(phy, mii_id); in sungem_phy_probe()
1178 id = (sungem_phy_read(phy, MII_PHYSID1) << 16 | sungem_phy_read(phy, MII_PHYSID2)); in sungem_phy_probe()
1179 printk(KERN_DEBUG KBUILD_MODNAME ": " "PHY ID: %x, addr: %x\n", in sungem_phy_probe()
1182 if ((id & def->phy_id_mask) == def->phy_id) in sungem_phy_probe()
1188 phy->def = def; in sungem_phy_probe()
1192 phy->speed = 0; in sungem_phy_probe()
1193 phy->duplex = 0; in sungem_phy_probe()
1194 phy->pause = 0; in sungem_phy_probe()
1195 phy->advertising = 0; in sungem_phy_probe()
1196 return -ENODEV; in sungem_phy_probe()