#!/bin/sh # # # Copyright (C) 2014 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # # UDEV event helper script that restarts a hung network device. POWER_DOWN_TIME_SECONDS=1 WLAN_POWER_UP_TIME_SECONDS=1 WLAN_REINITIALIZE_TIME_SECONDS=5 set -e error () { logger -t $0 "Error: $1" exit 1 } if [ -n "${1}" ] ; then eval $(udevadm info --query=property --path="/sys/class/net/${1}" | egrep '^(DEVPATH|DEVTYPE|ID_BUS|INTERFACE|SUBSYSTEM)') EVENT=device_hang fi if [ "${SUBSYSTEM}" != "net" -o \ "${EVENT}" != "device_hang" -o \ -z "${DEVPATH}" ] ; then exit 0 fi logger -t $0 "Restarting network interface ${INTERFACE}" # The DEVPATH for a network interface should look something like: # /devices/pci0000:00/0000:00:1c.0/0000:01:00.0/net/wlan0 if [ $(basename $(dirname "${DEVPATH}")) != 'net' ] ; then error "Device path for ${INTERFACE} (${DEVPATH}) is invalid." fi device_path=$(readlink -f "/sys${DEVPATH}/../..") module_name=$(basename $(readlink -f "/sys${DEVPATH}/device/driver/module")) rmmod "${module_name}" if [ "${ID_BUS}" = "pci" ] ; then device_remove_path="${device_path}/remove" bus_rescan_path=$(readlink -f "${device_path}/../rescan") if [ ! -e "${device_remove_path}" ] ; then error "Device remove path ${device_remove_path} does not exist" fi if [ ! -e "${bus_rescan_path}" ] ; then error "Bus rescan path ${bus_rescan_path} does not exist" fi echo 1 > "${device_remove_path}" if [ "${DEVTYPE}" = "wlan" ] ; then ectool wireless 0xe # Disable wireless lan. ectool wireless 0x6 # Power down wireless lan. fi sleep ${POWER_DOWN_TIME_SECONDS} if [ "${DEVTYPE}" = "wlan" ] ; then ectool wireless 0xe # Power up wireless lan. sleep ${WLAN_POWER_UP_TIME_SECONDS} ectool wireless 0xf # Enable wireless lan. sleep ${WLAN_REINITIALIZE_TIME_SECONDS} fi echo 1 > "${bus_rescan_path}" elif [ "${ID_BUS}" = "usb" ] ; then device_authorize_path=$(readlink -f "${device_path}/../authorized") echo 0 > "${device_authorize_path}" sleep ${POWER_DOWN_TIME_SECONDS} echo 1 > "${device_authorize_path}" else error "Bus type ${ID_BUS} is unknown" fi