1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * linux/mdio.h: definitions for MDIO (clause 45) transceivers
4 * Copyright 2006-2009 Solarflare Communications Inc.
5 */
6 #ifndef __LINUX_MDIO_H__
7 #define __LINUX_MDIO_H__
8
9 #include <uapi/linux/mdio.h>
10 #include <linux/bitfield.h>
11
12 struct gpio_desc;
13 struct mii_bus;
14 struct reset_control;
15
16 /* Multiple levels of nesting are possible. However typically this is
17 * limited to nested DSA like layer, a MUX layer, and the normal
18 * user. Instead of trying to handle the general case, just define
19 * these cases.
20 */
21 enum mdio_mutex_lock_class {
22 MDIO_MUTEX_NORMAL,
23 MDIO_MUTEX_MUX,
24 MDIO_MUTEX_NESTED,
25 };
26
27 struct mdio_device {
28 struct device dev;
29
30 struct mii_bus *bus;
31
32 int (*bus_match)(struct device *dev, const struct device_driver *drv);
33 void (*device_free)(struct mdio_device *mdiodev);
34 void (*device_remove)(struct mdio_device *mdiodev);
35
36 /* Bus address of the MDIO device (0-31) */
37 int addr;
38 int flags;
39 int reset_state;
40 struct gpio_desc *reset_gpio;
41 struct reset_control *reset_ctrl;
42 unsigned int reset_assert_delay;
43 unsigned int reset_deassert_delay;
44 };
45
46 #define to_mdio_device(__dev) container_of_const(__dev, struct mdio_device, dev)
47
48 /* struct mdio_driver_common: Common to all MDIO drivers */
49 struct mdio_driver_common {
50 struct device_driver driver;
51 int flags;
52 };
53 #define MDIO_DEVICE_FLAG_PHY 1
54
55 #define to_mdio_common_driver(__drv_c) container_of_const(__drv_c, struct mdio_driver_common, \
56 driver)
57
58 /* struct mdio_driver: Generic MDIO driver */
59 struct mdio_driver {
60 struct mdio_driver_common mdiodrv;
61
62 /*
63 * Called during discovery. Used to set
64 * up device-specific structures, if any
65 */
66 int (*probe)(struct mdio_device *mdiodev);
67
68 /* Clears up any memory if needed */
69 void (*remove)(struct mdio_device *mdiodev);
70
71 /* Quiesces the device on system shutdown, turns off interrupts etc */
72 void (*shutdown)(struct mdio_device *mdiodev);
73 };
74
75 #define to_mdio_driver(__drv_m) container_of_const(to_mdio_common_driver(__drv_m), \
76 struct mdio_driver, mdiodrv)
77
78 /* device driver data */
mdiodev_set_drvdata(struct mdio_device * mdio,void * data)79 static inline void mdiodev_set_drvdata(struct mdio_device *mdio, void *data)
80 {
81 dev_set_drvdata(&mdio->dev, data);
82 }
83
mdiodev_get_drvdata(struct mdio_device * mdio)84 static inline void *mdiodev_get_drvdata(struct mdio_device *mdio)
85 {
86 return dev_get_drvdata(&mdio->dev);
87 }
88
mdiodev_has_reset(struct mdio_device * mdio)89 static inline bool mdiodev_has_reset(struct mdio_device *mdio)
90 {
91 return (mdio->reset_gpio || mdio->reset_ctrl);
92 }
93
94 void mdio_device_free(struct mdio_device *mdiodev);
95 struct mdio_device *mdio_device_create(struct mii_bus *bus, int addr);
96 int mdio_device_register(struct mdio_device *mdiodev);
97 void mdio_device_remove(struct mdio_device *mdiodev);
98 void mdio_device_reset(struct mdio_device *mdiodev, int value);
99 int mdio_driver_register(struct mdio_driver *drv);
100 void mdio_driver_unregister(struct mdio_driver *drv);
101
mdio_device_get(struct mdio_device * mdiodev)102 static inline void mdio_device_get(struct mdio_device *mdiodev)
103 {
104 get_device(&mdiodev->dev);
105 }
106
mdio_device_put(struct mdio_device * mdiodev)107 static inline void mdio_device_put(struct mdio_device *mdiodev)
108 {
109 mdio_device_free(mdiodev);
110 }
111
mdio_phy_id_is_c45(int phy_id)112 static inline bool mdio_phy_id_is_c45(int phy_id)
113 {
114 return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);
115 }
116
mdio_phy_id_prtad(int phy_id)117 static inline __u16 mdio_phy_id_prtad(int phy_id)
118 {
119 return (phy_id & MDIO_PHY_ID_PRTAD) >> 5;
120 }
121
mdio_phy_id_devad(int phy_id)122 static inline __u16 mdio_phy_id_devad(int phy_id)
123 {
124 return phy_id & MDIO_PHY_ID_DEVAD;
125 }
126
127 /**
128 * struct mdio_if_info - Ethernet controller MDIO interface
129 * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown)
130 * @mmds: Mask of MMDs expected to be present in the PHY. This must be
131 * non-zero unless @prtad = %MDIO_PRTAD_NONE.
132 * @mode_support: MDIO modes supported. If %MDIO_SUPPORTS_C22 is set then
133 * MII register access will be passed through with @devad =
134 * %MDIO_DEVAD_NONE. If %MDIO_EMULATE_C22 is set then access to
135 * commonly used clause 22 registers will be translated into
136 * clause 45 registers.
137 * @dev: Net device structure
138 * @mdio_read: Register read function; returns value or negative error code
139 * @mdio_write: Register write function; returns 0 or negative error code
140 */
141 struct mdio_if_info {
142 int prtad;
143 u32 mmds;
144 unsigned mode_support;
145
146 struct net_device *dev;
147 int (*mdio_read)(struct net_device *dev, int prtad, int devad,
148 u16 addr);
149 int (*mdio_write)(struct net_device *dev, int prtad, int devad,
150 u16 addr, u16 val);
151 };
152
153 #define MDIO_PRTAD_NONE (-1)
154 #define MDIO_DEVAD_NONE (-1)
155 #define MDIO_SUPPORTS_C22 1
156 #define MDIO_SUPPORTS_C45 2
157 #define MDIO_EMULATE_C22 4
158
159 struct ethtool_cmd;
160 struct ethtool_pauseparam;
161 extern int mdio45_probe(struct mdio_if_info *mdio, int prtad);
162 extern int mdio_set_flag(const struct mdio_if_info *mdio,
163 int prtad, int devad, u16 addr, int mask,
164 bool sense);
165 extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds);
166 extern int mdio45_nway_restart(const struct mdio_if_info *mdio);
167 extern void
168 mdio45_ethtool_ksettings_get_npage(const struct mdio_if_info *mdio,
169 struct ethtool_link_ksettings *cmd,
170 u32 npage_adv, u32 npage_lpa);
171
172 /**
173 * mdio45_ethtool_ksettings_get - get settings for ETHTOOL_GLINKSETTINGS
174 * @mdio: MDIO interface
175 * @cmd: Ethtool request structure
176 *
177 * Since the CSRs for auto-negotiation using next pages are not fully
178 * standardised, this function does not attempt to decode them. Use
179 * mdio45_ethtool_ksettings_get_npage() to specify advertisement bits
180 * from next pages.
181 */
182 static inline void
mdio45_ethtool_ksettings_get(const struct mdio_if_info * mdio,struct ethtool_link_ksettings * cmd)183 mdio45_ethtool_ksettings_get(const struct mdio_if_info *mdio,
184 struct ethtool_link_ksettings *cmd)
185 {
186 mdio45_ethtool_ksettings_get_npage(mdio, cmd, 0, 0);
187 }
188
189 extern int mdio_mii_ioctl(const struct mdio_if_info *mdio,
190 struct mii_ioctl_data *mii_data, int cmd);
191
192 /**
193 * mmd_eee_cap_to_ethtool_sup_t
194 * @eee_cap: value of the MMD EEE Capability register
195 *
196 * A small helper function that translates MMD EEE Capability (3.20) bits
197 * to ethtool supported settings.
198 */
mmd_eee_cap_to_ethtool_sup_t(u16 eee_cap)199 static inline u32 mmd_eee_cap_to_ethtool_sup_t(u16 eee_cap)
200 {
201 u32 supported = 0;
202
203 if (eee_cap & MDIO_EEE_100TX)
204 supported |= SUPPORTED_100baseT_Full;
205 if (eee_cap & MDIO_EEE_1000T)
206 supported |= SUPPORTED_1000baseT_Full;
207 if (eee_cap & MDIO_EEE_10GT)
208 supported |= SUPPORTED_10000baseT_Full;
209 if (eee_cap & MDIO_EEE_1000KX)
210 supported |= SUPPORTED_1000baseKX_Full;
211 if (eee_cap & MDIO_EEE_10GKX4)
212 supported |= SUPPORTED_10000baseKX4_Full;
213 if (eee_cap & MDIO_EEE_10GKR)
214 supported |= SUPPORTED_10000baseKR_Full;
215
216 return supported;
217 }
218
219 /**
220 * mmd_eee_adv_to_ethtool_adv_t
221 * @eee_adv: value of the MMD EEE Advertisement/Link Partner Ability registers
222 *
223 * A small helper function that translates the MMD EEE Advertisment (7.60)
224 * and MMD EEE Link Partner Ability (7.61) bits to ethtool advertisement
225 * settings.
226 */
mmd_eee_adv_to_ethtool_adv_t(u16 eee_adv)227 static inline u32 mmd_eee_adv_to_ethtool_adv_t(u16 eee_adv)
228 {
229 u32 adv = 0;
230
231 if (eee_adv & MDIO_EEE_100TX)
232 adv |= ADVERTISED_100baseT_Full;
233 if (eee_adv & MDIO_EEE_1000T)
234 adv |= ADVERTISED_1000baseT_Full;
235 if (eee_adv & MDIO_EEE_10GT)
236 adv |= ADVERTISED_10000baseT_Full;
237 if (eee_adv & MDIO_EEE_1000KX)
238 adv |= ADVERTISED_1000baseKX_Full;
239 if (eee_adv & MDIO_EEE_10GKX4)
240 adv |= ADVERTISED_10000baseKX4_Full;
241 if (eee_adv & MDIO_EEE_10GKR)
242 adv |= ADVERTISED_10000baseKR_Full;
243
244 return adv;
245 }
246
247 /**
248 * ethtool_adv_to_mmd_eee_adv_t
249 * @adv: the ethtool advertisement settings
250 *
251 * A small helper function that translates ethtool advertisement settings
252 * to EEE advertisements for the MMD EEE Advertisement (7.60) and
253 * MMD EEE Link Partner Ability (7.61) registers.
254 */
ethtool_adv_to_mmd_eee_adv_t(u32 adv)255 static inline u16 ethtool_adv_to_mmd_eee_adv_t(u32 adv)
256 {
257 u16 reg = 0;
258
259 if (adv & ADVERTISED_100baseT_Full)
260 reg |= MDIO_EEE_100TX;
261 if (adv & ADVERTISED_1000baseT_Full)
262 reg |= MDIO_EEE_1000T;
263 if (adv & ADVERTISED_10000baseT_Full)
264 reg |= MDIO_EEE_10GT;
265 if (adv & ADVERTISED_1000baseKX_Full)
266 reg |= MDIO_EEE_1000KX;
267 if (adv & ADVERTISED_10000baseKX4_Full)
268 reg |= MDIO_EEE_10GKX4;
269 if (adv & ADVERTISED_10000baseKR_Full)
270 reg |= MDIO_EEE_10GKR;
271
272 return reg;
273 }
274
275 /**
276 * linkmode_adv_to_mii_10gbt_adv_t
277 * @advertising: the linkmode advertisement settings
278 *
279 * A small helper function that translates linkmode advertisement
280 * settings to phy autonegotiation advertisements for the C45
281 * 10GBASE-T AN CONTROL (7.32) register.
282 */
linkmode_adv_to_mii_10gbt_adv_t(unsigned long * advertising)283 static inline u32 linkmode_adv_to_mii_10gbt_adv_t(unsigned long *advertising)
284 {
285 u32 result = 0;
286
287 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
288 advertising))
289 result |= MDIO_AN_10GBT_CTRL_ADV2_5G;
290 if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
291 advertising))
292 result |= MDIO_AN_10GBT_CTRL_ADV5G;
293 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
294 advertising))
295 result |= MDIO_AN_10GBT_CTRL_ADV10G;
296
297 return result;
298 }
299
300 /**
301 * mii_10gbt_stat_mod_linkmode_lpa_t
302 * @advertising: target the linkmode advertisement settings
303 * @lpa: value of the C45 10GBASE-T AN STATUS register
304 *
305 * A small helper function that translates C45 10GBASE-T AN STATUS register bits
306 * to linkmode advertisement settings. Other bits in advertising aren't changed.
307 */
mii_10gbt_stat_mod_linkmode_lpa_t(unsigned long * advertising,u32 lpa)308 static inline void mii_10gbt_stat_mod_linkmode_lpa_t(unsigned long *advertising,
309 u32 lpa)
310 {
311 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
312 advertising, lpa & MDIO_AN_10GBT_STAT_LP2_5G);
313 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
314 advertising, lpa & MDIO_AN_10GBT_STAT_LP5G);
315 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
316 advertising, lpa & MDIO_AN_10GBT_STAT_LP10G);
317 }
318
319 /**
320 * mii_t1_adv_l_mod_linkmode_t
321 * @advertising: target the linkmode advertisement settings
322 * @lpa: value of the BASE-T1 Autonegotiation Advertisement [15:0] Register
323 *
324 * A small helper function that translates BASE-T1 Autonegotiation
325 * Advertisement [15:0] Register bits to linkmode advertisement settings.
326 * Other bits in advertising aren't changed.
327 */
mii_t1_adv_l_mod_linkmode_t(unsigned long * advertising,u32 lpa)328 static inline void mii_t1_adv_l_mod_linkmode_t(unsigned long *advertising, u32 lpa)
329 {
330 linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertising,
331 lpa & MDIO_AN_T1_ADV_L_PAUSE_CAP);
332 linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, advertising,
333 lpa & MDIO_AN_T1_ADV_L_PAUSE_ASYM);
334 }
335
336 /**
337 * mii_t1_adv_m_mod_linkmode_t
338 * @advertising: target the linkmode advertisement settings
339 * @lpa: value of the BASE-T1 Autonegotiation Advertisement [31:16] Register
340 *
341 * A small helper function that translates BASE-T1 Autonegotiation
342 * Advertisement [31:16] Register bits to linkmode advertisement settings.
343 * Other bits in advertising aren't changed.
344 */
mii_t1_adv_m_mod_linkmode_t(unsigned long * advertising,u32 lpa)345 static inline void mii_t1_adv_m_mod_linkmode_t(unsigned long *advertising, u32 lpa)
346 {
347 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
348 advertising, lpa & MDIO_AN_T1_ADV_M_B10L);
349 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT1_Full_BIT,
350 advertising, lpa & MDIO_AN_T1_ADV_M_100BT1);
351 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT1_Full_BIT,
352 advertising, lpa & MDIO_AN_T1_ADV_M_1000BT1);
353 }
354
355 /**
356 * linkmode_adv_to_mii_t1_adv_l_t
357 * @advertising: the linkmode advertisement settings
358 *
359 * A small helper function that translates linkmode advertisement
360 * settings to phy autonegotiation advertisements for the
361 * BASE-T1 Autonegotiation Advertisement [15:0] Register.
362 */
linkmode_adv_to_mii_t1_adv_l_t(unsigned long * advertising)363 static inline u32 linkmode_adv_to_mii_t1_adv_l_t(unsigned long *advertising)
364 {
365 u32 result = 0;
366
367 if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertising))
368 result |= MDIO_AN_T1_ADV_L_PAUSE_CAP;
369 if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, advertising))
370 result |= MDIO_AN_T1_ADV_L_PAUSE_ASYM;
371
372 return result;
373 }
374
375 /**
376 * linkmode_adv_to_mii_t1_adv_m_t
377 * @advertising: the linkmode advertisement settings
378 *
379 * A small helper function that translates linkmode advertisement
380 * settings to phy autonegotiation advertisements for the
381 * BASE-T1 Autonegotiation Advertisement [31:16] Register.
382 */
linkmode_adv_to_mii_t1_adv_m_t(unsigned long * advertising)383 static inline u32 linkmode_adv_to_mii_t1_adv_m_t(unsigned long *advertising)
384 {
385 u32 result = 0;
386
387 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, advertising))
388 result |= MDIO_AN_T1_ADV_M_B10L;
389 if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT1_Full_BIT, advertising))
390 result |= MDIO_AN_T1_ADV_M_100BT1;
391 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT1_Full_BIT, advertising))
392 result |= MDIO_AN_T1_ADV_M_1000BT1;
393
394 return result;
395 }
396
397 /**
398 * mii_eee_cap1_mod_linkmode_t()
399 * @adv: target the linkmode advertisement settings
400 * @val: register value
401 *
402 * A function that translates value of following registers to the linkmode:
403 * IEEE 802.3-2018 45.2.3.10 "EEE control and capability 1" register (3.20)
404 * IEEE 802.3-2018 45.2.7.13 "EEE advertisement 1" register (7.60)
405 * IEEE 802.3-2018 45.2.7.14 "EEE link partner ability 1" register (7.61)
406 */
mii_eee_cap1_mod_linkmode_t(unsigned long * adv,u32 val)407 static inline void mii_eee_cap1_mod_linkmode_t(unsigned long *adv, u32 val)
408 {
409 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
410 adv, val & MDIO_EEE_100TX);
411 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
412 adv, val & MDIO_EEE_1000T);
413 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
414 adv, val & MDIO_EEE_10GT);
415 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
416 adv, val & MDIO_EEE_1000KX);
417 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
418 adv, val & MDIO_EEE_10GKX4);
419 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
420 adv, val & MDIO_EEE_10GKR);
421 }
422
423 /**
424 * mii_eee_cap2_mod_linkmode_sup_t()
425 * @adv: target the linkmode settings
426 * @val: register value
427 *
428 * A function that translates value of following registers to the linkmode:
429 * IEEE 802.3-2022 45.2.3.11 "EEE control and capability 2" register (3.21)
430 */
mii_eee_cap2_mod_linkmode_sup_t(unsigned long * adv,u32 val)431 static inline void mii_eee_cap2_mod_linkmode_sup_t(unsigned long *adv, u32 val)
432 {
433 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
434 adv, val & MDIO_EEE_2_5GT);
435 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
436 adv, val & MDIO_EEE_5GT);
437 }
438
439 /**
440 * mii_eee_cap2_mod_linkmode_adv_t()
441 * @adv: target the linkmode advertisement settings
442 * @val: register value
443 *
444 * A function that translates value of following registers to the linkmode:
445 * IEEE 802.3-2022 45.2.7.16 "EEE advertisement 2" register (7.62)
446 * IEEE 802.3-2022 45.2.7.17 "EEE link partner ability 2" register (7.63)
447 * Note: Currently this function is the same as mii_eee_cap2_mod_linkmode_sup_t.
448 * For certain, not yet supported, modes however the bits differ.
449 * Therefore create separate functions already.
450 */
mii_eee_cap2_mod_linkmode_adv_t(unsigned long * adv,u32 val)451 static inline void mii_eee_cap2_mod_linkmode_adv_t(unsigned long *adv, u32 val)
452 {
453 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
454 adv, val & MDIO_EEE_2_5GT);
455 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
456 adv, val & MDIO_EEE_5GT);
457 }
458
459 /**
460 * linkmode_to_mii_eee_cap1_t()
461 * @adv: the linkmode advertisement settings
462 *
463 * A function that translates linkmode to value for IEEE 802.3-2018 45.2.7.13
464 * "EEE advertisement 1" register (7.60)
465 */
linkmode_to_mii_eee_cap1_t(unsigned long * adv)466 static inline u32 linkmode_to_mii_eee_cap1_t(unsigned long *adv)
467 {
468 u32 result = 0;
469
470 if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, adv))
471 result |= MDIO_EEE_100TX;
472 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, adv))
473 result |= MDIO_EEE_1000T;
474 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, adv))
475 result |= MDIO_EEE_10GT;
476 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, adv))
477 result |= MDIO_EEE_1000KX;
478 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, adv))
479 result |= MDIO_EEE_10GKX4;
480 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, adv))
481 result |= MDIO_EEE_10GKR;
482
483 return result;
484 }
485
486 /**
487 * linkmode_to_mii_eee_cap2_t()
488 * @adv: the linkmode advertisement settings
489 *
490 * A function that translates linkmode to value for IEEE 802.3-2022 45.2.7.16
491 * "EEE advertisement 2" register (7.62)
492 */
linkmode_to_mii_eee_cap2_t(unsigned long * adv)493 static inline u32 linkmode_to_mii_eee_cap2_t(unsigned long *adv)
494 {
495 u32 result = 0;
496
497 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, adv))
498 result |= MDIO_EEE_2_5GT;
499 if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, adv))
500 result |= MDIO_EEE_5GT;
501
502 return result;
503 }
504
505 /**
506 * mii_10base_t1_adv_mod_linkmode_t()
507 * @adv: linkmode advertisement settings
508 * @val: register value
509 *
510 * A function that translates IEEE 802.3cg-2019 45.2.7.26 "10BASE-T1 AN status"
511 * register (7.527) value to the linkmode.
512 */
mii_10base_t1_adv_mod_linkmode_t(unsigned long * adv,u16 val)513 static inline void mii_10base_t1_adv_mod_linkmode_t(unsigned long *adv, u16 val)
514 {
515 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
516 adv, val & MDIO_AN_10BT1_AN_CTRL_ADV_EEE_T1L);
517 }
518
519 /**
520 * linkmode_adv_to_mii_10base_t1_t()
521 * @adv: linkmode advertisement settings
522 *
523 * A function that translates the linkmode to IEEE 802.3cg-2019 45.2.7.25
524 * "10BASE-T1 AN control" register (7.526) value.
525 */
linkmode_adv_to_mii_10base_t1_t(unsigned long * adv)526 static inline u32 linkmode_adv_to_mii_10base_t1_t(unsigned long *adv)
527 {
528 u32 result = 0;
529
530 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, adv))
531 result |= MDIO_AN_10BT1_AN_CTRL_ADV_EEE_T1L;
532
533 return result;
534 }
535
536 /**
537 * mii_c73_mod_linkmode - convert a Clause 73 advertisement to linkmodes
538 * @adv: linkmode advertisement setting
539 * @lpa: array of three u16s containing the advertisement
540 *
541 * Convert an IEEE 802.3 Clause 73 advertisement to ethtool link modes.
542 */
mii_c73_mod_linkmode(unsigned long * adv,u16 * lpa)543 static inline void mii_c73_mod_linkmode(unsigned long *adv, u16 *lpa)
544 {
545 linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT,
546 adv, lpa[0] & MDIO_AN_C73_0_PAUSE);
547 linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
548 adv, lpa[0] & MDIO_AN_C73_0_ASM_DIR);
549 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
550 adv, lpa[1] & MDIO_AN_C73_1_1000BASE_KX);
551 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
552 adv, lpa[1] & MDIO_AN_C73_1_10GBASE_KX4);
553 linkmode_mod_bit(ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
554 adv, lpa[1] & MDIO_AN_C73_1_40GBASE_KR4);
555 linkmode_mod_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
556 adv, lpa[1] & MDIO_AN_C73_1_40GBASE_CR4);
557 /* 100GBASE_CR10 and 100GBASE_KP4 not implemented */
558 linkmode_mod_bit(ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT,
559 adv, lpa[1] & MDIO_AN_C73_1_100GBASE_KR4);
560 linkmode_mod_bit(ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
561 adv, lpa[1] & MDIO_AN_C73_1_100GBASE_CR4);
562 /* 25GBASE_R_S not implemented */
563 /* The 25GBASE_R bit can be used for 25Gbase KR or CR modes */
564 linkmode_mod_bit(ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
565 adv, lpa[1] & MDIO_AN_C73_1_25GBASE_R);
566 linkmode_mod_bit(ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
567 adv, lpa[1] & MDIO_AN_C73_1_25GBASE_R);
568 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
569 adv, lpa[1] & MDIO_AN_C73_1_10GBASE_KR);
570 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT,
571 adv, lpa[2] & MDIO_AN_C73_2_2500BASE_KX);
572 /* 5GBASE_KR not implemented */
573 }
574
575 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
576 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
577 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask,
578 u16 set);
579 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
580 u16 mask, u16 set);
581
582 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
583 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum);
584 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
585 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val);
586 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask,
587 u16 set);
588 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
589 u16 mask, u16 set);
590 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum);
591 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum);
592 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad,
593 u32 regnum);
594 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
595 u16 val);
596 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
597 u16 val);
598 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad,
599 u32 regnum, u16 val);
600 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum,
601 u16 mask, u16 set);
602
603 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad,
604 u32 regnum, u16 mask, u16 set);
605
__mdiodev_read(struct mdio_device * mdiodev,u32 regnum)606 static inline int __mdiodev_read(struct mdio_device *mdiodev, u32 regnum)
607 {
608 return __mdiobus_read(mdiodev->bus, mdiodev->addr, regnum);
609 }
610
__mdiodev_write(struct mdio_device * mdiodev,u32 regnum,u16 val)611 static inline int __mdiodev_write(struct mdio_device *mdiodev, u32 regnum,
612 u16 val)
613 {
614 return __mdiobus_write(mdiodev->bus, mdiodev->addr, regnum, val);
615 }
616
__mdiodev_modify(struct mdio_device * mdiodev,u32 regnum,u16 mask,u16 set)617 static inline int __mdiodev_modify(struct mdio_device *mdiodev, u32 regnum,
618 u16 mask, u16 set)
619 {
620 return __mdiobus_modify(mdiodev->bus, mdiodev->addr, regnum, mask, set);
621 }
622
__mdiodev_modify_changed(struct mdio_device * mdiodev,u32 regnum,u16 mask,u16 set)623 static inline int __mdiodev_modify_changed(struct mdio_device *mdiodev,
624 u32 regnum, u16 mask, u16 set)
625 {
626 return __mdiobus_modify_changed(mdiodev->bus, mdiodev->addr, regnum,
627 mask, set);
628 }
629
mdiodev_read(struct mdio_device * mdiodev,u32 regnum)630 static inline int mdiodev_read(struct mdio_device *mdiodev, u32 regnum)
631 {
632 return mdiobus_read(mdiodev->bus, mdiodev->addr, regnum);
633 }
634
mdiodev_write(struct mdio_device * mdiodev,u32 regnum,u16 val)635 static inline int mdiodev_write(struct mdio_device *mdiodev, u32 regnum,
636 u16 val)
637 {
638 return mdiobus_write(mdiodev->bus, mdiodev->addr, regnum, val);
639 }
640
mdiodev_modify(struct mdio_device * mdiodev,u32 regnum,u16 mask,u16 set)641 static inline int mdiodev_modify(struct mdio_device *mdiodev, u32 regnum,
642 u16 mask, u16 set)
643 {
644 return mdiobus_modify(mdiodev->bus, mdiodev->addr, regnum, mask, set);
645 }
646
mdiodev_modify_changed(struct mdio_device * mdiodev,u32 regnum,u16 mask,u16 set)647 static inline int mdiodev_modify_changed(struct mdio_device *mdiodev,
648 u32 regnum, u16 mask, u16 set)
649 {
650 return mdiobus_modify_changed(mdiodev->bus, mdiodev->addr, regnum,
651 mask, set);
652 }
653
__mdiodev_c45_read(struct mdio_device * mdiodev,int devad,u16 regnum)654 static inline int __mdiodev_c45_read(struct mdio_device *mdiodev, int devad,
655 u16 regnum)
656 {
657 return __mdiobus_c45_read(mdiodev->bus, mdiodev->addr, devad, regnum);
658 }
659
__mdiodev_c45_write(struct mdio_device * mdiodev,u32 devad,u16 regnum,u16 val)660 static inline int __mdiodev_c45_write(struct mdio_device *mdiodev, u32 devad,
661 u16 regnum, u16 val)
662 {
663 return __mdiobus_c45_write(mdiodev->bus, mdiodev->addr, devad, regnum,
664 val);
665 }
666
mdiodev_c45_modify(struct mdio_device * mdiodev,int devad,u32 regnum,u16 mask,u16 set)667 static inline int mdiodev_c45_modify(struct mdio_device *mdiodev, int devad,
668 u32 regnum, u16 mask, u16 set)
669 {
670 return mdiobus_c45_modify(mdiodev->bus, mdiodev->addr, devad, regnum,
671 mask, set);
672 }
673
mdiodev_c45_modify_changed(struct mdio_device * mdiodev,int devad,u32 regnum,u16 mask,u16 set)674 static inline int mdiodev_c45_modify_changed(struct mdio_device *mdiodev,
675 int devad, u32 regnum, u16 mask,
676 u16 set)
677 {
678 return mdiobus_c45_modify_changed(mdiodev->bus, mdiodev->addr, devad,
679 regnum, mask, set);
680 }
681
mdiodev_c45_read(struct mdio_device * mdiodev,int devad,u16 regnum)682 static inline int mdiodev_c45_read(struct mdio_device *mdiodev, int devad,
683 u16 regnum)
684 {
685 return mdiobus_c45_read(mdiodev->bus, mdiodev->addr, devad, regnum);
686 }
687
mdiodev_c45_write(struct mdio_device * mdiodev,u32 devad,u16 regnum,u16 val)688 static inline int mdiodev_c45_write(struct mdio_device *mdiodev, u32 devad,
689 u16 regnum, u16 val)
690 {
691 return mdiobus_c45_write(mdiodev->bus, mdiodev->addr, devad, regnum,
692 val);
693 }
694
695 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr);
696 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr);
697
698 /**
699 * mdio_module_driver() - Helper macro for registering mdio drivers
700 * @_mdio_driver: driver to register
701 *
702 * Helper macro for MDIO drivers which do not do anything special in module
703 * init/exit. Each module may only use this macro once, and calling it
704 * replaces module_init() and module_exit().
705 */
706 #define mdio_module_driver(_mdio_driver) \
707 module_driver(_mdio_driver, mdio_driver_register, mdio_driver_unregister)
708
709 #endif /* __LINUX_MDIO_H__ */
710