etc/rc: auto-start PnP ethernet drivers
Change-Id: I0f6c955511cbb04d47093de28109b5084609856a
This commit is contained in:
parent
ad920fc485
commit
e4dbab1e53
76
etc/usr/rc
76
etc/usr/rc
@ -103,8 +103,74 @@ up()
|
||||
fi
|
||||
}
|
||||
|
||||
# Print a list of labels of detected PCI ethernet hardware devices.
|
||||
get_pci_eth_labels()
|
||||
{
|
||||
# We need to match all PCI ethernet hardware devices against all
|
||||
# drivers. For performance reasons, we construct a lookup table on the
|
||||
# fly here. In order to do that, we need to give both a list of all
|
||||
# available network drivers with PCI device IDs (part 1 of the code
|
||||
# below) and a list of all actually present ethernet hardware devices
|
||||
# (part 2) to an awk script (part 3). The awk script can tell the
|
||||
# difference between the list entries based on whether there is a
|
||||
# leading space on the line. For part 2, we grab only devices that are
|
||||
# in PCI class 2 (network controller) subclass 0 (ethernet controller).
|
||||
|
||||
# Part 1: collect all network drivers with supported PCI IDs
|
||||
(for dir in $SYSTEM_CONF_DIRS; do
|
||||
for f in $dir/$SYSTEM_CONF_SUBDIR/*; do
|
||||
if [ -f $f ]; then
|
||||
printconfig $f | grep ',type net.*,pci device'
|
||||
fi
|
||||
done
|
||||
done | sed 's/^service \([^,]*\),.*,pci device/ \1/g';
|
||||
# Part 2: grab all PCI IDs of ethernet hardware devices (class 2/0)
|
||||
cat /proc/pci | grep '^[^ ]* 2/0/' | cut -d' ' -f3) | awk '
|
||||
# Part 3: first construct a PCI-ID-to-driver table based on the lines
|
||||
# produced by part 1 (with leading space), which each contain one
|
||||
# driver name followed by one or more PCI IDs; then, go through all
|
||||
# the ethernet hardware devices found in part 2 (no leading space) and
|
||||
# if if there is a hit in the table, print the driver label to use.
|
||||
/^ / { for (i=2;i<=NF;i++) drivers[$(i)]=$1 }
|
||||
/^[^ ]/ {
|
||||
# There is a bit of a discrepancy between output formats of
|
||||
# /proc/pci and printconfig: the former uses
|
||||
# "vid:did:sub_vid:sub_did" whereas the latter uses
|
||||
# "vid:did/sub_vid:sub_did". No problem; in the common case
|
||||
# (= no sub IDs used) we need to split the PCI ID anyway.
|
||||
if (split($1,id,":") >= 4) {
|
||||
# Try a full "vid:did:sub_vid:sub_did" match.
|
||||
name=drivers[id[1]":"id[2]"/"id[3]":"id[4]]
|
||||
}
|
||||
# No sub IDs or no match found? Try a "vid:did" match.
|
||||
if (!name) name=drivers[id[1]":"id[2]]
|
||||
# If found, print the resulting label (<name>_<instance>)
|
||||
if (name) {
|
||||
print name"_"(instance[name]+0)
|
||||
instance[name]++
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
# Print a list of labels of ethernet hardware devices that have been detected
|
||||
# to be present on the system. Each label has the format '<driver>_<instance>'
|
||||
# where <driver> is the file name of the driver (in /service) and <instance> is
|
||||
# a zero-based, per-driver instance number of the device.
|
||||
get_eth_labels() {
|
||||
# Nothing yet.
|
||||
# For now, do autodetection only on platforms with (x86) PCI support.
|
||||
# For (x86) ISA drivers, a custom network setting script is required;
|
||||
# see below. For ARM platforms, the driver (if any) is started based
|
||||
# on the board; there is no device autodetection.
|
||||
if [ -f /proc/pci ]; then
|
||||
get_pci_eth_labels
|
||||
fi
|
||||
|
||||
# Add any network drivers manually configured in /usr/etc/rc.local by
|
||||
# the netconf(8) utility.
|
||||
if [ -n "$netdriver" ]; then
|
||||
echo "${netdriver}_0"
|
||||
fi
|
||||
}
|
||||
|
||||
# Detect expansion boards on the BeagleBone and load the proper drivers.
|
||||
@ -175,7 +241,7 @@ start)
|
||||
date >> /dev/urandom
|
||||
fi
|
||||
|
||||
# start network driver instances for all configured ethernet devices
|
||||
# start network driver instances for all detected ethernet devices
|
||||
for label in $(get_eth_labels); do
|
||||
driver=$(echo $label | sed 's/\(.*\)_.*/\1/')
|
||||
instance=$(echo $label | sed 's/.*_//')
|
||||
@ -250,6 +316,9 @@ start)
|
||||
up tps65217 -label tps65217.1.24 \
|
||||
-args 'bus=1 address=0x24'
|
||||
|
||||
# Start ethernet driver.
|
||||
up lan8710a -label lan8710a_0 -args 'instance=0'
|
||||
|
||||
# check for the presence of a display
|
||||
eepromread -f /dev/i2c-2 -n > /dev/null 2>&1
|
||||
RESULT=$?
|
||||
@ -296,6 +365,9 @@ start)
|
||||
up tda19988 -label tda19988.1.3470 -args \
|
||||
'cec_bus=1 cec_address=0x34 hdmi_bus=1 hdmi_address=0x70'
|
||||
|
||||
# Start ethernet driver.
|
||||
up lan8710a -label lan8710a_0 -args 'instance=0'
|
||||
|
||||
# start frame buffer
|
||||
#up fb -dev /dev/fb0 -args edid.0=tda19988.1.3470
|
||||
# fb hasn't been ported to AM335X yet.
|
||||
|
Loading…
x
Reference in New Issue
Block a user