MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / __genphy_config_advert

Function __genphy_config_advert

components/drivers/phy/general.c:40–98  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

38 return adv;
39}
40static int __genphy_config_advert(struct rt_phy_device *phydev)
41{
42 rt_uint32_t advertise;
43 int oldadv, adv, bmsr;
44 int err, changed = 0;
45
46 phydev->advertising &= phydev->supported;
47 advertise = phydev->advertising;
48
49 adv = rt_phy_read(phydev, RT_MDIO_DEVAD_NONE, RT_MII_ADVERTISE);
50 oldadv = adv;
51
52 if (adv < 0)
53 return adv;
54
55 adv = __genphy_set_adv(adv, advertise);
56
57 if (adv != oldadv)
58 {
59 err = rt_phy_write(phydev, RT_MDIO_DEVAD_NONE, RT_MII_ADVERTISE, adv);
60
61 if (err < 0)
62 return err;
63 changed = 1;
64 }
65
66 bmsr = rt_phy_read(phydev, RT_MDIO_DEVAD_NONE, RT_MII_BMSR);
67 if (bmsr < 0)
68 return bmsr;
69
70 if (!(bmsr & RT_BMSR_ESTATEN))
71 return changed;
72
73 adv = rt_phy_read(phydev, RT_MDIO_DEVAD_NONE, RT_MII_CTRL1000);
74 oldadv = adv;
75
76 if (adv < 0)
77 return adv;
78
79 adv &= ~(RT_ADVERTISE_1000FULL | RT_ADVERTISE_1000HALF);
80
81 if (phydev->supported & (RT_SUPPORTED_1000baseT_Half |
82 RT_SUPPORTED_1000baseT_Full))
83 {
84 if (advertise & RT_SUPPORTED_1000baseT_Half)
85 adv |= RT_ADVERTISE_1000HALF;
86 if (advertise & RT_SUPPORTED_1000baseT_Full)
87 adv |= RT_ADVERTISE_1000FULL;
88 }
89
90 if (adv != oldadv)
91 changed = 1;
92
93 err = rt_phy_write(phydev, RT_MDIO_DEVAD_NONE, RT_MII_CTRL1000, adv);
94 if (err < 0)
95 return err;
96
97 return changed;

Callers 1

rt_genphy_config_anegFunction · 0.85

Calls 3

__genphy_set_advFunction · 0.85
rt_phy_readFunction · 0.70
rt_phy_writeFunction · 0.70

Tested by

no test coverage detected