# 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
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