2011-06-21 01:21:58

by Peter Hsiang

[permalink] [raw]
Subject: Getting request_firmware() filename info from user space

Hi,

Using the kernel request_firmware() function, it seems one can send any file by:
cat myfile.bin > /sys/class/firmware/xxxx/data

How does the user space code obtain the filename parameter specified in the request_firmware() call?

The documentation says $DEVPATH and $FIRMWARE variables are provided in
the environment, but "echo $FIRMWARE" prints an empty string.

I loaded the driver with an & just so I can get the shell prompt back to start the sysfs script.
How would one load the driver and run the sysfs script to send the file from the same shell?

Thanks,

Peter


2011-06-21 07:55:36

by Clemens Ladisch

[permalink] [raw]
Subject: Re: Getting request_firmware() filename info from user space

Peter Hsiang wrote:
> Using the kernel request_firmware() function, it seems one can send any file by:
> cat myfile.bin > /sys/class/firmware/xxxx/data
>
> How does the user space code obtain the filename parameter specified in the request_firmware() call?
>
> The documentation says $DEVPATH and $FIRMWARE variables are provided in
> the environment, but "echo $FIRMWARE" prints an empty string.

drivers/base/firmware_class.c has:

static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct firmware_priv *fw_priv = to_firmware_priv(dev);

if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->fw_id))
return -ENOMEM;
if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout))
return -ENOMEM;
if (add_uevent_var(env, "ASYNC=%d", fw_priv->nowait))
return -ENOMEM;

return 0;
}

Are these available at least in the udev rule?


Regards,
Clemens