1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 *******************************************************************************/
11 static bool rtw_sdio_claim_host_needed(struct sdio_func *func)
13 struct dvobj_priv *dvobj = sdio_get_drvdata(func);
14 struct sdio_data *sdio_data = &dvobj->intf_data;
16 if (sdio_data->sys_sdio_irq_thd && sdio_data->sys_sdio_irq_thd == current)
21 inline void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, void *thd_hdl)
23 struct sdio_data *sdio_data = &dvobj->intf_data;
25 sdio_data->sys_sdio_irq_thd = thd_hdl;
33 s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
35 struct adapter *padapter;
36 struct dvobj_priv *psdiodev;
37 struct sdio_data *psdio;
40 struct sdio_func *func;
42 padapter = pintfhdl->padapter;
43 psdiodev = pintfhdl->pintf_dev;
44 psdio = &psdiodev->intf_data;
46 if (padapter->bSurpriseRemoved)
51 for (i = 0; i < cnt; i++) {
52 pdata[i] = sdio_readb(func, addr + i, &err);
64 s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
66 struct adapter *padapter;
67 struct dvobj_priv *psdiodev;
68 struct sdio_data *psdio;
71 struct sdio_func *func;
74 padapter = pintfhdl->padapter;
75 psdiodev = pintfhdl->pintf_dev;
76 psdio = &psdiodev->intf_data;
78 if (padapter->bSurpriseRemoved)
82 claim_needed = rtw_sdio_claim_host_needed(func);
85 sdio_claim_host(func);
86 err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata);
88 sdio_release_host(func);
97 s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
99 struct adapter *padapter;
100 struct dvobj_priv *psdiodev;
101 struct sdio_data *psdio;
104 struct sdio_func *func;
106 padapter = pintfhdl->padapter;
107 psdiodev = pintfhdl->pintf_dev;
108 psdio = &psdiodev->intf_data;
110 if (padapter->bSurpriseRemoved)
115 for (i = 0; i < cnt; i++) {
116 sdio_writeb(func, pdata[i], addr + i, &err);
128 s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
130 struct adapter *padapter;
131 struct dvobj_priv *psdiodev;
132 struct sdio_data *psdio;
135 struct sdio_func *func;
138 padapter = pintfhdl->padapter;
139 psdiodev = pintfhdl->pintf_dev;
140 psdio = &psdiodev->intf_data;
142 if (padapter->bSurpriseRemoved)
146 claim_needed = rtw_sdio_claim_host_needed(func);
149 sdio_claim_host(func);
150 err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata);
152 sdio_release_host(func);
156 u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
158 struct adapter *padapter;
159 struct dvobj_priv *psdiodev;
160 struct sdio_data *psdio;
163 struct sdio_func *func;
166 padapter = pintfhdl->padapter;
167 psdiodev = pintfhdl->pintf_dev;
168 psdio = &psdiodev->intf_data;
170 if (padapter->bSurpriseRemoved)
174 claim_needed = rtw_sdio_claim_host_needed(func);
177 sdio_claim_host(func);
178 v = sdio_readb(func, addr, err);
180 sdio_release_host(func);
184 u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
186 struct adapter *padapter;
187 struct dvobj_priv *psdiodev;
188 struct sdio_data *psdio;
190 struct sdio_func *func;
193 padapter = pintfhdl->padapter;
194 psdiodev = pintfhdl->pintf_dev;
195 psdio = &psdiodev->intf_data;
197 if (padapter->bSurpriseRemoved)
201 claim_needed = rtw_sdio_claim_host_needed(func);
204 sdio_claim_host(func);
205 v = sdio_readl(func, addr, err);
207 sdio_release_host(func);
213 for (i = 0; i < SD_IO_TRY_CNT; i++) {
215 sdio_claim_host(func);
216 v = sdio_readl(func, addr, err);
218 sdio_release_host(func);
221 rtw_reset_continual_io_error(psdiodev);
224 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
225 padapter->bSurpriseRemoved = true;
227 if (rtw_inc_and_chk_continual_io_error(psdiodev) == true) {
228 padapter->bSurpriseRemoved = true;
237 void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
239 struct adapter *padapter;
240 struct dvobj_priv *psdiodev;
241 struct sdio_data *psdio;
242 struct sdio_func *func;
245 padapter = pintfhdl->padapter;
246 psdiodev = pintfhdl->pintf_dev;
247 psdio = &psdiodev->intf_data;
249 if (padapter->bSurpriseRemoved)
253 claim_needed = rtw_sdio_claim_host_needed(func);
256 sdio_claim_host(func);
257 sdio_writeb(func, v, addr, err);
259 sdio_release_host(func);
262 void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
264 struct adapter *padapter;
265 struct dvobj_priv *psdiodev;
266 struct sdio_data *psdio;
267 struct sdio_func *func;
270 padapter = pintfhdl->padapter;
271 psdiodev = pintfhdl->pintf_dev;
272 psdio = &psdiodev->intf_data;
274 if (padapter->bSurpriseRemoved)
278 claim_needed = rtw_sdio_claim_host_needed(func);
281 sdio_claim_host(func);
282 sdio_writel(func, v, addr, err);
284 sdio_release_host(func);
290 for (i = 0; i < SD_IO_TRY_CNT; i++) {
292 sdio_claim_host(func);
293 sdio_writel(func, v, addr, err);
295 sdio_release_host(func);
297 rtw_reset_continual_io_error(psdiodev);
300 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
301 padapter->bSurpriseRemoved = true;
303 if (rtw_inc_and_chk_continual_io_error(psdiodev) == true) {
304 padapter->bSurpriseRemoved = true;
314 * Use CMD53 to read data from SDIO device.
315 * This function MUST be called after sdio_claim_host() or
316 * in SDIO ISR(host had been claimed).
319 *psdio pointer of SDIO_DATA
320 *addr address to read
322 *pdata pointer to put data, this should be a "DMA:able scratch buffer"!
328 s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
330 struct adapter *padapter;
331 struct dvobj_priv *psdiodev;
332 struct sdio_data *psdio;
335 struct sdio_func *func;
337 padapter = pintfhdl->padapter;
338 psdiodev = pintfhdl->pintf_dev;
339 psdio = &psdiodev->intf_data;
341 if (padapter->bSurpriseRemoved)
346 if (unlikely((cnt == 1) || (cnt == 2))) {
350 for (i = 0; i < cnt; i++) {
351 *(pbuf + i) = sdio_readb(func, addr + i, &err);
359 err = sdio_memcpy_fromio(func, pdata, addr, cnt);
365 * Use CMD53 to read data from SDIO device.
368 *psdio pointer of SDIO_DATA
369 *addr address to read
371 *pdata pointer to put data, this should be a "DMA:able scratch buffer"!
377 s32 sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
379 struct adapter *padapter;
380 struct dvobj_priv *psdiodev;
381 struct sdio_data *psdio;
383 struct sdio_func *func;
387 padapter = pintfhdl->padapter;
388 psdiodev = pintfhdl->pintf_dev;
389 psdio = &psdiodev->intf_data;
391 if (padapter->bSurpriseRemoved)
395 claim_needed = rtw_sdio_claim_host_needed(func);
398 sdio_claim_host(func);
399 err = _sd_read(pintfhdl, addr, cnt, pdata);
401 sdio_release_host(func);
406 * Use CMD53 to write data to SDIO device.
407 * This function MUST be called after sdio_claim_host() or
408 * in SDIO ISR(host had been claimed).
411 *psdio pointer of SDIO_DATA
412 *addr address to write
414 *pdata data pointer, this should be a "DMA:able scratch buffer"!
420 s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
422 struct adapter *padapter;
423 struct dvobj_priv *psdiodev;
424 struct sdio_data *psdio;
426 struct sdio_func *func;
430 padapter = pintfhdl->padapter;
431 psdiodev = pintfhdl->pintf_dev;
432 psdio = &psdiodev->intf_data;
434 if (padapter->bSurpriseRemoved)
438 /* size = sdio_align_size(func, cnt); */
440 if (unlikely((cnt == 1) || (cnt == 2))) {
444 for (i = 0; i < cnt; i++) {
445 sdio_writeb(func, *(pbuf + i), addr + i, &err);
454 err = sdio_memcpy_toio(func, addr, pdata, size);
460 * Use CMD53 to write data to SDIO device.
463 * psdio pointer of SDIO_DATA
464 * addr address to write
465 * cnt amount to write
466 * pdata data pointer, this should be a "DMA:able scratch buffer"!
472 s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
474 struct adapter *padapter;
475 struct dvobj_priv *psdiodev;
476 struct sdio_data *psdio;
477 struct sdio_func *func;
481 padapter = pintfhdl->padapter;
482 psdiodev = pintfhdl->pintf_dev;
483 psdio = &psdiodev->intf_data;
485 if (padapter->bSurpriseRemoved)
489 claim_needed = rtw_sdio_claim_host_needed(func);
492 sdio_claim_host(func);
493 err = _sd_write(pintfhdl, addr, cnt, pdata);
495 sdio_release_host(func);