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