| #! /bin/sh |
| # |
| # Laptop mode tools module: usb-autosuspend. |
| # |
| |
| blacklisted() { |
| for usbid in $AUTOSUSPEND_USBID_BLACKLIST; do |
| if ! echo $usbid | grep -q ':'; then |
| log "MSG" "WARNING: Invalid entry \"$usbid\" in AUTOSUSPEND_USBID_BLACKLIST." |
| fi |
| vendor=$(echo $usbid | cut -d: -f1) |
| product=$(echo $usbid | cut -d: -f2) |
| grep -qi $vendor $1/idVendor 2>/dev/null\ |
| && grep -qi $product $1/idProduct 2>/dev/null\ |
| && return 0 |
| done |
| return 1 |
| } |
| |
| # Check whether the USB driver type is blacklisted |
| blacklisted_by_type() { |
| device=$1 |
| device_base=`basename $device` |
| for driver_type in $AUTOSUSPEND_USBTYPE_BLACKLIST; do |
| if grep -q DRIVER=$driver_type $device/uevent; then |
| return 0 |
| fi |
| # Check child devices as well. The actual driver type is |
| # listed in a child device, not the top-level device. |
| for subdevice in $device/$device_base*; do |
| if [ -f $subdevice/uevent ]; then |
| if grep -q DRIVER=$driver_type\ |
| $subdevice/uevent; then |
| return 0 |
| fi |
| fi |
| done |
| done |
| return 1 |
| } |
| |
| if [ x$CONTROL_USB_AUTOSUSPEND = x1 ] ; then |
| if [ $ON_AC -eq 1 ]; then |
| if [ "$ACTIVATE" -eq 1 ]; then |
| SUSPEND_USB_DEVICES="$LM_AC_SUSPEND_USB" |
| else |
| SUSPEND_USB_DEVICES="$NOLM_AC_SUSPEND_USB" |
| fi |
| else |
| SUSPEND_USB_DEVICES="$BATT_SUSPEND_USB" |
| fi |
| |
| if [ x$SUSPEND_USB_DEVICES = x1 ]; then |
| if [ -f /sys/module/usbcore/parameters/autosuspend ]; then |
| echo $AUTOSUSPEND_TIMEOUT > /sys/module/usbcore/parameters/autosuspend |
| log "VERBOSE" "Enabling autosuspend mode for USBCORE Controller, with timeout $AUTOSUSPEND_TIMEOUT." |
| else |
| log "VERBOSE" "Not enabling autosuspend mode for USBCORE Controller. Not Supported" |
| fi |
| if [ -d /sys/bus/usb/devices ]; then |
| for usb_device in /sys/bus/usb/devices/*; |
| do |
| usb_device=`basename $usb_device`; |
| if ! blacklisted /sys/bus/usb/devices/$usb_device; then |
| if ! blacklisted_by_type /sys/bus/usb/devices/$usb_device; then |
| if [ -f /sys/bus/usb/devices/$usb_device/power/autosuspend ]; then |
| echo $AUTOSUSPEND_TIMEOUT > /sys/bus/usb/devices/$usb_device/power/autosuspend; |
| log "VERBOSE" "Enabling auto suspend mode for usb device $usb_device." |
| else |
| log "VERBOSE" "Not enabling auto suspend mode for usb device $usb_device" |
| fi |
| |
| if [ -f /sys/bus/usb/devices/$usb_device/power/level ]; then |
| echo "auto" > /sys/bus/usb/devices/$usb_device/power/level; |
| log "VERBOSE" "Enabling auto power level for usb device $usb_device." |
| else |
| log "VERBOSE" "Not enabling auto power level for usb device $usb_device" |
| fi |
| else |
| log "VERBOSE" "Device $usb_device has blacklisted driver type, skipping auto suspend." |
| fi |
| else |
| log "VERBOSE" "USB device $usbid is in the autosuspend blacklist." |
| fi |
| done |
| else |
| # This will rarely happen. |
| log "VERBOSE" "There are no USB devices." |
| fi |
| else |
| AUTOSUSPEND_TIMEOUT=0 |
| if [ -f /sys/module/usbcore/parameters/autosuspend ]; then |
| echo $AUTOSUSPEND_TIMEOUT > /sys/module/usbcore/parameters/autosuspend |
| log "VERBOSE" "Disabling autosuspend mode for USBCORE Controller, with timeout $AUTOSUSPEND_TIMEOUT." |
| else |
| log "VERBOSE" "Not disabling autosuspend mode for USBCORE Controller. Not Supported" |
| fi |
| if [ -d /sys/bus/usb/devices ]; then |
| for usb_device in /sys/bus/usb/devices/*; |
| do |
| usb_device=`basename $usb_device`; |
| if [ -f /sys/bus/usb/devices/$usb_device/power/autosuspend ]; then |
| echo $AUTOSUSPEND_TIMEOUT > /sys/bus/usb/devices/$usb_device/power/autosuspend; |
| log "VERBOSE" "Disabling auto suspend mode for usb device $usb_device." |
| else |
| log "VERBOSE" "Not disabling auto suspend mode for usb device $usb_device" |
| fi |
| |
| if [ -f /sys/bus/usb/devices/$usb_device/power/level ]; then |
| echo "on" > /sys/bus/usb/devices/$usb_device/power/level; |
| log "VERBOSE" "Enabling ON power level for usb device $usb_device." |
| else |
| log "VERBOSE" "Not enabling ON power level for usb device $usb_device" |
| fi |
| done |
| else |
| # This will rarely happen. |
| log "VERBOSE" "There are no USB devices." |
| fi |
| fi |
| else |
| log "VERBOSE" "USB autosuspend is disabled." |
| fi |
| |