mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 10:51:27 +00:00
93 lines
2.6 KiB
Diff
93 lines
2.6 KiB
Diff
From b531e057b49fae1a98dc86c55cfc9199796b608a Mon Sep 17 00:00:00 2001
|
|
From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
|
|
Date: Thu, 9 Jul 2020 16:45:08 -0700
|
|
Subject: [PATCH] ath11k: fix thermal temperature read
|
|
|
|
Fix dangling pointer in thermal temerature event which causes
|
|
incorrect temperature read.
|
|
|
|
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
|
|
---
|
|
drivers/net/wireless/ath/ath11k/wmi.c | 53 +++++++++++----------------
|
|
1 file changed, 21 insertions(+), 32 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
|
@@ -5891,31 +5891,6 @@ int ath11k_wmi_pull_fw_stats(struct ath1
|
|
return 0;
|
|
}
|
|
|
|
-static int
|
|
-ath11k_pull_pdev_temp_ev(struct ath11k_base *ab, u8 *evt_buf,
|
|
- u32 len, const struct wmi_pdev_temperature_event *ev)
|
|
-{
|
|
- const void **tb;
|
|
- int ret;
|
|
-
|
|
- tb = ath11k_wmi_tlv_parse_alloc(ab, evt_buf, len, GFP_ATOMIC);
|
|
- if (IS_ERR(tb)) {
|
|
- ret = PTR_ERR(tb);
|
|
- ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
|
|
- return ret;
|
|
- }
|
|
-
|
|
- ev = tb[WMI_TAG_PDEV_TEMPERATURE_EVENT];
|
|
- if (!ev) {
|
|
- ath11k_warn(ab, "failed to fetch pdev temp ev");
|
|
- kfree(tb);
|
|
- return -EPROTO;
|
|
- }
|
|
-
|
|
- kfree(tb);
|
|
- return 0;
|
|
-}
|
|
-
|
|
size_t ath11k_wmi_fw_stats_num_vdevs(struct list_head *head)
|
|
{
|
|
struct ath11k_fw_stats_vdev *i;
|
|
@@ -7388,23 +7363,37 @@ ath11k_wmi_pdev_temperature_event(struct
|
|
struct sk_buff *skb)
|
|
{
|
|
struct ath11k *ar;
|
|
- struct wmi_pdev_temperature_event ev = {0};
|
|
+ const void **tb;
|
|
+ const struct wmi_pdev_temperature_event *ev;
|
|
+ int ret;
|
|
+
|
|
+ tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
|
|
+ if (IS_ERR(tb)) {
|
|
+ ret = PTR_ERR(tb);
|
|
+ ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
|
|
+ return;
|
|
+ }
|
|
|
|
- if (ath11k_pull_pdev_temp_ev(ab, skb->data, skb->len, &ev) != 0) {
|
|
- ath11k_warn(ab, "failed to extract pdev temperature event");
|
|
+ ev = tb[WMI_TAG_PDEV_TEMPERATURE_EVENT];
|
|
+ if (!ev) {
|
|
+ ath11k_warn(ab, "failed to fetch pdev temp ev");
|
|
+ kfree(tb);
|
|
return;
|
|
}
|
|
|
|
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
|
- "pdev temperature ev temp %d pdev_id %d\n", ev.temp, ev.pdev_id);
|
|
+ "pdev temperature ev temp %d pdev_id %d\n", ev->temp, ev->pdev_id);
|
|
|
|
- ar = ath11k_mac_get_ar_by_pdev_id(ab, ev.pdev_id);
|
|
+ ar = ath11k_mac_get_ar_by_pdev_id(ab, ev->pdev_id);
|
|
if (!ar) {
|
|
- ath11k_warn(ab, "invalid pdev id in pdev temperature ev %d", ev.pdev_id);
|
|
+ ath11k_warn(ab, "invalid pdev id in pdev temperature ev %d", ev->pdev_id);
|
|
+ kfree(tb);
|
|
return;
|
|
}
|
|
|
|
- ath11k_thermal_event_temperature(ar, ev.temp);
|
|
+ ath11k_thermal_event_temperature(ar, ev->temp);
|
|
+
|
|
+ kfree(tb);
|
|
}
|
|
|
|
static void ath11k_fils_discovery_event(struct ath11k_base *ab,
|