Skip to contentSkip to conversation

two ide fixes for -rc4

PATCH In review Bartlomiej Zolnierkiewicz 5 participants 6 messages Oct 6, 2009 – Oct 10, 2009 libata

lore
Share & tools
lore
#0 lore raw

cover two ide fixes for -rc4

patch #1 fixes old bug in sis5513 (uncovered by 2.6.30 device probing changes but it could be also triggered in earlier kernels on warm-plug operation)

patch #2 reverts the recent incorrect revert

#1 lore raw

David, can you test these on the sis5513 system that had problems with the original pio0 mode setting?

Thanks,
Linus

Quoted 7 lines · Bartlomiej Zolnierkiewicz

patch #1 fixes old bug in sis5513 (uncovered by 2.6.30 device probing changes but it could be also triggered in earlier kernels on warm-plug operation)

patch #2 reverts the recent incorrect revert

#2 lore raw
Quoted 12 lines · On Wednesday 07 October 2009 00:35:24 Linus Torvalds wrote:

David, can you test these on the sis5513 system that had problems with the original pio0 mode setting?

Thanks,
Linus

Quoted 4 lines · Bartlomiej Zolnierkiewicz

patch #1 fixes old bug in sis5513 (uncovered by 2.6.30 device probing changes but it could be also triggered in earlier kernels on warm-plug operation)

patch #1 contained a stupid mistake preventing it from working (thanks to David Fries for letting me know quickly), I guess that is what one gets for the late night hacking..

The corrected version below, David please try it instead:

From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH take 2] sis5513: fix PIO setup for ATAPI devices

Clear prefetch setting before potentially (re-)enabling it in config_drive_art_rwp() so the transition of the device type on the port from ATA to ATAPI (i.e. during warm-plug operation) is handled correctly.

This is a really old bug (it probably goes back to very early days of the driver) but it was only affecting warm-plug operation until the recent "ide: try to use PIO Mode 0 during probe if possible" change (commit 6029336426a2b43e4bc6f4a84be8789a047d139e).

---
 drivers/ide/sis5513.c |   10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/ide/sis5513.c +6 -4
Index: b/drivers/ide/sis5513.c
===================================================================
@@ -2,7 +2,7 @@
  * Copyright (C) 1999-2000	Andre Hedrick <[email protected]>
  * Copyright (C) 2002		Lionel Bouton <[email protected]>, Maintainer
  * Copyright (C) 2003		Vojtech Pavlik <[email protected]>
- * Copyright (C) 2007		Bartlomiej Zolnierkiewicz
+ * Copyright (C) 2007-2009	Bartlomiej Zolnierkiewicz
  *
  * May be copied or modified under the terms of the GNU General Public License
  *
@@ -281,11 +281,13 @@ static void config_drive_art_rwp(ide_dri
 
 	pci_read_config_byte(dev, 0x4b, &reg4bh);
 
+	rw_prefetch = reg4bh & ~(0x11 << drive->dn);
+
 	if (drive->media == ide_disk)
-		rw_prefetch = 0x11 << drive->dn;
+		rw_prefetch |= 0x11 << drive->dn;
 
-	if ((reg4bh & (0x11 << drive->dn)) != rw_prefetch)
-		pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch);
+	if (reg4bh != rw_prefetch)
+		pci_write_config_byte(dev, 0x4b, rw_prefetch);
 }
 
 static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio)
#3 lore raw
Quoted 14 lines · Bartlomiej Zolnierkiewicz
Quoted 12 lines · On Wednesday 07 October 2009 00:35:24 Linus Torvalds wrote:

David, can you test these on the sis5513 system that had problems with the original pio0 mode setting?

Thanks,
Linus

Quoted 4 lines · Bartlomiej Zolnierkiewicz

patch #1 fixes old bug in sis5513 (uncovered by 2.6.30 device probing changes but it could be also triggered in earlier kernels on warm-plug operation)

Quoted 8 lines

patch #1 contained a stupid mistake preventing it from working (thanks to David Fries for letting me know quickly), I guess that is what one gets for the late night hacking..

The corrected version below, David please try it instead:

From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH take 2] sis5513: fix PIO setup for ATAPI devices

2.6.31 plus this patch fixed the hang on IDE initialization with the SIS5513.

That's with my testing mode, I'm rebuilding a kernel and will try some benchmarks tomorrow. I've been testing by hibernating to disk, booting the test kernel with a bad root and resume partition (so if it worked it wouldn't modify the suspended image), then rebooting to resume from disk with the good kernel. That let me more quickly bisect and test kernels, I just haven't ran this kernel much past the initialization is all.

Signature · 2 lines
David Fries <[email protected]>
http://fries.net/~david/ (PGP encryption key available)
#4 lore raw

From: David Fries <[email protected]>
Date: Tue, 6 Oct 2009 22:30:06 -0500

Quoted 9 lines · Bartlomiej Zolnierkiewicz
Quoted 4 lines

The corrected version below, David please try it instead:

From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH take 2] sis5513: fix PIO setup for ATAPI devices

2.6.31 plus this patch fixed the hang on IDE initialization with the SIS5513.

Quoted 7 lines

That's with my testing mode, I'm rebuilding a kernel and will try some benchmarks tomorrow. I've been testing by hibernating to disk, booting the test kernel with a bad root and resume partition (so if it worked it wouldn't modify the suspended image), then rebooting to resume from disk with the good kernel. That let me more quickly bisect and test kernels, I just haven't ran this kernel much past the initialization is all.

All applied, thanks everyone.

#5 lore raw
In reply to Bartlomiej Zolnierkiewicz

This latest patch (modifying only the SIS 5513 driver) WORKS FOR ME. :-)
- D. Stussy.

Quoted 21 lines · Bartlomiej Zolnierkiewicz

...

drivers/ide/sis5513.c +5 -3
@@ -281,11 +281,13 @@ static void config_drive_art_rwp(ide_dri
 
     pci_read_config_byte(dev, 0x4b, &reg4bh);
 
+    rw_prefetch = reg4bh & ~(0x11 << drive->dn);
+
     if (drive->media == ide_disk)
-        rw_prefetch = 0x11 << drive->dn;
+        rw_prefetch |= 0x11 << drive->dn;
 
-    if ((reg4bh & (0x11 << drive->dn)) != rw_prefetch)
-        pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch);
+    if (reg4bh != rw_prefetch)
+        pci_write_config_byte(dev, 0x4b, rw_prefetch);
 }
 
 static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio)