1 /*
2 * Copyright (c) 2014-2020 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 #if !defined(__SME_QOSAPI_H)
20 #define __SME_QOSAPI_H
21
22 /**
23 * \file sme_qos_api.h
24 *
25 * \brief prototype for SME QoS APIs
26 */
27
28 /* Include Files */
29 #include "qdf_lock.h"
30 #include "qdf_trace.h"
31 #include "qdf_mem.h"
32 #include "qdf_types.h"
33 #include "ani_global.h"
34 #include "sir_api.h"
35
36 /* Pre-processor Definitions */
37 #define SME_QOS_UAPSD_VO 0x01
38 #define SME_QOS_UAPSD_VI 0x02
39 #define SME_QOS_UAPSD_BE 0x08
40 #define SME_QOS_UAPSD_BK 0x04
41
42 /* Enumeration of the various QoS status types that would be reported to HDD */
43 enum sme_qos_statustype {
44 /*
45 * async: once PE notifies successful TSPEC negotiation, or CSR notifies
46 * for successful reassoc, notifies HDD with current QoS Params
47 */
48 SME_QOS_STATUS_SETUP_SUCCESS_IND = 0,
49 /* sync: only when App asked for APSD & it's already set with ACM = 0 */
50 SME_QOS_STATUS_SETUP_SUCCESS_APSD_SET_ALREADY,
51 /* sync or async: in case of async notify HDD with current QoS Params */
52 SME_QOS_STATUS_SETUP_FAILURE_RSP,
53 /* sync */
54 SME_QOS_STATUS_SETUP_INVALID_PARAMS_RSP,
55 /* sync: AP doesn't support QoS (WMM) */
56 SME_QOS_STATUS_SETUP_NOT_QOS_AP_RSP,
57 /* sync: either req has been sent down to PE or just buffered in SME */
58 SME_QOS_STATUS_SETUP_REQ_PENDING_RSP,
59 /*
60 * async: in case of flow aggregation, if the new TSPEC negotiation
61 * is successful, OR, notify existing flows that TSPEC is modified with
62 * current QoS Params
63 */
64 SME_QOS_STATUS_SETUP_MODIFIED_IND,
65 /* sync: no APSD asked for & ACM = 0 */
66 SME_QOS_STATUS_SETUP_SUCCESS_NO_ACM_NO_APSD_RSP,
67 /*
68 * async: In case of UAPSD, once PE notifies successful TSPEC
69 * negotiation, or CSR notifies for successful reassoc to SME-QoS,
70 * notify HDD if PMC can't put the module in UAPSD mode right away
71 * (QDF_STATUS_PMC_PENDING)
72 */
73 SME_QOS_STATUS_SETUP_SUCCESS_IND_APSD_PENDING,
74 /*
75 * async: In case of UAPSD, once PE notifies successful TSPEC
76 * negotiation, or CSR notifies for successful reassoc to SME-QoS,
77 * notify HDD if PMC can't put the module in UAPSD mode at all
78 * (QDF_STATUS_E_FAILURE)
79 */
80 SME_QOS_STATUS_SETUP_SUCCESS_IND_APSD_SET_FAILED,
81 /*
82 * sync: req has been sent down to PE in case of delts or addts
83 * for remain flows, OR if the AC doesn't have APSD or ACM
84 * async: once the downgrade req for QoS params is successful
85 */
86 SME_QOS_STATUS_RELEASE_SUCCESS_RSP = 100,
87 /* sync or async: in case of async notify HDD with current QoS Param */
88 SME_QOS_STATUS_RELEASE_FAILURE_RSP,
89 /* async: AP sent DELTS indication */
90 SME_QOS_STATUS_RELEASE_QOS_LOST_IND,
91 /*
92 * sync: an addts req has been sent down to PE to downgrade the
93 * QoS params or just buffered in SME
94 */
95 SME_QOS_STATUS_RELEASE_REQ_PENDING_RSP,
96 /* sync */
97 SME_QOS_STATUS_RELEASE_INVALID_PARAMS_RSP,
98 /*
99 * async: for QoS modify request if modification is successful,
100 * notifies HDD with current QoS Params
101 */
102 SME_QOS_STATUS_MODIFY_SETUP_SUCCESS_IND = 200,
103 /* sync: only when App asked for APSD & it's already set with ACM = 0 */
104 SME_QOS_STATUS_MODIFY_SETUP_SUCCESS_APSD_SET_ALREADY,
105 /* sync or async: in case of async notify HDD with current QoS Param */
106 SME_QOS_STATUS_MODIFY_SETUP_FAILURE_RSP,
107 /* sync: either req has been sent down to PE or just buffered in SME */
108 SME_QOS_STATUS_MODIFY_SETUP_PENDING_RSP,
109 /* sync: no APSD asked for & ACM = 0 */
110 SME_QOS_STATUS_MODIFY_SETUP_SUCCESS_NO_ACM_NO_APSD_RSP,
111 /* sync */
112 SME_QOS_STATUS_MODIFY_SETUP_INVALID_PARAMS_RSP,
113 /*
114 * async: In case of UAPSD, once PE notifies successful TSPEC
115 * negotiation or CSR notifies for successful reassoc to SME-QoS,
116 * notify HDD if PMC can't put the module in UAPSD mode right away
117 * (QDF_STATUS_PMC_PENDING)
118 */
119 SME_QOS_STATUS_MODIFY_SETUP_SUCCESS_IND_APSD_PENDING,
120 /*
121 * async: In case of UAPSD, once PE notifies successful TSPEC
122 * negotiation, or CSR notifies for successful reassoc to SME-QoS,
123 * notify HDD if PMC can't put the module in UAPSD mode at all
124 * (QDF_STATUS_E_FAILURE)
125 */
126 SME_QOS_STATUS_MODIFY_SETUP_SUCCESS_IND_APSD_SET_FAILED,
127 /* sync: STA is handing off to a new AP */
128 SME_QOS_STATUS_HANDING_OFF = 300,
129 /* async:powersave mode changed by PMC from UAPSD to Full power */
130 SME_QOS_STATUS_OUT_OF_APSD_POWER_MODE_IND = 400,
131 /* async:powersave mode changed by PMC from Full power to UAPSD */
132 SME_QOS_STATUS_INTO_APSD_POWER_MODE_IND,
133
134 };
135
136 #define WLAN_MAX_DSCP 0x3f
137
138 /*
139 * Enumeration of the various User priority (UP) types
140 * From 802.1D/802.11e/WMM specifications (all refer to same table)
141 */
142 enum sme_qos_wmmuptype {
143 SME_QOS_WMM_UP_BE = 0,
144 SME_QOS_WMM_UP_BK = 1,
145 SME_QOS_WMM_UP_RESV = 2, /* Reserved */
146 SME_QOS_WMM_UP_EE = 3,
147 SME_QOS_WMM_UP_CL = 4,
148 SME_QOS_WMM_UP_VI = 5,
149 SME_QOS_WMM_UP_VO = 6,
150 SME_QOS_WMM_UP_NC = 7,
151 SME_QOS_WMM_UP_MAX
152 };
153
154 /*
155 * Enumeration of the various TSPEC ack policies.
156 * From 802.11 WMM specification
157 */
158 enum sme_qos_wmmack_policytype {
159 SME_QOS_WMM_TS_ACK_POLICY_NORMAL_ACK = 0,
160 SME_QOS_WMM_TS_ACK_POLICY_RESV1 = 1,
161 SME_QOS_WMM_TS_ACK_POLICY_RESV2 = 2, /* Reserved */
162 SME_QOS_WMM_TS_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK = 3,
163
164 };
165
166 /*
167 * TS Info field in the WMM TSPEC
168 * See suggestive values above
169 */
170 struct sme_qos_wmmts_infotype {
171 uint8_t burst_size_defn;
172 enum sme_qos_wmmack_policytype ack_policy;
173 enum sme_qos_wmmuptype up; /* User priority */
174 uint8_t psb; /* power-save bit */
175 enum sme_qos_wmm_dir_type direction; /* Direction */
176 uint8_t tid; /* TID : To be filled up by SME-QoS */
177 };
178
179 /* The WMM TSPEC Element (from the WMM spec)*/
180 struct sme_qos_wmmtspecinfo {
181 struct sme_qos_wmmts_infotype ts_info;
182 uint16_t nominal_msdu_size;
183 uint16_t maximum_msdu_size;
184 uint32_t min_service_interval;
185 uint32_t max_service_interval;
186 uint32_t inactivity_interval;
187 uint32_t suspension_interval;
188 uint32_t svc_start_time;
189 uint32_t min_data_rate;
190 uint32_t mean_data_rate;
191 uint32_t peak_data_rate;
192 uint32_t max_burst_size;
193 uint32_t delay_bound;
194 uint32_t min_phy_rate;
195 uint16_t surplus_bw_allowance;
196 uint16_t medium_time;
197 };
198
qca_wlan_ac_to_sme_qos(u8 priority)199 static inline enum sme_qos_wmmuptype qca_wlan_ac_to_sme_qos(u8 priority)
200 {
201 switch (priority) {
202 case QCA_WLAN_AC_BE:
203 return SME_QOS_WMM_UP_BE;
204 case QCA_WLAN_AC_BK:
205 return SME_QOS_WMM_UP_BK;
206 case QCA_WLAN_AC_VI:
207 return SME_QOS_WMM_UP_VI;
208 case QCA_WLAN_AC_VO:
209 return SME_QOS_WMM_UP_VO;
210 default:
211 return SME_QOS_WMM_UP_BE;
212 }
213 }
214
215 /* External APIs */
216 typedef QDF_STATUS (*sme_QosCallback)(mac_handle_t mac_handle, void *HDDcontext,
217 struct sme_qos_wmmtspecinfo *pCurrentQoSInfo,
218 enum sme_qos_statustype status, uint32_t QosFlowID);
219 enum sme_qos_statustype sme_qos_setup_req(mac_handle_t mac_handle,
220 uint32_t sessionId,
221 struct sme_qos_wmmtspecinfo *pQoSInfo,
222 sme_QosCallback QoSCallback,
223 void *HDDcontext,
224 enum sme_qos_wmmuptype UPType,
225 uint32_t *pQosFlowID);
226 enum sme_qos_statustype sme_qos_modify_req(mac_handle_t mac_handle,
227 struct sme_qos_wmmtspecinfo *pQoSInfo, uint32_t QosFlowID);
228 enum sme_qos_statustype sme_qos_release_req(mac_handle_t mac_handle,
229 uint8_t session_id,
230 uint32_t QosFlowID);
231 bool sme_qos_is_ts_info_ack_policy_valid(mac_handle_t mac_handle,
232 struct sme_qos_wmmtspecinfo *pQoSInfo,
233 uint8_t sessionId);
234 void sme_qos_update_hand_off(uint8_t sessionId, bool updateHandOff);
235 QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
236 enum sme_qos_wmmuptype *dscpmapping, uint8_t sessionId);
237
238 QDF_STATUS sme_offload_qos_process_out_of_uapsd_mode(struct mac_context *mac_ctx,
239 uint32_t session_id);
240 QDF_STATUS sme_offload_qos_process_into_uapsd_mode(struct mac_context *mac_ctx,
241 uint32_t session_id);
242
243
244 #endif /* #if !defined( __SME_QOSAPI_H ) */
245