]> git.pld-linux.org Git - projects/geninitrd.git/blame - mod-sata.sh
Check class/class_mask when walking over modules.pcimap (fixes a bug where snd-hda...
[projects/geninitrd.git] / mod-sata.sh
CommitLineData
fb9e3ed2 1#!/bin/sh
c34c6a69 2SATA_RCSID='$Revision$ $Date:: $'
05c474b5 3
fb9e3ed2 4# geninitrd mod: sata
5
8b2e8710
ER
6# setup geninitrd module
7# @access public
8setup_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
19find_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
46find_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}
This page took 0.11 seconds and 4 git commands to generate.