xref: /wlan-driver/qca-wifi-host-cmn/hif/src/sdio/transfer/transfer.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
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