svn commit: r188740 - head/sys/dev/ata

Alexander Motin mav at FreeBSD.org
Tue Feb 17 15:20:06 PST 2009


Author: mav
Date: Tue Feb 17 23:20:04 2009
New Revision: 188740
URL: http://svn.freebsd.org/changeset/base/188740

Log:
  Adaptively increase control command timeout when drive is spun down.
  This should fix, for example, cache flush timeout error on shutdown, if
  some drives are not mounted.
  
  PR:		kern/111023

Modified:
  head/sys/dev/ata/ata-queue.c

Modified: head/sys/dev/ata/ata-queue.c
==============================================================================
--- head/sys/dev/ata/ata-queue.c	Tue Feb 17 22:49:58 2009	(r188739)
+++ head/sys/dev/ata/ata-queue.c	Tue Feb 17 23:20:04 2009	(r188740)
@@ -119,6 +119,7 @@ int
 ata_controlcmd(device_t dev, u_int8_t command, u_int16_t feature,
 	       u_int64_t lba, u_int16_t count)
 {
+    struct ata_device *atadev = device_get_softc(dev);
     struct ata_request *request = ata_alloc_request();
     int error = ENOMEM;
 
@@ -129,7 +130,13 @@ ata_controlcmd(device_t dev, u_int8_t co
 	request->u.ata.count = count;
 	request->u.ata.feature = feature;
 	request->flags = ATA_R_CONTROL;
-	request->timeout = 1;
+	if (atadev->spindown_state) {
+	    device_printf(dev, "request while spun down, starting.\n");
+	    atadev->spindown_state = 0;
+	    request->timeout = 31;
+	} else {
+	    request->timeout = 5;
+	}
 	request->retries = 0;
 	ata_queue_request(request);
 	error = request->result;


More information about the svn-src-head mailing list