From 42912a61a5d7e3149bddd7ab0e191bff0de7a18e Mon Sep 17 00:00:00 2001 From: CyberLeo Date: Sun, 8 May 2011 06:24:59 -0500 Subject: [PATCH] targets/i386/NEPETA: fix boot.config; disable DMA to allow the CF card to boot; enable DMA on other disks during boot The generic direct-insertion CF-IDE adapter I have doesn't properly pass DMA signals, so PIO modes work perfectly but DMA modes fail with DMA timeouts. Forbid the kernel from automatically setting DMA modes on any ATA devices, so that root can be mounted from the CF card; instead, set DMA modes for capable data drives after boot. --- .../NEPETA/config/overlay/boot/boot.config | 1 + .../NEPETA/config/overlay/boot/loader.conf | 1 + .../NEPETA/config/overlay/etc/rc.d/atacontrol | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 targets/i386/NEPETA/config/overlay/boot/boot.config create mode 100755 targets/i386/NEPETA/config/overlay/etc/rc.d/atacontrol diff --git a/targets/i386/NEPETA/config/overlay/boot/boot.config b/targets/i386/NEPETA/config/overlay/boot/boot.config new file mode 100644 index 0000000..b57fbba --- /dev/null +++ b/targets/i386/NEPETA/config/overlay/boot/boot.config @@ -0,0 +1 @@ +/loader diff --git a/targets/i386/NEPETA/config/overlay/boot/loader.conf b/targets/i386/NEPETA/config/overlay/boot/loader.conf index 2720359..3cae7b6 100644 --- a/targets/i386/NEPETA/config/overlay/boot/loader.conf +++ b/targets/i386/NEPETA/config/overlay/boot/loader.conf @@ -11,3 +11,4 @@ smbus_load="YES" zlib_load="YES" vfs.root.mountfrom="cd9660:/dev/iso9660/root" +hw.ata.ata_dma="0" diff --git a/targets/i386/NEPETA/config/overlay/etc/rc.d/atacontrol b/targets/i386/NEPETA/config/overlay/etc/rc.d/atacontrol new file mode 100755 index 0000000..1566aa1 --- /dev/null +++ b/targets/i386/NEPETA/config/overlay/etc/rc.d/atacontrol @@ -0,0 +1,40 @@ +#!/bin/sh + +# PROVIDE: atacontrol +# REQUIRE: +# BEFORE: FILESYSTEMS fsck zvol +# KEYWORD: nojail + +# Usage: /etc/rc.conf +# atacontrol_enable="YES" # Enable +# atacontrol_devs="ad4 ad5 ad6 ad7" # List of devices to care about +# atacontrol_all_mode="UDMA100" # Mode for all devices in _devs +# atacontrol_all_spindown="900" # Spindown time for all devices in _devs +# atacontrol_ad7_mode="UDMA133" # Override _mode for ad7 +# atacontrol_ad7_spindown="900" # Override _spindown for ad7 + +. /etc/rc.subr + +name="atacontrol" +start_cmd="atacontrol_start" + +atacontrol_start() { + local dev mode spin + if [ "${atacontrol_devs}" ] + then + for dev in ${atacontrol_devs} + do + dev="$(basename "${dev}")" + [ -e "/dev/${dev}" ] || continue + mode="$(eval echo \${atacontrol_${dev}_mode:-${atacontrol_all_mode}})" + spin="$(eval echo \${atacontrol_${dev}_spindown:-${atacontrol_all_spindown}})" + printf "atacontrol %s: ${mode:+mode: %s }${spin:+spindown: %s}\n" "${dev}" "${mode}" "${spin}" + [ "${mode}" ] && /sbin/atacontrol mode "${dev}" "${mode}" >&- + [ "${spin}" ] && /sbin/atacontrol spindown "${dev}" "${spin}" && \ + /bin/dd if="/dev/${dev}" of=/dev/null bs=512 count=1 2>&- & + done + fi +} + +load_rc_config $name +run_rc_command "$1" -- 2.42.0