]> git.pld-linux.org Git - projects/geninitrd.git/blobdiff - mod-sata.sh
Fix PCI_ANY_ID (it is 0xffffffff (~0) and not 0x0000ffff).
[projects/geninitrd.git] / mod-sata.sh
index ed1a4ee311db0c5dacb05896f011fb6d51562597..f864034d9edf043eaf5f79df8d4b1fdbf2b9aac2 100644 (file)
@@ -17,7 +17,7 @@ setup_mod_sata() {
 
 # private until only mod-sata uses the function
 find_modules_by_class() {
-       local req_class=$1
+       local req_class="$1"
 
        # no pcimap, nothing to lookup from
        if [ ! -f "$pcimap" ]; then
@@ -30,14 +30,19 @@ find_modules_by_class() {
 
        set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}')
 
-       local PCI_ANY_ID=0x0000ffff pci_module vendor device subvendor subdevice class class_mask driver_data
+       req_class="0x${req_class}00"
+
+       local PCI_ANY_ID=0xffffffff pci_module vendor device subvendor subdevice class class_mask driver_data
        while read pci_module vendor device subvendor subdevice class class_mask driver_data; do
-               # match class
-               [ "$(($req_class & $class_mask))" = "$(($class))" ] || continue
+               # ignore program interface (last two digits) - we want any
+               class_mask=$(($class_mask & 0xffffff00))
+               # some devices (like hcd) have very specific class
+               class=$(($class & $class_mask))
+               [ "$(($req_class & $class_mask))" = "$class" ] || continue
                # match vendor
-               [ "$1" = "$vendor" ] || continue
+               [ "$1" = "$vendor" -o "$vendor" = "$PCI_ANY_ID" ] || continue
                # match device, allow PCI_ANY_ID
-               [ "$2" = "$device" -o $device = $PCI_ANY_ID ] || continue
+               [ "$2" = "$device" -o "$device" = "$PCI_ANY_ID" ] || continue
 
                echo "$pci_module"
        done < $pcimap
This page took 0.025718 seconds and 4 git commands to generate.