1 /* 2 * Copyright (c) 2014-2020 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 #if defined(HIF_PCI) || defined(HIF_IPCI) 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 #if defined(HIF_PCI) || defined(HIF_IPCI) 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 #if defined(HIF_PCI) || defined(HIF_IPCI) 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 || HIF_IPCI */ 196 #endif /* end #ifndef EPPING_INTERNAL_H */ 197