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;
52 padapter = pintfhdl->padapter;
53 psdiodev = pintfhdl->pintf_dev;
54 psdio = &psdiodev->intf_data;
56 if(padapter->bSurpriseRemoved){
57 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
62 claim_needed = rtw_sdio_claim_host_needed(func);
65 sdio_claim_host(func);
66 v = sdio_f0_readb(func, addr, err);
68 sdio_release_host(func);
70 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
77 void sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
80 struct dvobj_priv *psdiodev;
83 struct sdio_func *func;
87 padapter = pintfhdl->padapter;
88 psdiodev = pintfhdl->pintf_dev;
89 psdio = &psdiodev->intf_data;
91 if(padapter->bSurpriseRemoved){
92 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
97 claim_needed = rtw_sdio_claim_host_needed(func);
100 sdio_claim_host(func);
101 sdio_f0_writeb(func, v, addr, err);
103 sdio_release_host(func);
105 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, *err, addr, v);
115 s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
118 struct dvobj_priv *psdiodev;
122 struct sdio_func *func;
125 padapter = pintfhdl->padapter;
126 psdiodev = pintfhdl->pintf_dev;
127 psdio = &psdiodev->intf_data;
129 if(padapter->bSurpriseRemoved){
130 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
136 for (i = 0; i < cnt; i++) {
137 pdata[i] = sdio_readb(func, addr+i, &err);
139 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr+i);
154 s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
157 struct dvobj_priv *psdiodev;
161 struct sdio_func *func;
165 padapter = pintfhdl->padapter;
166 psdiodev = pintfhdl->pintf_dev;
167 psdio = &psdiodev->intf_data;
169 if(padapter->bSurpriseRemoved){
170 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
175 claim_needed = rtw_sdio_claim_host_needed(func);
178 sdio_claim_host(func);
179 err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata);
181 sdio_release_host(func);
193 s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
196 struct dvobj_priv *psdiodev;
200 struct sdio_func *func;
203 padapter = pintfhdl->padapter;
204 psdiodev = pintfhdl->pintf_dev;
205 psdio = &psdiodev->intf_data;
207 if(padapter->bSurpriseRemoved){
208 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
214 for (i = 0; i < cnt; i++) {
215 sdio_writeb(func, pdata[i], addr+i, &err);
217 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, err, addr+i, pdata[i]);
232 s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata)
235 struct dvobj_priv *psdiodev;
239 struct sdio_func *func;
243 padapter = pintfhdl->padapter;
244 psdiodev = pintfhdl->pintf_dev;
245 psdio = &psdiodev->intf_data;
247 if(padapter->bSurpriseRemoved){
248 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
253 claim_needed = rtw_sdio_claim_host_needed(func);
256 sdio_claim_host(func);
257 err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata);
259 sdio_release_host(func);
266 u8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
269 struct dvobj_priv *psdiodev;
273 struct sdio_func *func;
276 padapter = pintfhdl->padapter;
277 psdiodev = pintfhdl->pintf_dev;
278 psdio = &psdiodev->intf_data;
280 if(padapter->bSurpriseRemoved){
281 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
287 v = sdio_readb(func, addr, err);
290 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
297 u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
300 struct dvobj_priv *psdiodev;
304 struct sdio_func *func;
308 padapter = pintfhdl->padapter;
309 psdiodev = pintfhdl->pintf_dev;
310 psdio = &psdiodev->intf_data;
312 if(padapter->bSurpriseRemoved){
313 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
318 claim_needed = rtw_sdio_claim_host_needed(func);
321 sdio_claim_host(func);
322 v = sdio_readb(func, addr, err);
324 sdio_release_host(func);
326 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
333 u16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
336 struct dvobj_priv *psdiodev;
340 struct sdio_func *func;
344 padapter = pintfhdl->padapter;
345 psdiodev = pintfhdl->pintf_dev;
346 psdio = &psdiodev->intf_data;
348 if(padapter->bSurpriseRemoved){
349 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
354 claim_needed = rtw_sdio_claim_host_needed(func);
357 sdio_claim_host(func);
358 v = sdio_readw(func, addr, err);
360 sdio_release_host(func);
362 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, *err, addr);
369 u32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
372 struct dvobj_priv *psdiodev;
376 struct sdio_func *func;
379 padapter = pintfhdl->padapter;
380 psdiodev = pintfhdl->pintf_dev;
381 psdio = &psdiodev->intf_data;
383 if(padapter->bSurpriseRemoved){
384 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
390 v = sdio_readl(func, addr, err);
396 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x\n", __func__, *err, addr, v);
399 for(i=0; i<SD_IO_TRY_CNT; i++)
401 //sdio_claim_host(func);
402 v = sdio_readl(func, addr, err);
403 //sdio_release_host(func);
405 rtw_reset_continual_io_error(psdiodev);
409 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
410 if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err))
412 padapter->bSurpriseRemoved = _TRUE;
415 if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){
416 padapter->bSurpriseRemoved = _TRUE;
423 if (i==SD_IO_TRY_CNT)
424 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
426 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
435 u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err)
438 struct dvobj_priv *psdiodev;
442 struct sdio_func *func;
446 padapter = pintfhdl->padapter;
447 psdiodev = pintfhdl->pintf_dev;
448 psdio = &psdiodev->intf_data;
450 if(padapter->bSurpriseRemoved){
451 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
456 claim_needed = rtw_sdio_claim_host_needed(func);
459 sdio_claim_host(func);
460 v = sdio_readl(func, addr, err);
462 sdio_release_host(func);
468 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x\n", __func__, *err, addr, v);
471 for(i=0; i<SD_IO_TRY_CNT; i++)
473 if (claim_needed) sdio_claim_host(func);
474 v = sdio_readl(func, addr, err);
475 if (claim_needed) sdio_release_host(func);
478 rtw_reset_continual_io_error(psdiodev);
481 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
482 if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){
483 padapter->bSurpriseRemoved = _TRUE;
486 if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){
487 padapter->bSurpriseRemoved = _TRUE;
493 if (i==SD_IO_TRY_CNT)
494 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
496 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
505 void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err)
508 struct dvobj_priv *psdiodev;
511 struct sdio_func *func;
516 padapter = pintfhdl->padapter;
517 psdiodev = pintfhdl->pintf_dev;
518 psdio = &psdiodev->intf_data;
520 if(padapter->bSurpriseRemoved){
521 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
526 claim_needed = rtw_sdio_claim_host_needed(func);
529 sdio_claim_host(func);
530 sdio_writeb(func, v, addr, err);
532 sdio_release_host(func);
534 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, *err, addr, v);
539 void sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err)
542 struct dvobj_priv *psdiodev;
545 struct sdio_func *func;
549 padapter = pintfhdl->padapter;
550 psdiodev = pintfhdl->pintf_dev;
551 psdio = &psdiodev->intf_data;
553 if(padapter->bSurpriseRemoved){
554 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
559 claim_needed = rtw_sdio_claim_host_needed(func);
562 sdio_claim_host(func);
563 sdio_writew(func, v, addr, err);
565 sdio_release_host(func);
567 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%04x\n", __func__, *err, addr, v);
572 void _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
575 struct dvobj_priv *psdiodev;
578 struct sdio_func *func;
581 padapter = pintfhdl->padapter;
582 psdiodev = pintfhdl->pintf_dev;
583 psdio = &psdiodev->intf_data;
585 if(padapter->bSurpriseRemoved){
586 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
592 sdio_writel(func, v, addr, err);
598 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x val=0x%08x\n", __func__, *err, addr, v);
601 for(i=0; i<SD_IO_TRY_CNT; i++)
603 sdio_writel(func, v, addr, err);
605 rtw_reset_continual_io_error(psdiodev);
608 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
609 if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){
610 padapter->bSurpriseRemoved = _TRUE;
613 if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){
614 padapter->bSurpriseRemoved = _TRUE;
620 if (i==SD_IO_TRY_CNT)
621 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
623 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
630 void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err)
633 struct dvobj_priv *psdiodev;
635 struct sdio_func *func;
639 padapter = pintfhdl->padapter;
640 psdiodev = pintfhdl->pintf_dev;
641 psdio = &psdiodev->intf_data;
643 if(padapter->bSurpriseRemoved){
644 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
649 claim_needed = rtw_sdio_claim_host_needed(func);
652 sdio_claim_host(func);
653 sdio_writel(func, v, addr, err);
655 sdio_release_host(func);
661 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x val=0x%08x\n", __func__, *err, addr, v);
664 for(i=0; i<SD_IO_TRY_CNT; i++)
666 if (claim_needed) sdio_claim_host(func);
667 sdio_writel(func, v, addr, err);
668 if (claim_needed) sdio_release_host(func);
670 rtw_reset_continual_io_error(psdiodev);
673 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i);
674 if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){
675 padapter->bSurpriseRemoved = _TRUE;
678 if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){
679 padapter->bSurpriseRemoved = _TRUE;
685 if (i==SD_IO_TRY_CNT)
686 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
688 DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x val=0x%08x, try_cnt=%d\n", __func__, *err, addr, v, i);
695 * Use CMD53 to read data from SDIO device.
696 * This function MUST be called after sdio_claim_host() or
697 * in SDIO ISR(host had been claimed).
700 * psdio pointer of SDIO_DATA
701 * addr address to read
703 * pdata pointer to put data, this should be a "DMA:able scratch buffer"!
709 s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
712 struct dvobj_priv *psdiodev;
716 struct sdio_func *func;
719 padapter = pintfhdl->padapter;
720 psdiodev = pintfhdl->pintf_dev;
721 psdio = &psdiodev->intf_data;
723 if(padapter->bSurpriseRemoved){
724 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
730 if (unlikely((cnt==1) || (cnt==2)))
733 u8 *pbuf = (u8*)pdata;
735 for (i = 0; i < cnt; i++)
737 *(pbuf+i) = sdio_readb(func, addr+i, &err);
740 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr);
747 err = sdio_memcpy_fromio(func, pdata, addr, cnt);
749 DBG_871X(KERN_ERR "%s: FAIL(%d)! ADDR=%#x Size=%d\n", __func__, err, addr, cnt);
758 * Use CMD53 to read data from SDIO device.
761 * psdio pointer of SDIO_DATA
762 * addr address to read
764 * pdata pointer to put data, this should be a "DMA:able scratch buffer"!
770 s32 sd_read(struct intf_hdl * pintfhdl, u32 addr, u32 cnt, void *pdata)
773 struct dvobj_priv *psdiodev;
776 struct sdio_func *func;
781 padapter = pintfhdl->padapter;
782 psdiodev = pintfhdl->pintf_dev;
783 psdio = &psdiodev->intf_data;
785 if(padapter->bSurpriseRemoved){
786 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
790 claim_needed = rtw_sdio_claim_host_needed(func);
793 sdio_claim_host(func);
794 err = _sd_read(pintfhdl, addr, cnt, pdata);
796 sdio_release_host(func);
802 * Use CMD53 to write data to SDIO device.
803 * This function MUST be called after sdio_claim_host() or
804 * in SDIO ISR(host had been claimed).
807 * psdio pointer of SDIO_DATA
808 * addr address to write
809 * cnt amount to write
810 * pdata data pointer, this should be a "DMA:able scratch buffer"!
816 s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
819 struct dvobj_priv *psdiodev;
822 struct sdio_func *func;
827 padapter = pintfhdl->padapter;
828 psdiodev = pintfhdl->pintf_dev;
829 psdio = &psdiodev->intf_data;
831 if(padapter->bSurpriseRemoved){
832 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
837 // size = sdio_align_size(func, cnt);
839 if (unlikely((cnt==1) || (cnt==2)))
842 u8 *pbuf = (u8*)pdata;
844 for (i = 0; i < cnt; i++)
846 sdio_writeb(func, *(pbuf+i), addr+i, &err);
848 DBG_871X(KERN_ERR "%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, err, addr, *(pbuf+i));
857 err = sdio_memcpy_toio(func, addr, pdata, size);
859 DBG_871X(KERN_ERR "%s: FAIL(%d)! ADDR=%#x Size=%d(%d)\n", __func__, err, addr, cnt, size);
868 * Use CMD53 to write data to SDIO device.
871 * psdio pointer of SDIO_DATA
872 * addr address to write
873 * cnt amount to write
874 * pdata data pointer, this should be a "DMA:able scratch buffer"!
880 s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata)
883 struct dvobj_priv *psdiodev;
886 struct sdio_func *func;
890 padapter = pintfhdl->padapter;
891 psdiodev = pintfhdl->pintf_dev;
892 psdio = &psdiodev->intf_data;
894 if(padapter->bSurpriseRemoved){
895 //DBG_871X(" %s (padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n",__FUNCTION__);
900 claim_needed = rtw_sdio_claim_host_needed(func);
903 sdio_claim_host(func);
904 err = _sd_write(pintfhdl, addr, cnt, pdata);
906 sdio_release_host(func);