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 <[EMAIL PROTECTED]>
---
 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
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to