..something like this:
(v4.0.5. mainline)

diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index 459ed1b..82f41e3 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -1082,6 +1082,23 @@ static struct platform_driver sunxi_mmc_driver = {
 };
 module_platform_driver(sunxi_mmc_driver);
 
+int sw_mci_check_r1_ready(struct mmc_host* mmc, unsigned ms)
+{
+    struct sunxi_mmc_host *smc_host = mmc_priv(mmc);
+    unsigned expire = jiffies + msecs_to_jiffies(ms);
+    do {
+       if (!(mmc_readl(smc_host, REG_STAS) & SDXC_CARD_DATA_BUSY))
+           break;
+    } while (jiffies < expire);
+
+    if ((mmc_readl(smc_host, REG_STAS) & SDXC_CARD_DATA_BUSY)) {
+       dev_err(mmc_dev(mmc), "wait r1 rdy %d ms timeout\n", ms);
+       return -1;
+    } else
+       return 0;
+}
+EXPORT_SYMBOL_GPL(sw_mci_check_r1_ready);
+
 MODULE_DESCRIPTION("Allwinner's SD/MMC Card Controller Driver");
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("David Lanzend�rfer <[email protected]>");
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 7944224..ff63927 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -58,6 +58,8 @@
 #define BRCMF_DEFAULT_TXGLOM_SIZE      32  /* max tx frames in glom chain */
 #define BRCMF_DEFAULT_RXGLOM_SIZE      32  /* max rx frames in glom chain */
 
+extern int sw_mci_check_r1_ready(struct mmc_host* mmc, unsigned ms);
+
 static int brcmf_sdiod_txglomsz = BRCMF_DEFAULT_TXGLOM_SIZE;
 module_param_named(txglomsz, brcmf_sdiod_txglomsz, int, 0);
 MODULE_PARM_DESC(txglomsz, "maximum tx packet chain size [SDIO]");
@@ -266,6 +268,10 @@ static int brcmf_sdiod_request_data(struct
brcmf_sdio_dev *sdiodev, u8 fn,
                brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
                          write ? "write" : "read", fn, addr, ret);
 
+       //AW judge sdio read write timeout, 1s
+       if (sw_mci_check_r1_ready(sdiodev->func[fn]->card->host, 1000) != 0)
+               brcmf_err("sw_mci_check_r1_ready data timeout.\n");
+
        return ret;
 }
 
@@ -322,6 +328,11 @@ static int brcmf_sdiod_regrw_helper(struct
brcmf_sdio_dev *sdiodev, u32 addr,
                        brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: 
%d\n",
                                  write ? "write" : "read", func, addr, ret);
        }
+
+       //AW judge sdio read write timeout, 1s
+       if (sw_mci_check_r1_ready(sdiodev->func[func]->card->host, 1000) != 0)
+               brcmf_err("sw_mci_check_r1_ready data timeout.\n");
+
        return ret;
 }
 
@@ -461,6 +472,11 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev
*sdiodev, uint fn,
                                  req_sz);
        if (err == -ENOMEDIUM)
                brcmf_sdiod_nomedium_state(sdiodev);
+
+       //AW judge sdio read write timeout, 1s
+       if (sw_mci_check_r1_ready(sdiodev->func[fn]->card->host, 1000) != 0)
+               brcmf_err("sw_mci_check_r1_ready data timeout.\n");
+
        return err;
 }
 

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to