1 /*
2  * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2024 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 _HIF_INTERNAL_H_
21 #define _HIF_INTERNAL_H_
22 
23 #include <linux/mmc/card.h>
24 #include <linux/mmc/mmc.h>
25 #include <linux/mmc/host.h>
26 #include <linux/mmc/sdio_func.h>
27 #include <linux/mmc/sdio_ids.h>
28 #include <linux/mmc/sdio.h>
29 #include <linux/mmc/sd.h>
30 
31 #include "athdefs.h"
32 #include "a_types.h"
33 #include "a_osapi.h"
34 #include <qdf_types.h>          /* qdf_device_t, qdf_print */
35 #include <qdf_time.h>           /* qdf_system_ticks, etc. */
36 #include <qdf_status.h>
37 #include <qdf_timer.h>
38 #include <qdf_atomic.h>
39 #include <qdf_list.h>
40 #include "hif.h"
41 #include "hif_debug.h"
42 #include "hif_sdio_common.h"
43 #include <linux/scatterlist.h>
44 #include "hif_main.h"
45 
46 #define HIF_LINUX_MMC_SCATTER_SUPPORT
47 
48 #define BUS_REQUEST_MAX_NUM                105
49 
50 #define SDIO_CLOCK_FREQUENCY_DEFAULT       25000000
51 #define SDWLAN_ENABLE_DISABLE_TIMEOUT      20
52 #define FLAGS_CARD_ENAB                    0x02
53 #define FLAGS_CARD_IRQ_UNMSK               0x04
54 
55 /*
56  * direction - Direction of transfer (HIF_SDIO_READ/HIF_SDIO_WRITE).
57  */
58 #define HIF_SDIO_READ			0x00000001
59 #define HIF_SDIO_WRITE			0x00000002
60 #define HIF_SDIO_DIR_MASK		(HIF_SDIO_READ | HIF_SDIO_WRITE)
61 
62 /*
63  * type - An interface may support different kind of rd/wr commands.
64  * For example: SDIO supports CMD52/CMD53s. In case of MSIO it
65  * translates to using different kinds of TPCs. The command type
66  * is thus divided into a basic and an extended command and can
67  * be specified using HIF_BASIC_IO/HIF_EXTENDED_IO.
68  */
69 #define HIF_BASIC_IO			0x00000004
70 #define HIF_EXTENDED_IO			0x00000008
71 #define HIF_TYPE_MASK			(HIF_BASIC_IO | HIF_EXTENDED_IO)
72 
73 /*
74  * This indicates the whether the command is to be executed in a
75  * blocking or non-blocking fashion (HIF_SYNCHRONOUS/
76  * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been
77  * implemented using the asynchronous mode allowing the the bus
78  * driver to indicate the completion of operation through the
79  * registered callback routine. The requirement primarily comes
80  * from the contexts these operations get called from (a driver's
81  * transmit context or the ISR context in case of receive).
82  * Support for both of these modes is essential.
83  */
84 #define HIF_SYNCHRONOUS		0x00000010
85 #define HIF_ASYNCHRONOUS	0x00000020
86 #define HIF_EMODE_MASK		(HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)
87 
88 /*
89  * An interface may support different kinds of commands based on
90  * the tradeoff between the amount of data it can carry and the
91  * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/
92  * HIF_BLOCK_BASIS). In case of latter, the data is rounded off
93  * to the nearest block size by padding. The size of the block is
94  * configurable at compile time using the HIF_BLOCK_SIZE and is
95  * negotiated with the target during initialization after the
96  * AR6000 interrupts are enabled.
97  */
98 #define HIF_BYTE_BASIS		0x00000040
99 #define HIF_BLOCK_BASIS		0x00000080
100 #define HIF_DMODE_MASK		(HIF_BYTE_BASIS | HIF_BLOCK_BASIS)
101 
102 /*
103  * This indicates if the address has to be incremented on AR6000
104  * after every read/write operation (HIF?FIXED_ADDRESS/
105  * HIF_INCREMENTAL_ADDRESS).
106  */
107 #define HIF_FIXED_ADDRESS			0x00000100
108 #define HIF_INCREMENTAL_ADDRESS		0x00000200
109 #define HIF_AMODE_MASK				(HIF_FIXED_ADDRESS | \
110 							HIF_INCREMENTAL_ADDRESS)
111 
112 #define HIF_WR_ASYNC_BYTE_FIX   \
113 		(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
114 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
115 #define HIF_WR_ASYNC_BYTE_INC   \
116 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
117 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
118 #define HIF_WR_ASYNC_BLOCK_INC  \
119 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
120 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
121 #define HIF_WR_SYNC_BYTE_FIX    \
122 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
123 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
124 #define HIF_WR_SYNC_BYTE_INC    \
125 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
126 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
127 #define HIF_WR_SYNC_BLOCK_INC  \
128 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
129 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
130 #define HIF_WR_ASYNC_BLOCK_FIX \
131 	(HIF_SDIO_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
132 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
133 #define HIF_WR_SYNC_BLOCK_FIX  \
134 	(HIF_SDIO_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
135 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
136 #define HIF_RD_SYNC_BYTE_INC    \
137 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
138 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
139 #define HIF_RD_SYNC_BYTE_FIX    \
140 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
141 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
142 #define HIF_RD_ASYNC_BYTE_FIX   \
143 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
144 				HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
145 #define HIF_RD_ASYNC_BLOCK_FIX  \
146 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
147 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
148 #define HIF_RD_ASYNC_BYTE_INC   \
149 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
150 				HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
151 #define HIF_RD_ASYNC_BLOCK_INC  \
152 	(HIF_SDIO_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | \
153 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
154 #define HIF_RD_SYNC_BLOCK_INC  \
155 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
156 				HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
157 #define HIF_RD_SYNC_BLOCK_FIX  \
158 	(HIF_SDIO_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | \
159 				HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
160 
161 enum hif_sdio_device_state {
162 		HIF_DEVICE_STATE_ON,
163 		HIF_DEVICE_STATE_DEEPSLEEP,
164 		HIF_DEVICE_STATE_CUTPOWER,
165 		HIF_DEVICE_STATE_WOW
166 };
167 
168 struct bus_request {
169 	struct bus_request *next;       /* link list of available requests */
170 	struct bus_request *inusenext;  /* link list of in use requests */
171 	struct semaphore sem_req;
172 	unsigned long address;       /* request data */
173 	char *buffer;
174 	uint32_t length;
175 	uint32_t request;
176 	void *context;
177 	QDF_STATUS status;
178 	struct HIF_SCATTER_REQ_PRIV *scatter_req;
179 };
180 
181 #define HIF_ADMA_MAX_CHANS 2
182 #ifdef CONFIG_SDIO_TRANSFER_ADMA
183 struct rx_q_entry {
184 	qdf_list_node_t entry;
185 	qdf_nbuf_t nbuf;
186 };
187 #endif
188 
189 struct hif_sdio_dev {
190 	struct sdio_func *func;
191 	qdf_spinlock_t asynclock;
192 	struct task_struct *async_task; /* task to handle async commands */
193 	struct semaphore sem_async;     /* wake up for async task */
194 	int async_shutdown;     /* stop the async task */
195 	struct completion async_completion;     /* thread completion */
196 	struct bus_request *asyncreq;  /* request for async tasklet */
197 	struct bus_request *taskreq;   /*  async tasklet data */
198 	qdf_spinlock_t lock;
199 	struct bus_request *bus_request_free_queue;     /* free list */
200 	struct bus_request bus_request[BUS_REQUEST_MAX_NUM]; /* bus requests */
201 	void *claimed_ctx;
202 	struct htc_callbacks htc_callbacks;
203 	uint8_t *dma_buffer;
204 	DL_LIST scatter_req_head; /* scatter request list head */
205 	bool scatter_enabled; /* scatter enabled flag */
206 	bool is_suspend;
207 	bool is_disabled;
208 	atomic_t irq_handling;
209 	enum HIF_DEVICE_POWER_CHANGE_TYPE power_config;
210 	enum hif_sdio_device_state device_state;
211 	const struct sdio_device_id *id;
212 	struct mmc_host *host;
213 	void *htc_context;
214 #ifdef CONFIG_SDIO_TRANSFER_ADMA
215 	struct sdio_al_client_handle *al_client;
216 	struct sdio_al_channel_handle *al_chan[HIF_ADMA_MAX_CHANS];
217 	uint8_t adma_chans_used;
218 	qdf_list_t rx_q;
219 	qdf_spinlock_t rx_q_lock;
220 	qdf_work_t rx_q_alloc_work;
221 	bool rx_q_alloc_work_scheduled;
222 #endif
223 };
224 
225 struct HIF_DEVICE_OS_DEVICE_INFO {
226 	void *os_dev;
227 };
228 
229 struct hif_mailbox_properties {
230 	u_int32_t    extended_address;  /* extended address for larger writes */
231 	u_int32_t    extended_size;
232 };
233 
234 struct hif_device_irq_yield_params {
235 	int recv_packet_yield_count;
236 	/* max number of packets to force DSR to return */
237 };
238 
239 struct hif_device_mbox_info {
240 	u_int32_t mbox_addresses[4];
241 	/* first element for legacy HIFs and return the address and ARRAY of
242 	 * 32bit words
243 	 */
244 	struct hif_mailbox_properties mbox_prop[4];
245 	u_int32_t gmbox_address;
246 	u_int32_t gmbox_size;
247 	u_int32_t flags;
248 	/* flags to describe mbox behavior or usage */
249 };
250 
251 enum hif_device_irq_mode {
252 	HIF_DEVICE_IRQ_SYNC_ONLY,
253 	/* DSR to process all interrupts before returning */
254 	HIF_DEVICE_IRQ_ASYNC_SYNC,  /* DSR to process interrupts */
255 };
256 
257 /* other interrupts are pending, host
258  * needs to read the to monitor
259  */
260 #define HIF_OTHER_EVENTS     (1 << 0)
261 /* pending recv packet */
262 #define HIF_RECV_MSG_AVAIL   (1 << 1)
263 
264 struct _HIF_PENDING_EVENTS_INFO {
265 	uint32_t events;
266 	uint32_t look_ahead;
267 	uint32_t available_recv_bytes;
268 };
269 
270 /* hif-sdio pending events handler type, some HIF modules
271  * use special mechanisms to detect packet available and other interrupts
272  */
273 typedef int (*HIF_PENDING_EVENTS_FUNC)(struct hif_sdio_dev *device,
274 					struct _HIF_PENDING_EVENTS_INFO *
275 					events, void *async_context);
276 
277 #define HIF_MASK_RECV    true
278 #define HIF_UNMASK_RECV  false
279 /* hif-sdio Handler type to mask receive events */
280 typedef int (*HIF_MASK_UNMASK_RECV_EVENT)(struct hif_sdio_dev *device,
281 					  bool mask,
282 					  void *async_context);
283 
284 QDF_STATUS hif_configure_device(struct hif_softc *ol_sc,
285 				struct hif_sdio_dev *device,
286 				enum hif_device_config_opcode opcode,
287 				void *config, uint32_t config_len);
288 
289 QDF_STATUS hif_attach_htc(struct hif_sdio_dev *device,
290 			  struct htc_callbacks *callbacks);
291 
292 void hif_ack_interrupt(struct hif_sdio_dev *device);
293 
294 void hif_mask_interrupt(struct hif_sdio_dev *device);
295 
296 void hif_un_mask_interrupt(struct hif_sdio_dev *device);
297 
298 int hif_sdio_configure_pipes(struct hif_sdio_dev *dev, struct sdio_func *func);
299 
300 struct _HIF_SCATTER_ITEM {
301 	u_int8_t     *buffer; /* CPU accessible address of buffer */
302 	int          length; /* length of transfer to/from this buffer */
303 	void         *caller_contexts[2]; /* caller context */
304 };
305 
306 struct _HIF_SCATTER_REQ;
307 
308 typedef void (*HIF_SCATTER_COMP_CB)(struct _HIF_SCATTER_REQ *);
309 
310 enum HIF_SCATTER_METHOD {
311 	HIF_SCATTER_NONE = 0,
312 	HIF_SCATTER_DMA_REAL, /* Real SG support no restrictions */
313 	HIF_SCATTER_DMA_BOUNCE, /* Uses SG DMA */
314 };
315 
316 struct _HIF_SCATTER_REQ {
317 	DL_LIST             list_link; /* link management */
318 	u_int32_t            address; /* address for the read/write operation */
319 	u_int32_t            request; /* request flags */
320 	u_int32_t            total_length; /* total length of entire transfer */
321 	u_int32_t            caller_flags; /* caller specific flags */
322 	HIF_SCATTER_COMP_CB  completion_routine; /* completion callback */
323 	int                  completion_status; /* status of completion */
324 	void                 *context; /* caller context for this request */
325 	int                  valid_scatter_entries; /* no of valid entries */
326 	/* scatter method handled by HIF */
327 	enum HIF_SCATTER_METHOD   scatter_method;
328 	void                 *hif_private[4]; /* HIF private area */
329 	u_int8_t             *scatter_bounce_buffer; /* bounce buffers */
330 	QDF_FLEX_ARRAY(struct _HIF_SCATTER_ITEM, scatter_list); /* start of scatter list */
331 };
332 
333 typedef struct _HIF_SCATTER_REQ * (*HIF_ALLOCATE_SCATTER_REQUEST)(
334 						struct hif_sdio_dev *device);
335 typedef void (*HIF_FREE_SCATTER_REQUEST)(struct hif_sdio_dev *device,
336 				struct _HIF_SCATTER_REQ *request);
337 typedef QDF_STATUS (*HIF_READWRITE_SCATTER)(struct hif_sdio_dev *device,
338 					struct _HIF_SCATTER_REQ *request);
339 
340 struct HIF_DEVICE_SCATTER_SUPPORT_INFO {
341 	/* information returned from HIF layer */
342 	HIF_ALLOCATE_SCATTER_REQUEST    allocate_req_func;
343 	HIF_FREE_SCATTER_REQUEST        free_req_func;
344 	HIF_READWRITE_SCATTER           read_write_scatter_func;
345 	int                             max_scatter_entries;
346 	int                             max_tx_size_per_scatter_req;
347 };
348 
349 void hif_get_target_revision(struct hif_softc *ol_sc);
350 struct HIF_SCATTER_REQ_PRIV;
351 
352 #define HIF_DMA_BUFFER_SIZE (4 * 1024)
353 #define CMD53_FIXED_ADDRESS 1
354 #define CMD53_INCR_ADDRESS  2
355 
356 struct bus_request *hif_allocate_bus_request(struct hif_sdio_dev *device);
357 void hif_free_bus_request(struct hif_sdio_dev *device,
358 			  struct bus_request *busrequest);
359 void add_to_async_list(struct hif_sdio_dev *device,
360 		       struct bus_request *busrequest);
361 void hif_dump_cccr(struct hif_sdio_dev *hif_device);
362 
363 #ifdef HIF_LINUX_MMC_SCATTER_SUPPORT
364 
365 #define MAX_SCATTER_REQUESTS             4
366 #define MAX_SCATTER_ENTRIES_PER_REQ      16
367 #define MAX_SCATTER_REQ_TRANSFER_SIZE    (32*1024)
368 
369 struct HIF_SCATTER_REQ_PRIV {
370 	struct _HIF_SCATTER_REQ *hif_scatter_req;
371 	struct hif_sdio_dev *device;     /* this device */
372 	struct bus_request *busrequest;
373 	/* scatter list for linux */
374 	struct scatterlist sgentries[MAX_SCATTER_ENTRIES_PER_REQ];
375 };
376 
377 #define ATH_DEBUG_SCATTER  ATH_DEBUG_MAKE_MODULE_MASK(0)
378 
379 QDF_STATUS setup_hif_scatter_support(struct hif_sdio_dev *device,
380 		   struct HIF_DEVICE_SCATTER_SUPPORT_INFO *info);
381 void cleanup_hif_scatter_resources(struct hif_sdio_dev *device);
382 QDF_STATUS do_hif_read_write_scatter(struct hif_sdio_dev *device,
383 				   struct bus_request *busrequest);
384 
385 #else                           /* HIF_LINUX_MMC_SCATTER_SUPPORT */
386 
setup_hif_scatter_support(struct hif_sdio_dev * device,struct HIF_DEVICE_SCATTER_SUPPORT_INFO * info)387 static inline QDF_STATUS setup_hif_scatter_support(struct hif_sdio_dev *device,
388 				struct HIF_DEVICE_SCATTER_SUPPORT_INFO *info)
389 {
390 	return QDF_STATUS_E_NOSUPPORT;
391 }
392 
do_hif_read_write_scatter(struct hif_sdio_dev * device,struct bus_request * busrequest)393 static inline QDF_STATUS do_hif_read_write_scatter(struct hif_sdio_dev *device,
394 					 struct bus_request *busrequest)
395 {
396 	return QDF_STATUS_E_NOSUPPORT;
397 }
398 
399 #define cleanup_hif_scatter_resources(d) { }
400 
401 #endif /* HIF_LINUX_MMC_SCATTER_SUPPORT */
402 
403 #define SDIO_SET_CMD52_ARG(arg, rw, func, raw, address, writedata) \
404 			((arg) = (((rw) & 1) << 31) | \
405 			(((func) & 0x7) << 28) | \
406 			(((raw) & 1) << 27) | \
407 			(1 << 26) | \
408 			(((address) & 0x1FFFF) << 9) | \
409 			(1 << 8) | \
410 			((writedata) & 0xFF))
411 
412 #define SDIO_SET_CMD52_READ_ARG(arg, func, address) \
413 	SDIO_SET_CMD52_ARG(arg, 0, (func), 0, address, 0x00)
414 #define SDIO_SET_CMD52_WRITE_ARG(arg, func, address, value) \
415 	SDIO_SET_CMD52_ARG(arg, 1, (func), 0, address, value)
416 
417 void hif_sdio_quirk_force_drive_strength(struct hif_softc *ol_sc,
418 					 struct sdio_func *func);
419 void hif_sdio_quirk_write_cccr(struct hif_softc *ol_sc, struct sdio_func *func);
420 int hif_sdio_quirk_mod_strength(struct hif_softc *ol_sc,
421 				struct sdio_func *func);
422 int hif_sdio_quirk_async_intr(struct hif_softc *ol_sc, struct sdio_func *func);
423 int hif_sdio_set_bus_speed(struct hif_softc *ol_sc, struct sdio_func *func);
424 int hif_sdio_set_bus_width(struct hif_softc *ol_sc, struct sdio_func *func);
425 QDF_STATUS hif_sdio_func_disable(struct hif_sdio_dev *device,
426 				 struct sdio_func *func,
427 				 bool reset);
428 QDF_STATUS reinit_sdio(struct hif_sdio_dev *device);
429 
430 int func0_cmd52_write_byte(struct mmc_card *card,
431 			   unsigned int address,
432 			   unsigned char byte);
433 
434 int func0_cmd52_read_byte(struct mmc_card *card,
435 			  unsigned int address,
436 			  unsigned char *byte);
437 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
438 /**
439  * sdio_card_highspeed() - check if high speed supported
440  * @card: pointer to mmc card struct
441  *
442  * Return: non zero if card supports high speed.
443  */
sdio_card_highspeed(struct mmc_card * card)444 static inline int sdio_card_highspeed(struct mmc_card *card)
445 {
446 	return mmc_card_highspeed(card);
447 }
448 #else
sdio_card_highspeed(struct mmc_card * card)449 static inline int sdio_card_highspeed(struct mmc_card *card)
450 {
451 	return mmc_card_hs(card);
452 }
453 #endif
454 
455 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
456 /**
457  * sdio_card_set_highspeed() - set high speed
458  * @card: pointer to mmc card struct
459  *
460  * Return: none.
461  */
sdio_card_set_highspeed(struct mmc_card * card)462 static inline void sdio_card_set_highspeed(struct mmc_card *card)
463 {
464 	mmc_card_set_highspeed(card);
465 }
466 #else
sdio_card_set_highspeed(struct mmc_card * card)467 static inline void sdio_card_set_highspeed(struct mmc_card *card)
468 {
469 }
470 #endif
471 
472 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
473 /**
474  * sdio_card_state() - set card state
475  * @card: pointer to mmc card struct
476  *
477  * Return: none.
478  */
sdio_card_state(struct mmc_card * card)479 static inline void sdio_card_state(struct mmc_card *card)
480 {
481 	card->state &= ~MMC_STATE_HIGHSPEED;
482 }
483 #else
sdio_card_state(struct mmc_card * card)484 static inline void sdio_card_state(struct mmc_card *card)
485 {
486 }
487 #endif
488 #endif /* _HIF_INTERNAL_H_ */
489