/* * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /** * DOC: i_osdep * QCA driver framework OS dependent types */ #ifndef _I_OSDEP_H #define _I_OSDEP_H #include "queue.h" /* * Byte Order stuff */ #define le16toh(_x) le16_to_cpu(_x) #define htole16(_x) cpu_to_le16(_x) #define htobe16(_x) cpu_to_be16(_x) #define le32toh(_x) le32_to_cpu(_x) #define htole32(_x) cpu_to_le32(_x) #define be16toh(_x) be16_to_cpu(_x) #define be32toh(_x) be32_to_cpu(_x) #define htobe32(_x) cpu_to_be32(_x) #ifdef CONFIG_SMP /* Undo the one provided by the kernel to debug spin locks */ #undef spin_lock #undef spin_unlock #undef spin_trylock #define spin_lock(x) spin_lock_bh(x) #define spin_unlock(x) \ do { \ if (!spin_is_locked(x)) { \ WARN_ON(1); \ qdf_info("unlock addr=%pK, %s", x, \ !spin_is_locked(x) ? "Not locked" : ""); \ } \ spin_unlock_bh(x); \ } while (0) #define spin_trylock(x) spin_trylock_bh(x) #define OS_SUPPORT_ASYNC_Q 1 /* support for handling asyn function calls */ #else #define OS_SUPPORT_ASYNC_Q 0 #endif /* ifdef CONFIG_SMP */ /** * struct os_mest_t - maintain attributes of message * @mesg_next: pointer to the nexgt message * @mest_type: type of message * @mesg_len: length of the message */ typedef struct _os_mesg_t { STAILQ_ENTRY(_os_mesg_t) mesg_next; uint16_t mesg_type; uint16_t mesg_len; } os_mesg_t; /** * struct qdf_bus_context - Bus to hal context handoff * @bc_tag: bus context tag * @cal_in_flash: calibration data stored in flash * @bc_handle: bus context handle * @bc_bustype: bus type */ typedef struct qdf_bus_context { void *bc_tag; int cal_in_flash; char *bc_handle; enum qdf_bus_type bc_bustype; } QDF_BUS_CONTEXT; typedef struct _NIC_DEV *osdev_t; typedef void (*os_mesg_handler_t)(void *ctx, uint16_t mesg_type, uint16_t mesg_len, void *mesg); /** * typedef os_mesg_queue_t - Object to maintain message queue * @dev_handle: OS handle * @num_queued: number of queued messages * @mesg_len: message length * @mesg_queue_buf: pointer to message queue buffer * @mesg_head: queued mesg buffers * @mesg_free_head: free mesg buffers * @lock: spinlock object * @ev_handler_lock: spinlock object to event handler * @task: pointer to task * @_timer: instance of timer * @handler: message handler * @ctx: pointer to context * @is_synchronous: bit to save synchronous status * @del_progress: delete in progress */ typedef struct { osdev_t dev_handle; int32_t num_queued; int32_t mesg_len; uint8_t *mesg_queue_buf; STAILQ_HEAD(, _os_mesg_t) mesg_head; STAILQ_HEAD(, _os_mesg_t) mesg_free_head; spinlock_t lock; spinlock_t ev_handler_lock; #ifdef USE_SOFTINTR void *_task; #else qdf_timer_t _timer; #endif os_mesg_handler_t handler; void *ctx; uint8_t is_synchronous:1; uint8_t del_progress; } os_mesg_queue_t; /** * struct _NIC_DEV - Definition of OS-dependent device structure. * It'll be opaque to the actual ATH layer. * @qdf_dev: qdf device * @bdev: bus device handle * @netdev: net device handle (wifi%d) * @intr_tq: tasklet * @devstats: net device statistics * @bc: hal bus context * @device: generic device * @event_queue: instance to wait queue * @is_device_asleep: keep device status, sleep or awakei * @acfg_event_list: event list * @acfg_event_queue_lock: queue lock * @acfg_event_os_work: schedule or create work * @acfg_netlink_wq_init_done: Work queue ready * @osdev_acfg_handle: acfg handle * @vap_hardstart: Tx function specific to the radio * initiailzed during VAP create */ struct _NIC_DEV { qdf_device_t qdf_dev; void *bdev; struct net_device *netdev; qdf_bh_t intr_tq; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) struct rtnl_link_stats64 devstats; #else struct net_device_stats devstats; #endif QDF_BUS_CONTEXT bc; #ifdef ATH_PERF_PWR_OFFLOAD struct device *device; wait_queue_head_t event_queue; #endif /* PERF_PWR_OFFLOAD */ #if OS_SUPPORT_ASYNC_Q os_mesg_queue_t async_q; #endif #ifdef ATH_BUS_PM uint8_t is_device_asleep; #endif /* ATH_BUS_PM */ qdf_nbuf_queue_t acfg_event_list; qdf_spinlock_t acfg_event_queue_lock; qdf_work_t acfg_event_os_work; uint8_t acfg_netlink_wq_init_done; #ifdef UMAC_SUPPORT_ACFG #ifdef ACFG_NETLINK_TX void *osdev_acfg_handle; #endif /* ACFG_NETLINK_TX */ #endif /* UMAC_SUPPORT_ACFG */ int (*vap_hardstart)(struct sk_buff *skb, struct net_device *dev); }; #define __QDF_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos) \ proc_dointvec(ctl, write, buffer, lenp, ppos) #endif /* _I_OSDEP_H */