提交 efcef265 编写于 作者: S Sergey Shtylyov 提交者: Damien Le Moal

ata: add/use ata_taskfile::{error|status} fields

Add the explicit error and status register fields to 'struct ata_taskfile'
using the anonymous *union*s ('struct ide_taskfile' had that for ages!) and
update the libata taskfile code accordingly. There should be no object code
changes resulting from that...
Signed-off-by: NSergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: NDamien Le Moal <damien.lemoal@opensource.wdc.com>
上级 f7220eac
...@@ -265,7 +265,7 @@ static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc) ...@@ -265,7 +265,7 @@ static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE && if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE &&
!(qc->flags & ATA_QCFLAG_FAILED)) { !(qc->flags & ATA_QCFLAG_FAILED)) {
ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf); ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf);
qc->result_tf.command = (rx_fis + RX_FIS_PIO_SETUP)[15]; qc->result_tf.status = (rx_fis + RX_FIS_PIO_SETUP)[15];
} else } else
ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf); ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf);
......
...@@ -739,7 +739,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, ...@@ -739,7 +739,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
...@@ -808,7 +808,7 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, ...@@ -808,7 +808,7 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
rc = sata_link_hardreset(link, timing, deadline, &online, rc = sata_link_hardreset(link, timing, deadline, &online,
......
...@@ -123,7 +123,7 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class, ...@@ -123,7 +123,7 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
rc = sata_link_hardreset(link, timing, deadline, &online, rc = sata_link_hardreset(link, timing, deadline, &online,
......
...@@ -365,7 +365,7 @@ static int xgene_ahci_do_hardreset(struct ata_link *link, ...@@ -365,7 +365,7 @@ static int xgene_ahci_do_hardreset(struct ata_link *link,
do { do {
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
rc = sata_link_hardreset(link, timing, deadline, online, rc = sata_link_hardreset(link, timing, deadline, online,
ahci_check_ready); ahci_check_ready);
......
...@@ -1561,7 +1561,7 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class, ...@@ -1561,7 +1561,7 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
rc = sata_link_hardreset(link, timing, deadline, online, rc = sata_link_hardreset(link, timing, deadline, online,
...@@ -2033,7 +2033,7 @@ static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc) ...@@ -2033,7 +2033,7 @@ static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE && if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE &&
!(qc->flags & ATA_QCFLAG_FAILED)) { !(qc->flags & ATA_QCFLAG_FAILED)) {
ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf); ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf);
qc->result_tf.command = (rx_fis + RX_FIS_PIO_SETUP)[15]; qc->result_tf.status = (rx_fis + RX_FIS_PIO_SETUP)[15];
} else } else
ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf); ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf);
......
...@@ -546,13 +546,13 @@ static void ata_acpi_gtf_to_tf(struct ata_device *dev, ...@@ -546,13 +546,13 @@ static void ata_acpi_gtf_to_tf(struct ata_device *dev,
tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
tf->protocol = ATA_PROT_NODATA; tf->protocol = ATA_PROT_NODATA;
tf->feature = gtf->tf[0]; /* 0x1f1 */ tf->error = gtf->tf[0]; /* 0x1f1 */
tf->nsect = gtf->tf[1]; /* 0x1f2 */ tf->nsect = gtf->tf[1]; /* 0x1f2 */
tf->lbal = gtf->tf[2]; /* 0x1f3 */ tf->lbal = gtf->tf[2]; /* 0x1f3 */
tf->lbam = gtf->tf[3]; /* 0x1f4 */ tf->lbam = gtf->tf[3]; /* 0x1f4 */
tf->lbah = gtf->tf[4]; /* 0x1f5 */ tf->lbah = gtf->tf[4]; /* 0x1f5 */
tf->device = gtf->tf[5]; /* 0x1f6 */ tf->device = gtf->tf[5]; /* 0x1f6 */
tf->command = gtf->tf[6]; /* 0x1f7 */ tf->status = gtf->tf[6]; /* 0x1f7 */
} }
static int ata_acpi_filter_tf(struct ata_device *dev, static int ata_acpi_filter_tf(struct ata_device *dev,
...@@ -679,7 +679,7 @@ static int ata_acpi_run_tf(struct ata_device *dev, ...@@ -679,7 +679,7 @@ static int ata_acpi_run_tf(struct ata_device *dev,
"(%s) rejected by device (Stat=0x%02x Err=0x%02x)", "(%s) rejected by device (Stat=0x%02x Err=0x%02x)",
tf.command, tf.feature, tf.nsect, tf.lbal, tf.command, tf.feature, tf.nsect, tf.lbal,
tf.lbam, tf.lbah, tf.device, descr, tf.lbam, tf.lbah, tf.device, descr,
rtf.command, rtf.feature); rtf.status, rtf.error);
rc = 0; rc = 0;
break; break;
...@@ -689,7 +689,7 @@ static int ata_acpi_run_tf(struct ata_device *dev, ...@@ -689,7 +689,7 @@ static int ata_acpi_run_tf(struct ata_device *dev,
"(%s) failed (Emask=0x%x Stat=0x%02x Err=0x%02x)", "(%s) failed (Emask=0x%x Stat=0x%02x Err=0x%02x)",
tf.command, tf.feature, tf.nsect, tf.lbal, tf.command, tf.feature, tf.nsect, tf.lbal,
tf.lbam, tf.lbah, tf.device, descr, tf.lbam, tf.lbah, tf.device, descr,
err_mask, rtf.command, rtf.feature); err_mask, rtf.status, rtf.error);
rc = -EIO; rc = -EIO;
break; break;
} }
......
...@@ -1171,7 +1171,7 @@ static int ata_read_native_max_address(struct ata_device *dev, u64 *max_sectors) ...@@ -1171,7 +1171,7 @@ static int ata_read_native_max_address(struct ata_device *dev, u64 *max_sectors)
ata_dev_warn(dev, ata_dev_warn(dev,
"failed to read native max address (err_mask=0x%x)\n", "failed to read native max address (err_mask=0x%x)\n",
err_mask); err_mask);
if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED)) if (err_mask == AC_ERR_DEV && (tf.error & ATA_ABORTED))
return -EACCES; return -EACCES;
return -EIO; return -EIO;
} }
...@@ -1235,7 +1235,7 @@ static int ata_set_max_sectors(struct ata_device *dev, u64 new_sectors) ...@@ -1235,7 +1235,7 @@ static int ata_set_max_sectors(struct ata_device *dev, u64 new_sectors)
"failed to set max address (err_mask=0x%x)\n", "failed to set max address (err_mask=0x%x)\n",
err_mask); err_mask);
if (err_mask == AC_ERR_DEV && if (err_mask == AC_ERR_DEV &&
(tf.feature & (ATA_ABORTED | ATA_IDNF))) (tf.error & (ATA_ABORTED | ATA_IDNF)))
return -EACCES; return -EACCES;
return -EIO; return -EIO;
} }
...@@ -1584,7 +1584,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, ...@@ -1584,7 +1584,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
/* perform minimal error analysis */ /* perform minimal error analysis */
if (qc->flags & ATA_QCFLAG_FAILED) { if (qc->flags & ATA_QCFLAG_FAILED) {
if (qc->result_tf.command & (ATA_ERR | ATA_DF)) if (qc->result_tf.status & (ATA_ERR | ATA_DF))
qc->err_mask |= AC_ERR_DEV; qc->err_mask |= AC_ERR_DEV;
if (!qc->err_mask) if (!qc->err_mask)
...@@ -1593,7 +1593,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, ...@@ -1593,7 +1593,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
if (qc->err_mask & ~AC_ERR_OTHER) if (qc->err_mask & ~AC_ERR_OTHER)
qc->err_mask &= ~AC_ERR_OTHER; qc->err_mask &= ~AC_ERR_OTHER;
} else if (qc->tf.command == ATA_CMD_REQ_SENSE_DATA) { } else if (qc->tf.command == ATA_CMD_REQ_SENSE_DATA) {
qc->result_tf.command |= ATA_SENSE; qc->result_tf.status |= ATA_SENSE;
} }
/* finish up */ /* finish up */
...@@ -1813,7 +1813,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, ...@@ -1813,7 +1813,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
return 0; return 0;
} }
if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) { if ((err_mask == AC_ERR_DEV) && (tf.error & ATA_ABORTED)) {
/* Device or controller might have reported /* Device or controller might have reported
* the wrong device class. Give a shot at the * the wrong device class. Give a shot at the
* other IDENTIFY if the current one is * other IDENTIFY if the current one is
...@@ -4375,7 +4375,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev, ...@@ -4375,7 +4375,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
/* A clean abort indicates an original or just out of spec drive /* A clean abort indicates an original or just out of spec drive
and we should continue as we issue the setup based on the and we should continue as we issue the setup based on the
drive reported working geometry */ drive reported working geometry */
if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED)) if (err_mask == AC_ERR_DEV && (tf.error & ATA_ABORTED))
err_mask = 0; err_mask = 0;
return err_mask; return err_mask;
......
...@@ -1386,7 +1386,7 @@ unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key) ...@@ -1386,7 +1386,7 @@ unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key)
err_mask = ata_exec_internal(dev, &tf, cdb, DMA_NONE, NULL, 0, 0); err_mask = ata_exec_internal(dev, &tf, cdb, DMA_NONE, NULL, 0, 0);
if (err_mask == AC_ERR_DEV) if (err_mask == AC_ERR_DEV)
*r_sense_key = tf.feature >> 4; *r_sense_key = tf.error >> 4;
return err_mask; return err_mask;
} }
...@@ -1429,12 +1429,12 @@ static void ata_eh_request_sense(struct ata_queued_cmd *qc, ...@@ -1429,12 +1429,12 @@ static void ata_eh_request_sense(struct ata_queued_cmd *qc,
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0); err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
/* Ignore err_mask; ATA_ERR might be set */ /* Ignore err_mask; ATA_ERR might be set */
if (tf.command & ATA_SENSE) { if (tf.status & ATA_SENSE) {
ata_scsi_set_sense(dev, cmd, tf.lbah, tf.lbam, tf.lbal); ata_scsi_set_sense(dev, cmd, tf.lbah, tf.lbam, tf.lbal);
qc->flags |= ATA_QCFLAG_SENSE_VALID; qc->flags |= ATA_QCFLAG_SENSE_VALID;
} else { } else {
ata_dev_warn(dev, "request sense failed stat %02x emask %x\n", ata_dev_warn(dev, "request sense failed stat %02x emask %x\n",
tf.command, err_mask); tf.status, err_mask);
} }
} }
...@@ -1557,7 +1557,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, ...@@ -1557,7 +1557,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
const struct ata_taskfile *tf) const struct ata_taskfile *tf)
{ {
unsigned int tmp, action = 0; unsigned int tmp, action = 0;
u8 stat = tf->command, err = tf->feature; u8 stat = tf->status, err = tf->error;
if ((stat & (ATA_BUSY | ATA_DRQ | ATA_DRDY)) != ATA_DRDY) { if ((stat & (ATA_BUSY | ATA_DRQ | ATA_DRDY)) != ATA_DRDY) {
qc->err_mask |= AC_ERR_HSM; qc->err_mask |= AC_ERR_HSM;
...@@ -1594,7 +1594,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, ...@@ -1594,7 +1594,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) { if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) {
tmp = atapi_eh_request_sense(qc->dev, tmp = atapi_eh_request_sense(qc->dev,
qc->scsicmd->sense_buffer, qc->scsicmd->sense_buffer,
qc->result_tf.feature >> 4); qc->result_tf.error >> 4);
if (!tmp) if (!tmp)
qc->flags |= ATA_QCFLAG_SENSE_VALID; qc->flags |= ATA_QCFLAG_SENSE_VALID;
else else
...@@ -2360,7 +2360,7 @@ static void ata_eh_link_report(struct ata_link *link) ...@@ -2360,7 +2360,7 @@ static void ata_eh_link_report(struct ata_link *link)
cmd->hob_feature, cmd->hob_nsect, cmd->hob_feature, cmd->hob_nsect,
cmd->hob_lbal, cmd->hob_lbam, cmd->hob_lbah, cmd->hob_lbal, cmd->hob_lbam, cmd->hob_lbah,
cmd->device, qc->tag, data_buf, cdb_buf, cmd->device, qc->tag, data_buf, cdb_buf,
res->command, res->feature, res->nsect, res->status, res->error, res->nsect,
res->lbal, res->lbam, res->lbah, res->lbal, res->lbam, res->lbah,
res->hob_feature, res->hob_nsect, res->hob_feature, res->hob_nsect,
res->hob_lbal, res->hob_lbam, res->hob_lbah, res->hob_lbal, res->hob_lbam, res->hob_lbah,
...@@ -2368,28 +2368,28 @@ static void ata_eh_link_report(struct ata_link *link) ...@@ -2368,28 +2368,28 @@ static void ata_eh_link_report(struct ata_link *link)
qc->err_mask & AC_ERR_NCQ ? " <F>" : ""); qc->err_mask & AC_ERR_NCQ ? " <F>" : "");
#ifdef CONFIG_ATA_VERBOSE_ERROR #ifdef CONFIG_ATA_VERBOSE_ERROR
if (res->command & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | if (res->status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ |
ATA_SENSE | ATA_ERR)) { ATA_SENSE | ATA_ERR)) {
if (res->command & ATA_BUSY) if (res->status & ATA_BUSY)
ata_dev_err(qc->dev, "status: { Busy }\n"); ata_dev_err(qc->dev, "status: { Busy }\n");
else else
ata_dev_err(qc->dev, "status: { %s%s%s%s%s}\n", ata_dev_err(qc->dev, "status: { %s%s%s%s%s}\n",
res->command & ATA_DRDY ? "DRDY " : "", res->status & ATA_DRDY ? "DRDY " : "",
res->command & ATA_DF ? "DF " : "", res->status & ATA_DF ? "DF " : "",
res->command & ATA_DRQ ? "DRQ " : "", res->status & ATA_DRQ ? "DRQ " : "",
res->command & ATA_SENSE ? "SENSE " : "", res->status & ATA_SENSE ? "SENSE " : "",
res->command & ATA_ERR ? "ERR " : ""); res->status & ATA_ERR ? "ERR " : "");
} }
if (cmd->command != ATA_CMD_PACKET && if (cmd->command != ATA_CMD_PACKET &&
(res->feature & (ATA_ICRC | ATA_UNC | ATA_AMNF | (res->error & (ATA_ICRC | ATA_UNC | ATA_AMNF | ATA_IDNF |
ATA_IDNF | ATA_ABORTED))) ATA_ABORTED)))
ata_dev_err(qc->dev, "error: { %s%s%s%s%s}\n", ata_dev_err(qc->dev, "error: { %s%s%s%s%s}\n",
res->feature & ATA_ICRC ? "ICRC " : "", res->error & ATA_ICRC ? "ICRC " : "",
res->feature & ATA_UNC ? "UNC " : "", res->error & ATA_UNC ? "UNC " : "",
res->feature & ATA_AMNF ? "AMNF " : "", res->error & ATA_AMNF ? "AMNF " : "",
res->feature & ATA_IDNF ? "IDNF " : "", res->error & ATA_IDNF ? "IDNF " : "",
res->feature & ATA_ABORTED ? "ABRT " : ""); res->error & ATA_ABORTED ? "ABRT " : "");
#endif #endif
} }
} }
......
...@@ -191,8 +191,8 @@ EXPORT_SYMBOL_GPL(ata_tf_to_fis); ...@@ -191,8 +191,8 @@ EXPORT_SYMBOL_GPL(ata_tf_to_fis);
void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf) void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf)
{ {
tf->command = fis[2]; /* status */ tf->status = fis[2];
tf->feature = fis[3]; /* error */ tf->error = fis[3];
tf->lbal = fis[4]; tf->lbal = fis[4];
tf->lbam = fis[5]; tf->lbam = fis[5];
...@@ -1406,8 +1406,8 @@ static int ata_eh_read_log_10h(struct ata_device *dev, ...@@ -1406,8 +1406,8 @@ static int ata_eh_read_log_10h(struct ata_device *dev,
*tag = buf[0] & 0x1f; *tag = buf[0] & 0x1f;
tf->command = buf[2]; tf->status = buf[2];
tf->feature = buf[3]; tf->error = buf[3];
tf->lbal = buf[4]; tf->lbal = buf[4];
tf->lbam = buf[5]; tf->lbam = buf[5];
tf->lbah = buf[6]; tf->lbah = buf[6];
...@@ -1482,7 +1482,7 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) ...@@ -1482,7 +1482,7 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)
qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48; qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
if (dev->class == ATA_DEV_ZAC && if (dev->class == ATA_DEV_ZAC &&
((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary)) { ((qc->result_tf.status & ATA_SENSE) || qc->result_tf.auxiliary)) {
char sense_key, asc, ascq; char sense_key, asc, ascq;
sense_key = (qc->result_tf.auxiliary >> 16) & 0xff; sense_key = (qc->result_tf.auxiliary >> 16) & 0xff;
......
...@@ -680,7 +680,7 @@ static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc) ...@@ -680,7 +680,7 @@ static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
*/ */
static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf) static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf)
{ {
u8 stat = tf->command, err = tf->feature; u8 stat = tf->status, err = tf->error;
if (stat & ATA_BUSY) { if (stat & ATA_BUSY) {
ata_port_warn(ap, "status=0x%02x {Busy} ", stat); ata_port_warn(ap, "status=0x%02x {Busy} ", stat);
...@@ -871,8 +871,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) ...@@ -871,8 +871,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
* onto sense key, asc & ascq. * onto sense key, asc & ascq.
*/ */
if (qc->err_mask || if (qc->err_mask ||
tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { tf->status & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature, ata_to_sense_error(qc->ap->print_id, tf->status, tf->error,
&sense_key, &asc, &ascq, verbose); &sense_key, &asc, &ascq, verbose);
ata_scsi_set_sense(qc->dev, cmd, sense_key, asc, ascq); ata_scsi_set_sense(qc->dev, cmd, sense_key, asc, ascq);
} else { } else {
...@@ -901,13 +901,13 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) ...@@ -901,13 +901,13 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
* Copy registers into sense buffer. * Copy registers into sense buffer.
*/ */
desc[2] = 0x00; desc[2] = 0x00;
desc[3] = tf->feature; /* == error reg */ desc[3] = tf->error;
desc[5] = tf->nsect; desc[5] = tf->nsect;
desc[7] = tf->lbal; desc[7] = tf->lbal;
desc[9] = tf->lbam; desc[9] = tf->lbam;
desc[11] = tf->lbah; desc[11] = tf->lbah;
desc[12] = tf->device; desc[12] = tf->device;
desc[13] = tf->command; /* == status reg */ desc[13] = tf->status;
/* /*
* Fill in Extend bit, and the high order bytes * Fill in Extend bit, and the high order bytes
...@@ -922,8 +922,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) ...@@ -922,8 +922,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
} }
} else { } else {
/* Fixed sense format */ /* Fixed sense format */
desc[0] = tf->feature; desc[0] = tf->error;
desc[1] = tf->command; /* status */ desc[1] = tf->status;
desc[2] = tf->device; desc[2] = tf->device;
desc[3] = tf->nsect; desc[3] = tf->nsect;
desc[7] = 0; desc[7] = 0;
...@@ -972,14 +972,14 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc) ...@@ -972,14 +972,14 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
* onto sense key, asc & ascq. * onto sense key, asc & ascq.
*/ */
if (qc->err_mask || if (qc->err_mask ||
tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { tf->status & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature, ata_to_sense_error(qc->ap->print_id, tf->status, tf->error,
&sense_key, &asc, &ascq, verbose); &sense_key, &asc, &ascq, verbose);
ata_scsi_set_sense(dev, cmd, sense_key, asc, ascq); ata_scsi_set_sense(dev, cmd, sense_key, asc, ascq);
} else { } else {
/* Could not decode error */ /* Could not decode error */
ata_dev_warn(dev, "could not decode error status 0x%x err_mask 0x%x\n", ata_dev_warn(dev, "could not decode error status 0x%x err_mask 0x%x\n",
tf->command, qc->err_mask); tf->status, qc->err_mask);
ata_scsi_set_sense(dev, cmd, ABORTED_COMMAND, 0, 0); ata_scsi_set_sense(dev, cmd, ABORTED_COMMAND, 0, 0);
return; return;
} }
...@@ -2473,7 +2473,7 @@ static void atapi_request_sense(struct ata_queued_cmd *qc) ...@@ -2473,7 +2473,7 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
/* fill these in, for the case where they are -not- overwritten */ /* fill these in, for the case where they are -not- overwritten */
cmd->sense_buffer[0] = 0x70; cmd->sense_buffer[0] = 0x70;
cmd->sense_buffer[2] = qc->tf.feature >> 4; cmd->sense_buffer[2] = qc->tf.error >> 4;
ata_qc_reinit(qc); ata_qc_reinit(qc);
......
...@@ -449,8 +449,8 @@ void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -449,8 +449,8 @@ void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
tf->command = ata_sff_check_status(ap); tf->status = ata_sff_check_status(ap);
tf->feature = ioread8(ioaddr->error_addr); tf->error = ioread8(ioaddr->error_addr);
tf->nsect = ioread8(ioaddr->nsect_addr); tf->nsect = ioread8(ioaddr->nsect_addr);
tf->lbal = ioread8(ioaddr->lbal_addr); tf->lbal = ioread8(ioaddr->lbal_addr);
tf->lbam = ioread8(ioaddr->lbam_addr); tf->lbam = ioread8(ioaddr->lbam_addr);
...@@ -1825,7 +1825,7 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present, ...@@ -1825,7 +1825,7 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present,
memset(&tf, 0, sizeof(tf)); memset(&tf, 0, sizeof(tf));
ap->ops->sff_tf_read(ap, &tf); ap->ops->sff_tf_read(ap, &tf);
err = tf.feature; err = tf.error;
if (r_err) if (r_err)
*r_err = err; *r_err = err;
......
...@@ -416,8 +416,8 @@ static void ep93xx_pata_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -416,8 +416,8 @@ static void ep93xx_pata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ep93xx_pata_data *drv_data = ap->host->private_data; struct ep93xx_pata_data *drv_data = ap->host->private_data;
tf->command = ep93xx_pata_check_status(ap); tf->status = ep93xx_pata_check_status(ap);
tf->feature = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_FEATURE); tf->error = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_FEATURE);
tf->nsect = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_NSECT); tf->nsect = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_NSECT);
tf->lbal = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAL); tf->lbal = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAL);
tf->lbam = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAM); tf->lbam = ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_LBAM);
......
...@@ -264,8 +264,8 @@ void ns87560_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -264,8 +264,8 @@ void ns87560_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
tf->command = ns87560_check_status(ap); tf->status = ns87560_check_status(ap);
tf->feature = ioread8(ioaddr->error_addr); tf->error = ioread8(ioaddr->error_addr);
tf->nsect = ioread8(ioaddr->nsect_addr); tf->nsect = ioread8(ioaddr->nsect_addr);
tf->lbal = ioread8(ioaddr->lbal_addr); tf->lbal = ioread8(ioaddr->lbal_addr);
tf->lbam = ioread8(ioaddr->lbam_addr); tf->lbam = ioread8(ioaddr->lbam_addr);
......
...@@ -382,7 +382,7 @@ static void octeon_cf_tf_read16(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -382,7 +382,7 @@ static void octeon_cf_tf_read16(struct ata_port *ap, struct ata_taskfile *tf)
void __iomem *base = ap->ioaddr.data_addr; void __iomem *base = ap->ioaddr.data_addr;
blob = __raw_readw(base + 0xc); blob = __raw_readw(base + 0xc);
tf->feature = blob >> 8; tf->error = blob >> 8;
blob = __raw_readw(base + 2); blob = __raw_readw(base + 2);
tf->nsect = blob & 0xff; tf->nsect = blob & 0xff;
...@@ -394,7 +394,7 @@ static void octeon_cf_tf_read16(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -394,7 +394,7 @@ static void octeon_cf_tf_read16(struct ata_port *ap, struct ata_taskfile *tf)
blob = __raw_readw(base + 6); blob = __raw_readw(base + 6);
tf->device = blob & 0xff; tf->device = blob & 0xff;
tf->command = blob >> 8; tf->status = blob >> 8;
if (tf->flags & ATA_TFLAG_LBA48) { if (tf->flags & ATA_TFLAG_LBA48) {
if (likely(ap->ioaddr.ctl_addr)) { if (likely(ap->ioaddr.ctl_addr)) {
......
...@@ -213,7 +213,7 @@ static void pata_s3c_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -213,7 +213,7 @@ static void pata_s3c_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
tf->feature = ata_inb(ap->host, ioaddr->error_addr); tf->error = ata_inb(ap->host, ioaddr->error_addr);
tf->nsect = ata_inb(ap->host, ioaddr->nsect_addr); tf->nsect = ata_inb(ap->host, ioaddr->nsect_addr);
tf->lbal = ata_inb(ap->host, ioaddr->lbal_addr); tf->lbal = ata_inb(ap->host, ioaddr->lbal_addr);
tf->lbam = ata_inb(ap->host, ioaddr->lbam_addr); tf->lbam = ata_inb(ap->host, ioaddr->lbam_addr);
......
...@@ -400,7 +400,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class, ...@@ -400,7 +400,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(link->device, &tf); ata_tf_init(link->device, &tf);
tf.command = ATA_BUSY; tf.status = ATA_BUSY;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
do { do {
......
...@@ -557,13 +557,13 @@ static void inic_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -557,13 +557,13 @@ static void inic_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
void __iomem *port_base = inic_port_base(ap); void __iomem *port_base = inic_port_base(ap);
tf->feature = readb(port_base + PORT_TF_FEATURE); tf->error = readb(port_base + PORT_TF_FEATURE);
tf->nsect = readb(port_base + PORT_TF_NSECT); tf->nsect = readb(port_base + PORT_TF_NSECT);
tf->lbal = readb(port_base + PORT_TF_LBAL); tf->lbal = readb(port_base + PORT_TF_LBAL);
tf->lbam = readb(port_base + PORT_TF_LBAM); tf->lbam = readb(port_base + PORT_TF_LBAM);
tf->lbah = readb(port_base + PORT_TF_LBAH); tf->lbah = readb(port_base + PORT_TF_LBAH);
tf->device = readb(port_base + PORT_TF_DEVICE); tf->device = readb(port_base + PORT_TF_DEVICE);
tf->command = readb(port_base + PORT_TF_COMMAND); tf->status = readb(port_base + PORT_TF_COMMAND);
} }
static bool inic_qc_fill_rtf(struct ata_queued_cmd *qc) static bool inic_qc_fill_rtf(struct ata_queued_cmd *qc)
...@@ -580,11 +580,11 @@ static bool inic_qc_fill_rtf(struct ata_queued_cmd *qc) ...@@ -580,11 +580,11 @@ static bool inic_qc_fill_rtf(struct ata_queued_cmd *qc)
*/ */
inic_tf_read(qc->ap, &tf); inic_tf_read(qc->ap, &tf);
if (!(tf.command & ATA_ERR)) if (!(tf.status & ATA_ERR))
return false; return false;
rtf->command = tf.command; rtf->status = tf.status;
rtf->feature = tf.feature; rtf->error = tf.error;
return true; return true;
} }
......
...@@ -394,8 +394,8 @@ static void sata_rcar_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -394,8 +394,8 @@ static void sata_rcar_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
tf->command = sata_rcar_check_status(ap); tf->status = sata_rcar_check_status(ap);
tf->feature = ioread32(ioaddr->error_addr); tf->error = ioread32(ioaddr->error_addr);
tf->nsect = ioread32(ioaddr->nsect_addr); tf->nsect = ioread32(ioaddr->nsect_addr);
tf->lbal = ioread32(ioaddr->lbal_addr); tf->lbal = ioread32(ioaddr->lbal_addr);
tf->lbam = ioread32(ioaddr->lbam_addr); tf->lbam = ioread32(ioaddr->lbam_addr);
......
...@@ -194,24 +194,24 @@ static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) ...@@ -194,24 +194,24 @@ static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf) static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
u16 nsect, lbal, lbam, lbah, feature; u16 nsect, lbal, lbam, lbah, error;
tf->command = k2_stat_check_status(ap); tf->status = k2_stat_check_status(ap);
tf->device = readw(ioaddr->device_addr); tf->device = readw(ioaddr->device_addr);
feature = readw(ioaddr->error_addr); error = readw(ioaddr->error_addr);
nsect = readw(ioaddr->nsect_addr); nsect = readw(ioaddr->nsect_addr);
lbal = readw(ioaddr->lbal_addr); lbal = readw(ioaddr->lbal_addr);
lbam = readw(ioaddr->lbam_addr); lbam = readw(ioaddr->lbam_addr);
lbah = readw(ioaddr->lbah_addr); lbah = readw(ioaddr->lbah_addr);
tf->feature = feature; tf->error = error;
tf->nsect = nsect; tf->nsect = nsect;
tf->lbal = lbal; tf->lbal = lbal;
tf->lbam = lbam; tf->lbam = lbam;
tf->lbah = lbah; tf->lbah = lbah;
if (tf->flags & ATA_TFLAG_LBA48) { if (tf->flags & ATA_TFLAG_LBA48) {
tf->hob_feature = feature >> 8; tf->hob_feature = error >> 8;
tf->hob_nsect = nsect >> 8; tf->hob_nsect = nsect >> 8;
tf->hob_lbal = lbal >> 8; tf->hob_lbal = lbal >> 8;
tf->hob_lbam = lbam >> 8; tf->hob_lbam = lbam >> 8;
......
...@@ -183,24 +183,24 @@ static void vsc_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) ...@@ -183,24 +183,24 @@ static void vsc_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
static void vsc_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf) static void vsc_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_ioports *ioaddr = &ap->ioaddr;
u16 nsect, lbal, lbam, lbah, feature; u16 nsect, lbal, lbam, lbah, error;
tf->command = ata_sff_check_status(ap); tf->status = ata_sff_check_status(ap);
tf->device = readw(ioaddr->device_addr); tf->device = readw(ioaddr->device_addr);
feature = readw(ioaddr->error_addr); error = readw(ioaddr->error_addr);
nsect = readw(ioaddr->nsect_addr); nsect = readw(ioaddr->nsect_addr);
lbal = readw(ioaddr->lbal_addr); lbal = readw(ioaddr->lbal_addr);
lbam = readw(ioaddr->lbam_addr); lbam = readw(ioaddr->lbam_addr);
lbah = readw(ioaddr->lbah_addr); lbah = readw(ioaddr->lbah_addr);
tf->feature = feature; tf->error = error;
tf->nsect = nsect; tf->nsect = nsect;
tf->lbal = lbal; tf->lbal = lbal;
tf->lbam = lbam; tf->lbam = lbam;
tf->lbah = lbah; tf->lbah = lbah;
if (tf->flags & ATA_TFLAG_LBA48) { if (tf->flags & ATA_TFLAG_LBA48) {
tf->hob_feature = feature >> 8; tf->hob_feature = error >> 8;
tf->hob_nsect = nsect >> 8; tf->hob_nsect = nsect >> 8;
tf->hob_lbal = lbal >> 8; tf->hob_lbal = lbal >> 8;
tf->hob_lbam = lbam >> 8; tf->hob_lbam = lbam >> 8;
......
...@@ -518,7 +518,10 @@ struct ata_taskfile { ...@@ -518,7 +518,10 @@ struct ata_taskfile {
u8 hob_lbam; u8 hob_lbam;
u8 hob_lbah; u8 hob_lbah;
u8 feature; union {
u8 error;
u8 feature;
};
u8 nsect; u8 nsect;
u8 lbal; u8 lbal;
u8 lbam; u8 lbam;
...@@ -526,7 +529,10 @@ struct ata_taskfile { ...@@ -526,7 +529,10 @@ struct ata_taskfile {
u8 device; u8 device;
u8 command; /* IO operation */ union {
u8 status;
u8 command;
};
u32 auxiliary; /* auxiliary field */ u32 auxiliary; /* auxiliary field */
/* from SATA 3.1 and */ /* from SATA 3.1 and */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册