55#include <linux/err.h>
66#include <linux/ethtool.h>
77#include <linux/sfp.h>
8+ #include <linux/mutex.h>
89
910#include "core.h"
1011#include "core_env.h"
@@ -19,7 +20,7 @@ struct mlxsw_env_module_info {
1920struct mlxsw_env {
2021 struct mlxsw_core * core ;
2122 u8 module_count ;
22- spinlock_t module_info_lock ; /* Protects 'module_info'. */
23+ struct mutex module_info_lock ; /* Protects 'module_info'. */
2324 struct mlxsw_env_module_info module_info [];
2425};
2526
@@ -507,7 +508,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
507508 sensor_warning =
508509 mlxsw_reg_mtwe_sensor_warning_get (event -> mtwe_pl ,
509510 i + MLXSW_REG_MTMP_MODULE_INDEX_MIN );
510- spin_lock (& mlxsw_env -> module_info_lock );
511+ mutex_lock (& mlxsw_env -> module_info_lock );
511512 is_overheat =
512513 mlxsw_env -> module_info [i ].is_overheat ;
513514
@@ -517,21 +518,21 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
517518 * warning OR current state in "no warning" and MTWE
518519 * does not report warning.
519520 */
520- spin_unlock (& mlxsw_env -> module_info_lock );
521+ mutex_unlock (& mlxsw_env -> module_info_lock );
521522 continue ;
522523 } else if (is_overheat && !sensor_warning ) {
523524 /* MTWE reports "no warning", turn is_overheat off.
524525 */
525526 mlxsw_env -> module_info [i ].is_overheat = false;
526- spin_unlock (& mlxsw_env -> module_info_lock );
527+ mutex_unlock (& mlxsw_env -> module_info_lock );
527528 } else {
528529 /* Current state is "no warning" and MTWE reports
529530 * "warning", increase the counter and turn is_overheat
530531 * on.
531532 */
532533 mlxsw_env -> module_info [i ].is_overheat = true;
533534 mlxsw_env -> module_info [i ].module_overheat_counter ++ ;
534- spin_unlock (& mlxsw_env -> module_info_lock );
535+ mutex_unlock (& mlxsw_env -> module_info_lock );
535536 }
536537 }
537538
@@ -597,9 +598,9 @@ static void mlxsw_env_pmpe_event_work(struct work_struct *work)
597598 work );
598599 mlxsw_env = event -> mlxsw_env ;
599600
600- spin_lock_bh (& mlxsw_env -> module_info_lock );
601+ mutex_lock (& mlxsw_env -> module_info_lock );
601602 mlxsw_env -> module_info [event -> module ].is_overheat = false;
602- spin_unlock_bh (& mlxsw_env -> module_info_lock );
603+ mutex_unlock (& mlxsw_env -> module_info_lock );
603604
604605 err = mlxsw_env_module_has_temp_sensor (mlxsw_env -> core , event -> module ,
605606 & has_temp_sensor );
@@ -699,9 +700,9 @@ mlxsw_env_module_overheat_counter_get(struct mlxsw_core *mlxsw_core, u8 module,
699700 if (WARN_ON_ONCE (module >= mlxsw_env -> module_count ))
700701 return - EINVAL ;
701702
702- spin_lock_bh (& mlxsw_env -> module_info_lock );
703+ mutex_lock (& mlxsw_env -> module_info_lock );
703704 * p_counter = mlxsw_env -> module_info [module ].module_overheat_counter ;
704- spin_unlock_bh (& mlxsw_env -> module_info_lock );
705+ mutex_unlock (& mlxsw_env -> module_info_lock );
705706
706707 return 0 ;
707708}
@@ -725,7 +726,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
725726 if (!env )
726727 return - ENOMEM ;
727728
728- spin_lock_init (& env -> module_info_lock );
729+ mutex_init (& env -> module_info_lock );
729730 env -> core = mlxsw_core ;
730731 env -> module_count = module_count ;
731732 * p_env = env ;
@@ -755,6 +756,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
755756err_module_plug_event_register :
756757 mlxsw_env_temp_warn_event_unregister (env );
757758err_temp_warn_event_register :
759+ mutex_destroy (& env -> module_info_lock );
758760 kfree (env );
759761 return err ;
760762}
@@ -765,5 +767,6 @@ void mlxsw_env_fini(struct mlxsw_env *env)
765767 /* Make sure there is no more event work scheduled. */
766768 mlxsw_core_flush_owq ();
767769 mlxsw_env_temp_warn_event_unregister (env );
770+ mutex_destroy (& env -> module_info_lock );
768771 kfree (env );
769772}
0 commit comments