summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Hsu <ryanhsu@qca.qualcomm.com>2016-03-25 16:09:32 -0700
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-04-21 14:57:52 +0530
commit3defd215144bd90c6748053c8555bbda9e79b88a (patch)
tree5202e4813b04c24d4ab923fa9210214f69304b16
parent70e8c3b45732dbcec51a1c838475045a830fc746 (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.h11
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c83
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;
}
/**