diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/tt.c')
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/tt.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c index 999bcb898be8..0a02e9835d6b 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c | |||
@@ -211,10 +211,14 @@ void iwl_mvm_temp_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb) | |||
211 | * the firmware and hence to take the mutex. | 211 | * the firmware and hence to take the mutex. |
212 | * Avoid the deadlock by unlocking the mutex here. | 212 | * Avoid the deadlock by unlocking the mutex here. |
213 | */ | 213 | */ |
214 | mutex_unlock(&mvm->mutex); | 214 | if (mvm->tz_device.tzone) { |
215 | thermal_notify_framework(mvm->tz_device.tzone, | 215 | struct iwl_mvm_thermal_device *tz_dev = &mvm->tz_device; |
216 | mvm->tz_device.fw_trips_index[ths_crossed]); | 216 | |
217 | mutex_lock(&mvm->mutex); | 217 | mutex_unlock(&mvm->mutex); |
218 | thermal_notify_framework(tz_dev->tzone, | ||
219 | tz_dev->fw_trips_index[ths_crossed]); | ||
220 | mutex_lock(&mvm->mutex); | ||
221 | } | ||
218 | #endif /* CONFIG_THERMAL */ | 222 | #endif /* CONFIG_THERMAL */ |
219 | } | 223 | } |
220 | 224 | ||
@@ -520,16 +524,20 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm) | |||
520 | 524 | ||
521 | lockdep_assert_held(&mvm->mutex); | 525 | lockdep_assert_held(&mvm->mutex); |
522 | 526 | ||
527 | if (!mvm->tz_device.tzone) | ||
528 | return -EINVAL; | ||
529 | |||
523 | /* The driver holds array of temperature trips that are unsorted | 530 | /* The driver holds array of temperature trips that are unsorted |
524 | * and uncompressed, the FW should get it compressed and sorted | 531 | * and uncompressed, the FW should get it compressed and sorted |
525 | */ | 532 | */ |
526 | 533 | ||
527 | /* compress temp_trips to cmd array, remove uninitialized values*/ | 534 | /* compress temp_trips to cmd array, remove uninitialized values*/ |
528 | for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) | 535 | for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) { |
529 | if (mvm->tz_device.temp_trips[i] != S16_MIN) { | 536 | if (mvm->tz_device.temp_trips[i] != S16_MIN) { |
530 | cmd.thresholds[idx++] = | 537 | cmd.thresholds[idx++] = |
531 | cpu_to_le16(mvm->tz_device.temp_trips[i]); | 538 | cpu_to_le16(mvm->tz_device.temp_trips[i]); |
532 | } | 539 | } |
540 | } | ||
533 | cmd.num_temps = cpu_to_le32(idx); | 541 | cmd.num_temps = cpu_to_le32(idx); |
534 | 542 | ||
535 | if (!idx) | 543 | if (!idx) |
@@ -696,6 +704,7 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm) | |||
696 | IWL_DEBUG_TEMP(mvm, | 704 | IWL_DEBUG_TEMP(mvm, |
697 | "Failed to register to thermal zone (err = %ld)\n", | 705 | "Failed to register to thermal zone (err = %ld)\n", |
698 | PTR_ERR(mvm->tz_device.tzone)); | 706 | PTR_ERR(mvm->tz_device.tzone)); |
707 | mvm->tz_device.tzone = NULL; | ||
699 | return; | 708 | return; |
700 | } | 709 | } |
701 | 710 | ||
@@ -750,6 +759,10 @@ int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 budget) | |||
750 | return ret; | 759 | return ret; |
751 | } | 760 | } |
752 | 761 | ||
762 | /* can happen if the registration failed */ | ||
763 | if (!mvm->cooling_dev.cdev) | ||
764 | return -EINVAL; | ||
765 | |||
753 | if (op == CTDP_CMD_OPERATION_START) | 766 | if (op == CTDP_CMD_OPERATION_START) |
754 | mvm->cooling_dev.cur_state = budget; | 767 | mvm->cooling_dev.cur_state = budget; |
755 | 768 | ||
@@ -812,15 +825,12 @@ static struct thermal_cooling_device_ops tcooling_ops = { | |||
812 | .set_cur_state = iwl_mvm_tcool_set_cur_state, | 825 | .set_cur_state = iwl_mvm_tcool_set_cur_state, |
813 | }; | 826 | }; |
814 | 827 | ||
815 | int iwl_mvm_cooling_device_register(struct iwl_mvm *mvm) | 828 | static void iwl_mvm_cooling_device_register(struct iwl_mvm *mvm) |
816 | { | 829 | { |
817 | char name[] = "iwlwifi"; | 830 | char name[] = "iwlwifi"; |
818 | 831 | ||
819 | if (!iwl_mvm_is_ctdp_supported(mvm)) { | 832 | if (!iwl_mvm_is_ctdp_supported(mvm)) |
820 | mvm->cooling_dev.cdev = NULL; | 833 | return; |
821 | |||
822 | return 0; | ||
823 | } | ||
824 | 834 | ||
825 | BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH); | 835 | BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH); |
826 | 836 | ||
@@ -833,34 +843,29 @@ int iwl_mvm_cooling_device_register(struct iwl_mvm *mvm) | |||
833 | IWL_DEBUG_TEMP(mvm, | 843 | IWL_DEBUG_TEMP(mvm, |
834 | "Failed to register to cooling device (err = %ld)\n", | 844 | "Failed to register to cooling device (err = %ld)\n", |
835 | PTR_ERR(mvm->cooling_dev.cdev)); | 845 | PTR_ERR(mvm->cooling_dev.cdev)); |
836 | return PTR_ERR(mvm->cooling_dev.cdev); | 846 | mvm->cooling_dev.cdev = NULL; |
847 | return; | ||
837 | } | 848 | } |
838 | |||
839 | return 0; | ||
840 | } | 849 | } |
841 | 850 | ||
842 | static void iwl_mvm_thermal_zone_unregister(struct iwl_mvm *mvm) | 851 | static void iwl_mvm_thermal_zone_unregister(struct iwl_mvm *mvm) |
843 | { | 852 | { |
844 | if (!iwl_mvm_is_tt_in_fw(mvm)) | 853 | if (!iwl_mvm_is_tt_in_fw(mvm) || !mvm->tz_device.tzone) |
845 | return; | 854 | return; |
846 | 855 | ||
847 | if (mvm->tz_device.tzone) { | 856 | IWL_DEBUG_TEMP(mvm, "Thermal zone device unregister\n"); |
848 | IWL_DEBUG_TEMP(mvm, "Thermal zone device unregister\n"); | 857 | thermal_zone_device_unregister(mvm->tz_device.tzone); |
849 | thermal_zone_device_unregister(mvm->tz_device.tzone); | 858 | mvm->tz_device.tzone = NULL; |
850 | mvm->tz_device.tzone = NULL; | ||
851 | } | ||
852 | } | 859 | } |
853 | 860 | ||
854 | static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) | 861 | static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) |
855 | { | 862 | { |
856 | if (!iwl_mvm_is_ctdp_supported(mvm)) | 863 | if (!iwl_mvm_is_ctdp_supported(mvm) || !mvm->cooling_dev.cdev) |
857 | return; | 864 | return; |
858 | 865 | ||
859 | if (mvm->cooling_dev.cdev) { | 866 | IWL_DEBUG_TEMP(mvm, "Cooling device unregister\n"); |
860 | IWL_DEBUG_TEMP(mvm, "Cooling device unregister\n"); | 867 | thermal_cooling_device_unregister(mvm->cooling_dev.cdev); |
861 | thermal_cooling_device_unregister(mvm->cooling_dev.cdev); | 868 | mvm->cooling_dev.cdev = NULL; |
862 | mvm->cooling_dev.cdev = NULL; | ||
863 | } | ||
864 | } | 869 | } |
865 | #endif /* CONFIG_THERMAL */ | 870 | #endif /* CONFIG_THERMAL */ |
866 | 871 | ||