public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* in-kernel drivers and firmware loader
@ 2012-05-11 10:55 Arend van Spriel
  2012-05-11 11:03 ` Kay Sievers
  0 siblings, 1 reply; 5+ messages in thread
From: Arend van Spriel @ 2012-05-11 10:55 UTC (permalink / raw)
  To: Kay Sievers, linux-wireless@vger.kernel.org,
	linux-kernel@vger.kernel.org

Hi Kay,

To my memory (which fails from time to time) you posted a message on
using the asynchronous API for firmware loading as some drivers were
blocking on it in the module initialization. So for our driver we
decoupled the initialization from probe and subsequently the firmware
request. Assuming this solves the udev issue, but I am currently looking
into a somewhat related issue with our driver built-in.

I am testing on a PandaBoard which boots a linux kernel without a initrd
and our device is detected before the root filesystem is mounted. I was
expecting the async firmware request to get called back immediatly with
firmware pointer being NULL. The behaviour is slightly different as this
callback is coming after 60 seconds, which is the timeout. I guess the
uevent just gets lost without the kernel knowing it. Is that correct?

Gr. AvS


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: in-kernel drivers and firmware loader
  2012-05-11 10:55 in-kernel drivers and firmware loader Arend van Spriel
@ 2012-05-11 11:03 ` Kay Sievers
  2012-05-11 11:09   ` Johannes Berg
  2012-05-11 12:16   ` Arend van Spriel
  0 siblings, 2 replies; 5+ messages in thread
From: Kay Sievers @ 2012-05-11 11:03 UTC (permalink / raw)
  To: Arend van Spriel
  Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org

On Fri, May 11, 2012 at 12:55 PM, Arend van Spriel <arend@broadcom.com> wrote:
> To my memory (which fails from time to time) you posted a message on
> using the asynchronous API for firmware loading as some drivers were
> blocking on it in the module initialization. So for our driver we
> decoupled the initialization from probe and subsequently the firmware
> request. Assuming this solves the udev issue, but I am currently looking
> into a somewhat related issue with our driver built-in.
>
> I am testing on a PandaBoard which boots a linux kernel without a initrd
> and our device is detected before the root filesystem is mounted. I was
> expecting the async firmware request to get called back immediatly with
> firmware pointer being NULL. The behaviour is slightly different as this
> callback is coming after 60 seconds, which is the timeout. I guess the
> uevent just gets lost without the kernel knowing it. Is that correct?

It's probably sent, but nothing see it because there is no userspace
that would have subscribed.

If udev is started later during bootup, and the coldplug triggers all
events again, the firmware request should be found and be fulfilled by
userspace -- at least that's the theory.

Can you reach the box with a login before the 60 seconds are reached?

Do you see a firmware request (directory) still hanging around in
/sys/class/firmware/ ?

