mac80211: Backport ath10k firmware API v5 support
[openwrt.git] / package / kernel / mac80211 / patches / 931-ath10k_add_ath10k_fw_ie_htt_op_version.patch
1 diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
2 index 02da72e..f3788e2 100644
3 --- a/drivers/net/wireless/ath/ath10k/core.c
4 +++ b/drivers/net/wireless/ath/ath10k/core.c
5 @@ -675,6 +675,17 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
6                         ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw ie wmi op version %d\n",
7                                    ar->wmi.op_version);
8                         break;
9 +               case ATH10K_FW_IE_HTT_OP_VERSION:
10 +                       if (ie_len != sizeof(u32))
11 +                               break;
12 +
13 +                       version = (__le32 *)data;
14 +
15 +                       ar->htt.op_version = le32_to_cpup(version);
16 +
17 +                       ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw ie htt op version %d\n",
18 +                                  ar->htt.op_version);
19 +                       break;
20                 default:
21                         ath10k_warn(ar, "Unknown FW IE: %u\n",
22                                     le32_to_cpu(hdr->id));
23 diff --git a/drivers/net/wireless/ath/ath10k/htt.c b/drivers/net/wireless/ath/ath10k/htt.c
24 index 4f59ab9..f782d76 100644
25 --- a/drivers/net/wireless/ath/ath10k/htt.c
26 +++ b/drivers/net/wireless/ath/ath10k/htt.c
27 @@ -22,6 +22,86 @@
28  #include "core.h"
29  #include "debug.h"
30  
31 +static const enum htt_t2h_msg_type htt_main_t2h_msg_types[] = {
32 +       [HTT_MAIN_T2H_MSG_TYPE_VERSION_CONF] = HTT_T2H_MSG_TYPE_VERSION_CONF,
33 +       [HTT_MAIN_T2H_MSG_TYPE_RX_IND] = HTT_T2H_MSG_TYPE_RX_IND,
34 +       [HTT_MAIN_T2H_MSG_TYPE_RX_FLUSH] = HTT_T2H_MSG_TYPE_RX_FLUSH,
35 +       [HTT_MAIN_T2H_MSG_TYPE_PEER_MAP] = HTT_T2H_MSG_TYPE_PEER_MAP,
36 +       [HTT_MAIN_T2H_MSG_TYPE_PEER_UNMAP] = HTT_T2H_MSG_TYPE_PEER_UNMAP,
37 +       [HTT_MAIN_T2H_MSG_TYPE_RX_ADDBA] = HTT_T2H_MSG_TYPE_RX_ADDBA,
38 +       [HTT_MAIN_T2H_MSG_TYPE_RX_DELBA] = HTT_T2H_MSG_TYPE_RX_DELBA,
39 +       [HTT_MAIN_T2H_MSG_TYPE_TX_COMPL_IND] = HTT_T2H_MSG_TYPE_TX_COMPL_IND,
40 +       [HTT_MAIN_T2H_MSG_TYPE_PKTLOG] = HTT_T2H_MSG_TYPE_PKTLOG,
41 +       [HTT_MAIN_T2H_MSG_TYPE_STATS_CONF] = HTT_T2H_MSG_TYPE_STATS_CONF,
42 +       [HTT_MAIN_T2H_MSG_TYPE_RX_FRAG_IND] = HTT_T2H_MSG_TYPE_RX_FRAG_IND,
43 +       [HTT_MAIN_T2H_MSG_TYPE_SEC_IND] = HTT_T2H_MSG_TYPE_SEC_IND,
44 +       [HTT_MAIN_T2H_MSG_TYPE_TX_INSPECT_IND] =
45 +               HTT_T2H_MSG_TYPE_TX_INSPECT_IND,
46 +       [HTT_MAIN_T2H_MSG_TYPE_MGMT_TX_COMPL_IND] =
47 +               HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION,
48 +       [HTT_MAIN_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND] =
49 +               HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND,
50 +       [HTT_MAIN_T2H_MSG_TYPE_RX_PN_IND] = HTT_T2H_MSG_TYPE_RX_PN_IND,
51 +       [HTT_MAIN_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND] =
52 +               HTT_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND,
53 +       [HTT_MAIN_T2H_MSG_TYPE_TEST] = HTT_T2H_MSG_TYPE_TEST,
54 +};
55 +
56 +static const enum htt_t2h_msg_type htt_10x_t2h_msg_types[] = {
57 +       [HTT_10X_T2H_MSG_TYPE_VERSION_CONF] = HTT_T2H_MSG_TYPE_VERSION_CONF,
58 +       [HTT_10X_T2H_MSG_TYPE_RX_IND] = HTT_T2H_MSG_TYPE_RX_IND,
59 +       [HTT_10X_T2H_MSG_TYPE_RX_FLUSH] = HTT_T2H_MSG_TYPE_RX_FLUSH,
60 +       [HTT_10X_T2H_MSG_TYPE_PEER_MAP] = HTT_T2H_MSG_TYPE_PEER_MAP,
61 +       [HTT_10X_T2H_MSG_TYPE_PEER_UNMAP] = HTT_T2H_MSG_TYPE_PEER_UNMAP,
62 +       [HTT_10X_T2H_MSG_TYPE_RX_ADDBA] = HTT_T2H_MSG_TYPE_RX_ADDBA,
63 +       [HTT_10X_T2H_MSG_TYPE_RX_DELBA] = HTT_T2H_MSG_TYPE_RX_DELBA,
64 +       [HTT_10X_T2H_MSG_TYPE_TX_COMPL_IND] = HTT_T2H_MSG_TYPE_TX_COMPL_IND,
65 +       [HTT_10X_T2H_MSG_TYPE_PKTLOG] = HTT_T2H_MSG_TYPE_PKTLOG,
66 +       [HTT_10X_T2H_MSG_TYPE_STATS_CONF] = HTT_T2H_MSG_TYPE_STATS_CONF,
67 +       [HTT_10X_T2H_MSG_TYPE_RX_FRAG_IND] = HTT_T2H_MSG_TYPE_RX_FRAG_IND,
68 +       [HTT_10X_T2H_MSG_TYPE_SEC_IND] = HTT_T2H_MSG_TYPE_SEC_IND,
69 +       [HTT_10X_T2H_MSG_TYPE_RC_UPDATE_IND] = HTT_T2H_MSG_TYPE_RC_UPDATE_IND,
70 +       [HTT_10X_T2H_MSG_TYPE_TX_INSPECT_IND] = HTT_T2H_MSG_TYPE_TX_INSPECT_IND,
71 +       [HTT_10X_T2H_MSG_TYPE_TEST] = HTT_T2H_MSG_TYPE_TEST,
72 +       [HTT_10X_T2H_MSG_TYPE_CHAN_CHANGE] = HTT_T2H_MSG_TYPE_CHAN_CHANGE,
73 +       [HTT_10X_T2H_MSG_TYPE_AGGR_CONF] = HTT_T2H_MSG_TYPE_AGGR_CONF,
74 +       [HTT_10X_T2H_MSG_TYPE_STATS_NOUPLOAD] = HTT_T2H_MSG_TYPE_STATS_NOUPLOAD,
75 +       [HTT_10X_T2H_MSG_TYPE_MGMT_TX_COMPL_IND] =
76 +               HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION,
77 +};
78 +
79 +static const enum htt_t2h_msg_type htt_tlv_t2h_msg_types[] = {
80 +       [HTT_TLV_T2H_MSG_TYPE_VERSION_CONF] = HTT_T2H_MSG_TYPE_VERSION_CONF,
81 +       [HTT_TLV_T2H_MSG_TYPE_RX_IND] = HTT_T2H_MSG_TYPE_RX_IND,
82 +       [HTT_TLV_T2H_MSG_TYPE_RX_FLUSH] = HTT_T2H_MSG_TYPE_RX_FLUSH,
83 +       [HTT_TLV_T2H_MSG_TYPE_PEER_MAP] = HTT_T2H_MSG_TYPE_PEER_MAP,
84 +       [HTT_TLV_T2H_MSG_TYPE_PEER_UNMAP] = HTT_T2H_MSG_TYPE_PEER_UNMAP,
85 +       [HTT_TLV_T2H_MSG_TYPE_RX_ADDBA] = HTT_T2H_MSG_TYPE_RX_ADDBA,
86 +       [HTT_TLV_T2H_MSG_TYPE_RX_DELBA] = HTT_T2H_MSG_TYPE_RX_DELBA,
87 +       [HTT_TLV_T2H_MSG_TYPE_TX_COMPL_IND] = HTT_T2H_MSG_TYPE_TX_COMPL_IND,
88 +       [HTT_TLV_T2H_MSG_TYPE_PKTLOG] = HTT_T2H_MSG_TYPE_PKTLOG,
89 +       [HTT_TLV_T2H_MSG_TYPE_STATS_CONF] = HTT_T2H_MSG_TYPE_STATS_CONF,
90 +       [HTT_TLV_T2H_MSG_TYPE_RX_FRAG_IND] = HTT_T2H_MSG_TYPE_RX_FRAG_IND,
91 +       [HTT_TLV_T2H_MSG_TYPE_SEC_IND] = HTT_T2H_MSG_TYPE_SEC_IND,
92 +       [HTT_TLV_T2H_MSG_TYPE_RC_UPDATE_IND] = HTT_T2H_MSG_TYPE_RC_UPDATE_IND,
93 +       [HTT_TLV_T2H_MSG_TYPE_TX_INSPECT_IND] = HTT_T2H_MSG_TYPE_TX_INSPECT_IND,
94 +       [HTT_TLV_T2H_MSG_TYPE_MGMT_TX_COMPL_IND] =
95 +               HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION,
96 +       [HTT_TLV_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND] =
97 +               HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND,
98 +       [HTT_TLV_T2H_MSG_TYPE_RX_PN_IND] = HTT_T2H_MSG_TYPE_RX_PN_IND,
99 +       [HTT_TLV_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND] =
100 +               HTT_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND,
101 +       [HTT_TLV_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND] =
102 +               HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND,
103 +       [HTT_TLV_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE] =
104 +               HTT_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE,
105 +       [HTT_TLV_T2H_MSG_TYPE_CHAN_CHANGE] = HTT_T2H_MSG_TYPE_CHAN_CHANGE,
106 +       [HTT_TLV_T2H_MSG_TYPE_RX_OFLD_PKT_ERR] =
107 +               HTT_T2H_MSG_TYPE_RX_OFLD_PKT_ERR,
108 +       [HTT_TLV_T2H_MSG_TYPE_TEST] = HTT_T2H_MSG_TYPE_TEST,
109 +};
110 +
111  int ath10k_htt_connect(struct ath10k_htt *htt)
112  {
113         struct ath10k_htc_svc_conn_req conn_req;
114 @@ -66,6 +146,24 @@ int ath10k_htt_init(struct ath10k *ar)
115                 8 + /* llc snap */
116                 2; /* ip4 dscp or ip6 priority */
117  
118 +       switch (ar->htt.op_version) {
119 +       case ATH10K_FW_HTT_OP_VERSION_10_1:
120 +               ar->htt.t2h_msg_types = htt_10x_t2h_msg_types;
121 +               ar->htt.t2h_msg_types_max = HTT_10X_T2H_NUM_MSGS;
122 +               break;
123 +       case ATH10K_FW_HTT_OP_VERSION_TLV:
124 +               ar->htt.t2h_msg_types = htt_tlv_t2h_msg_types;
125 +               ar->htt.t2h_msg_types_max = HTT_TLV_T2H_NUM_MSGS;
126 +               break;
127 +       case ATH10K_FW_HTT_OP_VERSION_MAIN:
128 +       case ATH10K_FW_HTT_OP_VERSION_UNSET:
129 +               ar->htt.t2h_msg_types = htt_main_t2h_msg_types;
130 +               ar->htt.t2h_msg_types_max = HTT_MAIN_T2H_NUM_MSGS;
131 +               break;
132 +       case ATH10K_FW_HTT_OP_VERSION_MAX:
133 +               WARN_ON(1);
134 +               return -EINVAL;
135 +       }
136         return 0;
137  }
138  
139 diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h
140 index 874bf44..95df742 100644
141 --- a/drivers/net/wireless/ath/ath10k/htt.h
142 +++ b/drivers/net/wireless/ath/ath10k/htt.h
143 @@ -26,6 +26,7 @@
144  
145  #include "htc.h"
146  #include "rx_desc.h"
147 +#include "hw.h"
148  
149  enum htt_dbg_stats_type {
150         HTT_DBG_STATS_WAL_PDEV_TXRX = 1 << 0,
151 @@ -271,35 +272,108 @@ enum htt_mgmt_tx_status {
152  
153  /*=== target -> host messages ===============================================*/
154  
155 -enum htt_t2h_msg_type {
156 -       HTT_T2H_MSG_TYPE_VERSION_CONF           = 0x0,
157 -       HTT_T2H_MSG_TYPE_RX_IND                 = 0x1,
158 -       HTT_T2H_MSG_TYPE_RX_FLUSH               = 0x2,
159 -       HTT_T2H_MSG_TYPE_PEER_MAP               = 0x3,
160 -       HTT_T2H_MSG_TYPE_PEER_UNMAP             = 0x4,
161 -       HTT_T2H_MSG_TYPE_RX_ADDBA               = 0x5,
162 -       HTT_T2H_MSG_TYPE_RX_DELBA               = 0x6,
163 -       HTT_T2H_MSG_TYPE_TX_COMPL_IND           = 0x7,
164 -       HTT_T2H_MSG_TYPE_PKTLOG                 = 0x8,
165 -       HTT_T2H_MSG_TYPE_STATS_CONF             = 0x9,
166 -       HTT_T2H_MSG_TYPE_RX_FRAG_IND            = 0xa,
167 -       HTT_T2H_MSG_TYPE_SEC_IND                = 0xb,
168 -       HTT_T2H_MSG_TYPE_RC_UPDATE_IND          = 0xc,
169 -       HTT_T2H_MSG_TYPE_TX_INSPECT_IND         = 0xd,
170 -       HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION     = 0xe,
171 -       HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND   = 0xf,
172 -       HTT_T2H_MSG_TYPE_RX_PN_IND              = 0x10,
173 -       HTT_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND = 0x11,
174 -       HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND    = 0x12,
175 +enum htt_main_t2h_msg_type {
176 +       HTT_MAIN_T2H_MSG_TYPE_VERSION_CONF             = 0x0,
177 +       HTT_MAIN_T2H_MSG_TYPE_RX_IND                   = 0x1,
178 +       HTT_MAIN_T2H_MSG_TYPE_RX_FLUSH                 = 0x2,
179 +       HTT_MAIN_T2H_MSG_TYPE_PEER_MAP                 = 0x3,
180 +       HTT_MAIN_T2H_MSG_TYPE_PEER_UNMAP               = 0x4,
181 +       HTT_MAIN_T2H_MSG_TYPE_RX_ADDBA                 = 0x5,
182 +       HTT_MAIN_T2H_MSG_TYPE_RX_DELBA                 = 0x6,
183 +       HTT_MAIN_T2H_MSG_TYPE_TX_COMPL_IND             = 0x7,
184 +       HTT_MAIN_T2H_MSG_TYPE_PKTLOG                   = 0x8,
185 +       HTT_MAIN_T2H_MSG_TYPE_STATS_CONF               = 0x9,
186 +       HTT_MAIN_T2H_MSG_TYPE_RX_FRAG_IND              = 0xa,
187 +       HTT_MAIN_T2H_MSG_TYPE_SEC_IND                  = 0xb,
188 +       HTT_MAIN_T2H_MSG_TYPE_TX_INSPECT_IND           = 0xd,
189 +       HTT_MAIN_T2H_MSG_TYPE_MGMT_TX_COMPL_IND        = 0xe,
190 +       HTT_MAIN_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND     = 0xf,
191 +       HTT_MAIN_T2H_MSG_TYPE_RX_PN_IND                = 0x10,
192 +       HTT_MAIN_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND   = 0x11,
193 +       HTT_MAIN_T2H_MSG_TYPE_TEST,
194 +       /* keep this last */
195 +       HTT_MAIN_T2H_NUM_MSGS
196 +};
197 +
198 +enum htt_10x_t2h_msg_type {
199 +       HTT_10X_T2H_MSG_TYPE_VERSION_CONF              = 0x0,
200 +       HTT_10X_T2H_MSG_TYPE_RX_IND                    = 0x1,
201 +       HTT_10X_T2H_MSG_TYPE_RX_FLUSH                  = 0x2,
202 +       HTT_10X_T2H_MSG_TYPE_PEER_MAP                  = 0x3,
203 +       HTT_10X_T2H_MSG_TYPE_PEER_UNMAP                = 0x4,
204 +       HTT_10X_T2H_MSG_TYPE_RX_ADDBA                  = 0x5,
205 +       HTT_10X_T2H_MSG_TYPE_RX_DELBA                  = 0x6,
206 +       HTT_10X_T2H_MSG_TYPE_TX_COMPL_IND              = 0x7,
207 +       HTT_10X_T2H_MSG_TYPE_PKTLOG                    = 0x8,
208 +       HTT_10X_T2H_MSG_TYPE_STATS_CONF                = 0x9,
209 +       HTT_10X_T2H_MSG_TYPE_RX_FRAG_IND               = 0xa,
210 +       HTT_10X_T2H_MSG_TYPE_SEC_IND                   = 0xb,
211 +       HTT_10X_T2H_MSG_TYPE_RC_UPDATE_IND             = 0xc,
212 +       HTT_10X_T2H_MSG_TYPE_TX_INSPECT_IND            = 0xd,
213 +       HTT_10X_T2H_MSG_TYPE_TEST                      = 0xe,
214 +       HTT_10X_T2H_MSG_TYPE_CHAN_CHANGE               = 0xf,
215 +       HTT_10X_T2H_MSG_TYPE_AGGR_CONF                 = 0x11,
216 +       HTT_10X_T2H_MSG_TYPE_STATS_NOUPLOAD            = 0x12,
217 +       HTT_10X_T2H_MSG_TYPE_MGMT_TX_COMPL_IND         = 0x13,
218 +       /* keep this last */
219 +       HTT_10X_T2H_NUM_MSGS
220 +};
221 +
222 +enum htt_tlv_t2h_msg_type {
223 +       HTT_TLV_T2H_MSG_TYPE_VERSION_CONF              = 0x0,
224 +       HTT_TLV_T2H_MSG_TYPE_RX_IND                    = 0x1,
225 +       HTT_TLV_T2H_MSG_TYPE_RX_FLUSH                  = 0x2,
226 +       HTT_TLV_T2H_MSG_TYPE_PEER_MAP                  = 0x3,
227 +       HTT_TLV_T2H_MSG_TYPE_PEER_UNMAP                = 0x4,
228 +       HTT_TLV_T2H_MSG_TYPE_RX_ADDBA                  = 0x5,
229 +       HTT_TLV_T2H_MSG_TYPE_RX_DELBA                  = 0x6,
230 +       HTT_TLV_T2H_MSG_TYPE_TX_COMPL_IND              = 0x7,
231 +       HTT_TLV_T2H_MSG_TYPE_PKTLOG                    = 0x8,
232 +       HTT_TLV_T2H_MSG_TYPE_STATS_CONF                = 0x9,
233 +       HTT_TLV_T2H_MSG_TYPE_RX_FRAG_IND               = 0xa,
234 +       HTT_TLV_T2H_MSG_TYPE_SEC_IND                   = 0xb,
235 +       HTT_TLV_T2H_MSG_TYPE_RC_UPDATE_IND             = 0xc, /* deprecated */
236 +       HTT_TLV_T2H_MSG_TYPE_TX_INSPECT_IND            = 0xd,
237 +       HTT_TLV_T2H_MSG_TYPE_MGMT_TX_COMPL_IND         = 0xe,
238 +       HTT_TLV_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND      = 0xf,
239 +       HTT_TLV_T2H_MSG_TYPE_RX_PN_IND                 = 0x10,
240 +       HTT_TLV_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND    = 0x11,
241 +       HTT_TLV_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND       = 0x12,
242         /* 0x13 reservd */
243 -       HTT_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE    = 0x14,
244 +       HTT_TLV_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE       = 0x14,
245 +       HTT_TLV_T2H_MSG_TYPE_CHAN_CHANGE               = 0x15,
246 +       HTT_TLV_T2H_MSG_TYPE_RX_OFLD_PKT_ERR           = 0x16,
247 +       HTT_TLV_T2H_MSG_TYPE_TEST,
248 +       /* keep this last */
249 +       HTT_TLV_T2H_NUM_MSGS
250 +};
251  
252 -       /* FIXME: Do not depend on this event id. Numbering of this event id is
253 -        * broken across different firmware revisions and HTT version fails to
254 -        * indicate this.
255 -        */
256 +enum htt_t2h_msg_type {
257 +       HTT_T2H_MSG_TYPE_VERSION_CONF,
258 +       HTT_T2H_MSG_TYPE_RX_IND,
259 +       HTT_T2H_MSG_TYPE_RX_FLUSH,
260 +       HTT_T2H_MSG_TYPE_PEER_MAP,
261 +       HTT_T2H_MSG_TYPE_PEER_UNMAP,
262 +       HTT_T2H_MSG_TYPE_RX_ADDBA,
263 +       HTT_T2H_MSG_TYPE_RX_DELBA,
264 +       HTT_T2H_MSG_TYPE_TX_COMPL_IND,
265 +       HTT_T2H_MSG_TYPE_PKTLOG,
266 +       HTT_T2H_MSG_TYPE_STATS_CONF,
267 +       HTT_T2H_MSG_TYPE_RX_FRAG_IND,
268 +       HTT_T2H_MSG_TYPE_SEC_IND,
269 +       HTT_T2H_MSG_TYPE_RC_UPDATE_IND,
270 +       HTT_T2H_MSG_TYPE_TX_INSPECT_IND,
271 +       HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION,
272 +       HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND,
273 +       HTT_T2H_MSG_TYPE_RX_PN_IND,
274 +       HTT_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND,
275 +       HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND,
276 +       HTT_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE,
277 +       HTT_T2H_MSG_TYPE_CHAN_CHANGE,
278 +       HTT_T2H_MSG_TYPE_RX_OFLD_PKT_ERR,
279 +       HTT_T2H_MSG_TYPE_AGGR_CONF,
280 +       HTT_T2H_MSG_TYPE_STATS_NOUPLOAD,
281         HTT_T2H_MSG_TYPE_TEST,
282 -
283         /* keep this last */
284         HTT_T2H_NUM_MSGS
285  };
286 @@ -1248,6 +1322,10 @@ struct ath10k_htt {
287         u8 target_version_major;
288         u8 target_version_minor;
289         struct completion target_version_received;
290 +       enum ath10k_fw_htt_op_version op_version;
291 +
292 +       const enum htt_t2h_msg_type *t2h_msg_types;
293 +       u32 t2h_msg_types_max;
294  
295         struct {
296                 /*
297 diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
298 index 01a2b38..21e9253 100644
299 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c
300 +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
301 @@ -1892,6 +1892,7 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
302  {
303         struct ath10k_htt *htt = &ar->htt;
304         struct htt_resp *resp = (struct htt_resp *)skb->data;
305 +       enum htt_t2h_msg_type type;
306  
307         /* confirm alignment */
308         if (!IS_ALIGNED((unsigned long)skb->data, 4))
309 @@ -1899,7 +1900,16 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
310  
311         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt rx, msg_type: 0x%0X\n",
312                    resp->hdr.msg_type);
313 -       switch (resp->hdr.msg_type) {
314 +
315 +       if (resp->hdr.msg_type >= ar->htt.t2h_msg_types_max) {
316 +               ath10k_dbg(ar, ATH10K_DBG_HTT, "htt rx, unsupported msg_type: 0x%0X\n max: 0x%0X",
317 +                          resp->hdr.msg_type, ar->htt.t2h_msg_types_max);
318 +               dev_kfree_skb_any(skb);
319 +               return;
320 +       }
321 +       type = ar->htt.t2h_msg_types[resp->hdr.msg_type];
322 +
323 +       switch (type) {
324         case HTT_T2H_MSG_TYPE_VERSION_CONF: {
325                 htt->target_version_major = resp->ver_resp.major;
326                 htt->target_version_minor = resp->ver_resp.minor;
327 @@ -1976,7 +1986,6 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
328                 break;
329         }
330         case HTT_T2H_MSG_TYPE_TEST:
331 -               /* FIX THIS */
332                 break;
333         case HTT_T2H_MSG_TYPE_STATS_CONF:
334                 trace_ath10k_htt_stats(ar, skb->data, skb->len);
335 @@ -2018,11 +2027,8 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
336                 return;
337         }
338         case HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND:
339 -               /* FIXME: This WMI-TLV event is overlapping with 10.2
340 -                * CHAN_CHANGE - both being 0xF. Neither is being used in
341 -                * practice so no immediate action is necessary. Nevertheless
342 -                * HTT may need an abstraction layer like WMI has one day.
343 -                */
344 +               break;
345 +       case HTT_T2H_MSG_TYPE_CHAN_CHANGE:
346                 break;
347         default:
348                 ath10k_warn(ar, "htt event (%d) not handled\n",
349 diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
350 index 22c993d..c236dd3 100644
351 --- a/drivers/net/wireless/ath/ath10k/hw.h
352 +++ b/drivers/net/wireless/ath/ath10k/hw.h
353 @@ -104,6 +104,11 @@ enum ath10k_fw_ie_type {
354          * FW API 4 and above.
355          */
356         ATH10K_FW_IE_WMI_OP_VERSION = 5,
357 +
358 +       /* HTT "operations" interface version, 32 bit value. Supported from
359 +        * FW API 5 and above.
360 +        */
361 +       ATH10K_FW_IE_HTT_OP_VERSION = 6,
362  };
363  
364  enum ath10k_fw_wmi_op_version {
365 @@ -119,6 +124,20 @@ enum ath10k_fw_wmi_op_version {
366         ATH10K_FW_WMI_OP_VERSION_MAX,
367  };
368  
369 +enum ath10k_fw_htt_op_version {
370 +       ATH10K_FW_HTT_OP_VERSION_UNSET = 0,
371 +
372 +       ATH10K_FW_HTT_OP_VERSION_MAIN = 1,
373 +
374 +       /* also used in 10.2 and 10.2.4 branches */
375 +       ATH10K_FW_HTT_OP_VERSION_10_1 = 2,
376 +
377 +       ATH10K_FW_HTT_OP_VERSION_TLV = 3,
378 +
379 +       /* keep last */
380 +       ATH10K_FW_HTT_OP_VERSION_MAX,
381 +};
382 +
383  enum ath10k_hw_rev {
384         ATH10K_HW_QCA988X,
385         ATH10K_HW_QCA6174,