blob: 4c02b04918f8e45b363a3d6b976fb3914bf61f3a [file] [log] [blame]
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -07001/*
Naveen Rawat01213762018-01-04 17:25:31 -08002 * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -07003 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/**
20 * DOC : wlan_hdd_he.c
21 *
22 * WLAN Host Device Driver file for 802.11ax (High Efficiency) support.
23 *
24 */
25
26#include "wlan_hdd_main.h"
27#include "wlan_hdd_he.h"
Krishna Kumaar Natarajanf5676502017-03-06 10:28:44 -080028#include "wma_he.h"
Naveen Rawat08db88f2017-09-08 15:07:48 -070029#include "wlan_utility.h"
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070030
31/**
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070032 * hdd_he_set_wni_cfg() - Update WNI CFG
33 * @hdd_ctx: HDD context
34 * @cfg_id: CFG to be udpated
35 * @new_value: Value to be updated
36 *
37 * Update WNI CFG with the value passed.
38 *
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -080039 * Return: 0 on success and errno on failure
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070040 */
Jeff Johnson82797b62017-08-11 15:31:27 -070041static int hdd_he_set_wni_cfg(struct hdd_context *hdd_ctx,
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -080042 uint16_t cfg_id, uint32_t new_value)
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070043{
44 QDF_STATUS status;
45
46 status = sme_cfg_set_int(hdd_ctx->hHal, cfg_id, new_value);
47 if (QDF_IS_STATUS_ERROR(status))
Naveen Rawata9a49cf2017-09-08 16:11:27 -070048 hdd_err("could not set %s", cfg_get_string(cfg_id));
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -080049
50 return qdf_status_to_os_return(status);
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070051}
52
Jeff Johnson82797b62017-08-11 15:31:27 -070053void hdd_update_tgt_he_cap(struct hdd_context *hdd_ctx,
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070054 struct wma_tgt_cfg *cfg)
55{
Naveen Rawataeca1b92017-10-16 16:55:31 -070056 uint8_t chan_width;
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070057 QDF_STATUS status;
Naveen Rawatd8feac12017-09-08 15:08:39 -070058 tDot11fIEhe_cap *he_cap = &cfg->he_cap;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080059 struct hdd_config *config = hdd_ctx->config;
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070060
61 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CONTROL, he_cap->htc_he);
62 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TWT_REQUESTOR,
63 he_cap->twt_request);
64 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TWT_RESPONDER,
65 he_cap->twt_responder);
66 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_FRAGMENTATION,
Kiran Kumar Lokere4aa08a52017-12-15 19:00:39 -080067 QDF_MIN(he_cap->fragmentation,
68 hdd_ctx->config->he_dynamic_frag_support));
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -070069 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MAX_FRAG_MSDU,
70 he_cap->max_num_frag_msdu);
71 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MIN_FRAG_SIZE,
72 he_cap->min_frag_size);
73 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TRIG_PAD,
74 he_cap->trigger_frm_mac_pad);
75 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MTID_AGGR,
76 he_cap->multi_tid_aggr);
77 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LINK_ADAPTATION,
78 he_cap->he_link_adaptation);
79 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ALL_ACK, he_cap->all_ack);
80 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MU_RSP_SCHEDULING,
81 he_cap->ul_mu_rsp_sched);
82 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BUFFER_STATUS_RPT,
83 he_cap->a_bsr);
84 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BCAST_TWT,
85 he_cap->broadcast_twt);
86 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BA_32BIT,
87 he_cap->ba_32bit_bitmap);
88 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_CASCADING,
89 he_cap->mu_cascade);
90 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MULTI_TID,
91 he_cap->ack_enabled_multitid);
92 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DL_MU_BA, he_cap->dl_mu_ba);
93 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_OMI, he_cap->omi_a_ctrl);
94 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_OFDMA_RA, he_cap->ofdma_ra);
95 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MAX_AMPDU_LEN,
96 he_cap->max_ampdu_len);
97 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_AMSDU_FRAG, he_cap->amsdu_frag);
98 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_FLEX_TWT_SCHED,
99 he_cap->flex_twt_sched);
100 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_CTRL, he_cap->rx_ctrl_frame);
101 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BSRP_AMPDU_AGGR,
102 he_cap->bsrp_ampdu_aggr);
103 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_QTP, he_cap->qtp);
104 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_A_BQR, he_cap->a_bqr);
Naveen Rawat4051b022017-09-08 16:17:54 -0700105 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SR_RESPONDER,
106 he_cap->sr_responder);
107 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NDP_FEEDBACK_SUPP,
108 he_cap->ndp_feedback_supp);
109 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_OPS_SUPP,
110 he_cap->ops_supp);
Naveen Rawatfc530312017-10-23 14:34:12 -0700111 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_AMSDU_IN_AMPDU,
112 he_cap->amsdu_in_ampdu);
Naveen Rawat4051b022017-09-08 16:17:54 -0700113
Naveen Rawata015a2f2017-12-18 16:11:32 -0800114 he_cap->dual_band = ((cfg->band_cap == BAND_ALL) &&
115 (hdd_ctx->config->nBandCapability == BAND_ALL));
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700116 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DUAL_BAND, he_cap->dual_band);
Naveen Rawataeca1b92017-10-16 16:55:31 -0700117 chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0,
118 he_cap->chan_width_1, he_cap->chan_width_2,
119 he_cap->chan_width_3, he_cap->chan_width_4,
120 he_cap->chan_width_5, he_cap->chan_width_6);
121
122 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CHAN_WIDTH, chan_width);
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700123 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_PREAM_PUNC,
124 he_cap->rx_pream_puncturing);
125 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CLASS_OF_DEVICE,
126 he_cap->device_class);
127 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LDPC, he_cap->ldpc_coding);
128 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LTF_PPDU,
Naveen Rawat4051b022017-09-08 16:17:54 -0700129 he_cap->he_1x_ltf_800_gi_ppdu);
Naveen Rawatfc530312017-10-23 14:34:12 -0700130 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MIDAMBLE_RX_MAX_NSTS,
131 he_cap->midamble_rx_max_nsts);
Naveen Rawat4051b022017-09-08 16:17:54 -0700132 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LTF_NDP,
133 he_cap->he_4x_ltf_3200_gi_ndp);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -0800134 if (config->enableRxSTBC) {
135 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_STBC_LT80,
136 he_cap->rx_stbc_lt_80mhz);
137 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_STBC_GT80,
138 he_cap->rx_stbc_gt_80mhz);
139 } else {
140 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_STBC_LT80, 0);
141 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_STBC_GT80, 0);
142 }
143 if (config->enableTxSTBC) {
144 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_STBC_LT80,
145 he_cap->tx_stbc_lt_80mhz);
146 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_STBC_GT80,
147 he_cap->tx_stbc_gt_80mhz);
148 } else {
149 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_STBC_LT80, 0);
150 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_STBC_GT80, 0);
151 }
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700152 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DOPPLER, he_cap->doppler);
153 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MUMIMO, he_cap->ul_mu);
154 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DCM_TX, he_cap->dcm_enc_tx);
155 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DCM_RX, he_cap->dcm_enc_rx);
156 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_PPDU, he_cap->ul_he_mu);
157 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_BEAMFORMER,
158 he_cap->su_beamformer);
159 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_BEAMFORMEE,
160 he_cap->su_beamformee);
161 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_BEAMFORMER,
162 he_cap->mu_beamformer);
163 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFEE_STS_LT80,
164 he_cap->bfee_sts_lt_80);
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700165 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFEE_STS_GT80,
Naveen Rawat4051b022017-09-08 16:17:54 -0700166 he_cap->bfee_sts_gt_80);
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700167 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NUM_SOUND_LT80,
168 he_cap->num_sounding_lt_80);
169 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NUM_SOUND_GT80,
170 he_cap->num_sounding_gt_80);
171 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_FEED_TONE16,
172 he_cap->su_feedback_tone16);
173 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_FEED_TONE16,
174 he_cap->mu_feedback_tone16);
175 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CODEBOOK_SU,
176 he_cap->codebook_su);
177 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CODEBOOK_MU,
178 he_cap->codebook_mu);
179 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFRM_FEED,
180 he_cap->beamforming_feedback);
181 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ER_SU_PPDU,
182 he_cap->he_er_su_ppdu);
183 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DL_PART_BW,
184 he_cap->dl_mu_mimo_part_bw);
185 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_PPET_PRESENT,
186 he_cap->ppet_present);
187 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SRP, he_cap->srp);
188 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_POWER_BOOST,
189 he_cap->power_boost);
Naveen Rawat4051b022017-09-08 16:17:54 -0700190 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_4x_LTF_GI,
191 he_cap->he_ltf_800_gi_4x);
192 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MAX_NC, he_cap->max_nc);
Naveen Rawat4051b022017-09-08 16:17:54 -0700193 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ER_4x_LTF_GI,
194 he_cap->er_he_ltf_800_gi_4x);
Naveen Rawatfc530312017-10-23 14:34:12 -0700195 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_PPDU_20_IN_40MHZ_2G,
196 he_cap->he_ppdu_20_in_40Mhz_2G);
197 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_PPDU_20_IN_160_80P80MHZ,
198 he_cap->he_ppdu_20_in_160_80p80Mhz);
199 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_PPDU_80_IN_160_80P80MHZ,
200 he_cap->he_ppdu_80_in_160_80p80Mhz);
201 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ER_1X_HE_LTF_GI,
202 he_cap->er_1x_he_ltf_gi);
203 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MIDAMBLE_RX_1X_HE_LTF,
204 he_cap->midamble_rx_1x_he_ltf);
Naveen Rawataeca1b92017-10-16 16:55:31 -0700205 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_MCS_MAP_LT_80,
206 he_cap->rx_he_mcs_map_lt_80);
207 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_MCS_MAP_LT_80,
208 he_cap->tx_he_mcs_map_lt_80);
209 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_MCS_MAP_160,
210 *((uint16_t *)he_cap->rx_he_mcs_map_160));
211 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_MCS_MAP_160,
212 *((uint16_t *)he_cap->tx_he_mcs_map_160));
213 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_MCS_MAP_80_80,
214 *((uint16_t *)he_cap->rx_he_mcs_map_80_80));
215 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TX_MCS_MAP_80_80,
216 *((uint16_t *)he_cap->tx_he_mcs_map_80_80));
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700217
Naveen Rawat01213762018-01-04 17:25:31 -0800218 /* PPET can not be configured by user - Set per band values from FW */
219 status = sme_cfg_set_str(hdd_ctx->hHal, WNI_CFG_HE_PPET_2G,
Naveen Rawat819158d2018-01-16 10:56:45 -0800220 cfg->ppet_2g, HE_MAX_PPET_SIZE);
Naveen Rawat01213762018-01-04 17:25:31 -0800221 if (status == QDF_STATUS_E_FAILURE)
Naveen Rawat819158d2018-01-16 10:56:45 -0800222 hdd_alert("could not set 2G HE PPET");
Naveen Rawat01213762018-01-04 17:25:31 -0800223
224 status = sme_cfg_set_str(hdd_ctx->hHal, WNI_CFG_HE_PPET_5G,
Naveen Rawat819158d2018-01-16 10:56:45 -0800225 cfg->ppet_5g, HE_MAX_PPET_SIZE);
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700226 if (status == QDF_STATUS_E_FAILURE)
Naveen Rawat819158d2018-01-16 10:56:45 -0800227 hdd_alert("could not set 5G HE PPET");
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -0700228}
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800229
Jeff Johnson44e52172017-09-30 16:39:16 -0700230void wlan_hdd_check_11ax_support(struct hdd_beacon_data *beacon,
231 tsap_Config_t *config)
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800232{
Naveen Rawat08db88f2017-09-08 15:07:48 -0700233 const uint8_t *ie;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800234
Naveen Rawatd8feac12017-09-08 15:08:39 -0700235 ie = wlan_get_ext_ie_ptr_from_ext_id(HE_CAP_OUI_TYPE, HE_CAP_OUI_SIZE,
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800236 beacon->tail, beacon->tail_len);
237 if (ie)
238 config->SapHw_mode = eCSR_DOT11_MODE_11ax;
239}
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800240
Jeff Johnson56acf432017-08-28 12:00:20 -0700241void hdd_he_print_ini_config(struct hdd_context *hdd_ctx)
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800242{
243 hdd_info("Name = [%s] Value = [%d]", CFG_ENABLE_UL_MIMO_NAME,
244 hdd_ctx->config->enable_ul_mimo);
245 hdd_info("Name = [%s] Value = [%d]", CFG_ENABLE_UL_OFDMA_NAME,
246 hdd_ctx->config->enable_ul_ofdma);
Manikandan Mohan39accff2017-05-02 16:09:00 -0700247 hdd_info("Name = [%s] Value = [%d]", CFG_HE_STA_OBSSPD_NAME,
248 hdd_ctx->config->he_sta_obsspd);
Kiran Kumar Lokere4aa08a52017-12-15 19:00:39 -0800249 hdd_info("Name = [%s] Value = [%d]", CFG_HE_DYNAMIC_FRAGMENTATION_NAME,
250 hdd_ctx->config->he_dynamic_frag_support);
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800251}
252
Jeff Johnson56acf432017-08-28 12:00:20 -0700253int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx)
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800254{
255 uint32_t val, val1 = 0;
256 QDF_STATUS status;
257 int ret;
258 struct hdd_config *config = hdd_ctx->config;
259
Manikandan Mohan39accff2017-05-02 16:09:00 -0700260 ret = hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_STA_OBSSPD,
261 config->he_sta_obsspd);
262 if (ret)
263 return ret;
264
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800265 status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_HE_UL_MUMIMO, &val);
266 if (QDF_IS_STATUS_ERROR(status)) {
267 hdd_err("could not get WNI_CFG_HE_UL_MUMIMO");
268 return qdf_status_to_os_return(status);
269 }
270
271 /* In val,
272 * Bit 1 - corresponds to UL MIMO
273 * Bit 2 - corresponds to UL OFDMA
274 */
275 if (val & 0x1)
276 val1 = config->enable_ul_mimo & 0x1;
277
278 if ((val >> 1) & 0x1)
279 val1 |= ((config->enable_ul_ofdma & 0x1) << 1);
280
281 ret = hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MUMIMO, val1);
282
283 return ret;
284}
285
Krishna Kumaar Natarajan90bb6f12017-03-03 21:05:52 -0800286void hdd_he_set_sme_config(tSmeConfigParams *sme_config,
287 struct hdd_config *config)
288{
289 sme_config->csrConfig.enable_ul_ofdma = config->enable_ul_ofdma;
290 sme_config->csrConfig.enable_ul_mimo = config->enable_ul_mimo;
291}
Krishna Kumaar Natarajanf5676502017-03-06 10:28:44 -0800292
293/*
294 * __wlan_hdd_cfg80211_get_he_cap() - get HE Capabilities
295 * @wiphy: Pointer to wiphy
296 * @wdev: Pointer to wdev
297 * @data: Pointer to data
298 * @data_len: Data length
299 *
300 * Return: 0 if success, non-zero for failure
301 */
302static int
303__wlan_hdd_cfg80211_get_he_cap(struct wiphy *wiphy,
304 struct wireless_dev *wdev,
305 const void *data,
306 int data_len)
307{
Jeff Johnson56acf432017-08-28 12:00:20 -0700308 struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
Krishna Kumaar Natarajanf5676502017-03-06 10:28:44 -0800309 int ret;
310 QDF_STATUS status;
311 struct sk_buff *reply_skb;
312 uint32_t nl_buf_len;
313 struct he_capability he_cap;
314 uint8_t he_supported = 0;
315
316 ENTER();
317 if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
318 hdd_err("Command not allowed in FTM mode");
319 return -EPERM;
320 }
321
322 ret = wlan_hdd_validate_context(hdd_ctx);
323 if (0 != ret)
324 return ret;
325
326 nl_buf_len = NLMSG_HDRLEN;
327 if (sme_is_feature_supported_by_fw(DOT11AX)) {
328 he_supported = 1;
329
330 status = wma_get_he_capabilities(&he_cap);
331 if (QDF_STATUS_SUCCESS != status)
332 return -EINVAL;
333 } else {
334 hdd_info("11AX: HE not supported, send only QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED");
335 }
336
337 if (he_supported) {
338 nl_buf_len += NLA_HDRLEN + sizeof(he_supported) +
339 NLA_HDRLEN + sizeof(he_cap.phy_cap) +
340 NLA_HDRLEN + sizeof(he_cap.mac_cap) +
341 NLA_HDRLEN + sizeof(he_cap.mcs) +
342 NLA_HDRLEN + sizeof(he_cap.ppet.numss_m1) +
343 NLA_HDRLEN + sizeof(he_cap.ppet.ru_bit_mask) +
344 NLA_HDRLEN +
345 sizeof(he_cap.ppet.ppet16_ppet8_ru3_ru0);
346 } else {
347 nl_buf_len += NLA_HDRLEN + sizeof(he_supported);
348 }
349
350 hdd_info("11AX: he_supported: %d", he_supported);
351
352 reply_skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, nl_buf_len);
353
354 if (!reply_skb) {
355 hdd_err("Allocate reply_skb failed");
356 return -EINVAL;
357 }
358
359 if (nla_put_u8(reply_skb,
360 QCA_WLAN_VENDOR_ATTR_HE_SUPPORTED, he_supported))
361 goto nla_put_failure;
362
363 /* No need to populate other attributes if HE is not supported */
364 if (0 == he_supported)
365 goto end;
366
367 if (nla_put_u32(reply_skb,
368 QCA_WLAN_VENDOR_ATTR_MAC_CAPAB, he_cap.mac_cap) ||
369 nla_put_u32(reply_skb,
370 QCA_WLAN_VENDOR_ATTR_HE_MCS, he_cap.mcs) ||
371 nla_put_u32(reply_skb,
372 QCA_WLAN_VENDOR_ATTR_NUM_SS, he_cap.ppet.numss_m1) ||
373 nla_put_u32(reply_skb,
374 QCA_WLAN_VENDOR_ATTR_RU_IDX_MASK,
375 he_cap.ppet.ru_bit_mask) ||
376 nla_put(reply_skb,
377 QCA_WLAN_VENDOR_ATTR_PHY_CAPAB,
378 sizeof(u32) * HE_MAX_PHY_CAP_SIZE, he_cap.phy_cap) ||
379 nla_put(reply_skb, QCA_WLAN_VENDOR_ATTR_PPE_THRESHOLD,
380 sizeof(u32) * PSOC_HOST_MAX_NUM_SS,
381 he_cap.ppet.ppet16_ppet8_ru3_ru0))
382 goto nla_put_failure;
383end:
384 ret = cfg80211_vendor_cmd_reply(reply_skb);
385 EXIT();
386 return ret;
387
388nla_put_failure:
389 hdd_err("nla put fail");
390 kfree_skb(reply_skb);
391 return -EINVAL;
392}
393
394int wlan_hdd_cfg80211_get_he_cap(struct wiphy *wiphy,
395 struct wireless_dev *wdev,
396 const void *data,
397 int data_len)
398{
399 int ret;
400
401 cds_ssr_protect(__func__);
402 ret = __wlan_hdd_cfg80211_get_he_cap(wiphy, wdev, data, data_len);
403 cds_ssr_unprotect(__func__);
404
405 return ret;
406}