Kay

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: in-kernel drivers and firmware loader
  2012-05-11 11:03 ` Kay Sievers
@ 2012-05-11 11:09   ` Johannes Berg
  2012-05-11 12:16   ` Arend van Spriel
  1 sibling, 0 replies; 5+ messages in thread
From: Johannes Berg @ 2012-05-11 11:09 UTC (permalink / raw)
  To: Kay Sievers
  Cc: Arend van Spriel, linux-wireless@vger.kernel.org,
	linux-kernel@vger.kernel.org

On Fri, 2012-05-11 at 13:03 +0200, Kay Sievers wrote:

> > I am testing on a PandaBoard which boots a linux kernel without a initrd
> > and our device is detected before the root filesystem is mounted. I was
> > expecting the async firmware request to get called back immediatly with
> > firmware pointer being NULL. The behaviour is slightly different as this
> > callback is coming after 60 seconds, which is the timeout. I guess the
> > uevent just gets lost without the kernel knowing it. Is that correct?
> 
> It's probably sent, but nothing see it because there is no userspace
> that would have subscribed.
> 
> If udev is started later during bootup, and the coldplug triggers all
> events again, the firmware request should be found and be fulfilled by
> userspace -- at least that's the theory.

I haven't really read all of the message, but we've also had users who
observed in some cases that the coldplug doesn't properly trigger
firmware load requests. Unfortunately, I don't have any details.

johannes


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: in-kernel drivers and firmware loader
  2012-05-11 11:03 ` Kay Sievers
  2012-05-11 11:09   ` Johannes Berg
@ 2012-05-11 12:16   ` Arend van Spriel
  2012-05-11 12:38     ` Kay Sievers
  1 sibling, 1 reply; 5+ messages in thread
From: Arend van Spriel @ 2012-05-11 12:16 UTC (permalink / raw)
  To: Kay Sievers; +Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org

On 05/11/2012 01:03 PM, Kay Sievers wrote:
> On Fri, May 11, 2012 at 12:55 PM, Arend van Spriel <arend@broadcom.com> wrote:
>> To my memory (which fails from time to time) you posted a message on
>> using the asynchronous API for firmware loading as some drivers were
>> blocking on it in the module initialization. So for our driver we
>> decoupled the initialization from probe and subsequently the firmware
>> request. Assuming this solves the udev issue, but I am currently looking
>> into a somewhat related issue with our driver built-in.
>>
>> I am testing on a PandaBoard which boots a linux kernel without a initrd
>> and our device is detected before the root filesystem is mounted. I was
>> expecting the async firmware request to get called back immediatly with
>> firmware pointer being NULL. The behaviour is slightly different as this
>> callback is coming after 60 seconds, which is the timeout. I guess the
>> uevent just gets lost without the kernel knowing it. Is that correct?
> 
> It's probably sent, but nothing see it because there is no userspace
> that would have subscribed.
> 
> If udev is started later during bootup, and the coldplug triggers all
> events again, the firmware request should be found and be fulfilled by
> userspace -- at least that's the theory.
> 
> Can you reach the box with a login before the 60 seconds are reached?
> 
> Do you see a firmware request (directory) still hanging around in
> /sys/class/firmware/ ?
> 
> Kay
> 

Thanks, Kay

Here is the

# cd /sys/class/firmware/mmc1\:0001\:2/
# ls
data       device     loading    power      subsystem  uevent
# cat uevent
FIRMWARE=brcm/brcmfmac-sdio.bin
TIMEOUT=60
ASYNC=1
# cat loading
0

Not sure if loading content means anything or it presence is indicating
it is in progress. Below also the dmesg output.

Gr. AvS

[    6.801452] brcmfmac: brcmf_sdbrcm_probe: completed!!
[    6.801483] brcmfmac: brcmf_sdbrcm_probe: request firmware
"brcm/brcmfmac-sdio.bin"
[    6.802703] brcmfmac: brcmf_ops_sdio_probe: Enter
[    6.802703] brcmfmac: brcmf_ops_sdio_probe: func->class=2
[    6.802734] brcmfmac: brcmf_ops_sdio_probe: sdio_vendor: 0x02d0
[    6.802734] brcmfmac: brcmf_ops_sdio_probe: sdio_device: 0x4329
[    6.802734] brcmfmac: brcmf_ops_sdio_probe: Function#: 0x0003
[    6.895507] smsc95xx 1-1.1:1.0: eth0: register 'smsc95xx' at
usb-ehci-omap.0-1.1, smsc95xx USB 2.0 Ethernet, ca:2a:a4:72:d9:6b
[    6.908111] drivers/usb/core/inode.c: creating file '003'
[    6.921234] mmc2: card claims to support voltages below the defined
range. These will be ignored.
[    6.940582] mmc2: queuing unknown CIS tuple 0x91 (3 bytes)
[    6.947418] mmc2: new SDIO card at address 0001
[    7.001281] kjournald starting.  Commit interval 5 seconds
[    7.014190] EXT3-fs (mmcblk0p2): using internal journal
[    7.019714] EXT3-fs (mmcblk0p2): mounted filesystem with ordered data
mode
[    7.027038] VFS: Mounted root (ext3 filesystem) on device 179:2.
[    7.036437] devtmpfs: mounted
[    7.039764] Freeing init memory: 236K
[    8.119812] hub 2-0:1.0: hub_suspend
[    8.120025] usb usb2: bus auto-suspend, wakeup 1
[    8.120056] ohci-omap3 ohci-omap3.0: suspend root hub
[    9.666809] usb 1-1.1: link qh8-0001/ee2cc700 start 2 [1/0 us]
[   11.448059] smsc95xx 1-1.1:1.0: eth0: link up, 100Mbps, full-duplex,
lpa 0xCDE1
[   67.573059] brcmfmac: brcmf_sdbrcm_fw_callback: enter
[   67.573059] brcmfmac: brcmf_sdbrcm_fw_callback: firmware not found
[   67.573059] brcmfmac: brcmf_sdbrcm_release: Enter


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: in-kernel drivers and firmware loader
  2012-05-11 12:16   ` Arend van Spriel
@ 2012-05-11 12:38     ` Kay Sievers
  0 siblings, 0 replies; 5+ messages in thread
From: Kay Sievers @ 2012-05-11 12:38 UTC (permalink / raw)
  To: Arend van Spriel
  Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org

On Fri, May 11, 2012 at 2:16 PM, Arend van Spriel <arend@broadcom.com> wrote:
> On 05/11/2012 01:03 PM, Kay Sievers wrote:

>> It's probably sent, but nothing see it because there is no userspace
>> that would have subscribed.
>>
>> If udev is started later during bootup, and the coldplug triggers all
>> events again, the firmware request should be found and be fulfilled by
>> userspace -- at least that's the theory.
>>
>> Can you reach the box with a login before the 60 seconds are reached?
>>
>> Do you see a firmware request (directory) still hanging around in
>> /sys/class/firmware/ ?

> # cd /sys/class/firmware/mmc1\:0001\:2/
> # ls
> data       device     loading    power      subsystem  uevent
> # cat uevent
> FIRMWARE=brcm/brcmfmac-sdio.bin
> TIMEOUT=60
> ASYNC=1
> # cat loading
> 0
>
> Not sure if loading content means anything or it presence is indicating
> it is in progress. Below also the dmesg output.

Yeah, that looks good. The request is still around and waits for
userspace to get handled.

> [   11.448059] smsc95xx 1-1.1:1.0: eth0: link up, 100Mbps, full-duplex,
> [   67.573059] brcmfmac: brcmf_sdbrcm_fw_callback: enter

Seems userspace is not doing anything here, it's just the kernel
timeout that we run into.

If you can manage to do this before the timeout triggers, it should
show if things *can* work:

Start:
  udevd --daemon
if it's not already running.

Trigger 'fake' events for all devices in the system, so that udev
'thinks' the firmware request just came in:
  udevadm trigger --action=add

Normally, all that should be handled by the base system, and not need
any custom setup.

Kay

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-05-11 12:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-11 10:55 in-kernel drivers and firmware loader Arend van Spriel
2012-05-11 11:03 ` Kay Sievers
2012-05-11 11:09   ` Johannes Berg
2012-05-11 12:16   ` Arend van Spriel
2012-05-11 12:38     ` Kay Sievers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox