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