blob: bab50919a3e45a148086fce7d0f8733161ec0b66 [file] [log] [blame]
Krishna Kumaar Natarajaned1efd92016-09-24 18:05:47 -07001/*
2 * Copyright (c) 2017 The Linux Foundation. All rights reserved.
3 *
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"
28
29/**
30 * hdd_he_wni_cfg_to_string() - return string conversion of HE WNI CFG
31 * @cfg_id: Config ID.
32 *
33 * This utility function helps log string conversion of WNI config ID.
34 *
35 * Return: string conversion of the HE WNI config ID, if match found;
36 * "Invalid" otherwise.
37 */
38static const char *hdd_he_wni_cfg_to_string(uint16_t cfg_id)
39{
40 switch (cfg_id) {
41 default:
42 return "Invalid";
43 CASE_RETURN_STRING(WNI_CFG_HE_CONTROL);
44 CASE_RETURN_STRING(WNI_CFG_HE_TWT_REQUESTOR);
45 CASE_RETURN_STRING(WNI_CFG_HE_TWT_RESPONDER);
46 CASE_RETURN_STRING(WNI_CFG_HE_FRAGMENTATION);
47 CASE_RETURN_STRING(WNI_CFG_HE_MAX_FRAG_MSDU);
48 CASE_RETURN_STRING(WNI_CFG_HE_MIN_FRAG_SIZE);
49 CASE_RETURN_STRING(WNI_CFG_HE_TRIG_PAD);
50 CASE_RETURN_STRING(WNI_CFG_HE_MTID_AGGR);
51 CASE_RETURN_STRING(WNI_CFG_HE_LINK_ADAPTATION);
52 CASE_RETURN_STRING(WNI_CFG_HE_ALL_ACK);
53 CASE_RETURN_STRING(WNI_CFG_HE_UL_MU_RSP_SCHEDULING);
54 CASE_RETURN_STRING(WNI_CFG_HE_BUFFER_STATUS_RPT);
55 CASE_RETURN_STRING(WNI_CFG_HE_BCAST_TWT);
56 CASE_RETURN_STRING(WNI_CFG_HE_BA_32BIT);
57 CASE_RETURN_STRING(WNI_CFG_HE_MU_CASCADING);
58 CASE_RETURN_STRING(WNI_CFG_HE_MULTI_TID);
59 CASE_RETURN_STRING(WNI_CFG_HE_DL_MU_BA);
60 CASE_RETURN_STRING(WNI_CFG_HE_OMI);
61 CASE_RETURN_STRING(WNI_CFG_HE_OFDMA_RA);
62 CASE_RETURN_STRING(WNI_CFG_HE_MAX_AMPDU_LEN);
63 CASE_RETURN_STRING(WNI_CFG_HE_AMSDU_FRAG);
64 CASE_RETURN_STRING(WNI_CFG_HE_FLEX_TWT_SCHED);
65 CASE_RETURN_STRING(WNI_CFG_HE_RX_CTRL);
66 CASE_RETURN_STRING(WNI_CFG_HE_BSRP_AMPDU_AGGR);
67 CASE_RETURN_STRING(WNI_CFG_HE_QTP);
68 CASE_RETURN_STRING(WNI_CFG_HE_A_BQR);
69 CASE_RETURN_STRING(WNI_CFG_HE_DUAL_BAND);
70 CASE_RETURN_STRING(WNI_CFG_HE_CHAN_WIDTH);
71 CASE_RETURN_STRING(WNI_CFG_HE_RX_PREAM_PUNC);
72 CASE_RETURN_STRING(WNI_CFG_HE_CLASS_OF_DEVICE);
73 CASE_RETURN_STRING(WNI_CFG_HE_LDPC);
74 CASE_RETURN_STRING(WNI_CFG_HE_LTF_PPDU);
75 CASE_RETURN_STRING(WNI_CFG_HE_LTF_NDP);
76 CASE_RETURN_STRING(WNI_CFG_HE_STBC);
77 CASE_RETURN_STRING(WNI_CFG_HE_DOPPLER);
78 CASE_RETURN_STRING(WNI_CFG_HE_UL_MUMIMO);
79 CASE_RETURN_STRING(WNI_CFG_HE_DCM_TX);
80 CASE_RETURN_STRING(WNI_CFG_HE_DCM_RX);
81 CASE_RETURN_STRING(WNI_CFG_HE_MU_PPDU);
82 CASE_RETURN_STRING(WNI_CFG_HE_SU_BEAMFORMER);
83 CASE_RETURN_STRING(WNI_CFG_HE_SU_BEAMFORMEE);
84 CASE_RETURN_STRING(WNI_CFG_HE_MU_BEAMFORMER);
85 CASE_RETURN_STRING(WNI_CFG_HE_BFEE_STS_LT80);
86 CASE_RETURN_STRING(WNI_CFG_HE_NSTS_TOT_LT80);
87 CASE_RETURN_STRING(WNI_CFG_HE_BFEE_STS_GT80);
88 CASE_RETURN_STRING(WNI_CFG_HE_NSTS_TOT_GT80);
89 CASE_RETURN_STRING(WNI_CFG_HE_NUM_SOUND_LT80);
90 CASE_RETURN_STRING(WNI_CFG_HE_NUM_SOUND_GT80);
91 CASE_RETURN_STRING(WNI_CFG_HE_SU_FEED_TONE16);
92 CASE_RETURN_STRING(WNI_CFG_HE_MU_FEED_TONE16);
93 CASE_RETURN_STRING(WNI_CFG_HE_CODEBOOK_SU);
94 CASE_RETURN_STRING(WNI_CFG_HE_CODEBOOK_MU);
95 CASE_RETURN_STRING(WNI_CFG_HE_BFRM_FEED);
96 CASE_RETURN_STRING(WNI_CFG_HE_ER_SU_PPDU);
97 CASE_RETURN_STRING(WNI_CFG_HE_DL_PART_BW);
98 CASE_RETURN_STRING(WNI_CFG_HE_PPET_PRESENT);
99 CASE_RETURN_STRING(WNI_CFG_HE_SRP);
100 CASE_RETURN_STRING(WNI_CFG_HE_POWER_BOOST);
101 CASE_RETURN_STRING(WNI_CFG_HE_4x_LTF_GI);
102 CASE_RETURN_STRING(WNI_CFG_HE_NSS);
103 CASE_RETURN_STRING(WNI_CFG_HE_MCS);
104 CASE_RETURN_STRING(WNI_CFG_HE_PPET);
105 }
106}
107
108/**
109 * hdd_he_set_wni_cfg() - Update WNI CFG
110 * @hdd_ctx: HDD context
111 * @cfg_id: CFG to be udpated
112 * @new_value: Value to be updated
113 *
114 * Update WNI CFG with the value passed.
115 *
116 * Return: None
117 */
118static void hdd_he_set_wni_cfg(struct hdd_context_s *hdd_ctx,
119 uint16_t cfg_id, uint32_t new_value)
120{
121 QDF_STATUS status;
122
123 status = sme_cfg_set_int(hdd_ctx->hHal, cfg_id, new_value);
124 if (QDF_IS_STATUS_ERROR(status))
125 hdd_err("could not set %s", hdd_he_wni_cfg_to_string(cfg_id));
126}
127
128/**
129 * hdd_update_tgt_he_cap() - Update HE related capabilities
130 * @hdd_ctx: HDD context
131 * @he_cap: Target HE capabilities
132 *
133 * This function updaates WNI CFG with Target capabilities received as part of
134 * Default values present in WNI CFG are the values supported by FW/HW.
135 * INI should be introduced if user control is required to control the value.
136 *
137 * Return: None
138 */
139void hdd_update_tgt_he_cap(struct hdd_context_s *hdd_ctx,
140 struct wma_tgt_cfg *cfg)
141{
142 uint32_t ppet_size = sizeof(tDot11fIEppe_threshold);
143 QDF_STATUS status;
144 tDot11fIEvendor_he_cap *he_cap = &cfg->he_cap;
145
146 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CONTROL, he_cap->htc_he);
147 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TWT_REQUESTOR,
148 he_cap->twt_request);
149 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TWT_RESPONDER,
150 he_cap->twt_responder);
151 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_FRAGMENTATION,
152 he_cap->fragmentation);
153 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MAX_FRAG_MSDU,
154 he_cap->max_num_frag_msdu);
155 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MIN_FRAG_SIZE,
156 he_cap->min_frag_size);
157 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TRIG_PAD,
158 he_cap->trigger_frm_mac_pad);
159 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MTID_AGGR,
160 he_cap->multi_tid_aggr);
161 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LINK_ADAPTATION,
162 he_cap->he_link_adaptation);
163 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ALL_ACK, he_cap->all_ack);
164 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MU_RSP_SCHEDULING,
165 he_cap->ul_mu_rsp_sched);
166 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BUFFER_STATUS_RPT,
167 he_cap->a_bsr);
168 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BCAST_TWT,
169 he_cap->broadcast_twt);
170 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BA_32BIT,
171 he_cap->ba_32bit_bitmap);
172 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_CASCADING,
173 he_cap->mu_cascade);
174 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MULTI_TID,
175 he_cap->ack_enabled_multitid);
176 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DL_MU_BA, he_cap->dl_mu_ba);
177 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_OMI, he_cap->omi_a_ctrl);
178 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_OFDMA_RA, he_cap->ofdma_ra);
179 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MAX_AMPDU_LEN,
180 he_cap->max_ampdu_len);
181 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_AMSDU_FRAG, he_cap->amsdu_frag);
182 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_FLEX_TWT_SCHED,
183 he_cap->flex_twt_sched);
184 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_CTRL, he_cap->rx_ctrl_frame);
185 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BSRP_AMPDU_AGGR,
186 he_cap->bsrp_ampdu_aggr);
187 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_QTP, he_cap->qtp);
188 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_A_BQR, he_cap->a_bqr);
189 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DUAL_BAND, he_cap->dual_band);
190 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CHAN_WIDTH, he_cap->chan_width);
191 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_RX_PREAM_PUNC,
192 he_cap->rx_pream_puncturing);
193 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CLASS_OF_DEVICE,
194 he_cap->device_class);
195 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LDPC, he_cap->ldpc_coding);
196 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LTF_PPDU,
197 he_cap->he_ltf_gi_ppdu);
198 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LTF_NDP, he_cap->he_ltf_gi_ndp);
199 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_STBC, he_cap->stbc);
200 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DOPPLER, he_cap->doppler);
201 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MUMIMO, he_cap->ul_mu);
202 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DCM_TX, he_cap->dcm_enc_tx);
203 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DCM_RX, he_cap->dcm_enc_rx);
204 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_PPDU, he_cap->ul_he_mu);
205 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_BEAMFORMER,
206 he_cap->su_beamformer);
207 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_BEAMFORMEE,
208 he_cap->su_beamformee);
209 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_BEAMFORMER,
210 he_cap->mu_beamformer);
211 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFEE_STS_LT80,
212 he_cap->bfee_sts_lt_80);
213 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NSTS_TOT_LT80,
214 he_cap->nsts_tol_lt_80);
215 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFEE_STS_GT80,
216 he_cap->bfee_sta_gt_80);
217 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NSTS_TOT_GT80,
218 he_cap->nsts_tot_gt_80);
219 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NUM_SOUND_LT80,
220 he_cap->num_sounding_lt_80);
221 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NUM_SOUND_GT80,
222 he_cap->num_sounding_gt_80);
223 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SU_FEED_TONE16,
224 he_cap->su_feedback_tone16);
225 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MU_FEED_TONE16,
226 he_cap->mu_feedback_tone16);
227 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CODEBOOK_SU,
228 he_cap->codebook_su);
229 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CODEBOOK_MU,
230 he_cap->codebook_mu);
231 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFRM_FEED,
232 he_cap->beamforming_feedback);
233 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ER_SU_PPDU,
234 he_cap->he_er_su_ppdu);
235 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DL_PART_BW,
236 he_cap->dl_mu_mimo_part_bw);
237 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_PPET_PRESENT,
238 he_cap->ppet_present);
239 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_SRP, he_cap->srp);
240 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_POWER_BOOST,
241 he_cap->power_boost);
242 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_4x_LTF_GI, he_cap->he_ltf_gi_4x);
243 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_NSS, he_cap->nss_supported);
244 hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MCS, he_cap->mcs_supported);
245
246 /* PPET can not be configured by user - Set values from FW */
247 status = sme_cfg_set_str(hdd_ctx->hHal, WNI_CFG_HE_PPET,
248 (void *)&he_cap->ppe_threshold, ppet_size);
249 if (status == QDF_STATUS_E_FAILURE)
250 hdd_alert("could not set HE PPET");
251}