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