diff options
author | Tejun Heo <htejun@gmail.com> | 2006-11-17 12:06:21 +0900 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-12-03 17:56:24 +0900 |
commit | ea54763f8a7c51b9f8fcb14431812ae63fcbaf96 (patch) | |
tree | 913b24b4f58cec489e9939f4afbfe51f82f237a9 /drivers/ata/sata_sil.c | |
parent | f84e7e41e1b88547218a3c3b1eb528005e9afdb4 (diff) |
[PATCH] libata: move BMDMA host status recording from EH to interrupt handler
For certain errors, interrupt handler alter BMDMA host status before
entering EH (clears active and intr). Thus altered BMDMA host status
value is recorded by BMDMA EH and reported to user. Move BMDMA host
status recording from EH to interrupt handler.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/ata/sata_sil.c')
-rw-r--r-- | drivers/ata/sata_sil.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index f844a1faba1..7808d0369d9 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c @@ -356,6 +356,7 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) static void sil_host_intr(struct ata_port *ap, u32 bmdma2) { + struct ata_eh_info *ehi = &ap->eh_info; struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); u8 status; @@ -428,6 +429,10 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) /* kick HSM in the ass */ ata_hsm_move(ap, qc, status, 0); + if (unlikely(qc->err_mask) && (qc->tf.protocol == ATA_PROT_DMA || + qc->tf.protocol == ATA_PROT_ATAPI_DMA)) + ata_ehi_push_desc(ehi, "BMDMA2 stat 0x%x", bmdma2); + return; err_hsm: |