summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmar Singhal <asinghal@qca.qualcomm.com>2014-01-21 14:59:41 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-03-26 10:40:21 -0700
commit13349ffdf99c8abdc30bbeb5befa0a9c7046c188 (patch)
treebe54b443a72ef19d6a305c436d724802d340ca02
parent343699d2f0b5c5998fcb239b0589ddfb6c9b72d7 (diff)
wlan: add vendor specific support for DFS
Define DFS offload capability for the driver. For this purpose, use the wiphy flag WIPHY_FLAG_DFS_OFFLOAD and register vendor specific command with the wiphy core. CRs-Fixed: 630797 Change-Id: I01748fec330fcf3f55a51e896f1862f97f7700cf
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg80211.h26
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c61
2 files changed, 78 insertions, 9 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index c4f83641f8c7..174896e552dd 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -106,14 +106,30 @@ typedef struct {
#endif
/* Vendor id to be used in vendor specific command and events
- * to user space
+ * to user space.
+ * NOTE: The authoritative place for definition of QCA_NL80211_VENDOR_ID,
+ * vendor subcmd definitions prefixed with QCA_NL80211_VENDOR_SUBCMD, and
+ * qca_wlan_vendor_attr is open source file src/common/qca-vendor.h in
+ * git://w1.fi/srv/git/hostap.git; the values here are just a copy of that
*/
-#define QCOM_NL80211_VENDOR_ID 0x001374
+#define QCA_NL80211_VENDOR_ID 0x001374
+#define QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY 10
+#define QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY 11
-/* Vendor speicific sub-command id and their index */
+enum qca_wlan_vendor_attr
+{
+ QCA_WLAN_VENDOR_ATTR_INVALID = 0,
+ /* used by QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY */
+ QCA_WLAN_VENDOR_ATTR_DFS = 1,
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_MAX = QCA_WLAN_VENDOR_ATTR_AFTER_LAST - 1,
+};
+
+
+/* Vendor specific sub-command id and their index */
#ifdef FEATURE_WLAN_CH_AVOID
-#define QCOM_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY 10
-#define QCOM_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX 0
+#define QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX 0
#endif /* FEATURE_WLAN_CH_AVOID */
#ifdef FEATURE_WLAN_CH_AVOID
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index fd16917f786e..6b69e642107d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -657,7 +657,7 @@ int wlan_hdd_send_avoid_freq_event(hdd_context_t *pHddCtx,
vendor_event = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
sizeof(tHddAvoidFreqList),
- QCOM_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX,
+ QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX,
GFP_KERNEL);
if (!vendor_event)
{
@@ -681,12 +681,61 @@ static const struct nl80211_vendor_cmd_info wlan_hdd_cfg80211_vendor_events[] =
{
#ifdef FEATURE_WLAN_CH_AVOID
{
- .vendor_id = QCOM_NL80211_VENDOR_ID,
- .subcmd = QCOM_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY
},
#endif /* FEATURE_WLAN_CH_AVOID */
};
+int is_driver_dfs_capable(struct wiphy *wiphy, struct wireless_dev *wdev,
+ void *data, int data_len)
+{
+ u32 dfs_capability;
+ struct sk_buff *temp_skbuff;
+ int ret_val;
+
+ dfs_capability = !!(wiphy->flags & WIPHY_FLAG_DFS_OFFLOAD);
+
+ temp_skbuff = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(u32) +
+ NLMSG_HDRLEN);
+
+ if (temp_skbuff != NULL)
+ {
+
+ ret_val = nla_put_u32(temp_skbuff, QCA_WLAN_VENDOR_ATTR_DFS,
+ dfs_capability);
+ if (ret_val)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: QCA_WLAN_VENDOR_ATTR_DFS put fail", __func__);
+ kfree_skb(temp_skbuff);
+
+ return ret_val;
+ }
+
+ return cfg80211_vendor_cmd_reply(temp_skbuff);
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: dfs capability: buffer alloc fail", __func__);
+ return -1;
+
+}
+
+
+const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] =
+{
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = is_driver_dfs_capable
+ }
+};
+
+
/*
* FUNCTION: wlan_hdd_cfg80211_wiphy_alloc
* This function is called by hdd_wlan_startup()
@@ -956,10 +1005,14 @@ int wlan_hdd_cfg80211_init(struct device *dev,
wiphy->max_remain_on_channel_duration = 1000;
#endif
- wiphy->n_vendor_commands = 0;
+ wiphy->n_vendor_commands = ARRAY_SIZE(hdd_wiphy_vendor_commands);
+ wiphy->vendor_commands = hdd_wiphy_vendor_commands;
+
wiphy->vendor_events = wlan_hdd_cfg80211_vendor_events;
wiphy->n_vendor_events = ARRAY_SIZE(wlan_hdd_cfg80211_vendor_events);
+ wiphy->flags |= WIPHY_FLAG_DFS_OFFLOAD;
+
EXIT();
return 0;
}