]> Zhao Yanbai Git Server - minix.git/commitdiff
etc/rc: auto-start PnP ethernet drivers 84/3484/2
authorDavid van Moolenbroek <david@minix3.org>
Mon, 20 Feb 2017 14:06:59 +0000 (14:06 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Sun, 30 Apr 2017 13:16:13 +0000 (13:16 +0000)
Change-Id: I0f6c955511cbb04d47093de28109b5084609856a

etc/usr/rc

index ab2b18bd7a9a2e0f3e526004df8acac027cd23d6..9c375d326e4149f22830d4fb620e5aa1856aa683 100644 (file)
@@ -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.