#!/bin/sh
-#
-# geninitrd mod: sata
-
-# private until only mod-sata uses the function
-find_modules_by_class() {
- local class=$1
-
- local pcimap="/lib/modules/$kernel/modules.pcimap"
- # no pcimap, nothing to lookup from
- if [ ! -f "$pcimap" ]; then
- return
- fi
-
- if [ ! -x /sbin/lspci ]; then
- warn "Failed to execute /sbin/lspci. Is pciutils package installed?"
- return
- fi
+SATA_RCSID='$Revision$ $Date:: $'
- set -- $(/sbin/lspci -n -p $pcimap | awk -vclass=$class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}')
- awk -vvendor=$1 -vdevice=$2 '$2 == vendor && $3 == device {print $1}' $pcimap
-}
+# geninitrd mod: sata
find_modules_sata() {
debug "Finding SATA modules (class=0x0106)"
# 0101 - IDE/PATA
# 0106 - SATA/AHCI
# 0107 - SAS
- local module
- module=$(find_modules_by_class 0106)
+ local m modules=$(find_modules_by_class 0106)
+
+ # sort modules that ones who depend on libata are first
+ # this is best we could think of now :)
+ local left right
+ for m in $modules; do
+ if NEW_MODINFO=1 modinfo -k $kernel -F depends $m | grep -q libata; then
+ left="$left $m"
+ else
+ right="$right $m"
+ fi
+ done
- if [ "$module" ]; then
- # FIXME: how to handle if multiple modules returned?
- # i.e two modules can do same id
- find_module "$module"
- fi
+ for m in $left $right; do
+ find_module $m
+ done
}