xref: /linux/drivers/net/phy/mdio_bus.c (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2) !
1 // SPDX-License-Identifier: GPL-2.0+
2 /* MDIO Bus interface
3  *
4  * Author: Andy Fleming
5  *
6  * Copyright (c) 2004 Freescale Semiconductor, Inc.
7  */
8 
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 
11 #include <linux/device.h>
12 #include <linux/errno.h>
13 #include <linux/ethtool.h>
14 #include <linux/init.h>
15 #include <linux/io.h>
16 #include <linux/kernel.h>
17 #include <linux/mii.h>
18 #include <linux/mm.h>
19 #include <linux/module.h>
20 #include <linux/phy.h>
21 #include <linux/slab.h>
22 #include <linux/spinlock.h>
23 #include <linux/string.h>
24 #include <linux/uaccess.h>
25 #include <linux/unistd.h>
26 
27 #define CREATE_TRACE_POINTS
28 #include <trace/events/mdio.h>
29 
30 static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr)
31 {
32 	bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map);
33 
34 	if (WARN_ONCE(!addr_valid, "addr %d out of range\n", addr))
35 		return NULL;
36 
37 	return bus->mdio_map[addr];
38 }
39 
40 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
41 {
42 	struct mdio_device *mdiodev;
43 
44 	mdiodev = mdiobus_find_device(bus, addr);
45 	if (!mdiodev)
46 		return NULL;
47 
48 	if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
49 		return NULL;
50 
51 	return container_of(mdiodev, struct phy_device, mdio);
52 }
53 EXPORT_SYMBOL(mdiobus_get_phy);
54 
55 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr)
56 {
57 	return mdiobus_find_device(bus, addr) != NULL;
58 }
59 EXPORT_SYMBOL(mdiobus_is_registered_device);
60 
61 static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret)
62 {
63 	preempt_disable();
64 	u64_stats_update_begin(&stats->syncp);
65 
66 	u64_stats_inc(&stats->transfers);
67 	if (ret < 0) {
68 		u64_stats_inc(&stats->errors);
69 		goto out;
70 	}
71 
72 	if (op)
73 		u64_stats_inc(&stats->reads);
74 	else
75 		u64_stats_inc(&stats->writes);
76 out:
77 	u64_stats_update_end(&stats->syncp);
78 	preempt_enable();
79 }
80 
81 /**
82  * __mdiobus_read - Unlocked version of the mdiobus_read function
83  * @bus: the mii_bus struct
84  * @addr: the phy address
85  * @regnum: register number to read
86  *
87  * Return: The register value if successful, negative error code on failure
88  *
89  * Read a MDIO bus register. Caller must hold the mdio bus lock.
90  *
91  * NOTE: MUST NOT be called from interrupt context.
92  */
93 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
94 {
95 	int retval;
96 
97 	lockdep_assert_held_once(&bus->mdio_lock);
98 
99 	if (addr >= PHY_MAX_ADDR)
100 		return -ENXIO;
101 
102 	if (bus->read)
103 		retval = bus->read(bus, addr, regnum);
104 	else
105 		retval = -EOPNOTSUPP;
106 
107 	trace_mdio_access(bus, 1, addr, regnum, retval, retval);
108 	mdiobus_stats_acct(&bus->stats[addr], true, retval);
109 
110 	return retval;
111 }
112 EXPORT_SYMBOL(__mdiobus_read);
113 
114 /**
115  * __mdiobus_write - Unlocked version of the mdiobus_write function
116  * @bus: the mii_bus struct
117  * @addr: the phy address
118  * @regnum: register number to write
119  * @val: value to write to @regnum
120  *
121  * Return: Zero if successful, negative error code on failure
122  *
123  * Write a MDIO bus register. Caller must hold the mdio bus lock.
124  *
125  * NOTE: MUST NOT be called from interrupt context.
126  */
127 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
128 {
129 	int err;
130 
131 	lockdep_assert_held_once(&bus->mdio_lock);
132 
133 	if (addr >= PHY_MAX_ADDR)
134 		return -ENXIO;
135 
136 	if (bus->write)
137 		err = bus->write(bus, addr, regnum, val);
138 	else
139 		err = -EOPNOTSUPP;
140 
141 	trace_mdio_access(bus, 0, addr, regnum, val, err);
142 	mdiobus_stats_acct(&bus->stats[addr], false, err);
143 
144 	return err;
145 }
146 EXPORT_SYMBOL(__mdiobus_write);
147 
148 /**
149  * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
150  * @bus: the mii_bus struct
151  * @addr: the phy address
152  * @regnum: register number to modify
153  * @mask: bit mask of bits to clear
154  * @set: bit mask of bits to set
155  *
156  * Return: 1 if the register was modified, 0 if no change was needed,
157  *	   negative on any error condition
158  *
159  * Read, modify, and if any change, write the register value back to the
160  * device.
161  *
162  * NOTE: MUST NOT be called from interrupt context.
163  */
164 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
165 			     u16 mask, u16 set)
166 {
167 	int new, ret;
168 
169 	ret = __mdiobus_read(bus, addr, regnum);
170 	if (ret < 0)
171 		return ret;
172 
173 	new = (ret & ~mask) | set;
174 	if (new == ret)
175 		return 0;
176 
177 	ret = __mdiobus_write(bus, addr, regnum, new);
178 
179 	return ret < 0 ? ret : 1;
180 }
181 EXPORT_SYMBOL_GPL(__mdiobus_modify_changed);
182 
183 /**
184  * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
185  * @bus: the mii_bus struct
186  * @addr: the phy address
187  * @devad: device address to read
188  * @regnum: register number to read
189  *
190  * Return: The register value if successful, negative error code on failure
191  *
192  * Read a MDIO bus register. Caller must hold the mdio bus lock.
193  *
194  * NOTE: MUST NOT be called from interrupt context.
195  */
196 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum)
197 {
198 	int retval;
199 
200 	lockdep_assert_held_once(&bus->mdio_lock);
201 
202 	if (addr >= PHY_MAX_ADDR)
203 		return -ENXIO;
204 
205 	if (bus->read_c45)
206 		retval = bus->read_c45(bus, addr, devad, regnum);
207 	else
208 		retval = -EOPNOTSUPP;
209 
210 	trace_mdio_access(bus, 1, addr, regnum, retval, retval);
211 	mdiobus_stats_acct(&bus->stats[addr], true, retval);
212 
213 	return retval;
214 }
215 EXPORT_SYMBOL(__mdiobus_c45_read);
216 
217 /**
218  * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
219  * @bus: the mii_bus struct
220  * @addr: the phy address
221  * @devad: device address to read
222  * @regnum: register number to write
223  * @val: value to write to @regnum
224  *
225  * Return: Zero if successful, negative error code on failure
226  *
227  * Write a MDIO bus register. Caller must hold the mdio bus lock.
228  *
229  * NOTE: MUST NOT be called from interrupt context.
230  */
231 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
232 			u16 val)
233 {
234 	int err;
235 
236 	lockdep_assert_held_once(&bus->mdio_lock);
237 
238 	if (addr >= PHY_MAX_ADDR)
239 		return -ENXIO;
240 
241 	if (bus->write_c45)
242 		err = bus->write_c45(bus, addr, devad, regnum, val);
243 	else
244 		err = -EOPNOTSUPP;
245 
246 	trace_mdio_access(bus, 0, addr, regnum, val, err);
247 	mdiobus_stats_acct(&bus->stats[addr], false, err);
248 
249 	return err;
250 }
251 EXPORT_SYMBOL(__mdiobus_c45_write);
252 
253 /**
254  * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
255  * @bus: the mii_bus struct
256  * @addr: the phy address
257  * @devad: device address to read
258  * @regnum: register number to modify
259  * @mask: bit mask of bits to clear
260  * @set: bit mask of bits to set
261  *
262  * Return: 1 if the register was modified, 0 if no change was needed,
263  *	   negative on any error condition
264  *
265  * Read, modify, and if any change, write the register value back to the
266  * device. Any error returns a negative number.
267  *
268  * NOTE: MUST NOT be called from interrupt context.
269  */
270 static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr,
271 					int devad, u32 regnum, u16 mask,
272 					u16 set)
273 {
274 	int new, ret;
275 
276 	ret = __mdiobus_c45_read(bus, addr, devad, regnum);
277 	if (ret < 0)
278 		return ret;
279 
280 	new = (ret & ~mask) | set;
281 	if (new == ret)
282 		return 0;
283 
284 	ret = __mdiobus_c45_write(bus, addr, devad, regnum, new);
285 
286 	return ret < 0 ? ret : 1;
287 }
288 
289 /**
290  * mdiobus_read_nested - Nested version of the mdiobus_read function
291  * @bus: the mii_bus struct
292  * @addr: the phy address
293  * @regnum: register number to read
294  *
295  * Return: The register value if successful, negative error code on failure
296  *
297  * In case of nested MDIO bus access avoid lockdep false positives by
298  * using mutex_lock_nested().
299  *
300  * NOTE: MUST NOT be called from interrupt context,
301  * because the bus read/write functions may wait for an interrupt
302  * to conclude the operation.
303  */
304 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum)
305 {
306 	int retval;
307 
308 	mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
309 	retval = __mdiobus_read(bus, addr, regnum);
310 	mutex_unlock(&bus->mdio_lock);
311 
312 	return retval;
313 }
314 EXPORT_SYMBOL(mdiobus_read_nested);
315 
316 /**
317  * mdiobus_read - Convenience function for reading a given MII mgmt register
318  * @bus: the mii_bus struct
319  * @addr: the phy address
320  * @regnum: register number to read
321  *
322  * Return: The register value if successful, negative error code on failure
323  *
324  * NOTE: MUST NOT be called from interrupt context,
325  * because the bus read/write functions may wait for an interrupt
326  * to conclude the operation.
327  */
328 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
329 {
330 	int retval;
331 
332 	mutex_lock(&bus->mdio_lock);
333 	retval = __mdiobus_read(bus, addr, regnum);
334 	mutex_unlock(&bus->mdio_lock);
335 
336 	return retval;
337 }
338 EXPORT_SYMBOL(mdiobus_read);
339 
340 /**
341  * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
342  * @bus: the mii_bus struct
343  * @addr: the phy address
344  * @devad: device address to read
345  * @regnum: register number to read
346  *
347  * Return: The register value if successful, negative error code on failure
348  *
349  * NOTE: MUST NOT be called from interrupt context,
350  * because the bus read/write functions may wait for an interrupt
351  * to conclude the operation.
352  */
353 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum)
354 {
355 	int retval;
356 
357 	mutex_lock(&bus->mdio_lock);
358 	retval = __mdiobus_c45_read(bus, addr, devad, regnum);
359 	mutex_unlock(&bus->mdio_lock);
360 
361 	return retval;
362 }
363 EXPORT_SYMBOL(mdiobus_c45_read);
364 
365 /**
366  * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
367  * @bus: the mii_bus struct
368  * @addr: the phy address
369  * @devad: device address to read
370  * @regnum: register number to read
371  *
372  * Return: The register value if successful, negative error code on failure
373  *
374  * In case of nested MDIO bus access avoid lockdep false positives by
375  * using mutex_lock_nested().
376  *
377  * NOTE: MUST NOT be called from interrupt context,
378  * because the bus read/write functions may wait for an interrupt
379  * to conclude the operation.
380  */
381 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad,
382 			    u32 regnum)
383 {
384 	int retval;
385 
386 	mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
387 	retval = __mdiobus_c45_read(bus, addr, devad, regnum);
388 	mutex_unlock(&bus->mdio_lock);
389 
390 	return retval;
391 }
392 EXPORT_SYMBOL(mdiobus_c45_read_nested);
393 
394 /**
395  * mdiobus_write_nested - Nested version of the mdiobus_write function
396  * @bus: the mii_bus struct
397  * @addr: the phy address
398  * @regnum: register number to write
399  * @val: value to write to @regnum
400  *
401  * Return: Zero if successful, negative error code on failure
402  *
403  * In case of nested MDIO bus access avoid lockdep false positives by
404  * using mutex_lock_nested().
405  *
406  * NOTE: MUST NOT be called from interrupt context,
407  * because the bus read/write functions may wait for an interrupt
408  * to conclude the operation.
409  */
410 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val)
411 {
412 	int err;
413 
414 	mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
415 	err = __mdiobus_write(bus, addr, regnum, val);
416 	mutex_unlock(&bus->mdio_lock);
417 
418 	return err;
419 }
420 EXPORT_SYMBOL(mdiobus_write_nested);
421 
422 /**
423  * mdiobus_write - Convenience function for writing a given MII mgmt register
424  * @bus: the mii_bus struct
425  * @addr: the phy address
426  * @regnum: register number to write
427  * @val: value to write to @regnum
428  *
429  * Return: Zero if successful, negative error code on failure
430  *
431  * NOTE: MUST NOT be called from interrupt context,
432  * because the bus read/write functions may wait for an interrupt
433  * to conclude the operation.
434  */
435 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
436 {
437 	int err;
438 
439 	mutex_lock(&bus->mdio_lock);
440 	err = __mdiobus_write(bus, addr, regnum, val);
441 	mutex_unlock(&bus->mdio_lock);
442 
443 	return err;
444 }
445 EXPORT_SYMBOL(mdiobus_write);
446 
447 /**
448  * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
449  * @bus: the mii_bus struct
450  * @addr: the phy address
451  * @devad: device address to read
452  * @regnum: register number to write
453  * @val: value to write to @regnum
454  *
455  * Return: Zero if successful, negative error code on failure
456  *
457  * NOTE: MUST NOT be called from interrupt context,
458  * because the bus read/write functions may wait for an interrupt
459  * to conclude the operation.
460  */
461 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
462 		      u16 val)
463 {
464 	int err;
465 
466 	mutex_lock(&bus->mdio_lock);
467 	err = __mdiobus_c45_write(bus, addr, devad, regnum, val);
468 	mutex_unlock(&bus->mdio_lock);
469 
470 	return err;
471 }
472 EXPORT_SYMBOL(mdiobus_c45_write);
473 
474 /**
475  * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
476  * @bus: the mii_bus struct
477  * @addr: the phy address
478  * @devad: device address to read
479  * @regnum: register number to write
480  * @val: value to write to @regnum
481  *
482  * Return: Zero if successful, negative error code on failure
483  *
484  * In case of nested MDIO bus access avoid lockdep false positives by
485  * using mutex_lock_nested().
486  *
487  * NOTE: MUST NOT be called from interrupt context,
488  * because the bus read/write functions may wait for an interrupt
489  * to conclude the operation.
490  */
491 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad,
492 			     u32 regnum, u16 val)
493 {
494 	int err;
495 
496 	mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
497 	err = __mdiobus_c45_write(bus, addr, devad, regnum, val);
498 	mutex_unlock(&bus->mdio_lock);
499 
500 	return err;
501 }
502 EXPORT_SYMBOL(mdiobus_c45_write_nested);
503 
504 /*
505  * __mdiobus_modify - Convenience function for modifying a given mdio device
506  *	register
507  * @bus: the mii_bus struct
508  * @addr: the phy address
509  * @regnum: register number to write
510  * @mask: bit mask of bits to clear
511  * @set: bit mask of bits to set
512  *
513  * Return: 0 on success, negative on any error condition
514  */
515 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask,
516 		     u16 set)
517 {
518 	int err;
519 
520 	err = __mdiobus_modify_changed(bus, addr, regnum, mask, set);
521 
522 	return err < 0 ? err : 0;
523 }
524 EXPORT_SYMBOL_GPL(__mdiobus_modify);
525 
526 /**
527  * mdiobus_modify - Convenience function for modifying a given mdio device
528  *	register
529  * @bus: the mii_bus struct
530  * @addr: the phy address
531  * @regnum: register number to write
532  * @mask: bit mask of bits to clear
533  * @set: bit mask of bits to set
534  *
535  * Return: 0 on success, negative on any error condition
536  */
537 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set)
538 {
539 	int err;
540 
541 	mutex_lock(&bus->mdio_lock);
542 	err = __mdiobus_modify(bus, addr, regnum, mask, set);
543 	mutex_unlock(&bus->mdio_lock);
544 
545 	return err;
546 }
547 EXPORT_SYMBOL_GPL(mdiobus_modify);
548 
549 /**
550  * mdiobus_c45_modify - Convenience function for modifying a given mdio device
551  *	register
552  * @bus: the mii_bus struct
553  * @addr: the phy address
554  * @devad: device address to read
555  * @regnum: register number to write
556  * @mask: bit mask of bits to clear
557  * @set: bit mask of bits to set
558  *
559  * Return: 0 on success, negative on any error condition
560  */
561 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum,
562 		       u16 mask, u16 set)
563 {
564 	int err;
565 
566 	mutex_lock(&bus->mdio_lock);
567 	err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum,
568 					   mask, set);
569 	mutex_unlock(&bus->mdio_lock);
570 
571 	return err < 0 ? err : 0;
572 }
573 EXPORT_SYMBOL_GPL(mdiobus_c45_modify);
574 
575 /**
576  * mdiobus_modify_changed - Convenience function for modifying a given mdio
577  *	device register and returning if it changed
578  * @bus: the mii_bus struct
579  * @addr: the phy address
580  * @regnum: register number to write
581  * @mask: bit mask of bits to clear
582  * @set: bit mask of bits to set
583  *
584  * Return: 1 if the register was modified, 0 if no change was needed,
585  *	   negative on any error condition
586  */
587 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
588 			   u16 mask, u16 set)
589 {
590 	int err;
591 
592 	mutex_lock(&bus->mdio_lock);
593 	err = __mdiobus_modify_changed(bus, addr, regnum, mask, set);
594 	mutex_unlock(&bus->mdio_lock);
595 
596 	return err;
597 }
598 EXPORT_SYMBOL_GPL(mdiobus_modify_changed);
599 
600 /**
601  * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
602  *	device register and returning if it changed
603  * @bus: the mii_bus struct
604  * @addr: the phy address
605  * @devad: device address to read
606  * @regnum: register number to write
607  * @mask: bit mask of bits to clear
608  * @set: bit mask of bits to set
609  *
610  * Return: 1 if the register was modified, 0 if no change was needed,
611  *	   negative on any error condition
612  */
613 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad,
614 			       u32 regnum, u16 mask, u16 set)
615 {
616 	int err;
617 
618 	mutex_lock(&bus->mdio_lock);
619 	err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set);
620 	mutex_unlock(&bus->mdio_lock);
621 
622 	return err;
623 }
624 EXPORT_SYMBOL_GPL(mdiobus_c45_modify_changed);
625 
626 MODULE_LICENSE("GPL");
627 MODULE_DESCRIPTION("MDIO bus/device layer");
628