Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 72747
b: refs/heads/master
c: cdeab11
h: refs/heads/master
i:
  72745: 0cdffaf
  72743: 35b8e8d
v: v3
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Oct 29, 2007
1 parent 2175b2f commit b30e200
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a9efacbad1a735ec410acb26c9de72be8efb33d5
refs/heads/master: cdeab1140799f09c5f728a5ff85e0bdfa5679cd2
46 changes: 19 additions & 27 deletions trunk/drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2219,6 +2219,25 @@ int ata_bus_probe(struct ata_port *ap)
tries[dev->devno] = ATA_PROBE_MAX_TRIES;

retry:
ata_link_for_each_dev(dev, &ap->link) {
/* If we issue an SRST then an ATA drive (not ATAPI)
* may change configuration and be in PIO0 timing. If
* we do a hard reset (or are coming from power on)
* this is true for ATA or ATAPI. Until we've set a
* suitable controller mode we should not touch the
* bus as we may be talking too fast.
*/
dev->pio_mode = XFER_PIO_0;

/* If the controller has a pio mode setup function
* then use it to set the chipset to rights. Don't
* touch the DMA setup as that will be dealt with when
* configuring devices.
*/
if (ap->ops->set_piomode)
ap->ops->set_piomode(ap, dev);
}

/* reset and determine device classes */
ap->ops->phy_reset(ap);

Expand All @@ -2234,12 +2253,6 @@ int ata_bus_probe(struct ata_port *ap)

ata_port_probe(ap);

/* after the reset the device state is PIO 0 and the controller
state is undefined. Record the mode */

ata_link_for_each_dev(dev, &ap->link)
dev->pio_mode = XFER_PIO_0;

/* read IDENTIFY page and configure devices. We have to do the identify
specific sequence bass-ackwards so that PDIAG- is released by
the slave device */
Expand Down Expand Up @@ -3272,8 +3285,6 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
unsigned long deadline)
{
struct ata_ioports *ioaddr = &ap->ioaddr;
struct ata_device *dev;
int i = 0;

DPRINTK("ata%u: bus reset via SRST\n", ap->print_id);

Expand All @@ -3284,25 +3295,6 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
udelay(20); /* FIXME: flush */
iowrite8(ap->ctl, ioaddr->ctl_addr);

/* If we issued an SRST then an ATA drive (not ATAPI)
* may have changed configuration and be in PIO0 timing. If
* we did a hard reset (or are coming from power on) this is
* true for ATA or ATAPI. Until we've set a suitable controller
* mode we should not touch the bus as we may be talking too fast.
*/

ata_link_for_each_dev(dev, &ap->link)
dev->pio_mode = XFER_PIO_0;

/* If the controller has a pio mode setup function then use
it to set the chipset to rights. Don't touch the DMA setup
as that will be dealt with when revalidating */
if (ap->ops->set_piomode) {
ata_link_for_each_dev(dev, &ap->link)
if (devmask & (1 << i++))
ap->ops->set_piomode(ap, dev);
}

/* wait a while before checking status */
ata_wait_after_reset(ap, deadline);

Expand Down
19 changes: 19 additions & 0 deletions trunk/drivers/ata/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -2083,6 +2083,25 @@ int ata_eh_reset(struct ata_link *link, int classify,

ata_eh_about_to_do(link, NULL, ehc->i.action & ATA_EH_RESET_MASK);

ata_link_for_each_dev(dev, link) {
/* If we issue an SRST then an ATA drive (not ATAPI)
* may change configuration and be in PIO0 timing. If
* we do a hard reset (or are coming from power on)
* this is true for ATA or ATAPI. Until we've set a
* suitable controller mode we should not touch the
* bus as we may be talking too fast.
*/
dev->pio_mode = XFER_PIO_0;

/* If the controller has a pio mode setup function
* then use it to set the chipset to rights. Don't
* touch the DMA setup as that will be dealt with when
* configuring devices.
*/
if (ap->ops->set_piomode)
ap->ops->set_piomode(ap, dev);
}

/* Determine which reset to use and record in ehc->i.action.
* prereset() may examine and modify it.
*/
Expand Down

0 comments on commit b30e200

Please sign in to comment.