|
@@ -2631,100 +2631,6 @@ u8 ata_bmdma_status(struct ata_port *ap)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ata_bmdma_status);
|
|
|
|
|
|
-/**
|
|
|
- * ata_bus_reset - reset host port and associated ATA channel
|
|
|
- * @ap: port to reset
|
|
|
- *
|
|
|
- * This is typically the first time we actually start issuing
|
|
|
- * commands to the ATA channel. We wait for BSY to clear, then
|
|
|
- * issue EXECUTE DEVICE DIAGNOSTIC command, polling for its
|
|
|
- * result. Determine what devices, if any, are on the channel
|
|
|
- * by looking at the device 0/1 error register. Look at the signature
|
|
|
- * stored in each device's taskfile registers, to determine if
|
|
|
- * the device is ATA or ATAPI.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * PCI/etc. bus probe sem.
|
|
|
- * Obtains host lock.
|
|
|
- *
|
|
|
- * SIDE EFFECTS:
|
|
|
- * Sets ATA_FLAG_DISABLED if bus reset fails.
|
|
|
- *
|
|
|
- * DEPRECATED:
|
|
|
- * This function is only for drivers which still use old EH and
|
|
|
- * will be removed soon.
|
|
|
- */
|
|
|
-void ata_bus_reset(struct ata_port *ap)
|
|
|
-{
|
|
|
- struct ata_device *device = ap->link.device;
|
|
|
- struct ata_ioports *ioaddr = &ap->ioaddr;
|
|
|
- unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
|
|
|
- u8 err;
|
|
|
- unsigned int dev0, dev1 = 0, devmask = 0;
|
|
|
- int rc;
|
|
|
-
|
|
|
- DPRINTK("ENTER, host %u, port %u\n", ap->print_id, ap->port_no);
|
|
|
-
|
|
|
- /* determine if device 0/1 are present */
|
|
|
- if (ap->flags & ATA_FLAG_SATA_RESET)
|
|
|
- dev0 = 1;
|
|
|
- else {
|
|
|
- dev0 = ata_devchk(ap, 0);
|
|
|
- if (slave_possible)
|
|
|
- dev1 = ata_devchk(ap, 1);
|
|
|
- }
|
|
|
-
|
|
|
- if (dev0)
|
|
|
- devmask |= (1 << 0);
|
|
|
- if (dev1)
|
|
|
- devmask |= (1 << 1);
|
|
|
-
|
|
|
- /* select device 0 again */
|
|
|
- ap->ops->sff_dev_select(ap, 0);
|
|
|
-
|
|
|
- /* issue bus reset */
|
|
|
- if (ap->flags & ATA_FLAG_SRST) {
|
|
|
- rc = ata_bus_softreset(ap, devmask,
|
|
|
- ata_deadline(jiffies, 40000));
|
|
|
- if (rc && rc != -ENODEV)
|
|
|
- goto err_out;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * determine by signature whether we have ATA or ATAPI devices
|
|
|
- */
|
|
|
- device[0].class = ata_sff_dev_classify(&device[0], dev0, &err);
|
|
|
- if ((slave_possible) && (err != 0x81))
|
|
|
- device[1].class = ata_sff_dev_classify(&device[1], dev1, &err);
|
|
|
-
|
|
|
- /* is double-select really necessary? */
|
|
|
- if (device[1].class != ATA_DEV_NONE)
|
|
|
- ap->ops->sff_dev_select(ap, 1);
|
|
|
- if (device[0].class != ATA_DEV_NONE)
|
|
|
- ap->ops->sff_dev_select(ap, 0);
|
|
|
-
|
|
|
- /* if no devices were detected, disable this port */
|
|
|
- if ((device[0].class == ATA_DEV_NONE) &&
|
|
|
- (device[1].class == ATA_DEV_NONE))
|
|
|
- goto err_out;
|
|
|
-
|
|
|
- if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
|
|
|
- /* set up device control for ATA_FLAG_SATA_RESET */
|
|
|
- iowrite8(ap->ctl, ioaddr->ctl_addr);
|
|
|
- ap->last_ctl = ap->ctl;
|
|
|
- }
|
|
|
-
|
|
|
- DPRINTK("EXIT\n");
|
|
|
- return;
|
|
|
-
|
|
|
-err_out:
|
|
|
- ata_port_printk(ap, KERN_ERR, "disabling port\n");
|
|
|
- ata_port_disable(ap);
|
|
|
-
|
|
|
- DPRINTK("EXIT\n");
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(ata_bus_reset);
|
|
|
-
|
|
|
#ifdef CONFIG_PCI
|
|
|
|
|
|
/**
|