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