PERFORCE change 164272 for review

Alexander Motin mav at FreeBSD.org
Sat Jun 13 14:23:13 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=164272

Change 164272 by mav at mav_mavbook on 2009/06/13 14:22:44

	In preparation to PM support add flag that command require detailed
	status on successfull completion. Also make such command not to be
	queued by AHCI controller, as it is unable to report all results if
	several commands were completed on same interrupt.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#8 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#8 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#15 edit
.. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#24 edit
.. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.h#11 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#8 (text+ko) ====

@@ -133,11 +133,11 @@
 	ataio->cmd.features_exp = sector_count >> 8;
 }
 
-void	ata_reset_cmd(struct ccb_ataio *ataio, int reset)
+void	ata_reset_cmd(struct ccb_ataio *ataio)
 {
 	bzero(&ataio->cmd, sizeof(ataio->cmd));
-	ataio->cmd.flags = CAM_ATAIO_CONTROL;
-	ataio->cmd.control = reset ? 0x04 : 0;
+	ataio->cmd.flags = CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT;
+	ataio->cmd.control = 0x04;
 }
 
 #endif /* _KERNEL */

==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#8 (text+ko) ====

@@ -38,6 +38,7 @@
 #define		CAM_ATAIO_48BIT		0x01	/* Command has 48-bit format */
 #define		CAM_ATAIO_FPDMA		0x02	/* FPDMA command */
 #define		CAM_ATAIO_CONTROL	0x04	/* Control, not a command */
+#define		CAM_ATAIO_NEEDRESULT	0x08	/* Request requires result. */
 
 	u_int8_t	command;
 	u_int8_t	features;
@@ -85,6 +86,6 @@
     uint64_t lba, uint16_t sector_count);
 void	ata_ncq_cmd(struct ccb_ataio *ataio, uint8_t cmd,
     uint64_t lba, uint16_t sector_count);
-void	ata_reset_cmd(struct ccb_ataio *ataio, int reset);
+void	ata_reset_cmd(struct ccb_ataio *ataio);
 
 #endif

==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#15 (text+ko) ====

@@ -336,7 +336,7 @@
 		      /*data_ptr*/NULL,
 		      /*dxfer_len*/0,
 		      30 * 1000);
-		ata_reset_cmd(ataio, 1);
+		ata_reset_cmd(ataio);
 		break;
 	case PROBE_IDENTIFY:
 	{

==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#24 (text+ko) ====

@@ -904,11 +904,14 @@
 			return (1);
 	}
 	if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
-	    (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL)) {
-		/* Control command while anything active. */
+	    (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) {
+		/* Atomic command while anything active. */
 		if (ch->numrslots != 0)
 			return (1);
 	}
+       /* We have some atomic command running. */
+       if (ch->aslots != 0)
+               return (1);
 	return (0);
 }
 
@@ -938,11 +941,14 @@
 	slot->ccb = ccb;
 	/* Update channel stats. */
 	ch->numrslots++;
-	if ((slot->ccb->ccb_h.func_code == XPT_ATA_IO) &&
-	    (slot->ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) {
+	if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
+	    (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) {
 		ch->numtslots++;
 		ch->taggedtarget = ccb->ccb_h.target_id;
 	}
+	if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
+	    (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT)))
+		ch->aslots |= (1 << slot->slot);
 	slot->dma.nsegs = 0;
 	/* If request moves data, setup and load SG list */
 	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
@@ -1030,7 +1036,7 @@
 	/* Special handling for Soft Reset command. */
 	if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
 	    (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) &&
-	    ccb->ataio.cmd.control & ATA_A_RESET) {
+	    (ccb->ataio.cmd.control & ATA_A_RESET)) {
 		/* Kick controller into sane state */
 		ahci_stop(dev);
 		ahci_clo(dev);
@@ -1151,8 +1157,8 @@
 	if (ccb->ccb_h.func_code == XPT_ATA_IO) {
 		struct ata_res *res = &ccb->ataio.res;
 
-		if (et == AHCI_ERR_REAL ||
-		    ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) {
+		if ((et == AHCI_ERR_REAL) ||
+		    (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT)) {
 			u_int8_t *fis = ch->dma.rfis + 0x40;
 
 			bus_dmamap_sync(ch->dma.rfis_tag, ch->dma.rfis_map,
@@ -1209,6 +1215,7 @@
 	}
 	/* Free slot. */
 	ch->rslots &= ~(1 << slot->slot);
+	ch->aslots &= ~(1 << slot->slot);
 	slot->state = AHCI_SLOT_EMPTY;
 	slot->ccb = NULL;
 	/* Update channel stats. */
@@ -1217,8 +1224,8 @@
 	    (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) {
 		ch->numtslots--;
 	}
-	/* If it was first request of reset sequence nod no error,
-	 * proceed to second. */
+	/* If it was first request of reset sequence and there is no error,
+	 * proceed to second request. */
 	if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
 	    (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) &&
 	    (ccb->ataio.cmd.control & ATA_A_RESET) &&
@@ -1233,11 +1240,7 @@
 //device_printf(dev, "Unfreeze\n");
 		ch->frozen = NULL;
 		ahci_begin_transaction(dev, fccb);
-		/* If frozen command is not reset - release queue.
-		 * Reset will be released after it is finished. */
-		if ((fccb->ccb_h.func_code == XPT_ATA_IO) &&
-		    (fccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) == 0)
-			xpt_release_simq(ch->sim, TRUE);
+		xpt_release_simq(ch->sim, TRUE);
 	}
 }
 
@@ -1534,19 +1537,13 @@
 		}
 		/* Check for command collision. */
 		if (ahci_check_collision(dev, ccb)) {
+//device_printf(dev, "Freeze\n");
 			/* Freeze command. */
-//device_printf(dev, "Freeze\n");
+			ch->frozen = ccb;
 			/* We have only one frozen slot, so freeze simq also. */
 			xpt_freeze_simq(ch->sim, 1);
-			ch->frozen = ccb;
 			return;
 		}
-		/* If it is a reset sequence - freeze the queue. */
-		if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
-		    (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL)) {
-			xpt_freeze_simq(ch->sim, 1);
-			ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
-		}
 		ahci_begin_transaction(dev, ccb);
 		break;
 	case XPT_EN_LUN:		/* Enable LUN as a target */

==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.h#11 (text+ko) ====

@@ -343,6 +343,7 @@
 	struct mtx		mtx;		/* state lock */
 	int			devices;        /* What is present */
 	uint32_t		rslots;		/* Running slots */
+	uint32_t		aslots;		/* Slots with atomic commands  */
 	int			numrslots;	/* Number of running slots */
 	int			numtslots;	/* Number of tagged slots */
 	int			lastslot;	/* Last used slot */


More information about the p4-projects mailing list