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