All of lore.kernel.org
 help / color / mirror / Atom feed
From: Todd Inglett <tinglett@chartermi.net>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] IDE dma reset for sl82c105
Date: Mon, 17 Dec 2001 21:31:08 -0600	[thread overview]
Message-ID: <3C1EB87C.7090103@chartermi.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 816 bytes --]

I have found that the IDE controller on a w83c553f (a sl82c105 function) 
can get into a hung state if the interrupt line is wired to INTC and a 
timeout occurs.  The following patch implements a hard reset for the 
controller as documented in a Windbond engineering notice.

This patch needs some testing and there appears to be no maintainer for 
the sl83c105 IDE driver :(.  The conditions to repeat the problem are 
that the controller must be wired for PCI INTC, DMA must be in use, and 
a timeout error must occur (try mounting a music CD).  My fix checks for 
INTC configuration so hopefully this patch will only affect systems that 
exhibit the hang.  I have tested it on an IBM pSeries model 610 which 
has the hardware operating in this mode.

The patch should apply to 2.5.13 - 2.5.16 (at least).

-todd


[-- Attachment #2: sl82c105-reset.patch --]
[-- Type: text/plain, Size: 1160 bytes --]

--- drivers/ide/sl82c105.c	16 Aug 2001 13:50:23 -0000	1.3
+++ drivers/ide/sl82c105.c	17 Dec 2001 19:14:28 -0000
@@ -156,6 +156,29 @@
 }
 
 /*
+ * Reset the controller.
+ * If we are using INTC under a w83c553 we need to use a magic test
+ * bit to do this.  Return zero if successful (or applicable).
+ * 
+ */
+static int sl82c105_hard_reset(ide_drive_t *drive)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	struct pci_dev *dev = hwif->pci_dev;
+	unsigned int reg;
+
+	pci_read_config_dword(dev, 0x40, &reg);	/* LEGIRQ register */
+	if (reg & (1<<11)) {	/* Using INTC? */
+		printk("sl82c105: resetting device\n");
+		pci_read_config_dword(dev, 0x7e, &reg);
+		pci_write_config_word(dev, 0x7e, reg | (1<<2));
+		pci_write_config_word(dev, 0x7e, reg & (~(1<<2)));
+		return 0;
+	}
+	return 1;
+}
+
+/*
  * Our own dmaproc, only to intercept ide_dma_check
  */
 static int sl82c105_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
@@ -171,6 +194,11 @@
 	case ide_dma_off:
 		config_for_pio(drive, 4, 0);
 		break;
+	case ide_dma_lostirq:
+	case ide_dma_timeout:
+	        if (sl82c105_hard_reset(drive) == 0)
+			return 0;
+	        break;
 	default:
 		break;
 	}


             reply	other threads:[~2001-12-18  3:31 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-12-18  3:31 Todd Inglett [this message]
2001-12-18 10:16 ` [PATCH] IDE dma reset for sl82c105 Russell King
2001-12-18 14:00   ` Todd Inglett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3C1EB87C.7090103@chartermi.net \
    --to=tinglett@chartermi.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.