summaryrefslogtreecommitdiffstats
path: root/testing/hdparm/hdparm.initd
blob: 89aa4f82b7aa67a5eb4f5b8cb0b00c8553287f20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/sbin/runscript
# METHOD
# ------
# if /dev/ide exists, find all block devices beneath it named disc, cd, or
# generic.
#
# for the disc and cd ones, if there is a a matching /dev/hdX symlink and
# hdX_args is set in the config file, use hdX_args.  otherwise, if there is a
# matching /dev/discs/discX or /dev/cdroms/cdromX symlink, and discX_args or
# cdromX_args is set in the config file, use discX_args / cdromX_args.  finally,
# if all_args is set in the config file, use that.
#
# for the generic ones, sort them and look for genericX_args in the config file
# or use all_args.
#
# if /dev/ide does not exist, check the /dev/hdX entries, and see which ones
# correspond to real devices by opening them for reading.  then check hdX_args
# and all_args in the config file.
#
# for each device considered, if no args are found in the config file, do not
# run hdparm.

depend() {
	before bootmisc
}

do_hdparm() {
	local e=
	eval e=\$${extra_args}
	[ -z "${args}${all_args}${e}" ] && return 0
	
	if [ -n "${args:=${all_args} ${e}}" ] ; then
		local orgdevice=$(readlink -f "${device}")
		if [ -b "${orgdevice}" ] ; then
			ebegin "Running hdparm on ${device}"
			hdparm ${args} "${device}" > /dev/null
			eend $?
		fi
	fi
}

scan_devfs() {
	local extra_args="pata_all_args" device= alias= args=

	# devfs compatible systems
	for device in $(find /dev/ide -name disc) ; do
		args=''

		for alias in /dev/hd? ; do
			if [ "${alias}" -ef "${device}" ] ; then
				device=${alias}
				eval args=\$"$(basename "${alias}")"_args
				break
			fi
		done

		if [ -z "$args" ] ; then
			for alias in /dev/discs/* ; do
				if [ "${alias}"/disc -ef "${device}" ]; then
					device="${alias}/disc"
					eval args=\$"$(basename "${alias}")"_args
					break
				fi
			done
		fi

		do_hdparm
	done

	for device in $(find /dev/ide -name cd) ; do
		args=''

		for alias in /dev/hd? ; do
			if [ "${alias}" -ef "${device}" ] ; then
				device=${alias}
				eval args=\$"$(basename "${alias}")"_args
				break
			fi
		done

		if [ -z "$args" ] ; then
			for alias in /dev/cdroms/* ; do
				if [ "${alias}" -ef "${device}" ] ; then
					device=${alias}
					eval args=\$"$(basename "${alias}")"_args
					break
				fi
			done
		fi

		do_hdparm
	done

	local count=0
	# of course, the sort approach would fail here if any of the
	# host/bus/target/lun numbers reached 2 digits..
	for device in $(find /dev/ide -name generic | sort) ; do
		eval args=\$generic${count}_args
		do_hdparm
		count=$((${count} + 1))
	done
}

scan_nondevfs() {
	# non-devfs compatible system
	for device in /dev/hd* /dev/sd* ; do
		[ -e "${device}" ] || continue
		case "${device}" in
			*[0-9]) continue ;;
			/dev/hd*)  extra_args="pata_all_args" ;;
			/dev/sd*)  extra_args="sata_all_args" ;;
			*)         extra_args="" ;;
		esac

		# check that the block device really exists by
		# opening it for reading
		local errmsg= status= nomed=1
		errmsg=$(export LC_ALL=C ; : 2>&1 <"${device}")
		status=$?
		case ${errmsg} in
		    *": No medium found") nomed=0;;
		esac
		if [ -b "${device}" ] && [ "${status}" = "0" -o "${nomed}" = "0" ] ; then
			local conf_var="${device##*/}_args"
			eval args=\$${conf_var}
			do_hdparm
		fi
	done
}

start() {
	if get_bootparam "nohdparm" ; then
		ewarn "Skipping hdparm init as requested in kernel cmdline"
		return 0
	fi

	if [ -e /dev/.devfsd -a -d /dev/ide ] ; then
		scan_devfs
	else
		scan_nondevfs
	fi
}