From nobody@FreeBSD.org  Fri Mar 30 06:04:23 2007
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id A283F16A405
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Mar 2007 06:04:23 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [69.147.83.33])
	by mx1.freebsd.org (Postfix) with ESMTP id 8701F13C4AE
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Mar 2007 06:04:23 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.13.1/8.13.1) with ESMTP id l2U64NGA033306
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Mar 2007 06:04:23 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.13.1/8.13.1/Submit) id l2U5xLMG032727;
	Fri, 30 Mar 2007 05:59:21 GMT
	(envelope-from nobody)
Message-Id: <200703300559.l2U5xLMG032727@www.freebsd.org>
Date: Fri, 30 Mar 2007 05:59:21 GMT
From: URATAN Shigenobu<uratan@po.iijnet.or.jp>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [ata][request][patch] please expand ata timeouts
X-Send-Pr-Version: www-3.0

>Number:         111023
>Category:       kern
>Synopsis:       [ata] [request] [patch] please expand ata timeouts
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    mav
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Mar 30 06:10:05 GMT 2007
>Closed-Date:    Tue Nov 10 22:57:46 UTC 2009
>Last-Modified:  Tue Nov 10 23:00:10 UTC 2009
>Originator:     URATAN Shigenobu
>Release:        6.2-RELEASE
>Organization:
personal
>Environment:
FreeBSD  6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40:27 UTC 2007     root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
I'm using my home FreeBSD server with HDD's stand-by timer.
I have modified ad_init() to send ATA_IDLE_CMD at every ATA HDD attach.
 (This modificatin is included in the patch, but disabled because
  it is not so generic I think. Later, I will send a patch
  for 'sbin/atacontrol' to do this from command-line.)

Also, I had needed to modify these 2 ATA command timeouts,
because, at my Maxtor SATA 250GB HDD, it takes about 7seconds
to wake up from stand-by mode.

 1) ad_strategy() in ata-disk.c:
    This must be a timeout for generic disk operation.

 2) ata_controlcmd() in ata-queue.c:
    With ATA_IDLE_CMD from ad_init(), when the HDD is already
    in stand-by mode, ATA_IDLE_CMD is blocked until HDD is ready.
      (i.e., ATA_IDLE_CMD will wake the HDD up. I'd confirmed this behavior
       by both Maxtor and Seagate HDDs)

So please expand these ATA timeouts to 10seconds.

# I'd tuned also crontab/syslog.conf/mount options/etc.
# Finally, my server repeats 45min stand-by and 15min active
# when service duty is almost none

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -u ata-disk.c.orig ata-disk.c
--- ata-disk.c.orig	Sat Sep 30 23:51:49 2006
+++ ata-disk.c	Mon Mar 26 01:47:30 2007
@@ -229,7 +229,7 @@
     request->dev = dev;
     request->bio = bp;
     request->callback = ad_done;
-    request->timeout = 5;
+    request->timeout = 10;	/* [sec] */
     request->retries = 2;
     request->data = bp->bio_data;
     request->bytecount = bp->bio_bcount;
@@ -334,6 +334,12 @@
 	else
 	    ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_DIS_WCACHE, 0, 0);
     }
