@@ -540,6 +540,28 @@ static void mmd_phy_indirect(struct mii_bus *bus, int phy_addr, int devad,
540
540
devad | MII_MMD_CTRL_NOINCR );
541
541
}
542
542
543
+ static int mmd_phy_read (struct mii_bus * bus , int phy_addr , bool is_c45 ,
544
+ int devad , u32 regnum )
545
+ {
546
+ if (is_c45 )
547
+ return __mdiobus_c45_read (bus , phy_addr , devad , regnum );
548
+
549
+ mmd_phy_indirect (bus , phy_addr , devad , regnum );
550
+ /* Read the content of the MMD's selected register */
551
+ return __mdiobus_read (bus , phy_addr , MII_MMD_DATA );
552
+ }
553
+
554
+ static int mmd_phy_write (struct mii_bus * bus , int phy_addr , bool is_c45 ,
555
+ int devad , u32 regnum , u16 val )
556
+ {
557
+ if (is_c45 )
558
+ return __mdiobus_c45_write (bus , phy_addr , devad , regnum , val );
559
+
560
+ mmd_phy_indirect (bus , phy_addr , devad , regnum );
561
+ /* Write the data into MMD's selected register */
562
+ return __mdiobus_write (bus , phy_addr , MII_MMD_DATA , val );
563
+ }
564
+
543
565
/**
544
566
* __phy_read_mmd - Convenience function for reading a register
545
567
* from an MMD on a given PHY.
@@ -551,26 +573,14 @@ static void mmd_phy_indirect(struct mii_bus *bus, int phy_addr, int devad,
551
573
*/
552
574
int __phy_read_mmd (struct phy_device * phydev , int devad , u32 regnum )
553
575
{
554
- int val ;
555
-
556
576
if (regnum > (u16 )~0 || devad > 32 )
557
577
return - EINVAL ;
558
578
559
- if (phydev -> drv && phydev -> drv -> read_mmd ) {
560
- val = phydev -> drv -> read_mmd (phydev , devad , regnum );
561
- } else if (phydev -> is_c45 ) {
562
- val = __mdiobus_c45_read (phydev -> mdio .bus , phydev -> mdio .addr ,
563
- devad , regnum );
564
- } else {
565
- struct mii_bus * bus = phydev -> mdio .bus ;
566
- int phy_addr = phydev -> mdio .addr ;
567
-
568
- mmd_phy_indirect (bus , phy_addr , devad , regnum );
579
+ if (phydev -> drv && phydev -> drv -> read_mmd )
580
+ return phydev -> drv -> read_mmd (phydev , devad , regnum );
569
581
570
- /* Read the content of the MMD's selected register */
571
- val = __mdiobus_read (bus , phy_addr , MII_MMD_DATA );
572
- }
573
- return val ;
582
+ return mmd_phy_read (phydev -> mdio .bus , phydev -> mdio .addr ,
583
+ phydev -> is_c45 , devad , regnum );
574
584
}
575
585
EXPORT_SYMBOL (__phy_read_mmd );
576
586
@@ -607,28 +617,14 @@ EXPORT_SYMBOL(phy_read_mmd);
607
617
*/
608
618
int __phy_write_mmd (struct phy_device * phydev , int devad , u32 regnum , u16 val )
609
619
{
610
- int ret ;
611
-
612
620
if (regnum > (u16 )~0 || devad > 32 )
613
621
return - EINVAL ;
614
622
615
- if (phydev -> drv && phydev -> drv -> write_mmd ) {
616
- ret = phydev -> drv -> write_mmd (phydev , devad , regnum , val );
617
- } else if (phydev -> is_c45 ) {
618
- ret = __mdiobus_c45_write (phydev -> mdio .bus , phydev -> mdio .addr ,
619
- devad , regnum , val );
620
- } else {
621
- struct mii_bus * bus = phydev -> mdio .bus ;
622
- int phy_addr = phydev -> mdio .addr ;
623
-
624
- mmd_phy_indirect (bus , phy_addr , devad , regnum );
623
+ if (phydev -> drv && phydev -> drv -> write_mmd )
624
+ return phydev -> drv -> write_mmd (phydev , devad , regnum , val );
625
625
626
- /* Write the data into MMD's selected register */
627
- __mdiobus_write (bus , phy_addr , MII_MMD_DATA , val );
628
-
629
- ret = 0 ;
630
- }
631
- return ret ;
626
+ return mmd_phy_write (phydev -> mdio .bus , phydev -> mdio .addr ,
627
+ phydev -> is_c45 , devad , regnum , val );
632
628
}
633
629
EXPORT_SYMBOL (__phy_write_mmd );
634
630
@@ -654,6 +650,146 @@ int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
654
650
}
655
651
EXPORT_SYMBOL (phy_write_mmd );
656
652
653
+ /**
654
+ * __phy_package_read_mmd - read MMD reg relative to PHY package base addr
655
+ * @phydev: The phy_device struct
656
+ * @addr_offset: The offset to be added to PHY package base_addr
657
+ * @devad: The MMD to read from
658
+ * @regnum: The register on the MMD to read
659
+ *
660
+ * Convenience helper for reading a register of an MMD on a given PHY
661
+ * using the PHY package base address. The base address is added to
662
+ * the addr_offset value.
663
+ *
664
+ * Same calling rules as for __phy_read();
665
+ *
666
+ * NOTE: It's assumed that the entire PHY package is either C22 or C45.
667
+ */
668
+ int __phy_package_read_mmd (struct phy_device * phydev ,
669
+ unsigned int addr_offset , int devad ,
670
+ u32 regnum )
671
+ {
672
+ int addr = phy_package_address (phydev , addr_offset );
673
+
674
+ if (addr < 0 )
675
+ return addr ;
676
+
677
+ if (regnum > (u16 )~0 || devad > 32 )
678
+ return - EINVAL ;
679
+
680
+ return mmd_phy_read (phydev -> mdio .bus , addr , phydev -> is_c45 , devad ,
681
+ regnum );
682
+ }
683
+ EXPORT_SYMBOL (__phy_package_read_mmd );
684
+
685
+ /**
686
+ * phy_package_read_mmd - read MMD reg relative to PHY package base addr
687
+ * @phydev: The phy_device struct
688
+ * @addr_offset: The offset to be added to PHY package base_addr
689
+ * @devad: The MMD to read from
690
+ * @regnum: The register on the MMD to read
691
+ *
692
+ * Convenience helper for reading a register of an MMD on a given PHY
693
+ * using the PHY package base address. The base address is added to
694
+ * the addr_offset value.
695
+ *
696
+ * Same calling rules as for phy_read();
697
+ *
698
+ * NOTE: It's assumed that the entire PHY package is either C22 or C45.
699
+ */
700
+ int phy_package_read_mmd (struct phy_device * phydev ,
701
+ unsigned int addr_offset , int devad ,
702
+ u32 regnum )
703
+ {
704
+ int addr = phy_package_address (phydev , addr_offset );
705
+ int val ;
706
+
707
+ if (addr < 0 )
708
+ return addr ;
709
+
710
+ if (regnum > (u16 )~0 || devad > 32 )
711
+ return - EINVAL ;
712
+
713
+ phy_lock_mdio_bus (phydev );
714
+ val = mmd_phy_read (phydev -> mdio .bus , addr , phydev -> is_c45 , devad ,
715
+ regnum );
716
+ phy_unlock_mdio_bus (phydev );
717
+
718
+ return val ;
719
+ }
720
+ EXPORT_SYMBOL (phy_package_read_mmd );
721
+
722
+ /**
723
+ * __phy_package_write_mmd - write MMD reg relative to PHY package base addr
724
+ * @phydev: The phy_device struct
725
+ * @addr_offset: The offset to be added to PHY package base_addr
726
+ * @devad: The MMD to write to
727
+ * @regnum: The register on the MMD to write
728
+ * @val: value to write to @regnum
729
+ *
730
+ * Convenience helper for writing a register of an MMD on a given PHY
731
+ * using the PHY package base address. The base address is added to
732
+ * the addr_offset value.
733
+ *
734
+ * Same calling rules as for __phy_write();
735
+ *
736
+ * NOTE: It's assumed that the entire PHY package is either C22 or C45.
737
+ */
738
+ int __phy_package_write_mmd (struct phy_device * phydev ,
739
+ unsigned int addr_offset , int devad ,
740
+ u32 regnum , u16 val )
741
+ {
742
+ int addr = phy_package_address (phydev , addr_offset );
743
+
744
+ if (addr < 0 )
745
+ return addr ;
746
+
747
+ if (regnum > (u16 )~0 || devad > 32 )
748
+ return - EINVAL ;
749
+
750
+ return mmd_phy_write (phydev -> mdio .bus , addr , phydev -> is_c45 , devad ,
751
+ regnum , val );
752
+ }
753
+ EXPORT_SYMBOL (__phy_package_write_mmd );
754
+
755
+ /**
756
+ * phy_package_write_mmd - write MMD reg relative to PHY package base addr
757
+ * @phydev: The phy_device struct
758
+ * @addr_offset: The offset to be added to PHY package base_addr
759
+ * @devad: The MMD to write to
760
+ * @regnum: The register on the MMD to write
761
+ * @val: value to write to @regnum
762
+ *
763
+ * Convenience helper for writing a register of an MMD on a given PHY
764
+ * using the PHY package base address. The base address is added to
765
+ * the addr_offset value.
766
+ *
767
+ * Same calling rules as for phy_write();
768
+ *
769
+ * NOTE: It's assumed that the entire PHY package is either C22 or C45.
770
+ */
771
+ int phy_package_write_mmd (struct phy_device * phydev ,
772
+ unsigned int addr_offset , int devad ,
773
+ u32 regnum , u16 val )
774
+ {
775
+ int addr = phy_package_address (phydev , addr_offset );
776
+ int ret ;
777
+
778
+ if (addr < 0 )
779
+ return addr ;
780
+
781
+ if (regnum > (u16 )~0 || devad > 32 )
782
+ return - EINVAL ;
783
+
784
+ phy_lock_mdio_bus (phydev );
785
+ ret = mmd_phy_write (phydev -> mdio .bus , addr , phydev -> is_c45 , devad ,
786
+ regnum , val );
787
+ phy_unlock_mdio_bus (phydev );
788
+
789
+ return ret ;
790
+ }
791
+ EXPORT_SYMBOL (phy_package_write_mmd );
792
+
657
793
/**
658
794
* phy_modify_changed - Function for modifying a PHY register
659
795
* @phydev: the phy_device struct
0 commit comments