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@xxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html