2.6.x libata fixes
PATCH 1/1 2.6.x libata fixes
Please do a
bk pull bk://gkernel.bkbits.net/libata-2.6
This will update the following files:
drivers/scsi/ahci.c | 2 drivers/scsi/libata-core.c | 187 ++++++++++++++++++++++++++++++++------------ drivers/scsi/libata-scsi.c | 35 ++++---- drivers/scsi/sata_nv.c | 45 ++++++++-- drivers/scsi/sata_promise.c | 14 ++- drivers/scsi/sata_sil.c | 1 include/linux/ata.h | 2 include/linux/libata.h | 2 8 files changed, 209 insertions(+), 79 deletions(-)
through these ChangeSets:
<jpaana:s2.org>:
o [libata sata_promise] add PCI ID for new SATAII TX2 card
<mkrikis:yahoo.com>:
o libata: fix ata_piix on ICH6R in RAID mode
<syntax:pa.net>:
o [libata sata_sil] add another Seagate drive to blacklist
Albert Lee:
o [libata] SCSI-to-ATA translation fixes
Andrew Chew:
o sata_nv: enable generic class support for future NVIDIA SATA
Brett Russ:
o [libata scsi] verify cmd bug fixes/support
Jeff Garzik:
o [libata ahci] Add support for ULi M5288
o [libata sata_promise] support Promise SATAII TX2/TX4 cards
o [libata] Remove CDROM drive from PATA DMA blacklist
o [libata] add DMA blacklist
Pete Zaitcev:
o [libata] fix probe object allocation bugs
drivers/scsi/ahci.c +2 -0
@@ -250,6 +250,8 @@ board_ahci }, /* ICH7R */ {PCI_VENDOR_ID_INTEL ,0x27c3 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_ahci }, /* ICH7R */ + { PCI_VENDOR_ID_AL, 0x5288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ULi M5288 */ { } /* terminate list */ };
drivers/scsi/libata-core.c +138 -49
270 lines not on this page · raw message
drivers/scsi/libata-scsi.c +20 -15
@@ -202,7 +202,7 @@ {0x40, MEDIUM_ERROR, 0x11, 0x04}, // Uncorrectable ECC error Unrecovered read error/* BBD - block marked bad */ {0x80, MEDIUM_ERROR, 0x11, 0x04}, // Block marked bad Medium error, unrecovered read error - {0xFF, 0xFF, 0xFF, 0xFF}, // END mark + {0xFF, 0xFF, 0xFF, 0xFF}, // END mark };static unsigned char stat_table[][4 ] = { /* Must be first because BUSY means no other bits valid */
@@ -210,22 +210,22 @@ {0x20, HARDWARE_ERROR, 0x00, 0x00}, // Device fault {0x08, ABORTED_COMMAND, 0x47, 0x00}, // Timed out in xfer, fake parity for now {0x04, RECOVERED_ERROR, 0x11, 0x00}, // Recovered ECC error Medium error, recovered - {0xFF, 0xFF, 0xFF, 0xFF}, // END mark + {0xFF, 0xFF, 0xFF, 0xFF}, // END mark };int i =0 ; cmd->result =SAM_STAT_CHECK_CONDITION ; - +/* * Is this an error we can process/parse */ - +if (drv_stat &ATA_ERR )/* Read the err bits */ err =ata_chk_err (qc->ap);/* Display the ATA level error info */ - +printk (KERN_WARNING "ata%u: status=0x%02x { " , qc->ap->id, drv_stat);if (drv_stat &0x80 ) {
@@ -242,7 +242,7 @@if (drv_stat &0x01 )printk ("Error " ); }printk ("}\n" ); - +if (err) {printk (KERN_WARNING "ata%u: error=0x%02x { " , qc->ap->id, err);
@@ -259,11 +259,11 @@if (err &0x02 )printk ("TrackZeroNotFound " );if (err &0x01 )printk ("AddrMarkNotFound " );printk ("}\n" ); - +/* Should we dump sector info here too ?? */ } - - + +/* Look for err */ while (sense_table[i][0 ] !=0xFF ) {
@@ -301,7 +301,7 @@/* No error ?? */ printk (KERN_ERR "ata%u: called with no error (%02X)!\n" , qc->ap->id, drv_stat);/* additional-sense-code[-qualifier] */ - + sb[0 ] =0x70 ; sb[2 ] =MEDIUM_ERROR ; sb[7 ] =0x0A ;
@@ -488,19 +488,24 @@ }if (lba48) { + tf->command =ATA_CMD_VERIFY_EXT ; + tf->hob_nsect = (n_sect >>8 ) &0xff ; tf->hob_lbah = (sect >>40 ) &0xff ; tf->hob_lbam = (sect >>32 ) &0xff ; tf->hob_lbal = (sect >>24 ) &0xff ; - }else + }else { + tf->command =ATA_CMD_VERIFY ; + tf->device |= (sect >>24 ) &0xf ; + } tf->nsect = n_sect &0xff ; - tf->hob_lbah = (sect >>16 ) &0xff ; - tf->hob_lbam = (sect >>8 ) &0xff ; - tf->hob_lbal = sect &0xff ; + tf->lbah = (sect >>16 ) &0xff ; + tf->lbam = (sect >>8 ) &0xff ; + tf->lbal = sect &0xff ;return 0 ; }
@@ -600,7 +605,7 @@return 1 ;/* stores LBA27:24 in lower 4 bits of device reg */ - tf->device |= scsicmd[2 ]; + tf->device |= scsicmd[6 ]; qc->nsect = scsicmd[13 ]; }
drivers/scsi/sata_nv.c +34 -11
133 lines not on this page · raw message
drivers/scsi/sata_promise.c +12 -2
@@ -156,10 +156,18 @@ board_2037x }, {PCI_VENDOR_ID_PROMISE ,0x3376 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_2037x }, + { PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_2037x }, + { PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_2037x }, + { PCI_VENDOR_ID_PROMISE, 0x3318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20319 }, { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20319 }, + { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_20319 }, + { } /* terminate list */ };
@@ -406,9 +414,11 @@return IRQ_NONE ; } -spin_lock (&host_set->lock); +spin_lock (&host_set->lock); + +writel (mask, mmio_base +PDC_INT_SEQMASK ); -for (i =0 ; i < host_set->n_ports; i++) { +for (i =0 ; i < host_set->n_ports; i++) {VPRINTK ("port %u\n" , i); ap = host_set->ports[i]; tmp = mask & (1 << (i +1 ));
drivers/scsi/sata_sil.c +1 -0
@@ -86,6 +86,7 @@ { "ST330013AS", SIL_QUIRK_MOD15WRITE }, { "ST340017AS", SIL_QUIRK_MOD15WRITE }, { "ST360015AS", SIL_QUIRK_MOD15WRITE }, + { "ST380013AS", SIL_QUIRK_MOD15WRITE }, { "ST380023AS", SIL_QUIRK_MOD15WRITE }, { "ST3120023AS", SIL_QUIRK_MOD15WRITE }, { "ST3160023AS", SIL_QUIRK_MOD15WRITE },
include/linux/ata.h +2 -0
@@ -123,6 +123,8 @@ATA_CMD_PIO_WRITE_EXT =0x34 ,ATA_CMD_SET_FEATURES =0xEF ,ATA_CMD_PACKET =0xA0 , +ATA_CMD_VERIFY =0x40 , +ATA_CMD_VERIFY_EXT =0x42 ,/* SETFEATURES stuff */ SETFEATURES_XFER = 0x03,
include/linux/libata.h +0 -2
@@ -436,8 +436,6 @@extern struct ata_probe_ent *ata_pci_init_native_mode (struct pci_dev *pdev,struct ata_port_info **port); -extern struct ata_probe_ent * -ata_pci_init_legacy_mode (struct pci_dev *pdev,struct ata_port_info **port);extern int pci_test_config_bits (struct pci_dev *pdev,struct pci_bits *bits);#endif /* CONFIG_PCI */