diff options
author | CNSS_WLAN Service <cnssbldsw@qualcomm.com> | 2020-11-24 12:43:10 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-11-24 12:43:10 -0800 |
commit | 3e54543bdac9698ae1f0d5eca01380e7bee28269 (patch) | |
tree | 2a4157cbeecdef2a6772842fe026ca545ffec521 | |
parent | 196bbad5728a56dfd4fa91e43490dde4c00d0577 (diff) | |
parent | 6b43ef01cc1a621774aaa6876545e2a07c9f65ae (diff) |
Merge "wpa_supplicant_8_lib: add support for get thermal info" into wlan-aosp.lnx.6.0
-rw-r--r-- | qcwcn/wpa_supplicant_8_lib/driver_cmd_nl80211.c | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/qcwcn/wpa_supplicant_8_lib/driver_cmd_nl80211.c b/qcwcn/wpa_supplicant_8_lib/driver_cmd_nl80211.c index f8317e5..75b0735 100644 --- a/qcwcn/wpa_supplicant_8_lib/driver_cmd_nl80211.c +++ b/qcwcn/wpa_supplicant_8_lib/driver_cmd_nl80211.c @@ -40,7 +40,6 @@ #define UNUSED(x) (void)(x) #define NL80211_ATTR_MAX_INTERNAL 256 - /* ============ nl80211 driver extensions =========== */ static int wpa_driver_cmd_set_ani_level(struct i802_bss *bss, int mode, int ofdmlvl) { @@ -1181,6 +1180,62 @@ static int wpa_driver_handle_get_sta_info(struct i802_bss *bss, char *cmd, return wpa_driver_get_all_sta_info(bss, buf, buf_len, status); } +static int thermal_info_handler(struct nl_msg *msg, void *arg) +{ + struct nlattr *tb[NL80211_ATTR_MAX + 1]; + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + int *param = arg; + struct nlattr *nl_vendor; + struct nlattr *tb_vendor[QCA_WLAN_VENDOR_ATTR_MAX + 1]; + + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + nl_vendor = tb[NL80211_ATTR_VENDOR_DATA]; + if (!nl_vendor || nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_MAX, + nla_data(nl_vendor), nla_len(nl_vendor), NULL)) { + wpa_printf(MSG_ERROR, "%s: No vendor data found", __func__); + return NL_SKIP; + } + + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_THERMAL_GET_TEMPERATURE_DATA]) + *param = (int) nla_get_u32( + tb_vendor[QCA_WLAN_VENDOR_ATTR_THERMAL_GET_TEMPERATURE_DATA]); + else if (tb_vendor[QCA_WLAN_VENDOR_ATTR_THERMAL_LEVEL]) + *param = (int) nla_get_u32( + tb_vendor[QCA_WLAN_VENDOR_ATTR_THERMAL_LEVEL]); + else + wpa_printf(MSG_ERROR, "%s: failed to parse data", __func__); + + return NL_SKIP; +} + +static int wpa_driver_cmd_get_thermal_info(struct i802_bss *bss, int *result, int attr) +{ + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl_msg *msg = NULL; + struct nlattr *params = NULL; + int ret = 0; + + if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) || + nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) || + nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, + QCA_NL80211_VENDOR_SUBCMD_THERMAL_CMD) || + !(params = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) || + nla_put_u32(msg, QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE, attr)) { + nlmsg_free(msg); + return -1; + } + + nla_nest_end(msg, params); + ret = send_and_recv_msgs(drv, msg, thermal_info_handler, result); + if (!ret) + return 0; + wpa_printf(MSG_ERROR, "%s: Failed get thermal info, ret=%d(%s)", + __func__, ret, strerror(-ret)); + return ret; +} + int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, size_t buf_len ) { @@ -1327,6 +1382,22 @@ int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, ofdmlvl = strtol(endptr, NULL, 10); } return wpa_driver_cmd_set_ani_level(priv, mode, ofdmlvl); + } else if (os_strncasecmp(cmd, "GET_THERMAL_INFO", 16) == 0) { + int temperature = -1; + int thermal_state = -1; + int ret, ret2; + + ret = wpa_driver_cmd_get_thermal_info(priv, &temperature, + QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_TYPE_GET_TEMPERATURE); + if (ret) + return -1; + ret2 = wpa_driver_cmd_get_thermal_info(priv, &thermal_state, + QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_TYPE_GET_LEVEL); + if (ret2) + return -1; + + snprintf(buf, buf_len, "%d %d", temperature, thermal_state); + return strlen(buf); } else { /* Use private command */ memset(&ifr, 0, sizeof(ifr)); memset(&priv_cmd, 0, sizeof(priv_cmd)); |