blob: a4046ab9b5d9f60e770e504415b105eccd7d3ded [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
description "Preload network drivers"
author "chromium-os-dev@chromium.org"
# Run on boot-services; "stay running" until the udev-trigger completes
# (which is guaranteed to happen after boot-services)
start on starting boot-services
stop on stopped udev-trigger
env drvfile=/var/lib/preload-network-drivers
pre-start script
# If the drivers for Ethernet or WiFi devices are modules, our post-stop
# script will have recorded the driver names on the previous boot cycle.
# Load those drivers now so shill can config the network sooner,
# ideally by the time login screen is up.
#
# Note: failure to probe the module here is NOT fatal.
if [ -s $drvfile ] ; then
for drv in $(head -1 $drvfile); do
if ! modprobe "$drv" >/dev/null 2>&1 ; then
# If modprobe didn't like the alias file for some reason, just
# move it out of the way. The post-stop script will make a new
# one.
mv $drvfile $drvfile.bad
logger -t "$UPSTART_JOB" \
"modprobe $drv failed. Renamed $drvfile with .bad suffix."
fi
done
fi
end script
post-stop script
# Create/Update driver names for the Ethernet and WiFi drivers.
# Used to preload Ethernet and WiFi drivers in pre-start script.
# TODO(ggg): can shill share the "user selected" network device?
newdrv=''
for dev in eth0 wlan0 mlan0; do
# Get the module name
mod_link="/sys/class/net/${dev}/device/driver/module"
if [ -e "$mod_link" ]; then
drvmod=$(basename $(readlink "$mod_link"))
else
continue
fi
if [ -n "$newdrv" ] ; then
newdrv="$drvmod $newdrv"
else
newdrv="$drvmod"
fi
done
if [ -s $drvfile ] ; then
olddrv=$(head -1 $drvfile)
fi
# Only update contents if they've changed.
if [ "$newdrv" != "$olddrv" ] ; then
echo "$newdrv" > $drvfile
fi
end script