blob: b06cb192746d5b2bbb08cd05aaade54c360850e4 [file] [log] [blame]
Venkata Sharath Chandra Manchalad1b7e4c2019-09-20 10:01:21 -07001/*
2 * Copyright (c) 2019 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
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070019#include "qdf_types.h"
20#include "qdf_util.h"
21#include "qdf_types.h"
22#include "qdf_lock.h"
23#include "qdf_mem.h"
24#include "qdf_nbuf.h"
25#include "hal_hw_headers.h"
26#include "hal_internal.h"
27#include "hal_api.h"
28#include "target_type.h"
29#include "wcss_version.h"
30#include "qdf_module.h"
31
32#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
33 RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_OFFSET
34#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
35 RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_MASK
36#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
37 RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_LSB
38#define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070039 PHYRX_L_SIG_B_0_PHYRX_L_SIG_B_INFO_DETAILS_RATE_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070040#define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070041 PHYRX_L_SIG_B_0_PHYRX_L_SIG_B_INFO_DETAILS_RATE_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070042#define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070043 PHYRX_L_SIG_A_0_PHYRX_L_SIG_A_INFO_DETAILS_RATE_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070044#define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070045 PHYRX_VHT_SIG_A_0_PHYRX_VHT_SIG_A_INFO_DETAILS_BANDWIDTH_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070046#define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070047 PHYRX_HE_SIG_A_SU_0_PHYRX_HE_SIG_A_SU_INFO_DETAILS_FORMAT_INDICATION_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070048#define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070049 PHYRX_HE_SIG_A_MU_DL_0_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_DL_UL_FLAG_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070050#define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070051 PHYRX_HE_SIG_B1_MU_0_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_RU_ALLOCATION_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070052#define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070053 PHYRX_HE_SIG_B2_MU_0_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_STA_ID_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070054#define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070055 PHYRX_HE_SIG_B2_OFDMA_0_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_STA_ID_OFFSET
56
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070057#define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
58 PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET
59#define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
Manjunathappa Prakash6a3150d2019-09-19 12:05:08 -070060 PHYRX_RSSI_LEGACY_19_PREAMBLE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -070061#define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
62 RX_MPDU_START_0_RX_MPDU_INFO_DETAILS_RXPT_CLASSIFY_INFO_DETAILS_REO_DESTINATION_INDICATION_OFFSET
63#define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
64 RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
65#define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
66 RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
67#define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
68 RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
69#define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
70 REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
71#define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
72 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER
73#define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
74 RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
75#define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
76 RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
77#define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
78 TCL_DATA_CMD_0_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET
79#define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
80 TCL_DATA_CMD_1_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET
81#define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
82 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET
83#define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
84 BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB
85#define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
86 BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK
87#define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
88 BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB
89#define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
90 BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK
91#define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
92 BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB
93#define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
94 BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK
95#define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
96 BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB
97#define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
98 BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK
99#define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
100 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB
101#define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
102 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK
103#define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
104 WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK
105#define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
106 WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET
107#define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
108 WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB
109
110#include "hal_6490_tx.h"
111#include "hal_6490_rx.h"
112#include <hal_generic_api.h>
113#include <hal_wbm.h>
114
115/*
116 * hal_rx_msdu_start_nss_get_6490(): API to get the NSS
117 * Interval from rx_msdu_start
118 *
119 * @buf: pointer to the start of RX PKT TLV header
120 * Return: uint32_t(nss)
121 */
122static uint32_t
123hal_rx_msdu_start_nss_get_6490(uint8_t *buf)
124{
125 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
126 struct rx_msdu_start *msdu_start =
127 &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
128 uint8_t mimo_ss_bitmap;
129
130 mimo_ss_bitmap = HAL_RX_MSDU_START_MIMO_SS_BITMAP(msdu_start);
131
132 return qdf_get_hweight8(mimo_ss_bitmap);
133}
134
135/**
136 * hal_rx_mon_hw_desc_get_mpdu_status_6490(): Retrieve MPDU status
137 *
138 * @ hw_desc_addr: Start address of Rx HW TLVs
139 * @ rs: Status for monitor mode
140 *
141 * Return: void
142 */
143static void hal_rx_mon_hw_desc_get_mpdu_status_6490(void *hw_desc_addr,
144 struct mon_rx_status *rs)
145{
146 struct rx_msdu_start *rx_msdu_start;
147 struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
148 uint32_t reg_value;
149 const uint32_t sgi_hw_to_cdp[] = {
150 CDP_SGI_0_8_US,
151 CDP_SGI_0_4_US,
152 CDP_SGI_1_6_US,
153 CDP_SGI_3_2_US,
154 };
155
156 rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
157
158 HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs);
159
160 rs->ant_signal_db = HAL_RX_GET(rx_msdu_start,
161 RX_MSDU_START_5, USER_RSSI);
162 rs->is_stbc = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, STBC);
163
164 reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, SGI);
165 rs->sgi = sgi_hw_to_cdp[reg_value];
166
167 reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, RECEPTION_TYPE);
168 rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
169 /* TODO: rs->beamformed should be set for SU beamforming also */
170}
171
172#define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2)
173
174static uint32_t hal_get_link_desc_size_6490(void)
175{
176 return LINK_DESC_SIZE;
177}
178
179/*
180 * hal_rx_get_tlv_6490(): API to get the tlv
181 *
182 * @rx_tlv: TLV data extracted from the rx packet
183 * Return: uint8_t
184 */
185static uint8_t hal_rx_get_tlv_6490(void *rx_tlv)
186{
187 return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY_0, RECEIVE_BANDWIDTH);
188}
189
190/**
191 * hal_rx_proc_phyrx_other_receive_info_tlv_6490()
192 * - process other receive info TLV
193 * @rx_tlv_hdr: pointer to TLV header
194 * @ppdu_info: pointer to ppdu_info
195 *
196 * Return: None
197 */
198static
199void hal_rx_proc_phyrx_other_receive_info_tlv_6490(void *rx_tlv_hdr,
200 void *ppdu_info_handle)
201{
202 uint32_t tlv_tag, tlv_len;
203 uint32_t temp_len, other_tlv_len, other_tlv_tag;
204 void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
205 void *other_tlv_hdr = NULL;
206 void *other_tlv = NULL;
207
208 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
209 tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
210 temp_len = 0;
211
212 other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE;
213
214 other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr);
215 other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr);
216 temp_len += other_tlv_len;
217 other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
218
219 switch (other_tlv_tag) {
220 default:
221 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
222 "%s unhandled TLV type: %d, TLV len:%d",
223 __func__, other_tlv_tag, other_tlv_len);
224 break;
225 }
226}
227
228/**
229 * hal_rx_dump_msdu_start_tlv_6490() : dump RX msdu_start TLV in structured
230 * human readable format.
231 * @ msdu_start: pointer the msdu_start TLV in pkt.
232 * @ dbg_level: log level.
233 *
234 * Return: void
235 */
236static void hal_rx_dump_msdu_start_tlv_6490(void *msdustart, uint8_t dbg_level)
237{
238 struct rx_msdu_start *msdu_start = (struct rx_msdu_start *)msdustart;
239
240 hal_verbose_debug(
241 "rx_msdu_start tlv (1/2) - "
242 "rxpcu_mpdu_filter_in_category: %x "
243 "sw_frame_group_id: %x "
244 "phy_ppdu_id: %x "
245 "msdu_length: %x "
246 "ipsec_esp: %x "
247 "l3_offset: %x "
248 "ipsec_ah: %x "
249 "l4_offset: %x "
250 "msdu_number: %x "
251 "decap_format: %x "
252 "ipv4_proto: %x "
253 "ipv6_proto: %x "
254 "tcp_proto: %x "
255 "udp_proto: %x "
256 "ip_frag: %x "
257 "tcp_only_ack: %x "
258 "da_is_bcast_mcast: %x "
259 "ip4_protocol_ip6_next_header: %x "
260 "toeplitz_hash_2_or_4: %x "
261 "flow_id_toeplitz: %x "
262 "user_rssi: %x "
263 "pkt_type: %x "
264 "stbc: %x "
265 "sgi: %x "
266 "rate_mcs: %x "
267 "receive_bandwidth: %x "
268 "reception_type: %x "
269 "ppdu_start_timestamp: %u ",
270 msdu_start->rxpcu_mpdu_filter_in_category,
271 msdu_start->sw_frame_group_id,
272 msdu_start->phy_ppdu_id,
273 msdu_start->msdu_length,
274 msdu_start->ipsec_esp,
275 msdu_start->l3_offset,
276 msdu_start->ipsec_ah,
277 msdu_start->l4_offset,
278 msdu_start->msdu_number,
279 msdu_start->decap_format,
280 msdu_start->ipv4_proto,
281 msdu_start->ipv6_proto,
282 msdu_start->tcp_proto,
283 msdu_start->udp_proto,
284 msdu_start->ip_frag,
285 msdu_start->tcp_only_ack,
286 msdu_start->da_is_bcast_mcast,
287 msdu_start->ip4_protocol_ip6_next_header,
288 msdu_start->toeplitz_hash_2_or_4,
289 msdu_start->flow_id_toeplitz,
290 msdu_start->user_rssi,
291 msdu_start->pkt_type,
292 msdu_start->stbc,
293 msdu_start->sgi,
294 msdu_start->rate_mcs,
295 msdu_start->receive_bandwidth,
296 msdu_start->reception_type,
297 msdu_start->ppdu_start_timestamp);
298
299 hal_verbose_debug(
300 "rx_msdu_start tlv (2/2) - "
301 "sw_phy_meta_data: %x ",
302 msdu_start->sw_phy_meta_data);
303}
304
305/**
306 * hal_rx_dump_msdu_end_tlv_6490: dump RX msdu_end TLV in structured
307 * human readable format.
308 * @ msdu_end: pointer the msdu_end TLV in pkt.
309 * @ dbg_level: log level.
310 *
311 * Return: void
312 */
313static void hal_rx_dump_msdu_end_tlv_6490(void *msduend,
314 uint8_t dbg_level)
315{
316 struct rx_msdu_end *msdu_end = (struct rx_msdu_end *)msduend;
317
318 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
319 "rx_msdu_end tlv (1/2) - "
320 "rxpcu_mpdu_filter_in_category: %x "
321 "sw_frame_group_id: %x "
322 "phy_ppdu_id: %x "
323 "ip_hdr_chksum: %x "
324 "tcp_udp_chksum: %x "
325 "key_id_octet: %x "
326 "cce_super_rule: %x "
327 "cce_classify_not_done_truncat: %x "
328 "cce_classify_not_done_cce_dis: %x "
329 "ext_wapi_pn_63_48: %x "
330 "ext_wapi_pn_95_64: %x "
331 "ext_wapi_pn_127_96: %x "
332 "reported_mpdu_length: %x "
333 "first_msdu: %x "
334 "last_msdu: %x "
335 "sa_idx_timeout: %x "
336 "da_idx_timeout: %x "
337 "msdu_limit_error: %x "
338 "flow_idx_timeout: %x "
339 "flow_idx_invalid: %x "
340 "wifi_parser_error: %x "
341 "amsdu_parser_error: %x",
342 msdu_end->rxpcu_mpdu_filter_in_category,
343 msdu_end->sw_frame_group_id,
344 msdu_end->phy_ppdu_id,
345 msdu_end->ip_hdr_chksum,
346 msdu_end->tcp_udp_chksum,
347 msdu_end->key_id_octet,
348 msdu_end->cce_super_rule,
349 msdu_end->cce_classify_not_done_truncate,
350 msdu_end->cce_classify_not_done_cce_dis,
351 msdu_end->ext_wapi_pn_63_48,
352 msdu_end->ext_wapi_pn_95_64,
353 msdu_end->ext_wapi_pn_127_96,
354 msdu_end->reported_mpdu_length,
355 msdu_end->first_msdu,
356 msdu_end->last_msdu,
357 msdu_end->sa_idx_timeout,
358 msdu_end->da_idx_timeout,
359 msdu_end->msdu_limit_error,
360 msdu_end->flow_idx_timeout,
361 msdu_end->flow_idx_invalid,
362 msdu_end->wifi_parser_error,
363 msdu_end->amsdu_parser_error);
364
365 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
366 "rx_msdu_end tlv (2/2)- "
367 "sa_is_valid: %x "
368 "da_is_valid: %x "
369 "da_is_mcbc: %x "
370 "l3_header_padding: %x "
371 "ipv6_options_crc: %x "
372 "tcp_seq_number: %x "
373 "tcp_ack_number: %x "
374 "tcp_flag: %x "
375 "lro_eligible: %x "
376 "window_size: %x "
377 "da_offset: %x "
378 "sa_offset: %x "
379 "da_offset_valid: %x "
380 "sa_offset_valid: %x "
381 "rule_indication_31_0: %x "
382 "rule_indication_63_32: %x "
383 "sa_idx: %x "
384 "da_idx: %x "
385 "msdu_drop: %x "
386 "reo_destination_indication: %x "
387 "flow_idx: %x "
388 "fse_metadata: %x "
389 "cce_metadata: %x "
390 "sa_sw_peer_id: %x ",
391 msdu_end->sa_is_valid,
392 msdu_end->da_is_valid,
393 msdu_end->da_is_mcbc,
394 msdu_end->l3_header_padding,
395 msdu_end->ipv6_options_crc,
396 msdu_end->tcp_seq_number,
397 msdu_end->tcp_ack_number,
398 msdu_end->tcp_flag,
399 msdu_end->lro_eligible,
400 msdu_end->window_size,
401 msdu_end->da_offset,
402 msdu_end->sa_offset,
403 msdu_end->da_offset_valid,
404 msdu_end->sa_offset_valid,
405 msdu_end->rule_indication_31_0,
406 msdu_end->rule_indication_63_32,
407 msdu_end->sa_idx,
408 msdu_end->da_idx_or_sw_peer_id,
409 msdu_end->msdu_drop,
410 msdu_end->reo_destination_indication,
411 msdu_end->flow_idx,
412 msdu_end->fse_metadata,
413 msdu_end->cce_metadata,
414 msdu_end->sa_sw_peer_id);
415}
416
417/*
418 * Get tid from RX_MPDU_START
419 */
420#define HAL_RX_MPDU_INFO_TID_GET(_rx_mpdu_info) \
421 (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
422 RX_MPDU_INFO_7_TID_OFFSET)), \
423 RX_MPDU_INFO_7_TID_MASK, \
424 RX_MPDU_INFO_7_TID_LSB))
425
426static uint32_t hal_rx_mpdu_start_tid_get_6490(uint8_t *buf)
427{
428 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
429 struct rx_mpdu_start *mpdu_start =
430 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
431 uint32_t tid;
432
433 tid = HAL_RX_MPDU_INFO_TID_GET(&mpdu_start->rx_mpdu_info_details);
434
435 return tid;
436}
437
438#define HAL_RX_MSDU_START_RECEPTION_TYPE_GET(_rx_msdu_start) \
439 (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start), \
440 RX_MSDU_START_5_RECEPTION_TYPE_OFFSET)), \
441 RX_MSDU_START_5_RECEPTION_TYPE_MASK, \
442 RX_MSDU_START_5_RECEPTION_TYPE_LSB))
443
444/*
445 * hal_rx_msdu_start_reception_type_get(): API to get the reception type
446 * Interval from rx_msdu_start
447 *
448 * @buf: pointer to the start of RX PKT TLV header
449 * Return: uint32_t(reception_type)
450 */
451static
452uint32_t hal_rx_msdu_start_reception_type_get_6490(uint8_t *buf)
453{
454 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
455 struct rx_msdu_start *msdu_start =
456 &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
457 uint32_t reception_type;
458
459 reception_type = HAL_RX_MSDU_START_RECEPTION_TYPE_GET(msdu_start);
460
461 return reception_type;
462}
463
464#define HAL_RX_MSDU_END_DA_IDX_GET(_rx_msdu_end) \
465 (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
466 RX_MSDU_END_11_DA_IDX_OR_SW_PEER_ID_OFFSET)), \
467 RX_MSDU_END_11_DA_IDX_OR_SW_PEER_ID_MASK, \
468 RX_MSDU_END_11_DA_IDX_OR_SW_PEER_ID_LSB))
469
470/**
471 * hal_rx_msdu_end_da_idx_get_6490: API to get da_idx
472 * from rx_msdu_end TLV
473 *
474 * @ buf: pointer to the start of RX PKT TLV headers
475 * Return: da index
476 */
477static uint16_t hal_rx_msdu_end_da_idx_get_6490(uint8_t *buf)
478{
479 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
480 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
481 uint16_t da_idx;
482
483 da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
484
485 return da_idx;
486}
Venkata Sharath Chandra Manchalad1b7e4c2019-09-20 10:01:21 -0700487/**
488 * hal_rx_get_rx_fragment_number_6490(): Function to retrieve rx fragment number
489 *
490 * @nbuf: Network buffer
491 * Returns: rx fragment number
492 */
493static
494uint8_t hal_rx_get_rx_fragment_number_6490(uint8_t *buf)
495{
496 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
497 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
498
499 /* Return first 4 bits as fragment number */
500 return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) &
501 DOT11_SEQ_FRAG_MASK);
502}
503
Venkata Sharath Chandra Manchalaee909382019-09-20 10:52:37 -0700504/**
505 * hal_rx_msdu_end_da_is_mcbc_get_6490(): API to check if pkt is MCBC
506 * from rx_msdu_end TLV
507 *
508 * @ buf: pointer to the start of RX PKT TLV headers
509 * Return: da_is_mcbc
510 */
511static uint8_t
512hal_rx_msdu_end_da_is_mcbc_get_6490(uint8_t *buf)
513{
514 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
515 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
516
517 return HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end);
518}
519
Venkata Sharath Chandra Manchala59ebd5e2019-09-20 15:52:55 -0700520/**
521 * hal_rx_msdu_end_sa_is_valid_get_6490(): API to get_6490 the
522 * sa_is_valid bit from rx_msdu_end TLV
523 *
524 * @ buf: pointer to the start of RX PKT TLV headers
525 * Return: sa_is_valid bit
526 */
527static uint8_t
528hal_rx_msdu_end_sa_is_valid_get_6490(uint8_t *buf)
529{
530 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
531 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
532 uint8_t sa_is_valid;
533
534 sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end);
535
536 return sa_is_valid;
537}
538
Venkata Sharath Chandra Manchala5bf1e5a2019-09-20 16:18:42 -0700539/**
540 * hal_rx_msdu_end_sa_idx_get_6490(): API to get_6490 the
541 * sa_idx from rx_msdu_end TLV
542 *
543 * @ buf: pointer to the start of RX PKT TLV headers
544 * Return: sa_idx (SA AST index)
545 */
546static
547uint16_t hal_rx_msdu_end_sa_idx_get_6490(uint8_t *buf)
548{
549 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
550 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
551 uint16_t sa_idx;
552
553 sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
554
555 return sa_idx;
556}
557
Venkata Sharath Chandra Manchala43d56322019-09-20 16:51:48 -0700558/**
559 * hal_rx_desc_is_first_msdu_6490() - Check if first msdu
560 *
561 * @hal_soc_hdl: hal_soc handle
562 * @hw_desc_addr: hardware descriptor address
563 *
564 * Return: 0 - success/ non-zero failure
565 */
566static uint32_t hal_rx_desc_is_first_msdu_6490(void *hw_desc_addr)
567{
568 struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr;
569 struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end;
570
571 return HAL_RX_GET(msdu_end, RX_MSDU_END_10, FIRST_MSDU);
572}
573
Venkata Sharath Chandra Manchalaf05b2ae2019-09-20 17:25:21 -0700574/**
575 * hal_rx_msdu_end_l3_hdr_padding_get_6490(): API to get_6490 the
576 * l3_header padding from rx_msdu_end TLV
577 *
578 * @ buf: pointer to the start of RX PKT TLV headers
579 * Return: number of l3 header padding bytes
580 */
581static uint32_t hal_rx_msdu_end_l3_hdr_padding_get_6490(uint8_t *buf)
582{
583 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
584 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
585 uint32_t l3_header_padding;
586
587 l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
588
589 return l3_header_padding;
590}
591
Venkata Sharath Chandra Manchalac1a4c8b2019-09-20 17:42:07 -0700592/*
593 * @ hal_rx_encryption_info_valid_6490: Returns encryption type.
594 *
595 * @ buf: rx_tlv_hdr of the received packet
596 * @ Return: encryption type
597 */
598static uint32_t hal_rx_encryption_info_valid_6490(uint8_t *buf)
599{
600 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
601 struct rx_mpdu_start *mpdu_start =
602 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
603 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
604 uint32_t encryption_info = HAL_RX_MPDU_ENCRYPTION_INFO_VALID(mpdu_info);
605
606 return encryption_info;
607}
608
Venkata Sharath Chandra Manchalaa2d74972019-09-20 18:02:57 -0700609/*
610 * @ hal_rx_print_pn_6490: Prints the PN of rx packet.
611 *
612 * @ buf: rx_tlv_hdr of the received packet
613 * @ Return: void
614 */
615static void hal_rx_print_pn_6490(uint8_t *buf)
616{
617 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
618 struct rx_mpdu_start *mpdu_start =
619 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
620 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
621
622 uint32_t pn_31_0 = HAL_RX_MPDU_PN_31_0_GET(mpdu_info);
623 uint32_t pn_63_32 = HAL_RX_MPDU_PN_63_32_GET(mpdu_info);
624 uint32_t pn_95_64 = HAL_RX_MPDU_PN_95_64_GET(mpdu_info);
625 uint32_t pn_127_96 = HAL_RX_MPDU_PN_127_96_GET(mpdu_info);
626
627 hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ",
628 pn_127_96, pn_95_64, pn_63_32, pn_31_0);
629}
630
Venkata Sharath Chandra Manchalacb255b42019-09-21 11:03:38 -0700631/**
632 * hal_rx_msdu_end_first_msdu_get_6490: API to get first msdu status
633 * from rx_msdu_end TLV
634 *
635 * @ buf: pointer to the start of RX PKT TLV headers
636 * Return: first_msdu
637 */
638static uint8_t hal_rx_msdu_end_first_msdu_get_6490(uint8_t *buf)
639{
640 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
641 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
642 uint8_t first_msdu;
643
644 first_msdu = HAL_RX_MSDU_END_FIRST_MSDU_GET(msdu_end);
645
646 return first_msdu;
647}
648
Venkata Sharath Chandra Manchala79055382019-09-21 11:22:30 -0700649/**
650 * hal_rx_msdu_end_da_is_valid_get_6490: API to check if da is valid
651 * from rx_msdu_end TLV
652 *
653 * @ buf: pointer to the start of RX PKT TLV headers
654 * Return: da_is_valid
655 */
656static uint8_t hal_rx_msdu_end_da_is_valid_get_6490(uint8_t *buf)
657{
658 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
659 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
660 uint8_t da_is_valid;
661
662 da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end);
663
664 return da_is_valid;
665}
666
Venkata Sharath Chandra Manchala55f2d922019-09-21 11:37:01 -0700667/**
668 * hal_rx_msdu_end_last_msdu_get_6490: API to get last msdu status
669 * from rx_msdu_end TLV
670 *
671 * @ buf: pointer to the start of RX PKT TLV headers
672 * Return: last_msdu
673 */
674static uint8_t hal_rx_msdu_end_last_msdu_get_6490(uint8_t *buf)
675{
676 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
677 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
678 uint8_t last_msdu;
679
680 last_msdu = HAL_RX_MSDU_END_LAST_MSDU_GET(msdu_end);
681
682 return last_msdu;
683}
684
Venkata Sharath Chandra Manchala2a52d342019-09-21 11:52:54 -0700685/*
686 * hal_rx_get_mpdu_mac_ad4_valid_6490(): Retrieves if mpdu 4th addr is valid
687 *
688 * @nbuf: Network buffer
689 * Returns: value of mpdu 4th address valid field
690 */
691static bool hal_rx_get_mpdu_mac_ad4_valid_6490(uint8_t *buf)
692{
693 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
694 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
695 bool ad4_valid = 0;
696
697 ad4_valid = HAL_RX_MPDU_GET_MAC_AD4_VALID(rx_mpdu_info);
698
699 return ad4_valid;
700}
701
Venkata Sharath Chandra Manchala96ed6232019-09-21 12:11:19 -0700702/**
703 * hal_rx_mpdu_start_sw_peer_id_get_6490: Retrieve sw peer_id
704 * @buf: network buffer
705 *
706 * Return: sw peer_id
707 */
708static uint32_t hal_rx_mpdu_start_sw_peer_id_get_6490(uint8_t *buf)
709{
710 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
711 struct rx_mpdu_start *mpdu_start =
712 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
713
714 return HAL_RX_MPDU_INFO_SW_PEER_ID_GET(
715 &mpdu_start->rx_mpdu_info_details);
716}
717
Venkata Sharath Chandra Manchalae7924fd2019-09-21 12:44:52 -0700718/**
719 * hal_rx_mpdu_get_to_ds_6490(): API to get the tods info
720 * from rx_mpdu_start
721 *
722 * @buf: pointer to the start of RX PKT TLV header
723 * Return: uint32_t(to_ds)
724 */
725static uint32_t hal_rx_mpdu_get_to_ds_6490(uint8_t *buf)
726{
727 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
728 struct rx_mpdu_start *mpdu_start =
729 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
730
731 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
732
733 return HAL_RX_MPDU_GET_TODS(mpdu_info);
734}
735
Venkata Sharath Chandra Manchala1e3a4792019-09-21 13:15:09 -0700736/*
737 * hal_rx_mpdu_get_fr_ds_6490(): API to get the from ds info
738 * from rx_mpdu_start
739 *
740 * @buf: pointer to the start of RX PKT TLV header
741 * Return: uint32_t(fr_ds)
742 */
743static uint32_t hal_rx_mpdu_get_fr_ds_6490(uint8_t *buf)
744{
745 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
746 struct rx_mpdu_start *mpdu_start =
747 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
748
749 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
750
751 return HAL_RX_MPDU_GET_FROMDS(mpdu_info);
752}
753
Venkata Sharath Chandra Manchala25ba7b82019-09-21 13:31:30 -0700754/*
755 * hal_rx_get_mpdu_frame_control_valid_6490(): Retrieves mpdu
756 * frame control valid
757 *
758 * @nbuf: Network buffer
759 * Returns: value of frame control valid field
760 */
761static uint8_t hal_rx_get_mpdu_frame_control_valid_6490(uint8_t *buf)
762{
763 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
764 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
765
766 return HAL_RX_MPDU_GET_FRAME_CONTROL_VALID(rx_mpdu_info);
767}
768
Venkata Sharath Chandra Manchalae3ae3192019-09-21 13:59:46 -0700769/*
770 * hal_rx_mpdu_get_addr1_6490(): API to check get address1 of the mpdu
771 *
772 * @buf: pointer to the start of RX PKT TLV headera
773 * @mac_addr: pointer to mac address
774 * Return: success/failure
775 */
776static QDF_STATUS hal_rx_mpdu_get_addr1_6490(uint8_t *buf, uint8_t *mac_addr)
777{
778 struct __attribute__((__packed__)) hal_addr1 {
779 uint32_t ad1_31_0;
780 uint16_t ad1_47_32;
781 };
782
783 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
784 struct rx_mpdu_start *mpdu_start =
785 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
786
787 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
788 struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
789 uint32_t mac_addr_ad1_valid;
790
791 mac_addr_ad1_valid = HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(mpdu_info);
792
793 if (mac_addr_ad1_valid) {
794 addr->ad1_31_0 = HAL_RX_MPDU_AD1_31_0_GET(mpdu_info);
795 addr->ad1_47_32 = HAL_RX_MPDU_AD1_47_32_GET(mpdu_info);
796 return QDF_STATUS_SUCCESS;
797 }
798
799 return QDF_STATUS_E_FAILURE;
800}
Venkata Sharath Chandra Manchalaa81a2fe2019-09-21 14:29:40 -0700801
802/*
803 * hal_rx_mpdu_get_addr2_6490(): API to check get address2 of the mpdu
804 * in the packet
805 *
806 * @buf: pointer to the start of RX PKT TLV header
807 * @mac_addr: pointer to mac address
808 * Return: success/failure
809 */
810static QDF_STATUS hal_rx_mpdu_get_addr2_6490(uint8_t *buf,
811 uint8_t *mac_addr)
812{
813 struct __attribute__((__packed__)) hal_addr2 {
814 uint16_t ad2_15_0;
815 uint32_t ad2_47_16;
816 };
817
818 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
819 struct rx_mpdu_start *mpdu_start =
820 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
821
822 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
823 struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
824 uint32_t mac_addr_ad2_valid;
825
826 mac_addr_ad2_valid = HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(mpdu_info);
827
828 if (mac_addr_ad2_valid) {
829 addr->ad2_15_0 = HAL_RX_MPDU_AD2_15_0_GET(mpdu_info);
830 addr->ad2_47_16 = HAL_RX_MPDU_AD2_47_16_GET(mpdu_info);
831 return QDF_STATUS_SUCCESS;
832 }
833
834 return QDF_STATUS_E_FAILURE;
835}
Venkata Sharath Chandra Manchala7c868252019-09-21 14:58:34 -0700836
837/*
838 * hal_rx_mpdu_get_addr3_6490(): API to get address3 of the mpdu
839 * in the packet
840 *
841 * @buf: pointer to the start of RX PKT TLV header
842 * @mac_addr: pointer to mac address
843 * Return: success/failure
844 */
845static QDF_STATUS hal_rx_mpdu_get_addr3_6490(uint8_t *buf, uint8_t *mac_addr)
846{
847 struct __attribute__((__packed__)) hal_addr3 {
848 uint32_t ad3_31_0;
849 uint16_t ad3_47_32;
850 };
851
852 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
853 struct rx_mpdu_start *mpdu_start =
854 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
855
856 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
857 struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
858 uint32_t mac_addr_ad3_valid;
859
860 mac_addr_ad3_valid = HAL_RX_MPDU_MAC_ADDR_AD3_VALID_GET(mpdu_info);
861
862 if (mac_addr_ad3_valid) {
863 addr->ad3_31_0 = HAL_RX_MPDU_AD3_31_0_GET(mpdu_info);
864 addr->ad3_47_32 = HAL_RX_MPDU_AD3_47_32_GET(mpdu_info);
865 return QDF_STATUS_SUCCESS;
866 }
867
868 return QDF_STATUS_E_FAILURE;
869}
870
Venkata Sharath Chandra Manchalaaa762832019-09-21 15:13:47 -0700871/*
872 * hal_rx_mpdu_get_addr4_6490(): API to get address4 of the mpdu
873 * in the packet
874 *
875 * @buf: pointer to the start of RX PKT TLV header
876 * @mac_addr: pointer to mac address
877 * Return: success/failure
878 */
879static QDF_STATUS hal_rx_mpdu_get_addr4_6490(uint8_t *buf, uint8_t *mac_addr)
880{
881 struct __attribute__((__packed__)) hal_addr4 {
882 uint32_t ad4_31_0;
883 uint16_t ad4_47_32;
884 };
885
886 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
887 struct rx_mpdu_start *mpdu_start =
888 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
889
890 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
891 struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
892 uint32_t mac_addr_ad4_valid;
893
894 mac_addr_ad4_valid = HAL_RX_MPDU_MAC_ADDR_AD4_VALID_GET(mpdu_info);
895
896 if (mac_addr_ad4_valid) {
897 addr->ad4_31_0 = HAL_RX_MPDU_AD4_31_0_GET(mpdu_info);
898 addr->ad4_47_32 = HAL_RX_MPDU_AD4_47_32_GET(mpdu_info);
899 return QDF_STATUS_SUCCESS;
900 }
901
902 return QDF_STATUS_E_FAILURE;
903}
Venkata Sharath Chandra Manchala68d6f0d2019-09-21 15:33:47 -0700904
905/*
906 * hal_rx_get_mpdu_sequence_control_valid_6490(): Get mpdu
907 * sequence control valid
908 *
909 * @nbuf: Network buffer
910 * Returns: value of sequence control valid field
911 */
912static uint8_t hal_rx_get_mpdu_sequence_control_valid_6490(uint8_t *buf)
913{
914 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
915 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
916
917 return HAL_RX_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_mpdu_info);
918}
Venkata Sharath Chandra Manchala5ddc5182019-09-21 15:53:03 -0700919
920/**
921 * hal_rx_is_unicast_6490: check packet is unicast frame or not.
922 *
923 * @ buf: pointer to rx pkt TLV.
924 *
925 * Return: true on unicast.
926 */
927static bool hal_rx_is_unicast_6490(uint8_t *buf)
928{
929 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
930 struct rx_mpdu_start *mpdu_start =
931 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
932 uint32_t grp_id;
933 uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
934
935 grp_id = (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
936 RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_OFFSET)),
937 RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_MASK,
938 RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_LSB));
939
940 return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
941}
Venkata Sharath Chandra Manchala85130482019-09-21 16:17:01 -0700942
943/**
944 * hal_rx_tid_get_6490: get tid based on qos control valid.
945 * @hal_soc_hdl: hal_soc handle
946 * @ buf: pointer to rx pkt TLV.
947 *
948 * Return: tid
949 */
950static uint32_t hal_rx_tid_get_6490(hal_soc_handle_t hal_soc_hdl, uint8_t *buf)
951{
952 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
953 struct rx_mpdu_start *mpdu_start =
954 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
955 uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
956 uint8_t qos_control_valid =
957 (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
958 RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_OFFSET)),
959 RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_MASK,
960 RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_LSB));
961
962 if (qos_control_valid)
963 return hal_rx_mpdu_start_tid_get_6490(buf);
964
965 return HAL_RX_NON_QOS_TID;
966}
Venkata Sharath Chandra Manchala84d50922019-09-21 16:48:04 -0700967
968/**
969 * hal_rx_hw_desc_get_ppduid_get_6490(): retrieve ppdu id
970 * @hw_desc_addr: hw addr
971 *
972 * Return: ppdu id
973 */
974static uint32_t hal_rx_hw_desc_get_ppduid_get_6490(void *hw_desc_addr)
975{
976 struct rx_mpdu_info *rx_mpdu_info;
977 struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
978
979 rx_mpdu_info =
980 &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
981
982 return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_9, PHY_PPDU_ID);
983}
Venkata Sharath Chandra Manchala25d7dbc2019-09-21 17:56:41 -0700984
985/**
986 * hal_reo_status_get_header_6490 - Process reo desc info
987 * @d - Pointer to reo descriptior
988 * @b - tlv type info
989 * @h1 - Pointer to hal_reo_status_header where info to be stored
990 *
991 * Return - none.
992 *
993 */
994static void hal_reo_status_get_header_6490(uint32_t *d, int b, void *h1)
995{
996 uint32_t val1 = 0;
997 struct hal_reo_status_header *h =
998 (struct hal_reo_status_header *)h1;
999
1000 switch (b) {
1001 case HAL_REO_QUEUE_STATS_STATUS_TLV:
1002 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_0,
1003 STATUS_HEADER_REO_STATUS_NUMBER)];
1004 break;
1005 case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1006 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_0,
1007 STATUS_HEADER_REO_STATUS_NUMBER)];
1008 break;
1009 case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1010 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_0,
1011 STATUS_HEADER_REO_STATUS_NUMBER)];
1012 break;
1013 case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1014 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_0,
1015 STATUS_HEADER_REO_STATUS_NUMBER)];
1016 break;
1017 case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1018 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_0,
1019 STATUS_HEADER_REO_STATUS_NUMBER)];
1020 break;
1021 case HAL_REO_DESC_THRES_STATUS_TLV:
1022 val1 =
1023 d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_0,
1024 STATUS_HEADER_REO_STATUS_NUMBER)];
1025 break;
1026 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1027 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_0,
1028 STATUS_HEADER_REO_STATUS_NUMBER)];
1029 break;
1030 default:
1031 qdf_nofl_err("ERROR: Unknown tlv\n");
1032 break;
1033 }
1034 h->cmd_num =
1035 HAL_GET_FIELD(
1036 UNIFORM_REO_STATUS_HEADER_0, REO_STATUS_NUMBER,
1037 val1);
1038 h->exec_time =
1039 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1040 CMD_EXECUTION_TIME, val1);
1041 h->status =
1042 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1043 REO_CMD_EXECUTION_STATUS, val1);
1044 switch (b) {
1045 case HAL_REO_QUEUE_STATS_STATUS_TLV:
1046 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_1,
1047 STATUS_HEADER_TIMESTAMP)];
1048 break;
1049 case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1050 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_1,
1051 STATUS_HEADER_TIMESTAMP)];
1052 break;
1053 case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1054 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_1,
1055 STATUS_HEADER_TIMESTAMP)];
1056 break;
1057 case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1058 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_1,
1059 STATUS_HEADER_TIMESTAMP)];
1060 break;
1061 case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1062 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_1,
1063 STATUS_HEADER_TIMESTAMP)];
1064 break;
1065 case HAL_REO_DESC_THRES_STATUS_TLV:
1066 val1 =
1067 d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_1,
1068 STATUS_HEADER_TIMESTAMP)];
1069 break;
1070 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1071 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_1,
1072 STATUS_HEADER_TIMESTAMP)];
1073 break;
1074 default:
1075 qdf_nofl_err("ERROR: Unknown tlv\n");
1076 break;
1077 }
1078 h->tstamp =
1079 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_1, TIMESTAMP, val1);
1080}
Venkata Sharath Chandra Manchala56022cb2019-09-21 18:17:21 -07001081
Venkata Sharath Chandra Manchala38e84d22019-09-21 18:59:21 -07001082/**
1083 * hal_tx_desc_set_mesh_en_6490 - Set mesh_enable flag in Tx descriptor
1084 * @desc: Handle to Tx Descriptor
1085 * @en: For raw WiFi frames, this indicates transmission to a mesh STA,
1086 * enabling the interpretation of the 'Mesh Control Present' bit
1087 * (bit 8) of QoS Control (otherwise this bit is ignored),
1088 * For native WiFi frames, this indicates that a 'Mesh Control' field
1089 * is present between the header and the LLC.
1090 *
1091 * Return: void
1092 */
1093static inline
1094void hal_tx_desc_set_mesh_en_6490(void *desc, uint8_t en)
1095{
1096 HAL_SET_FLD(desc, TCL_DATA_CMD_5, MESH_ENABLE) |=
1097 HAL_TX_SM(TCL_DATA_CMD_5, MESH_ENABLE, en);
1098}
1099
Venkata Sharath Chandra Manchala82272402019-09-23 14:16:41 -07001100static
1101void *hal_rx_msdu0_buffer_addr_lsb_6490(void *link_desc_va)
1102{
1103 return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
1104}
1105
1106static
1107void *hal_rx_msdu_desc_info_ptr_get_6490(void *msdu0)
1108{
1109 return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
1110}
1111
1112static
1113void *hal_ent_mpdu_desc_info_6490(void *ent_ring_desc)
1114{
1115 return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
1116}
1117
1118static
1119void *hal_dst_mpdu_desc_info_6490(void *dst_ring_desc)
1120{
1121 return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
1122}
1123
Venkata Sharath Chandra Manchalab7d2df12019-09-23 15:20:06 -07001124static
1125uint8_t hal_rx_get_fc_valid_6490(uint8_t *buf)
1126{
1127 return HAL_RX_GET_FC_VALID(buf);
1128}
1129
1130static uint8_t hal_rx_get_to_ds_flag_6490(uint8_t *buf)
1131{
1132 return HAL_RX_GET_TO_DS_FLAG(buf);
1133}
1134
1135static uint8_t hal_rx_get_mac_addr2_valid_6490(uint8_t *buf)
1136{
1137 return HAL_RX_GET_MAC_ADDR2_VALID(buf);
1138}
1139
1140static uint8_t hal_rx_get_filter_category_6490(uint8_t *buf)
1141{
1142 return HAL_RX_GET_FILTER_CATEGORY(buf);
1143}
1144
1145static uint32_t
1146hal_rx_get_ppdu_id_6490(uint8_t *buf)
1147{
1148 return HAL_RX_GET_PPDU_ID(buf);
1149}
1150
Venkata Sharath Chandra Manchala222b2532019-09-23 17:16:51 -07001151/**
1152 * hal_reo_config_6490(): Set reo config parameters
1153 * @soc: hal soc handle
1154 * @reg_val: value to be set
1155 * @reo_params: reo parameters
1156 *
1157 * Return: void
1158 */
1159static
1160void hal_reo_config_6490(struct hal_soc *soc,
1161 uint32_t reg_val,
1162 struct hal_reo_params *reo_params)
1163{
1164 HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
1165}
1166
1167/**
1168 * hal_rx_msdu_desc_info_get_ptr_6490() - Get msdu desc info ptr
1169 * @msdu_details_ptr - Pointer to msdu_details_ptr
1170 *
1171 * Return - Pointer to rx_msdu_desc_info structure.
1172 *
1173 */
1174static void *hal_rx_msdu_desc_info_get_ptr_6490(void *msdu_details_ptr)
1175{
1176 return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
1177}
1178
1179/**
1180 * hal_rx_link_desc_msdu0_ptr_6490 - Get pointer to rx_msdu details
1181 * @link_desc - Pointer to link desc
1182 *
1183 * Return - Pointer to rx_msdu_details structure
1184 *
1185 */
1186static void *hal_rx_link_desc_msdu0_ptr_6490(void *link_desc)
1187{
1188 return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
1189}
Venkata Sharath Chandra Manchalac9a4e142019-09-25 11:20:23 -07001190
1191/**
1192 * hal_rx_msdu_flow_idx_get_6490: API to get flow index
1193 * from rx_msdu_end TLV
1194 * @buf: pointer to the start of RX PKT TLV headers
1195 *
1196 * Return: flow index value from MSDU END TLV
1197 */
1198static inline uint32_t hal_rx_msdu_flow_idx_get_6490(uint8_t *buf)
1199{
1200 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1201 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1202
1203 return HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end);
1204}
1205
Venkata Sharath Chandra Manchalab9a85362019-09-25 11:42:07 -07001206/**
1207 * hal_rx_msdu_flow_idx_invalid_6490: API to get flow index invalid
1208 * from rx_msdu_end TLV
1209 * @buf: pointer to the start of RX PKT TLV headers
1210 *
1211 * Return: flow index invalid value from MSDU END TLV
1212 */
1213static bool hal_rx_msdu_flow_idx_invalid_6490(uint8_t *buf)
1214{
1215 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1216 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1217
1218 return HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end);
1219}
1220
Venkata Sharath Chandra Manchalab5ec9d22019-09-25 12:07:09 -07001221/**
1222 * hal_rx_msdu_flow_idx_timeout_6490: API to get flow index timeout
1223 * from rx_msdu_end TLV
1224 * @buf: pointer to the start of RX PKT TLV headers
1225 *
1226 * Return: flow index timeout value from MSDU END TLV
1227 */
1228static bool hal_rx_msdu_flow_idx_timeout_6490(uint8_t *buf)
1229{
1230 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1231 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1232
1233 return HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end);
1234}
1235
Venkata Sharath Chandra Manchala905312e2019-09-25 12:30:34 -07001236/**
1237 * hal_rx_msdu_fse_metadata_get_6490: API to get FSE metadata
1238 * from rx_msdu_end TLV
1239 * @buf: pointer to the start of RX PKT TLV headers
1240 *
1241 * Return: fse metadata value from MSDU END TLV
1242 */
1243static uint32_t hal_rx_msdu_fse_metadata_get_6490(uint8_t *buf)
1244{
1245 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1246 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1247
1248 return HAL_RX_MSDU_END_FSE_METADATA_GET(msdu_end);
1249}
1250
Venkata Sharath Chandra Manchala8fc894a2019-09-25 12:50:14 -07001251/**
1252 * hal_rx_msdu_cce_metadata_get_6490: API to get CCE metadata
1253 * from rx_msdu_end TLV
1254 * @buf: pointer to the start of RX PKT TLV headers
1255 *
1256 * Return: cce_metadata
1257 */
1258static uint16_t
1259hal_rx_msdu_cce_metadata_get_6490(uint8_t *buf)
1260{
1261 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1262 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1263
1264 return HAL_RX_MSDU_END_CCE_METADATA_GET(msdu_end);
1265}
1266
Venkata Sharath Chandra Manchala5c5d4092019-09-25 13:31:51 -07001267/**
1268 * hal_rx_tlv_get_tcp_chksum_6490() - API to get tcp checksum
1269 * @buf: rx_tlv_hdr
1270 *
1271 * Return: tcp checksum
1272 */
1273static uint16_t
1274hal_rx_tlv_get_tcp_chksum_6490(uint8_t *buf)
1275{
1276 return HAL_RX_TLV_GET_TCP_CHKSUM(buf);
1277}
1278
Venkata Sharath Chandra Manchala36fd40a2019-09-25 19:00:14 -07001279/**
1280 * hal_rx_get_rx_sequence_6490(): Function to retrieve rx sequence number
1281 *
1282 * @nbuf: Network buffer
1283 * Returns: rx sequence number
1284 */
1285static
1286uint16_t hal_rx_get_rx_sequence_6490(uint8_t *buf)
1287{
1288 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
1289 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
1290
1291 return HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info);
1292}
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -07001293
1294struct hal_hw_txrx_ops qca6490_hal_hw_txrx_ops = {
1295 /* init and setup */
1296 hal_srng_dst_hw_init_generic,
1297 hal_srng_src_hw_init_generic,
1298 hal_get_hw_hptp_generic,
1299 hal_reo_setup_generic,
1300 hal_setup_link_idle_list_generic,
1301
1302 /* tx */
1303 hal_tx_desc_set_dscp_tid_table_id_6490,
1304 hal_tx_set_dscp_tid_map_6490,
1305 hal_tx_update_dscp_tid_6490,
1306 hal_tx_desc_set_lmac_id_6490,
1307 hal_tx_desc_set_buf_addr_generic,
1308 hal_tx_desc_set_search_type_generic,
1309 hal_tx_desc_set_search_index_generic,
1310 hal_tx_desc_set_cache_set_num_generic,
1311 hal_tx_comp_get_status_generic,
1312 hal_tx_comp_get_release_reason_generic,
1313 hal_tx_desc_set_mesh_en_6490,
1314
1315 /* rx */
1316 hal_rx_msdu_start_nss_get_6490,
1317 hal_rx_mon_hw_desc_get_mpdu_status_6490,
1318 hal_rx_get_tlv_6490,
1319 hal_rx_proc_phyrx_other_receive_info_tlv_6490,
1320 hal_rx_dump_msdu_start_tlv_6490,
1321 hal_rx_dump_msdu_end_tlv_6490,
1322 hal_get_link_desc_size_6490,
1323 hal_rx_mpdu_start_tid_get_6490,
1324 hal_rx_msdu_start_reception_type_get_6490,
1325 hal_rx_msdu_end_da_idx_get_6490,
1326 hal_rx_msdu_desc_info_get_ptr_6490,
1327 hal_rx_link_desc_msdu0_ptr_6490,
1328 hal_reo_status_get_header_6490,
1329 hal_rx_status_get_tlv_info_generic,
1330 hal_rx_wbm_err_info_get_generic,
1331 hal_rx_dump_mpdu_start_tlv_generic,
1332
1333 hal_tx_set_pcp_tid_map_generic,
1334 hal_tx_update_pcp_tid_generic,
1335 hal_tx_update_tidmap_prty_generic,
Venkata Sharath Chandra Manchalad1b7e4c2019-09-20 10:01:21 -07001336 hal_rx_get_rx_fragment_number_6490,
Venkata Sharath Chandra Manchalaee909382019-09-20 10:52:37 -07001337 hal_rx_msdu_end_da_is_mcbc_get_6490,
Venkata Sharath Chandra Manchala59ebd5e2019-09-20 15:52:55 -07001338 hal_rx_msdu_end_sa_is_valid_get_6490,
Venkata Sharath Chandra Manchala36fd40a2019-09-25 19:00:14 -07001339 hal_rx_msdu_end_sa_idx_get_6490,
Venkata Sharath Chandra Manchala43d56322019-09-20 16:51:48 -07001340 hal_rx_desc_is_first_msdu_6490,
Venkata Sharath Chandra Manchalaf05b2ae2019-09-20 17:25:21 -07001341 hal_rx_msdu_end_l3_hdr_padding_get_6490,
Venkata Sharath Chandra Manchalac1a4c8b2019-09-20 17:42:07 -07001342 hal_rx_encryption_info_valid_6490,
Venkata Sharath Chandra Manchalaa2d74972019-09-20 18:02:57 -07001343 hal_rx_print_pn_6490,
Venkata Sharath Chandra Manchalacb255b42019-09-21 11:03:38 -07001344 hal_rx_msdu_end_first_msdu_get_6490,
Venkata Sharath Chandra Manchala79055382019-09-21 11:22:30 -07001345 hal_rx_msdu_end_da_is_valid_get_6490,
Venkata Sharath Chandra Manchala55f2d922019-09-21 11:37:01 -07001346 hal_rx_msdu_end_last_msdu_get_6490,
Venkata Sharath Chandra Manchala2a52d342019-09-21 11:52:54 -07001347 hal_rx_get_mpdu_mac_ad4_valid_6490,
Venkata Sharath Chandra Manchala96ed6232019-09-21 12:11:19 -07001348 hal_rx_mpdu_start_sw_peer_id_get_6490,
Venkata Sharath Chandra Manchalae7924fd2019-09-21 12:44:52 -07001349 hal_rx_mpdu_get_to_ds_6490,
Venkata Sharath Chandra Manchala1e3a4792019-09-21 13:15:09 -07001350 hal_rx_mpdu_get_fr_ds_6490,
Venkata Sharath Chandra Manchala25ba7b82019-09-21 13:31:30 -07001351 hal_rx_get_mpdu_frame_control_valid_6490,
Venkata Sharath Chandra Manchalae3ae3192019-09-21 13:59:46 -07001352 hal_rx_mpdu_get_addr1_6490,
Venkata Sharath Chandra Manchalaa81a2fe2019-09-21 14:29:40 -07001353 hal_rx_mpdu_get_addr2_6490,
Venkata Sharath Chandra Manchala7c868252019-09-21 14:58:34 -07001354 hal_rx_mpdu_get_addr3_6490,
Venkata Sharath Chandra Manchalaaa762832019-09-21 15:13:47 -07001355 hal_rx_mpdu_get_addr4_6490,
Venkata Sharath Chandra Manchala68d6f0d2019-09-21 15:33:47 -07001356 hal_rx_get_mpdu_sequence_control_valid_6490,
Venkata Sharath Chandra Manchala5ddc5182019-09-21 15:53:03 -07001357 hal_rx_is_unicast_6490,
Venkata Sharath Chandra Manchala85130482019-09-21 16:17:01 -07001358 hal_rx_tid_get_6490,
Venkata Sharath Chandra Manchala84d50922019-09-21 16:48:04 -07001359 hal_rx_hw_desc_get_ppduid_get_6490,
Venkata Sharath Chandra Manchala56022cb2019-09-21 18:17:21 -07001360 NULL,
Venkata Sharath Chandra Manchala685045e2019-09-21 18:32:51 -07001361 NULL,
Venkata Sharath Chandra Manchala82272402019-09-23 14:16:41 -07001362 hal_rx_msdu0_buffer_addr_lsb_6490,
1363 hal_rx_msdu_desc_info_ptr_get_6490,
1364 hal_ent_mpdu_desc_info_6490,
1365 hal_dst_mpdu_desc_info_6490,
Venkata Sharath Chandra Manchalab7d2df12019-09-23 15:20:06 -07001366 hal_rx_get_fc_valid_6490,
1367 hal_rx_get_to_ds_flag_6490,
1368 hal_rx_get_mac_addr2_valid_6490,
1369 hal_rx_get_filter_category_6490,
1370 hal_rx_get_ppdu_id_6490,
Venkata Sharath Chandra Manchala222b2532019-09-23 17:16:51 -07001371 hal_reo_config_6490,
Venkata Sharath Chandra Manchalac9a4e142019-09-25 11:20:23 -07001372 hal_rx_msdu_flow_idx_get_6490,
Venkata Sharath Chandra Manchalab9a85362019-09-25 11:42:07 -07001373 hal_rx_msdu_flow_idx_invalid_6490,
Venkata Sharath Chandra Manchalab5ec9d22019-09-25 12:07:09 -07001374 hal_rx_msdu_flow_idx_timeout_6490,
Venkata Sharath Chandra Manchala905312e2019-09-25 12:30:34 -07001375 hal_rx_msdu_fse_metadata_get_6490,
Venkata Sharath Chandra Manchala8fc894a2019-09-25 12:50:14 -07001376 hal_rx_msdu_cce_metadata_get_6490,
Venkata Sharath Chandra Manchala1059fae2019-09-25 13:00:36 -07001377 NULL,
Venkata Sharath Chandra Manchala5c5d4092019-09-25 13:31:51 -07001378 hal_rx_tlv_get_tcp_chksum_6490,
Venkata Sharath Chandra Manchala36fd40a2019-09-25 19:00:14 -07001379 hal_rx_get_rx_sequence_6490,
Venkata Sharath Chandra Manchalad1b7e4c2019-09-20 10:01:21 -07001380};
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -07001381
1382struct hal_hw_srng_config hw_srng_table_6490[] = {
1383 /* TODO: max_rings can populated by querying HW capabilities */
1384 { /* REO_DST */
1385 .start_ring_id = HAL_SRNG_REO2SW1,
1386 .max_rings = 4,
1387 .entry_size = sizeof(struct reo_destination_ring) >> 2,
1388 .lmac_ring = FALSE,
1389 .ring_dir = HAL_SRNG_DST_RING,
1390 .reg_start = {
1391 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
1392 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1393 HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
1394 SEQ_WCSS_UMAC_REO_REG_OFFSET)
1395 },
1396 .reg_size = {
1397 HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
1398 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
1399 HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
1400 HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
1401 },
1402 .max_size =
1403 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
1404 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
1405 },
1406 { /* REO_EXCEPTION */
1407 /* Designating REO2TCL ring as exception ring. This ring is
1408 * similar to other REO2SW rings though it is named as REO2TCL.
1409 * Any of theREO2SW rings can be used as exception ring.
1410 */
1411 .start_ring_id = HAL_SRNG_REO2TCL,
1412 .max_rings = 1,
1413 .entry_size = sizeof(struct reo_destination_ring) >> 2,
1414 .lmac_ring = FALSE,
1415 .ring_dir = HAL_SRNG_DST_RING,
1416 .reg_start = {
1417 HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
1418 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1419 HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
1420 SEQ_WCSS_UMAC_REO_REG_OFFSET)
1421 },
1422 /* Single ring - provide ring size if multiple rings of this
1423 * type are supported
1424 */
1425 .reg_size = {},
1426 .max_size =
1427 HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
1428 HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
1429 },
1430 { /* REO_REINJECT */
1431 .start_ring_id = HAL_SRNG_SW2REO,
1432 .max_rings = 1,
1433 .entry_size = sizeof(struct reo_entrance_ring) >> 2,
1434 .lmac_ring = FALSE,
1435 .ring_dir = HAL_SRNG_SRC_RING,
1436 .reg_start = {
1437 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
1438 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1439 HWIO_REO_R2_SW2REO_RING_HP_ADDR(
1440 SEQ_WCSS_UMAC_REO_REG_OFFSET)
1441 },
1442 /* Single ring - provide ring size if multiple rings of this
1443 * type are supported
1444 */
1445 .reg_size = {},
1446 .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
1447 HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
1448 },
1449 { /* REO_CMD */
1450 .start_ring_id = HAL_SRNG_REO_CMD,
1451 .max_rings = 1,
1452 .entry_size = (sizeof(struct tlv_32_hdr) +
1453 sizeof(struct reo_get_queue_stats)) >> 2,
1454 .lmac_ring = FALSE,
1455 .ring_dir = HAL_SRNG_SRC_RING,
1456 .reg_start = {
1457 HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
1458 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1459 HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
1460 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1461 },
1462 /* Single ring - provide ring size if multiple rings of this
1463 * type are supported
1464 */
1465 .reg_size = {},
1466 .max_size =
1467 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
1468 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
1469 },
1470 { /* REO_STATUS */
1471 .start_ring_id = HAL_SRNG_REO_STATUS,
1472 .max_rings = 1,
1473 .entry_size = (sizeof(struct tlv_32_hdr) +
1474 sizeof(struct reo_get_queue_stats_status)) >> 2,
1475 .lmac_ring = FALSE,
1476 .ring_dir = HAL_SRNG_DST_RING,
1477 .reg_start = {
1478 HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
1479 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1480 HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
1481 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1482 },
1483 /* Single ring - provide ring size if multiple rings of this
1484 * type are supported
1485 */
1486 .reg_size = {},
1487 .max_size =
1488 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
1489 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
1490 },
1491 { /* TCL_DATA */
1492 .start_ring_id = HAL_SRNG_SW2TCL1,
1493 .max_rings = 3,
1494 .entry_size = (sizeof(struct tlv_32_hdr) +
1495 sizeof(struct tcl_data_cmd)) >> 2,
1496 .lmac_ring = FALSE,
1497 .ring_dir = HAL_SRNG_SRC_RING,
1498 .reg_start = {
1499 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
1500 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1501 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
1502 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1503 },
1504 .reg_size = {
1505 HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
1506 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
1507 HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
1508 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
1509 },
1510 .max_size =
1511 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
1512 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
1513 },
1514 { /* TCL_CMD */
1515 .start_ring_id = HAL_SRNG_SW2TCL_CMD,
1516 .max_rings = 1,
1517 .entry_size = (sizeof(struct tlv_32_hdr) +
1518 sizeof(struct tcl_gse_cmd)) >> 2,
1519 .lmac_ring = FALSE,
1520 .ring_dir = HAL_SRNG_SRC_RING,
1521 .reg_start = {
1522 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
1523 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1524 HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
1525 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1526 },
1527 /* Single ring - provide ring size if multiple rings of this
1528 * type are supported
1529 */
1530 .reg_size = {},
1531 .max_size =
1532 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
1533 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
1534 },
1535 { /* TCL_STATUS */
1536 .start_ring_id = HAL_SRNG_TCL_STATUS,
1537 .max_rings = 1,
1538 .entry_size = (sizeof(struct tlv_32_hdr) +
1539 sizeof(struct tcl_status_ring)) >> 2,
1540 .lmac_ring = FALSE,
1541 .ring_dir = HAL_SRNG_DST_RING,
1542 .reg_start = {
1543 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
1544 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1545 HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
1546 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1547 },
1548 /* Single ring - provide ring size if multiple rings of this
1549 * type are supported
1550 */
1551 .reg_size = {},
1552 .max_size =
1553 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
1554 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
1555 },
1556 { /* CE_SRC */
1557 .start_ring_id = HAL_SRNG_CE_0_SRC,
1558 .max_rings = 12,
1559 .entry_size = sizeof(struct ce_src_desc) >> 2,
1560 .lmac_ring = FALSE,
1561 .ring_dir = HAL_SRNG_SRC_RING,
1562 .reg_start = {
1563 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
1564 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
1565 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
1566 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
1567 },
1568 .reg_size = {
1569 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
1570 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
1571 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
1572 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
1573 },
1574 .max_size =
1575 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
1576 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
1577 },
1578 { /* CE_DST */
1579 .start_ring_id = HAL_SRNG_CE_0_DST,
1580 .max_rings = 12,
1581 .entry_size = 8 >> 2,
1582 /*TODO: entry_size above should actually be
1583 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
1584 * of struct ce_dst_desc in HW header files
1585 */
1586 .lmac_ring = FALSE,
1587 .ring_dir = HAL_SRNG_SRC_RING,
1588 .reg_start = {
1589 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
1590 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1591 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
1592 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1593 },
1594 .reg_size = {
1595 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1596 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1597 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1598 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1599 },
1600 .max_size =
1601 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
1602 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
1603 },
1604 { /* CE_DST_STATUS */
1605 .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
1606 .max_rings = 12,
1607 .entry_size = sizeof(struct ce_stat_desc) >> 2,
1608 .lmac_ring = FALSE,
1609 .ring_dir = HAL_SRNG_DST_RING,
1610 .reg_start = {
1611 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
1612 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1613 HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
1614 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1615 },
1616 /* TODO: check destination status ring registers */
1617 .reg_size = {
1618 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1619 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1620 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1621 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1622 },
1623 .max_size =
1624 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
1625 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
1626 },
1627 { /* WBM_IDLE_LINK */
1628 .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
1629 .max_rings = 1,
1630 .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
1631 .lmac_ring = FALSE,
1632 .ring_dir = HAL_SRNG_SRC_RING,
1633 .reg_start = {
1634 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1635 HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1636 },
1637 /* Single ring - provide ring size if multiple rings of this
1638 * type are supported
1639 */
1640 .reg_size = {},
1641 .max_size =
1642 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
1643 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
1644 },
1645 { /* SW2WBM_RELEASE */
1646 .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
1647 .max_rings = 1,
1648 .entry_size = sizeof(struct wbm_release_ring) >> 2,
1649 .lmac_ring = FALSE,
1650 .ring_dir = HAL_SRNG_SRC_RING,
1651 .reg_start = {
1652 HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1653 HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1654 },
1655 /* Single ring - provide ring size if multiple rings of this
1656 * type are supported
1657 */
1658 .reg_size = {},
1659 .max_size =
1660 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
1661 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
1662 },
1663 { /* WBM2SW_RELEASE */
1664 .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
1665 .max_rings = 4,
1666 .entry_size = sizeof(struct wbm_release_ring) >> 2,
1667 .lmac_ring = FALSE,
1668 .ring_dir = HAL_SRNG_DST_RING,
1669 .reg_start = {
1670 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1671 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1672 },
1673 .reg_size = {
1674 HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
1675 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1676 HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
1677 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1678 },
1679 .max_size =
1680 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
1681 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
1682 },
1683 { /* RXDMA_BUF */
1684 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
1685#ifdef IPA_OFFLOAD
1686 .max_rings = 3,
1687#else
1688 .max_rings = 2,
1689#endif
1690 .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1691 .lmac_ring = TRUE,
1692 .ring_dir = HAL_SRNG_SRC_RING,
1693 /* reg_start is not set because LMAC rings are not accessed
1694 * from host
1695 */
1696 .reg_start = {},
1697 .reg_size = {},
1698 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1699 },
1700 { /* RXDMA_DST */
1701 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
1702 .max_rings = 1,
1703 .entry_size = sizeof(struct reo_entrance_ring) >> 2,
1704 .lmac_ring = TRUE,
1705 .ring_dir = HAL_SRNG_DST_RING,
1706 /* reg_start is not set because LMAC rings are not accessed
1707 * from host
1708 */
1709 .reg_start = {},
1710 .reg_size = {},
1711 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1712 },
1713 { /* RXDMA_MONITOR_BUF */
1714 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
1715 .max_rings = 1,
1716 .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1717 .lmac_ring = TRUE,
1718 .ring_dir = HAL_SRNG_SRC_RING,
1719 /* reg_start is not set because LMAC rings are not accessed
1720 * from host
1721 */
1722 .reg_start = {},
1723 .reg_size = {},
1724 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1725 },
1726 { /* RXDMA_MONITOR_STATUS */
1727 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
1728 .max_rings = 1,
1729 .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1730 .lmac_ring = TRUE,
1731 .ring_dir = HAL_SRNG_SRC_RING,
1732 /* reg_start is not set because LMAC rings are not accessed
1733 * from host
1734 */
1735 .reg_start = {},
1736 .reg_size = {},
1737 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1738 },
1739 { /* RXDMA_MONITOR_DST */
1740 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
1741 .max_rings = 1,
1742 .entry_size = sizeof(struct reo_entrance_ring) >> 2,
1743 .lmac_ring = TRUE,
1744 .ring_dir = HAL_SRNG_DST_RING,
1745 /* reg_start is not set because LMAC rings are not accessed
1746 * from host
1747 */
1748 .reg_start = {},
1749 .reg_size = {},
1750 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1751 },
1752 { /* RXDMA_MONITOR_DESC */
1753 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
1754 .max_rings = 1,
1755 .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1756 .lmac_ring = TRUE,
1757 .ring_dir = HAL_SRNG_SRC_RING,
1758 /* reg_start is not set because LMAC rings are not accessed
1759 * from host
1760 */
1761 .reg_start = {},
1762 .reg_size = {},
1763 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1764 },
1765 { /* DIR_BUF_RX_DMA_SRC */
1766 .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
1767 .max_rings = 1,
1768 .entry_size = 2,
1769 .lmac_ring = TRUE,
1770 .ring_dir = HAL_SRNG_SRC_RING,
1771 /* reg_start is not set because LMAC rings are not accessed
1772 * from host
1773 */
1774 .reg_start = {},
1775 .reg_size = {},
1776 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1777 },
1778#ifdef WLAN_FEATURE_CIF_CFR
1779 { /* WIFI_POS_SRC */
1780 .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
1781 .max_rings = 1,
1782 .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
1783 .lmac_ring = TRUE,
1784 .ring_dir = HAL_SRNG_SRC_RING,
1785 /* reg_start is not set because LMAC rings are not accessed
1786 * from host
1787 */
1788 .reg_start = {},
1789 .reg_size = {},
1790 .max_size = HAL_RXDMA_MAX_RING_SIZE,
1791 },
1792#endif
1793};
1794
1795int32_t hal_hw_reg_offset_qca6490[] = {
1796 /* dst */
1797 REG_OFFSET(DST, HP),
1798 REG_OFFSET(DST, TP),
1799 REG_OFFSET(DST, ID),
1800 REG_OFFSET(DST, MISC),
1801 REG_OFFSET(DST, HP_ADDR_LSB),
1802 REG_OFFSET(DST, HP_ADDR_MSB),
1803 REG_OFFSET(DST, MSI1_BASE_LSB),
1804 REG_OFFSET(DST, MSI1_BASE_MSB),
1805 REG_OFFSET(DST, MSI1_DATA),
1806 REG_OFFSET(DST, BASE_LSB),
1807 REG_OFFSET(DST, BASE_MSB),
1808 REG_OFFSET(DST, PRODUCER_INT_SETUP),
1809 /* src */
1810 REG_OFFSET(SRC, HP),
1811 REG_OFFSET(SRC, TP),
1812 REG_OFFSET(SRC, ID),
1813 REG_OFFSET(SRC, MISC),
1814 REG_OFFSET(SRC, TP_ADDR_LSB),
1815 REG_OFFSET(SRC, TP_ADDR_MSB),
1816 REG_OFFSET(SRC, MSI1_BASE_LSB),
1817 REG_OFFSET(SRC, MSI1_BASE_MSB),
1818 REG_OFFSET(SRC, MSI1_DATA),
1819 REG_OFFSET(SRC, BASE_LSB),
1820 REG_OFFSET(SRC, BASE_MSB),
1821 REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX0),
1822 REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX1),
1823};
1824
1825/**
1826 * hal_qca6490_attach() - Attach 6490 target specific hal_soc ops,
1827 * offset and srng table
1828 */
1829void hal_qca6490_attach(struct hal_soc *hal_soc)
1830{
1831 hal_soc->hw_srng_table = hw_srng_table_6490;
1832 hal_soc->hal_hw_reg_offset = hal_hw_reg_offset_qca6490;
1833 hal_soc->ops = &qca6490_hal_hw_txrx_ops;
1834}