Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 1 | /* |
Naveen Rawat | 0121376 | 2018-01-04 17:25:31 -0800 | [diff] [blame] | 2 | * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 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" |
Krishna Kumaar Natarajan | f567650 | 2017-03-06 10:28:44 -0800 | [diff] [blame] | 28 | #include "wma_he.h" |
Naveen Rawat | 08db88f | 2017-09-08 15:07:48 -0700 | [diff] [blame] | 29 | #include "wlan_utility.h" |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 30 | |
| 31 | /** |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 32 | * 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 Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 39 | * Return: 0 on success and errno on failure |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 40 | */ |
Jeff Johnson | 82797b6 | 2017-08-11 15:31:27 -0700 | [diff] [blame] | 41 | static int hdd_he_set_wni_cfg(struct hdd_context *hdd_ctx, |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 42 | uint16_t cfg_id, uint32_t new_value) |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 43 | { |
| 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 Rawat | a9a49cf | 2017-09-08 16:11:27 -0700 | [diff] [blame] | 48 | hdd_err("could not set %s", cfg_get_string(cfg_id)); |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 49 | |
| 50 | return qdf_status_to_os_return(status); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 51 | } |
| 52 | |
Jeff Johnson | 82797b6 | 2017-08-11 15:31:27 -0700 | [diff] [blame] | 53 | void hdd_update_tgt_he_cap(struct hdd_context *hdd_ctx, |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 54 | struct wma_tgt_cfg *cfg) |
| 55 | { |
Naveen Rawat | aeca1b9 | 2017-10-16 16:55:31 -0700 | [diff] [blame] | 56 | uint8_t chan_width; |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 57 | QDF_STATUS status; |
Naveen Rawat | d8feac1 | 2017-09-08 15:08:39 -0700 | [diff] [blame] | 58 | tDot11fIEhe_cap *he_cap = &cfg->he_cap; |
Kiran Kumar Lokere | 13dedac | 2018-02-05 19:51:59 -0800 | [diff] [blame] | 59 | struct hdd_config *config = hdd_ctx->config; |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 60 | |
| 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 Lokere | 4aa08a5 | 2017-12-15 19:00:39 -0800 | [diff] [blame] | 67 | QDF_MIN(he_cap->fragmentation, |
| 68 | hdd_ctx->config->he_dynamic_frag_support)); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 69 | 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 Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 105 | 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 Rawat | fc53031 | 2017-10-23 14:34:12 -0700 | [diff] [blame] | 111 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_AMSDU_IN_AMPDU, |
| 112 | he_cap->amsdu_in_ampdu); |
Naveen Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 113 | |
Naveen Rawat | a015a2f | 2017-12-18 16:11:32 -0800 | [diff] [blame] | 114 | he_cap->dual_band = ((cfg->band_cap == BAND_ALL) && |
| 115 | (hdd_ctx->config->nBandCapability == BAND_ALL)); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 116 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_DUAL_BAND, he_cap->dual_band); |
Naveen Rawat | aeca1b9 | 2017-10-16 16:55:31 -0700 | [diff] [blame] | 117 | 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 Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 123 | 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 Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 129 | he_cap->he_1x_ltf_800_gi_ppdu); |
Naveen Rawat | fc53031 | 2017-10-23 14:34:12 -0700 | [diff] [blame] | 130 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_MIDAMBLE_RX_MAX_NSTS, |
| 131 | he_cap->midamble_rx_max_nsts); |
Naveen Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 132 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_LTF_NDP, |
| 133 | he_cap->he_4x_ltf_3200_gi_ndp); |
Kiran Kumar Lokere | 13dedac | 2018-02-05 19:51:59 -0800 | [diff] [blame] | 134 | 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 Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 152 | 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 Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 165 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_BFEE_STS_GT80, |
Naveen Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 166 | he_cap->bfee_sts_gt_80); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 167 | 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 Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 190 | 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 Rawat | 4051b02 | 2017-09-08 16:17:54 -0700 | [diff] [blame] | 193 | hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_ER_4x_LTF_GI, |
| 194 | he_cap->er_he_ltf_800_gi_4x); |
Naveen Rawat | fc53031 | 2017-10-23 14:34:12 -0700 | [diff] [blame] | 195 | 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 Rawat | aeca1b9 | 2017-10-16 16:55:31 -0700 | [diff] [blame] | 205 | 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 Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 217 | |
Naveen Rawat | 0121376 | 2018-01-04 17:25:31 -0800 | [diff] [blame] | 218 | /* 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 Rawat | 819158d | 2018-01-16 10:56:45 -0800 | [diff] [blame] | 220 | cfg->ppet_2g, HE_MAX_PPET_SIZE); |
Naveen Rawat | 0121376 | 2018-01-04 17:25:31 -0800 | [diff] [blame] | 221 | if (status == QDF_STATUS_E_FAILURE) |
Naveen Rawat | 819158d | 2018-01-16 10:56:45 -0800 | [diff] [blame] | 222 | hdd_alert("could not set 2G HE PPET"); |
Naveen Rawat | 0121376 | 2018-01-04 17:25:31 -0800 | [diff] [blame] | 223 | |
| 224 | status = sme_cfg_set_str(hdd_ctx->hHal, WNI_CFG_HE_PPET_5G, |
Naveen Rawat | 819158d | 2018-01-16 10:56:45 -0800 | [diff] [blame] | 225 | cfg->ppet_5g, HE_MAX_PPET_SIZE); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 226 | if (status == QDF_STATUS_E_FAILURE) |
Naveen Rawat | 819158d | 2018-01-16 10:56:45 -0800 | [diff] [blame] | 227 | hdd_alert("could not set 5G HE PPET"); |
Krishna Kumaar Natarajan | ed1efd9 | 2016-09-24 18:05:47 -0700 | [diff] [blame] | 228 | } |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 229 | |
Jeff Johnson | 44e5217 | 2017-09-30 16:39:16 -0700 | [diff] [blame] | 230 | void wlan_hdd_check_11ax_support(struct hdd_beacon_data *beacon, |
| 231 | tsap_Config_t *config) |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 232 | { |
Naveen Rawat | 08db88f | 2017-09-08 15:07:48 -0700 | [diff] [blame] | 233 | const uint8_t *ie; |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 234 | |
Naveen Rawat | d8feac1 | 2017-09-08 15:08:39 -0700 | [diff] [blame] | 235 | ie = wlan_get_ext_ie_ptr_from_ext_id(HE_CAP_OUI_TYPE, HE_CAP_OUI_SIZE, |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 236 | beacon->tail, beacon->tail_len); |
| 237 | if (ie) |
| 238 | config->SapHw_mode = eCSR_DOT11_MODE_11ax; |
| 239 | } |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 240 | |
Jeff Johnson | 56acf43 | 2017-08-28 12:00:20 -0700 | [diff] [blame] | 241 | void hdd_he_print_ini_config(struct hdd_context *hdd_ctx) |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 242 | { |
| 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 Mohan | 39accff | 2017-05-02 16:09:00 -0700 | [diff] [blame] | 247 | hdd_info("Name = [%s] Value = [%d]", CFG_HE_STA_OBSSPD_NAME, |
| 248 | hdd_ctx->config->he_sta_obsspd); |
Kiran Kumar Lokere | 4aa08a5 | 2017-12-15 19:00:39 -0800 | [diff] [blame] | 249 | hdd_info("Name = [%s] Value = [%d]", CFG_HE_DYNAMIC_FRAGMENTATION_NAME, |
| 250 | hdd_ctx->config->he_dynamic_frag_support); |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 251 | } |
| 252 | |
Jeff Johnson | 56acf43 | 2017-08-28 12:00:20 -0700 | [diff] [blame] | 253 | int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx) |
Krishna Kumaar Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 254 | { |
| 255 | uint32_t val, val1 = 0; |
| 256 | QDF_STATUS status; |
| 257 | int ret; |
| 258 | struct hdd_config *config = hdd_ctx->config; |
| 259 | |
Manikandan Mohan | 39accff | 2017-05-02 16:09:00 -0700 | [diff] [blame] | 260 | 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 Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 265 | 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 Natarajan | 90bb6f1 | 2017-03-03 21:05:52 -0800 | [diff] [blame] | 286 | void 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 Natarajan | f567650 | 2017-03-06 10:28:44 -0800 | [diff] [blame] | 292 | |
| 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 | */ |
| 302 | static 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 Johnson | 56acf43 | 2017-08-28 12:00:20 -0700 | [diff] [blame] | 308 | struct hdd_context *hdd_ctx = wiphy_priv(wiphy); |
Krishna Kumaar Natarajan | f567650 | 2017-03-06 10:28:44 -0800 | [diff] [blame] | 309 | 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; |
| 383 | end: |
| 384 | ret = cfg80211_vendor_cmd_reply(reply_skb); |
| 385 | EXIT(); |
| 386 | return ret; |
| 387 | |
| 388 | nla_put_failure: |
| 389 | hdd_err("nla put fail"); |
| 390 | kfree_skb(reply_skb); |
| 391 | return -EINVAL; |
| 392 | } |
| 393 | |
| 394 | int 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 | } |