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