aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2019-08-24 19:04:17 -0400
committerDavid S. Miller <davem@davemloft.net>2019-08-24 20:01:36 -0400
commitc1236979b4d2cbaef8bb34aec83a44de445e4210 (patch)
treec0d88cfa6a811c5c934c95090201aee36b11759f
parenta914a84110354925afbae72d2ade97773e018abd (diff)
net: phy: sfp: Add labels to hwmon sensors
SFPs can report two different power values, the transmit power and the receive power. Add labels to make it clear which is which. Also add labels to the other sensors, VCC power supply, bias and module temperature. sensors(1) now shows: sff2-isa-0000 Adapter: ISA adapter VCC: +3.23 V temperature: +33.4 C TX_power: 276.00 uW RX_power: 20.00 uW bias: +0.01 A Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/sfp.c73
1 files changed, 68 insertions, 5 deletions
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index e36c04c26866..272d5773573e 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -429,6 +429,7 @@ static umode_t sfp_hwmon_is_visible(const void *data,
429 return 0; 429 return 0;
430 /* fall through */ 430 /* fall through */
431 case hwmon_temp_input: 431 case hwmon_temp_input:
432 case hwmon_temp_label:
432 return 0444; 433 return 0444;
433 default: 434 default:
434 return 0; 435 return 0;
@@ -447,6 +448,7 @@ static umode_t sfp_hwmon_is_visible(const void *data,
447 return 0; 448 return 0;
448 /* fall through */ 449 /* fall through */
449 case hwmon_in_input: 450 case hwmon_in_input:
451 case hwmon_in_label:
450 return 0444; 452 return 0444;
451 default: 453 default:
452 return 0; 454 return 0;
@@ -465,6 +467,7 @@ static umode_t sfp_hwmon_is_visible(const void *data,
465 return 0; 467 return 0;
466 /* fall through */ 468 /* fall through */
467 case hwmon_curr_input: 469 case hwmon_curr_input:
470 case hwmon_curr_label:
468 return 0444; 471 return 0444;
469 default: 472 default:
470 return 0; 473 return 0;
@@ -492,6 +495,7 @@ static umode_t sfp_hwmon_is_visible(const void *data,
492 return 0; 495 return 0;
493 /* fall through */ 496 /* fall through */
494 case hwmon_power_input: 497 case hwmon_power_input:
498 case hwmon_power_label:
495 return 0444; 499 return 0444;
496 default: 500 default:
497 return 0; 501 return 0;
@@ -987,9 +991,63 @@ static int sfp_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
987 } 991 }
988} 992}
989 993
994static const char *const sfp_hwmon_power_labels[] = {
995 "TX_power",
996 "RX_power",
997};
998
999static int sfp_hwmon_read_string(struct device *dev,
1000 enum hwmon_sensor_types type,
1001 u32 attr, int channel, const char **str)
1002{
1003 switch (type) {
1004 case hwmon_curr:
1005 switch (attr) {
1006 case hwmon_curr_label:
1007 *str = "bias";
1008 return 0;
1009 default:
1010 return -EOPNOTSUPP;
1011 }
1012 break;
1013 case hwmon_temp:
1014 switch (attr) {
1015 case hwmon_temp_label:
1016 *str = "temperature";
1017 return 0;
1018 default:
1019 return -EOPNOTSUPP;
1020 }
1021 break;
1022 case hwmon_in:
1023 switch (attr) {
1024 case hwmon_in_label:
1025 *str = "VCC";
1026 return 0;
1027 default:
1028 return -EOPNOTSUPP;
1029 }
1030 break;
1031 case hwmon_power:
1032 switch (attr) {
1033 case hwmon_power_label:
1034 *str = sfp_hwmon_power_labels[channel];
1035 return 0;
1036 default:
1037 return -EOPNOTSUPP;
1038 }
1039 break;
1040 default:
1041 return -EOPNOTSUPP;
1042 }
1043
1044 return -EOPNOTSUPP;
1045}
1046
990static const struct hwmon_ops sfp_hwmon_ops = { 1047static const struct hwmon_ops sfp_hwmon_ops = {
991 .is_visible = sfp_hwmon_is_visible, 1048 .is_visible = sfp_hwmon_is_visible,
992 .read = sfp_hwmon_read, 1049 .read = sfp_hwmon_read,
1050 .read_string = sfp_hwmon_read_string,
993}; 1051};
994 1052
995static u32 sfp_hwmon_chip_config[] = { 1053static u32 sfp_hwmon_chip_config[] = {
@@ -1007,7 +1065,8 @@ static u32 sfp_hwmon_temp_config[] = {
1007 HWMON_T_MAX | HWMON_T_MIN | 1065 HWMON_T_MAX | HWMON_T_MIN |
1008 HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM | 1066 HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM |
1009 HWMON_T_CRIT | HWMON_T_LCRIT | 1067 HWMON_T_CRIT | HWMON_T_LCRIT |
1010 HWMON_T_CRIT_ALARM | HWMON_T_LCRIT_ALARM, 1068 HWMON_T_CRIT_ALARM | HWMON_T_LCRIT_ALARM |
1069 HWMON_T_LABEL,
1011 0, 1070 0,
1012}; 1071};
1013 1072
@@ -1021,7 +1080,8 @@ static u32 sfp_hwmon_vcc_config[] = {
1021 HWMON_I_MAX | HWMON_I_MIN | 1080 HWMON_I_MAX | HWMON_I_MIN |
1022 HWMON_I_MAX_ALARM | HWMON_I_MIN_ALARM | 1081 HWMON_I_MAX_ALARM | HWMON_I_MIN_ALARM |
1023 HWMON_I_CRIT | HWMON_I_LCRIT | 1082 HWMON_I_CRIT | HWMON_I_LCRIT |
1024 HWMON_I_CRIT_ALARM | HWMON_I_LCRIT_ALARM, 1083 HWMON_I_CRIT_ALARM | HWMON_I_LCRIT_ALARM |
1084 HWMON_I_LABEL,
1025 0, 1085 0,
1026}; 1086};
1027 1087
@@ -1035,7 +1095,8 @@ static u32 sfp_hwmon_bias_config[] = {
1035 HWMON_C_MAX | HWMON_C_MIN | 1095 HWMON_C_MAX | HWMON_C_MIN |
1036 HWMON_C_MAX_ALARM | HWMON_C_MIN_ALARM | 1096 HWMON_C_MAX_ALARM | HWMON_C_MIN_ALARM |
1037 HWMON_C_CRIT | HWMON_C_LCRIT | 1097 HWMON_C_CRIT | HWMON_C_LCRIT |
1038 HWMON_C_CRIT_ALARM | HWMON_C_LCRIT_ALARM, 1098 HWMON_C_CRIT_ALARM | HWMON_C_LCRIT_ALARM |
1099 HWMON_C_LABEL,
1039 0, 1100 0,
1040}; 1101};
1041 1102
@@ -1050,13 +1111,15 @@ static u32 sfp_hwmon_power_config[] = {
1050 HWMON_P_MAX | HWMON_P_MIN | 1111 HWMON_P_MAX | HWMON_P_MIN |
1051 HWMON_P_MAX_ALARM | HWMON_P_MIN_ALARM | 1112 HWMON_P_MAX_ALARM | HWMON_P_MIN_ALARM |
1052 HWMON_P_CRIT | HWMON_P_LCRIT | 1113 HWMON_P_CRIT | HWMON_P_LCRIT |
1053 HWMON_P_CRIT_ALARM | HWMON_P_LCRIT_ALARM, 1114 HWMON_P_CRIT_ALARM | HWMON_P_LCRIT_ALARM |
1115 HWMON_P_LABEL,
1054 /* Receive power */ 1116 /* Receive power */
1055 HWMON_P_INPUT | 1117 HWMON_P_INPUT |
1056 HWMON_P_MAX | HWMON_P_MIN | 1118 HWMON_P_MAX | HWMON_P_MIN |
1057 HWMON_P_MAX_ALARM | HWMON_P_MIN_ALARM | 1119 HWMON_P_MAX_ALARM | HWMON_P_MIN_ALARM |
1058 HWMON_P_CRIT | HWMON_P_LCRIT | 1120 HWMON_P_CRIT | HWMON_P_LCRIT |
1059 HWMON_P_CRIT_ALARM | HWMON_P_LCRIT_ALARM, 1121 HWMON_P_CRIT_ALARM | HWMON_P_LCRIT_ALARM |
1122 HWMON_P_LABEL,
1060 0, 1123 0,
1061}; 1124};
1062 1125