xref: /wlan-driver/qca-wifi-host-cmn/utils/epping/inc/epping_internal.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2023 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 EPPING_INTERNAL_H
21*5113495bSYour Name #define EPPING_INTERNAL_H
22*5113495bSYour Name /**
23*5113495bSYour Name  * DOC: epping_internal.h
24*5113495bSYour Name  *      Linux epping internal head file
25*5113495bSYour Name  */
26*5113495bSYour Name 
27*5113495bSYour Name #include <linux/netdevice.h>
28*5113495bSYour Name #include <linux/skbuff.h>
29*5113495bSYour Name #include <linux/spinlock.h>
30*5113495bSYour Name #include <linux/kthread.h>
31*5113495bSYour Name #include <linux/semaphore.h>
32*5113495bSYour Name #if defined(CONFIG_HAS_WAKELOCK)
33*5113495bSYour Name #include <linux/wakelock.h>
34*5113495bSYour Name #endif
35*5113495bSYour Name #include "htc_api.h"
36*5113495bSYour Name #include "htc_packet.h"
37*5113495bSYour Name #include "epping_test.h"
38*5113495bSYour Name #include <qdf_atomic.h>
39*5113495bSYour Name #include <sir_mac_prot_def.h>
40*5113495bSYour Name #include <sir_debug.h>
41*5113495bSYour Name 
42*5113495bSYour Name #define EPPING_LOG_MASK (1<<EPPING_CMD_CAPTURE_RECV_CNT)
43*5113495bSYour Name #define EPPING_STATS_LOG_COUNT 50000
44*5113495bSYour Name #define EPPING_KTID_KILL_WAIT_TIME_MS 50
45*5113495bSYour Name 
46*5113495bSYour Name #define EPPING_FRAG_PER_MSDU   1
47*5113495bSYour Name #ifndef EPPING_TXBUF
48*5113495bSYour Name #define EPPING_TXBUF   (512/EPPING_FRAG_PER_MSDU)
49*5113495bSYour Name #endif
50*5113495bSYour Name 
51*5113495bSYour Name /*---------------------------------------------------------------------------
52*5113495bSYour Name    Preprocessor definitions and constants
53*5113495bSYour Name    -------------------------------------------------------------------------*/
54*5113495bSYour Name #define EPPING_MAX_ADAPTERS             1
55*5113495bSYour Name 
56*5113495bSYour Name #define EPPING_LOG(level, args ...) QDF_TRACE(QDF_MODULE_ID_HDD, level, ## args)
57*5113495bSYour Name #define EPPING_HEX_DUMP(level, data, len) qdf_trace_hex_dump( \
58*5113495bSYour Name 						QDF_MODULE_ID_HDD, \
59*5113495bSYour Name 						level, \
60*5113495bSYour Name 						data, buf_len)
61*5113495bSYour Name 
62*5113495bSYour Name struct epping_cookie {
63*5113495bSYour Name 	HTC_PACKET HtcPkt;      /* HTC packet wrapper */
64*5113495bSYour Name 	struct epping_cookie *next;
65*5113495bSYour Name };
66*5113495bSYour Name 
67*5113495bSYour Name typedef enum {
68*5113495bSYour Name 	EPPING_CTX_STATE_INITIAL = 0,
69*5113495bSYour Name 	EPPING_CTX_STATE_HIF_INIT,
70*5113495bSYour Name 	EPPING_CTX_STATE_STARTUP,
71*5113495bSYour Name 	EPPING_CTX_STATE_STARTED,
72*5113495bSYour Name 	EPPING_CTX_STATE_STOP
73*5113495bSYour Name } epping_ctx_state_t;
74*5113495bSYour Name 
75*5113495bSYour Name #define EPPING_MAX_NUM_EPIDS 4
76*5113495bSYour Name #define MAX_COOKIE_SLOTS_NUM 4
77*5113495bSYour Name #define MAX_COOKIE_SLOT_SIZE 512
78*5113495bSYour Name #define MAX_TX_PKT_DUP_NUM   4
79*5113495bSYour Name 
80*5113495bSYour Name #if defined(HIF_PCI) || defined(HIF_IPCI)
81*5113495bSYour Name #define WLAN_EPPING_DELAY_TIMEOUT_US     10
82*5113495bSYour Name #define EPPING_MAX_CE_NUMS               8
83*5113495bSYour Name #define EPPING_MAX_WATER_MARK            8
84*5113495bSYour Name typedef struct {
85*5113495bSYour Name 	struct task_struct *pid;
86*5113495bSYour Name 	void *arg;
87*5113495bSYour Name 	bool done;
88*5113495bSYour Name 	qdf_nbuf_t skb;
89*5113495bSYour Name 	HTC_ENDPOINT_ID eid;
90*5113495bSYour Name 	struct semaphore sem;
91*5113495bSYour Name 	bool inited;
92*5113495bSYour Name 	qdf_atomic_t atm;
93*5113495bSYour Name } epping_poll_t;
94*5113495bSYour Name #endif
95*5113495bSYour Name 
96*5113495bSYour Name typedef struct epping_context {
97*5113495bSYour Name 	int32_t con_mode;
98*5113495bSYour Name 	char *pwlan_module_name;
99*5113495bSYour Name 	uint32_t target_type;
100*5113495bSYour Name 	void *p_cds_context;    /* CDS context */
101*5113495bSYour Name 	struct device *parent_dev;      /* Pointer to the parent device */
102*5113495bSYour Name 	epping_ctx_state_t e_ctx_state;
103*5113495bSYour Name 	bool wow_nack;
104*5113495bSYour Name 	void *epping_adapter;
105*5113495bSYour Name 	HTC_HANDLE HTCHandle;
106*5113495bSYour Name 	HTC_ENDPOINT_ID EppingEndpoint[EPPING_MAX_NUM_EPIDS];
107*5113495bSYour Name 	unsigned int kperf_num_rx_recv[EPPING_MAX_NUM_EPIDS];
108*5113495bSYour Name 	unsigned int kperf_num_tx_acks[EPPING_MAX_NUM_EPIDS];
109*5113495bSYour Name 	unsigned int total_rx_recv;
110*5113495bSYour Name 	unsigned int total_tx_acks;
111*5113495bSYour Name #if defined(HIF_PCI) || defined(HIF_IPCI)
112*5113495bSYour Name 	epping_poll_t epping_poll[EPPING_MAX_NUM_EPIDS];
113*5113495bSYour Name #endif
114*5113495bSYour Name 	struct epping_cookie *cookie_list;
115*5113495bSYour Name 	int cookie_count;
116*5113495bSYour Name 	struct epping_cookie *s_cookie_mem[MAX_COOKIE_SLOTS_NUM];
117*5113495bSYour Name 	qdf_spinlock_t cookie_lock;
118*5113495bSYour Name } epping_context_t;
119*5113495bSYour Name 
120*5113495bSYour Name typedef enum {
121*5113495bSYour Name 	EPPING_TX_TIMER_STOPPED,
122*5113495bSYour Name 	EPPING_TX_TIMER_RUNNING
123*5113495bSYour Name } epping_tx_timer_state_t;
124*5113495bSYour Name 
125*5113495bSYour Name typedef struct epping_adapter_s {
126*5113495bSYour Name 	epping_context_t *pEpping_ctx;
127*5113495bSYour Name 	enum QDF_OPMODE device_mode;
128*5113495bSYour Name 	/** Handle to the network device */
129*5113495bSYour Name 	struct net_device *dev;
130*5113495bSYour Name 	struct qdf_mac_addr macAddressCurrent;
131*5113495bSYour Name 	uint8_t sessionId;
132*5113495bSYour Name 	/* for mboxping */
133*5113495bSYour Name 	qdf_spinlock_t data_lock;
134*5113495bSYour Name 	qdf_nbuf_queue_t nodrop_queue;
135*5113495bSYour Name 	qdf_timer_t epping_timer;
136*5113495bSYour Name 	epping_tx_timer_state_t epping_timer_state;
137*5113495bSYour Name 	bool registered;
138*5113495bSYour Name 	bool started;
139*5113495bSYour Name 	struct net_device_stats stats;
140*5113495bSYour Name } epping_adapter_t;
141*5113495bSYour Name 
142*5113495bSYour Name /* epping_helper signatures */
143*5113495bSYour Name int epping_cookie_init(epping_context_t *pEpping_ctx);
144*5113495bSYour Name void epping_cookie_cleanup(epping_context_t *pEpping_ctx);
145*5113495bSYour Name void epping_free_cookie(epping_context_t *pEpping_ctx,
146*5113495bSYour Name 			struct epping_cookie *cookie);
147*5113495bSYour Name struct epping_cookie *epping_alloc_cookie(epping_context_t *pEpping_ctx);
148*5113495bSYour Name void epping_get_dummy_mac_addr(tSirMacAddr macAddr);
149*5113495bSYour Name void epping_hex_dump(void *data, int buf_len, const char *str);
150*5113495bSYour Name void *epping_get_qdf_ctx(void);
151*5113495bSYour Name void epping_log_packet(epping_adapter_t *adapter,
152*5113495bSYour Name 		       EPPING_HEADER *eppingHdr, int ret, const char *str);
153*5113495bSYour Name void epping_log_stats(epping_adapter_t *adapter, const char *str);
154*5113495bSYour Name void epping_set_kperf_flag(epping_adapter_t *adapter,
155*5113495bSYour Name 			   HTC_ENDPOINT_ID eid, uint8_t kperf_flag);
156*5113495bSYour Name 
157*5113495bSYour Name /* epping_tx signatures */
158*5113495bSYour Name void epping_tx_timer_expire(epping_adapter_t *adapter);
159*5113495bSYour Name void epping_tx_complete(void *ctx, HTC_PACKET *htc_pkt);
160*5113495bSYour Name int epping_tx_send(qdf_nbuf_t skb, epping_adapter_t *adapter);
161*5113495bSYour Name 
162*5113495bSYour Name #ifdef HIF_SDIO
163*5113495bSYour Name enum htc_send_full_action epping_tx_queue_full(void *Context,
164*5113495bSYour Name 						struct _HTC_PACKET *pPacket);
165*5113495bSYour Name #endif
166*5113495bSYour Name void epping_tx_dup_pkt(epping_adapter_t *adapter,
167*5113495bSYour Name 		       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
168*5113495bSYour Name /* epping_rx signatures */
169*5113495bSYour Name void epping_rx(void *Context, HTC_PACKET *pPacket);
170*5113495bSYour Name 
171*5113495bSYour Name #ifdef HIF_SDIO
172*5113495bSYour Name void epping_refill(void *ctx, HTC_ENDPOINT_ID Endpoint);
173*5113495bSYour Name #endif
174*5113495bSYour Name 
175*5113495bSYour Name /* epping_txrx signatures */
176*5113495bSYour Name epping_adapter_t *epping_add_adapter(epping_context_t *pEpping_ctx,
177*5113495bSYour Name 				     tSirMacAddr macAddr,
178*5113495bSYour Name 				     enum QDF_OPMODE device_mode,
179*5113495bSYour Name 				     bool rtnl_held);
180*5113495bSYour Name void epping_destroy_adapter(epping_adapter_t *adapter);
181*5113495bSYour Name int epping_connect_service(epping_context_t *pEpping_ctx);
182*5113495bSYour Name #if defined(HIF_PCI) || defined(HIF_IPCI)
183*5113495bSYour Name void epping_register_tx_copier(HTC_ENDPOINT_ID eid,
184*5113495bSYour Name 			       epping_context_t *pEpping_ctx);
185*5113495bSYour Name void epping_unregister_tx_copier(HTC_ENDPOINT_ID eid,
186*5113495bSYour Name 				 epping_context_t *pEpping_ctx);
187*5113495bSYour Name void epping_tx_copier_schedule(epping_context_t *pEpping_ctx,
188*5113495bSYour Name 			       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
189*5113495bSYour Name #endif /* HIF_PCI || HIF_IPCI */
190*5113495bSYour Name #endif /* end #ifndef EPPING_INTERNAL_H */
191