1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name *
4*5113495bSYour Name *
5*5113495bSYour Name *
6*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
7*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
8*5113495bSYour Name * above copyright notice and this permission notice appear in all
9*5113495bSYour Name * copies.
10*5113495bSYour Name *
11*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
16*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
19*5113495bSYour Name */
20*5113495bSYour Name
21*5113495bSYour Name #ifndef __TRANSFER_H_
22*5113495bSYour Name #define __TRANSFER_H_
23*5113495bSYour Name
24*5113495bSYour Name #include <qdf_types.h>
25*5113495bSYour Name #include <qdf_status.h>
26*5113495bSYour Name #include <qdf_timer.h>
27*5113495bSYour Name #include <qdf_time.h>
28*5113495bSYour Name #include <qdf_lock.h>
29*5113495bSYour Name #include <qdf_mem.h>
30*5113495bSYour Name #include <qdf_util.h>
31*5113495bSYour Name #include <qdf_defer.h>
32*5113495bSYour Name #include <qdf_atomic.h>
33*5113495bSYour Name #include <qdf_nbuf.h>
34*5113495bSYour Name #include <athdefs.h>
35*5113495bSYour Name #include <qdf_net_types.h>
36*5113495bSYour Name #include <a_types.h>
37*5113495bSYour Name #include <athdefs.h>
38*5113495bSYour Name #include <a_osapi.h>
39*5113495bSYour Name #include <hif.h>
40*5113495bSYour Name #include <htc_services.h>
41*5113495bSYour Name #include <a_debug.h>
42*5113495bSYour Name #include "hif_sdio_internal.h"
43*5113495bSYour Name
44*5113495bSYour Name #if defined(CONFIG_SDIO_TRANSFER_MAILBOX) && defined(CONFIG_SDIO_TRANSFER_ADMA)
45*5113495bSYour Name #error "-----------------------------------------------"
46*5113495bSYour Name #error "Error - Both transfer methods cannot be enabled"
47*5113495bSYour Name #error "-----------------------------------------------"
48*5113495bSYour Name #endif
49*5113495bSYour Name
50*5113495bSYour Name #define NBUF_ALLOC_FAIL_WAIT_TIME 100
51*5113495bSYour Name /* high nibble */
52*5113495bSYour Name #define BUNDLE_COUNT_HIGH(f) (((f) & 0x0C) << 2)
53*5113495bSYour Name /* low nibble */
54*5113495bSYour Name #define BUNDLE_COUNT_LOW(f) (((f) & 0xF0) >> 4)
55*5113495bSYour Name #define GET_RECV_BUNDLE_COUNT(f) (BUNDLE_COUNT_HIGH(f) + BUNDLE_COUNT_LOW(f))
56*5113495bSYour Name
57*5113495bSYour Name /*
58*5113495bSYour Name * Data structure to record required sending context data
59*5113495bSYour Name */
60*5113495bSYour Name struct hif_sendContext {
61*5113495bSYour Name bool bNewAlloc;
62*5113495bSYour Name struct hif_sdio_device *pDev;
63*5113495bSYour Name qdf_nbuf_t netbuf;
64*5113495bSYour Name unsigned int transferID;
65*5113495bSYour Name unsigned int head_data_len;
66*5113495bSYour Name };
67*5113495bSYour Name
68*5113495bSYour Name int hif_get_send_address(struct hif_sdio_device *pdev,
69*5113495bSYour Name uint8_t pipe, unsigned long *addr);
70*5113495bSYour Name
71*5113495bSYour Name QDF_STATUS hif_dev_alloc_and_prepare_rx_packets(struct hif_sdio_device *pdev,
72*5113495bSYour Name uint32_t look_aheads[],
73*5113495bSYour Name int messages,
74*5113495bSYour Name HTC_PACKET_QUEUE *queue);
75*5113495bSYour Name
76*5113495bSYour Name QDF_STATUS hif_dev_process_trailer(struct hif_sdio_device *pdev,
77*5113495bSYour Name uint8_t *buffer, int length,
78*5113495bSYour Name uint32_t *next_look_aheads,
79*5113495bSYour Name int *num_look_aheads,
80*5113495bSYour Name HTC_ENDPOINT_ID from_endpoint);
81*5113495bSYour Name
82*5113495bSYour Name void hif_dev_free_recv_pkt_queue(HTC_PACKET_QUEUE *recv_pkt_queue);
83*5113495bSYour Name
84*5113495bSYour Name QDF_STATUS hif_dev_process_recv_header(struct hif_sdio_device *pdev,
85*5113495bSYour Name HTC_PACKET *packet,
86*5113495bSYour Name uint32_t *next_look_aheads,
87*5113495bSYour Name int *num_look_aheads);
88*5113495bSYour Name void hif_fixup_write_param(struct hif_sdio_dev *pdev, uint32_t req,
89*5113495bSYour Name uint32_t *length, uint32_t *addr);
90*5113495bSYour Name
91*5113495bSYour Name #ifdef CONFIG_SDIO_TRANSFER_MAILBOX
hif_get_send_buffer_flags(struct hif_sdio_device * pdev)92*5113495bSYour Name static inline uint32_t hif_get_send_buffer_flags(struct hif_sdio_device *pdev)
93*5113495bSYour Name {
94*5113495bSYour Name if (pdev)
95*5113495bSYour Name return (uint32_t)HIF_WR_ASYNC_BLOCK_INC;
96*5113495bSYour Name
97*5113495bSYour Name hif_err("hif obj is null. Not populating xfer flags");
98*5113495bSYour Name
99*5113495bSYour Name return 0;
100*5113495bSYour Name }
101*5113495bSYour Name
hif_sdio_bus_configure(struct hif_softc * hif_sc)102*5113495bSYour Name static inline int hif_sdio_bus_configure(struct hif_softc *hif_sc)
103*5113495bSYour Name {
104*5113495bSYour Name return 0;
105*5113495bSYour Name }
106*5113495bSYour Name
107*5113495bSYour Name #elif defined(CONFIG_SDIO_TRANSFER_ADMA)
hif_get_send_buffer_flags(struct hif_sdio_device * pdev)108*5113495bSYour Name static inline uint32_t hif_get_send_buffer_flags(struct hif_sdio_device *pdev)
109*5113495bSYour Name {
110*5113495bSYour Name /* ADAM-TODO */
111*5113495bSYour Name return (uint32_t)HIF_WR_ASYNC_BLOCK_FIX;
112*5113495bSYour Name }
113*5113495bSYour Name
114*5113495bSYour Name int hif_sdio_bus_configure(struct hif_softc *hif_sc);
115*5113495bSYour Name #endif
116*5113495bSYour Name
117*5113495bSYour Name #endif /* __TRANSFER_H__ */
118