aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2007-10-03 08:23:18 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:45 -0400
commit681c80b5d96076f447e8101ac4325c82d8dce508 (patch)
tree82cbcc887b5bbdd7c4ed48f38a3e97762cac98db
parent237d8440cb2b104a3b97fc971a9bce67960bb616 (diff)
libata: correct handling of SRST reset sequences
Correct handling of SRST reset sequences. After an SRST it is undefined whether the drive has gone back to PIO0. In order to talk safely we should talk slowly and carefully until we know. Thus when we do the reset if the controller has a pio setup method we call it to flip back to PIO 0 and a known state. After the reset completes the identify will then be done at the safe speed and the drive/controller will pick suitable faster modes and reconfigure the controller to these timings. As a side effect it means we force the controller to PIO 0 as we bring it up which fixes funnies on a few systems where the BIOS firmware leaves us in an interesting choice of modes, or embedded boxes with no firmware which come up in random states. For smart controllers there is nothing to do - they know about this internally. Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-core.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 1501d63db2cb..aecbdad960fb 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3209,6 +3209,8 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
3209 unsigned long deadline) 3209 unsigned long deadline)
3210{ 3210{
3211 struct ata_ioports *ioaddr = &ap->ioaddr; 3211 struct ata_ioports *ioaddr = &ap->ioaddr;
3212 struct ata_device *dev;
3213 int i = 0;
3212 3214
3213 DPRINTK("ata%u: bus reset via SRST\n", ap->print_id); 3215 DPRINTK("ata%u: bus reset via SRST\n", ap->print_id);
3214 3216
@@ -3219,6 +3221,25 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
3219 udelay(20); /* FIXME: flush */ 3221 udelay(20); /* FIXME: flush */
3220 iowrite8(ap->ctl, ioaddr->ctl_addr); 3222 iowrite8(ap->ctl, ioaddr->ctl_addr);
3221 3223
3224 /* If we issued an SRST then an ATA drive (not ATAPI)
3225 * may have changed configuration and be in PIO0 timing. If
3226 * we did a hard reset (or are coming from power on) this is
3227 * true for ATA or ATAPI. Until we've set a suitable controller
3228 * mode we should not touch the bus as we may be talking too fast.
3229 */
3230
3231 ata_link_for_each_dev(dev, &ap->link)
3232 dev->pio_mode = XFER_PIO_0;
3233
3234 /* If the controller has a pio mode setup function then use
3235 it to set the chipset to rights. Don't touch the DMA setup
3236 as that will be dealt with when revalidating */
3237 if (ap->ops->set_piomode) {
3238 ata_link_for_each_dev(dev, &ap->link)
3239 if (devmask & (1 << i++))
3240 ap->ops->set_piomode(ap, dev);
3241 }
3242
3222 /* spec mandates ">= 2ms" before checking status. 3243 /* spec mandates ">= 2ms" before checking status.
3223 * We wait 150ms, because that was the magic delay used for 3244 * We wait 150ms, because that was the magic delay used for
3224 * ATAPI devices in Hale Landis's ATADRVR, for the period of time 3245 * ATAPI devices in Hale Landis's ATADRVR, for the period of time