libata (SATA) driver update
Mainly for testing by Promise and nVIDIA users, but also includes a fix for a few lesser-used SCSI commands (that affect all SATA users).
See attached...
BK users:
bk pull bk://gkernel.bkbits.net/libata-2.6
This will update the following files:
drivers/scsi/libata-core.c | 91 ++++++++++++++++++++++++++++++++++++++++++-- drivers/scsi/libata-scsi.c | 8 +-- drivers/scsi/sata_nv.c | 45 ++++++++++++++++----- drivers/scsi/sata_promise.c | 12 ++++- 4 files changed, 135 insertions(+), 21 deletions(-)
through these ChangeSets:
Albert Lee:
o [libata] SCSI-to-ATA translation fixes
Andrew Chew:
o sata_nv: enable generic class support for future NVIDIA SATA
Jeff Garzik:
o [libata sata_promise] support Promise SATAII TX2/TX4 cards
o [libata] Remove CDROM drive from PATA DMA blacklist
o [libata] add DMA blacklist
drivers/scsi/libata-core.c +87 -4
@@ -1700,6 +1700,69 @@DPRINTK ("EXIT\n" ); } +static void ata_pr_blacklisted (struct ata_port *ap,struct ata_device *dev) +{ +printk (KERN_WARNING "ata%u: dev %u is on DMA blacklist, disabling DMA\n" , + ap->id, dev->devno); +} + +static const char * ata_dma_blacklist [] = { +"WDC AC11000H" , +"WDC AC22100H" , +"WDC AC32500H" , +"WDC AC33100H" , +"WDC AC31600H" , +"WDC AC32100H" , +"WDC AC23200L" , +"Compaq CRD-8241B" , +"CRD-8400B" , +"CRD-8480B" , +"CRD-8482B" , +"CRD-84" , +"SanDisk SDP3B" , +"SanDisk SDP3B-64" , +"SANYO CD-ROM CRD" , +"HITACHI CDR-8" , +"HITACHI CDR-8335" , +"HITACHI CDR-8435" , +"Toshiba CD-ROM XM-6202B" , +"CD-532E-A" , +"E-IDE CD-ROM CR-840" , +"CD-ROM Drive/F5A" , +"WPI CDD-820" , +"SAMSUNG CD-ROM SC-148C" , +"SAMSUNG CD-ROM SC" , +"SanDisk SDP3B-64" , +"SAMSUNG CD-ROM SN-124" , +"ATAPI CD-ROM DRIVE 40X MAXIMUM" , +"_NEC DV5800A" , +}; + +static int ata_dma_blacklisted (struct ata_port *ap,struct ata_device *dev) +{ +unsigned char model_num[40 ]; +char *s; +unsigned int len; +int i; + +ata_dev_id_string (dev->id, model_num,ATA_ID_PROD_OFS , +sizeof (model_num)); + s = &model_num[0 ]; + len =strnlen (s,sizeof (model_num)); + +/* ATAPI specifies that empty space is blank-filled; remove blanks */ +while ((len >0 ) && (s[len -1 ] ==' ' )) { + len--; + s[len] =0 ; + } + +for (i =0 ; i <ARRAY_SIZE (ata_dma_blacklist); i++) +if (!strncmp (ata_dma_blacklist[i], s, len)) +return 1 ; + +return 0 ; +} +static unsigned int ata_get_mode_mask (struct ata_port *ap,int shift) {struct ata_device *master, *slave;
@@ -1712,17 +1775,37 @@if (shift ==ATA_SHIFT_UDMA ) { mask = ap->udma_mask; -if (ata_dev_present (master)) +if (ata_dev_present (master)) { mask &= (master->id[ATA_ID_UDMA_MODES ] &0xff ); -if (ata_dev_present (slave)) +if (ata_dma_blacklisted (ap, master)) { + mask =0 ; +ata_pr_blacklisted (ap, master); + } + } +if (ata_dev_present (slave)) { mask &= (slave->id[ATA_ID_UDMA_MODES ] &0xff ); +if (ata_dma_blacklisted (ap, slave)) { + mask =0 ; +ata_pr_blacklisted (ap, slave); + } + } }else if (shift ==ATA_SHIFT_MWDMA ) { mask = ap->mwdma_mask; -if (ata_dev_present (master)) +if (ata_dev_present (master)) { mask &= (master->id[ATA_ID_MWDMA_MODES ] &0x07 ); -if (ata_dev_present (slave)) +if (ata_dma_blacklisted (ap, master)) { + mask =0 ; +ata_pr_blacklisted (ap, master); + } + } +if (ata_dev_present (slave)) { mask &= (slave->id[ATA_ID_MWDMA_MODES ] &0x07 ); +if (ata_dma_blacklisted (ap, slave)) { + mask =0 ; +ata_pr_blacklisted (ap, slave); + } + } }else if (shift ==ATA_SHIFT_PIO ) { mask = ap->pio_mask;
drivers/scsi/libata-scsi.c +4 -4
@@ -498,9 +498,9 @@ 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 +600,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 +10 -2
@@ -156,10 +156,16 @@ board_2037x }, {PCI_VENDOR_ID_PROMISE ,0x3376 ,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 +412,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 ));