xref: /wlan-driver/qcacld-3.0/core/pld/src/pld_sdio.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2019 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 __PLD_SDIO_H__
21*5113495bSYour Name #define __PLD_SDIO_H__
22*5113495bSYour Name 
23*5113495bSYour Name #ifdef CONFIG_PLD_SDIO_CNSS
24*5113495bSYour Name #include <net/cnss.h>
25*5113495bSYour Name #endif
26*5113495bSYour Name #include "pld_common.h"
27*5113495bSYour Name 
28*5113495bSYour Name #ifdef DYNAMIC_SINGLE_CHIP
29*5113495bSYour Name #define PREFIX DYNAMIC_SINGLE_CHIP "/"
30*5113495bSYour Name #else
31*5113495bSYour Name 
32*5113495bSYour Name #ifdef MULTI_IF_NAME
33*5113495bSYour Name #define PREFIX MULTI_IF_NAME "/"
34*5113495bSYour Name #else
35*5113495bSYour Name #define PREFIX ""
36*5113495bSYour Name #endif
37*5113495bSYour Name 
38*5113495bSYour Name #endif
39*5113495bSYour Name 
40*5113495bSYour Name #define PLD_QCA9377_REV1_1_VERSION          0x5020001
41*5113495bSYour Name #define PLD_QCA9379_REV1_VERSION            0x5040000
42*5113495bSYour Name 
43*5113495bSYour Name #ifndef CONFIG_CNSS
44*5113495bSYour Name #define PLD_AR6004_VERSION_REV1_3           0x31c8088a
45*5113495bSYour Name #define PLD_AR9888_REV2_VERSION             0x4100016c
46*5113495bSYour Name #define PLD_AR6320_REV1_VERSION             0x5000000
47*5113495bSYour Name #define PLD_AR6320_REV1_1_VERSION           0x5000001
48*5113495bSYour Name #define PLD_AR6320_REV1_3_VERSION           0x5000003
49*5113495bSYour Name #define PLD_AR6320_REV2_1_VERSION           0x5010000
50*5113495bSYour Name #define PLD_AR6320_REV3_VERSION             0x5020000
51*5113495bSYour Name #define PLD_AR6320_REV3_2_VERSION           0x5030000
52*5113495bSYour Name #define PLD_AR6320_DEV_VERSION              0x1000000
53*5113495bSYour Name 
54*5113495bSYour Name 
55*5113495bSYour Name #endif
56*5113495bSYour Name 
57*5113495bSYour Name #ifndef CONFIG_SDIO
pld_sdio_register_driver(void)58*5113495bSYour Name static inline int pld_sdio_register_driver(void)
59*5113495bSYour Name {
60*5113495bSYour Name 	return 0;
61*5113495bSYour Name }
62*5113495bSYour Name 
pld_sdio_unregister_driver(void)63*5113495bSYour Name static inline void pld_sdio_unregister_driver(void)
64*5113495bSYour Name {
65*5113495bSYour Name }
66*5113495bSYour Name 
67*5113495bSYour Name static inline
pld_sdio_get_fw_files_for_target(struct pld_fw_files * pfw_files,u32 target_type,u32 target_version)68*5113495bSYour Name int pld_sdio_get_fw_files_for_target(struct pld_fw_files *pfw_files,
69*5113495bSYour Name 				     u32 target_type, u32 target_version)
70*5113495bSYour Name {
71*5113495bSYour Name 	return 0;
72*5113495bSYour Name }
pld_sdio_get_wlan_mac_address(struct device * dev,uint32_t * num)73*5113495bSYour Name static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
74*5113495bSYour Name 						     uint32_t *num)
75*5113495bSYour Name {
76*5113495bSYour Name 	*num = 0;
77*5113495bSYour Name 	return NULL;
78*5113495bSYour Name }
79*5113495bSYour Name #else
80*5113495bSYour Name /**
81*5113495bSYour Name  * pld_sdio_register_driver() - Register SDIO device callback functions
82*5113495bSYour Name  *
83*5113495bSYour Name  * Return: int
84*5113495bSYour Name  */
85*5113495bSYour Name int pld_sdio_register_driver(void);
86*5113495bSYour Name 
87*5113495bSYour Name /**
88*5113495bSYour Name  * pld_sdio_unregister_driver() - Unregister SDIO device callback functions
89*5113495bSYour Name  *
90*5113495bSYour Name  * Return: void
91*5113495bSYour Name  */
92*5113495bSYour Name void pld_sdio_unregister_driver(void);
93*5113495bSYour Name 
94*5113495bSYour Name /**
95*5113495bSYour Name  * pld_sdio_get_fw_files_for_target() - Get FW file names
96*5113495bSYour Name  * @pfw_files: buffer for FW file names
97*5113495bSYour Name  * @target_type: target type
98*5113495bSYour Name  * @target_version: target version
99*5113495bSYour Name  *
100*5113495bSYour Name  * Return target specific FW file names to the buffer.
101*5113495bSYour Name  *
102*5113495bSYour Name  * Return: 0 for success
103*5113495bSYour Name  *         Non zero failure code for errors
104*5113495bSYour Name  */
105*5113495bSYour Name int pld_sdio_get_fw_files_for_target(struct pld_fw_files *pfw_files,
106*5113495bSYour Name 				     u32 target_type, u32 target_version);
107*5113495bSYour Name #ifdef CONFIG_CNSS
pld_sdio_get_wlan_mac_address(struct device * dev,uint32_t * num)108*5113495bSYour Name static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
109*5113495bSYour Name 						     uint32_t *num)
110*5113495bSYour Name {
111*5113495bSYour Name 	return cnss_common_get_wlan_mac_address(dev, num);
112*5113495bSYour Name }
113*5113495bSYour Name #else
pld_sdio_get_wlan_mac_address(struct device * dev,uint32_t * num)114*5113495bSYour Name static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
115*5113495bSYour Name 						     uint32_t *num)
116*5113495bSYour Name {
117*5113495bSYour Name 	*num = 0;
118*5113495bSYour Name 	return NULL;
119*5113495bSYour Name }
120*5113495bSYour Name #endif
121*5113495bSYour Name #endif
122*5113495bSYour Name 
123*5113495bSYour Name #ifdef CONFIG_PLD_SDIO_CNSS
pld_sdio_get_virt_ramdump_mem(struct device * dev,unsigned long * size)124*5113495bSYour Name static inline void *pld_sdio_get_virt_ramdump_mem(struct device *dev,
125*5113495bSYour Name 		unsigned long *size)
126*5113495bSYour Name {
127*5113495bSYour Name 	return cnss_common_get_virt_ramdump_mem(dev, size);
128*5113495bSYour Name }
129*5113495bSYour Name 
pld_sdio_release_virt_ramdump_mem(void * address)130*5113495bSYour Name static inline void pld_sdio_release_virt_ramdump_mem(void *address)
131*5113495bSYour Name {
132*5113495bSYour Name }
133*5113495bSYour Name 
pld_sdio_device_crashed(struct device * dev)134*5113495bSYour Name static inline void pld_sdio_device_crashed(struct device *dev)
135*5113495bSYour Name {
136*5113495bSYour Name 	cnss_common_device_crashed(dev);
137*5113495bSYour Name }
pld_sdio_is_fw_dump_skipped(void)138*5113495bSYour Name static inline bool pld_sdio_is_fw_dump_skipped(void)
139*5113495bSYour Name {
140*5113495bSYour Name 	return cnss_get_restart_level() == CNSS_RESET_SUBSYS_COUPLED;
141*5113495bSYour Name }
142*5113495bSYour Name 
pld_sdio_device_self_recovery(struct device * dev)143*5113495bSYour Name static inline void pld_sdio_device_self_recovery(struct device *dev)
144*5113495bSYour Name {
145*5113495bSYour Name 	cnss_common_device_self_recovery(dev);
146*5113495bSYour Name }
147*5113495bSYour Name 
pld_sdio_platform_driver_support(void)148*5113495bSYour Name static inline bool pld_sdio_platform_driver_support(void)
149*5113495bSYour Name {
150*5113495bSYour Name 	return true;
151*5113495bSYour Name }
152*5113495bSYour Name #else
pld_sdio_get_virt_ramdump_mem(struct device * dev,unsigned long * size)153*5113495bSYour Name static inline void *pld_sdio_get_virt_ramdump_mem(struct device *dev,
154*5113495bSYour Name 		unsigned long *size)
155*5113495bSYour Name {
156*5113495bSYour Name 	size_t length = 0;
157*5113495bSYour Name 	int flags = GFP_KERNEL;
158*5113495bSYour Name 
159*5113495bSYour Name 	length = TOTAL_DUMP_SIZE;
160*5113495bSYour Name 
161*5113495bSYour Name 	if (!size)
162*5113495bSYour Name 		return NULL;
163*5113495bSYour Name 
164*5113495bSYour Name 	*size = (unsigned long)length;
165*5113495bSYour Name 
166*5113495bSYour Name 	if (in_interrupt() || irqs_disabled() || in_atomic())
167*5113495bSYour Name 		flags = GFP_ATOMIC;
168*5113495bSYour Name 
169*5113495bSYour Name 	return kzalloc(length, flags);
170*5113495bSYour Name }
171*5113495bSYour Name 
pld_sdio_release_virt_ramdump_mem(void * address)172*5113495bSYour Name static inline void pld_sdio_release_virt_ramdump_mem(void *address)
173*5113495bSYour Name {
174*5113495bSYour Name 	kfree(address);
175*5113495bSYour Name }
176*5113495bSYour Name 
pld_sdio_device_crashed(struct device * dev)177*5113495bSYour Name static inline void pld_sdio_device_crashed(struct device *dev)
178*5113495bSYour Name {
179*5113495bSYour Name }
pld_sdio_is_fw_dump_skipped(void)180*5113495bSYour Name static inline bool pld_sdio_is_fw_dump_skipped(void)
181*5113495bSYour Name {
182*5113495bSYour Name 	return false;
183*5113495bSYour Name }
184*5113495bSYour Name 
pld_sdio_device_self_recovery(struct device * dev)185*5113495bSYour Name static inline void pld_sdio_device_self_recovery(struct device *dev)
186*5113495bSYour Name {
187*5113495bSYour Name }
188*5113495bSYour Name 
pld_sdio_platform_driver_support(void)189*5113495bSYour Name static inline bool pld_sdio_platform_driver_support(void)
190*5113495bSYour Name {
191*5113495bSYour Name 	return false;
192*5113495bSYour Name }
193*5113495bSYour Name #endif
194*5113495bSYour Name 
195*5113495bSYour Name #ifdef CONFIG_PLD_SDIO_CNSS
196*5113495bSYour Name /**
197*5113495bSYour Name  * pld_hif_sdio_get_virt_ramdump_mem() - Get virtual ramdump memory
198*5113495bSYour Name  * @dev: device
199*5113495bSYour Name  * @size: buffer to virtual memory size
200*5113495bSYour Name  *
201*5113495bSYour Name  * Return: virtual ramdump memory address
202*5113495bSYour Name  */
pld_hif_sdio_get_virt_ramdump_mem(struct device * dev,unsigned long * size)203*5113495bSYour Name static inline void *pld_hif_sdio_get_virt_ramdump_mem(struct device *dev,
204*5113495bSYour Name 						unsigned long *size)
205*5113495bSYour Name {
206*5113495bSYour Name 	return cnss_common_get_virt_ramdump_mem(dev, size);
207*5113495bSYour Name }
208*5113495bSYour Name 
209*5113495bSYour Name /**
210*5113495bSYour Name  * pld_hif_sdio_release_ramdump_mem() - Release virtual ramdump memory
211*5113495bSYour Name  * @address: virtual ramdump memory address
212*5113495bSYour Name  *
213*5113495bSYour Name  * Return: void
214*5113495bSYour Name  */
pld_hif_sdio_release_ramdump_mem(unsigned long * address)215*5113495bSYour Name static inline void pld_hif_sdio_release_ramdump_mem(unsigned long *address)
216*5113495bSYour Name {
217*5113495bSYour Name }
218*5113495bSYour Name #else
219*5113495bSYour Name #ifdef CONFIG_PLD_SDIO_CNSS2
220*5113495bSYour Name #include <net/cnss2.h>
221*5113495bSYour Name 
222*5113495bSYour Name /**
223*5113495bSYour Name  * pld_sdio_get_sdio_al_client_handle() - Get the sdio al client handle
224*5113495bSYour Name  * @func: SDIO function pointer
225*5113495bSYour Name  *
226*5113495bSYour Name  * Return: On success return client handle from al via cnss, else NULL
227*5113495bSYour Name  */
pld_sdio_get_sdio_al_client_handle(struct sdio_func * func)228*5113495bSYour Name static inline struct sdio_al_client_handle *pld_sdio_get_sdio_al_client_handle
229*5113495bSYour Name (
230*5113495bSYour Name struct sdio_func *func
231*5113495bSYour Name )
232*5113495bSYour Name {
233*5113495bSYour Name 	if (!func)
234*5113495bSYour Name 		return NULL;
235*5113495bSYour Name 
236*5113495bSYour Name 	return cnss_sdio_wlan_get_sdio_al_client_handle(func);
237*5113495bSYour Name }
238*5113495bSYour Name 
239*5113495bSYour Name /**
240*5113495bSYour Name  * pld_sdio_register_sdio_al_channel() - Register channel with sdio al
241*5113495bSYour Name  * @al_client: SDIO al client handle
242*5113495bSYour Name  * @ch_data: SDIO client channel data
243*5113495bSYour Name  *
244*5113495bSYour Name  * Return: Channel handle on success, else null
245*5113495bSYour Name  */
pld_sdio_register_sdio_al_channel(struct sdio_al_client_handle * al_client,struct sdio_al_channel_data * ch_data)246*5113495bSYour Name static inline struct sdio_al_channel_handle *pld_sdio_register_sdio_al_channel
247*5113495bSYour Name (
248*5113495bSYour Name struct sdio_al_client_handle *al_client,
249*5113495bSYour Name struct sdio_al_channel_data *ch_data
250*5113495bSYour Name )
251*5113495bSYour Name {
252*5113495bSYour Name 	if (!al_client || !ch_data)
253*5113495bSYour Name 		return NULL;
254*5113495bSYour Name 
255*5113495bSYour Name 	return cnss_sdio_wlan_register_sdio_al_channel(ch_data);
256*5113495bSYour Name }
257*5113495bSYour Name 
258*5113495bSYour Name /**
259*5113495bSYour Name  * pld_sdio_unregister_sdio_al_channel() - Unregister the sdio al channel
260*5113495bSYour Name  * @ch_handle: SDIO al channel handle
261*5113495bSYour Name  *
262*5113495bSYour Name  * Return: None
263*5113495bSYour Name  */
pld_sdio_unregister_sdio_al_channel(struct sdio_al_channel_handle * ch_handle)264*5113495bSYour Name static inline void pld_sdio_unregister_sdio_al_channel
265*5113495bSYour Name (
266*5113495bSYour Name struct sdio_al_channel_handle *ch_handle
267*5113495bSYour Name )
268*5113495bSYour Name {
269*5113495bSYour Name 	cnss_sdio_wlan_unregister_sdio_al_channel(ch_handle);
270*5113495bSYour Name }
271*5113495bSYour Name 
272*5113495bSYour Name /**
273*5113495bSYour Name  * pld_sdio_wlan_enable() - Enable WLAN
274*5113495bSYour Name  * @dev: device
275*5113495bSYour Name  * @config: NA
276*5113495bSYour Name  * @mode: WLAN mode
277*5113495bSYour Name  * @host_version: host software version
278*5113495bSYour Name  *
279*5113495bSYour Name  * This function enables WLAN FW. It passed
280*5113495bSYour Name  * WLAN mode and host software version to FW.
281*5113495bSYour Name  *
282*5113495bSYour Name  * Return: 0 for success
283*5113495bSYour Name  *         Non zero failure code for errors
284*5113495bSYour Name  */
285*5113495bSYour Name int pld_sdio_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
286*5113495bSYour Name 			 enum pld_driver_mode mode, const char *host_version);
287*5113495bSYour Name #else
pld_sdio_wlan_enable(struct device * dev,struct pld_wlan_enable_cfg * config,enum pld_driver_mode mode,const char * host_version)288*5113495bSYour Name static inline int pld_sdio_wlan_enable(struct device *dev,
289*5113495bSYour Name 				       struct pld_wlan_enable_cfg *config,
290*5113495bSYour Name 				       enum pld_driver_mode mode,
291*5113495bSYour Name 				       const char *host_version)
292*5113495bSYour Name {
293*5113495bSYour Name 	return 0;
294*5113495bSYour Name }
295*5113495bSYour Name #endif /* CONFIG_PLD_SDIO_CNSS2 */
296*5113495bSYour Name 
297*5113495bSYour Name /**
298*5113495bSYour Name  * pld_hif_sdio_get_virt_ramdump_mem() - Get virtual ramdump memory
299*5113495bSYour Name  * @dev: device
300*5113495bSYour Name  * @size: buffer to virtual memory size
301*5113495bSYour Name  *
302*5113495bSYour Name  * Return: virtual ramdump memory address
303*5113495bSYour Name  */
pld_hif_sdio_get_virt_ramdump_mem(struct device * dev,unsigned long * size)304*5113495bSYour Name static inline void *pld_hif_sdio_get_virt_ramdump_mem(struct device *dev,
305*5113495bSYour Name 						unsigned long *size)
306*5113495bSYour Name {
307*5113495bSYour Name 	size_t length = 0;
308*5113495bSYour Name 	int flags = GFP_KERNEL;
309*5113495bSYour Name 
310*5113495bSYour Name 	length = TOTAL_DUMP_SIZE;
311*5113495bSYour Name 
312*5113495bSYour Name 	if (size)
313*5113495bSYour Name 		*size = (unsigned long)length;
314*5113495bSYour Name 
315*5113495bSYour Name 	if (in_interrupt() || irqs_disabled() || in_atomic())
316*5113495bSYour Name 		flags = GFP_ATOMIC;
317*5113495bSYour Name 
318*5113495bSYour Name 	return kzalloc(length, flags);
319*5113495bSYour Name }
320*5113495bSYour Name 
321*5113495bSYour Name /**
322*5113495bSYour Name  * pld_hif_sdio_release_ramdump_mem() - Release virtual ramdump memory
323*5113495bSYour Name  * @address: virtual ramdump memory address
324*5113495bSYour Name  *
325*5113495bSYour Name  * Return: void
326*5113495bSYour Name  */
pld_hif_sdio_release_ramdump_mem(unsigned long * address)327*5113495bSYour Name static inline void pld_hif_sdio_release_ramdump_mem(unsigned long *address)
328*5113495bSYour Name {
329*5113495bSYour Name 	if (address)
330*5113495bSYour Name 		kfree(address);
331*5113495bSYour Name }
332*5113495bSYour Name #endif
333*5113495bSYour Name #endif
334