From 12f6c7676589f08298cf183e5555fce75ea2ea32 Mon Sep 17 00:00:00 2001 From: Aaron Klingaman Date: Fri, 27 May 2005 18:06:56 +0000 Subject: [PATCH] - move flash device delay from pl_netinit to pl_hwinit - rather than just wait for a blind 15seconds, wait up to 30 seconds checking /sys/devices to see if drivers are loaded for the mass storage devices, checking every 5 seconds - above change requires the find and dirname binaries, which were moved from /usr/bin to /bin (by build.sh) --- build.sh | 4 +++ conf_files/pl_hwinit | 82 +++++++++++++++++++++++++++++++++++++++++++ conf_files/pl_netinit | 9 ----- 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index ef1ffbd..7f2a1bf 100755 --- a/build.sh +++ b/build.sh @@ -125,6 +125,10 @@ function build_cdroot() KERNEL=$CD_ROOT/boot/vmlinuz-* mv -f $KERNEL $CD_ROOT/usr/isolinux/kernel + echo "moving /usr/bin/find and /usr/bin/dirname to /bin" + mv $CD_ROOT/usr/bin/find $CD_ROOT/bin/ + mv $CD_ROOT/usr/bin/dirname $CD_ROOT/bin/ + echo "creating version files" echo "$FULL_VERSION_STRING" > $CD_ROOT/usr/isolinux/pl_version echo "$FULL_VERSION_STRING" > $CD_ROOT/pl_version diff --git a/conf_files/pl_hwinit b/conf_files/pl_hwinit index 0073390..8d67970 100755 --- a/conf_files/pl_hwinit +++ b/conf_files/pl_hwinit @@ -49,5 +49,87 @@ echo "pl_hwinit: loading sd_mod" echo "pl_hwinit: loading usb_storage" /sbin/modprobe usb_storage +# 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 `/bin/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 "`/bin/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." + 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 + echo "pl_hwinit: loading floppy device driver" /sbin/modprobe floppy diff --git a/conf_files/pl_netinit b/conf_files/pl_netinit index b1f9abf..a627bd2 100644 --- a/conf_files/pl_netinit +++ b/conf_files/pl_netinit @@ -54,9 +54,6 @@ IFCONFIG_OUTPUT=/tmp/ifconfig # (no other configuration file found) DEFAULT_NET_CONF=0 -# amount of time to delay before we check flash devices -FLASH_DEVICE_DELAY=25s - net_init_failed() { @@ -128,12 +125,6 @@ find_node_config() echo "pl_netinit: looking for node configuration file on flash based devices" - echo "pl_netinit: waiting for flash devices if any to come online" - # some usb flash based devices take a couple of seconds to initialize - # also, try to read the partition table off the device to make sure - # it shows up in /sys/block - /bin/sleep $FLASH_DEVICE_DELAY - # make the sd* expansion fail to an empty string if there are no sd # devices shopt -s nullglob -- 2.43.0