try this code.
drivers\net\wireless\broadcom\brcm80211\brcmfmac\bcmsdh.c
static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
bool write, u32 addr, struct sk_buff *pkt)
{
unsigned int req_sz;
int err;
/* Single skb use the standard mmc interface */
req_sz = pkt->len + 3;
req_sz &= (uint)~3;
//check if device is busy.
if (sw_mci_check_r1_ready(sdiodev->func[fn]->card->host, 1000) != 0)
brcmf_err("sw_mci_check_r1_ready data timeout.\n");
if (write)
err = sdio_memcpy_toio(sdiodev->func[fn], addr,
((u8 *)(pkt->data)), req_sz);
else if (fn == 1)
err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
addr, req_sz);
else
/* function 2 read is FIFO operation */
err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
req_sz);
if (err == -ENOMEDIUM)
brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
return err;
}
在 2016年9月16日星期五 UTC+8下午4:25:51,Sławomir Paszko写道:
>
> 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.