Hi folks, I'm looking into using request_firmware()/udev to get firmware into a couple of device drivers i'm writing, but I want to be able to provide absolute paths for the firmware file and have firmware.sh honor it. The drivers are for a family of FPGA-based cards, mostly PCI. We're using the cards for motion control of machine tools and other robots, see <http://www.linuxcnc.org>. Anyway, the drivers and the firmware are distributed together. A common use case for many of our developers and some of our users is to check out the source code, maybe hack on it some, build it, and run it out of the sandbox (without installing). The problem is that udev can't find the firmwares in peoples home directories. My proposal is to have the driver accept a modparam giving the absolute path to the firmware file the user wants, and have the firmware.sh helper read it from there, bypassing the normal firmware search path. In the other use case, when the software is installed properly, the modparam can be skipped and the driver will request default firmware using relative paths (and udev will find the firmware in /lib/firmware). I've attached a patch against udev.git showing what I mean. Comments? -- Sebastian Kuzminsky "The brain is [a machine]. The fact that it's made out of meat is a red herring." -- David Adler <http://www.spectrum.ieee.org/print/6268>
diff --git a/extras/firmware/firmware.sh b/extras/firmware/firmware.sh index b89b428..3d9cc61 100755 --- a/extras/firmware/firmware.sh +++ b/extras/firmware/firmware.sh @@ -9,0 +10,9 @@ err() { +try_firmware() { + FILE=$1 + [ -e "$FILE" ] || return 0 + echo 1 > /sys$DEVPATH/loading + cat "$FILE" > /sys$DEVPATH/data + echo 0 > /sys$DEVPATH/loading + exit 0 +} + @@ -15,7 +24,9 @@ fi -for DIR in $FIRMWARE_DIRS; do - [ -e "$DIR/$FIRMWARE" ] || continue - echo 1 > /sys$DEVPATH/loading - cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data - echo 0 > /sys$DEVPATH/loading - exit 0 -done +if [ $(echo $FIRMWARE | cut -b 1) = "/" ]; then + # absolute path + try_firmware $FIRMWARE +else + # relative path, search the FIRMWARE_DIRS + for DIR in $FIRMWARE_DIRS; do + try_firmware $DIR/$FIRMWARE + done +fi