diff options
| author | Amar Singhal <asinghal@qca.qualcomm.com> | 2014-01-21 14:59:41 -0800 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-03-26 10:40:21 -0700 |
| commit | 13349ffdf99c8abdc30bbeb5befa0a9c7046c188 (patch) | |
| tree | be54b443a72ef19d6a305c436d724802d340ca02 | |
| parent | 343699d2f0b5c5998fcb239b0589ddfb6c9b72d7 (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.h | 26 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 61 |
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; } |
