Skip to content

Commit

Permalink
iwlwifi: mvm: refactor temperature notification handling
Browse files Browse the repository at this point in the history
Refactor the temperature handling code so that it is easier to reuse
it with other notification flows.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  • Loading branch information
Luciano Coelho authored and Emmanuel Grumbach committed Nov 11, 2014
1 parent 58629d9 commit fd1f755
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 33 deletions.
1 change: 1 addition & 0 deletions drivers/net/wireless/iwlwifi/mvm/mvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1210,6 +1210,7 @@ bool iwl_mvm_is_idle(struct iwl_mvm *mvm);

/* Thermal management and CT-kill */
void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
void iwl_mvm_tt_temp_changed(struct iwl_mvm *mvm, u32 temp);
void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
void iwl_mvm_tt_initialize(struct iwl_mvm *mvm, u32 min_backoff);
void iwl_mvm_tt_exit(struct iwl_mvm *mvm);
Expand Down
23 changes: 1 addition & 22 deletions drivers/net/wireless/iwlwifi/mvm/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,29 +500,8 @@ int iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
.mvm = mvm,
};

/*
* set temperature debug enabled - ignore FW temperature updates
* and use the user set temperature.
*/
if (mvm->temperature_test) {
if (mvm->temperature < le32_to_cpu(common->temperature))
IWL_DEBUG_TEMP(mvm,
"Ignoring FW temperature update that is greater than the debug set temperature (debug temp = %d, fw temp = %d)\n",
mvm->temperature,
le32_to_cpu(common->temperature));
/*
* skip iwl_mvm_tt_handler since we are in
* temperature debug mode and we are ignoring
* the new temperature value
*/
goto update;
}
iwl_mvm_tt_temp_changed(mvm, le32_to_cpu(common->temperature));

if (mvm->temperature != le32_to_cpu(common->temperature)) {
mvm->temperature = le32_to_cpu(common->temperature);
iwl_mvm_tt_handler(mvm);
}
update:
iwl_mvm_update_rx_statistics(mvm, stats);

ieee80211_iterate_active_interfaces(mvm->hw,
Expand Down
51 changes: 40 additions & 11 deletions drivers/net/wireless/iwlwifi/mvm/tt.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,29 +95,58 @@ static void iwl_mvm_exit_ctkill(struct iwl_mvm *mvm)
iwl_mvm_set_hw_ctkill_state(mvm, false);
}

static bool iwl_mvm_temp_notif(struct iwl_notif_wait_data *notif_wait,
struct iwl_rx_packet *pkt, void *data)
void iwl_mvm_tt_temp_changed(struct iwl_mvm *mvm, u32 temp)
{
/* ignore the notification if we are in test mode */
if (mvm->temperature_test)
return;

if (mvm->temperature == temp)
return;

mvm->temperature = temp;
iwl_mvm_tt_handler(mvm);
}

static int iwl_mvm_temp_notif_parse(struct iwl_mvm *mvm,
struct iwl_rx_packet *pkt)
{
struct iwl_mvm *mvm =
container_of(notif_wait, struct iwl_mvm, notif_wait);
int *temp = data;
struct iwl_dts_measurement_notif *notif;
int len = iwl_rx_packet_payload_len(pkt);
int temp;

if (WARN_ON_ONCE(len != sizeof(*notif))) {
IWL_ERR(mvm, "Invalid DTS_MEASUREMENT_NOTIFICATION\n");
return true;
return -EINVAL;
}

notif = (void *)pkt->data;

*temp = le32_to_cpu(notif->temp);
temp = le32_to_cpu(notif->temp);

/* shouldn't be negative, but since it's s32, make sure it isn't */
if (WARN_ON_ONCE(*temp < 0))
*temp = 0;
if (WARN_ON_ONCE(temp < 0))
temp = 0;

IWL_DEBUG_TEMP(mvm, "DTS_MEASUREMENT_NOTIFICATION - %d\n", temp);

return temp;
}

static bool iwl_mvm_temp_notif_wait(struct iwl_notif_wait_data *notif_wait,
struct iwl_rx_packet *pkt, void *data)
{
struct iwl_mvm *mvm =
container_of(notif_wait, struct iwl_mvm, notif_wait);
int *temp = data;
int ret;

ret = iwl_mvm_temp_notif_parse(mvm, pkt);
if (ret < 0)
return true;

*temp = ret;

IWL_DEBUG_TEMP(mvm, "DTS_MEASUREMENT_NOTIFICATION - %d\n", *temp);
return true;
}

Expand All @@ -141,7 +170,7 @@ int iwl_mvm_get_temp(struct iwl_mvm *mvm)

iwl_init_notification_wait(&mvm->notif_wait, &wait_temp_notif,
temp_notif, ARRAY_SIZE(temp_notif),
iwl_mvm_temp_notif, &temp);
iwl_mvm_temp_notif_wait, &temp);

ret = iwl_mvm_get_temp_cmd(mvm);
if (ret) {
Expand Down

0 comments on commit fd1f755

Please sign in to comment.