svn commit: r251940 - stable/9/sys/dev/ata

Marius Strobl marius at FreeBSD.org
Tue Jun 18 14:35:10 UTC 2013


Author: marius
Date: Tue Jun 18 14:35:09 2013
New Revision: 251940
URL: http://svnweb.freebsd.org/changeset/base/251940

Log:
  MFC: r247165
  
  Fix command timeout caused by data underrun during fetching ATAPI sense
  data, introduced by r246713 (MFC'ed to stable/9 in r251874). There are two
  places where ata_request is filled in ATA_CAM: ata_cam_begin_transaction()
  and ata_cam_request_sense(). In the first case DMA should be done for
  addresses from the CCB. In second case, DMA should be done to the different
  address, the address of the sense buffer inside the CCB structure itself.

Modified:
  stable/9/sys/dev/ata/ata-all.c
  stable/9/sys/dev/ata/ata-all.h
  stable/9/sys/dev/ata/ata-dma.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/ata/ata-all.c
==============================================================================
--- stable/9/sys/dev/ata/ata-all.c	Tue Jun 18 14:20:14 2013	(r251939)
+++ stable/9/sys/dev/ata/ata-all.c	Tue Jun 18 14:35:09 2013	(r251940)
@@ -1695,6 +1695,7 @@ ata_cam_begin_transaction(device_t dev, 
 	request->timeout = (ccb->ccb_h.timeout + 999) / 1000;
 	callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED);
 	request->ccb = ccb;
+	request->flags |= ATA_R_DATA_IN_CCB;
 
 	ch->running = request;
 	ch->state = ATA_ACTIVE;

Modified: stable/9/sys/dev/ata/ata-all.h
==============================================================================
--- stable/9/sys/dev/ata/ata-all.h	Tue Jun 18 14:20:14 2013	(r251939)
+++ stable/9/sys/dev/ata/ata-all.h	Tue Jun 18 14:35:09 2013	(r251940)
@@ -398,6 +398,7 @@ struct ata_request {
 #define         ATA_R_THREAD            0x00000800
 #define         ATA_R_DIRECT            0x00001000
 #define         ATA_R_NEEDRESULT        0x00002000
+#define         ATA_R_DATA_IN_CCB       0x00004000
 
 #define         ATA_R_ATAPI16           0x00010000
 #define         ATA_R_ATAPI_INTR        0x00020000

Modified: stable/9/sys/dev/ata/ata-dma.c
==============================================================================
--- stable/9/sys/dev/ata/ata-dma.c	Tue Jun 18 14:20:14 2013	(r251939)
+++ stable/9/sys/dev/ata/ata-dma.c	Tue Jun 18 14:35:09 2013	(r251940)
@@ -305,7 +305,7 @@ ata_dmaload(struct ata_request *request,
 	dspa.dmatab = request->dma->sg;
 
 #ifdef ATA_CAM
-    if (request->ccb)
+    if (request->flags & ATA_R_DATA_IN_CCB)
         error = bus_dmamap_load_ccb(request->dma->data_tag,
 				request->dma->data_map, request->ccb,
 				ch->dma.setprd, &dspa, BUS_DMA_NOWAIT);


More information about the svn-src-stable mailing list