Prechádzať zdrojové kódy

qcacld-3.0: Add support to get the TDLS wider bandwidth cap

Extend the bitwise mask in
QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_FEATURES_SUPPORTED.
attribute to get the TDLS wider bandwidth capability.

Vendor subcmd: QCA_NL80211_VENDOR_SUBCMD_TDLS_GET_CAPABILITIES
Vendor attr: QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_FEATURES_SUPPORTED
BIT: WIFI_TDLS_WIDER_BW_SUPPORT

Change-Id: Ia9a8859cfd15426b190b92b6606bf257bd6f1fe8
CRs-Fixed: 3556159
Deeksha Gupta 1 rok pred
rodič
commit
ea029e0c45

+ 22 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -1046,6 +1046,9 @@ static int __wlan_hdd_cfg80211_get_tdls_capabilities(struct wiphy *wiphy,
 						     int data_len)
 {
 	int status;
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	struct wlan_objmgr_vdev *vdev;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
 	struct sk_buff *skb;
 	uint32_t set = 0;
@@ -1055,6 +1058,7 @@ static int __wlan_hdd_cfg80211_get_tdls_capabilities(struct wiphy *wiphy,
 	bool tdls_sleep_sta_enable;
 	bool tdls_buffer_sta;
 	bool tdls_off_channel;
+	bool tdls_fw_wideband_cap;
 
 	hdd_enter_dev(wdev->netdev);
 
@@ -1063,6 +1067,9 @@ static int __wlan_hdd_cfg80211_get_tdls_capabilities(struct wiphy *wiphy,
 		return -EPERM;
 	}
 
+	if (hdd_validate_adapter(adapter))
+		return -EINVAL;
+
 	status = wlan_hdd_validate_context(hdd_ctx);
 	if (status)
 		return status;
@@ -1092,14 +1099,28 @@ static int __wlan_hdd_cfg80211_get_tdls_capabilities(struct wiphy *wiphy,
 					       &tdls_buffer_sta);
 		cfg_tdls_get_off_channel_enable(hdd_ctx->psoc,
 						&tdls_off_channel);
+		vdev = hdd_objmgr_get_vdev_by_user(adapter->deflink,
+						   WLAN_OSIF_ID);
+		if (!vdev) {
+			hdd_err("Vdev is null return");
+			goto fail;
+		}
+
+		tdls_fw_wideband_cap =
+				wlan_cfg80211_tdls_is_fw_wideband_capable(vdev);
+		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+
 		set = set | WIFI_TDLS_SUPPORT;
 		set = set | (tdls_external_control ?
 					WIFI_TDLS_EXTERNAL_CONTROL_SUPPORT : 0);
 		set = set | (tdls_off_channel ?
 					WIFI_TDLS_OFFCHANNEL_SUPPORT : 0);
+		set = set | (tdls_fw_wideband_cap ?
+					WIFI_TDLS_WIDER_BW_SUPPORT : 0);
 		max_num_tdls_sta = cfg_tdls_get_max_peer_count(hdd_ctx->psoc);
 
-		hdd_debug("TDLS Feature supported value %x", set);
+		hdd_debug("TDLS Feature supported value %x tdls_max_peer_count:%d",
+			  set, max_num_tdls_sta);
 		if (nla_put_u32(skb, PARAM_MAX_TDLS_SESSION,
 				max_num_tdls_sta) ||
 		    nla_put_u32(skb, PARAM_TDLS_FEATURE_SUPPORT, set)) {

+ 1 - 0
core/hdd/src/wlan_hdd_cfg80211.h

@@ -286,6 +286,7 @@ typedef enum {
 #define WIFI_TDLS_SUPPORT			BIT(0)
 #define WIFI_TDLS_EXTERNAL_CONTROL_SUPPORT	BIT(1)
 #define WIFI_TDLS_OFFCHANNEL_SUPPORT		BIT(2)
+#define WIFI_TDLS_WIDER_BW_SUPPORT		BIT(3)
 
 #define CFG_NON_AGG_RETRY_MAX                  (64)
 #define CFG_AGG_RETRY_MAX                      (64)