xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/i_osdep.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
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