I have merged 4.6 mainline *drivers/wireless/broadcom *and *drivers/mmc* into imx6 4.1 kernel and this was a partial solution for my problem. Key part was newer sdhci driver(drivers/mmc/host). Before merge, RXHEADER FAILED caused a break and reset of connection. It was a ~18s break of no transfer. Now errors occur but they don't stop connection and transmission continues.
W dniu poniedziałek, 12 września 2016 23:43:24 UTC+2 użytkownik Sławomir Paszko napisał: > > I tried to implement sigint patch in freescale imx6 4.1 kernel( > http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/, branch > imx_4.1.15_1.0.0_ga), but it's not working. I have added these same changes > in bcmsdh.c and i've made my sw_mci_check_r1_ready() function in sdhci.c > based on > > static int sdhci_card_busy(struct mmc_host *mmc) > { > struct sdhci_host *host = mmc_priv(mmc); > u32 present_state; > > sdhci_runtime_pm_get(host); > /* Check whether DAT[3:0] is 0000 */ > present_state = sdhci_readl(host, SDHCI_PRESENT_STATE); > sdhci_runtime_pm_put(host); > > return !(present_state & SDHCI_DATA_LVL_MASK); > } > > Unfortunately this doesn't helped. Is there any official solution? Maybe > you can give me some advice how to implement this in 4.1 freescale kernel. > > W dniu czwartek, 9 lipca 2015 10:10:12 UTC+2 użytkownik sigint napisał: >> >> ..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.
