1 // SPDX-License-Identifier: GPL-2.0+
3 * Core PHY library, taken from phy.c
5 #include <linux/export.h>
8 const char *phy_speed_to_str(int speed
)
40 return "Unsupported (update phy-core.c)";
43 EXPORT_SYMBOL_GPL(phy_speed_to_str
);
45 const char *phy_duplex_to_str(unsigned int duplex
)
47 if (duplex
== DUPLEX_HALF
)
49 if (duplex
== DUPLEX_FULL
)
51 if (duplex
== DUPLEX_UNKNOWN
)
53 return "Unsupported (update phy-core.c)";
55 EXPORT_SYMBOL_GPL(phy_duplex_to_str
);
57 /* A mapping of all SUPPORTED settings to speed/duplex. This table
58 * must be grouped by speed and sorted in descending match priority
59 * - iow, descending speed. */
60 static const struct phy_setting settings
[] = {
63 .speed
= SPEED_100000
,
64 .duplex
= DUPLEX_FULL
,
65 .bit
= ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT
,
68 .speed
= SPEED_100000
,
69 .duplex
= DUPLEX_FULL
,
70 .bit
= ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT
,
73 .speed
= SPEED_100000
,
74 .duplex
= DUPLEX_FULL
,
75 .bit
= ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT
,
78 .speed
= SPEED_100000
,
79 .duplex
= DUPLEX_FULL
,
80 .bit
= ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT
,
85 .duplex
= DUPLEX_FULL
,
86 .bit
= ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT
,
90 .duplex
= DUPLEX_FULL
,
91 .bit
= ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT
,
95 .duplex
= DUPLEX_FULL
,
96 .bit
= ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT
,
100 .duplex
= DUPLEX_FULL
,
101 .bit
= ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT
,
105 .speed
= SPEED_50000
,
106 .duplex
= DUPLEX_FULL
,
107 .bit
= ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT
,
110 .speed
= SPEED_50000
,
111 .duplex
= DUPLEX_FULL
,
112 .bit
= ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT
,
115 .speed
= SPEED_50000
,
116 .duplex
= DUPLEX_FULL
,
117 .bit
= ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT
,
121 .speed
= SPEED_40000
,
122 .duplex
= DUPLEX_FULL
,
123 .bit
= ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT
,
126 .speed
= SPEED_40000
,
127 .duplex
= DUPLEX_FULL
,
128 .bit
= ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT
,
131 .speed
= SPEED_40000
,
132 .duplex
= DUPLEX_FULL
,
133 .bit
= ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT
,
136 .speed
= SPEED_40000
,
137 .duplex
= DUPLEX_FULL
,
138 .bit
= ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT
,
142 .speed
= SPEED_25000
,
143 .duplex
= DUPLEX_FULL
,
144 .bit
= ETHTOOL_LINK_MODE_25000baseCR_Full_BIT
,
147 .speed
= SPEED_25000
,
148 .duplex
= DUPLEX_FULL
,
149 .bit
= ETHTOOL_LINK_MODE_25000baseKR_Full_BIT
,
152 .speed
= SPEED_25000
,
153 .duplex
= DUPLEX_FULL
,
154 .bit
= ETHTOOL_LINK_MODE_25000baseSR_Full_BIT
,
159 .speed
= SPEED_20000
,
160 .duplex
= DUPLEX_FULL
,
161 .bit
= ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT
,
164 .speed
= SPEED_20000
,
165 .duplex
= DUPLEX_FULL
,
166 .bit
= ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT
,
170 .speed
= SPEED_10000
,
171 .duplex
= DUPLEX_FULL
,
172 .bit
= ETHTOOL_LINK_MODE_10000baseCR_Full_BIT
,
175 .speed
= SPEED_10000
,
176 .duplex
= DUPLEX_FULL
,
177 .bit
= ETHTOOL_LINK_MODE_10000baseER_Full_BIT
,
180 .speed
= SPEED_10000
,
181 .duplex
= DUPLEX_FULL
,
182 .bit
= ETHTOOL_LINK_MODE_10000baseKR_Full_BIT
,
185 .speed
= SPEED_10000
,
186 .duplex
= DUPLEX_FULL
,
187 .bit
= ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT
,
190 .speed
= SPEED_10000
,
191 .duplex
= DUPLEX_FULL
,
192 .bit
= ETHTOOL_LINK_MODE_10000baseLR_Full_BIT
,
195 .speed
= SPEED_10000
,
196 .duplex
= DUPLEX_FULL
,
197 .bit
= ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT
,
200 .speed
= SPEED_10000
,
201 .duplex
= DUPLEX_FULL
,
202 .bit
= ETHTOOL_LINK_MODE_10000baseR_FEC_BIT
,
205 .speed
= SPEED_10000
,
206 .duplex
= DUPLEX_FULL
,
207 .bit
= ETHTOOL_LINK_MODE_10000baseSR_Full_BIT
,
210 .speed
= SPEED_10000
,
211 .duplex
= DUPLEX_FULL
,
212 .bit
= ETHTOOL_LINK_MODE_10000baseT_Full_BIT
,
217 .duplex
= DUPLEX_FULL
,
218 .bit
= ETHTOOL_LINK_MODE_5000baseT_Full_BIT
,
224 .duplex
= DUPLEX_FULL
,
225 .bit
= ETHTOOL_LINK_MODE_2500baseT_Full_BIT
,
229 .duplex
= DUPLEX_FULL
,
230 .bit
= ETHTOOL_LINK_MODE_2500baseX_Full_BIT
,
235 .duplex
= DUPLEX_FULL
,
236 .bit
= ETHTOOL_LINK_MODE_1000baseKX_Full_BIT
,
240 .duplex
= DUPLEX_FULL
,
241 .bit
= ETHTOOL_LINK_MODE_1000baseT_Full_BIT
,
245 .duplex
= DUPLEX_HALF
,
246 .bit
= ETHTOOL_LINK_MODE_1000baseT_Half_BIT
,
250 .duplex
= DUPLEX_FULL
,
251 .bit
= ETHTOOL_LINK_MODE_1000baseX_Full_BIT
,
256 .duplex
= DUPLEX_FULL
,
257 .bit
= ETHTOOL_LINK_MODE_100baseT_Full_BIT
,
261 .duplex
= DUPLEX_HALF
,
262 .bit
= ETHTOOL_LINK_MODE_100baseT_Half_BIT
,
267 .duplex
= DUPLEX_FULL
,
268 .bit
= ETHTOOL_LINK_MODE_10baseT_Full_BIT
,
272 .duplex
= DUPLEX_HALF
,
273 .bit
= ETHTOOL_LINK_MODE_10baseT_Half_BIT
,
278 * phy_lookup_setting - lookup a PHY setting
279 * @speed: speed to match
280 * @duplex: duplex to match
281 * @mask: allowed link modes
282 * @exact: an exact match is required
284 * Search the settings array for a setting that matches the speed and
285 * duplex, and which is supported.
287 * If @exact is unset, either an exact match or %NULL for no match will
290 * If @exact is set, an exact match, the fastest supported setting at
291 * or below the specified speed, the slowest supported setting, or if
292 * they all fail, %NULL will be returned.
294 const struct phy_setting
*
295 phy_lookup_setting(int speed
, int duplex
, const unsigned long *mask
, bool exact
)
297 const struct phy_setting
*p
, *match
= NULL
, *last
= NULL
;
300 for (i
= 0, p
= settings
; i
< ARRAY_SIZE(settings
); i
++, p
++) {
301 if (p
->bit
< __ETHTOOL_LINK_MODE_MASK_NBITS
&&
302 test_bit(p
->bit
, mask
)) {
304 if (p
->speed
== speed
&& p
->duplex
== duplex
) {
305 /* Exact match for speed and duplex */
309 if (!match
&& p
->speed
<= speed
)
313 if (p
->speed
< speed
)
319 if (!match
&& !exact
)
324 EXPORT_SYMBOL_GPL(phy_lookup_setting
);
326 size_t phy_speeds(unsigned int *speeds
, size_t size
,
332 for (i
= 0, count
= 0; i
< ARRAY_SIZE(settings
) && count
< size
; i
++)
333 if (settings
[i
].bit
< __ETHTOOL_LINK_MODE_MASK_NBITS
&&
334 test_bit(settings
[i
].bit
, mask
) &&
335 (count
== 0 || speeds
[count
- 1] != settings
[i
].speed
))
336 speeds
[count
++] = settings
[i
].speed
;
342 * phy_resolve_aneg_linkmode - resolve the advertisements into phy settings
343 * @phydev: The phy_device struct
345 * Resolve our and the link partner advertisements into their corresponding
346 * speed and duplex. If full duplex was negotiated, extract the pause mode
347 * from the link partner mask.
349 void phy_resolve_aneg_linkmode(struct phy_device
*phydev
)
351 __ETHTOOL_DECLARE_LINK_MODE_MASK(common
);
353 linkmode_and(common
, phydev
->lp_advertising
, phydev
->advertising
);
355 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT
, common
)) {
356 phydev
->speed
= SPEED_10000
;
357 phydev
->duplex
= DUPLEX_FULL
;
358 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT
,
360 phydev
->speed
= SPEED_5000
;
361 phydev
->duplex
= DUPLEX_FULL
;
362 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT
,
364 phydev
->speed
= SPEED_2500
;
365 phydev
->duplex
= DUPLEX_FULL
;
366 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT
,
368 phydev
->speed
= SPEED_1000
;
369 phydev
->duplex
= DUPLEX_FULL
;
370 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT
,
372 phydev
->speed
= SPEED_1000
;
373 phydev
->duplex
= DUPLEX_HALF
;
374 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT
,
376 phydev
->speed
= SPEED_100
;
377 phydev
->duplex
= DUPLEX_FULL
;
378 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT
,
380 phydev
->speed
= SPEED_100
;
381 phydev
->duplex
= DUPLEX_HALF
;
382 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT
,
384 phydev
->speed
= SPEED_10
;
385 phydev
->duplex
= DUPLEX_FULL
;
386 } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT
,
388 phydev
->speed
= SPEED_10
;
389 phydev
->duplex
= DUPLEX_HALF
;
392 if (phydev
->duplex
== DUPLEX_FULL
) {
393 phydev
->pause
= linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT
,
394 phydev
->lp_advertising
);
395 phydev
->asym_pause
= linkmode_test_bit(
396 ETHTOOL_LINK_MODE_Asym_Pause_BIT
,
397 phydev
->lp_advertising
);
400 EXPORT_SYMBOL_GPL(phy_resolve_aneg_linkmode
);
402 static void mmd_phy_indirect(struct mii_bus
*bus
, int phy_addr
, int devad
,
405 /* Write the desired MMD Devad */
406 __mdiobus_write(bus
, phy_addr
, MII_MMD_CTRL
, devad
);
408 /* Write the desired MMD register address */
409 __mdiobus_write(bus
, phy_addr
, MII_MMD_DATA
, regnum
);
411 /* Select the Function : DATA with no post increment */
412 __mdiobus_write(bus
, phy_addr
, MII_MMD_CTRL
,
413 devad
| MII_MMD_CTRL_NOINCR
);
417 * __phy_read_mmd - Convenience function for reading a register
418 * from an MMD on a given PHY.
419 * @phydev: The phy_device struct
420 * @devad: The MMD to read from (0..31)
421 * @regnum: The register on the MMD to read (0..65535)
423 * Same rules as for __phy_read();
425 int __phy_read_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
)
429 if (regnum
> (u16
)~0 || devad
> 32)
432 if (phydev
->drv
->read_mmd
) {
433 val
= phydev
->drv
->read_mmd(phydev
, devad
, regnum
);
434 } else if (phydev
->is_c45
) {
435 u32 addr
= MII_ADDR_C45
| (devad
<< 16) | (regnum
& 0xffff);
437 val
= __mdiobus_read(phydev
->mdio
.bus
, phydev
->mdio
.addr
, addr
);
439 struct mii_bus
*bus
= phydev
->mdio
.bus
;
440 int phy_addr
= phydev
->mdio
.addr
;
442 mmd_phy_indirect(bus
, phy_addr
, devad
, regnum
);
444 /* Read the content of the MMD's selected register */
445 val
= __mdiobus_read(bus
, phy_addr
, MII_MMD_DATA
);
449 EXPORT_SYMBOL(__phy_read_mmd
);
452 * phy_read_mmd - Convenience function for reading a register
453 * from an MMD on a given PHY.
454 * @phydev: The phy_device struct
455 * @devad: The MMD to read from
456 * @regnum: The register on the MMD to read
458 * Same rules as for phy_read();
460 int phy_read_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
)
464 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
465 ret
= __phy_read_mmd(phydev
, devad
, regnum
);
466 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
470 EXPORT_SYMBOL(phy_read_mmd
);
473 * __phy_write_mmd - Convenience function for writing a register
474 * on an MMD on a given PHY.
475 * @phydev: The phy_device struct
476 * @devad: The MMD to read from
477 * @regnum: The register on the MMD to read
478 * @val: value to write to @regnum
480 * Same rules as for __phy_write();
482 int __phy_write_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
, u16 val
)
486 if (regnum
> (u16
)~0 || devad
> 32)
489 if (phydev
->drv
->write_mmd
) {
490 ret
= phydev
->drv
->write_mmd(phydev
, devad
, regnum
, val
);
491 } else if (phydev
->is_c45
) {
492 u32 addr
= MII_ADDR_C45
| (devad
<< 16) | (regnum
& 0xffff);
494 ret
= __mdiobus_write(phydev
->mdio
.bus
, phydev
->mdio
.addr
,
497 struct mii_bus
*bus
= phydev
->mdio
.bus
;
498 int phy_addr
= phydev
->mdio
.addr
;
500 mmd_phy_indirect(bus
, phy_addr
, devad
, regnum
);
502 /* Write the data into MMD's selected register */
503 __mdiobus_write(bus
, phy_addr
, MII_MMD_DATA
, val
);
509 EXPORT_SYMBOL(__phy_write_mmd
);
512 * phy_write_mmd - Convenience function for writing a register
513 * on an MMD on a given PHY.
514 * @phydev: The phy_device struct
515 * @devad: The MMD to read from
516 * @regnum: The register on the MMD to read
517 * @val: value to write to @regnum
519 * Same rules as for phy_write();
521 int phy_write_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
, u16 val
)
525 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
526 ret
= __phy_write_mmd(phydev
, devad
, regnum
, val
);
527 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
531 EXPORT_SYMBOL(phy_write_mmd
);
534 * __phy_modify_changed() - Convenience function for modifying a PHY register
535 * @phydev: a pointer to a &struct phy_device
536 * @regnum: register number
537 * @mask: bit mask of bits to clear
538 * @set: bit mask of bits to set
540 * Unlocked helper function which allows a PHY register to be modified as
541 * new register value = (old register value & ~mask) | set
543 * Returns negative errno, 0 if there was no change, and 1 in case of change
545 int __phy_modify_changed(struct phy_device
*phydev
, u32 regnum
, u16 mask
,
550 ret
= __phy_read(phydev
, regnum
);
554 new = (ret
& ~mask
) | set
;
558 ret
= __phy_write(phydev
, regnum
, new);
560 return ret
< 0 ? ret
: 1;
562 EXPORT_SYMBOL_GPL(__phy_modify_changed
);
565 * phy_modify_changed - Function for modifying a PHY register
566 * @phydev: the phy_device struct
567 * @regnum: register number to modify
568 * @mask: bit mask of bits to clear
569 * @set: new value of bits set in mask to write to @regnum
571 * NOTE: MUST NOT be called from interrupt context,
572 * because the bus read/write functions may wait for an interrupt
573 * to conclude the operation.
575 * Returns negative errno, 0 if there was no change, and 1 in case of change
577 int phy_modify_changed(struct phy_device
*phydev
, u32 regnum
, u16 mask
, u16 set
)
581 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
582 ret
= __phy_modify_changed(phydev
, regnum
, mask
, set
);
583 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
587 EXPORT_SYMBOL_GPL(phy_modify_changed
);
590 * __phy_modify - Convenience function for modifying a PHY register
591 * @phydev: the phy_device struct
592 * @regnum: register number to modify
593 * @mask: bit mask of bits to clear
594 * @set: new value of bits set in mask to write to @regnum
596 * NOTE: MUST NOT be called from interrupt context,
597 * because the bus read/write functions may wait for an interrupt
598 * to conclude the operation.
600 int __phy_modify(struct phy_device
*phydev
, u32 regnum
, u16 mask
, u16 set
)
604 ret
= __phy_modify_changed(phydev
, regnum
, mask
, set
);
606 return ret
< 0 ? ret
: 0;
608 EXPORT_SYMBOL_GPL(__phy_modify
);
611 * phy_modify - Convenience function for modifying a given PHY register
612 * @phydev: the phy_device struct
613 * @regnum: register number to write
614 * @mask: bit mask of bits to clear
615 * @set: new value of bits set in mask to write to @regnum
617 * NOTE: MUST NOT be called from interrupt context,
618 * because the bus read/write functions may wait for an interrupt
619 * to conclude the operation.
621 int phy_modify(struct phy_device
*phydev
, u32 regnum
, u16 mask
, u16 set
)
625 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
626 ret
= __phy_modify(phydev
, regnum
, mask
, set
);
627 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
631 EXPORT_SYMBOL_GPL(phy_modify
);
634 * __phy_modify_mmd_changed - Function for modifying a register on MMD
635 * @phydev: the phy_device struct
636 * @devad: the MMD containing register to modify
637 * @regnum: register number to modify
638 * @mask: bit mask of bits to clear
639 * @set: new value of bits set in mask to write to @regnum
641 * Unlocked helper function which allows a MMD register to be modified as
642 * new register value = (old register value & ~mask) | set
644 * Returns negative errno, 0 if there was no change, and 1 in case of change
646 int __phy_modify_mmd_changed(struct phy_device
*phydev
, int devad
, u32 regnum
,
651 ret
= __phy_read_mmd(phydev
, devad
, regnum
);
655 new = (ret
& ~mask
) | set
;
659 ret
= __phy_write_mmd(phydev
, devad
, regnum
, new);
661 return ret
< 0 ? ret
: 1;
663 EXPORT_SYMBOL_GPL(__phy_modify_mmd_changed
);
666 * phy_modify_mmd_changed - Function for modifying a register on MMD
667 * @phydev: the phy_device struct
668 * @devad: the MMD containing register to modify
669 * @regnum: register number to modify
670 * @mask: bit mask of bits to clear
671 * @set: new value of bits set in mask to write to @regnum
673 * NOTE: MUST NOT be called from interrupt context,
674 * because the bus read/write functions may wait for an interrupt
675 * to conclude the operation.
677 * Returns negative errno, 0 if there was no change, and 1 in case of change
679 int phy_modify_mmd_changed(struct phy_device
*phydev
, int devad
, u32 regnum
,
684 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
685 ret
= __phy_modify_mmd_changed(phydev
, devad
, regnum
, mask
, set
);
686 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
690 EXPORT_SYMBOL_GPL(phy_modify_mmd_changed
);
693 * __phy_modify_mmd - Convenience function for modifying a register on MMD
694 * @phydev: the phy_device struct
695 * @devad: the MMD containing register to modify
696 * @regnum: register number to modify
697 * @mask: bit mask of bits to clear
698 * @set: new value of bits set in mask to write to @regnum
700 * NOTE: MUST NOT be called from interrupt context,
701 * because the bus read/write functions may wait for an interrupt
702 * to conclude the operation.
704 int __phy_modify_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
,
709 ret
= __phy_modify_mmd_changed(phydev
, devad
, regnum
, mask
, set
);
711 return ret
< 0 ? ret
: 0;
713 EXPORT_SYMBOL_GPL(__phy_modify_mmd
);
716 * phy_modify_mmd - Convenience function for modifying a register on MMD
717 * @phydev: the phy_device struct
718 * @devad: the MMD containing register to modify
719 * @regnum: register number to modify
720 * @mask: bit mask of bits to clear
721 * @set: new value of bits set in mask to write to @regnum
723 * NOTE: MUST NOT be called from interrupt context,
724 * because the bus read/write functions may wait for an interrupt
725 * to conclude the operation.
727 int phy_modify_mmd(struct phy_device
*phydev
, int devad
, u32 regnum
,
732 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
733 ret
= __phy_modify_mmd(phydev
, devad
, regnum
, mask
, set
);
734 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
738 EXPORT_SYMBOL_GPL(phy_modify_mmd
);
740 static int __phy_read_page(struct phy_device
*phydev
)
742 return phydev
->drv
->read_page(phydev
);
745 static int __phy_write_page(struct phy_device
*phydev
, int page
)
747 return phydev
->drv
->write_page(phydev
, page
);
751 * phy_save_page() - take the bus lock and save the current page
752 * @phydev: a pointer to a &struct phy_device
754 * Take the MDIO bus lock, and return the current page number. On error,
755 * returns a negative errno. phy_restore_page() must always be called
756 * after this, irrespective of success or failure of this call.
758 int phy_save_page(struct phy_device
*phydev
)
760 mutex_lock(&phydev
->mdio
.bus
->mdio_lock
);
761 return __phy_read_page(phydev
);
763 EXPORT_SYMBOL_GPL(phy_save_page
);
766 * phy_select_page() - take the bus lock, save the current page, and set a page
767 * @phydev: a pointer to a &struct phy_device
768 * @page: desired page
770 * Take the MDIO bus lock to protect against concurrent access, save the
771 * current PHY page, and set the current page. On error, returns a
772 * negative errno, otherwise returns the previous page number.
773 * phy_restore_page() must always be called after this, irrespective
774 * of success or failure of this call.
776 int phy_select_page(struct phy_device
*phydev
, int page
)
780 oldpage
= ret
= phy_save_page(phydev
);
784 if (oldpage
!= page
) {
785 ret
= __phy_write_page(phydev
, page
);
792 EXPORT_SYMBOL_GPL(phy_select_page
);
795 * phy_restore_page() - restore the page register and release the bus lock
796 * @phydev: a pointer to a &struct phy_device
797 * @oldpage: the old page, return value from phy_save_page() or phy_select_page()
798 * @ret: operation's return code
800 * Release the MDIO bus lock, restoring @oldpage if it is a valid page.
801 * This function propagates the earliest error code from the group of
805 * @oldpage if it was a negative value, otherwise
806 * @ret if it was a negative errno value, otherwise
807 * phy_write_page()'s negative value if it were in error, otherwise
810 int phy_restore_page(struct phy_device
*phydev
, int oldpage
, int ret
)
815 r
= __phy_write_page(phydev
, oldpage
);
817 /* Propagate the operation return code if the page write
820 if (ret
>= 0 && r
< 0)
823 /* Propagate the phy page selection error code */
827 mutex_unlock(&phydev
->mdio
.bus
->mdio_lock
);
831 EXPORT_SYMBOL_GPL(phy_restore_page
);
834 * phy_read_paged() - Convenience function for reading a paged register
835 * @phydev: a pointer to a &struct phy_device
836 * @page: the page for the phy
837 * @regnum: register number
839 * Same rules as for phy_read().
841 int phy_read_paged(struct phy_device
*phydev
, int page
, u32 regnum
)
843 int ret
= 0, oldpage
;
845 oldpage
= phy_select_page(phydev
, page
);
847 ret
= __phy_read(phydev
, regnum
);
849 return phy_restore_page(phydev
, oldpage
, ret
);
851 EXPORT_SYMBOL(phy_read_paged
);
854 * phy_write_paged() - Convenience function for writing a paged register
855 * @phydev: a pointer to a &struct phy_device
856 * @page: the page for the phy
857 * @regnum: register number
858 * @val: value to write
860 * Same rules as for phy_write().
862 int phy_write_paged(struct phy_device
*phydev
, int page
, u32 regnum
, u16 val
)
864 int ret
= 0, oldpage
;
866 oldpage
= phy_select_page(phydev
, page
);
868 ret
= __phy_write(phydev
, regnum
, val
);
870 return phy_restore_page(phydev
, oldpage
, ret
);
872 EXPORT_SYMBOL(phy_write_paged
);
875 * phy_modify_paged() - Convenience function for modifying a paged register
876 * @phydev: a pointer to a &struct phy_device
877 * @page: the page for the phy
878 * @regnum: register number
879 * @mask: bit mask of bits to clear
880 * @set: bit mask of bits to set
882 * Same rules as for phy_read() and phy_write().
884 int phy_modify_paged(struct phy_device
*phydev
, int page
, u32 regnum
,
887 int ret
= 0, oldpage
;
889 oldpage
= phy_select_page(phydev
, page
);
891 ret
= __phy_modify(phydev
, regnum
, mask
, set
);
893 return phy_restore_page(phydev
, oldpage
, ret
);
895 EXPORT_SYMBOL(phy_modify_paged
);