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