From: Albert Lee <albertcc@tw.ibm.com>
To: Jeff Garzik <jeff@garzik.org>
Cc: Linux IDE <linux-ide@vger.kernel.org>, Doug Maxey <dwm@enoyolf.org>
Subject: [PATCH] libata: disable_irq() during polling IDENTIFY
Date: Mon, 07 May 2007 12:30:05 +0800 [thread overview]
Message-ID: <463EAB4D.3000309@tw.ibm.com> (raw)
Problem:
Kernel got "irq 5: nobody cared" when using
libata + polling IDENTIFY + Promise 20275 adapter + Benq DW1620 drive.
Detail message available in bug 8441 (http://bugzilla.kernel.org/show_bug.cgi?id=8441).
Cause:
The Benq DW1620 drive raises INTRQ during polling IDENTIFY PACKET DEVICE,
even if nIEN = 1.
Proposed fix:
disable_irq() during polling IDENTIFY to work around, the same as what IDE subsystem does.
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
---
Some controller like Intel ICH4 is immune from the problem, with the same kernel
and the same Benq DW1620 drive. So, adding the ATA_FLAG_IDENT_IRQ_OFF flag for
those adapters that needs the workaround. Patch against 2.6.21.1 for your review, thanks.
diff -Nrup linux-2.6.21.1-ori/drivers/ata/libata-core.c linux-2.6.21.1-mod2/drivers/ata/libata-core.c
--- linux-2.6.21.1-ori/drivers/ata/libata-core.c 2007-05-04 11:22:23.000000000 +0800
+++ linux-2.6.21.1-mod2/drivers/ata/libata-core.c 2007-05-07 11:00:02.000000000 +0800
@@ -1427,6 +1427,7 @@ int ata_dev_read_id(struct ata_device *d
unsigned int flags, u16 *id)
{
struct ata_port *ap = dev->ap;
+ struct ata_host *host = ap->host;
unsigned int class = *p_class;
struct ata_taskfile tf;
unsigned int err_mask = 0;
@@ -1466,8 +1467,29 @@ int ata_dev_read_id(struct ata_device *d
*/
tf.flags |= ATA_TFLAG_POLLING;
+ /* Disable IRQ since some devices like Benq DW1620 raises INTRQ
+ * when IDENTIFY PACKET DEVICE, even with polling IDENTIFY.
+ */
+ if (ap->flags & ATA_FLAG_IDENT_IRQ_OFF) {
+ if (host->irq)
+ disable_irq(host->irq);
+
+ if (host->irq2)
+ disable_irq(host->irq2);
+ }
+
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
id, sizeof(id[0]) * ATA_ID_WORDS);
+
+ /* Re-enable IRQ */
+ if (ap->flags & ATA_FLAG_IDENT_IRQ_OFF) {
+ if (host->irq)
+ enable_irq(host->irq);
+
+ if (host->irq2)
+ enable_irq(host->irq2);
+ }
+
if (err_mask) {
if (err_mask & AC_ERR_NODEV_HINT) {
DPRINTK("ata%u.%d: NODEV after polling detection\n",
diff -Nrup linux-2.6.21.1-ori/drivers/ata/pata_pdc2027x.c linux-2.6.21.1-mod2/drivers/ata/pata_pdc2027x.c
--- linux-2.6.21.1-ori/drivers/ata/pata_pdc2027x.c 2007-04-28 05:49:26.000000000 +0800
+++ linux-2.6.21.1-mod2/drivers/ata/pata_pdc2027x.c 2007-05-07 10:44:33.000000000 +0800
@@ -214,7 +214,7 @@ static struct ata_port_info pdc2027x_por
{
.sht = &pdc2027x_sht,
.flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS |
- ATA_FLAG_MMIO,
+ ATA_FLAG_MMIO | ATA_FLAG_IDENT_IRQ_OFF,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = ATA_UDMA5, /* udma0-5 */
@@ -224,7 +224,7 @@ static struct ata_port_info pdc2027x_por
{
.sht = &pdc2027x_sht,
.flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS |
- ATA_FLAG_MMIO,
+ ATA_FLAG_MMIO | ATA_FLAG_IDENT_IRQ_OFF,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = ATA_UDMA6, /* udma0-6 */
diff -Nrup linux-2.6.21.1-ori/include/linux/libata.h linux-2.6.21.1-mod2/include/linux/libata.h
--- linux-2.6.21.1-ori/include/linux/libata.h 2007-04-28 05:49:26.000000000 +0800
+++ linux-2.6.21.1-mod2/include/linux/libata.h 2007-05-07 12:25:05.000000000 +0800
@@ -174,6 +174,7 @@ enum {
ATA_FLAG_SETXFER_POLLING= (1 << 14), /* use polling for SETXFER */
ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */
ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */
+ ATA_FLAG_IDENT_IRQ_OFF = (1 << 17), /* disable irq when IDENTIFY */
/* The following flag belongs to ap->pflags but is kept in
* ap->flags because it's referenced in many LLDs and will be
next reply other threads:[~2007-05-07 4:30 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-07 4:30 Albert Lee [this message]
2007-05-07 7:43 ` [PATCH] libata: disable_irq() during polling IDENTIFY Tejun Heo
2007-05-07 11:18 ` Alan Cox
2007-05-07 11:32 ` Tejun Heo
2007-05-08 13:36 ` Mark Lord
2007-05-07 11:19 ` Albert Lee
2007-05-07 11:29 ` Tejun Heo
2007-05-07 11:54 ` Albert Lee
2007-05-07 12:01 ` Tejun Heo
2007-05-08 11:30 ` [PATCH] libata: disable_irq() during polling IDENTIFY (take 2) Albert Lee
2007-05-08 11:41 ` Tejun Heo
2007-05-08 12:00 ` Alan Cox
2007-05-08 12:01 ` Tejun Heo
2007-05-08 12:20 ` Alan Cox
2007-05-08 12:27 ` Tejun Heo
2007-05-08 12:43 ` Alan Cox
2007-05-08 12:45 ` Tejun Heo
2007-05-08 12:45 ` Alan Cox
2007-05-08 12:57 ` Tejun Heo
2007-05-08 14:59 ` Albert Lee
2007-05-08 15:16 ` Jeff Garzik
2007-05-11 7:20 ` [PATCH/RFC 0/7] libata: push part of irq driven pio to workqueue Albert Lee
2007-05-11 7:24 ` [PATCH 1/7] libata: set the state after "PIO data-in" to HSM_ST_IDLE instead of HSM_ST_LAST Albert Lee
2007-05-11 7:28 ` [PATCH 2/7] libata: move the ata_altstatus() in ata_hsm_qc_complete() Albert Lee
2007-05-11 7:30 ` [PATCH 3/7] libata: move ata_altstatus() out to the pio data xfer functions Albert Lee
2007-05-11 7:31 ` [PATCH 4/7] libata: move polling idle irq check to ata_host_intr() Albert Lee
2007-05-11 14:27 ` Tejun Heo
2007-05-11 15:25 ` Albert Lee
2007-05-11 7:35 ` [PATCH 5/7] libata: move and reduce locking to the pio data xfer functions Albert Lee
2007-05-11 14:37 ` Tejun Heo
2007-05-11 14:55 ` Alan Cox
2007-05-11 14:57 ` Tejun Heo
2007-05-11 15:12 ` Alan Cox
2007-05-11 15:14 ` Tejun Heo
2007-05-11 15:24 ` Alan Cox
2007-05-11 15:39 ` Alan Cox
2007-05-11 16:59 ` Tejun Heo
2007-05-11 17:46 ` Alan Cox
2007-05-11 17:53 ` Tejun Heo
2007-05-11 22:00 ` Alan Cox
2007-05-14 8:24 ` Tejun Heo
2007-05-14 11:29 ` Alan Cox
2007-05-11 15:48 ` Albert Lee
2007-05-11 17:06 ` Tejun Heo
2007-05-11 17:38 ` Alan Cox
2007-05-11 17:42 ` Tejun Heo
2007-05-11 17:07 ` Tejun Heo
2007-05-11 7:37 ` [PATCH 6/7] libata: push part of the irq driven pio out to workqueue Albert Lee
2007-05-11 7:41 ` [PATCH 7/7] libata: ack unexpected INTRQ when polling Albert Lee
2007-05-07 14:28 ` [PATCH] libata: disable_irq() during polling IDENTIFY Alan Cox
2007-05-08 13:42 ` Mark Lord
2007-05-08 13:57 ` Alan Cox
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=463EAB4D.3000309@tw.ibm.com \
--to=albertcc@tw.ibm.com \
--cc=albertl@mail.com \
--cc=dwm@enoyolf.org \
--cc=jeff@garzik.org \
--cc=linux-ide@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 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).