Search Linux Wireless

Re: brcmfmac: brcm43430 Invalid mailbox value issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



+ Chi-Hsien Lin

On 12-06-17 11:54, James Hughes wrote:
> On 24 May 2017 at 16:14, James Hughes <james.hughes@xxxxxxxxxxxxxxx> wrote:
>> On 24 May 2017 at 14:16, James Hughes <james.hughes@xxxxxxxxxxxxxxx> wrote:
>>> On 24 May 2017 at 14:13, Arend van Spriel <arend.vanspriel@xxxxxxxxxxxx> wrote:
>>>> On 24-05-17 14:50, James Hughes wrote:
>>>>> We are seeing an issue on Raspberry Pi which uses the bcm43430 chip. It's
>>>>> been tested up to 4.9 which still shows the issue (it's been there for some
>>>>> time, > 1yr). I'm trying to find someone who can test on 4.11 as I cannot
>>>>> replicate  (The latest kernel we have that works on a Pi)
>>>>>
>>>>> It exhibits as a log entry, and subsequent death of wireless connectivity.
>>>>>
>>>>> "Unknown mailbox data content: 0x40012"
>>>>>
>>>>> Look at the driver code, it appears to be checking the return
>>>>> value from a mailbox (presumably the one to the chip firmware), which
>>>>> has the 0x4 in the top word which shouldn't be there.
>>>>>
>>>>> The driver simply adds a log entry, but otherwise ignores the situation.
>>>>> However, we see wireless failure from this point.
>>>>>
>>>>> Since I believe this value is being returned from the chip, I cannot
>>>>> investigate much further. The public datasheet is of no help. We do appear
>>>>> to be using the latest firmware file.
>>>>>
>>>>> I'm not sure how to proceed on this one. It would be interesting to know
>>>>> under what circumstances that value can be returned from the mailbox.
>>>>>
>>>>> More details can be found at the end of this github issue.
>>>>>
>>>>> https://github.com/raspberrypi/linux/issues/1342
>>>>
>>>> Hi James,
>>>>
>>>> I looked through the issue on github and it seems you are getting -110
>>>> (-ETIMEDOUT) on SDIO transfers. This could be a signal integrity issue
>>>> of the SDIO bus signals, which may happen if the RPi3 power supply can
>>>> not provide enough amps. So you could try to replicate it by
>>>> deliberately use a power supply below specs.
>>>>
>>>> I did not get my RPi3 going yet, but I can try next monday or so. Office
>>>> closed due to Ascension day. Do you know what SDIO host controller is
>>>> used on RPi3? I can check myself, but if you know the answer up front
>>>> let me know.
>>>>
>>>> Regards,
>>>> Arend
>>>
>>> Hi Arend,
>>>
>>> It's the one built in to the SoC (the bcm2835) and I believe is an
>>> Arasan device. If you need anything else (HW etc) please let me know.
>>>
>>> I'll try the low power setup you suggest. Might be the reason why I
>>> cannot replicate, I always use decent power supplies.
>>>
>>> James
>>
>> Spent an hour or so trying the low power situation. Got to the point
>> where USB devices were dropping out, but didn't see any SDIO timeouts
>> or mailbox errors in dmesg. Will keep looking though - absence of
>> evidence is not evidence of absence etc etc.
>>
>> James
> 
> Hi Arend, all,
> 
> Is there anything I can do to help track this down? Further low power
> testing didn't provoke the issue. We are continually getting reports
> on this issue, the github issue has some more, perhaps relevant, data
> now. There is a possibility it may be channel related.
> 
> https://github.com/raspberrypi/linux/issues/1342

I have been thinking about this and I recall three scenarios resulting
in -110 (-ETIMEDOUT) error on sdio transfers: 1) bad sdio signals, 2)
bus sleep state transitions, and 3) device signals CARD_BUSY.

So you checked the first scenario. To investigate 2) you could set
define BRCMF_IDLE_INTERVAL to zero, which will basically leave sdio on
the device in normal state (less power-savings) when the device is idle.

For 3) the mmc_host_ops define following callback:

        /* Check if the card is pulling dat[0:3] low */
        int     (*card_busy)(struct mmc_host *host);

which in case of sdhci-iproc is defined in sdhci.c:

static int sdhci_card_busy(struct mmc_host *mmc)
{
        struct sdhci_host *host = mmc_priv(mmc);
        u32 present_state;

        /* Check whether DAT[0] is 0 */
        present_state = sdhci_readl(host, SDHCI_PRESENT_STATE);

        return !(present_state & SDHCI_DATA_0_LVL_MASK);
}

I am just not sure if that is sufficient to deal with our wifi devices.
Maybe Franky can comment.

Regards,
Arend



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux