linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] libata: move BMDMA host status recording from EH to interrupt handler
@ 2006-11-17  3:06 Tejun Heo
  2006-11-17  3:07 ` [PATCH 2/2] libata: make sure IRQ is cleared after ata_bmdma_freeze() Tejun Heo
  2006-11-28  9:01 ` [PATCH 1/2] libata: move BMDMA host status recording from EH to interrupt handler Jeff Garzik
  0 siblings, 2 replies; 7+ messages in thread
From: Tejun Heo @ 2006-11-17  3:06 UTC (permalink / raw)
  To: Jeff Garzik, linux-ide

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>
---
 drivers/ata/libata-core.c |    6 ++++++
 drivers/ata/libata-sff.c  |    3 ---
 drivers/ata/sata_sil.c    |    5 +++++
 3 files changed, 11 insertions(+), 3 deletions(-)

Index: work/drivers/ata/sata_sil.c
===================================================================
--- work.orig/drivers/ata/sata_sil.c
+++ work/drivers/ata/sata_sil.c
@@ -356,6 +356,7 @@ static void sil_scr_write (struct ata_po
 
 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_por
 	/* 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:
Index: work/drivers/ata/libata-core.c
===================================================================
--- work.orig/drivers/ata/libata-core.c
+++ work/drivers/ata/libata-core.c
@@ -4862,6 +4862,7 @@ unsigned int ata_qc_issue_prot(struct at
 inline unsigned int ata_host_intr (struct ata_port *ap,
 				   struct ata_queued_cmd *qc)
 {
+	struct ata_eh_info *ehi = &ap->eh_info;
 	u8 status, host_stat = 0;
 
 	VPRINTK("ata%u: protocol %d task_state %d\n",
@@ -4922,6 +4923,11 @@ inline unsigned int ata_host_intr (struc
 	ap->ops->irq_clear(ap);
 
 	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, "BMDMA stat 0x%x", host_stat);
+
 	return 1;	/* irq handled */
 
 idle_irq:
Index: work/drivers/ata/libata-sff.c
===================================================================
--- work.orig/drivers/ata/libata-sff.c
+++ work/drivers/ata/libata-sff.c
@@ -743,7 +743,6 @@ void ata_bmdma_drive_eh(struct ata_port 
 			ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
 			ata_postreset_fn_t postreset)
 {
-	struct ata_eh_context *ehc = &ap->eh_context;
 	struct ata_queued_cmd *qc;
 	unsigned long flags;
 	int thaw = 0;
@@ -763,8 +762,6 @@ void ata_bmdma_drive_eh(struct ata_port 
 
 		host_stat = ap->ops->bmdma_status(ap);
 
-		ata_ehi_push_desc(&ehc->i, "BMDMA stat 0x%x", host_stat);
-
 		/* BMDMA controllers indicate host bus error by
 		 * setting DMA_ERR bit and timing out.  As it wasn't
 		 * really a timeout event, adjust error mask and

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2006-11-28  9:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-17  3:06 [PATCH 1/2] libata: move BMDMA host status recording from EH to interrupt handler Tejun Heo
2006-11-17  3:07 ` [PATCH 2/2] libata: make sure IRQ is cleared after ata_bmdma_freeze() Tejun Heo
2006-11-17  3:24   ` [PATCH 2/2 UPDATED] " Tejun Heo
2006-11-28  9:03     ` Jeff Garzik
2006-11-17  3:27   ` [PATCH 2/2] " Mark Lord
2006-11-17  3:44     ` Tejun Heo
2006-11-28  9:01 ` [PATCH 1/2] libata: move BMDMA host status recording from EH to interrupt handler Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).