xref: /wlan-driver/qca-wifi-host-cmn/hif/src/sdio/native_sdio/include/hif_internal.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef _HIF_INTERNAL_H_
21*5113495bSYour Name #define _HIF_INTERNAL_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <linux/mmc/card.h>
24*5113495bSYour Name #include <linux/mmc/mmc.h>
25*5113495bSYour Name #include <linux/mmc/host.h>
26*5113495bSYour Name #include <linux/mmc/sdio_func.h>
27*5113495bSYour Name #include <linux/mmc/sdio_ids.h>
28*5113495bSYour Name #include <linux/mmc/sdio.h>
29*5113495bSYour Name #include <linux/mmc/sd.h>
30*5113495bSYour Name 
31*5113495bSYour Name #include "athdefs.h"
32*5113495bSYour Name #include "a_types.h"
33*5113495bSYour Name #include "a_osapi.h"
34*5113495bSYour Name #include <qdf_types.h>          /* qdf_device_t, qdf_print */
35*5113495bSYour Name #include <qdf_time.h>           /* qdf_system_ticks, etc. */
36*5113495bSYour Name #include <qdf_status.h>
37*5113495bSYour Name #include <qdf_timer.h>
38*5113495bSYour Name #include <qdf_atomic.h>
39*5113495bSYour Name #include <qdf_list.h>
40*5113495bSYour Name #include "hif.h"
41*5113495bSYour Name #include "hif_debug.h"
42*5113495bSYour Name #include "hif_sdio_common.h"
43*5113495bSYour Name #include <linux/scatterlist.h>
44*5113495bSYour Name #include "hif_main.h"
45*5113495bSYour Name 
46*5113495bSYour Name #define HIF_LINUX_MMC_SCATTER_SUPPORT
47*5113495bSYour Name 
48*5113495bSYour Name #define BUS_REQUEST_MAX_NUM                105
49*5113495bSYour Name 
50*5113495bSYour Name #define SDIO_CLOCK_FREQUENCY_DEFAULT       25000000
51*5113495bSYour Name #define SDWLAN_ENABLE_DISABLE_TIMEOUT      20
52*5113495bSYour Name #define FLAGS_CARD_ENAB                    0x02
53*5113495bSYour Name #define FLAGS_CARD_IRQ_UNMSK               0x04
54*5113495bSYour Name 
55*5113495bSYour Name /*
56*5113495bSYour Name  * direction - Direction of transfer (HIF_SDIO_READ/HIF_SDIO_WRITE).
57*5113495bSYour Name  */
58*5113495bSYour Name #define HIF_SDIO_READ			0x00000001
59*5113495bSYour Name #define HIF_SDIO_WRITE			0x00000002
60*5113495bSYour Name #define HIF_SDIO_DIR_MASK		(HIF_SDIO_READ | HIF_SDIO_WRITE)
61*5113495bSYour Name 
62*5113495bSYour Name /*
63*5113495bSYour Name  * type - An interface may support different kind of rd/wr commands.
64*5113495bSYour Name  * For example: SDIO supports CMD52/CMD53s. In case of MSIO it
65*5113495bSYour Name  * translates to using different kinds of TPCs. The command type
66*5113495bSYour Name  * is thus divided into a basic and an extended command and can
67*5113495bSYour Name  * be specified using HIF_BASIC_IO/HIF_EXTENDED_IO.
68*5113495bSYour Name  */
69*5113495bSYour Name #define HIF_BASIC_IO			0x00000004
70*5113495bSYour Name #define HIF_EXTENDED_IO			0x00000008
71*5113495bSYour Name #define HIF_TYPE_MASK			(HIF_BASIC_IO | HIF_EXTENDED_IO)
72*5113495bSYour Name 
73*5113495bSYour Name /*
74*5113495bSYour Name  * This indicates the whether the command is to be executed in a
75*5113495bSYour Name  * blocking or non-blocking fashion (HIF_SYNCHRONOUS/
76*5113495bSYour Name  * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been
77*5113495bSYour Name  * implemented using the asynchronous mode allowing the the bus
78*5113495bSYour Name  * driver to indicate the completion of operation through the
79*5113495bSYour Name  * registered callback routine. The requirement primarily comes
80*5113495bSYour Name  * from the contexts these operations get called from (a driver's
81*5113495bSYour Name  * transmit context or the ISR context in case of receive).
82*5113495bSYour Name  * Support for both of these modes is essential.
83*5113495bSYour Name  */
84*5113495bSYour Name #define HIF_SYNCHRONOUS		0x00000010
85*5113495bSYour Name #define HIF_ASYNCHRONOUS	0x00000020
86*5113495bSYour Name #define HIF_EMODE_MASK		(HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)
87*5113495bSYour Name 
88*5113495bSYour Name /*
89*5113495bSYour Name  * An interface may support different kinds of commands based on
90*5113495bSYour Name  * the tradeoff between the amount of data it can carry and the
91*5113495bSYour Name  * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/
92*5113495bSYour Name  * HIF_BLOCK_BASIS). In case of latter, the data is rounded off
93*5113495bSYour Name  * to the nearest block size by padding. The size of the block is
94*5113495bSYour Name  * configurable at compile time using the HIF_BLOCK_SIZE and is
95*5113495bSYour Name  * negotiated with the target during initialization after the
96*5113495bSYour Name  * AR6000 interrupts are enabled.
97*5113495bSYour Name  */
98*5113495bSYour Name #define HIF_BYTE_BASIS		0x00000040
99*5113495bSYour Name #define HIF_BLOCK_BASIS		0x00000080
100*5113495bSYour Name #define HIF_DMODE_MASK		(HIF_BYTE_BASIS | HIF_BLOCK_BASIS)
101*5113495bSYour Name 
102*5113495bSYour Name /*
103*5113495bSYour Name  * This indicates if the address has to be incremented on AR6000
104*5113495bSYour Name  * after every read/write operation (HIF?FIXED_ADDRESS/
105*5113495bSYour Name  * HIF_INCREMENTAL_ADDRESS).
106*5113495bSYour Name  */
107*5113495bSYour Name #define HIF_FIXED_ADDRESS			0x00000100
108*5113495bSYour Name #define HIF_INCREMENTAL_ADDRESS		0x00000200
109*5113495bSYour Name #define HIF_AMODE_MASK				(HIF_FIXED_ADDRESS | \
110*5113495bSYour Name 							HIF_INCREMENTAL_ADDRESS)
111*5113495bSYour Name 
112*5113495bSYour Name #define HIF_WR_ASYNC_BYTE_FIX   \
113*5113495bSYour Name 		(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
114*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
115*5113495bSYour Name #define HIF_WR_ASYNC_BYTE_INC   \
116*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
117*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
118*5113495bSYour Name #define HIF_WR_ASYNC_BLOCK_INC  \
119*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
120*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
121*5113495bSYour Name #define HIF_WR_SYNC_BYTE_FIX    \
122*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
123*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
124*5113495bSYour Name #define HIF_WR_SYNC_BYTE_INC    \
125*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
126*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
127*5113495bSYour Name #define HIF_WR_SYNC_BLOCK_INC  \
128*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
129*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
130*5113495bSYour Name #define HIF_WR_ASYNC_BLOCK_FIX \
131*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
132*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
133*5113495bSYour Name #define HIF_WR_SYNC_BLOCK_FIX  \
134*5113495bSYour Name 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
135*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
136*5113495bSYour Name #define HIF_RD_SYNC_BYTE_INC    \
137*5113495bSYour Name 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
138*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
139*5113495bSYour Name #define HIF_RD_SYNC_BYTE_FIX    \
140*5113495bSYour Name 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
141*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
142*5113495bSYour Name #define HIF_RD_ASYNC_BYTE_FIX   \
143*5113495bSYour Name 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
144*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
145*5113495bSYour Name #define HIF_RD_ASYNC_BLOCK_FIX  \
146*5113495bSYour Name 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
147*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
148*5113495bSYour Name #define HIF_RD_ASYNC_BYTE_INC   \
149*5113495bSYour Name 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
150*5113495bSYour Name 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
151*5113495bSYour Name #define HIF_RD_ASYNC_BLOCK_INC  \
152*5113495bSYour Name 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
153*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
154*5113495bSYour Name #define HIF_RD_SYNC_BLOCK_INC  \
155*5113495bSYour Name 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
156*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
157*5113495bSYour Name #define HIF_RD_SYNC_BLOCK_FIX  \
158*5113495bSYour Name 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
159*5113495bSYour Name 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
160*5113495bSYour Name 
161*5113495bSYour Name enum hif_sdio_device_state {
162*5113495bSYour Name 		HIF_DEVICE_STATE_ON,
163*5113495bSYour Name 		HIF_DEVICE_STATE_DEEPSLEEP,
164*5113495bSYour Name 		HIF_DEVICE_STATE_CUTPOWER,
165*5113495bSYour Name 		HIF_DEVICE_STATE_WOW
166*5113495bSYour Name };
167*5113495bSYour Name 
168*5113495bSYour Name struct bus_request {
169*5113495bSYour Name 	struct bus_request *next;       /* link list of available requests */
170*5113495bSYour Name 	struct bus_request *inusenext;  /* link list of in use requests */
171*5113495bSYour Name 	struct semaphore sem_req;
172*5113495bSYour Name 	unsigned long address;       /* request data */
173*5113495bSYour Name 	char *buffer;
174*5113495bSYour Name 	uint32_t length;
175*5113495bSYour Name 	uint32_t request;
176*5113495bSYour Name 	void *context;
177*5113495bSYour Name 	QDF_STATUS status;
178*5113495bSYour Name 	struct HIF_SCATTER_REQ_PRIV *scatter_req;
179*5113495bSYour Name };
180*5113495bSYour Name 
181*5113495bSYour Name #define HIF_ADMA_MAX_CHANS 2
182*5113495bSYour Name #ifdef CONFIG_SDIO_TRANSFER_ADMA
183*5113495bSYour Name struct rx_q_entry {
184*5113495bSYour Name 	qdf_list_node_t entry;
185*5113495bSYour Name 	qdf_nbuf_t nbuf;
186*5113495bSYour Name };
187*5113495bSYour Name #endif
188*5113495bSYour Name 
189*5113495bSYour Name struct hif_sdio_dev {
190*5113495bSYour Name 	struct sdio_func *func;
191*5113495bSYour Name 	qdf_spinlock_t asynclock;
192*5113495bSYour Name 	struct task_struct *async_task; /* task to handle async commands */
193*5113495bSYour Name 	struct semaphore sem_async;     /* wake up for async task */
194*5113495bSYour Name 	int async_shutdown;     /* stop the async task */
195*5113495bSYour Name 	struct completion async_completion;     /* thread completion */
196*5113495bSYour Name 	struct bus_request *asyncreq;  /* request for async tasklet */
197*5113495bSYour Name 	struct bus_request *taskreq;   /*  async tasklet data */
198*5113495bSYour Name 	qdf_spinlock_t lock;
199*5113495bSYour Name 	struct bus_request *bus_request_free_queue;     /* free list */
200*5113495bSYour Name 	struct bus_request bus_request[BUS_REQUEST_MAX_NUM]; /* bus requests */
201*5113495bSYour Name 	void *claimed_ctx;
202*5113495bSYour Name 	struct htc_callbacks htc_callbacks;
203*5113495bSYour Name 	uint8_t *dma_buffer;
204*5113495bSYour Name 	DL_LIST scatter_req_head; /* scatter request list head */
205*5113495bSYour Name 	bool scatter_enabled; /* scatter enabled flag */
206*5113495bSYour Name 	bool is_suspend;
207*5113495bSYour Name 	bool is_disabled;
208*5113495bSYour Name 	atomic_t irq_handling;
209*5113495bSYour Name 	enum HIF_DEVICE_POWER_CHANGE_TYPE power_config;
210*5113495bSYour Name 	enum hif_sdio_device_state device_state;
211*5113495bSYour Name 	const struct sdio_device_id *id;
212*5113495bSYour Name 	struct mmc_host *host;
213*5113495bSYour Name 	void *htc_context;
214*5113495bSYour Name #ifdef CONFIG_SDIO_TRANSFER_ADMA
215*5113495bSYour Name 	struct sdio_al_client_handle *al_client;
216*5113495bSYour Name 	struct sdio_al_channel_handle *al_chan[HIF_ADMA_MAX_CHANS];
217*5113495bSYour Name 	uint8_t adma_chans_used;
218*5113495bSYour Name 	qdf_list_t rx_q;
219*5113495bSYour Name 	qdf_spinlock_t rx_q_lock;
220*5113495bSYour Name 	qdf_work_t rx_q_alloc_work;
221*5113495bSYour Name 	bool rx_q_alloc_work_scheduled;
222*5113495bSYour Name #endif
223*5113495bSYour Name };
224*5113495bSYour Name 
225*5113495bSYour Name struct HIF_DEVICE_OS_DEVICE_INFO {
226*5113495bSYour Name 	void *os_dev;
227*5113495bSYour Name };
228*5113495bSYour Name 
229*5113495bSYour Name struct hif_mailbox_properties {
230*5113495bSYour Name 	u_int32_t    extended_address;  /* extended address for larger writes */
231*5113495bSYour Name 	u_int32_t    extended_size;
232*5113495bSYour Name };
233*5113495bSYour Name 
234*5113495bSYour Name struct hif_device_irq_yield_params {
235*5113495bSYour Name 	int recv_packet_yield_count;
236*5113495bSYour Name 	/* max number of packets to force DSR to return */
237*5113495bSYour Name };
238*5113495bSYour Name 
239*5113495bSYour Name struct hif_device_mbox_info {
240*5113495bSYour Name 	u_int32_t mbox_addresses[4];
241*5113495bSYour Name 	/* first element for legacy HIFs and return the address and ARRAY of
242*5113495bSYour Name 	 * 32bit words
243*5113495bSYour Name 	 */
244*5113495bSYour Name 	struct hif_mailbox_properties mbox_prop[4];
245*5113495bSYour Name 	u_int32_t gmbox_address;
246*5113495bSYour Name 	u_int32_t gmbox_size;
247*5113495bSYour Name 	u_int32_t flags;
248*5113495bSYour Name 	/* flags to describe mbox behavior or usage */
249*5113495bSYour Name };
250*5113495bSYour Name 
251*5113495bSYour Name enum hif_device_irq_mode {
252*5113495bSYour Name 	HIF_DEVICE_IRQ_SYNC_ONLY,
253*5113495bSYour Name 	/* DSR to process all interrupts before returning */
254*5113495bSYour Name 	HIF_DEVICE_IRQ_ASYNC_SYNC,  /* DSR to process interrupts */
255*5113495bSYour Name };
256*5113495bSYour Name 
257*5113495bSYour Name /* other interrupts are pending, host
258*5113495bSYour Name  * needs to read the to monitor
259*5113495bSYour Name  */
260*5113495bSYour Name #define HIF_OTHER_EVENTS     (1 << 0)
261*5113495bSYour Name /* pending recv packet */
262*5113495bSYour Name #define HIF_RECV_MSG_AVAIL   (1 << 1)
263*5113495bSYour Name 
264*5113495bSYour Name struct _HIF_PENDING_EVENTS_INFO {
265*5113495bSYour Name 	uint32_t events;
266*5113495bSYour Name 	uint32_t look_ahead;
267*5113495bSYour Name 	uint32_t available_recv_bytes;
268*5113495bSYour Name };
269*5113495bSYour Name 
270*5113495bSYour Name /* hif-sdio pending events handler type, some HIF modules
271*5113495bSYour Name  * use special mechanisms to detect packet available and other interrupts
272*5113495bSYour Name  */
273*5113495bSYour Name typedef int (*HIF_PENDING_EVENTS_FUNC)(struct hif_sdio_dev *device,
274*5113495bSYour Name 					struct _HIF_PENDING_EVENTS_INFO *
275*5113495bSYour Name 					events, void *async_context);
276*5113495bSYour Name 
277*5113495bSYour Name #define HIF_MASK_RECV    true
278*5113495bSYour Name #define HIF_UNMASK_RECV  false
279*5113495bSYour Name /* hif-sdio Handler type to mask receive events */
280*5113495bSYour Name typedef int (*HIF_MASK_UNMASK_RECV_EVENT)(struct hif_sdio_dev *device,
281*5113495bSYour Name 					  bool mask,
282*5113495bSYour Name 					  void *async_context);
283*5113495bSYour Name 
284*5113495bSYour Name QDF_STATUS hif_configure_device(struct hif_softc *ol_sc,
285*5113495bSYour Name 				struct hif_sdio_dev *device,
286*5113495bSYour Name 				enum hif_device_config_opcode opcode,
287*5113495bSYour Name 				void *config, uint32_t config_len);
288*5113495bSYour Name 
289*5113495bSYour Name QDF_STATUS hif_attach_htc(struct hif_sdio_dev *device,
290*5113495bSYour Name 			  struct htc_callbacks *callbacks);
291*5113495bSYour Name 
292*5113495bSYour Name void hif_ack_interrupt(struct hif_sdio_dev *device);
293*5113495bSYour Name 
294*5113495bSYour Name void hif_mask_interrupt(struct hif_sdio_dev *device);
295*5113495bSYour Name 
296*5113495bSYour Name void hif_un_mask_interrupt(struct hif_sdio_dev *device);
297*5113495bSYour Name 
298*5113495bSYour Name int hif_sdio_configure_pipes(struct hif_sdio_dev *dev, struct sdio_func *func);
299*5113495bSYour Name 
300*5113495bSYour Name struct _HIF_SCATTER_ITEM {
301*5113495bSYour Name 	u_int8_t     *buffer; /* CPU accessible address of buffer */
302*5113495bSYour Name 	int          length; /* length of transfer to/from this buffer */
303*5113495bSYour Name 	void         *caller_contexts[2]; /* caller context */
304*5113495bSYour Name };
305*5113495bSYour Name 
306*5113495bSYour Name struct _HIF_SCATTER_REQ;
307*5113495bSYour Name 
308*5113495bSYour Name typedef void (*HIF_SCATTER_COMP_CB)(struct _HIF_SCATTER_REQ *);
309*5113495bSYour Name 
310*5113495bSYour Name enum HIF_SCATTER_METHOD {
311*5113495bSYour Name 	HIF_SCATTER_NONE = 0,
312*5113495bSYour Name 	HIF_SCATTER_DMA_REAL, /* Real SG support no restrictions */
313*5113495bSYour Name 	HIF_SCATTER_DMA_BOUNCE, /* Uses SG DMA */
314*5113495bSYour Name };
315*5113495bSYour Name 
316*5113495bSYour Name struct _HIF_SCATTER_REQ {
317*5113495bSYour Name 	DL_LIST             list_link; /* link management */
318*5113495bSYour Name 	u_int32_t            address; /* address for the read/write operation */
319*5113495bSYour Name 	u_int32_t            request; /* request flags */
320*5113495bSYour Name 	u_int32_t            total_length; /* total length of entire transfer */
321*5113495bSYour Name 	u_int32_t            caller_flags; /* caller specific flags */
322*5113495bSYour Name 	HIF_SCATTER_COMP_CB  completion_routine; /* completion callback */
323*5113495bSYour Name 	int                  completion_status; /* status of completion */
324*5113495bSYour Name 	void                 *context; /* caller context for this request */
325*5113495bSYour Name 	int                  valid_scatter_entries; /* no of valid entries */
326*5113495bSYour Name 	/* scatter method handled by HIF */
327*5113495bSYour Name 	enum HIF_SCATTER_METHOD   scatter_method;
328*5113495bSYour Name 	void                 *hif_private[4]; /* HIF private area */
329*5113495bSYour Name 	u_int8_t             *scatter_bounce_buffer; /* bounce buffers */
330*5113495bSYour Name 	QDF_FLEX_ARRAY(struct _HIF_SCATTER_ITEM, scatter_list); /* start of scatter list */
331*5113495bSYour Name };
332*5113495bSYour Name 
333*5113495bSYour Name typedef struct _HIF_SCATTER_REQ * (*HIF_ALLOCATE_SCATTER_REQUEST)(
334*5113495bSYour Name 						struct hif_sdio_dev *device);
335*5113495bSYour Name typedef void (*HIF_FREE_SCATTER_REQUEST)(struct hif_sdio_dev *device,
336*5113495bSYour Name 				struct _HIF_SCATTER_REQ *request);
337*5113495bSYour Name typedef QDF_STATUS (*HIF_READWRITE_SCATTER)(struct hif_sdio_dev *device,
338*5113495bSYour Name 					struct _HIF_SCATTER_REQ *request);
339*5113495bSYour Name 
340*5113495bSYour Name struct HIF_DEVICE_SCATTER_SUPPORT_INFO {
341*5113495bSYour Name 	/* information returned from HIF layer */
342*5113495bSYour Name 	HIF_ALLOCATE_SCATTER_REQUEST    allocate_req_func;
343*5113495bSYour Name 	HIF_FREE_SCATTER_REQUEST        free_req_func;
344*5113495bSYour Name 	HIF_READWRITE_SCATTER           read_write_scatter_func;
345*5113495bSYour Name 	int                             max_scatter_entries;
346*5113495bSYour Name 	int                             max_tx_size_per_scatter_req;
347*5113495bSYour Name };
348*5113495bSYour Name 
349*5113495bSYour Name void hif_get_target_revision(struct hif_softc *ol_sc);
350*5113495bSYour Name struct HIF_SCATTER_REQ_PRIV;
351*5113495bSYour Name 
352*5113495bSYour Name #define HIF_DMA_BUFFER_SIZE (4 * 1024)
353*5113495bSYour Name #define CMD53_FIXED_ADDRESS 1
354*5113495bSYour Name #define CMD53_INCR_ADDRESS  2
355*5113495bSYour Name 
356*5113495bSYour Name struct bus_request *hif_allocate_bus_request(struct hif_sdio_dev *device);
357*5113495bSYour Name void hif_free_bus_request(struct hif_sdio_dev *device,
358*5113495bSYour Name 			  struct bus_request *busrequest);
359*5113495bSYour Name void add_to_async_list(struct hif_sdio_dev *device,
360*5113495bSYour Name 		       struct bus_request *busrequest);
361*5113495bSYour Name void hif_dump_cccr(struct hif_sdio_dev *hif_device);
362*5113495bSYour Name 
363*5113495bSYour Name #ifdef HIF_LINUX_MMC_SCATTER_SUPPORT
364*5113495bSYour Name 
365*5113495bSYour Name #define MAX_SCATTER_REQUESTS             4
366*5113495bSYour Name #define MAX_SCATTER_ENTRIES_PER_REQ      16
367*5113495bSYour Name #define MAX_SCATTER_REQ_TRANSFER_SIZE    (32*1024)
368*5113495bSYour Name 
369*5113495bSYour Name struct HIF_SCATTER_REQ_PRIV {
370*5113495bSYour Name 	struct _HIF_SCATTER_REQ *hif_scatter_req;
371*5113495bSYour Name 	struct hif_sdio_dev *device;     /* this device */
372*5113495bSYour Name 	struct bus_request *busrequest;
373*5113495bSYour Name 	/* scatter list for linux */
374*5113495bSYour Name 	struct scatterlist sgentries[MAX_SCATTER_ENTRIES_PER_REQ];
375*5113495bSYour Name };
376*5113495bSYour Name 
377*5113495bSYour Name #define ATH_DEBUG_SCATTER  ATH_DEBUG_MAKE_MODULE_MASK(0)
378*5113495bSYour Name 
379*5113495bSYour Name QDF_STATUS setup_hif_scatter_support(struct hif_sdio_dev *device,
380*5113495bSYour Name 		   struct HIF_DEVICE_SCATTER_SUPPORT_INFO *info);
381*5113495bSYour Name void cleanup_hif_scatter_resources(struct hif_sdio_dev *device);
382*5113495bSYour Name QDF_STATUS do_hif_read_write_scatter(struct hif_sdio_dev *device,
383*5113495bSYour Name 				   struct bus_request *busrequest);
384*5113495bSYour Name 
385*5113495bSYour Name #else                           /* HIF_LINUX_MMC_SCATTER_SUPPORT */
386*5113495bSYour Name 
setup_hif_scatter_support(struct hif_sdio_dev * device,struct HIF_DEVICE_SCATTER_SUPPORT_INFO * info)387*5113495bSYour Name static inline QDF_STATUS setup_hif_scatter_support(struct hif_sdio_dev *device,
388*5113495bSYour Name 				struct HIF_DEVICE_SCATTER_SUPPORT_INFO *info)
389*5113495bSYour Name {
390*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
391*5113495bSYour Name }
392*5113495bSYour Name 
do_hif_read_write_scatter(struct hif_sdio_dev * device,struct bus_request * busrequest)393*5113495bSYour Name static inline QDF_STATUS do_hif_read_write_scatter(struct hif_sdio_dev *device,
394*5113495bSYour Name 					 struct bus_request *busrequest)
395*5113495bSYour Name {
396*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
397*5113495bSYour Name }
398*5113495bSYour Name 
399*5113495bSYour Name #define cleanup_hif_scatter_resources(d) { }
400*5113495bSYour Name 
401*5113495bSYour Name #endif /* HIF_LINUX_MMC_SCATTER_SUPPORT */
402*5113495bSYour Name 
403*5113495bSYour Name #define SDIO_SET_CMD52_ARG(arg, rw, func, raw, address, writedata) \
404*5113495bSYour Name 			((arg) = (((rw) & 1) << 31) | \
405*5113495bSYour Name 			(((func) & 0x7) << 28) | \
406*5113495bSYour Name 			(((raw) & 1) << 27) | \
407*5113495bSYour Name 			(1 << 26) | \
408*5113495bSYour Name 			(((address) & 0x1FFFF) << 9) | \
409*5113495bSYour Name 			(1 << 8) | \
410*5113495bSYour Name 			((writedata) & 0xFF))
411*5113495bSYour Name 
412*5113495bSYour Name #define SDIO_SET_CMD52_READ_ARG(arg, func, address) \
413*5113495bSYour Name 	SDIO_SET_CMD52_ARG(arg, 0, (func), 0, address, 0x00)
414*5113495bSYour Name #define SDIO_SET_CMD52_WRITE_ARG(arg, func, address, value) \
415*5113495bSYour Name 	SDIO_SET_CMD52_ARG(arg, 1, (func), 0, address, value)
416*5113495bSYour Name 
417*5113495bSYour Name void hif_sdio_quirk_force_drive_strength(struct hif_softc *ol_sc,
418*5113495bSYour Name 					 struct sdio_func *func);
419*5113495bSYour Name void hif_sdio_quirk_write_cccr(struct hif_softc *ol_sc, struct sdio_func *func);
420*5113495bSYour Name int hif_sdio_quirk_mod_strength(struct hif_softc *ol_sc,
421*5113495bSYour Name 				struct sdio_func *func);
422*5113495bSYour Name int hif_sdio_quirk_async_intr(struct hif_softc *ol_sc, struct sdio_func *func);
423*5113495bSYour Name int hif_sdio_set_bus_speed(struct hif_softc *ol_sc, struct sdio_func *func);
424*5113495bSYour Name int hif_sdio_set_bus_width(struct hif_softc *ol_sc, struct sdio_func *func);
425*5113495bSYour Name QDF_STATUS hif_sdio_func_disable(struct hif_sdio_dev *device,
426*5113495bSYour Name 				 struct sdio_func *func,
427*5113495bSYour Name 				 bool reset);
428*5113495bSYour Name QDF_STATUS reinit_sdio(struct hif_sdio_dev *device);
429*5113495bSYour Name 
430*5113495bSYour Name int func0_cmd52_write_byte(struct mmc_card *card,
431*5113495bSYour Name 			   unsigned int address,
432*5113495bSYour Name 			   unsigned char byte);
433*5113495bSYour Name 
434*5113495bSYour Name int func0_cmd52_read_byte(struct mmc_card *card,
435*5113495bSYour Name 			  unsigned int address,
436*5113495bSYour Name 			  unsigned char *byte);
437*5113495bSYour Name #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
438*5113495bSYour Name /**
439*5113495bSYour Name  * sdio_card_highspeed() - check if high speed supported
440*5113495bSYour Name  * @card: pointer to mmc card struct
441*5113495bSYour Name  *
442*5113495bSYour Name  * Return: non zero if card supports high speed.
443*5113495bSYour Name  */
sdio_card_highspeed(struct mmc_card * card)444*5113495bSYour Name static inline int sdio_card_highspeed(struct mmc_card *card)
445*5113495bSYour Name {
446*5113495bSYour Name 	return mmc_card_highspeed(card);
447*5113495bSYour Name }
448*5113495bSYour Name #else
sdio_card_highspeed(struct mmc_card * card)449*5113495bSYour Name static inline int sdio_card_highspeed(struct mmc_card *card)
450*5113495bSYour Name {
451*5113495bSYour Name 	return mmc_card_hs(card);
452*5113495bSYour Name }
453*5113495bSYour Name #endif
454*5113495bSYour Name 
455*5113495bSYour Name #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
456*5113495bSYour Name /**
457*5113495bSYour Name  * sdio_card_set_highspeed() - set high speed
458*5113495bSYour Name  * @card: pointer to mmc card struct
459*5113495bSYour Name  *
460*5113495bSYour Name  * Return: none.
461*5113495bSYour Name  */
sdio_card_set_highspeed(struct mmc_card * card)462*5113495bSYour Name static inline void sdio_card_set_highspeed(struct mmc_card *card)
463*5113495bSYour Name {
464*5113495bSYour Name 	mmc_card_set_highspeed(card);
465*5113495bSYour Name }
466*5113495bSYour Name #else
sdio_card_set_highspeed(struct mmc_card * card)467*5113495bSYour Name static inline void sdio_card_set_highspeed(struct mmc_card *card)
468*5113495bSYour Name {
469*5113495bSYour Name }
470*5113495bSYour Name #endif
471*5113495bSYour Name 
472*5113495bSYour Name #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
473*5113495bSYour Name /**
474*5113495bSYour Name  * sdio_card_state() - set card state
475*5113495bSYour Name  * @card: pointer to mmc card struct
476*5113495bSYour Name  *
477*5113495bSYour Name  * Return: none.
478*5113495bSYour Name  */
sdio_card_state(struct mmc_card * card)479*5113495bSYour Name static inline void sdio_card_state(struct mmc_card *card)
480*5113495bSYour Name {
481*5113495bSYour Name 	card->state &= ~MMC_STATE_HIGHSPEED;
482*5113495bSYour Name }
483*5113495bSYour Name #else
sdio_card_state(struct mmc_card * card)484*5113495bSYour Name static inline void sdio_card_state(struct mmc_card *card)
485*5113495bSYour Name {
486*5113495bSYour Name }
487*5113495bSYour Name #endif
488*5113495bSYour Name #endif /* _HIF_INTERNAL_H_ */
489