1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 *******************************************************************************/
7 #define _SDIO_OPS_LINUX_C_
10 #include <rtw_debug.h>
12 static bool rtw_sdio_claim_host_needed(struct sdio_func *func)
14 struct dvobj_priv *dvobj = sdio_get_drvdata(func);
15 PSDIO_DATA sdio_data = &dvobj->intf_data;
17 if (sdio_data->sys_sdio_irq_thd && sdio_data->sys_sdio_irq_thd == current)
22 inline void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, void *thd_hdl)
24 PSDIO_DATA sdio_data = &dvobj->intf_data;
26 sdio_data->sys_sdio_irq_thd = thd_hdl;
29 u8 sd_f0_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
31 struct adapter *padapter;
32 struct dvobj_priv *psdiodev;
36 struct sdio_func *func;
39 padapter = pintfhdl->padapter;
40 psdiodev = pintfhdl->pintf_dev;
41 psdio = &psdiodev->intf_data;
43 if (padapter->bSurpriseRemoved) {
44 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
49 claim_needed = rtw_sdio_claim_host_needed(func);
52 sdio_claim_host(func);
53 v = sdio_f0_readb(func, addr, err);
55 sdio_release_host(func);
57 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x\n", __func__, *err, addr);
66 s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
68 struct adapter *padapter;
69 struct dvobj_priv *psdiodev;
73 struct sdio_func *func;
75 padapter = pintfhdl->padapter;
76 psdiodev = pintfhdl->pintf_dev;
77 psdio = &psdiodev->intf_data;
79 if (padapter->bSurpriseRemoved) {
80 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
86 for (i = 0; i < cnt; i++) {
87 pdata[i] = sdio_readb(func, addr+i, &err);
89 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x\n", __func__, err, addr+i);
101 s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
103 struct adapter *padapter;
104 struct dvobj_priv *psdiodev;
108 struct sdio_func *func;
111 padapter = pintfhdl->padapter;
112 psdiodev = pintfhdl->pintf_dev;
113 psdio = &psdiodev->intf_data;
115 if (padapter->bSurpriseRemoved) {
116 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
121 claim_needed = rtw_sdio_claim_host_needed(func);
124 sdio_claim_host(func);
125 err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata);
127 sdio_release_host(func);
136 s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
138 struct adapter *padapter;
139 struct dvobj_priv *psdiodev;
143 struct sdio_func *func;
145 padapter = pintfhdl->padapter;
146 psdiodev = pintfhdl->pintf_dev;
147 psdio = &psdiodev->intf_data;
149 if (padapter->bSurpriseRemoved) {
150 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
156 for (i = 0; i < cnt; i++) {
157 sdio_writeb(func, pdata[i], addr+i, &err);
159 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x val = 0x%02x\n", __func__, err, addr+i, pdata[i]);
171 s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
173 struct adapter *padapter;
174 struct dvobj_priv *psdiodev;
178 struct sdio_func *func;
181 padapter = pintfhdl->padapter;
182 psdiodev = pintfhdl->pintf_dev;
183 psdio = &psdiodev->intf_data;
185 if (padapter->bSurpriseRemoved) {
186 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
191 claim_needed = rtw_sdio_claim_host_needed(func);
194 sdio_claim_host(func);
195 err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata);
197 sdio_release_host(func);
201 u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
203 struct adapter *padapter;
204 struct dvobj_priv *psdiodev;
208 struct sdio_func *func;
211 padapter = pintfhdl->padapter;
212 psdiodev = pintfhdl->pintf_dev;
213 psdio = &psdiodev->intf_data;
215 if (padapter->bSurpriseRemoved) {
216 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
221 claim_needed = rtw_sdio_claim_host_needed(func);
224 sdio_claim_host(func);
225 v = sdio_readb(func, addr, err);
227 sdio_release_host(func);
229 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x\n", __func__, *err, addr);
233 u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
235 struct adapter *padapter;
236 struct dvobj_priv *psdiodev;
239 struct sdio_func *func;
242 padapter = pintfhdl->padapter;
243 psdiodev = pintfhdl->pintf_dev;
244 psdio = &psdiodev->intf_data;
246 if (padapter->bSurpriseRemoved) {
247 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
252 claim_needed = rtw_sdio_claim_host_needed(func);
255 sdio_claim_host(func);
256 v = sdio_readl(func, addr, err);
258 sdio_release_host(func);
264 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x, val = 0x%x\n", __func__, *err, addr, v);
267 for (i = 0; i < SD_IO_TRY_CNT; i++)
269 if (claim_needed) sdio_claim_host(func);
270 v = sdio_readl(func, addr, err);
271 if (claim_needed) sdio_release_host(func);
274 rtw_reset_continual_io_error(psdiodev);
277 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x, val = 0x%x, try_cnt =%d\n", __func__, *err, addr, v, i);
278 if ((-ESHUTDOWN == *err) || (-ENODEV == *err)) {
279 padapter->bSurpriseRemoved = true;
282 if (rtw_inc_and_chk_continual_io_error(psdiodev) == true) {
283 padapter->bSurpriseRemoved = true;
289 if (i == SD_IO_TRY_CNT)
290 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x, val = 0x%x, try_cnt =%d\n", __func__, *err, addr, v, i);
292 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x, val = 0x%x, try_cnt =%d\n", __func__, *err, addr, v, i);
298 void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
300 struct adapter *padapter;
301 struct dvobj_priv *psdiodev;
303 struct sdio_func *func;
306 padapter = pintfhdl->padapter;
307 psdiodev = pintfhdl->pintf_dev;
308 psdio = &psdiodev->intf_data;
310 if (padapter->bSurpriseRemoved) {
311 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
316 claim_needed = rtw_sdio_claim_host_needed(func);
319 sdio_claim_host(func);
320 sdio_writeb(func, v, addr, err);
322 sdio_release_host(func);
324 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x val = 0x%02x\n", __func__, *err, addr, v);
327 void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
329 struct adapter *padapter;
330 struct dvobj_priv *psdiodev;
332 struct sdio_func *func;
335 padapter = pintfhdl->padapter;
336 psdiodev = pintfhdl->pintf_dev;
337 psdio = &psdiodev->intf_data;
339 if (padapter->bSurpriseRemoved) {
340 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
345 claim_needed = rtw_sdio_claim_host_needed(func);
348 sdio_claim_host(func);
349 sdio_writel(func, v, addr, err);
351 sdio_release_host(func);
357 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x val = 0x%08x\n", __func__, *err, addr, v);
360 for (i = 0; i < SD_IO_TRY_CNT; i++)
362 if (claim_needed) sdio_claim_host(func);
363 sdio_writel(func, v, addr, err);
364 if (claim_needed) sdio_release_host(func);
366 rtw_reset_continual_io_error(psdiodev);
369 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x, val = 0x%x, try_cnt =%d\n", __func__, *err, addr, v, i);
370 if ((-ESHUTDOWN == *err) || (-ENODEV == *err)) {
371 padapter->bSurpriseRemoved = true;
374 if (rtw_inc_and_chk_continual_io_error(psdiodev) == true) {
375 padapter->bSurpriseRemoved = true;
381 if (i == SD_IO_TRY_CNT)
382 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x val = 0x%08x, try_cnt =%d\n", __func__, *err, addr, v, i);
384 DBG_871X(KERN_ERR "%s: (%d) addr = 0x%05x val = 0x%08x, try_cnt =%d\n", __func__, *err, addr, v, i);
389 * Use CMD53 to read data from SDIO device.
390 * This function MUST be called after sdio_claim_host() or
391 * in SDIO ISR(host had been claimed).
394 *psdio pointer of SDIO_DATA
395 *addr address to read
397 *pdata pointer to put data, this should be a "DMA:able scratch buffer"!
403 s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
405 struct adapter *padapter;
406 struct dvobj_priv *psdiodev;
410 struct sdio_func *func;
412 padapter = pintfhdl->padapter;
413 psdiodev = pintfhdl->pintf_dev;
414 psdio = &psdiodev->intf_data;
416 if (padapter->bSurpriseRemoved) {
417 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
423 if (unlikely((cnt == 1) || (cnt == 2)))
428 for (i = 0; i < cnt; i++)
430 *(pbuf+i) = sdio_readb(func, addr+i, &err);
433 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x\n", __func__, err, addr);
440 err = sdio_memcpy_fromio(func, pdata, addr, cnt);
442 DBG_871X(KERN_ERR "%s: FAIL(%d)! ADDR =%#x Size =%d\n", __func__, err, addr, cnt);
448 * Use CMD53 to read data from SDIO device.
451 *psdio pointer of SDIO_DATA
452 *addr address to read
454 *pdata pointer to put data, this should be a "DMA:able scratch buffer"!
460 s32 sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
462 struct adapter *padapter;
463 struct dvobj_priv *psdiodev;
466 struct sdio_func *func;
470 padapter = pintfhdl->padapter;
471 psdiodev = pintfhdl->pintf_dev;
472 psdio = &psdiodev->intf_data;
474 if (padapter->bSurpriseRemoved) {
475 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
479 claim_needed = rtw_sdio_claim_host_needed(func);
482 sdio_claim_host(func);
483 err = _sd_read(pintfhdl, addr, cnt, pdata);
485 sdio_release_host(func);
490 * Use CMD53 to write data to SDIO device.
491 * This function MUST be called after sdio_claim_host() or
492 * in SDIO ISR(host had been claimed).
495 *psdio pointer of SDIO_DATA
496 *addr address to write
498 *pdata data pointer, this should be a "DMA:able scratch buffer"!
504 s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
506 struct adapter *padapter;
507 struct dvobj_priv *psdiodev;
510 struct sdio_func *func;
514 padapter = pintfhdl->padapter;
515 psdiodev = pintfhdl->pintf_dev;
516 psdio = &psdiodev->intf_data;
518 if (padapter->bSurpriseRemoved) {
519 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
524 /* size = sdio_align_size(func, cnt); */
526 if (unlikely((cnt == 1) || (cnt == 2)))
531 for (i = 0; i < cnt; i++)
533 sdio_writeb(func, *(pbuf+i), addr+i, &err);
535 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr = 0x%05x val = 0x%02x\n", __func__, err, addr, *(pbuf+i));
544 err = sdio_memcpy_toio(func, addr, pdata, size);
546 DBG_871X(KERN_ERR "%s: FAIL(%d)! ADDR =%#x Size =%d(%d)\n", __func__, err, addr, cnt, size);
552 * Use CMD53 to write data to SDIO device.
555 * psdio pointer of SDIO_DATA
556 * addr address to write
557 * cnt amount to write
558 * pdata data pointer, this should be a "DMA:able scratch buffer"!
564 s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
566 struct adapter *padapter;
567 struct dvobj_priv *psdiodev;
569 struct sdio_func *func;
573 padapter = pintfhdl->padapter;
574 psdiodev = pintfhdl->pintf_dev;
575 psdio = &psdiodev->intf_data;
577 if (padapter->bSurpriseRemoved) {
578 /* DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__); */
583 claim_needed = rtw_sdio_claim_host_needed(func);
586 sdio_claim_host(func);
587 err = _sd_write(pintfhdl, addr, cnt, pdata);
589 sdio_release_host(func);