|
@@ -1727,7 +1727,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
|
|
|
|
|
/* sanity check */
|
|
|
rc = -EINVAL;
|
|
|
- reason = "device reports illegal type";
|
|
|
+ reason = "device reports invalid type";
|
|
|
|
|
|
if (class == ATA_DEV_ATA) {
|
|
|
if (!ata_id_is_ata(id) && !ata_id_is_cfa(id))
|
|
@@ -1900,6 +1900,13 @@ int ata_dev_configure(struct ata_device *dev)
|
|
|
if (ata_msg_probe(ap))
|
|
|
ata_dump_id(id);
|
|
|
|
|
|
+ /* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
|
|
|
+ ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
|
|
|
+ sizeof(fwrevbuf));
|
|
|
+
|
|
|
+ ata_id_c_string(dev->id, modelbuf, ATA_ID_PROD,
|
|
|
+ sizeof(modelbuf));
|
|
|
+
|
|
|
/* ATA-specific feature tests */
|
|
|
if (dev->class == ATA_DEV_ATA) {
|
|
|
if (ata_id_is_cfa(id)) {
|
|
@@ -1914,13 +1921,6 @@ int ata_dev_configure(struct ata_device *dev)
|
|
|
|
|
|
dev->n_sectors = ata_id_n_sectors(id);
|
|
|
|
|
|
- /* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
|
|
|
- ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
|
|
|
- sizeof(fwrevbuf));
|
|
|
-
|
|
|
- ata_id_c_string(dev->id, modelbuf, ATA_ID_PROD,
|
|
|
- sizeof(modelbuf));
|
|
|
-
|
|
|
if (dev->id[59] & 0x100)
|
|
|
dev->multi_count = dev->id[59] & 0xff;
|
|
|
|
|
@@ -2009,7 +2009,9 @@ int ata_dev_configure(struct ata_device *dev)
|
|
|
|
|
|
/* print device info to dmesg */
|
|
|
if (ata_msg_drv(ap) && print_info)
|
|
|
- ata_dev_printk(dev, KERN_INFO, "ATAPI, max %s%s\n",
|
|
|
+ ata_dev_printk(dev, KERN_INFO,
|
|
|
+ "ATAPI: %s, %s, max %s%s\n",
|
|
|
+ modelbuf, fwrevbuf,
|
|
|
ata_mode_string(xfer_mask),
|
|
|
cdb_intr_string);
|
|
|
}
|
|
@@ -3059,22 +3061,28 @@ static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* if device 1 was found in ata_devchk, wait for
|
|
|
- * register access, then wait for BSY to clear
|
|
|
+ /* if device 1 was found in ata_devchk, wait for register
|
|
|
+ * access briefly, then wait for BSY to clear.
|
|
|
*/
|
|
|
- while (dev1) {
|
|
|
- u8 nsect, lbal;
|
|
|
+ if (dev1) {
|
|
|
+ int i;
|
|
|
|
|
|
ap->ops->dev_select(ap, 1);
|
|
|
- nsect = ioread8(ioaddr->nsect_addr);
|
|
|
- lbal = ioread8(ioaddr->lbal_addr);
|
|
|
- if ((nsect == 1) && (lbal == 1))
|
|
|
- break;
|
|
|
- if (time_after(jiffies, deadline))
|
|
|
- return -EBUSY;
|
|
|
- msleep(50); /* give drive a breather */
|
|
|
- }
|
|
|
- if (dev1) {
|
|
|
+
|
|
|
+ /* Wait for register access. Some ATAPI devices fail
|
|
|
+ * to set nsect/lbal after reset, so don't waste too
|
|
|
+ * much time on it. We're gonna wait for !BSY anyway.
|
|
|
+ */
|
|
|
+ for (i = 0; i < 2; i++) {
|
|
|
+ u8 nsect, lbal;
|
|
|
+
|
|
|
+ nsect = ioread8(ioaddr->nsect_addr);
|
|
|
+ lbal = ioread8(ioaddr->lbal_addr);
|
|
|
+ if ((nsect == 1) && (lbal == 1))
|
|
|
+ break;
|
|
|
+ msleep(50); /* give drive a breather */
|
|
|
+ }
|
|
|
+
|
|
|
rc = ata_wait_ready(ap, deadline);
|
|
|
if (rc) {
|
|
|
if (rc != -ENODEV)
|
|
@@ -3769,6 +3777,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
|
{ "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA },
|
|
|
{ "SAMSUNG CD-ROM SN-124","N001", ATA_HORKAGE_NODMA },
|
|
|
{ "Seagate STT20000A", NULL, ATA_HORKAGE_NODMA },
|
|
|
+ { "IOMEGA ZIP 250 ATAPI", NULL, ATA_HORKAGE_NODMA }, /* temporary fix */
|
|
|
|
|
|
/* Weird ATAPI devices */
|
|
|
{ "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 |
|
|
@@ -3791,6 +3800,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
|
{ "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
|
|
|
{ "HTS541080G9SA00", "MB4OC60D", ATA_HORKAGE_NONCQ, },
|
|
|
{ "HTS541010G9SA00", "MBZOC60D", ATA_HORKAGE_NONCQ, },
|
|
|
+ /* Drives which do spurious command completion */
|
|
|
+ { "HTS541680J9SA00", "SB2IC7EP", ATA_HORKAGE_NONCQ, },
|
|
|
|
|
|
/* Devices with NCQ limits */
|
|
|
|
|
@@ -6313,7 +6324,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
|
|
|
/* init sata_spd_limit to the current value */
|
|
|
if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) {
|
|
|
int spd = (scontrol >> 4) & 0xf;
|
|
|
- ap->hw_sata_spd_limit &= (1 << spd) - 1;
|
|
|
+ if (spd)
|
|
|
+ ap->hw_sata_spd_limit &= (1 << spd) - 1;
|
|
|
}
|
|
|
ap->sata_spd_limit = ap->hw_sata_spd_limit;
|
|
|
|
|
@@ -6433,6 +6445,9 @@ int ata_host_activate(struct ata_host *host, int irq,
|
|
|
if (rc)
|
|
|
devm_free_irq(host->dev, irq, host);
|
|
|
|
|
|
+ /* Used to print device info at probe */
|
|
|
+ host->irq = irq;
|
|
|
+
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -6818,6 +6833,7 @@ EXPORT_SYMBOL_GPL(ata_check_status);
|
|
|
EXPORT_SYMBOL_GPL(ata_altstatus);
|
|
|
EXPORT_SYMBOL_GPL(ata_exec_command);
|
|
|
EXPORT_SYMBOL_GPL(ata_port_start);
|
|
|
+EXPORT_SYMBOL_GPL(ata_sff_port_start);
|
|
|
EXPORT_SYMBOL_GPL(ata_interrupt);
|
|
|
EXPORT_SYMBOL_GPL(ata_do_set_mode);
|
|
|
EXPORT_SYMBOL_GPL(ata_data_xfer);
|