2 SATA_RCSID='$Revision$ $Date:: $'
6 # setup geninitrd module
9 lspci=$(find_tool /sbin/lspci)
11 pcimap="/lib/modules/$kernel/modules.pcimap"
13 if [ ! -x "$lspci" ]; then
14 warn "Failed to execute lspci. Is pciutils package installed?"
18 # private until only mod-sata uses the function
19 find_modules_by_class() {
22 # no pcimap, nothing to lookup from
23 if [ ! -f "$pcimap" ]; then
27 if [ -z "$lspci" ]; then
31 set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}')
33 req_class="0x${req_class}00"
35 local PCI_ANY_ID=0xffffffff pci_module vendor device subvendor subdevice class class_mask driver_data
36 while read pci_module vendor device subvendor subdevice class class_mask driver_data; do
37 # ignore program interface (last two digits) - we want any
38 class_mask=$(($class_mask & 0xffffff00))
39 # some devices (like hcd) have very specific class
40 class=$(($class & $class_mask))
41 [ "$(($req_class & $class_mask))" = "$class" ] || continue
43 [ "$1" = "$vendor" -o "$vendor" = "$PCI_ANY_ID" ] || continue
44 # match device, allow PCI_ANY_ID
45 [ "$2" = "$device" -o "$device" = "$PCI_ANY_ID" ] || continue
52 debug "Finding SATA modules (class=0x0106)"
54 # Classes (we want only 0106)
55 # http://pci-ids.ucw.cz/read/PD/01
60 local m modules=$(find_modules_by_class 0106)
62 # sort modules that ones who depend on libata are first
63 # this is best we could think of now :)
66 if NEW_MODINFO=1 modinfo -k $kernel -F depends $m | grep -q libata; then
73 for m in $left $right; do