Lines Matching refs:phy
34 static inline int _phy_read(struct mii_phy *phy, int reg) in _phy_read() argument
36 return phy->mdio_read(phy->dev, phy->address, reg); in _phy_read()
39 static inline void _phy_write(struct mii_phy *phy, int reg, int val) in _phy_write() argument
41 phy->mdio_write(phy->dev, phy->address, reg, val); in _phy_write()
44 static inline int gpcs_phy_read(struct mii_phy *phy, int reg) in gpcs_phy_read() argument
46 return phy->mdio_read(phy->dev, phy->gpcs_address, reg); in gpcs_phy_read()
49 static inline void gpcs_phy_write(struct mii_phy *phy, int reg, int val) in gpcs_phy_write() argument
51 phy->mdio_write(phy->dev, phy->gpcs_address, reg, val); in gpcs_phy_write()
54 int emac_mii_reset_phy(struct mii_phy *phy) in emac_mii_reset_phy() argument
59 val = phy_read(phy, MII_BMCR); in emac_mii_reset_phy()
62 phy_write(phy, MII_BMCR, val); in emac_mii_reset_phy()
67 val = phy_read(phy, MII_BMCR); in emac_mii_reset_phy()
73 phy_write(phy, MII_BMCR, val & ~BMCR_ISOLATE); in emac_mii_reset_phy()
78 int emac_mii_reset_gpcs(struct mii_phy *phy) in emac_mii_reset_gpcs() argument
83 val = gpcs_phy_read(phy, MII_BMCR); in emac_mii_reset_gpcs()
86 gpcs_phy_write(phy, MII_BMCR, val); in emac_mii_reset_gpcs()
91 val = gpcs_phy_read(phy, MII_BMCR); in emac_mii_reset_gpcs()
97 gpcs_phy_write(phy, MII_BMCR, val & ~BMCR_ISOLATE); in emac_mii_reset_gpcs()
99 if (limit > 0 && phy->mode == PHY_MODE_SGMII) { in emac_mii_reset_gpcs()
101 gpcs_phy_write(phy, 0x04, 0x8120); /* AsymPause, FDX */ in emac_mii_reset_gpcs()
102 gpcs_phy_write(phy, 0x07, 0x2801); /* msg_pg, toggle */ in emac_mii_reset_gpcs()
103 gpcs_phy_write(phy, 0x00, 0x0140); /* 1Gbps, FDX */ in emac_mii_reset_gpcs()
109 static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) in genmii_setup_aneg() argument
113 phy->autoneg = AUTONEG_ENABLE; in genmii_setup_aneg()
114 phy->speed = SPEED_10; in genmii_setup_aneg()
115 phy->duplex = DUPLEX_HALF; in genmii_setup_aneg()
116 phy->pause = phy->asym_pause = 0; in genmii_setup_aneg()
117 phy->advertising = advertise; in genmii_setup_aneg()
119 ctl = phy_read(phy, MII_BMCR); in genmii_setup_aneg()
125 phy_write(phy, MII_BMCR, ctl); in genmii_setup_aneg()
128 adv = phy_read(phy, MII_ADVERTISE); in genmii_setup_aneg()
145 phy_write(phy, MII_ADVERTISE, adv); in genmii_setup_aneg()
147 if (phy->features & in genmii_setup_aneg()
149 adv = phy_read(phy, MII_CTRL1000); in genmii_setup_aneg()
157 phy_write(phy, MII_CTRL1000, adv); in genmii_setup_aneg()
161 ctl = phy_read(phy, MII_BMCR); in genmii_setup_aneg()
163 phy_write(phy, MII_BMCR, ctl); in genmii_setup_aneg()
168 static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) in genmii_setup_forced() argument
172 phy->autoneg = AUTONEG_DISABLE; in genmii_setup_forced()
173 phy->speed = speed; in genmii_setup_forced()
174 phy->duplex = fd; in genmii_setup_forced()
175 phy->pause = phy->asym_pause = 0; in genmii_setup_forced()
177 ctl = phy_read(phy, MII_BMCR); in genmii_setup_forced()
183 phy_write(phy, MII_BMCR, ctl | BMCR_RESET); in genmii_setup_forced()
200 phy_write(phy, MII_BMCR, ctl); in genmii_setup_forced()
205 static int genmii_poll_link(struct mii_phy *phy) in genmii_poll_link() argument
210 phy_read(phy, MII_BMSR); in genmii_poll_link()
211 status = phy_read(phy, MII_BMSR); in genmii_poll_link()
214 if (phy->autoneg == AUTONEG_ENABLE && !(status & BMSR_ANEGCOMPLETE)) in genmii_poll_link()
219 static int genmii_read_link(struct mii_phy *phy) in genmii_read_link() argument
221 if (phy->autoneg == AUTONEG_ENABLE) { in genmii_read_link()
223 int lpa = phy_read(phy, MII_LPA) & phy_read(phy, MII_ADVERTISE); in genmii_read_link()
227 if (phy->features & in genmii_read_link()
229 int adv = phy_read(phy, MII_CTRL1000); in genmii_read_link()
230 glpa = phy_read(phy, MII_STAT1000); in genmii_read_link()
238 phy->speed = SPEED_10; in genmii_read_link()
239 phy->duplex = DUPLEX_HALF; in genmii_read_link()
240 phy->pause = phy->asym_pause = 0; in genmii_read_link()
243 phy->speed = SPEED_1000; in genmii_read_link()
245 phy->duplex = DUPLEX_FULL; in genmii_read_link()
247 phy->speed = SPEED_100; in genmii_read_link()
249 phy->duplex = DUPLEX_FULL; in genmii_read_link()
251 phy->duplex = DUPLEX_FULL; in genmii_read_link()
253 if (phy->duplex == DUPLEX_FULL) { in genmii_read_link()
254 phy->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; in genmii_read_link()
255 phy->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; in genmii_read_link()
258 int bmcr = phy_read(phy, MII_BMCR); in genmii_read_link()
263 phy->duplex = DUPLEX_FULL; in genmii_read_link()
265 phy->duplex = DUPLEX_HALF; in genmii_read_link()
267 phy->speed = SPEED_1000; in genmii_read_link()
269 phy->speed = SPEED_100; in genmii_read_link()
271 phy->speed = SPEED_10; in genmii_read_link()
273 phy->pause = phy->asym_pause = 0; in genmii_read_link()
305 static int cis8201_init(struct mii_phy *phy) in cis8201_init() argument
309 epcr = phy_read(phy, MII_CIS8201_EPCR); in cis8201_init()
315 switch (phy->mode) { in cis8201_init()
330 phy_write(phy, MII_CIS8201_EPCR, epcr); in cis8201_init()
333 phy_write(phy, MII_CIS8201_ACSR, in cis8201_init()
334 phy_read(phy, MII_CIS8201_ACSR) | ACSR_PIN_PRIO_SELECT); in cis8201_init()
337 phy_write(phy, MII_CIS8201_10BTCSR, in cis8201_init()
338 phy_read(phy, MII_CIS8201_10BTCSR) | TENBTCSR_ECHO_DISABLE); in cis8201_init()
366 static int m88e1111_init(struct mii_phy *phy) in m88e1111_init() argument
369 phy_write(phy, 0x14, 0x0ce3); in m88e1111_init()
370 phy_write(phy, 0x18, 0x4101); in m88e1111_init()
371 phy_write(phy, 0x09, 0x0e00); in m88e1111_init()
372 phy_write(phy, 0x04, 0x01e1); in m88e1111_init()
373 phy_write(phy, 0x00, 0x9140); in m88e1111_init()
374 phy_write(phy, 0x00, 0x1140); in m88e1111_init()
379 static int m88e1112_init(struct mii_phy *phy) in m88e1112_init() argument
392 phy_write(phy, 0x16, 0x0002); in m88e1112_init()
394 phy_write(phy, 0x00, 0x0040); /* 1Gbps */ in m88e1112_init()
395 reg_short = (u16)(phy_read(phy, 0x1a)); in m88e1112_init()
397 phy_write(phy, 0x1a, reg_short); in m88e1112_init()
398 emac_mii_reset_phy(phy); /* reset MAC interface */ in m88e1112_init()
401 phy_write(phy, 0x16, 0x0000); in m88e1112_init()
406 static int et1011c_init(struct mii_phy *phy) in et1011c_init() argument
410 reg_short = (u16)(phy_read(phy, 0x16)); in et1011c_init()
413 phy_write(phy, 0x16, reg_short); in et1011c_init()
415 reg_short = (u16)(phy_read(phy, 0x17)); in et1011c_init()
417 phy_write(phy, 0x17, reg_short); in et1011c_init()
419 phy_write(phy, 0x1c, 0x74f0); in et1011c_init()
473 static int ar8035_init(struct mii_phy *phy) in ar8035_init() argument
475 phy_write(phy, 0x1d, 0x5); /* Address debug register 5 */ in ar8035_init()
476 phy_write(phy, 0x1e, 0x2d47); /* Value copied from u-boot */ in ar8035_init()
477 phy_write(phy, 0x1d, 0xb); /* Address hib ctrl */ in ar8035_init()
478 phy_write(phy, 0x1e, 0xbc20); /* Value copied from u-boot */ in ar8035_init()
509 int emac_mii_phy_probe(struct mii_phy *phy, int address) in emac_mii_phy_probe() argument
515 phy->autoneg = AUTONEG_DISABLE; in emac_mii_phy_probe()
516 phy->advertising = 0; in emac_mii_phy_probe()
517 phy->address = address; in emac_mii_phy_probe()
518 phy->speed = SPEED_10; in emac_mii_phy_probe()
519 phy->duplex = DUPLEX_HALF; in emac_mii_phy_probe()
520 phy->pause = phy->asym_pause = 0; in emac_mii_phy_probe()
523 if (emac_mii_reset_phy(phy)) in emac_mii_phy_probe()
527 id = (phy_read(phy, MII_PHYSID1) << 16) | phy_read(phy, MII_PHYSID2); in emac_mii_phy_probe()
535 phy->def = def; in emac_mii_phy_probe()
538 phy->features = def->features; in emac_mii_phy_probe()
539 if (!phy->features) { in emac_mii_phy_probe()
540 u16 bmsr = phy_read(phy, MII_BMSR); in emac_mii_phy_probe()
542 phy->features |= SUPPORTED_Autoneg; in emac_mii_phy_probe()
544 phy->features |= SUPPORTED_10baseT_Half; in emac_mii_phy_probe()
546 phy->features |= SUPPORTED_10baseT_Full; in emac_mii_phy_probe()
548 phy->features |= SUPPORTED_100baseT_Half; in emac_mii_phy_probe()
550 phy->features |= SUPPORTED_100baseT_Full; in emac_mii_phy_probe()
552 u16 esr = phy_read(phy, MII_ESTATUS); in emac_mii_phy_probe()
554 phy->features |= SUPPORTED_1000baseT_Full; in emac_mii_phy_probe()
556 phy->features |= SUPPORTED_1000baseT_Half; in emac_mii_phy_probe()
558 phy->features |= SUPPORTED_MII; in emac_mii_phy_probe()
562 phy->advertising = phy->features; in emac_mii_phy_probe()