X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=conf_files%2Fpl_hwinit;fp=conf_files%2Fpl_hwinit;h=256fe6cb8773cfed7988d8774ff52971df340804;hb=d5019c8cd35d3ec4b5fee35744c8425f12aa7925;hp=0000000000000000000000000000000000000000;hpb=bd0b3cf306759c5aa5e43a88e4f030100dbac496;p=bootcd.git diff --git a/conf_files/pl_hwinit b/conf_files/pl_hwinit new file mode 100755 index 0000000..256fe6c --- /dev/null +++ b/conf_files/pl_hwinit @@ -0,0 +1,142 @@ +#!/bin/sh + +pci_table=/etc/pl_pcitable + +loaded_module_list=/tmp/loadedmodules + +echo "pl_hwinit: loading applicable modules" + +echo > $loaded_module_list + +# this will contain lines of device_id:vendor_id (no 0x) +system_devices=$(lspci -n | cut -d " " -f4) + +for device in $system_devices; do + + # now vendor_id and device_id are broken apart + vendor_id=$(echo $device | cut -d ":" -f1) + device_id=$(echo $device | cut -d ":" -f2) + + # either exactly match vendor:device, or a vendor:ffff (let the module + # figure out if it can be used for this device), or ffff:device + # (not sure if this is legal, but shows up in the pci map) + mods=$(grep -i "\($vendor_id:ffff\|$vendor_id:$device_id\|ffff:$device_id\)" \ + $pci_table | cut -d " " -f1) + + for module in $mods; do + if [ -n "$module" ]; then + echo "pl_hwinit: found and loading module $module" + /sbin/modprobe $module + echo $module >> $loaded_module_list + fi + done +done + +# just in case, look for any modules that are ffff:ffff and load them +mods=$(grep -i "ffff:ffff" $pci_table | cut -d " " -f1) +for module in $mods; do + if [ -n "$module" ]; then + echo "pl_hwinit: found and loading wild module $module" + /sbin/modprobe $module + fi +done + +# sd_mod won't get loaded automatically +echo "pl_hwinit: loading sd_mod" +/sbin/modprobe sd_mod + +# load usb_storage to support node conf files on flash disks +echo "pl_hwinit: loading usb_storage" +/sbin/modprobe usb_storage + +echo "pl_hwinit: loading floppy device driver" +/sbin/modprobe floppy + +# always wait a bit between loading the usb drivers, and checking /sys/ +# for usb devices (this isn't necessarily for waiting for mass storage files, +# that is done below) +echo "pl_hwinit: waiting for usb system to initialize." +/bin/sleep 10s + +# sometimes, flash devices take a while to initialize. in fact, the kernel +# intentionally waits 5 seconds for a device to 'settle'. some take even longer +# to show up. if there are any mass storage devices on the system, try to +# delay until they come online, up to a max delay of 30s. + +# the way this will be done is to look for files in /sys/devices that are named +# 'bInterfaceClass', these will be a list of the usb devices on the system, and +# their primary usb device interface class ids. The base directory these files +# exist in will be the full path to the /sys/device entry for that device. +# for each mass storage devices (they have an interface class value of 08), +# we wait for a new symbolic link named 'driver' to exist in that directory, +# indicating the kernel loaded a driver for that device. + +# usb interface class id for mass storage +INTERFACE_CLASS_MASS_STORAGE="08" + +# how long to wait in seconds before continuing on if devices +# aren't available +MAX_USB_WAIT_TIME=30 + +# low long in seconds to wait between checks +PER_CHECK_USB_WAIT_TIME=5 + + +# find out if the device identified by the /sys dir has a module +# loaded for it. check for a symlink in the dir named driver. +function does_device_dir_have_driver() +{ + if [[ -h "$1/driver" ]]; then + return 1 + else + return 0 + fi +} + +wait_dev_list="" +for interface_class_file in `find /sys/devices -name 'bInterfaceClass'`; do + interface_class=`cat $interface_class_file` + if [[ "$interface_class" == $INTERFACE_CLASS_MASS_STORAGE ]]; then + wait_dev_list="$wait_dev_list "`dirname $interface_class_file` + fi +done + +if [[ -n "$wait_dev_list" ]]; then + echo "pl_hwinit: found USB mass storage device(s). Attempting to wait" + echo "pl_hwinit: up to $MAX_USB_WAIT_TIME seconds for them to come online." + + total_wait_time=0 + success=0 + while [[ $total_wait_time < $MAX_USB_WAIT_TIME ]]; do + + total_wait_time=$(($total_wait_time+$PER_CHECK_USB_WAIT_TIME)) + + echo "pl_hwinit: waiting $PER_CHECK_USB_WAIT_TIME seconds." + /bin/sleep $PER_CHECK_USB_WAIT_TIME + + all_devices_online=1 + for device_dir in $wait_dev_list; do + does_device_dir_have_driver $device_dir + if [[ "$?" -eq 0 ]]; then + all_devices_online=0 + fi + done + + if [[ $all_devices_online -eq 1 ]]; then + success=1 + echo "pl_hwinit: looks like the devices are now online." + break; + else + echo "pl_hwinit: not all devices online yet, waiting..." + fi + done + + if [[ $success -eq 1 ]]; then + echo "pl_hwinit: Succesfully waited for USB mass storage devices" + echo "pl_hwinit: to come online." + else + echo "pl_hwinit: One or more USB mass storage devices did not" + echo "pl_hwinit: initialize in time. Continuing anyway." + fi +fi +