From: Tejun Heo <htejun@gmail.com>
To: Jeff Garzik <jeff@garzik.org>
Cc: Art Haas <ahaas@airmail.net>, Alan Cox <alan@lxorguk.ukuu.org.uk>,
linux-ide@vger.kernel.org
Subject: [PATCH] ata_piix: fix pio/mwdma programming
Date: Fri, 25 May 2007 19:16:58 +0200 [thread overview]
Message-ID: <46571A0A.2030305@gmail.com> (raw)
In-Reply-To: <4655FDBF.3000401@gmail.com>
Fix various bugs in pio/mwdma mode programming.
* Control bits in the timing register wasn't cleared properly while
programming PIO mode.
* MWDMA mode programming cleared the wrong part of control bits.
* MWDMA mode programming cleared udma_mask even when the controller
doesn't support UDMA.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Art Haas <ahaas@airmail.net>
---
Patch is against libata-dev#upstream. Thanks.
drivers/ata/ata_piix.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 9c07b88..924e447 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -685,8 +685,14 @@ static void piix_set_piomode (struct ata
if (adev->class == ATA_DEV_ATA)
control |= 4; /* PPE enable */
+ /* PIO configuration clears DTE unconditionally. It will be
+ * programmed in set_dmamode which is guaranteed to be called
+ * after set_piomode if any DMA mode is available.
+ */
pci_read_config_word(dev, master_port, &master_data);
if (is_slave) {
+ /* clear TIME1|IE1|PPE1|DTE1 */
+ master_data &= 0xff0f;
/* Enable SITRE (seperate slave timing register) */
master_data |= 0x4000;
/* enable PPE1, IE1 and TIME1 as needed */
@@ -694,12 +700,14 @@ static void piix_set_piomode (struct ata
pci_read_config_byte(dev, slave_port, &slave_data);
slave_data &= (ap->port_no ? 0x0f : 0xf0);
/* Load the timing nibble for this slave */
- slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
+ slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
+ << (ap->port_no ? 4 : 0);
} else {
- /* Master keeps the bits in a different format */
- master_data &= 0xccf8;
+ /* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
+ master_data &= 0xccf0;
/* Enable PPE, IE and TIME as appropriate */
master_data |= control;
+ /* load ISP and RCT */
master_data |=
(timings[pio][0] << 12) |
(timings[pio][1] << 8);
@@ -816,7 +824,7 @@ static void do_pata_set_dmamode (struct
master_data &= 0xFF4F; /* Mask out IORDY|TIME1|DMAONLY */
master_data |= control << 4;
pci_read_config_byte(dev, 0x44, &slave_data);
- slave_data &= (0x0F + 0xE1 * ap->port_no);
+ slave_data &= (ap->port_no ? 0x0f : 0xf0);
/* Load the matching timing */
slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
pci_write_config_byte(dev, 0x44, slave_data);
@@ -828,8 +836,11 @@ static void do_pata_set_dmamode (struct
(timings[pio][0] << 12) |
(timings[pio][1] << 8);
}
- udma_enable &= ~(1 << devid);
- pci_write_config_word(dev, master_port, master_data);
+
+ if (ap->udma_mask) {
+ udma_enable &= ~(1 << devid);
+ pci_write_config_word(dev, master_port, master_data);
+ }
}
/* Don't scribble on 0x48 if the controller does not support UDMA */
if (ap->udma_mask)
next prev parent reply other threads:[~2007-05-25 17:17 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-02 15:18 [PATCH] ata_piix: fix pio/mwdma programming (for testing, don't apply) Tejun Heo
2007-02-02 15:34 ` Sergei Shtylyov
2007-02-02 16:38 ` Jeff Garzik
2007-02-02 16:57 ` Mark Lord
2007-02-02 18:34 ` Sergei Shtylyov
2007-02-02 16:41 ` Tejun Heo
2007-02-02 18:49 ` Alan
2007-02-02 19:04 ` Sergei Shtylyov
2007-02-02 17:42 ` Alan
2007-02-03 1:40 ` Tejun Heo
2007-02-03 20:04 ` Alan
2007-02-04 2:47 ` Tejun Heo
2007-02-02 21:14 ` Art Haas
2007-02-03 2:09 ` Tejun Heo
2007-02-03 14:35 ` Art Haas
2007-02-03 19:47 ` Mark Lord
2007-02-06 9:11 ` Tejun Heo
2007-02-06 16:33 ` Art Haas
2007-02-07 2:53 ` Tejun Heo
2007-02-07 19:35 ` Art Haas
2007-02-07 19:51 ` Mark Lord
2007-02-07 20:37 ` [PATCH] libata: clear TF before IDENTIFYing Tejun Heo
2007-02-08 14:56 ` Mark Lord
2007-02-13 19:38 ` Art Haas
2007-02-15 23:08 ` Jeff Garzik
2007-04-30 18:29 ` [PATCH] Fix pio/mwdma programming on ata_piix.c Art Haas
2007-05-01 3:02 ` Tejun Heo
2007-05-24 19:59 ` Art Haas
2007-05-24 20:55 ` Jeff Garzik
2007-05-24 21:03 ` Tejun Heo
2007-05-25 17:16 ` Tejun Heo [this message]
2007-05-25 18:05 ` [PATCH] ata_piix: fix pio/mwdma programming Alan Cox
2007-05-28 13: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=46571A0A.2030305@gmail.com \
--to=htejun@gmail.com \
--cc=ahaas@airmail.net \
--cc=alan@lxorguk.ukuu.org.uk \
--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 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.