diff options
author | Ryan Hsu <ryanhsu@codeaurora.org> | 2018-03-27 04:25:36 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2018-03-29 04:51:14 -0400 |
commit | e98199a8c27f6ac8900307bc611ca4b15467f324 (patch) | |
tree | 95b531b4046eca97ca4260c7afdf01bfd666c594 | |
parent | 55cc11da69895a680940c1733caabc37be685f5e (diff) |
ath10k: enable QCA6174/QCA9377 to read the chip temperature
The firmware of QCA6174/QCA9377 already support the feature, just enable
it to be able to handle the get_temperature command and process the event.
You can read the temperature by using the hwmon interface,
cat /sys/class/ieee80211/phy*/device/hwmon/hwmon2/temp1_input
Verified with the following hardware and software combination,
QCA6174, only firmware-4.bin doesn't support this, otherwise all support.
QCA9377, all the firmwares upstreamed support this command
Signed-off-by: Ryan Hsu <ryanhsu@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi-tlv.c | 39 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi-tlv.h | 11 |
2 files changed, 48 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c index 523af3f8bb62..57bd8a70d242 100644 --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c | |||
@@ -413,6 +413,19 @@ static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar, | |||
413 | return 0; | 413 | return 0; |
414 | } | 414 | } |
415 | 415 | ||
416 | static int ath10k_wmi_tlv_event_temperature(struct ath10k *ar, | ||
417 | struct sk_buff *skb) | ||
418 | { | ||
419 | const struct wmi_tlv_pdev_temperature_event *ev; | ||
420 | |||
421 | ev = (struct wmi_tlv_pdev_temperature_event *)skb->data; | ||
422 | if (WARN_ON(skb->len < sizeof(*ev))) | ||
423 | return -EPROTO; | ||
424 | |||
425 | ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature)); | ||
426 | return 0; | ||
427 | } | ||
428 | |||
416 | /***********/ | 429 | /***********/ |
417 | /* TLV ops */ | 430 | /* TLV ops */ |
418 | /***********/ | 431 | /***********/ |
@@ -553,6 +566,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb) | |||
553 | case WMI_TLV_TX_PAUSE_EVENTID: | 566 | case WMI_TLV_TX_PAUSE_EVENTID: |
554 | ath10k_wmi_tlv_event_tx_pause(ar, skb); | 567 | ath10k_wmi_tlv_event_tx_pause(ar, skb); |
555 | break; | 568 | break; |
569 | case WMI_TLV_PDEV_TEMPERATURE_EVENTID: | ||
570 | ath10k_wmi_tlv_event_temperature(ar, skb); | ||
571 | break; | ||
556 | default: | 572 | default: |
557 | ath10k_warn(ar, "Unknown eventid: %d\n", id); | 573 | ath10k_warn(ar, "Unknown eventid: %d\n", id); |
558 | break; | 574 | break; |
@@ -2658,6 +2674,25 @@ ath10k_wmi_tlv_op_gen_pktlog_enable(struct ath10k *ar, u32 filter) | |||
2658 | } | 2674 | } |
2659 | 2675 | ||
2660 | static struct sk_buff * | 2676 | static struct sk_buff * |
2677 | ath10k_wmi_tlv_op_gen_pdev_get_temperature(struct ath10k *ar) | ||
2678 | { | ||
2679 | struct wmi_tlv_pdev_get_temp_cmd *cmd; | ||
2680 | struct wmi_tlv *tlv; | ||
2681 | struct sk_buff *skb; | ||
2682 | |||
2683 | skb = ath10k_wmi_alloc_skb(ar, sizeof(*tlv) + sizeof(*cmd)); | ||
2684 | if (!skb) | ||
2685 | return ERR_PTR(-ENOMEM); | ||
2686 | |||
2687 | tlv = (void *)skb->data; | ||
2688 | tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_PDEV_GET_TEMPERATURE_CMD); | ||
2689 | tlv->len = __cpu_to_le16(sizeof(*cmd)); | ||
2690 | cmd = (void *)tlv->value; | ||
2691 | ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature tlv\n"); | ||
2692 | return skb; | ||
2693 | } | ||
2694 | |||
2695 | static struct sk_buff * | ||
2661 | ath10k_wmi_tlv_op_gen_pktlog_disable(struct ath10k *ar) | 2696 | ath10k_wmi_tlv_op_gen_pktlog_disable(struct ath10k *ar) |
2662 | { | 2697 | { |
2663 | struct wmi_tlv_pktlog_disable *cmd; | 2698 | struct wmi_tlv_pktlog_disable *cmd; |
@@ -3439,7 +3474,7 @@ static struct wmi_cmd_map wmi_tlv_cmd_map = { | |||
3439 | .force_fw_hang_cmdid = WMI_TLV_FORCE_FW_HANG_CMDID, | 3474 | .force_fw_hang_cmdid = WMI_TLV_FORCE_FW_HANG_CMDID, |
3440 | .gpio_config_cmdid = WMI_TLV_GPIO_CONFIG_CMDID, | 3475 | .gpio_config_cmdid = WMI_TLV_GPIO_CONFIG_CMDID, |
3441 | .gpio_output_cmdid = WMI_TLV_GPIO_OUTPUT_CMDID, | 3476 | .gpio_output_cmdid = WMI_TLV_GPIO_OUTPUT_CMDID, |
3442 | .pdev_get_temperature_cmdid = WMI_TLV_CMD_UNSUPPORTED, | 3477 | .pdev_get_temperature_cmdid = WMI_TLV_PDEV_GET_TEMPERATURE_CMDID, |
3443 | .vdev_set_wmm_params_cmdid = WMI_TLV_VDEV_SET_WMM_PARAMS_CMDID, | 3478 | .vdev_set_wmm_params_cmdid = WMI_TLV_VDEV_SET_WMM_PARAMS_CMDID, |
3444 | .tdls_set_state_cmdid = WMI_TLV_TDLS_SET_STATE_CMDID, | 3479 | .tdls_set_state_cmdid = WMI_TLV_TDLS_SET_STATE_CMDID, |
3445 | .tdls_peer_update_cmdid = WMI_TLV_TDLS_PEER_UPDATE_CMDID, | 3480 | .tdls_peer_update_cmdid = WMI_TLV_TDLS_PEER_UPDATE_CMDID, |
@@ -3702,7 +3737,7 @@ static const struct wmi_ops wmi_tlv_ops = { | |||
3702 | .gen_pktlog_enable = ath10k_wmi_tlv_op_gen_pktlog_enable, | 3737 | .gen_pktlog_enable = ath10k_wmi_tlv_op_gen_pktlog_enable, |
3703 | .gen_pktlog_disable = ath10k_wmi_tlv_op_gen_pktlog_disable, | 3738 | .gen_pktlog_disable = ath10k_wmi_tlv_op_gen_pktlog_disable, |
3704 | /* .gen_pdev_set_quiet_mode not implemented */ | 3739 | /* .gen_pdev_set_quiet_mode not implemented */ |
3705 | /* .gen_pdev_get_temperature not implemented */ | 3740 | .gen_pdev_get_temperature = ath10k_wmi_tlv_op_gen_pdev_get_temperature, |
3706 | /* .gen_addba_clear_resp not implemented */ | 3741 | /* .gen_addba_clear_resp not implemented */ |
3707 | /* .gen_addba_send not implemented */ | 3742 | /* .gen_addba_send not implemented */ |
3708 | /* .gen_addba_set_resp not implemented */ | 3743 | /* .gen_addba_set_resp not implemented */ |
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.h b/drivers/net/wireless/ath/ath10k/wmi-tlv.h index da89128e8dd6..b07b690544e7 100644 --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.h +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.h | |||
@@ -1340,6 +1340,17 @@ struct wmi_tlv_init_cmd { | |||
1340 | __le32 num_host_mem_chunks; | 1340 | __le32 num_host_mem_chunks; |
1341 | } __packed; | 1341 | } __packed; |
1342 | 1342 | ||
1343 | struct wmi_tlv_pdev_get_temp_cmd { | ||
1344 | __le32 pdev_id; /* not used */ | ||
1345 | } __packed; | ||
1346 | |||
1347 | struct wmi_tlv_pdev_temperature_event { | ||
1348 | __le32 tlv_hdr; | ||
1349 | /* temperature value in Celcius degree */ | ||
1350 | __le32 temperature; | ||
1351 | __le32 pdev_id; | ||
1352 | } __packed; | ||
1353 | |||
1343 | struct wmi_tlv_pdev_set_param_cmd { | 1354 | struct wmi_tlv_pdev_set_param_cmd { |
1344 | __le32 pdev_id; /* not used yet */ | 1355 | __le32 pdev_id; /* not used yet */ |
1345 | __le32 param_id; | 1356 | __le32 param_id; |