1 /*
2  * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wlan_hdd_he.h
22  *
23  * WLAN Host Device Driver file for 802.11ax (High Efficiency) support.
24  *
25  */
26 
27 #if !defined(WLAN_HDD_HE_H)
28 #define WLAN_HDD_HE_H
29 
30 struct hdd_context;
31 struct wma_tgt_cfg;
32 struct hdd_beacon_data;
33 struct sap_config;
34 
35 #ifdef WLAN_FEATURE_11AX
36 /**
37  * enum qca_wlan_vendor_attr_get_he_capabilities - attributes for HE caps
38  *						   vendor command.
39  * @QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_INVALID: invalid
40  * @QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED: to check if HE capabilities is supported
41  * @QCA_WLAN_VENDOR_ATTR_PHY_CAPAB: to get HE PHY capabilities
42  * @QCA_WLAN_VENDOR_ATTR_MAC_CAPAB: to get HE MAC capabilities
43  * @QCA_WLAN_VENDOR_ATTR_HE_MCS: to get HE MCS
44  * @QCA_WLAN_VENDOR_ATTR_NUM_SS: to get NUM SS
45  * @QCA_WLAN_VENDOR_ATTR_RU_IDX_MASK: to get RU index mask
46  * @QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD: to get PPE Threshold,
47  * @QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_AFTER_LAST: next to last valid enum
48  * @QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_MAX: max value supported
49  *
50  * enum values are used for NL attributes for data used by
51  * QCA_NL80211_VENDOR_SUBCMD_GET_HE_CAPABILITIES sub command.
52  */
53 enum qca_wlan_vendor_attr_get_he_capabilities {
54 	QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_INVALID = 0,
55 	QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED,
56 	QCA_WLAN_VENDOR_ATTR_PHY_CAPAB,
57 	QCA_WLAN_VENDOR_ATTR_MAC_CAPAB,
58 	QCA_WLAN_VENDOR_ATTR_HE_MCS,
59 	QCA_WLAN_VENDOR_ATTR_NUM_SS = 5,
60 	QCA_WLAN_VENDOR_ATTR_RU_IDX_MASK,
61 	QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD,
62 
63 	/* keep last */
64 	QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_AFTER_LAST,
65 	QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_MAX =
66 	QCA_WLAN_VENDOR_ATTR_HE_CAPABILITIES_AFTER_LAST - 1,
67 };
68 
69 /* QCA_NL80211_VENDOR_SUBCMD_SR policy*/
70 extern const struct nla_policy
71 wlan_hdd_sr_policy[QCA_WLAN_VENDOR_ATTR_SR_MAX + 1];
72 
73 /**
74  * hdd_update_tgt_he_cap() - Update HE related capabilities
75  * @hdd_ctx: HDD context
76  * @cfg: Target capabilities
77  *
78  * This function updaates WNI CFG with Target capabilities received as part of
79  * Default values present in WNI CFG are the values supported by FW/HW.
80  * INI should be introduced if user control is required to control the value.
81  *
82  * Return: None
83  */
84 void hdd_update_tgt_he_cap(struct hdd_context *hdd_ctx,
85 			   struct wma_tgt_cfg *cfg);
86 
87 /**
88  * wlan_hdd_check_11ax_support() - check if beacon IE and update hw mode
89  * @beacon: beacon IE buffer
90  * @config: pointer to sap config
91  *
92  * Check if HE cap IE is present in beacon IE, if present update hw mode
93  * to 11ax.
94  *
95  * Return: None
96  */
97 void wlan_hdd_check_11ax_support(struct hdd_beacon_data *beacon,
98 				 struct sap_config *config);
99 
100 /**
101  * hdd_update_he_cap_in_cfg() - update HE cap in global CFG
102  * @hdd_ctx: pointer to hdd context
103  *
104  * This API will update the HE config in CFG after taking intersection
105  * of INI and firmware capabilities provided reading CFG
106  *
107  * Return: 0 on success and errno on failure
108  */
109 int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx);
110 
111 /**
112  * wlan_hdd_cfg80211_get_he_cap() - get HE Capabilities
113  * @wiphy: Pointer to wiphy
114  * @wdev: Pointer to wdev
115  * @data: Pointer to data
116  * @data_len: Data length
117  *
118  * Return: 0 if success, non-zero for failure
119  */
120 int wlan_hdd_cfg80211_get_he_cap(struct wiphy *wiphy,
121 				 struct wireless_dev *wdev, const void *data,
122 				 int data_len);
123 #ifdef WLAN_FEATURE_SR
124 /**
125  * wlan_hdd_cfg80211_sr_operations() - Spatial Reuse Operations
126  * @wiphy:   pointer to wireless wiphy structure.
127  * @wdev:    pointer to wireless_dev structure.
128  * @data:    Pointer to the data to be passed via vendor interface
129  * @data_len:Length of the data to be passed
130  *
131  * Return:   Return the Success or Failure code.
132  */
133 int wlan_hdd_cfg80211_sr_operations(struct wiphy *wiphy,
134 				    struct wireless_dev *wdev,
135 				    const void *data, int data_len);
136 
137 /**
138  * hdd_sr_register_callbacks() - register hdd callback for sr
139  * @hdd_ctx: hdd context
140  *
141  * Return: void
142  */
143 void hdd_sr_register_callbacks(struct hdd_context *hdd_ctx);
144 
145 #else
146 static inline
wlan_hdd_cfg80211_sr_operations(struct wiphy * wiphy,struct wireless_dev * wdev,const void * data,int data_len)147 int wlan_hdd_cfg80211_sr_operations(struct wiphy *wiphy,
148 				    struct wireless_dev *wdev,
149 				    const void *data, int data_len)
150 {
151 	return -ENOTSUPP;
152 }
153 
hdd_sr_register_callbacks(struct hdd_context * hdd_ctx)154 static inline void hdd_sr_register_callbacks(struct hdd_context *hdd_ctx)
155 {
156 }
157 #endif
158 
159 #define FEATURE_11AX_VENDOR_COMMANDS                                    \
160 {                                                                       \
161 	.info.vendor_id = QCA_NL80211_VENDOR_ID,                        \
162 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_GET_HE_CAPABILITIES,   \
163 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |                           \
164 		 WIPHY_VENDOR_CMD_NEED_NETDEV,                          \
165 	.doit = wlan_hdd_cfg80211_get_he_cap,                           \
166 	vendor_command_policy(VENDOR_CMD_RAW_DATA, 0)                   \
167 },									\
168 {                                                                       \
169 	.info.vendor_id = QCA_NL80211_VENDOR_ID,                        \
170 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SR,			\
171 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |                           \
172 		 WIPHY_VENDOR_CMD_NEED_NETDEV |                         \
173 		 WIPHY_VENDOR_CMD_NEED_RUNNING,				\
174 	.doit = wlan_hdd_cfg80211_sr_operations,			\
175 	vendor_command_policy(wlan_hdd_sr_policy,			\
176 			      QCA_WLAN_VENDOR_ATTR_SR_MAX)		\
177 },
178 
179 #else
hdd_update_tgt_he_cap(struct hdd_context * hdd_ctx,struct wma_tgt_cfg * cfg)180 static inline void hdd_update_tgt_he_cap(struct hdd_context *hdd_ctx,
181 					 struct wma_tgt_cfg *cfg)
182 {
183 }
184 
wlan_hdd_check_11ax_support(struct hdd_beacon_data * beacon,struct sap_config * config)185 static inline void wlan_hdd_check_11ax_support(struct hdd_beacon_data *beacon,
186 					       struct sap_config *config)
187 {
188 }
189 
hdd_update_he_cap_in_cfg(struct hdd_context * hdd_ctx)190 static inline int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx)
191 {
192 	return 0;
193 }
194 
hdd_sr_register_callbacks(struct hdd_context * hdd_ctx)195 static inline void hdd_sr_register_callbacks(struct hdd_context *hdd_ctx)
196 {
197 }
198 
199 /* dummy definition */
200 #define FEATURE_11AX_VENDOR_COMMANDS
201 
202 #endif
203 #endif /* if !defined(WLAN_HDD_HE_H)*/
204