Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Nov 2012 00:09:01 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r242422 - head/sys/dev/ata
Message-ID:  <201211010009.qA1091RK070087@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Nov  1 00:09:01 2012
New Revision: 242422
URL: http://svn.freebsd.org/changeset/base/242422

Log:
  Only four specific ATA PIO commands transfer several sectors per DRQ block
  (interrupt).  All other ATA PIO commands transfer one sector or 512 bytes
  at one time.  Hardcode these exceptions in ata(4) with ATA_CAM option.
  This fixes timeout of READ LOG EXT command used by `smartctl -x /dev/adaX`.

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

Modified: head/sys/dev/ata/ata-all.c
==============================================================================
--- head/sys/dev/ata/ata-all.c	Wed Oct 31 23:50:36 2012	(r242421)
+++ head/sys/dev/ata/ata-all.c	Thu Nov  1 00:09:01 2012	(r242422)
@@ -1501,6 +1501,14 @@ ata_cam_begin_transaction(device_t dev, 
 			request->flags |= ATA_R_READ;
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT)
 			request->flags |= ATA_R_WRITE;
+		if (ccb->ataio.cmd.command == ATA_READ_MUL ||
+		    ccb->ataio.cmd.command == ATA_READ_MUL48 ||
+		    ccb->ataio.cmd.command == ATA_WRITE_MUL ||
+		    ccb->ataio.cmd.command == ATA_WRITE_MUL48) {
+			request->transfersize = min(request->bytecount,
+			    ch->curr[ccb->ccb_h.target_id].bytecount);
+		} else
+			request->transfersize = min(request->bytecount, 512);
 	} else {
 		request->data = ccb->csio.data_ptr;
 		request->bytecount = ccb->csio.dxfer_len;
@@ -1517,9 +1525,9 @@ ata_cam_begin_transaction(device_t dev, 
 			request->flags |= ATA_R_READ;
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT)
 			request->flags |= ATA_R_WRITE;
+		request->transfersize = min(request->bytecount,
+		    ch->curr[ccb->ccb_h.target_id].bytecount);
 	}
-	request->transfersize = min(request->bytecount,
-	    ch->curr[ccb->ccb_h.target_id].bytecount);
 	request->retries = 0;
 	request->timeout = (ccb->ccb_h.timeout + 999) / 1000;
 	callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211010009.qA1091RK070087>