aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Hsu <ryanhsu@codeaurora.org>2018-03-27 04:25:36 -0400
committerKalle Valo <kvalo@codeaurora.org>2018-03-29 04:51:14 -0400
commite98199a8c27f6ac8900307bc611ca4b15467f324 (patch)
tree95b531b4046eca97ca4260c7afdf01bfd666c594
parent55cc11da69895a680940c1733caabc37be685f5e (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.c39
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-tlv.h11
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
416static 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
2660static struct sk_buff * 2676static struct sk_buff *
2677ath10k_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
2695static struct sk_buff *
2661ath10k_wmi_tlv_op_gen_pktlog_disable(struct ath10k *ar) 2696ath10k_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
1343struct wmi_tlv_pdev_get_temp_cmd {
1344 __le32 pdev_id; /* not used */
1345} __packed;
1346
1347struct 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
1343struct wmi_tlv_pdev_set_param_cmd { 1354struct 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;