enable FIS Based Switching when a Port Multiplier is connected: [libata] add fields to store TaskFile before error handling kicks.
PATCH 1/2 enable FIS Based Switching when a Port Multiplier is connected: [libata] add fields to store TaskFile before error handling kicks.
Sometimes, it is useful to store ATA Task File in qc->result_tf while still on the data path, instead of the error handler triggering it.
Signed-off-by Gwendal Grignou <[email protected]>
--- drivers/ata/libata-core.c | 7 +++++-- drivers/ata/libata-eh.c | 1 + include/linux/libata.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-)
drivers/ata/libata-core.c +5 -2
@@ -4607,8 +4607,11 @@ static void fill_result_tf(struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap; - qc->result_tf.flags = qc->tf.flags; - ap->ops->qc_fill_rtf (qc); +if ((qc->flags &ATA_QCFLAG_RTF_VALID ) ==0 ) { + qc->result_tf.flags = qc->tf.flags; + qc->flags |=ATA_QCFLAG_RTF_VALID ; + ap->ops->qc_fill_rtf (qc); + } }static void ata_verify_xfer (struct ata_queued_cmd *qc)
drivers/ata/libata-eh.c +1 -0
@@ -1518,6 +1518,7 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)memcpy (&qc->result_tf, &tf,sizeof (tf)); qc->result_tf.flags =ATA_TFLAG_ISADDR |ATA_TFLAG_LBA |ATA_TFLAG_LBA48 ; qc->err_mask |=AC_ERR_DEV |AC_ERR_NCQ ; + qc->flags |=ATA_QCFLAG_RTF_VALID ; ehc->i.err_mask &= ~AC_ERR_DEV ; }
include/linux/libata.h +1 -0
@@ -233,6 +233,7 @@ enum {ATA_QCFLAG_FAILED = (1 <<16 ),/* cmd failed and is owned by EH */ ATA_QCFLAG_SENSE_VALID = (1 <<17 ),/* sense data valid */ ATA_QCFLAG_EH_SCHEDULED = (1 <<18 ),/* EH scheduled (obsolete) */ +ATA_QCFLAG_RTF_VALID = (1 <<19 ),/* set when result_tf is valid */ /* host set flags */ ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */
Signature · 1 line
1.5.4.5