blob: 1bc710f7366d0780b2c5291b4fbe7a243e1ad2a5 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
2 * Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28#ifndef _HTT_INTERNAL__H_
29#define _HTT_INTERNAL__H_
30
31#include <athdefs.h> /* A_STATUS */
32#include <cdf_nbuf.h> /* cdf_nbuf_t */
33#include <cdf_util.h> /* cdf_assert */
34#include <htc_api.h> /* HTC_PACKET */
35
36#include <htt_types.h>
37
38#ifndef offsetof
39#define offsetof(type, field) ((size_t)(&((type *)0)->field))
40#endif
41
42#undef MS
43#define MS(_v, _f) (((_v) & _f ## _MASK) >> _f ## _LSB)
44#undef SM
45#define SM(_v, _f) (((_v) << _f ## _LSB) & _f ## _MASK)
46#undef WO
47#define WO(_f) ((_f ## _OFFSET) >> 2)
48
49#define GET_FIELD(_addr, _f) MS(*((A_UINT32 *)(_addr) + WO(_f)), _f)
50
51#include <rx_desc.h>
52#include <wal_rx_desc.h> /* struct rx_attention, etc */
53
54struct htt_host_fw_desc_base {
55 union {
56 struct fw_rx_desc_base val;
57 A_UINT32 dummy_pad; /* make sure it is DOWRD aligned */
58 } u;
59};
60
61/*
62 * This struct defines the basic descriptor information used by host,
63 * which is written either by the 11ac HW MAC into the host Rx data
64 * buffer ring directly or generated by FW and copied from Rx indication
65 */
66#define RX_HTT_HDR_STATUS_LEN 64
67struct htt_host_rx_desc_base {
68 struct htt_host_fw_desc_base fw_desc;
69 struct rx_attention attention;
70 struct rx_frag_info frag_info;
71 struct rx_mpdu_start mpdu_start;
72 struct rx_msdu_start msdu_start;
73 struct rx_msdu_end msdu_end;
74 struct rx_mpdu_end mpdu_end;
75 struct rx_ppdu_start ppdu_start;
76 struct rx_ppdu_end ppdu_end;
77 char rx_hdr_status[RX_HTT_HDR_STATUS_LEN];
78};
79
80#define RX_STD_DESC_ATTN_OFFSET \
81 (offsetof(struct htt_host_rx_desc_base, attention))
82#define RX_STD_DESC_FRAG_INFO_OFFSET \
83 (offsetof(struct htt_host_rx_desc_base, frag_info))
84#define RX_STD_DESC_MPDU_START_OFFSET \
85 (offsetof(struct htt_host_rx_desc_base, mpdu_start))
86#define RX_STD_DESC_MSDU_START_OFFSET \
87 (offsetof(struct htt_host_rx_desc_base, msdu_start))
88#define RX_STD_DESC_MSDU_END_OFFSET \
89 (offsetof(struct htt_host_rx_desc_base, msdu_end))
90#define RX_STD_DESC_MPDU_END_OFFSET \
91 (offsetof(struct htt_host_rx_desc_base, mpdu_end))
92#define RX_STD_DESC_PPDU_START_OFFSET \
93 (offsetof(struct htt_host_rx_desc_base, ppdu_start))
94#define RX_STD_DESC_PPDU_END_OFFSET \
95 (offsetof(struct htt_host_rx_desc_base, ppdu_end))
96#define RX_STD_DESC_HDR_STATUS_OFFSET \
97 (offsetof(struct htt_host_rx_desc_base, rx_hdr_status))
98
99#define RX_STD_DESC_FW_MSDU_OFFSET \
100 (offsetof(struct htt_host_rx_desc_base, fw_desc))
101
102#define RX_STD_DESC_SIZE (sizeof(struct htt_host_rx_desc_base))
103
104#define RX_DESC_ATTN_OFFSET32 (RX_STD_DESC_ATTN_OFFSET >> 2)
105#define RX_DESC_FRAG_INFO_OFFSET32 (RX_STD_DESC_FRAG_INFO_OFFSET >> 2)
106#define RX_DESC_MPDU_START_OFFSET32 (RX_STD_DESC_MPDU_START_OFFSET >> 2)
107#define RX_DESC_MSDU_START_OFFSET32 (RX_STD_DESC_MSDU_START_OFFSET >> 2)
108#define RX_DESC_MSDU_END_OFFSET32 (RX_STD_DESC_MSDU_END_OFFSET >> 2)
109#define RX_DESC_MPDU_END_OFFSET32 (RX_STD_DESC_MPDU_END_OFFSET >> 2)
110#define RX_DESC_PPDU_START_OFFSET32 (RX_STD_DESC_PPDU_START_OFFSET >> 2)
111#define RX_DESC_PPDU_END_OFFSET32 (RX_STD_DESC_PPDU_END_OFFSET >> 2)
112#define RX_DESC_HDR_STATUS_OFFSET32 (RX_STD_DESC_HDR_STATUS_OFFSET >> 2)
113
114#define RX_STD_DESC_SIZE_DWORD (RX_STD_DESC_SIZE >> 2)
115
116/*
117 * Make sure there is a minimum headroom provided in the rx netbufs
118 * for use by the OS shim and OS and rx data consumers.
119 */
120#define HTT_RX_BUF_OS_MIN_HEADROOM 32
121#define HTT_RX_STD_DESC_RESERVATION \
122 ((HTT_RX_BUF_OS_MIN_HEADROOM > RX_STD_DESC_SIZE) ? \
123 HTT_RX_BUF_OS_MIN_HEADROOM : RX_STD_DESC_SIZE)
124#define HTT_RX_DESC_RESERVATION32 \
125 (HTT_RX_STD_DESC_RESERVATION >> 2)
126
127#define HTT_RX_DESC_ALIGN_MASK 7 /* 8-byte alignment */
128static inline struct htt_host_rx_desc_base *htt_rx_desc(cdf_nbuf_t msdu)
129{
130 return (struct htt_host_rx_desc_base *)
131 (((size_t) (cdf_nbuf_head(msdu) + HTT_RX_DESC_ALIGN_MASK)) &
132 ~HTT_RX_DESC_ALIGN_MASK);
133}
134
135#if defined(FEATURE_LRO)
136/**
137 * htt_print_rx_desc_lro() - print LRO information in the rx
138 * descriptor
139 * @rx_desc: HTT rx descriptor
140 *
141 * Prints the LRO related fields in the HTT rx descriptor
142 *
143 * Return: none
144 */
145static inline void htt_print_rx_desc_lro(struct htt_host_rx_desc_base *rx_desc)
146{
147 cdf_print
148 ("----------------------RX DESC LRO----------------------\n");
149 cdf_print("msdu_end.lro_eligible:0x%x\n",
150 rx_desc->msdu_end.lro_eligible);
151 cdf_print("msdu_start.tcp_only_ack:0x%x\n",
152 rx_desc->msdu_start.tcp_only_ack);
153 cdf_print("msdu_end.tcp_udp_chksum:0x%x\n",
154 rx_desc->msdu_end.tcp_udp_chksum);
155 cdf_print("msdu_end.tcp_seq_number:0x%x\n",
156 rx_desc->msdu_end.tcp_seq_number);
157 cdf_print("msdu_end.tcp_ack_number:0x%x\n",
158 rx_desc->msdu_end.tcp_ack_number);
159 cdf_print("msdu_start.tcp_proto:0x%x\n",
160 rx_desc->msdu_start.tcp_proto);
161 cdf_print("msdu_start.ipv6_proto:0x%x\n",
162 rx_desc->msdu_start.ipv6_proto);
163 cdf_print("msdu_start.ipv4_proto:0x%x\n",
164 rx_desc->msdu_start.ipv4_proto);
165 cdf_print("msdu_start.l3_offset:0x%x\n",
166 rx_desc->msdu_start.l3_offset);
167 cdf_print("msdu_start.l4_offset:0x%x\n",
168 rx_desc->msdu_start.l4_offset);
169 cdf_print("msdu_start.flow_id_toeplitz:0x%x\n",
170 rx_desc->msdu_start.flow_id_toeplitz);
171 cdf_print
172 ("---------------------------------------------------------\n");
173}
174
175/**
176 * htt_print_rx_desc_lro() - extract LRO information from the rx
177 * descriptor
178 * @msdu: network buffer
179 * @rx_desc: HTT rx descriptor
180 *
181 * Extracts the LRO related fields from the HTT rx descriptor
182 * and stores them in the network buffer's control block
183 *
184 * Return: none
185 */
186static inline void htt_rx_extract_lro_info(cdf_nbuf_t msdu,
187 struct htt_host_rx_desc_base *rx_desc)
188{
189 NBUF_LRO_ELIGIBLE(msdu) = rx_desc->msdu_end.lro_eligible;
190 if (rx_desc->msdu_end.lro_eligible) {
191 NBUF_TCP_PURE_ACK(msdu) = rx_desc->msdu_start.tcp_only_ack;
192 NBUF_TCP_CHKSUM(msdu) = rx_desc->msdu_end.tcp_udp_chksum;
193 NBUF_TCP_SEQ_NUM(msdu) = rx_desc->msdu_end.tcp_seq_number;
194 NBUF_TCP_ACK_NUM(msdu) = rx_desc->msdu_end.tcp_ack_number;
195 NBUF_TCP_WIN(msdu) = rx_desc->msdu_end.window_size;
196 NBUF_TCP_PROTO(msdu) = rx_desc->msdu_start.tcp_proto;
197 NBUF_IPV6_PROTO(msdu) = rx_desc->msdu_start.ipv6_proto;
198 NBUF_IP_OFFSET(msdu) = rx_desc->msdu_start.l3_offset;
199 NBUF_TCP_OFFSET(msdu) = rx_desc->msdu_start.l4_offset;
200 NBUF_FLOW_ID_TOEPLITZ(msdu) =
201 rx_desc->msdu_start.flow_id_toeplitz;
202 }
203}
204#else
205static inline void htt_print_rx_desc_lro(struct htt_host_rx_desc_base *rx_desc)
206{}
207static inline void htt_rx_extract_lro_info(cdf_nbuf_t msdu,
208 struct htt_host_rx_desc_base *rx_desc) {}
209#endif /* FEATURE_LRO */
210
211static inline void htt_print_rx_desc(struct htt_host_rx_desc_base *rx_desc)
212{
213 cdf_print
214 ("----------------------RX DESC----------------------------\n");
215 cdf_print("attention: %#010x\n",
216 (unsigned int)(*(uint32_t *) &rx_desc->attention));
217 cdf_print("frag_info: %#010x\n",
218 (unsigned int)(*(uint32_t *) &rx_desc->frag_info));
219 cdf_print("mpdu_start: %#010x %#010x %#010x\n",
220 (unsigned int)(((uint32_t *) &rx_desc->mpdu_start)[0]),
221 (unsigned int)(((uint32_t *) &rx_desc->mpdu_start)[1]),
222 (unsigned int)(((uint32_t *) &rx_desc->mpdu_start)[2]));
223 cdf_print("msdu_start: %#010x %#010x %#010x\n",
224 (unsigned int)(((uint32_t *) &rx_desc->msdu_start)[0]),
225 (unsigned int)(((uint32_t *) &rx_desc->msdu_start)[1]),
226 (unsigned int)(((uint32_t *) &rx_desc->msdu_start)[2]));
227 cdf_print("msdu_end: %#010x %#010x %#010x %#010x %#010x\n",
228 (unsigned int)(((uint32_t *) &rx_desc->msdu_end)[0]),
229 (unsigned int)(((uint32_t *) &rx_desc->msdu_end)[1]),
230 (unsigned int)(((uint32_t *) &rx_desc->msdu_end)[2]),
231 (unsigned int)(((uint32_t *) &rx_desc->msdu_end)[3]),
232 (unsigned int)(((uint32_t *) &rx_desc->msdu_end)[4]));
233 cdf_print("mpdu_end: %#010x\n",
234 (unsigned int)(*(uint32_t *) &rx_desc->mpdu_end));
235 cdf_print("ppdu_start: " "%#010x %#010x %#010x %#010x %#010x\n"
236 "%#010x %#010x %#010x %#010x %#010x\n",
237 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[0]),
238 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[1]),
239 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[2]),
240 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[3]),
241 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[4]),
242 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[5]),
243 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[6]),
244 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[7]),
245 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[8]),
246 (unsigned int)(((uint32_t *) &rx_desc->ppdu_start)[9]));
247 cdf_print("ppdu_end:" "%#010x %#010x %#010x %#010x %#010x\n"
248 "%#010x %#010x %#010x %#010x %#010x\n"
249 "%#010x,%#010x %#010x %#010x %#010x\n"
250 "%#010x %#010x %#010x %#010x %#010x\n" "%#010x %#010x\n",
251 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[0]),
252 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[1]),
253 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[2]),
254 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[3]),
255 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[4]),
256 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[5]),
257 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[6]),
258 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[7]),
259 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[8]),
260 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[9]),
261 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[10]),
262 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[11]),
263 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[12]),
264 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[13]),
265 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[14]),
266 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[15]),
267 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[16]),
268 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[17]),
269 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[18]),
270 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[19]),
271 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[20]),
272 (unsigned int)(((uint32_t *) &rx_desc->ppdu_end)[21]));
273 cdf_print
274 ("---------------------------------------------------------\n");
275}
276
277#ifndef HTT_ASSERT_LEVEL
278#define HTT_ASSERT_LEVEL 3
279#endif
280
281#define HTT_ASSERT_ALWAYS(condition) cdf_assert_always((condition))
282
283#define HTT_ASSERT0(condition) cdf_assert((condition))
284#if HTT_ASSERT_LEVEL > 0
285#define HTT_ASSERT1(condition) cdf_assert((condition))
286#else
287#define HTT_ASSERT1(condition)
288#endif
289
290#if HTT_ASSERT_LEVEL > 1
291#define HTT_ASSERT2(condition) cdf_assert((condition))
292#else
293#define HTT_ASSERT2(condition)
294#endif
295
296#if HTT_ASSERT_LEVEL > 2
297#define HTT_ASSERT3(condition) cdf_assert((condition))
298#else
299#define HTT_ASSERT3(condition)
300#endif
301
302#define HTT_MAC_ADDR_LEN 6
303
304/*
305 * HTT_MAX_SEND_QUEUE_DEPTH -
306 * How many packets HTC should allow to accumulate in a send queue
307 * before calling the EpSendFull callback to see whether to retain
308 * or drop packets.
309 * This is not relevant for LL, where tx descriptors should be immediately
310 * downloaded to the target.
311 * This is not very relevant for HL either, since it is anticipated that
312 * the HL tx download scheduler will not work this far in advance - rather,
313 * it will make its decisions just-in-time, so it can be responsive to
314 * changing conditions.
315 * Hence, this queue depth threshold spec is mostly just a formality.
316 */
317#define HTT_MAX_SEND_QUEUE_DEPTH 64
318
319#define IS_PWR2(value) (((value) ^ ((value)-1)) == ((value) << 1) - 1)
320
321/* FIX THIS
322 * Should be: sizeof(struct htt_host_rx_desc) + max rx MSDU size,
323 * rounded up to a cache line size.
324 */
325#define HTT_RX_BUF_SIZE 1920
326/*
327 * DMA_MAP expects the buffer to be an integral number of cache lines.
328 * Rather than checking the actual cache line size, this code makes a
329 * conservative estimate of what the cache line size could be.
330 */
331#define HTT_LOG2_MAX_CACHE_LINE_SIZE 7 /* 2^7 = 128 */
332#define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
333
334#ifdef BIG_ENDIAN_HOST
335/*
336 * big-endian: bytes within a 4-byte "word" are swapped:
337 * pre-swap post-swap
338 * index index
339 * 0 3
340 * 1 2
341 * 2 1
342 * 3 0
343 * 4 7
344 * 5 6
345 * etc.
346 * To compute the post-swap index from the pre-swap index, compute
347 * the byte offset for the start of the word (index & ~0x3) and add
348 * the swapped byte offset within the word (3 - (index & 0x3)).
349 */
350#define HTT_ENDIAN_BYTE_IDX_SWAP(idx) (((idx) & ~0x3) + (3 - ((idx) & 0x3)))
351#else
352/* little-endian: no adjustment needed */
353#define HTT_ENDIAN_BYTE_IDX_SWAP(idx) idx
354#endif
355
356#define HTT_TX_MUTEX_INIT(_mutex) \
357 cdf_spinlock_init(_mutex)
358
359#define HTT_TX_MUTEX_ACQUIRE(_mutex) \
360 cdf_spin_lock_bh(_mutex)
361
362#define HTT_TX_MUTEX_RELEASE(_mutex) \
363 cdf_spin_unlock_bh(_mutex)
364
365#define HTT_TX_MUTEX_DESTROY(_mutex) \
366 cdf_spinlock_destroy(_mutex)
367
368#define HTT_TX_DESC_PADDR(_pdev, _tx_desc_vaddr) \
369 ((_pdev)->tx_descs.pool_paddr + (uint32_t) \
370 ((char *)(_tx_desc_vaddr) - \
371 (char *)((_pdev)->tx_descs.pool_vaddr)))
372
373#ifdef ATH_11AC_TXCOMPACT
374
375#define HTT_TX_NBUF_QUEUE_MUTEX_INIT(_pdev) \
376 cdf_spinlock_init(&_pdev->txnbufq_mutex)
377
378#define HTT_TX_NBUF_QUEUE_MUTEX_DESTROY(_pdev) \
379 HTT_TX_MUTEX_DESTROY(&_pdev->txnbufq_mutex)
380
381#define HTT_TX_NBUF_QUEUE_REMOVE(_pdev, _msdu) do { \
382 HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex); \
383 _msdu = cdf_nbuf_queue_remove(&_pdev->txnbufq);\
384 HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex); \
385 } while (0)
386
387#define HTT_TX_NBUF_QUEUE_ADD(_pdev, _msdu) do { \
388 HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex); \
389 cdf_nbuf_queue_add(&_pdev->txnbufq, _msdu); \
390 HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex); \
391 } while (0)
392
393#define HTT_TX_NBUF_QUEUE_INSERT_HEAD(_pdev, _msdu) do { \
394 HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex); \
395 cdf_nbuf_queue_insert_head(&_pdev->txnbufq, _msdu);\
396 HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex); \
397 } while (0)
398#else
399
400#define HTT_TX_NBUF_QUEUE_MUTEX_INIT(_pdev)
401#define HTT_TX_NBUF_QUEUE_REMOVE(_pdev, _msdu)
402#define HTT_TX_NBUF_QUEUE_ADD(_pdev, _msdu)
403#define HTT_TX_NBUF_QUEUE_INSERT_HEAD(_pdev, _msdu)
404#define HTT_TX_NBUF_QUEUE_MUTEX_DESTROY(_pdev)
405
406#endif
407
408#ifdef ATH_11AC_TXCOMPACT
409#define HTT_TX_SCHED htt_tx_sched
410#else
411#define HTT_TX_SCHED(pdev) /* no-op */
412#endif
413
414int htt_tx_attach(struct htt_pdev_t *pdev, int desc_pool_elems);
415
416void htt_tx_detach(struct htt_pdev_t *pdev);
417
418int htt_rx_attach(struct htt_pdev_t *pdev);
419
420void htt_rx_detach(struct htt_pdev_t *pdev);
421
422int htt_htc_attach(struct htt_pdev_t *pdev);
423
424void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt);
425
426void htt_h2t_send_complete(void *context, HTC_PACKET *pkt);
427
428A_STATUS htt_h2t_ver_req_msg(struct htt_pdev_t *pdev);
429
430#if defined(HELIUMPLUS_PADDR64)
431A_STATUS
432htt_h2t_frag_desc_bank_cfg_msg(struct htt_pdev_t *pdev);
433#endif /* defined(HELIUMPLUS_PADDR64) */
434
435extern A_STATUS htt_h2t_rx_ring_cfg_msg_ll(struct htt_pdev_t *pdev);
436extern A_STATUS (*htt_h2t_rx_ring_cfg_msg)(struct htt_pdev_t *pdev);
437
438HTC_SEND_FULL_ACTION htt_h2t_full(void *context, HTC_PACKET *pkt);
439
440struct htt_htc_pkt *htt_htc_pkt_alloc(struct htt_pdev_t *pdev);
441
442void htt_htc_pkt_free(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
443
444void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev);
445
446#ifdef ATH_11AC_TXCOMPACT
447void
448htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
449
450void htt_htc_misc_pkt_pool_free(struct htt_pdev_t *pdev);
451#endif
452
453void htt_htc_disable_aspm(void);
454
455int
456htt_rx_hash_list_insert(struct htt_pdev_t *pdev, uint32_t paddr,
457 cdf_nbuf_t netbuf);
458
459cdf_nbuf_t htt_rx_hash_list_lookup(struct htt_pdev_t *pdev, uint32_t paddr);
460
461#ifdef IPA_OFFLOAD
462int
463htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
464 unsigned int uc_tx_buf_sz,
465 unsigned int uc_tx_buf_cnt,
466 unsigned int uc_tx_partition_base);
467
468int
469htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev, unsigned int rx_ind_ring_size);
470
471int htt_tx_ipa_uc_detach(struct htt_pdev_t *pdev);
472
473int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev);
474#else
475static inline int
476htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
477 unsigned int uc_tx_buf_sz,
478 unsigned int uc_tx_buf_cnt,
479 unsigned int uc_tx_partition_base)
480{
481 return 0;
482}
483
484static inline int
485htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev, unsigned int rx_ind_ring_size)
486{
487 return 0;
488}
489
490static inline int htt_tx_ipa_uc_detach(struct htt_pdev_t *pdev)
491{
492 return 0;
493}
494
495static inline int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev)
496{
497 return 0;
498}
499#endif /* IPA_OFFLOAD */
500#endif /* _HTT_INTERNAL__H_ */