+
+#if 0
+    device_printf(dev, "try to set IDLE after 10 minutes\n");
+    if(ata_controlcmd(dev, ATA_IDLE_CMD, 0, 0, 120))
+        device_printf(dev, "fail to set IDLE timer\n");
+#endif /* 0 */
 
     /* use multiple sectors/interrupt if device supports it */
     if (ad_version(atadev->param.version_major)) {
diff -u ata-queue.c.orig ata-queue.c
--- ata-queue.c.orig	Sun Sep  3 02:01:32 2006
+++ ata-queue.c	Mon Mar 26 01:47:58 2007
@@ -129,7 +129,7 @@
 	request->u.ata.count = count;
 	request->u.ata.feature = feature;
 	request->flags = ATA_R_CONTROL;
-	request->timeout = 1;
+	request->timeout = 10;	/* [sec] */
 	request->retries = 0;
 	ata_queue_request(request);
 	error = request->result;

>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->sos 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Sat Apr 21 09:16:45 UTC 2007 
Responsible-Changed-Why:  
Patch against ata. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=111023 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/111023: commit references a PR
Date: Tue, 17 Feb 2009 23:20:15 +0000 (UTC)

 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;
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: mav 
State-Changed-When: Sun Feb 22 00:04:33 UTC 2009 
State-Changed-Why:  
Patch committed to 8-CURRENT. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=111023 
Responsible-Changed-From-To: sos->mav 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Tue May 12 04:42:29 UTC 2009 
Responsible-Changed-Why:  
Over to committer as MFC reminder, if applicable. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=111023 

From: Miroslav Lachman <000.fbsd@quip.cz>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/111023: [ata] [request] [patch] please expand ata timeouts
Date: Sun, 13 Sep 2009 14:00:42 +0200

 Will it be MFCed?
 
 And are there any possibility to have ATA timeouts sysctl tunable? It is 
 discussed again and again on forums and mailing lists. 5 seconds is 
 sometimes too low and it will be useful to users to increase it by sysctl.
 Or is there any strong objection not to allow users to set it by sysctl 
 and force them to edit it in the sources?
 
 links to discussions:
 http://www.mail-archive.com/freebsd-hardware@freebsd.org/msg03135.html
 http://linux-bsd-sharing.blogspot.com/2009/03/howto-fix-sata-dma-timeout-issues-on.html
 http://wiki.freebsd.org/JeremyChadwick/ATA_issues_and_troubleshooting
 http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/136182

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/111023: commit references a PR
Date: Mon, 26 Oct 2009 11:20:29 +0000 (UTC)

 Author: mav
 Date: Mon Oct 26 11:20:14 2009
 New Revision: 198486
 URL: http://svn.freebsd.org/changeset/base/198486
 
 Log:
   Increase ATA command timeouts. Some drives need more then 5s to spin-up.
   
   PR:		kern/111023
 
 Modified:
   head/sys/dev/ata/ata-disk.c
   head/sys/dev/ata/ata-queue.c
   head/sys/dev/ata/ata-raid.c
   head/sys/dev/ata/atapi-cd.c
 
 Modified: head/sys/dev/ata/ata-disk.c
 ==============================================================================
 --- head/sys/dev/ata/ata-disk.c	Mon Oct 26 11:00:37 2009	(r198485)
 +++ head/sys/dev/ata/ata-disk.c	Mon Oct 26 11:20:14 2009	(r198486)
 @@ -230,7 +230,7 @@ ad_spindown(void *priv)
      }
      request->dev = dev;
      request->flags = ATA_R_CONTROL;
 -    request->timeout = 5;
 +    request->timeout = 10;
      request->retries = 1;
      request->callback = ad_power_callback;
      request->u.ata.command = ATA_STANDBY_IMMEDIATE;
 @@ -265,7 +265,7 @@ ad_strategy(struct bio *bp)
  	request->timeout = 31;
      }
      else {
 -	request->timeout = 5;
 +	request->timeout = 10;
      }
      request->retries = 2;
      request->data = bp->bio_data;
 @@ -468,7 +468,7 @@ ad_set_geometry(device_t dev)
      request->u.ata.count = 0;
      request->u.ata.feature = 0;
      request->flags = ATA_R_CONTROL | ATA_R_QUIET;
 -    request->timeout = 5;
 +    request->timeout = 10;
      request->retries = 0;
      ata_queue_request(request);
      if (request->status & ATA_S_ERROR)
 @@ -487,7 +487,7 @@ ad_set_geometry(device_t dev)
      request->u.ata.count = 1;
      request->u.ata.feature = 0;
      request->flags = ATA_R_CONTROL;
 -    request->timeout = 5;
 +    request->timeout = 10;
      request->retries = 0;
      ata_queue_request(request);
      if (request->status & ATA_S_ERROR)
 
 Modified: head/sys/dev/ata/ata-queue.c
 ==============================================================================
 --- head/sys/dev/ata/ata-queue.c	Mon Oct 26 11:00:37 2009	(r198485)
 +++ head/sys/dev/ata/ata-queue.c	Mon Oct 26 11:20:14 2009	(r198486)
 @@ -135,7 +135,7 @@ ata_controlcmd(device_t dev, u_int8_t co
  	    atadev->spindown_state = 0;
  	    request->timeout = 31;
  	} else {
 -	    request->timeout = 5;
 +	    request->timeout = 10;
  	}
  	request->retries = 0;
  	ata_queue_request(request);
 @@ -389,7 +389,7 @@ ata_completed(void *context, int dummy)
  	    request->bytecount = sizeof(struct atapi_sense);
  	    request->donecount = 0;
  	    request->transfersize = sizeof(struct atapi_sense);
 -	    request->timeout = 5;
 +	    request->timeout = 10;
  	    request->flags &= (ATA_R_ATAPI | ATA_R_QUIET | ATA_R_DEBUG);
  	    request->flags |= (ATA_R_READ | ATA_R_AT_HEAD | ATA_R_REQUEUE);
  	    ATA_DEBUG_RQ(request, "autoissue request sense");
 
 Modified: head/sys/dev/ata/ata-raid.c
 ==============================================================================
 --- head/sys/dev/ata/ata-raid.c	Mon Oct 26 11:00:37 2009	(r198485)
 +++ head/sys/dev/ata/ata-raid.c	Mon Oct 26 11:20:14 2009	(r198486)
 @@ -273,7 +273,7 @@ ata_raid_flush(struct bio *bp)
  	request->u.ata.lba = 0;
  	request->u.ata.count = 0;
  	request->u.ata.feature = 0;
 -	request->timeout = 1;
 +	request->timeout = 10;
  	request->retries = 0;
  	request->flags |= ATA_R_ORDERED | ATA_R_DIRECT;
  	ata_queue_request(request);
 @@ -4371,7 +4371,7 @@ ata_raid_init_request(device_t dev, stru
  	return NULL;
      }
      request->dev = dev;
 -    request->timeout = 5;
 +    request->timeout = 10;
      request->retries = 2;
      request->callback = ata_raid_done;
      request->driver = rdp;
 
 Modified: head/sys/dev/ata/atapi-cd.c
 ==============================================================================
 --- head/sys/dev/ata/atapi-cd.c	Mon Oct 26 11:00:37 2009	(r198485)
 +++ head/sys/dev/ata/atapi-cd.c	Mon Oct 26 11:20:14 2009	(r198486)
 @@ -700,7 +700,7 @@ acd_geom_access(struct g_provider *pp, i
  	request->dev = dev;
  	bcopy(ccb, request->u.atapi.ccb, 16);
  	request->flags = ATA_R_ATAPI;
 -	request->timeout = 5;
 +	request->timeout = 10;
  	ata_queue_request(request);
  	if (!request->error &&
  	    (request->u.atapi.sense.key == 2 ||
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/111023: commit references a PR
Date: Tue, 10 Nov 2009 22:37:58 +0000 (UTC)

 Author: mav
 Date: Tue Nov 10 22:37:44 2009
 New Revision: 199158
 URL: http://svn.freebsd.org/changeset/base/199158
 
 Log:
   MFC r198486, r199050:
   Increase ATA command timeouts. Introduce define and kernel option
   ATA_REQUEST_TIMEOUT to control it.
   
   PR:		kern/111023
 
 Modified:
   stable/8/sys/conf/NOTES
   stable/8/sys/conf/options
   stable/8/sys/dev/ata/ata-all.h
   stable/8/sys/dev/ata/ata-disk.c
   stable/8/sys/dev/ata/ata-queue.c
   stable/8/sys/dev/ata/ata-raid.c
   stable/8/sys/dev/ata/atapi-cd.c
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/xen/xenpci/   (props changed)
 
 Modified: stable/8/sys/conf/NOTES
 ==============================================================================
 --- stable/8/sys/conf/NOTES	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/conf/NOTES	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -1716,8 +1716,11 @@ hint.ata.1.irq="15"
  #
  # ATA_STATIC_ID:	controller numbering is static ie depends on location
  #			else the device numbers are dynamically allocated.
 +# ATA_REQUEST_TIMEOUT:	the number of seconds to wait for an ATA request
 +#			before timing out.
  
  options 	ATA_STATIC_ID
 +#options 	ATA_REQUEST_TIMEOUT=10
  
  #
  # Standard floppy disk controllers and floppy tapes, supports
 
 Modified: stable/8/sys/conf/options
 ==============================================================================
 --- stable/8/sys/conf/options	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/conf/options	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -350,6 +350,7 @@ ISCSI_INITIATOR_DEBUG	opt_iscsi_initiato
  # Options used in the 'ata' ATA/ATAPI driver
  ATA_STATIC_ID		opt_ata.h
  ATA_NOPCI		opt_ata.h
 +ATA_REQUEST_TIMEOUT	opt_ata.h
  
  # Net stuff.
  ACCEPT_FILTER_DATA
 
 Modified: stable/8/sys/dev/ata/ata-all.h
 ==============================================================================
 --- stable/8/sys/dev/ata/ata-all.h	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/dev/ata/ata-all.h	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -336,6 +336,10 @@ struct ata_ahci_cmd_list {
  #define ATA_OP_FINISHED                 1
  #define ATA_MAX_28BIT_LBA               268435455UL
  
 +#ifndef	ATA_REQUEST_TIMEOUT
 +#define	ATA_REQUEST_TIMEOUT		10
 +#endif
 +
  /* structure used for composite atomic operations */
  #define MAX_COMPOSITES          32              /* u_int32_t bits */
  struct ata_composite {
 
 Modified: stable/8/sys/dev/ata/ata-disk.c
 ==============================================================================
 --- stable/8/sys/dev/ata/ata-disk.c	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/dev/ata/ata-disk.c	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -230,7 +230,7 @@ ad_spindown(void *priv)
      }
      request->dev = dev;
      request->flags = ATA_R_CONTROL;
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 1;
      request->callback = ad_power_callback;
      request->u.ata.command = ATA_STANDBY_IMMEDIATE;
 @@ -262,10 +262,10 @@ ad_strategy(struct bio *bp)
      if (atadev->spindown_state) {
  	device_printf(dev, "request while spun down, starting.\n");
  	atadev->spindown_state = 0;
 -	request->timeout = 31;
 +	request->timeout = MAX(ATA_REQUEST_TIMEOUT, 31);
      }
      else {
 -	request->timeout = 5;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
      }
      request->retries = 2;
      request->data = bp->bio_data;
 @@ -468,7 +468,7 @@ ad_set_geometry(device_t dev)
      request->u.ata.count = 0;
      request->u.ata.feature = 0;
      request->flags = ATA_R_CONTROL | ATA_R_QUIET;
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 0;
      ata_queue_request(request);
      if (request->status & ATA_S_ERROR)
 @@ -487,7 +487,7 @@ ad_set_geometry(device_t dev)
      request->u.ata.count = 1;
      request->u.ata.feature = 0;
      request->flags = ATA_R_CONTROL;
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 0;
      ata_queue_request(request);
      if (request->status & ATA_S_ERROR)
 
 Modified: stable/8/sys/dev/ata/ata-queue.c
 ==============================================================================
 --- stable/8/sys/dev/ata/ata-queue.c	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/dev/ata/ata-queue.c	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -133,9 +133,9 @@ ata_controlcmd(device_t dev, u_int8_t co
  	if (atadev->spindown_state) {
  	    device_printf(dev, "request while spun down, starting.\n");
  	    atadev->spindown_state = 0;
 -	    request->timeout = 31;
 +	    request->timeout = MAX(ATA_REQUEST_TIMEOUT, 31);
  	} else {
 -	    request->timeout = 5;
 +	    request->timeout = ATA_REQUEST_TIMEOUT;
  	}
  	request->retries = 0;
  	ata_queue_request(request);
 @@ -389,7 +389,7 @@ ata_completed(void *context, int dummy)
  	    request->bytecount = sizeof(struct atapi_sense);
  	    request->donecount = 0;
  	    request->transfersize = sizeof(struct atapi_sense);
 -	    request->timeout = 5;
 +	    request->timeout = ATA_REQUEST_TIMEOUT;
  	    request->flags &= (ATA_R_ATAPI | ATA_R_QUIET | ATA_R_DEBUG);
  	    request->flags |= (ATA_R_READ | ATA_R_AT_HEAD | ATA_R_REQUEUE);
  	    ATA_DEBUG_RQ(request, "autoissue request sense");
 
 Modified: stable/8/sys/dev/ata/ata-raid.c
 ==============================================================================
 --- stable/8/sys/dev/ata/ata-raid.c	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/dev/ata/ata-raid.c	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -273,7 +273,7 @@ ata_raid_flush(struct bio *bp)
  	request->u.ata.lba = 0;
  	request->u.ata.count = 0;
  	request->u.ata.feature = 0;
 -	request->timeout = 1;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
  	request->retries = 0;
  	request->flags |= ATA_R_ORDERED | ATA_R_DIRECT;
  	ata_queue_request(request);
 @@ -4371,7 +4371,7 @@ ata_raid_init_request(device_t dev, stru
  	return NULL;
      }
      request->dev = dev;
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 2;
      request->callback = ata_raid_done;
      request->driver = rdp;
 @@ -4445,7 +4445,7 @@ ata_raid_rw(device_t dev, u_int64_t lba,
  
      /* setup request */
      request->dev = dev;
 -    request->timeout = 10;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 0;
      request->data = data;
      request->bytecount = bcount;
 
 Modified: stable/8/sys/dev/ata/atapi-cd.c
 ==============================================================================
 --- stable/8/sys/dev/ata/atapi-cd.c	Tue Nov 10 22:27:33 2009	(r199157)
 +++ stable/8/sys/dev/ata/atapi-cd.c	Tue Nov 10 22:37:44 2009	(r199158)
 @@ -700,7 +700,7 @@ acd_geom_access(struct g_provider *pp, i
  	request->dev = dev;
  	bcopy(ccb, request->u.atapi.ccb, 16);
  	request->flags = ATA_R_ATAPI;
 -	request->timeout = 5;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
  	ata_queue_request(request);
  	if (!request->error &&
  	    (request->u.atapi.sense.key == 2 ||
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: mav 
State-Changed-When: Tue Nov 10 22:57:11 UTC 2009 
State-Changed-Why:  
Patches merged down to 7-STABLE. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=111023 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/111023: commit references a PR
Date: Tue, 10 Nov 2009 22:56:24 +0000 (UTC)

 Author: mav
 Date: Tue Nov 10 22:56:05 2009
 New Revision: 199159
 URL: http://svn.freebsd.org/changeset/base/199159
 
 Log:
   MFC r188740, r198486, r199050:
   Increase ATA command timeouts. Introduce define and kernel option
   ATA_REQUEST_TIMEOUT to control it.
   
   PR:		kern/111023
 
 Modified:
   stable/7/sys/conf/NOTES
   stable/7/sys/conf/options
   stable/7/sys/dev/ata/ata-all.h
   stable/7/sys/dev/ata/ata-disk.c
   stable/7/sys/dev/ata/ata-queue.c
   stable/7/sys/dev/ata/ata-raid.c
   stable/7/sys/dev/ata/atapi-cd.c
 Directory Properties:
   stable/7/sys/   (props changed)
   stable/7/sys/contrib/pf/   (props changed)
 
 Modified: stable/7/sys/conf/NOTES
 ==============================================================================
 --- stable/7/sys/conf/NOTES	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/conf/NOTES	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -1621,8 +1621,11 @@ hint.ata.1.irq="15"
  #
  # ATA_STATIC_ID:	controller numbering is static ie depends on location
  #			else the device numbers are dynamically allocated.
 +# ATA_REQUEST_TIMEOUT:	the number of seconds to wait for an ATA request
 +#			before timing out.
  
  options 	ATA_STATIC_ID
 +#options 	ATA_REQUEST_TIMEOUT=10
  
  #
  # Standard floppy disk controllers and floppy tapes, supports
 
 Modified: stable/7/sys/conf/options
 ==============================================================================
 --- stable/7/sys/conf/options	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/conf/options	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -338,6 +338,7 @@ ISCSI_INITIATOR_DEBUG	opt_iscsi_initiato
  # Options used in the 'ata' ATA/ATAPI driver
  ATA_STATIC_ID		opt_ata.h
  ATA_NOPCI		opt_ata.h
 +ATA_REQUEST_TIMEOUT	opt_ata.h
  
  # Net stuff.
  ACCEPT_FILTER_DATA
 
 Modified: stable/7/sys/dev/ata/ata-all.h
 ==============================================================================
 --- stable/7/sys/dev/ata/ata-all.h	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/dev/ata/ata-all.h	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -308,6 +308,10 @@ struct ata_ahci_cmd_list {
  #define ATA_OP_FINISHED                 1
  #define ATA_MAX_28BIT_LBA               268435455UL
  
 +#ifndef	ATA_REQUEST_TIMEOUT
 +#define	ATA_REQUEST_TIMEOUT		10
 +#endif
 +
  /* structure used for composite atomic operations */
  #define MAX_COMPOSITES          32              /* u_int32_t bits */
  struct ata_composite {
 
 Modified: stable/7/sys/dev/ata/ata-disk.c
 ==============================================================================
 --- stable/7/sys/dev/ata/ata-disk.c	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/dev/ata/ata-disk.c	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -259,7 +259,7 @@ ad_spindown(void *priv)
      }
      request->flags = ATA_R_CONTROL;
      request->dev = dev;
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 1;
      request->callback = ad_power_callback;
      request->u.ata.command = ATA_STANDBY_IMMEDIATE;
 @@ -291,9 +291,9 @@ ad_strategy(struct bio *bp)
      if (atadev->spindown_state) {
  	device_printf(dev, "request while spun down, starting.\n");
  	atadev->spindown_state = 0;
 -	request->timeout = 31;
 +	request->timeout = MAX(ATA_REQUEST_TIMEOUT, 31);
      } else {
 -	request->timeout = 5;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
      }
      request->retries = 2;
      request->data = bp->bio_data;
 
 Modified: stable/7/sys/dev/ata/ata-queue.c
 ==============================================================================
 --- stable/7/sys/dev/ata/ata-queue.c	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/dev/ata/ata-queue.c	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -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 = MAX(ATA_REQUEST_TIMEOUT, 31);
 +	} else {
 +	    request->timeout = ATA_REQUEST_TIMEOUT;
 +	}
  	request->retries = 0;
  	ata_queue_request(request);
  	error = request->result;
 @@ -389,7 +396,7 @@ ata_completed(void *context, int dummy)
  	    request->bytecount = sizeof(struct atapi_sense);
  	    request->donecount = 0;
  	    request->transfersize = sizeof(struct atapi_sense);
 -	    request->timeout = 5;
 +	    request->timeout = ATA_REQUEST_TIMEOUT;
  	    request->flags &= (ATA_R_ATAPI | ATA_R_QUIET | ATA_R_DEBUG);
  	    request->flags |= (ATA_R_READ | ATA_R_AT_HEAD | ATA_R_REQUEUE);
  	    ATA_DEBUG_RQ(request, "autoissue request sense");
 
 Modified: stable/7/sys/dev/ata/ata-raid.c
 ==============================================================================
 --- stable/7/sys/dev/ata/ata-raid.c	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/dev/ata/ata-raid.c	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -273,7 +273,7 @@ ata_raid_flush(struct bio *bp)
  	request->u.ata.lba = 0;
  	request->u.ata.count = 0;
  	request->u.ata.feature = 0;
 -	request->timeout = 1;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
  	request->retries = 0;
  	request->flags |= ATA_R_ORDERED | ATA_R_DIRECT;
  	ata_queue_request(request);
 @@ -4358,7 +4358,7 @@ ata_raid_init_request(struct ar_softc *r
  	printf("FAILURE - out of memory in ata_raid_init_request\n");
  	return NULL;
      }
 -    request->timeout = 5;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 2;
      request->callback = ata_raid_done;
      request->driver = rdp;
 @@ -4432,7 +4432,7 @@ ata_raid_rw(device_t dev, u_int64_t lba,
  
      /* setup request */
      request->dev = dev;
 -    request->timeout = 10;
 +    request->timeout = ATA_REQUEST_TIMEOUT;
      request->retries = 0;
      request->data = data;
      request->bytecount = bcount;
 
 Modified: stable/7/sys/dev/ata/atapi-cd.c
 ==============================================================================
 --- stable/7/sys/dev/ata/atapi-cd.c	Tue Nov 10 22:37:44 2009	(r199158)
 +++ stable/7/sys/dev/ata/atapi-cd.c	Tue Nov 10 22:56:05 2009	(r199159)
 @@ -703,7 +703,7 @@ acd_geom_access(struct g_provider *pp, i
  	request->dev = dev;
  	bcopy(ccb, request->u.atapi.ccb, 16);
  	request->flags = ATA_R_ATAPI;
 -	request->timeout = 5;
 +	request->timeout = ATA_REQUEST_TIMEOUT;
  	ata_queue_request(request);
  	if (!request->error &&
  	    (request->u.atapi.sense.key == 2 ||
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
>Unformatted:
