aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-11-16 22:06:21 -0500
committerTejun Heo <htejun@gmail.com>2006-12-03 03:56:24 -0500
commitea54763f8a7c51b9f8fcb14431812ae63fcbaf96 (patch)
tree913b24b4f58cec489e9939f4afbfe51f82f237a9 /drivers
parentf84e7e41e1b88547218a3c3b1eb528005e9afdb4 (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')
-rw-r--r--drivers/ata/libata-core.c6
-rw-r--r--drivers/ata/libata-sff.c3
-rw-r--r--drivers/ata/sata_sil.c5
3 files changed, 11 insertions, 3 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index b35fdcb104ec..7f53ea725bce 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4937,6 +4937,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
4937inline unsigned int ata_host_intr (struct ata_port *ap, 4937inline unsigned int ata_host_intr (struct ata_port *ap,
4938 struct ata_queued_cmd *qc) 4938 struct ata_queued_cmd *qc)
4939{ 4939{
4940 struct ata_eh_info *ehi = &ap->eh_info;
4940 u8 status, host_stat = 0; 4941 u8 status, host_stat = 0;
4941 4942
4942 VPRINTK("ata%u: protocol %d task_state %d\n", 4943 VPRINTK("ata%u: protocol %d task_state %d\n",
@@ -4997,6 +4998,11 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
4997 ap->ops->irq_clear(ap); 4998 ap->ops->irq_clear(ap);
4998 4999
4999 ata_hsm_move(ap, qc, status, 0); 5000 ata_hsm_move(ap, qc, status, 0);
5001
5002 if (unlikely(qc->err_mask) && (qc->tf.protocol == ATA_PROT_DMA ||
5003 qc->tf.protocol == ATA_PROT_ATAPI_DMA))
5004 ata_ehi_push_desc(ehi, "BMDMA stat 0x%x", host_stat);
5005
5000 return 1; /* irq handled */ 5006 return 1; /* irq handled */
5001 5007
5002idle_irq: 5008idle_irq:
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index a57de4a5aa45..95ff186f0ccd 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -743,7 +743,6 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
743 ata_reset_fn_t softreset, ata_reset_fn_t hardreset, 743 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
744 ata_postreset_fn_t postreset) 744 ata_postreset_fn_t postreset)
745{ 745{
746 struct ata_eh_context *ehc = &ap->eh_context;
747 struct ata_queued_cmd *qc; 746 struct ata_queued_cmd *qc;
748 unsigned long flags; 747 unsigned long flags;
749 int thaw = 0; 748 int thaw = 0;
@@ -763,8 +762,6 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
763 762
764 host_stat = ap->ops->bmdma_status(ap); 763 host_stat = ap->ops->bmdma_status(ap);
765 764
766 ata_ehi_push_desc(&ehc->i, "BMDMA stat 0x%x", host_stat);
767
768 /* BMDMA controllers indicate host bus error by 765 /* BMDMA controllers indicate host bus error by
769 * setting DMA_ERR bit and timing out. As it wasn't 766 * setting DMA_ERR bit and timing out. As it wasn't
770 * really a timeout event, adjust error mask and 767 * really a timeout event, adjust error mask and
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index f844a1faba18..7808d0369d91 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)
356 356
357static void sil_host_intr(struct ata_port *ap, u32 bmdma2) 357static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
358{ 358{
359 struct ata_eh_info *ehi = &ap->eh_info;
359 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); 360 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
360 u8 status; 361 u8 status;
361 362
@@ -428,6 +429,10 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
428 /* kick HSM in the ass */ 429 /* kick HSM in the ass */
429 ata_hsm_move(ap, qc, status, 0); 430 ata_hsm_move(ap, qc, status, 0);
430 431
432 if (unlikely(qc->err_mask) && (qc->tf.protocol == ATA_PROT_DMA ||
433 qc->tf.protocol == ATA_PROT_ATAPI_DMA))
434 ata_ehi_push_desc(ehi, "BMDMA2 stat 0x%x", bmdma2);
435
431 return; 436 return;
432 437
433 err_hsm: 438 err_hsm: