Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame^] | 1 | /* |
| 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 | */ |
| 38 | static 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 | */ |
| 118 | static 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 | */ |
| 139 | void 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 | } |