diff options
Diffstat (limited to 'packages/pvrusb2-mci')
-rw-r--r-- | packages/pvrusb2-mci/files/.mtn2git_empty | 0 | ||||
-rwxr-xr-x | packages/pvrusb2-mci/files/firmware.hotplug | 61 | ||||
-rwxr-xr-x | packages/pvrusb2-mci/files/hotplug.functions | 193 |
3 files changed, 254 insertions, 0 deletions
diff --git a/packages/pvrusb2-mci/files/.mtn2git_empty b/packages/pvrusb2-mci/files/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/pvrusb2-mci/files/.mtn2git_empty diff --git a/packages/pvrusb2-mci/files/firmware.hotplug b/packages/pvrusb2-mci/files/firmware.hotplug new file mode 100755 index 0000000000..40673a7b74 --- /dev/null +++ b/packages/pvrusb2-mci/files/firmware.hotplug @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Firmware-specific hotplug policy agent. +# +# Kernel firmware hotplug params include: +# +# ACTION=%s [add or remove] +# DEVPATH=%s [in 2.5 kernels, /sys/$DEVPATH] +# FIRMWARE=%s +# +# HISTORY: +# +# 24-Jul-2003 Initial version of "new" hotplug agent. +# +# $Id: firmware.agent,v 1.3 2004/03/14 15:52:56 ukai Exp $ +# + +cd /etc/hotplug.d/firmware +. ./hotplug.functions +# DEBUG=yes export DEBUG + +# directory of the firmware files +FIRMWARE_DIR=/lib/firmware + +# mountpoint of sysfs +SYSFS=$(sed -n 's/^.* \([^ ]*\) sysfs .*$/\1/p' /proc/mounts) + +# use /proc for 2.4 kernels +if [ "$SYSFS" = "" ]; then + SYSFS=/proc +fi + +# +# What to do with this firmware hotplug event? +# +case "$ACTION" in + +add) + if [ ! -e $SYSFS/$DEVPATH/loading ]; then + sleep 1 + fi + + if [ -f "$FIRMWARE_DIR/$FIRMWARE" ]; then + echo 1 > $SYSFS/$DEVPATH/loading + cp "$FIRMWARE_DIR/$FIRMWARE" $SYSFS/$DEVPATH/data + echo 0 > $SYSFS/$DEVPATH/loading + else + echo -1 > $SYSFS/$DEVPATH/loading + fi + + ;; + +remove) + ;; + +*) + mesg "Firmware '$ACTION' event not supported" + exit 1 + ;; + +esac diff --git a/packages/pvrusb2-mci/files/hotplug.functions b/packages/pvrusb2-mci/files/hotplug.functions new file mode 100755 index 0000000000..e3cc7e6e7a --- /dev/null +++ b/packages/pvrusb2-mci/files/hotplug.functions @@ -0,0 +1,193 @@ +# +# Setup and BASH utility functions for use in hotplug agents +# +# Most essential parameters are passed from the kernel using +# environment variables. For more information, see the docs +# on-line at http://linux-hotplug.sourceforge.net or the +# sources for each hotplug-aware kernel subsystem. +# +# $Id: hotplug.functions,v 1.26 2004/04/01 07:33:32 kroah Exp $ +# +# + +# DEBUG=yes; export DEBUG +PATH=/bin:/sbin:/usr/sbin:/usr/bin + +KERNEL=`uname -r` +MODULE_DIR=/lib/modules/$KERNEL + +HOTPLUG_DIR=/etc/hotplug + +if [ -f /etc/sysconfig/hotplug ]; then + . /etc/sysconfig/hotplug +fi + +if [ -x /usr/bin/logger ]; then + LOGGER=/usr/bin/logger +elif [ -x /bin/logger ]; then + LOGGER=/bin/logger +else + unset LOGGER +fi +# +# for diagnostics +# +if [ -t 1 -o -z "$LOGGER" ]; then + mesg () { + echo "$@" + } +else + mesg () { + $LOGGER -t $(basename $0)"[$$]" "$@" + } +fi + +debug_mesg () { + test "$DEBUG" = "" -o "$DEBUG" = no && return + mesg "$@" +} + + +# +# Not "modprobe --autoclean" ... one driver module can handle many +# devices. Unloading should be done when no devices are present. +# Autocleaning happens if none of the devices are open, once any of +# them gets opened; wrong timing. +# +MODPROBE="/sbin/modprobe -s -q" +#MODPROBE="/sbin/modprobe -vs" + + +#################################################################### +# +# usage: load_driver type filename description +# +# modprobes driver module(s) if appropriate, and optionally +# invokes a driver-specific setup script (or user-mode driver). +# +# the "modules.*map" format file is guaranteed to exist +# +load_drivers () +{ + local LOADED TYPE FILENAME DESCRIPTION LISTER + DRIVERS="" + + # make this routine more readable + TYPE=$1 + FILENAME=$2 + DESCRIPTION=$3 + + # should we use usbmodules, pcimodules? not on 2.5+, because sysfs + # ought to expose the data we need to find all candidate drivers. + # (on 2.5.48 it does for usb; but maybe not yet for pci.) + case "$KERNEL" in + 2.2*|2.3*|2.4*) LISTER=`which ${TYPE}modules` ;; + *) LISTER="" ;; + esac + + if [ "$LISTER" != "" ]; then + # lister programs MIGHT be preferable to parsing from shell scripts: + # - usbmodules used for (a) multi-interface devices, (b) coldplug + # - pcimodules used only for coldplug + case $TYPE in + usb) + # "usbutils-0.8" (or later) is needed in $PATH + # only works if we have usbfs + # ... reads more descriptors than are passed in env + # ... doesn't handle comment syntax either + if [ "$DEVICE" = "" -o ! -f "$DEVICE" ]; then + LISTER= + else + DRIVERS=`$LISTER --mapfile $FILENAME --device $DEVICE` + fi ;; + + pci) + debug_mesg "pcimodules is scanning more than $PCI_SLOT ..." + DRIVERS=`$LISTER` + ;; + esac + fi + + # try parsing by shell scripts if no luck yet + if [ "$DRIVERS" = "" ]; then + ${TYPE}_map_modules < $FILENAME + fi + + # FIXME remove dups and blacklisted modules from $DRIVERS here + + if [ "$DRIVERS" = "" ]; then + return + fi + + # Note that DRIVERS aren't all going to be modules. + # For USB, some user-mode drivers or setup scripts may be listed. + debug_mesg Setup $DRIVERS for $DESCRIPTION + + # either kernel or user mode drivers may need to be set up + for MODULE in $DRIVERS + do + # maybe driver modules need loading + LOADED=false + if ! lsmod | grep -q "^$(echo $MODULE|sed -e 's/-/_/g') " > /dev/null 2>&1; then + if grep -q "^$MODULE\$" $HOTPLUG_DIR/blacklist \ + >/dev/null 2>&1; then + debug_mesg "... blacklisted module: $MODULE" + continue + fi + + # statically linked modules aren't shown by 'lsmod', + # and user mode drivers will ONLY have a setup script; + # it's not an error if a module doesn't exist or won't load. + if $MODPROBE -n $MODULE >/dev/null 2>&1 && + ! $MODPROBE $MODULE >/dev/null 2>&1 ; then + mesg "... can't load module $MODULE" + else + # /etc/modules.conf may have set non-default module + # parameters ... handle per-device parameters in apps + # (ioctls etc) not in setup scripts or modules.conf + LOADED=true + fi + else + # This module is already loaded + LOADED=true + fi + + # always run setup scripts after any matching kernel code has had + # a chance to do its thing, no matter whether it was dynamically + # or statically linked, or if there is only a user mode driver. + # the script might re-enumerate usb devices after firmware download, + # giving kernel code another chance. + if [ -x $HOTPLUG_DIR/$TYPE/$MODULE ]; then + debug_mesg Module setup $MODULE for $DESCRIPTION + $HOTPLUG_DIR/$TYPE/$MODULE + LOADED=true + fi + + if [ "$LOADED" = "false" ]; then + mesg "missing kernel or user mode driver $MODULE " + fi + if echo "$MODULE" | grep -q "usb-storage" > /dev/null 2>&1 ; then + [ -x /usr/sbin/updfstab ] && /usr/sbin/updfstab + fi + done +} + +#################################################################### +# +# usage: log_to_stdout filename +# +# writes a copy of the current hotplug event to stdout. +# add buffering, to avoid interleaving reports! +# +log_to_stdout () +{ + if [ -x /bin/date ]; then + echo "HOTPLUG_TIME='$(/bin/date)'" + fi + + env | egrep -v '^PATH=|^PWD=|^_=|^OLDPWD=|^SHLVL=|^HOME=' + echo '' + # empty line terminates events +} + +# vim:syntax=sh |