linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tejun Heo <htejun@gmail.com>
To: albertl@mail.com
Cc: Jeff Garzik <jeff@garzik.org>,
	Linux IDE <linux-ide@vger.kernel.org>,
	Doug Maxey <dwm@enoyolf.org>,
	bzolnier@gmail.com, Alan Cox <alan@lxorguk.ukuu.org.uk>,
	Mark Lord <liml@rtr.ca>
Subject: Re: [PATCH] libata: disable_irq() during polling IDENTIFY
Date: Mon, 07 May 2007 09:43:53 +0200	[thread overview]
Message-ID: <463ED8B9.4060501@gmail.com> (raw)
In-Reply-To: <463EAB4D.3000309@tw.ibm.com>

[cc'ing Bartlomiej and Mark, hi]

Hello, Albert.

Albert Lee wrote:
> 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.

Aieeee...

> 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.

I guess piix is masking the interrupt at the host side.

Another interesting aspect is that the SATA spec says the device is
recommended to ignore nIEN while the controller is recommended to not
set nIEN when it sends FIS to the device.  ie. nIEN should be
implemented on the host controller.  I bet there are controllers out
there which doesn't do host-side masking and there will be more and more
devices which ignore nIEN, so we're likely to see similar problems on
SATA too.

> +	/* 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);
> +	}
> +

Yeap, this is how IDE deals with polling commands but I'm not sure how
it's supposed to work with PCI IRQ sharing.  Bartlomiej, can you
enlighten me here?

Also, this is a problem for not only IDENTIFY but all polling commands.

One solution I can think of is to let IRQ handler ack IRQ
unconditionally during polling commands - ie. just read the TF Status
register once and tell the IRQ subsystem that the IRQ is handled.  This
shouldn't affect the operation of polling as the only side effect of
reading Status is clearing pending IRQ && will give us a nice way to
deal with the SATA bridge chip which chokes on nIEN.  Considering the
sorry state of nIEN in SATA, I guess this might be the best way to deal
with this.

Albert, can you please test whether this works?  Modifying
ata_interrupt() such that it reads TF Status if ATA_TFLAG_POLLING should
do the trick.

Thanks.

-- 
tejun

  reply	other threads:[~2007-05-07  7:44 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-07  4:30 [PATCH] libata: disable_irq() during polling IDENTIFY Albert Lee
2007-05-07  7:43 ` Tejun Heo [this message]
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=463ED8B9.4060501@gmail.com \
    --to=htejun@gmail.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=albertl@mail.com \
    --cc=bzolnier@gmail.com \
    --cc=dwm@enoyolf.org \
    --cc=jeff@garzik.org \
    --cc=liml@rtr.ca \
    --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).