1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 *******************************************************************************/
19 #define _SDIO_OPS_LINUX_C_
21 #include <drv_types.h>
23 static bool rtw_sdio_claim_host_needed(struct sdio_func *func)
25 struct dvobj_priv *dvobj = sdio_get_drvdata(func);
26 PSDIO_DATA sdio_data = &dvobj->intf_data;
28 if (sdio_data->sys_sdio_irq_thd && sdio_data->sys_sdio_irq_thd == current)
33 inline void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl)
35 PSDIO_DATA sdio_data = &dvobj->intf_data;
37 sdio_data->sys_sdio_irq_thd = thd_hdl;
40 u8 sd_f0_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
43 struct dvobj_priv *psdiodev;
47 struct sdio_func *func;
51 padapter = pintfhdl->padapter;
52 psdiodev = pintfhdl->pintf_dev;
53 psdio = &psdiodev->intf_data;
55 if (rtw_is_surprise_removed(padapter)) {
56 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
61 claim_needed = rtw_sdio_claim_host_needed(func);
64 sdio_claim_host(func);
65 v = sdio_f0_readb(func, addr, err);
67 sdio_release_host(func);
69 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
75 void sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
78 struct dvobj_priv *psdiodev;
81 struct sdio_func *func;
84 padapter = pintfhdl->padapter;
85 psdiodev = pintfhdl->pintf_dev;
86 psdio = &psdiodev->intf_data;
88 if (rtw_is_surprise_removed(padapter)) {
89 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
94 claim_needed = rtw_sdio_claim_host_needed(func);
97 sdio_claim_host(func);
98 sdio_f0_writeb(func, v, addr, err);
100 sdio_release_host(func);
102 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, *err, addr, v);
111 s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
114 struct dvobj_priv *psdiodev;
118 struct sdio_func *func;
120 padapter = pintfhdl->padapter;
121 psdiodev = pintfhdl->pintf_dev;
122 psdio = &psdiodev->intf_data;
124 if (rtw_is_surprise_removed(padapter)) {
125 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
131 for (i = 0; i < cnt; i++) {
132 pdata[i] = sdio_readb(func, addr + i, &err);
134 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr + i);
148 s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
151 struct dvobj_priv *psdiodev;
155 struct sdio_func *func;
158 padapter = pintfhdl->padapter;
159 psdiodev = pintfhdl->pintf_dev;
160 psdio = &psdiodev->intf_data;
162 if (rtw_is_surprise_removed(padapter)) {
163 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
168 claim_needed = rtw_sdio_claim_host_needed(func);
171 sdio_claim_host(func);
172 err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata);
174 sdio_release_host(func);
185 s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
188 struct dvobj_priv *psdiodev;
192 struct sdio_func *func;
194 padapter = pintfhdl->padapter;
195 psdiodev = pintfhdl->pintf_dev;
196 psdio = &psdiodev->intf_data;
198 if (rtw_is_surprise_removed(padapter)) {
199 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
205 for (i = 0; i < cnt; i++) {
206 sdio_writeb(func, pdata[i], addr + i, &err);
208 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, err, addr + i, pdata[i]);
222 s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
225 struct dvobj_priv *psdiodev;
229 struct sdio_func *func;
232 padapter = pintfhdl->padapter;
233 psdiodev = pintfhdl->pintf_dev;
234 psdio = &psdiodev->intf_data;
236 if (rtw_is_surprise_removed(padapter)) {
237 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
242 claim_needed = rtw_sdio_claim_host_needed(func);
245 sdio_claim_host(func);
246 err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata);
248 sdio_release_host(func);
254 u8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
257 struct dvobj_priv *psdiodev;
261 struct sdio_func *func;
263 padapter = pintfhdl->padapter;
264 psdiodev = pintfhdl->pintf_dev;
265 psdio = &psdiodev->intf_data;
267 if (rtw_is_surprise_removed(padapter)) {
268 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
274 v = sdio_readb(func, addr, err);
277 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
283 u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
286 struct dvobj_priv *psdiodev;
290 struct sdio_func *func;
293 padapter = pintfhdl->padapter;
294 psdiodev = pintfhdl->pintf_dev;
295 psdio = &psdiodev->intf_data;
297 if (rtw_is_surprise_removed(padapter)) {
298 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
303 claim_needed = rtw_sdio_claim_host_needed(func);
306 sdio_claim_host(func);
307 v = sdio_readb(func, addr, err);
309 sdio_release_host(func);
311 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
317 u16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
320 struct dvobj_priv *psdiodev;
324 struct sdio_func *func;
327 padapter = pintfhdl->padapter;
328 psdiodev = pintfhdl->pintf_dev;
329 psdio = &psdiodev->intf_data;
331 if (rtw_is_surprise_removed(padapter)) {
332 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
337 claim_needed = rtw_sdio_claim_host_needed(func);
340 sdio_claim_host(func);
341 v = sdio_readw(func, addr, err);
343 sdio_release_host(func);
345 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
351 u32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
354 struct dvobj_priv *psdiodev;
358 struct sdio_func *func;
360 padapter = pintfhdl->padapter;
361 psdiodev = pintfhdl->pintf_dev;
362 psdio = &psdiodev->intf_data;
364 if (rtw_is_surprise_removed(padapter)) {
365 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
371 v = sdio_readl(func, addr, err);
376 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x\n", __func__, *err, addr, v);
379 for (i = 0; i < SD_IO_TRY_CNT; i++) {
380 /* sdio_claim_host(func); */
381 v = sdio_readl(func, addr, err);
382 /* sdio_release_host(func); */
384 rtw_reset_continual_io_error(psdiodev);
387 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
388 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
389 rtw_set_surprise_removed(padapter);
391 if (rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE) {
392 rtw_set_surprise_removed(padapter);
399 if (i == SD_IO_TRY_CNT)
400 RTW_ERR("%s: FAIL!(%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
402 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
410 u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
413 struct dvobj_priv *psdiodev;
417 struct sdio_func *func;
420 padapter = pintfhdl->padapter;
421 psdiodev = pintfhdl->pintf_dev;
422 psdio = &psdiodev->intf_data;
424 if (rtw_is_surprise_removed(padapter)) {
425 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
430 claim_needed = rtw_sdio_claim_host_needed(func);
433 sdio_claim_host(func);
434 v = sdio_readl(func, addr, err);
436 sdio_release_host(func);
441 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x\n", __func__, *err, addr, v);
444 for (i = 0; i < SD_IO_TRY_CNT; i++) {
446 sdio_claim_host(func);
447 v = sdio_readl(func, addr, err);
449 sdio_release_host(func);
452 rtw_reset_continual_io_error(psdiodev);
455 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
456 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
457 rtw_set_surprise_removed(padapter);
459 if (rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE) {
460 rtw_set_surprise_removed(padapter);
466 if (i == SD_IO_TRY_CNT)
467 RTW_ERR("%s: FAIL!(%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
469 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
477 void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
480 struct dvobj_priv *psdiodev;
483 struct sdio_func *func;
487 padapter = pintfhdl->padapter;
488 psdiodev = pintfhdl->pintf_dev;
489 psdio = &psdiodev->intf_data;
491 if (rtw_is_surprise_removed(padapter)) {
492 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
497 claim_needed = rtw_sdio_claim_host_needed(func);
500 sdio_claim_host(func);
501 sdio_writeb(func, v, addr, err);
503 sdio_release_host(func);
505 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, *err, addr, v);
509 void sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err)
512 struct dvobj_priv *psdiodev;
515 struct sdio_func *func;
518 padapter = pintfhdl->padapter;
519 psdiodev = pintfhdl->pintf_dev;
520 psdio = &psdiodev->intf_data;
522 if (rtw_is_surprise_removed(padapter)) {
523 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
528 claim_needed = rtw_sdio_claim_host_needed(func);
531 sdio_claim_host(func);
532 sdio_writew(func, v, addr, err);
534 sdio_release_host(func);
536 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%04x\n", __func__, *err, addr, v);
540 void _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
543 struct dvobj_priv *psdiodev;
546 struct sdio_func *func;
548 padapter = pintfhdl->padapter;
549 psdiodev = pintfhdl->pintf_dev;
550 psdio = &psdiodev->intf_data;
552 if (rtw_is_surprise_removed(padapter)) {
553 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
559 sdio_writel(func, v, addr, err);
564 RTW_ERR("%s: (%d) addr=0x%05x val=0x%08x\n", __func__, *err, addr, v);
567 for (i = 0; i < SD_IO_TRY_CNT; i++) {
568 sdio_writel(func, v, addr, err);
570 rtw_reset_continual_io_error(psdiodev);
573 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
574 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
575 rtw_set_surprise_removed(padapter);
577 if (rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE) {
578 rtw_set_surprise_removed(padapter);
584 if (i == SD_IO_TRY_CNT)
585 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
587 RTW_ERR("%s: (%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
593 void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
596 struct dvobj_priv *psdiodev;
598 struct sdio_func *func;
601 padapter = pintfhdl->padapter;
602 psdiodev = pintfhdl->pintf_dev;
603 psdio = &psdiodev->intf_data;
605 if (rtw_is_surprise_removed(padapter)) {
606 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
611 claim_needed = rtw_sdio_claim_host_needed(func);
614 sdio_claim_host(func);
615 sdio_writel(func, v, addr, err);
617 sdio_release_host(func);
622 RTW_ERR("%s: (%d) addr=0x%05x val=0x%08x\n", __func__, *err, addr, v);
625 for (i = 0; i < SD_IO_TRY_CNT; i++) {
627 sdio_claim_host(func);
628 sdio_writel(func, v, addr, err);
630 sdio_release_host(func);
632 rtw_reset_continual_io_error(psdiodev);
635 RTW_ERR("%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
636 if ((-ESHUTDOWN == *err) || (-ENODEV == *err))
637 rtw_set_surprise_removed(padapter);
639 if (rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE) {
640 rtw_set_surprise_removed(padapter);
646 if (i == SD_IO_TRY_CNT)
647 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
649 RTW_ERR("%s: (%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
653 #endif /* !RTW_HALMAC */
656 * Use CMD53 to read data from SDIO device.
657 * This function MUST be called after sdio_claim_host() or
658 * in SDIO ISR(host had been claimed).
661 * psdio pointer of SDIO_DATA
662 * addr address to read
664 * pdata pointer to put data, this should be a "DMA:able scratch buffer"!
670 s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
673 struct dvobj_priv *psdiodev;
677 struct sdio_func *func;
679 padapter = pintfhdl->padapter;
680 psdiodev = pintfhdl->pintf_dev;
681 psdio = &psdiodev->intf_data;
683 if (rtw_is_surprise_removed(padapter)) {
684 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
690 if (unlikely((cnt == 1) || (cnt == 2))) {
692 u8 *pbuf = (u8 *)pdata;
694 for (i = 0; i < cnt; i++) {
695 *(pbuf + i) = sdio_readb(func, addr + i, &err);
698 RTW_ERR("%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr);
705 err = sdio_memcpy_fromio(func, pdata, addr, cnt);
707 RTW_ERR("%s: FAIL(%d)! ADDR=%#x Size=%d\n", __func__, err, addr, cnt);
709 if (err == (-ESHUTDOWN) || err == (-ENODEV) || err == (-ENOMEDIUM) || err == (-ETIMEDOUT))
710 rtw_set_surprise_removed(padapter);
717 * Use CMD53 to read data from SDIO device.
720 * psdio pointer of SDIO_DATA
721 * addr address to read
723 * pdata pointer to put data, this should be a "DMA:able scratch buffer"!
729 s32 sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
732 struct dvobj_priv *psdiodev;
735 struct sdio_func *func;
739 padapter = pintfhdl->padapter;
740 psdiodev = pintfhdl->pintf_dev;
741 psdio = &psdiodev->intf_data;
743 if (rtw_is_surprise_removed(padapter)) {
744 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
748 claim_needed = rtw_sdio_claim_host_needed(func);
751 sdio_claim_host(func);
752 err = _sd_read(pintfhdl, addr, cnt, pdata);
754 sdio_release_host(func);
759 * Use CMD53 to write data to SDIO device.
760 * This function MUST be called after sdio_claim_host() or
761 * in SDIO ISR(host had been claimed).
764 * psdio pointer of SDIO_DATA
765 * addr address to write
766 * cnt amount to write
767 * pdata data pointer, this should be a "DMA:able scratch buffer"!
773 s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
776 struct dvobj_priv *psdiodev;
779 struct sdio_func *func;
783 padapter = pintfhdl->padapter;
784 psdiodev = pintfhdl->pintf_dev;
785 psdio = &psdiodev->intf_data;
787 if (rtw_is_surprise_removed(padapter)) {
788 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
793 /* size = sdio_align_size(func, cnt); */
795 if (unlikely((cnt == 1) || (cnt == 2))) {
797 u8 *pbuf = (u8 *)pdata;
799 for (i = 0; i < cnt; i++) {
800 sdio_writeb(func, *(pbuf + i), addr + i, &err);
802 RTW_ERR("%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, err, addr, *(pbuf + i));
811 err = sdio_memcpy_toio(func, addr, pdata, size);
813 RTW_ERR("%s: FAIL(%d)! ADDR=%#x Size=%d(%d)\n", __func__, err, addr, cnt, size);
820 * Use CMD53 to write data to SDIO device.
823 * psdio pointer of SDIO_DATA
824 * addr address to write
825 * cnt amount to write
826 * pdata data pointer, this should be a "DMA:able scratch buffer"!
832 s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
835 struct dvobj_priv *psdiodev;
838 struct sdio_func *func;
841 padapter = pintfhdl->padapter;
842 psdiodev = pintfhdl->pintf_dev;
843 psdio = &psdiodev->intf_data;
845 if (rtw_is_surprise_removed(padapter)) {
846 /* RTW_INFO(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__); */
851 claim_needed = rtw_sdio_claim_host_needed(func);
854 sdio_claim_host(func);
855 err = _sd_write(pintfhdl, addr, cnt, pdata);
857 sdio_release_host(func);
862 /*#define RTW_SDIO_DUMP*/
864 int __must_check rtw_sdio_raw_read(struct dvobj_priv *d, int addr,
865 void *buf, size_t len, bool fixed)
869 struct sdio_func *func;
872 if (rtw_is_surprise_removed(dvobj_get_primary_adapter(d))) {
873 /*RTW_ERR(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__);*/
877 func = dvobj_to_sdio_func(d);
878 claim_needed = rtw_sdio_claim_host_needed(func);
879 f0 = RTW_SDIO_ADDR_F0_CHK(addr);
880 cmd52 = RTW_SDIO_ADDR_CMD52_CHK(addr);
884 dev_dbg(&func->dev, "rtw_sdio: READ F0\n");
886 dev_dbg(&func->dev, "rtw_sdio: READ use CMD52\n");
888 dev_dbg(&func->dev, "rtw_sdio: READ use CMD53\n");
890 dev_dbg(&func->dev, "rtw_sdio: READ from 0x%05x\n", addr);
891 print_hex_dump(KERN_DEBUG, "rtw_sdio: READ ",
892 DUMP_PREFIX_OFFSET, 16, 1,
894 #endif /* RTW_SDIO_DUMP */
897 sdio_claim_host(func);
903 for (i = 0; i < len; i++, addr++) {
904 ((u8 *)buf)[i] = sdio_f0_readb(func, addr, &error);
908 dev_info(&func->dev, "%s: sdio f0 read 52 addr 0x%x, byte 0x%02x\n",
909 __func__, addr + i, ((u8 *)buf)[i]);
916 #ifdef RTW_SDIO_IO_DBG
917 dev_info(&func->dev, "%s: sdio read 52 addr 0x%x, %zu bytes\n",
918 __func__, addr, len);
920 for (i = 0; i < len; i++) {
921 ((u8 *)buf)[i] = sdio_readb(func, addr, &error);
925 dev_info(&func->dev, "%s: sdio read 52 addr 0x%x, byte 0x%02x\n",
926 __func__, addr + i, ((u8 *)buf)[i]);
932 #ifdef RTW_SDIO_IO_DBG
933 dev_info(&func->dev, "%s: sdio read 53 addr 0x%x, %zu bytes\n",
934 __func__, addr, len);
937 error = sdio_readsb(func, buf, addr, len);
939 error = sdio_memcpy_fromio(func, buf, addr, len);
944 sdio_release_host(func);
946 if (WARN_ON(error)) {
947 dev_err(&func->dev, "%s: sdio read failed (%d)\n", __func__, error);
948 #ifndef RTW_SDIO_DUMP
950 dev_err(&func->dev, "rtw_sdio: READ F0\n");
952 dev_err(&func->dev, "rtw_sdio: READ use CMD52\n");
954 dev_err(&func->dev, "rtw_sdio: READ use CMD53\n");
955 dev_err(&func->dev, "rtw_sdio: READ from 0x%04x\n", addr);
956 print_hex_dump(KERN_ERR, "rtw_sdio: READ ",
957 DUMP_PREFIX_OFFSET, 16, 1,
959 #endif /* !RTW_SDIO_DUMP */
962 if (error == (-ESHUTDOWN) || error == (-ENODEV) || error == (-ENOMEDIUM) || error == (-ETIMEDOUT))
963 rtw_set_surprise_removed(dvobj_get_primary_adapter(d));
968 int __must_check rtw_sdio_raw_write(struct dvobj_priv *d, int addr,
969 void *buf, size_t len, bool fixed)
973 struct sdio_func *func;
976 if (rtw_is_surprise_removed(dvobj_get_primary_adapter(d))) {
977 /*RTW_ERR(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n", __func__);*/
981 func = dvobj_to_sdio_func(d);
982 claim_needed = rtw_sdio_claim_host_needed(func);
983 f0 = RTW_SDIO_ADDR_F0_CHK(addr);
984 cmd52 = RTW_SDIO_ADDR_CMD52_CHK(addr);
988 dev_dbg(&func->dev, "rtw_sdio: WRITE F0\n");
990 dev_dbg(&func->dev, "rtw_sdio: WRITE use CMD52\n");
992 dev_dbg(&func->dev, "rtw_sdio: WRITE use CMD53\n");
993 dev_dbg(&func->dev, "rtw_sdio: WRITE to 0x%05x\n", addr);
994 print_hex_dump(KERN_DEBUG, "rtw_sdio: WRITE ",
995 DUMP_PREFIX_OFFSET, 16, 1,
997 #endif /* RTW_SDIO_DUMP */
1000 sdio_claim_host(func);
1006 for (i = 0; i < len; i++, addr++) {
1007 sdio_f0_writeb(func, ((u8 *)buf)[i], addr, &error);
1011 dev_info(&func->dev, "%s: sdio f0 write 52 addr 0x%x, byte 0x%02x\n",
1012 __func__, addr, ((u8 *)buf)[i]);
1019 #ifdef RTW_SDIO_IO_DBG
1020 dev_info(&func->dev, "%s: sdio write 52 addr 0x%x, %zu bytes\n",
1021 __func__, addr, len);
1023 for (i = 0; i < len; i++) {
1024 sdio_writeb(func, ((u8 *)buf)[i], addr, &error);
1028 dev_info(&func->dev, "%s: sdio write 52 addr 0x%x, byte 0x%02x\n",
1029 __func__, addr + i, ((u8 *)buf)[i]);
1035 #ifdef RTW_SDIO_IO_DBG
1036 dev_info(&func->dev, "%s: sdio write 53 addr 0x%x, %zu bytes\n",
1037 __func__, addr, len);
1040 error = sdio_writesb(func, addr, buf, len);
1042 error = sdio_memcpy_toio(func, addr, buf, len);
1047 sdio_release_host(func);
1049 if (WARN_ON(error)) {
1050 dev_err(&func->dev, "%s: sdio write failed (%d)\n", __func__, error);
1051 #ifndef RTW_SDIO_DUMP
1053 dev_err(&func->dev, "rtw_sdio: WRITE F0\n");
1055 dev_err(&func->dev, "rtw_sdio: WRITE use CMD52\n");
1057 dev_err(&func->dev, "rtw_sdio: WRITE use CMD53\n");
1058 dev_err(&func->dev, "rtw_sdio: WRITE to 0x%05x\n", addr);
1059 print_hex_dump(KERN_ERR, "rtw_sdio: WRITE ",
1060 DUMP_PREFIX_OFFSET, 16, 1,
1062 #endif /* !RTW_SDIO_DUMP */
1065 if (error == (-ESHUTDOWN) || error == (-ENODEV) || error == (-ENOMEDIUM) || error == (-ETIMEDOUT))
1066 rtw_set_surprise_removed(dvobj_get_primary_adapter(d));