xref: /wlan-dirver/qca-wifi-host-cmn/utils/epping/inc/epping_internal.h (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
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 
64 struct epping_cookie {
65 	HTC_PACKET HtcPkt;      /* HTC packet wrapper */
66 	struct epping_cookie *next;
67 };
68 
69 typedef enum {
70 	EPPING_CTX_STATE_INITIAL = 0,
71 	EPPING_CTX_STATE_HIF_INIT,
72 	EPPING_CTX_STATE_STARTUP,
73 	EPPING_CTX_STATE_STARTED,
74 	EPPING_CTX_STATE_STOP
75 } epping_ctx_state_t;
76 
77 #define EPPING_MAX_NUM_EPIDS 4
78 #define MAX_COOKIE_SLOTS_NUM 4
79 #define MAX_COOKIE_SLOT_SIZE 512
80 #define MAX_TX_PKT_DUP_NUM   4
81 
82 #ifdef HIF_PCI
83 #define WLAN_EPPING_DELAY_TIMEOUT_US     10
84 #define EPPING_MAX_CE_NUMS               8
85 #define EPPING_MAX_WATER_MARK            8
86 typedef struct {
87 	struct task_struct *pid;
88 	void *arg;
89 	bool done;
90 	qdf_nbuf_t skb;
91 	HTC_ENDPOINT_ID eid;
92 	struct semaphore sem;
93 	bool inited;
94 	qdf_atomic_t atm;
95 } epping_poll_t;
96 #endif
97 
98 typedef struct epping_context {
99 	int32_t con_mode;
100 	char *pwlan_module_name;
101 	uint32_t target_type;
102 	void *p_cds_context;    /* CDS context */
103 	struct device *parent_dev;      /* Pointer to the parent device */
104 	epping_ctx_state_t e_ctx_state;
105 	bool wow_nack;
106 	void *epping_adapter;
107 	HTC_HANDLE HTCHandle;
108 	HTC_ENDPOINT_ID EppingEndpoint[EPPING_MAX_NUM_EPIDS];
109 	unsigned int kperf_num_rx_recv[EPPING_MAX_NUM_EPIDS];
110 	unsigned int kperf_num_tx_acks[EPPING_MAX_NUM_EPIDS];
111 	unsigned int total_rx_recv;
112 	unsigned int total_tx_acks;
113 #ifdef HIF_PCI
114 	epping_poll_t epping_poll[EPPING_MAX_NUM_EPIDS];
115 #endif
116 	struct epping_cookie *cookie_list;
117 	int cookie_count;
118 	struct epping_cookie *s_cookie_mem[MAX_COOKIE_SLOTS_NUM];
119 	qdf_spinlock_t cookie_lock;
120 } epping_context_t;
121 
122 typedef enum {
123 	EPPING_TX_TIMER_STOPPED,
124 	EPPING_TX_TIMER_RUNNING
125 } epping_tx_timer_state_t;
126 
127 typedef struct epping_adapter_s {
128 	epping_context_t *pEpping_ctx;
129 	enum QDF_OPMODE device_mode;
130 	/** Handle to the network device */
131 	struct net_device *dev;
132 	struct qdf_mac_addr macAddressCurrent;
133 	uint8_t sessionId;
134 	/* for mboxping */
135 	qdf_spinlock_t data_lock;
136 	qdf_nbuf_queue_t nodrop_queue;
137 	qdf_timer_t epping_timer;
138 	epping_tx_timer_state_t epping_timer_state;
139 	bool registered;
140 	bool started;
141 	struct net_device_stats stats;
142 } epping_adapter_t;
143 
144 /* epping_helper signatures */
145 int epping_cookie_init(epping_context_t *pEpping_ctx);
146 void epping_cookie_cleanup(epping_context_t *pEpping_ctx);
147 void epping_free_cookie(epping_context_t *pEpping_ctx,
148 			struct epping_cookie *cookie);
149 struct epping_cookie *epping_alloc_cookie(epping_context_t *pEpping_ctx);
150 void epping_get_dummy_mac_addr(tSirMacAddr macAddr);
151 void epping_hex_dump(void *data, int buf_len, const char *str);
152 void *epping_get_qdf_ctx(void);
153 void epping_log_packet(epping_adapter_t *adapter,
154 		       EPPING_HEADER *eppingHdr, int ret, const char *str);
155 void epping_log_stats(epping_adapter_t *adapter, const char *str);
156 void epping_set_kperf_flag(epping_adapter_t *adapter,
157 			   HTC_ENDPOINT_ID eid, uint8_t kperf_flag);
158 
159 /* epping_tx signatures */
160 void epping_tx_timer_expire(epping_adapter_t *adapter);
161 void epping_tx_complete(void *ctx, HTC_PACKET *htc_pkt);
162 int epping_tx_send(qdf_nbuf_t skb, epping_adapter_t *adapter);
163 
164 #ifdef HIF_SDIO
165 enum htc_send_full_action epping_tx_queue_full(void *Context,
166 						struct _HTC_PACKET *pPacket);
167 #endif
168 void epping_tx_dup_pkt(epping_adapter_t *adapter,
169 		       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
170 /* epping_rx signatures */
171 void epping_rx(void *Context, HTC_PACKET *pPacket);
172 
173 #ifdef HIF_SDIO
174 void epping_refill(void *ctx, HTC_ENDPOINT_ID Endpoint);
175 #endif
176 
177 /* epping_txrx signatures */
178 epping_adapter_t *epping_add_adapter(epping_context_t *pEpping_ctx,
179 				     tSirMacAddr macAddr,
180 				     enum QDF_OPMODE device_mode,
181 				     bool rtnl_held);
182 void epping_destroy_adapter(epping_adapter_t *adapter);
183 int epping_connect_service(epping_context_t *pEpping_ctx);
184 #ifdef HIF_PCI
185 void epping_register_tx_copier(HTC_ENDPOINT_ID eid,
186 			       epping_context_t *pEpping_ctx);
187 void epping_unregister_tx_copier(HTC_ENDPOINT_ID eid,
188 				 epping_context_t *pEpping_ctx);
189 void epping_tx_copier_schedule(epping_context_t *pEpping_ctx,
190 			       HTC_ENDPOINT_ID eid, qdf_nbuf_t skb);
191 #endif /* HIF_PCI */
192 #endif /* end #ifndef EPPING_INTERNAL_H */
193