]>
Commit | Line | Data |
---|---|---|
fb9e3ed2 | 1 | #!/bin/sh |
c34c6a69 | 2 | SATA_RCSID='$Revision$ $Date:: $' |
05c474b5 | 3 | |
fb9e3ed2 | 4 | # geninitrd mod: sata |
5 | ||
8b2e8710 ER |
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 | ||
13639229 ER |
18 | # private until only mod-sata uses the function |
19 | find_modules_by_class() { | |
d3610c6f | 20 | local req_class=$1 |
13639229 | 21 | |
13639229 ER |
22 | # no pcimap, nothing to lookup from |
23 | if [ ! -f "$pcimap" ]; then | |
24 | return | |
25 | fi | |
fb9e3ed2 | 26 | |
8b2e8710 | 27 | if [ -z "$lspci" ]; then |
79348345 | 28 | return |
29 | fi | |
fb9e3ed2 | 30 | |
d3610c6f | 31 | set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}') |
52042665 | 32 | |
5dc8215f | 33 | local PCI_ANY_ID=0x0000ffff pci_module vendor device subvendor subdevice class class_mask driver_data |
52042665 | 34 | while read pci_module vendor device subvendor subdevice class class_mask driver_data; do |
d3610c6f AM |
35 | # match class |
36 | [ "$(($req_class & $class_mask))" = "$class" ] || continue | |
5dc8215f | 37 | # match vendor |
52042665 | 38 | [ "$1" = "$vendor" ] || continue |
5dc8215f ER |
39 | # match device, allow PCI_ANY_ID |
40 | [ "$2" = "$device" -o $device = $PCI_ANY_ID ] || continue | |
52042665 ER |
41 | |
42 | echo "$pci_module" | |
43 | done < $pcimap | |
13639229 ER |
44 | } |
45 | ||
46 | find_modules_sata() { | |
47 | debug "Finding SATA modules (class=0x0106)" | |
48 | ||
fb9e3ed2 | 49 | # Classes (we want only 0106) |
13639229 ER |
50 | # http://pci-ids.ucw.cz/read/PD/01 |
51 | # 0100 - SCSI | |
fb9e3ed2 | 52 | # 0101 - IDE/PATA |
53 | # 0106 - SATA/AHCI | |
54 | # 0107 - SAS | |
8b2e8710 ER |
55 | local m modules=$(find_modules_by_class 0106) |
56 | ||
944bba65 ER |
57 | # sort modules that ones who depend on libata are first |
58 | # this is best we could think of now :) | |
59 | local left right | |
8b2e8710 | 60 | for m in $modules; do |
944bba65 ER |
61 | if NEW_MODINFO=1 modinfo -k $kernel -F depends $m | grep -q libata; then |
62 | left="$left $m" | |
63 | else | |
64 | right="$right $m" | |
65 | fi | |
66 | done | |
67 | ||
68 | for m in $left $right; do | |
8b2e8710 ER |
69 | find_module $m |
70 | done | |
fb9e3ed2 | 71 | } |