1) Fix ATAPI regression, noticed mainly on tape drives, due to a commit
which mistakenly changed an 'int' return type to a 'bool'. Broken by4dce8ba94c
. 2) Add Slimtype DVD A DS8A8SH ATAPI quirk 3) ata_piix: Intel Haswell platform quirk 4) Avoid DMA'ing to stack buffer, when obtaining DEVSLP timings. IMO a mild regression, given that libata previously did not DMA to a stack buffer. Broken by803739d2
. 5) Fix regression impacting SMART and smartd, broken by84a9a8cd9
. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.13 (GNU/Linux) iQIVAwUAUWMoWSWzCDIBeCsvAQIFDhAA1ISwRA0681bZiTfJskaRcHPy7HkFP3Df VRmfsqsoNignQVddAbrGpYYt27NASZsTycQ8TGAUkPVVGFm7w0BOj9abxzPvBCoC pg3rJaBHyfXjjLXxSDjk6HxqjnEsgwiIeXvx5vtUCuinfMTdDkJdIHIuIHhL2SzC x39GfCf3O+mtzHYxqTu4X7QXwirJFMsMG5/ZBa1RCVfFGzqzlVyQXeRlEGLZ6wmI YJHId0LKUUZhYURvmlqTVQm9PEu8WsgS0lNqhHkwrj87Qi3jSwDQW/RnHPwUf5gG VHZHGVVu5FRkrDZsGjYdvQyZd9oywcbCIL7oK2mGe4V8Vnxii1KHlI8x08YSOjYX ASY5koJivzyLrCcwIqIsfHvk1+D0yZUjhfQSAqhi509h8Tc9Ge6V83XmAhRXy3b5 nO/+b63qMYxAiMTJyIw7BRQcYpOiU/Nohi2ieGY4tUPw4aBhU61Hnmkhy/YME5P4 nhKZwfNquXXN71WCV+xnchRIuw08EN9zUaeG5vGGnXYKoiIrlId//eyVgtcerh3e lFiuOQAoAY6PIZsnMQU8Z2toL5yXFkLWxmNDYi7RIIai3yChOtxyMTuXEOSKPpG/ rgEy5p5lchhRXzqpC7KhU53uVA14ePPs6LIUoRNiqtGIf+B1nTjUYmKZPTPEzNA9 ftOvFkMHfmQ= =Jhsf -----END PGP SIGNATURE----- Merge tag 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Pull libata fixes from Jeff Garzik: "The HDIO_DRIVE_* fix is really the biggie. 1) Fix ATAPI regression, noticed mainly on tape drives, due to a commit which mistakenly changed an 'int' return type to a 'bool'. Broken by commit4dce8ba94c
("libata: Use 'bool' return value for ata_id_XXX") 2) Add Slimtype DVD A DS8A8SH ATAPI quirk 3) ata_piix: Intel Haswell platform quirk 4) Avoid DMA'ing to stack buffer, when obtaining DEVSLP timings. IMO a mild regression, given that libata previously did not DMA to a stack buffer. Broken by commit commit803739d25c
("[libata] replace sata_settings with devslp_timing") 5) Fix regression impacting SMART and smartd, broken by commit84a9a8cd9d
("[libata] Set proper SK when CK_COND is set")" * tag 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: [libata] Fix HDIO_DRIVE_* ioctl() Linux 3.9 regression libata: fix DMA to stack in reading devslp_timing parameters ata_piix: Fix DVD not dectected at some Haswell platforms libata: Set max sector to 65535 for Slimtype DVD A DS8A8SH drive libata: Use integer return value for atapi_command_packet_set
This commit is contained in:
commit
f465d40d85
|
@ -150,6 +150,7 @@ enum piix_controller_ids {
|
||||||
tolapai_sata,
|
tolapai_sata,
|
||||||
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
|
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
|
||||||
ich8_sata_snb,
|
ich8_sata_snb,
|
||||||
|
ich8_2port_sata_snb,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct piix_map_db {
|
struct piix_map_db {
|
||||||
|
@ -304,7 +305,7 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||||
/* SATA Controller IDE (Lynx Point) */
|
/* SATA Controller IDE (Lynx Point) */
|
||||||
{ 0x8086, 0x8c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
{ 0x8086, 0x8c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
||||||
/* SATA Controller IDE (Lynx Point) */
|
/* SATA Controller IDE (Lynx Point) */
|
||||||
{ 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
{ 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
|
||||||
/* SATA Controller IDE (Lynx Point) */
|
/* SATA Controller IDE (Lynx Point) */
|
||||||
{ 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
{ 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||||
/* SATA Controller IDE (Lynx Point-LP) */
|
/* SATA Controller IDE (Lynx Point-LP) */
|
||||||
|
@ -439,6 +440,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
|
||||||
[ich8m_apple_sata] = &ich8m_apple_map_db,
|
[ich8m_apple_sata] = &ich8m_apple_map_db,
|
||||||
[tolapai_sata] = &tolapai_map_db,
|
[tolapai_sata] = &tolapai_map_db,
|
||||||
[ich8_sata_snb] = &ich8_map_db,
|
[ich8_sata_snb] = &ich8_map_db,
|
||||||
|
[ich8_2port_sata_snb] = &ich8_2port_map_db,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_bits piix_enable_bits[] = {
|
static struct pci_bits piix_enable_bits[] = {
|
||||||
|
@ -1242,6 +1244,16 @@ static struct ata_port_info piix_port_info[] = {
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
.port_ops = &piix_sata_ops,
|
.port_ops = &piix_sata_ops,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[ich8_2port_sata_snb] =
|
||||||
|
{
|
||||||
|
.flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR
|
||||||
|
| PIIX_FLAG_PIO16,
|
||||||
|
.pio_mask = ATA_PIO4,
|
||||||
|
.mwdma_mask = ATA_MWDMA2,
|
||||||
|
.udma_mask = ATA_UDMA6,
|
||||||
|
.port_ops = &piix_sata_ops,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AHCI_PCI_BAR 5
|
#define AHCI_PCI_BAR 5
|
||||||
|
|
|
@ -2329,7 +2329,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||||
* from SATA Settings page of Identify Device Data Log.
|
* from SATA Settings page of Identify Device Data Log.
|
||||||
*/
|
*/
|
||||||
if (ata_id_has_devslp(dev->id)) {
|
if (ata_id_has_devslp(dev->id)) {
|
||||||
u8 sata_setting[ATA_SECT_SIZE];
|
u8 *sata_setting = ap->sector_buf;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
dev->flags |= ATA_DFLAG_DEVSLP;
|
dev->flags |= ATA_DFLAG_DEVSLP;
|
||||||
|
@ -2439,6 +2439,9 @@ int ata_dev_configure(struct ata_device *dev)
|
||||||
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
|
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
|
||||||
dev->max_sectors);
|
dev->max_sectors);
|
||||||
|
|
||||||
|
if (dev->horkage & ATA_HORKAGE_MAX_SEC_LBA48)
|
||||||
|
dev->max_sectors = ATA_MAX_SECTORS_LBA48;
|
||||||
|
|
||||||
if (ap->ops->dev_config)
|
if (ap->ops->dev_config)
|
||||||
ap->ops->dev_config(dev);
|
ap->ops->dev_config(dev);
|
||||||
|
|
||||||
|
@ -4100,6 +4103,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||||
/* Weird ATAPI devices */
|
/* Weird ATAPI devices */
|
||||||
{ "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
|
{ "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
|
||||||
{ "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA },
|
{ "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA },
|
||||||
|
{ "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 },
|
||||||
|
|
||||||
/* Devices we expect to fail diagnostics */
|
/* Devices we expect to fail diagnostics */
|
||||||
|
|
||||||
|
|
|
@ -532,8 +532,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||||
struct scsi_sense_hdr sshdr;
|
struct scsi_sense_hdr sshdr;
|
||||||
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
||||||
&sshdr);
|
&sshdr);
|
||||||
if (sshdr.sense_key == 0 &&
|
if (sshdr.sense_key == RECOVERED_ERROR &&
|
||||||
sshdr.asc == 0 && sshdr.ascq == 0)
|
sshdr.asc == 0 && sshdr.ascq == 0x1d)
|
||||||
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,8 +618,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||||
struct scsi_sense_hdr sshdr;
|
struct scsi_sense_hdr sshdr;
|
||||||
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
||||||
&sshdr);
|
&sshdr);
|
||||||
if (sshdr.sense_key == 0 &&
|
if (sshdr.sense_key == RECOVERED_ERROR &&
|
||||||
sshdr.asc == 0 && sshdr.ascq == 0)
|
sshdr.asc == 0 && sshdr.ascq == 0x1d)
|
||||||
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -954,7 +954,7 @@ static inline int atapi_cdb_len(const u16 *dev_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool atapi_command_packet_set(const u16 *dev_id)
|
static inline int atapi_command_packet_set(const u16 *dev_id)
|
||||||
{
|
{
|
||||||
return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
|
return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,6 +398,7 @@ enum {
|
||||||
ATA_HORKAGE_NOSETXFER = (1 << 14), /* skip SETXFER, SATA only */
|
ATA_HORKAGE_NOSETXFER = (1 << 14), /* skip SETXFER, SATA only */
|
||||||
ATA_HORKAGE_BROKEN_FPDMA_AA = (1 << 15), /* skip AA */
|
ATA_HORKAGE_BROKEN_FPDMA_AA = (1 << 15), /* skip AA */
|
||||||
ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */
|
ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */
|
||||||
|
ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */
|
||||||
|
|
||||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||||
renumber */
|
renumber */
|
||||||
|
|
Loading…
Reference in a new issue