1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. 3*5113495bSYour Name * Copyright (c) 2022-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 /** 21*5113495bSYour Name * DOC: i_osdep 22*5113495bSYour Name * QCA driver framework OS dependent types 23*5113495bSYour Name */ 24*5113495bSYour Name 25*5113495bSYour Name #ifndef _I_OSDEP_H 26*5113495bSYour Name #define _I_OSDEP_H 27*5113495bSYour Name 28*5113495bSYour Name #include "queue.h" 29*5113495bSYour Name 30*5113495bSYour Name /* 31*5113495bSYour Name * Byte Order stuff 32*5113495bSYour Name */ 33*5113495bSYour Name #define le16toh(_x) le16_to_cpu(_x) 34*5113495bSYour Name #define htole16(_x) cpu_to_le16(_x) 35*5113495bSYour Name #define htobe16(_x) cpu_to_be16(_x) 36*5113495bSYour Name #define le32toh(_x) le32_to_cpu(_x) 37*5113495bSYour Name #define htole32(_x) cpu_to_le32(_x) 38*5113495bSYour Name #define be16toh(_x) be16_to_cpu(_x) 39*5113495bSYour Name #define be32toh(_x) be32_to_cpu(_x) 40*5113495bSYour Name #define htobe32(_x) cpu_to_be32(_x) 41*5113495bSYour Name 42*5113495bSYour Name #ifdef CONFIG_SMP 43*5113495bSYour Name /* Undo the one provided by the kernel to debug spin locks */ 44*5113495bSYour Name #undef spin_lock 45*5113495bSYour Name #undef spin_unlock 46*5113495bSYour Name #undef spin_trylock 47*5113495bSYour Name 48*5113495bSYour Name #define spin_lock(x) spin_lock_bh(x) 49*5113495bSYour Name 50*5113495bSYour Name #define spin_unlock(x) \ 51*5113495bSYour Name do { \ 52*5113495bSYour Name if (!spin_is_locked(x)) { \ 53*5113495bSYour Name WARN_ON(1); \ 54*5113495bSYour Name qdf_info("unlock addr=%pK, %s", x, \ 55*5113495bSYour Name !spin_is_locked(x) ? "Not locked" : ""); \ 56*5113495bSYour Name } \ 57*5113495bSYour Name spin_unlock_bh(x); \ 58*5113495bSYour Name } while (0) 59*5113495bSYour Name #define spin_trylock(x) spin_trylock_bh(x) 60*5113495bSYour Name #define OS_SUPPORT_ASYNC_Q 1 /* support for handling asyn function calls */ 61*5113495bSYour Name 62*5113495bSYour Name #else 63*5113495bSYour Name #define OS_SUPPORT_ASYNC_Q 0 64*5113495bSYour Name #endif /* ifdef CONFIG_SMP */ 65*5113495bSYour Name 66*5113495bSYour Name /** 67*5113495bSYour Name * typedef os_mesg_t - maintain attributes of message 68*5113495bSYour Name * @mesg_next: pointer to the nexgt message 69*5113495bSYour Name * @mest_type: type of message 70*5113495bSYour Name * @mesg_len: length of the message 71*5113495bSYour Name */ 72*5113495bSYour Name typedef struct _os_mesg_t { 73*5113495bSYour Name STAILQ_ENTRY(_os_mesg_t) mesg_next; 74*5113495bSYour Name uint16_t mesg_type; 75*5113495bSYour Name uint16_t mesg_len; 76*5113495bSYour Name } os_mesg_t; 77*5113495bSYour Name 78*5113495bSYour Name /** 79*5113495bSYour Name * struct qdf_bus_context - Bus to hal context handoff 80*5113495bSYour Name * @bc_tag: bus context tag 81*5113495bSYour Name * @cal_in_flash: calibration data stored in flash 82*5113495bSYour Name * @bc_handle: bus context handle 83*5113495bSYour Name * @bc_bustype: bus type 84*5113495bSYour Name */ 85*5113495bSYour Name typedef struct qdf_bus_context { 86*5113495bSYour Name void *bc_tag; 87*5113495bSYour Name int cal_in_flash; 88*5113495bSYour Name char *bc_handle; 89*5113495bSYour Name enum qdf_bus_type bc_bustype; 90*5113495bSYour Name } QDF_BUS_CONTEXT; 91*5113495bSYour Name 92*5113495bSYour Name typedef struct _NIC_DEV *osdev_t; 93*5113495bSYour Name 94*5113495bSYour Name typedef void (*os_mesg_handler_t)(void *ctx, uint16_t mesg_type, 95*5113495bSYour Name uint16_t mesg_len, 96*5113495bSYour Name void *mesg); 97*5113495bSYour Name 98*5113495bSYour Name 99*5113495bSYour Name /** 100*5113495bSYour Name * typedef os_mesg_queue_t - Object to maintain message queue 101*5113495bSYour Name * @dev_handle: OS handle 102*5113495bSYour Name * @num_queued: number of queued messages 103*5113495bSYour Name * @mesg_len: message length 104*5113495bSYour Name * @mesg_queue_buf: pointer to message queue buffer 105*5113495bSYour Name * @mesg_head: queued mesg buffers 106*5113495bSYour Name * @mesg_free_head: free mesg buffers 107*5113495bSYour Name * @lock: spinlock object 108*5113495bSYour Name * @ev_handler_lock: spinlock object to event handler 109*5113495bSYour Name * @task: pointer to task 110*5113495bSYour Name * @_timer: instance of timer 111*5113495bSYour Name * @handler: message handler 112*5113495bSYour Name * @ctx: pointer to context 113*5113495bSYour Name * @is_synchronous: bit to save synchronous status 114*5113495bSYour Name * @del_progress: delete in progress 115*5113495bSYour Name */ 116*5113495bSYour Name typedef struct { 117*5113495bSYour Name osdev_t dev_handle; 118*5113495bSYour Name int32_t num_queued; 119*5113495bSYour Name int32_t mesg_len; 120*5113495bSYour Name uint8_t *mesg_queue_buf; 121*5113495bSYour Name 122*5113495bSYour Name STAILQ_HEAD(, _os_mesg_t) mesg_head; 123*5113495bSYour Name STAILQ_HEAD(, _os_mesg_t) mesg_free_head; 124*5113495bSYour Name spinlock_t lock; 125*5113495bSYour Name spinlock_t ev_handler_lock; 126*5113495bSYour Name #ifdef USE_SOFTINTR 127*5113495bSYour Name void *_task; 128*5113495bSYour Name #else 129*5113495bSYour Name qdf_timer_t _timer; 130*5113495bSYour Name #endif 131*5113495bSYour Name os_mesg_handler_t handler; 132*5113495bSYour Name void *ctx; 133*5113495bSYour Name uint8_t is_synchronous:1; 134*5113495bSYour Name uint8_t del_progress; 135*5113495bSYour Name } os_mesg_queue_t; 136*5113495bSYour Name 137*5113495bSYour Name /** 138*5113495bSYour Name * struct _NIC_DEV - Definition of OS-dependent device structure. 139*5113495bSYour Name * It'll be opaque to the actual ATH layer. 140*5113495bSYour Name * @qdf_dev: qdf device 141*5113495bSYour Name * @bdev: bus device handle 142*5113495bSYour Name * @netdev: net device handle (wifi%d) 143*5113495bSYour Name * @ops: net device operation 144*5113495bSYour Name * @intr_tq: tasklet 145*5113495bSYour Name * @devstats: net device statistics 146*5113495bSYour Name * @bc: hal bus context 147*5113495bSYour Name * @device: generic device 148*5113495bSYour Name * @event_queue: instance to wait queue 149*5113495bSYour Name * @async_q: 150*5113495bSYour Name * @is_device_asleep: keep device status, sleep or awakei 151*5113495bSYour Name * @acfg_event_list: event list 152*5113495bSYour Name * @acfg_event_queue_lock: queue lock 153*5113495bSYour Name * @acfg_event_os_work: schedule or create work 154*5113495bSYour Name * @acfg_netlink_wq_init_done: Work queue ready 155*5113495bSYour Name * @osdev_acfg_handle: acfg handle 156*5113495bSYour Name * @vap_hardstart: Tx function specific to the radio 157*5113495bSYour Name * initiailzed during VAP create 158*5113495bSYour Name */ 159*5113495bSYour Name struct _NIC_DEV { 160*5113495bSYour Name qdf_device_t qdf_dev; 161*5113495bSYour Name void *bdev; 162*5113495bSYour Name struct net_device *netdev; 163*5113495bSYour Name struct net_device_ops ops; 164*5113495bSYour Name qdf_bh_t intr_tq; 165*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) 166*5113495bSYour Name struct rtnl_link_stats64 devstats; 167*5113495bSYour Name #else 168*5113495bSYour Name struct net_device_stats devstats; 169*5113495bSYour Name #endif 170*5113495bSYour Name QDF_BUS_CONTEXT bc; 171*5113495bSYour Name #ifdef ATH_PERF_PWR_OFFLOAD 172*5113495bSYour Name struct device *device; 173*5113495bSYour Name wait_queue_head_t event_queue; 174*5113495bSYour Name #endif /* PERF_PWR_OFFLOAD */ 175*5113495bSYour Name #if OS_SUPPORT_ASYNC_Q 176*5113495bSYour Name os_mesg_queue_t async_q; 177*5113495bSYour Name #endif 178*5113495bSYour Name #ifdef ATH_BUS_PM 179*5113495bSYour Name uint8_t is_device_asleep; 180*5113495bSYour Name #endif /* ATH_BUS_PM */ 181*5113495bSYour Name qdf_nbuf_queue_t acfg_event_list; 182*5113495bSYour Name qdf_spinlock_t acfg_event_queue_lock; 183*5113495bSYour Name qdf_work_t acfg_event_os_work; 184*5113495bSYour Name uint8_t acfg_netlink_wq_init_done; 185*5113495bSYour Name 186*5113495bSYour Name #ifdef UMAC_SUPPORT_ACFG 187*5113495bSYour Name #ifdef ACFG_NETLINK_TX 188*5113495bSYour Name void *osdev_acfg_handle; 189*5113495bSYour Name #endif /* ACFG_NETLINK_TX */ 190*5113495bSYour Name #endif /* UMAC_SUPPORT_ACFG */ 191*5113495bSYour Name int (*vap_hardstart)(struct sk_buff *skb, struct net_device *dev); 192*5113495bSYour Name }; 193*5113495bSYour Name 194*5113495bSYour Name #define __QDF_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos) \ 195*5113495bSYour Name proc_dointvec(ctl, write, buffer, lenp, ppos) 196*5113495bSYour Name 197*5113495bSYour Name #endif /* _I_OSDEP_H */ 198