@@ -121,6 +121,27 @@ static ssize_t mlxsw_hwmon_fan_rpm_show(struct device *dev,
121
121
return sprintf (buf , "%u\n" , mlxsw_reg_mfsm_rpm_get (mfsm_pl ));
122
122
}
123
123
124
+ static ssize_t mlxsw_hwmon_fan_fault_show (struct device * dev ,
125
+ struct device_attribute * attr ,
126
+ char * buf )
127
+ {
128
+ struct mlxsw_hwmon_attr * mlwsw_hwmon_attr =
129
+ container_of (attr , struct mlxsw_hwmon_attr , dev_attr );
130
+ struct mlxsw_hwmon * mlxsw_hwmon = mlwsw_hwmon_attr -> hwmon ;
131
+ char fore_pl [MLXSW_REG_FORE_LEN ];
132
+ bool fault ;
133
+ int err ;
134
+
135
+ err = mlxsw_reg_query (mlxsw_hwmon -> core , MLXSW_REG (fore ), fore_pl );
136
+ if (err ) {
137
+ dev_err (mlxsw_hwmon -> bus_info -> dev , "Failed to query fan\n" );
138
+ return err ;
139
+ }
140
+ mlxsw_reg_fore_unpack (fore_pl , mlwsw_hwmon_attr -> type_index , & fault );
141
+
142
+ return sprintf (buf , "%u\n" , fault );
143
+ }
144
+
124
145
static ssize_t mlxsw_hwmon_pwm_show (struct device * dev ,
125
146
struct device_attribute * attr ,
126
147
char * buf )
@@ -172,6 +193,7 @@ enum mlxsw_hwmon_attr_type {
172
193
MLXSW_HWMON_ATTR_TYPE_TEMP_MAX ,
173
194
MLXSW_HWMON_ATTR_TYPE_TEMP_RST ,
174
195
MLXSW_HWMON_ATTR_TYPE_FAN_RPM ,
196
+ MLXSW_HWMON_ATTR_TYPE_FAN_FAULT ,
175
197
MLXSW_HWMON_ATTR_TYPE_PWM ,
176
198
};
177
199
@@ -209,6 +231,12 @@ static void mlxsw_hwmon_attr_add(struct mlxsw_hwmon *mlxsw_hwmon,
209
231
snprintf (mlxsw_hwmon_attr -> name , sizeof (mlxsw_hwmon_attr -> name ),
210
232
"fan%u_input" , num + 1 );
211
233
break ;
234
+ case MLXSW_HWMON_ATTR_TYPE_FAN_FAULT :
235
+ mlxsw_hwmon_attr -> dev_attr .show = mlxsw_hwmon_fan_fault_show ;
236
+ mlxsw_hwmon_attr -> dev_attr .attr .mode = 0444 ;
237
+ snprintf (mlxsw_hwmon_attr -> name , sizeof (mlxsw_hwmon_attr -> name ),
238
+ "fan%u_fault" , num + 1 );
239
+ break ;
212
240
case MLXSW_HWMON_ATTR_TYPE_PWM :
213
241
mlxsw_hwmon_attr -> dev_attr .show = mlxsw_hwmon_pwm_show ;
214
242
mlxsw_hwmon_attr -> dev_attr .store = mlxsw_hwmon_pwm_store ;
@@ -280,10 +308,14 @@ static int mlxsw_hwmon_fans_init(struct mlxsw_hwmon *mlxsw_hwmon)
280
308
mlxsw_reg_mfcr_unpack (mfcr_pl , & freq , & tacho_active , & pwm_active );
281
309
num = 0 ;
282
310
for (type_index = 0 ; type_index < MLXSW_MFCR_TACHOS_MAX ; type_index ++ ) {
283
- if (tacho_active & BIT (type_index ))
311
+ if (tacho_active & BIT (type_index )) {
284
312
mlxsw_hwmon_attr_add (mlxsw_hwmon ,
285
313
MLXSW_HWMON_ATTR_TYPE_FAN_RPM ,
314
+ type_index , num );
315
+ mlxsw_hwmon_attr_add (mlxsw_hwmon ,
316
+ MLXSW_HWMON_ATTR_TYPE_FAN_FAULT ,
286
317
type_index , num ++ );
318
+ }
287
319
}
288
320
num = 0 ;
289
321
for (type_index = 0 ; type_index < MLXSW_MFCR_PWMS_MAX ; type_index ++ ) {
0 commit comments