sis5513: fix PIO setup for ATAPI devices
authorBartlomiej Zolnierkiewicz <[email protected]>
Tue, 6 Oct 2009 14:46:05 +0000 (14:46 +0000)
committerDavid S. Miller <[email protected]>
Wed, 7 Oct 2009 11:07:17 +0000 (04:07 -0700)
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).

Signed-off-by: Bartlomiej Zolnierkiewicz <[email protected]>
Tested-by: David Fries <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
drivers/ide/sis5513.c

index afca22beaadfc3c279ed53693d31e0a98c48779c..3b88eba04c9c81fd33acd3f2b21196ac8a243a54 100644 (file)
@@ -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_drive_t *drive)
 
        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)