Index: mkinitrd.in =================================================================== --- mkinitrd.in (Revision 1794) +++ mkinitrd.in (Arbeitskopie) @@ -39,6 +39,8 @@ MODULES="" PREMODS="" NOSTRIP=false +FIRMWARE_PATH="/lib/firmware" +FIRMWARE_FILES="" [ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd @@ -342,6 +344,21 @@ echo ${UUID} } +add_firmware() +{ + local firmware="$1" + local i + + # check if given firmware is already included in FIRMWARE_FILES + for i in ${FIRMWARE_FILES} + do + [[ ${firmware} = ${i} ]] && return 0 + done + + # include firmware + FIRMWARE_FILES="${FIRMWARE_FILES} ${firmware}" +} + # need r00t privs [[ $(id -u) != 0 ]] && die "you must be r00t." @@ -816,6 +833,21 @@ add_initrd "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" done fi + + # get firmware files if neccessary + if [ -x $(which modinfo 2> /dev/null) ] + then + firmware_blobs=$(modinfo ${module}${text} | grep 'firmware:' | sed 's:^firmware\:.*[[:space:]]\(.*\):\1:') + if [[ ! -z ${firmware_blobs} ]] + then + for firmware in ${firmware_blobs} + do + add_firmware "${firmware}" + done + fi + else + echo "Warning 'modinfo' not found" + fi done # respect rootdelay kernel param @@ -916,6 +948,20 @@ fi done +# install firmware if neccessary +if [[ ! -z ${FIRMWARE_FILES} ]] +then + for firmware in ${FIRMWARE_FILES} + do + if [ -e ${FIRMWARE_PATH}/${firmware} ] + then + echo "installing firmware '${firmware}'" + install ${verbose} -d ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die + cp ${verbose} -a ${FIRMWARE_PATH}/${firmware} ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die + fi + done +fi + # create the image echo "Creating initrd image '${target}' ..." if [[ ${IMAGE_TYPE} = initramfs ]] Index: livecd/mkinitrd-livecd.in =================================================================== --- livecd/mkinitrd-livecd.in (Revision 1538) +++ livecd/mkinitrd-livecd.in (Arbeitskopie) @@ -48,6 +48,8 @@ MODULES_SATA="${LIBDIR}/mkinitrd/modules.sata" MODULES_PATA="${LIBDIR}/mkinitrd/modules.pata" MODULES_FRAMEBUFFER="${LIBDIR}/mkinitrd/modules.framebuffer" +FIRMWARE_PATH="/lib/firmware" +FIRMWARE_FILES="" compress=1 allowmissing="" @@ -254,12 +256,57 @@ modname="${modname/${i}/}" done echo "${modname}" >> ${DEST}/etc/$(basename ${list}) || die + + # get and install firmware files if neccessary + if [ -x $(which modinfo 2> /dev/null) ] + then + local firmware_blobs + local firmware + module=$(echo ${MODULE} | sed "s|.*/||" | sed -e "s/.k\?o.\?g\?z\?$//" -e "s/.gz//") + firmware_blobs=$(modinfo ${module} | grep 'firmware:' | sed 's:^firmware\:.*[[:space:]]\(.*\):\1:') + if [[ ! -z ${firmware_blobs} ]] + then + for firmware in ${firmware_blobs} + do + add_firmware "${firmware}" + done + fi + if [[ ! -z ${FIRMWARE_FILES} ]] + then + for firmware in ${FIRMWARE_FILES} + do + if [ -e ${FIRMWARE_PATH}/${firmware} ] + then + echo "installing firmware '${firmware}'" + install ${verbose} -d ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die + cp ${verbose} -a ${FIRMWARE_PATH}/${firmware} ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die + fi + done + fi + else + echo "Warning 'modinfo' not found" + fi done export ALL_MODULES="${ALL_MODULES} ${MODULES}" unset MODULES } +add_firmware() +{ + local firmware="$1" + local i + + # check if given firmware is already included in FIRMWARE_FILES + for i in ${FIRMWARE_FILES} + do + [[ ${firmware} = ${i} ]] && return 0 + done + + # include firmware + FIRMWARE_FILES="${FIRMWARE_FILES} ${firmware}" +} + # need r00t privs [[ $(id -u) != 0 ]] && die "you must be r00t."