xref: /linux/include/linux/mdio.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
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