From: Tejun Heo <tj@kernel.org>
To: Dustin Harrison <d.harrison@sutus.com>
Cc: Sagar Borikar <sagar.borikar@gmail.com>,
linux-ide@vger.kernel.org, Jeff Garzik <jgarzik@pobox.com>
Subject: Re: ata_check_status_mmio exception kernel panic
Date: Sat, 04 Apr 2009 13:58:52 +0900 [thread overview]
Message-ID: <49D6E90C.5030109@kernel.org> (raw)
In-Reply-To: <49D64DE0.8060400@sutus.com>
Hello,
Dustin Harrison wrote:
> I also run a MIPS platform and have seen this problem in 2.6.22. It
> stems from the Sil3512 (and possibly others) not allowing read
> access to the taskfile registers while a DMA transfer is active.
> What happens for me is that when DMA_ENABLE is true the Sil3512 (in
> my case) will disallow reads to the taskfile registers. So any
> event that triggers a port freeze during an interrupt while DMA is
> active causes a bus error to be thrown when the ata_check_status
> call fires.
Thanks a lot for diagnosing the problem.
> I cannot reproduce this on x86. I assume it handles the taskfile
> read error differently.
I think we just get 0xff on IO read errors.
> As a workaround I have used this patch on sata_sil.c to cover up the
> problem and stop the kernel panics. But I don't think this is the
> best approach.
>
> --- drivers/ata/sata_sil.c.orig 2009-04-01 18:15:55.000000000 -0700
> +++ drivers/ata/sata_sil.c 2009-04-03 10:51:56.000000000 -0700
> @@ -454,6 +454,23 @@
> err_hsm:
> qc->err_mask |= AC_ERR_HSM;
> freeze:
> +
> + /* Before we do a port freeze we need to ensure DMA_ENABLE is off.
> + * This is because the controller will not give us access to the
> taskfile
> + * registers while a DMA is in progress and ata_qc_complete is
> the first
> + * function executed in ata_port_freeze. ata_port_freeze will
> attempt to
> + * access the tf registers and give us a host bus error kernel
> panic.
> + *
> + * This code is repeated from ata_bmdma_stop because we may not
> have a
> + * valid qc to pass to ata_bmdma_stop.
> + */
> + iowrite8(ioread8(ap->ioaddr.bmdma_addr) & ~SIL_DMA_ENABLE,
> ap->ioaddr.bmdma_addr);
> +
> + /* According to ata_bmdma_stop, an HDMA transition requires on
> PIO cycle.
> + * But we can't read a taskfile register.
> + */
> + ioread8(ap->ioaddr.bmdma_addr)
> +
> ata_port_freeze(ap);
Can you please move the logic to sil_freeze() and see whether it
works? The freeze handler is supposed to put the controller into idle
(or at least not-crazy) state, so things like this fit there.
Thanks.
--
tejun
next prev parent reply other threads:[~2009-04-04 16:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-01 3:06 ata_check_status_mmio exception kernel panic Sagar Borikar
2009-04-01 3:08 ` Sagar Borikar
2009-04-01 3:37 ` Tejun Heo
2009-04-03 17:56 ` Dustin Harrison
2009-04-04 4:58 ` Tejun Heo [this message]
2009-04-07 2:59 ` Jeff Garzik
2009-04-04 16:00 ` Alan Cox
2009-04-07 3:02 ` Jeff Garzik
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=49D6E90C.5030109@kernel.org \
--to=tj@kernel.org \
--cc=d.harrison@sutus.com \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
--cc=sagar.borikar@gmail.com \
/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).