1 /*
2  * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef EPPING_INTERNAL_H
21 #define EPPING_INTERNAL_H
22 /**
23  * DOC: epping_internal.h
24  *      Linux epping internal head file
25  */
26 
27 #include <linux/netdevice.h>
28 #include <linux/skbuff.h>
29 #include <linux/spinlock.h>
30 #include <linux/kthread.h>
31 #include <linux/semaphore.h>
32 #if defined(CONFIG_HAS_WAKELOCK)
33 #include <linux/wakelock.h>
34 #endif
35 #include "htc_api.h"
36 #include "htc_packet.h"
37 #include "epping_test.h"
38 #include <qdf_atomic.h>
39 #include <sir_mac_prot_def.h>
40 #include <sir_debug.h>
41 
42 #define EPPING_LOG_MASK (1<<EPPING_CMD_CAPTURE_RECV_CNT)
43 #define EPPING_STATS_LOG_COUNT 50000
44 #define EPPING_KTID_KILL_WAIT_TIME_MS 50
45 
46 #define EPPING_FRAG_PER_MSDU   1
47 #ifndef EPPING_TXBUF
48 #define EPPING_TXBUF   (512/EPPING_FRAG_PER_MSDU)
49 #endif
50 
51 /*---------------------------------------------------------------------------
52    Preprocessor definitions and constants
53    -------------------------------------------------------------------------*/
54 #define EPPING_MAX_ADAPTERS             1
55 
56 #define EPPING_LOG(level, args ...) QDF_TRACE(QDF_MODULE_ID_HDD, level, ## args)
57 #define EPPING_HEX_DUMP(level, data, len) qdf_trace_hex_dump( \
58 						QDF_MODULE_ID_HDD, \
59 						level, \
60 						data, buf_len)
61 
62 struct epping_cookie {
63 	HTC_PACKET HtcPkt;      /* HTC packet wrapper */
64 	struct epping_cookie *next;
65 };
66 
67 typedef enum {
68 	EPPING_CTX_STATE_INITIAL = 0,
69 	EPPING_CTX_STATE_HIF_INIT,
70 	EPPING_CTX_STATE_STARTUP,
71 	EPPING_CTX_STATE_STARTED,
72 	EPPING_CTX_STATE_STOP
73 } epping_ctx_state_t;
74 
75 #define EPPING_MAX_NUM_EPIDS 4
76 #define MAX_COOKIE_SLOTS_NUM 4
77 #define MAX_COOKIE_SLOT_SIZE 512
78 #define MAX_TX_PKT_DUP_NUM   4
79 
80 #if defined(HIF_PCI) || defined(HIF_IPCI)
81 #define WLAN_EPPING_DELAY_TIMEOUT_US     10
82 #define EPPING_MAX_CE_NUMS               8
83 #define EPPING_MAX_WATER_MARK            8
84 typedef struct {
85 	struct task_struct *pid;
86 	void *arg;
87 	bool done;
88 	qdf_nbuf_t skb;
89 	HTC_ENDPOINT_ID eid;
90 	struct semaphore sem;
91 	bool inited;
92 	qdf_atomic_t atm;
93 } epping_poll_t;
94 #endif
95 
96 typedef struct epping_context {
97 	int32_t con_mode;
98 	char *pwlan_module_name;
99 	uint32_t target_type;
100 	void *p_cds_context;    /* CDS context */
101 	struct device *parent_dev;      /* Pointer to the parent device */
102 	epping_ctx_state_t e_ctx_state;
103 	bool wow_nack;
104 	void *epping_adapter;
105 	HTC_HANDLE HTCHandle;
106 	HTC_ENDPOINT_ID EppingEndpoint[EPPING_MAX_NUM_EPIDS];
107 	unsigned int kperf_num_rx_recv[EPPING_MAX_NUM_EPIDS];
108 	unsigned int kperf_num_tx_acks[EPPING_MAX_NUM_EPIDS];
109 	unsigned int total_rx_recv;
110 	unsigned int total_tx_acks;
111 #if defined(HIF_PCI) || defined(HIF_IPCI)
112 	epping_poll_t epping_poll[EPPING_MAX_NUM_EPIDS];
113 #endif
114 	struct epping_cookie *cookie_list;
115 	int cookie_count;
116 	struct epping_cookie *s_cookie_mem[MAX_COOKIE_SLOTS_NUM];
117 	qdf_spinlock_t cookie_lock;
118 } epping_context_t;
119 
120 typedef enum {
121 	EPPING_TX_TIMER_STOPPED,
122 	EPPING_TX_TIMER_RUNNING
123 } epping_tx_timer_state_t;
124 
125 typedef struct epping_adapter_s {
126 	epping_context_t *pEpping_ctx;
127 	enum QDF_OPMODE device_mode;
128 	/** Handle to the network device */
129 	struct net_device *dev;
130 	struct qdf_mac_addr macAddressCurrent;
131 	uint8_t sessionId;
132 	/* for mboxping */
133 	qdf_spinlock_t data_lock;
134 	qdf_nbuf_queue_t nodrop_queue;
135 	qdf_timer_t epping_timer;
136 	epping_tx_timer_state_t epping_timer_state;
137 	bool registered;
138 	bool started;
139 	struct net_device_stats stats;
140 } epping_adapter_t;
141 
142 /* epping_helper signatures */
143 int epping_cookie_init(epping_context_t *pEpping_ctx);
144 void epping_cookie_cleanup(epping_context_t *pEpping_ctx);
145 void epping_free_cookie(epping_context_t *pEpping_ctx,
146 			struct epping_cookie *cookie);
147 struct epping_cookie *epping_alloc_cookie(epping_context_t *pEpping_ctx);
148 void epping_get_dummy_mac_addr(tSirMacAddr macAddr);
149 void epping_hex_dump(void *data, int buf_len, const char *str);
150 void *epping_get_qdf_ctx(void);
151 void epping_log_packet(epping_adapter_t *adapter,
152 		       EPPING_HEADER *eppingHdr, int ret, const char *str);
153 void epping_log_stats(epping_adapter_t *adapter, const char *str);
154 void epping_set_kperf_flag(epping_adapter_t *adapter,
155 			   HTC_ENDPOINT_ID eid, uint8_t kperf_flag);
156 
157 /* epping_tx signatures */
158 void epping_tx_timer_expire(epping_adapter_t *adapter);
159 void epping_tx_complete(void *ctx, HTC_PACKET *htc_pkt);
160 int epping_tx_send(qdf_nbuf_t skb, epping_adapter_t *adapter);
161 
162 #ifdef HIF_SDIO
163 enum htc_send_full_action epping_tx_queue_full(void *Context,
164 						struct _HTC_PACKET *pPacket);
165 #endif
166 void epping_tx_dup_pkt(epping_adapter_t *adapter,
167 		       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
168 /* epping_rx signatures */
169 void epping_rx(void *Context, HTC_PACKET *pPacket);
170 
171 #ifdef HIF_SDIO
172 void epping_refill(void *ctx, HTC_ENDPOINT_ID Endpoint);
173 #endif
174 
175 /* epping_txrx signatures */
176 epping_adapter_t *epping_add_adapter(epping_context_t *pEpping_ctx,
177 				     tSirMacAddr macAddr,
178 				     enum QDF_OPMODE device_mode,
179 				     bool rtnl_held);
180 void epping_destroy_adapter(epping_adapter_t *adapter);
181 int epping_connect_service(epping_context_t *pEpping_ctx);
182 #if defined(HIF_PCI) || defined(HIF_IPCI)
183 void epping_register_tx_copier(HTC_ENDPOINT_ID eid,
184 			       epping_context_t *pEpping_ctx);
185 void epping_unregister_tx_copier(HTC_ENDPOINT_ID eid,
186 				 epping_context_t *pEpping_ctx);
187 void epping_tx_copier_schedule(epping_context_t *pEpping_ctx,
188 			       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
189 #endif /* HIF_PCI || HIF_IPCI */
190 #endif /* end #ifndef EPPING_INTERNAL_H */
191