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