libata fixes
PATCH 1/1 libata fixes
These are upstream patches I collected while Jeff is away. Thanks.
* workaround for ATAPI tape drives
* detection/suspend workarounds for several laptops
* ICH8/9 port_enable fix
ata_piix controller ID reorganization is included to ease the fixes.
Please pull from 'upstream-linus' branch of master.kernel.org:/pub/scm/linux/kernel/git/tj/libata-dev.git upstream-linus
to receive the following updates:
drivers/ata/ata_piix.c | 87 ++++++++++++++++++++++++++++------------ drivers/ata/libata-core.c | 100 +++++++--------------------------------------- drivers/ata/libata-eh.c | 95 ------------------------------------------- drivers/ata/libata-scsi.c | 3 - drivers/ata/pata_sis.c | 1 include/linux/libata.h | 5 -- 6 files changed, 81 insertions(+), 210 deletions(-)
Adrian Bunk (1):
libata: remove unused functions
Albert Lee (2):
libata: workaround DRQ=1 ERR=1 for ATAPI tape drives
libata: use ATA_HORKAGE_STUCK_ERR for ATAPI tape drives
Gabriel C (1):
pata_sis.c: Add Packard Bell EasyNote K5305 to laptops
Mark Lord (1):
libata-scsi: be tolerant of 12-byte ATAPI commands in 16-byte CDBs
Tejun Heo (3):
ata_piix: add SATELLITE U205 to broken suspend list
ata_piix: reorganize controller IDs
ata_piix: port enable for the first SATA controller of ICH8 is 0xf not 0x3
Thomas Rohwer (1):
ata_piix: only enable the first port on apple macbook pro
drivers/ata/ata_piix.c +61 -26
@@ -119,18 +119,19 @@ enum {PIIX_80C_SEC = (1 <<7 ) | (1 <<6 ),/* controller IDs */ - piix_pata_33 =0 ,/* PIIX4 at 33Mhz */ - ich_pata_33 =1 ,/* ICH up to UDMA 33 only */ - ich_pata_66 =2 ,/* ICH up to 66 Mhz */ - ich_pata_100 =3 ,/* ICH up to UDMA 100 */ - ich5_sata =5 , - ich6_sata =6 , - ich6_sata_ahci =7 , - ich6m_sata_ahci =8 , - ich8_sata_ahci =9 , - piix_pata_mwdma =10 ,/* PIIX3 MWDMA only */ - tolapai_sata_ahci =11 , - ich9_2port_sata =12 , + piix_pata_mwdma =0 ,/* PIIX3 MWDMA only */ + piix_pata_33,/* PIIX4 at 33Mhz */ + ich_pata_33,/* ICH up to UDMA 33 only */ + ich_pata_66,/* ICH up to 66 Mhz */ + ich_pata_100,/* ICH up to UDMA 100 */ + ich5_sata, + ich6_sata, + ich6_sata_ahci, + ich6m_sata_ahci, + ich8_sata_ahci, + ich8_2port_sata, + ich8m_apple_sata_ahci,/* locks up on second port enable */ + tolapai_sata_ahci,/* constants for mapping table */ P0 = 0, /* port 0 */
@@ -239,19 +240,21 @@ static const struct pci_device_id piix_pci_tbl[] = {/* SATA Controller 1 IDE (ICH8) */ { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },/* SATA Controller 2 IDE (ICH8) */ - { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_2port_sata }, + { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },/* Mobile SATA Controller IDE (ICH8M) */ { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, +/* Mobile SATA Controller IDE (ICH8M), Apple */ + { 0x8086, 0x2828, 0x106b, 0x00a0, 0, 0, ich8m_apple_sata_ahci },/* SATA Controller IDE (ICH9) */ { 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },/* SATA Controller IDE (ICH9) */ - { 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_2port_sata }, + { 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },/* SATA Controller IDE (ICH9) */ - { 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_2port_sata }, + { 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },/* SATA Controller IDE (ICH9M) */ - { 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_2port_sata }, + { 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },/* SATA Controller IDE (ICH9M) */ - { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_2port_sata }, + { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },/* SATA Controller IDE (ICH9M) */ { 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, /* SATA Controller IDE (Tolapai) */
@@ -427,7 +430,7 @@ static const struct piix_map_db ich6m_map_db = {static const struct piix_map_db ich8_map_db = { .mask =0x3 , - .port_enable =0x3 , + .port_enable =0xf , .map = {/* PM PS SM SS MAP */ {P0 ,P2 ,P1 ,P3 },/* 00b (hardwired when in AHCI) */
@@ -437,7 +440,7 @@ static const struct piix_map_db ich8_map_db = { }, }; -static const struct piix_map_db tolapai_map_db = { +static const struct piix_map_db ich8_2port_map_db = { .mask =0x3 , .port_enable =0x3 , .map = {
@@ -449,7 +452,19 @@ static const struct piix_map_db tolapai_map_db = { }, }; -static const struct piix_map_db ich9_2port_map_db = { +static const struct piix_map_db ich8m_apple_map_db = { + .mask =0x3 , + .port_enable =0x1 , + .map = { +/* PM PS SM SS MAP */ + {P0 ,NA ,NA ,NA },/* 00b */ + {RV ,RV ,RV ,RV }, + {P0 ,P2 ,IDE ,IDE },/* 10b */ + {RV ,RV ,RV ,RV }, + }, +}; + +static const struct piix_map_db tolapai_map_db = { .mask =0x3 , .port_enable =0x3 , .map = {
@@ -467,11 +482,21 @@ static const struct piix_map_db *piix_map_db_table[] = { [ich6_sata_ahci] = &ich6_map_db, [ich6m_sata_ahci] = &ich6m_map_db, [ich8_sata_ahci] = &ich8_map_db, + [ich8_2port_sata] = &ich8_2port_map_db, + [ich8m_apple_sata_ahci] = &ich8m_apple_map_db, [tolapai_sata_ahci] = &tolapai_map_db, - [ich9_2port_sata] = &ich9_2port_map_db, };static struct ata_port_info piix_port_info[] = { + [piix_pata_mwdma] =/* PIIX3 MWDMA only */ + { + .sht = &piix_sht, + .flags =PIIX_PATA_FLAGS , + .pio_mask =0x1f ,/* pio0-4 */ + .mwdma_mask =0x06 ,/* mwdma1-2 ?? CHECK 0 should be ok but slow */ + .port_ops = &piix_pata_ops, + }, + [piix_pata_33] =/* PIIX4 at 33MHz */ { .sht = &piix_sht,
@@ -565,13 +590,15 @@ static struct ata_port_info piix_port_info[] = { .port_ops = &piix_sata_ops, }, - [piix_pata_mwdma] =/* PIIX3 MWDMA only */ + [ich8_2port_sata] = { .sht = &piix_sht, - .flags = PIIX_PATA_FLAGS, + .flags =PIIX_SATA_FLAGS |PIIX_FLAG_SCR | + PIIX_FLAG_AHCI, .pio_mask = 0x1f, /* pio0-4 */ - .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ - .port_ops = &piix_pata_ops, + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = ATA_UDMA6, + .port_ops = &piix_sata_ops, }, [tolapai_sata_ahci] =
@@ -585,7 +612,7 @@ static struct ata_port_info piix_port_info[] = { .port_ops = &piix_sata_ops, }, - [ich9_2port_sata] = + [ich8m_apple_sata_ahci] = { .sht = &piix_sht, .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SCR |
@@ -595,6 +622,7 @@ static struct ata_port_info piix_port_info[] = { .udma_mask = ATA_UDMA6, .port_ops = &piix_sata_ops, }, + }; static struct pci_bits piix_enable_bits[] = {
@@ -974,6 +1002,13 @@ static int piix_broken_suspend(void) }, }, { + .ident = "SATELLITE U205", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE U205"), + }, + }, + { .ident ="Portege M500" , .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
drivers/ata/libata-core.c +16 -84
131 lines not on this page · raw message
drivers/ata/libata-eh.c +0 -95
101 lines not on this page · raw message
drivers/ata/libata-scsi.c +2 -1
@@ -2869,7 +2869,8 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, xlat_func =NULL ;if (likely ((scsi_op !=ATA_16 ) || !atapi_passthru16)) {/* relay SCSI command to ATAPI device */ -if (unlikely (scmd->cmd_len > dev->cdb_len)) +int len =COMMAND_SIZE (scsi_op); +if (unlikely (len > scmd->cmd_len || len > dev->cdb_len)) goto bad_cdb_len; xlat_func = atapi_xlat;
drivers/ata/pata_sis.c +1 -0
@@ -55,6 +55,7 @@ static const struct sis_laptop sis_laptop[] = {/* devid, subvendor, subdev */ { 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */ { 0x5513, 0x1734, 0x105F }, /* FSC Amilo A1630 */ + { 0x5513, 0x1071, 0x8640 }, /* EasyNote K5305 *//* end marker */ { 0, } };
include/linux/libata.h +1 -4
@@ -340,6 +340,7 @@ enum {ATA_HORKAGE_HPA_SIZE = (1 <<6 ),/* native size off by one */ ATA_HORKAGE_IPM = (1 <<7 ),/* Link PM problems */ ATA_HORKAGE_IVB = (1 <<8 ),/* cbl det validity bit bugs */ + ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET *//* DMA mask for user DMA control: User visible values; DO NOT renumber */
@@ -771,8 +772,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)extern void sata_print_link_status (struct ata_link *link);extern void ata_port_probe (struct ata_port *); -extern void __sata_phy_reset (struct ata_port *ap); -extern void sata_phy_reset (struct ata_port *ap);extern void ata_bus_reset (struct ata_port *ap);extern int sata_set_spd (struct ata_link *link); extern int sata_link_debounce(struct ata_link *link,
@@ -994,8 +993,6 @@ extern void sata_pmp_do_eh(struct ata_port *ap,/* * EH */ -extern void ata_eng_timeout (struct ata_port *ap); -extern void ata_port_schedule_eh (struct ata_port *ap);extern int ata_link_abort (struct ata_link *link);extern int ata_port_abort (struct ata_port *ap);
Quoted 34 lines · Tejun Heo
These are upstream patches I collected while Jeff is away. Thanks.
* workaround for ATAPI tape drives
* detection/suspend workarounds for several laptops
* ICH8/9port_enablefix
ata_piixcontroller ID reorganization is included to ease the fixes.Please pull from 'upstream-linus' branch of master.kernel.org:/pub/scm/linux/kernel/git/tj/libata-dev.git upstream-linus
to receive the following updates:
drivers/ata/ata_piix.c | 87 ++++++++++++++++++++++++++++------------ drivers/ata/libata-core.c | 100 +++++++--------------------------------------- drivers/ata/libata-eh.c | 95 ------------------------------------------- drivers/ata/libata-scsi.c | 3 - drivers/ata/pata_sis.c | 1 include/linux/libata.h | 5 -- 6 files changed, 81 insertions(+), 210 deletions(-)Adrian Bunk (1):
libata: remove unused functionsAlbert Lee (2):
libata: workaround DRQ=1 ERR=1 for ATAPI tape drives
libata: useATA_HORKAGE_STUCK_ERRfor ATAPI tape drivesGabriel C (1):
pata_sis.c: Add Packard Bell EasyNote K5305 to laptopsMark Lord (1):
libata-scsi: be tolerant of 12-byte ATAPI commands in 16-byte CDBs
Quoted 7 lines
Tejun Heo (3):
ata_piix: add SATELLITE U205 to broken suspend list
ata_piix: reorganize controller IDs
ata_piix: port enable for the first SATA controller of ICH8 is0xfnot0x3Thomas Rohwer (1):
ata_piix: only enable the first port on apple macbook pro
Just to make sure, I pulled this into #upstream-fixes. If Linus already picked it up, great. Otherwise I'll make sure it goes upstream.
Jeff