All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH #upstream 1/2] libata: move command post processing to __ata_qc_complete()
@ 2007-10-12 11:56 Tejun Heo
  2007-10-12 11:56 ` [PATCH #upstream 2/2] libata: track SLEEP state and issue SRST to wake it up Tejun Heo
  2007-10-12 12:13 ` [PATCH #upstream 1/2] libata: move command post processing to __ata_qc_complete() Jeff Garzik
  0 siblings, 2 replies; 9+ messages in thread
From: Tejun Heo @ 2007-10-12 11:56 UTC (permalink / raw)
  To: Jeff Garzik, linux-ide, ballen, andrew

Some commands need post-processing after successful completion.  This
was done in ata_scsi_qc_complete() till now but command post
processing doesn't belong to SAT layer.  Move them to
__ata_qc_complete() and, while at it, restructure a bit to ease adding
post-processing for other commands.

Signed-off-by: Tejun Heo <htejun@gmail.com>
---
 drivers/ata/libata-core.c |   25 +++++++++++++++++++++++++
 drivers/ata/libata-scsi.c |   23 -----------------------
 2 files changed, 25 insertions(+), 23 deletions(-)

Index: work/drivers/ata/libata-core.c
===================================================================
--- work.orig/drivers/ata/libata-core.c
+++ work/drivers/ata/libata-core.c
@@ -5536,6 +5536,31 @@ void __ata_qc_complete(struct ata_queued
 	qc->flags &= ~ATA_QCFLAG_ACTIVE;
 	ap->qc_active &= ~(1 << qc->tag);
 
+	/* some commands need post-processing after successful completion */
+	if (likely(qc->err_mask == 0)) {
+		unsigned int eh_action = 0;
+
+		switch (qc->tf.command) {
+		case ATA_CMD_SET_FEATURES:
+			/* cache configuration changed? */
+			if (ap->ops->error_handler &&
+			    ((qc->tf.feature == SETFEATURES_WC_ON) ||
+			     (qc->tf.feature == SETFEATURES_WC_OFF)))
+				eh_action |= ATA_EH_REVALIDATE;
+			break;
+
+		case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
+		case ATA_CMD_SET_MULTI: /* multi_count changed */
+			eh_action |= ATA_EH_REVALIDATE;
+			break;
+		}
+
+		if (unlikely(eh_action) && ap->ops->error_handler) {
+			link->eh_info.action |= eh_action;
+			ata_port_schedule_eh(ap);
+		}
+	}
+
 	/* call completion callback */
 	qc->complete_fn(qc);
 }
Index: work/drivers/ata/libata-scsi.c
===================================================================
--- work.orig/drivers/ata/libata-scsi.c
+++ work/drivers/ata/libata-scsi.c
@@ -1363,33 +1363,10 @@ nothing_to_do:
 static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	struct ata_eh_info *ehi = &qc->dev->link->eh_info;
 	struct scsi_cmnd *cmd = qc->scsicmd;
 	u8 *cdb = cmd->cmnd;
  	int need_sense = (qc->err_mask != 0);
 
-	/* We snoop the SET_FEATURES - Write Cache ON/OFF command, and
-	 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
-	 * cache
-	 */
-	if (ap->ops->error_handler && !need_sense) {
-		switch (qc->tf.command) {
-		case ATA_CMD_SET_FEATURES:
-			if ((qc->tf.feature == SETFEATURES_WC_ON) ||
-			    (qc->tf.feature == SETFEATURES_WC_OFF)) {
-				ehi->action |= ATA_EH_REVALIDATE;
-				ata_port_schedule_eh(ap);
-			}
-			break;
-
-		case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
-		case ATA_CMD_SET_MULTI: /* multi_count changed */
-			ehi->action |= ATA_EH_REVALIDATE;
-			ata_port_schedule_eh(ap);
-			break;
-		}
-	}
-
 	/* For ATA pass thru (SAT) commands, generate a sense block if
 	 * user mandated it or if there's an error.  Note that if we
 	 * generate because the user forced us to, a check condition

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2007-10-18  4:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-12 11:56 [PATCH #upstream 1/2] libata: move command post processing to __ata_qc_complete() Tejun Heo
2007-10-12 11:56 ` [PATCH #upstream 2/2] libata: track SLEEP state and issue SRST to wake it up Tejun Heo
2007-10-13  4:57   ` Andrew Paprocki
2007-10-13 13:55     ` Tejun Heo
2007-10-14  1:02       ` Andrew Paprocki
2007-10-12 12:13 ` [PATCH #upstream 1/2] libata: move command post processing to __ata_qc_complete() Jeff Garzik
2007-10-13 13:09   ` Tejun Heo
2007-10-18  1:23     ` Jeff Garzik
2007-10-18  3:55       ` Bruce Allen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.