]> git.pld-linux.org Git - projects/geninitrd.git/blob - mod-sata.sh
Fix PCI_ANY_ID (it is 0xffffffff (~0) and not 0x0000ffff).
[projects/geninitrd.git] / mod-sata.sh
1 #!/bin/sh
2 SATA_RCSID='$Revision$ $Date::                            $'
3
4 # geninitrd mod: sata
5
6 # setup geninitrd module
7 # @access       public
8 setup_mod_sata() {
9         lspci=$(find_tool /sbin/lspci)
10
11         pcimap="/lib/modules/$kernel/modules.pcimap"
12
13         if [ ! -x "$lspci" ]; then
14                 warn "Failed to execute lspci. Is pciutils package installed?"
15         fi
16 }
17
18 # private until only mod-sata uses the function
19 find_modules_by_class() {
20         local req_class="$1"
21
22         # no pcimap, nothing to lookup from
23         if [ ! -f "$pcimap" ]; then
24                 return
25         fi
26
27         if [ -z "$lspci" ]; then
28                 return
29         fi
30
31         set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}')
32
33         req_class="0x${req_class}00"
34
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
42                 # match vendor
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
46
47                 echo "$pci_module"
48         done < $pcimap
49 }
50
51 find_modules_sata() {
52         debug "Finding SATA modules (class=0x0106)"
53
54         # Classes (we want only 0106)
55         # http://pci-ids.ucw.cz/read/PD/01
56         # 0100 - SCSI
57         # 0101 - IDE/PATA
58         # 0106 - SATA/AHCI
59         # 0107 - SAS
60         local m modules=$(find_modules_by_class 0106)
61
62         # sort modules that ones who depend on libata are first
63         # this is best we could think of now :)
64         local left right
65         for m in $modules; do
66                 if NEW_MODINFO=1 modinfo -k $kernel -F depends $m | grep -q libata; then
67                         left="$left $m"
68                 else
69                         right="$right $m"
70                 fi
71         done
72
73         for m in $left $right; do
74                 find_module $m
75         done
76 }
This page took 0.031005 seconds and 4 git commands to generate.