diff options
| author | Ryan Hsu <ryanhsu@qca.qualcomm.com> | 2016-03-25 16:09:32 -0700 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-04-21 14:57:52 +0530 |
| commit | 3defd215144bd90c6748053c8555bbda9e79b88a (patch) | |
| tree | 5202e4813b04c24d4ab923fa9210214f69304b16 | |
| parent | 70e8c3b45732dbcec51a1c838475045a830fc746 (diff) | |
qcacld-2.0: Add radio_index info to get_wifi_info command
Add the radio_index information to get_wifi_info command.
This change allows user space to know which radio it is
talking to.
Also refactor the get_wifi_info command to support to query
multiple attributes in one command.
Change-Id: Ic3a3aabd9111e655ace3869771ae439aaec45dc4
CRs-fixed: 997545
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg80211.h | 11 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 83 |
2 files changed, 70 insertions, 24 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index 879cb9194ede..17a965b84c4b 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -1359,13 +1359,20 @@ enum qca_wlan_vendor_attr_roam_subcmd QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_AFTER_LAST - 1, }; -/* NL attributes for data used by - * QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_INFO sub command. +/** + * enum qca_wlan_vendor_attr_get_wifi_info - value for get_wifi sub commands + * @QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_INVALID - invalid + * @QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION - get driver version + * @QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION - get firmware version + * @QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX - get radio index + * + * enum values are used for QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_INFO sub command. */ enum qca_wlan_vendor_attr_get_wifi_info { QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_INVALID = 0, QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION = 1, QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION = 2, + QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX = 3, /* keep last */ QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_AFTER_LAST, diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index 1623ed4315a7..909f46216fc5 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -6684,6 +6684,7 @@ qca_wlan_vendor_get_wifi_info_policy[ QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_MAX +1] = { [QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION] = {.type = NLA_U8 }, [QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX] = {.type = NLA_U32 }, }; /** @@ -6704,13 +6705,16 @@ __wlan_hdd_cfg80211_get_wifi_info(struct wiphy *wiphy, const void *data, int data_len) { hdd_context_t *hdd_ctx = wiphy_priv(wiphy); + struct nlattr *tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_MAX + 1]; - tSirVersionString version; - uint32_t version_len; + tSirVersionString driver_version; + tSirVersionString firmware_version; uint32_t major_spid = 0, minor_spid = 0, siid = 0, crmid = 0; - uint8_t attr; int status; - struct sk_buff *reply_skb = NULL; + struct sk_buff *reply_skb; + uint32_t skb_len = 0, count = 0; + + ENTER(); if (VOS_FTM_MODE == hdd_get_conparam()) { hddLog(LOGE, FL("Command not allowed in FTM mode")); @@ -6729,35 +6733,70 @@ __wlan_hdd_cfg80211_get_wifi_info(struct wiphy *wiphy, if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION]) { hddLog(LOG1, FL("Rcvd req for Driver version")); - strlcpy(version, QWLAN_VERSIONSTR, sizeof(version)); - attr = QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION; - } else if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION]) { + strlcpy(driver_version, QWLAN_VERSIONSTR, + sizeof(driver_version)); + skb_len += strlen(driver_version) + 1; + count++; + } + + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION]) { hddLog(LOG1, FL("Rcvd req for FW version")); hdd_get_fw_version(hdd_ctx, &major_spid, &minor_spid, &siid, &crmid); - snprintf(version, sizeof(version), "%d:%d:%d:%d", - major_spid, minor_spid, siid, crmid); - attr = QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION; - } else { - hddLog(LOGE, FL("Invalid attribute in get wifi info request")); - return -EINVAL; + snprintf(firmware_version, sizeof(firmware_version), + "%d:%d:%d:%d", major_spid, minor_spid, siid, crmid); + skb_len += strlen(firmware_version) + 1; + count++; } - version_len = strlen(version); - reply_skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, - version_len + NLA_HDRLEN + NLMSG_HDRLEN); - if (!reply_skb) { - hddLog(LOGE, FL("cfg80211_vendor_cmd_alloc_reply_skb failed")); - return -ENOMEM; + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX]) { + hddLog(LOG1, FL("Rcvd req for Radio Index")); + skb_len += sizeof(hdd_ctx->radio_index); + count++; } - if (nla_put(reply_skb, attr, version_len, version)) { - hddLog(LOGE, FL("nla put fail")); - kfree_skb(reply_skb); + if (count == 0) { + hddLog(LOGE, FL("unknown attribute in get_wifi_info request")); return -EINVAL; } + skb_len += (NLA_HDRLEN * count) + NLMSG_HDRLEN; + reply_skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, skb_len); + + if (!reply_skb) + goto error_skb_fail; + + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION]) { + if (nla_put_string(reply_skb, + QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION, + driver_version)) + goto error_nla_fail; + } + + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION]) { + if (nla_put_string(reply_skb, + QCA_WLAN_VENDOR_ATTR_WIFI_INFO_FIRMWARE_VERSION, + firmware_version)) + goto error_nla_fail; + } + + if (tb_vendor[QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX]) { + if (nla_put_u32(reply_skb, + QCA_WLAN_VENDOR_ATTR_WIFI_INFO_RADIO_INDEX, + hdd_ctx->radio_index)) + goto error_nla_fail; + } + return cfg80211_vendor_cmd_reply(reply_skb); + +error_skb_fail: + hddLog(LOGE, FL("cfg80211_vendor_cmd_alloc_reply_skb failed")); + return -ENOMEM; + +error_nla_fail: + hddLog(LOGE, FL("nla put fail")); + kfree_skb(reply_skb); + return -EINVAL; } /** |
