@@ -826,6 +826,100 @@ int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
826
826
}
827
827
EXPORT_SYMBOL_GPL (__mdiobus_modify_changed );
828
828
829
+ /**
830
+ * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
831
+ * @bus: the mii_bus struct
832
+ * @addr: the phy address
833
+ * @devad: device address to read
834
+ * @regnum: register number to read
835
+ *
836
+ * Read a MDIO bus register. Caller must hold the mdio bus lock.
837
+ *
838
+ * NOTE: MUST NOT be called from interrupt context.
839
+ */
840
+ int __mdiobus_c45_read (struct mii_bus * bus , int addr , int devad , u32 regnum )
841
+ {
842
+ int retval ;
843
+
844
+ lockdep_assert_held_once (& bus -> mdio_lock );
845
+
846
+ if (bus -> read_c45 )
847
+ retval = bus -> read_c45 (bus , addr , devad , regnum );
848
+ else
849
+ retval = bus -> read (bus , addr , mdiobus_c45_addr (devad , regnum ));
850
+
851
+ trace_mdio_access (bus , 1 , addr , regnum , retval , retval );
852
+ mdiobus_stats_acct (& bus -> stats [addr ], true, retval );
853
+
854
+ return retval ;
855
+ }
856
+ EXPORT_SYMBOL (__mdiobus_c45_read );
857
+
858
+ /**
859
+ * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
860
+ * @bus: the mii_bus struct
861
+ * @addr: the phy address
862
+ * @devad: device address to read
863
+ * @regnum: register number to write
864
+ * @val: value to write to @regnum
865
+ *
866
+ * Write a MDIO bus register. Caller must hold the mdio bus lock.
867
+ *
868
+ * NOTE: MUST NOT be called from interrupt context.
869
+ */
870
+ int __mdiobus_c45_write (struct mii_bus * bus , int addr , int devad , u32 regnum ,
871
+ u16 val )
872
+ {
873
+ int err ;
874
+
875
+ lockdep_assert_held_once (& bus -> mdio_lock );
876
+
877
+ if (bus -> write_c45 )
878
+ err = bus -> write_c45 (bus , addr , devad , regnum , val );
879
+ else
880
+ err = bus -> write (bus , addr , mdiobus_c45_addr (devad , regnum ),
881
+ val );
882
+
883
+ trace_mdio_access (bus , 0 , addr , regnum , val , err );
884
+ mdiobus_stats_acct (& bus -> stats [addr ], false, err );
885
+
886
+ return err ;
887
+ }
888
+ EXPORT_SYMBOL (__mdiobus_c45_write );
889
+
890
+ /**
891
+ * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
892
+ * @bus: the mii_bus struct
893
+ * @addr: the phy address
894
+ * @devad: device address to read
895
+ * @regnum: register number to modify
896
+ * @mask: bit mask of bits to clear
897
+ * @set: bit mask of bits to set
898
+ *
899
+ * Read, modify, and if any change, write the register value back to the
900
+ * device. Any error returns a negative number.
901
+ *
902
+ * NOTE: MUST NOT be called from interrupt context.
903
+ */
904
+ static int __mdiobus_c45_modify_changed (struct mii_bus * bus , int addr ,
905
+ int devad , u32 regnum , u16 mask ,
906
+ u16 set )
907
+ {
908
+ int new , ret ;
909
+
910
+ ret = __mdiobus_c45_read (bus , addr , devad , regnum );
911
+ if (ret < 0 )
912
+ return ret ;
913
+
914
+ new = (ret & ~mask ) | set ;
915
+ if (new == ret )
916
+ return 0 ;
917
+
918
+ ret = __mdiobus_c45_write (bus , addr , devad , regnum , new );
919
+
920
+ return ret < 0 ? ret : 1 ;
921
+ }
922
+
829
923
/**
830
924
* mdiobus_read_nested - Nested version of the mdiobus_read function
831
925
* @bus: the mii_bus struct
@@ -873,6 +967,29 @@ int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
873
967
}
874
968
EXPORT_SYMBOL (mdiobus_read );
875
969
970
+ /**
971
+ * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
972
+ * @bus: the mii_bus struct
973
+ * @addr: the phy address
974
+ * @devad: device address to read
975
+ * @regnum: register number to read
976
+ *
977
+ * NOTE: MUST NOT be called from interrupt context,
978
+ * because the bus read/write functions may wait for an interrupt
979
+ * to conclude the operation.
980
+ */
981
+ int mdiobus_c45_read (struct mii_bus * bus , int addr , int devad , u32 regnum )
982
+ {
983
+ int retval ;
984
+
985
+ mutex_lock (& bus -> mdio_lock );
986
+ retval = __mdiobus_c45_read (bus , addr , devad , regnum );
987
+ mutex_unlock (& bus -> mdio_lock );
988
+
989
+ return retval ;
990
+ }
991
+ EXPORT_SYMBOL (mdiobus_c45_read );
992
+
876
993
/**
877
994
* mdiobus_write_nested - Nested version of the mdiobus_write function
878
995
* @bus: the mii_bus struct
@@ -922,6 +1039,31 @@ int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
922
1039
}
923
1040
EXPORT_SYMBOL (mdiobus_write );
924
1041
1042
+ /**
1043
+ * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
1044
+ * @bus: the mii_bus struct
1045
+ * @addr: the phy address
1046
+ * @devad: device address to read
1047
+ * @regnum: register number to write
1048
+ * @val: value to write to @regnum
1049
+ *
1050
+ * NOTE: MUST NOT be called from interrupt context,
1051
+ * because the bus read/write functions may wait for an interrupt
1052
+ * to conclude the operation.
1053
+ */
1054
+ int mdiobus_c45_write (struct mii_bus * bus , int addr , int devad , u32 regnum ,
1055
+ u16 val )
1056
+ {
1057
+ int err ;
1058
+
1059
+ mutex_lock (& bus -> mdio_lock );
1060
+ err = __mdiobus_c45_write (bus , addr , devad , regnum , val );
1061
+ mutex_unlock (& bus -> mdio_lock );
1062
+
1063
+ return err ;
1064
+ }
1065
+ EXPORT_SYMBOL (mdiobus_c45_write );
1066
+
925
1067
/**
926
1068
* mdiobus_modify - Convenience function for modifying a given mdio device
927
1069
* register
@@ -943,6 +1085,30 @@ int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set)
943
1085
}
944
1086
EXPORT_SYMBOL_GPL (mdiobus_modify );
945
1087
1088
+ /**
1089
+ * mdiobus_c45_modify - Convenience function for modifying a given mdio device
1090
+ * register
1091
+ * @bus: the mii_bus struct
1092
+ * @addr: the phy address
1093
+ * @devad: device address to read
1094
+ * @regnum: register number to write
1095
+ * @mask: bit mask of bits to clear
1096
+ * @set: bit mask of bits to set
1097
+ */
1098
+ int mdiobus_c45_modify (struct mii_bus * bus , int addr , int devad , u32 regnum ,
1099
+ u16 mask , u16 set )
1100
+ {
1101
+ int err ;
1102
+
1103
+ mutex_lock (& bus -> mdio_lock );
1104
+ err = __mdiobus_c45_modify_changed (bus , addr , devad , regnum ,
1105
+ mask , set );
1106
+ mutex_unlock (& bus -> mdio_lock );
1107
+
1108
+ return err < 0 ? err : 0 ;
1109
+ }
1110
+ EXPORT_SYMBOL_GPL (mdiobus_c45_modify );
1111
+
946
1112
/**
947
1113
* mdiobus_modify_changed - Convenience function for modifying a given mdio
948
1114
* device register and returning if it changed
@@ -965,6 +1131,29 @@ int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
965
1131
}
966
1132
EXPORT_SYMBOL_GPL (mdiobus_modify_changed );
967
1133
1134
+ /**
1135
+ * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
1136
+ * device register and returning if it changed
1137
+ * @bus: the mii_bus struct
1138
+ * @addr: the phy address
1139
+ * @devad: device address to read
1140
+ * @regnum: register number to write
1141
+ * @mask: bit mask of bits to clear
1142
+ * @set: bit mask of bits to set
1143
+ */
1144
+ int mdiobus_c45_modify_changed (struct mii_bus * bus , int devad , int addr ,
1145
+ u32 regnum , u16 mask , u16 set )
1146
+ {
1147
+ int err ;
1148
+
1149
+ mutex_lock (& bus -> mdio_lock );
1150
+ err = __mdiobus_c45_modify_changed (bus , addr , devad , regnum , mask , set );
1151
+ mutex_unlock (& bus -> mdio_lock );
1152
+
1153
+ return err ;
1154
+ }
1155
+ EXPORT_SYMBOL_GPL (mdiobus_c45_modify_changed );
1156
+
968
1157
/**
969
1158
* mdio_bus_match - determine if given MDIO driver supports the given
970
1159
* MDIO device
0 commit comments