2.6.x libata updates
PATCH 1/1 2.6.x libata updates
(just driver updates)
Please do a
bk pull bk://gkernel.bkbits.net/libata-2.5
This will update the following files:
drivers/scsi/sata_sil.c | 125 ++++++++++++++++++++++++++++++++++++++++------ drivers/scsi/sata_svw.c | 129 ++++++++++++++++++++++++++---------------------- 2 files changed, 178 insertions(+), 76 deletions(-)
through these ChangeSets:
<[email protected]> (04/01/14 1.1474.88.10)
[libata sata_svw] cleanup, better probing
* use fewer magic numbers
* probe all 4 ports, using standard SATA SCRs
* limit udma mask to 0x3f
* clean up PPC-specific procfs stuff
<[email protected]> (04/01/14 1.1474.88.9)
[libata sata_sil] add pci id for Silicon Image 3512
<[email protected]> (04/01/14 1.1474.88.8)
[libata sata_sil] cleaner, better version of errata workarounds
No longer unfairly punishes non-errata Seagate and Maxtor drives.
<[email protected]> (04/01/06 1.1474.80.3)
[libata sata_sil] add support for adaptec 1210sa, 4-port sii 3114
<[email protected]> (04/01/06 1.1474.80.2)
[libata sata_svr] fix DRV_NAME to reflect actual driver filename
<[email protected]> (03/12/30 1.1474.65.1)
[libata sata_sil] unmask interrupts during initialization
Prudent in general, and needed for Adaptec BIOSes.
drivers/scsi/sata_sil.c +108 -17
@@ -34,11 +34,16 @@#include "hosts.h" #include <linux/libata.h> -#define DRV_NAME "ata_sil" -#define DRV_VERSION "0.51" +#define DRV_NAME "sata_sil" +#define DRV_VERSION "0.52"enum { sil_3112 =0 , + sil_3114 =1 , + +SIL_SYSCFG =0x48 , +SIL_MASK_IDE0_INT = (1 <<22 ), +SIL_MASK_IDE1_INT = (1 <<23 ),SIL_IDE0_TF =0x80 ,SIL_IDE0_CTL =0x8A ,
@@ -49,6 +54,19 @@SIL_IDE1_CTL =0xCA ,SIL_IDE1_BMDMA =0x08 ,SIL_IDE1_SCR =0x180 , + +SIL_IDE2_TF =0x280 , +SIL_IDE2_CTL =0x28A , +SIL_IDE2_BMDMA =0x200 , +SIL_IDE2_SCR =0x300 , + +SIL_IDE3_TF =0x2C0 , +SIL_IDE3_CTL =0x2CA , +SIL_IDE3_BMDMA =0x208 , +SIL_IDE3_SCR =0x380 , + +SIL_QUIRK_MOD15WRITE = (1 <<0 ), + SIL_QUIRK_UDMA5MAX = (1 << 1), }; static void sil_set_piomode (struct ata_port *ap, struct ata_device *adev,
@@ -62,9 +80,33 @@static struct pci_device_id sil_pci_tbl[] = { {0x1095 ,0x3112 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , sil_3112 }, + {0x1095 ,0x0240 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , sil_3112 }, + {0x1095 ,0x3512 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , sil_3112 }, + {0x1095 ,0x3114 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , sil_3114 }, { }/* terminate list */ }; + +/* TODO firmware versions should be added - eric */ +struct sil_drivelist { +const char * product; +unsigned int quirk; +} sil_blacklist [] = { + {"ST320012AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST330013AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST340017AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST360015AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST380023AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST3120023AS" ,SIL_QUIRK_MOD15WRITE }, + {"ST340014ASL" ,SIL_QUIRK_MOD15WRITE }, + {"ST360014ASL" ,SIL_QUIRK_MOD15WRITE }, + {"ST380011ASL" ,SIL_QUIRK_MOD15WRITE }, + {"ST3120022ASL" ,SIL_QUIRK_MOD15WRITE }, + {"ST3160021ASL" ,SIL_QUIRK_MOD15WRITE }, + {"Maxtor 4D060H3" ,SIL_QUIRK_UDMA5MAX }, + { } +}; +static struct pci_driver sil_pci_driver = { .name =DRV_NAME , .id_table = sil_pci_tbl,
@@ -120,6 +162,14 @@ .pio_mask = 0x03, /* pio3-4 */ .udma_mask = 0x7f, /* udma0-6; FIXME */ .port_ops = &sil_ops, + }, /* sil_3114 */ + { + .sht = &sil_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_SRST | ATA_FLAG_MMIO, + .pio_mask = 0x03, /* pio3-4 */ + .udma_mask = 0x7f, /* udma0-6; FIXME */ + .port_ops = &sil_ops, }, };
@@ -182,34 +232,52 @@* information on these errata, I will create a more exhaustive * list, and apply the fixups to only the specific * devices/hosts/firmwares that need it. +* +* 20040111 - Seagate drives affected by the Mod15Write bug are blacklisted +* The Maxtor quirk is in the blacklist, but I'm keeping the original +* pessimistic fix for the following reasons: +* - There seems to be less info on it, only one device gleaned off the +* Windows driver, maybe only one is affected. More info would be greatly +* appreciated. +* - But then again UDMA5 is hardly anything to complain about */ static void sil_dev_config (struct ata_port *ap,struct ata_device *dev) { +unsigned int n, quirks =0 ; +u32 class_rev =0 ;const char *s = &dev->product[0 ];unsigned int len =strnlen (s,sizeof (dev->product)); +pci_read_config_dword (ap->host_set->pdev,PCI_CLASS_REVISION , &class_rev); + class_rev &=0xff ; +/* ATAPI specifies that empty space is blank-filled; remove blanks */ while ((len >0 ) && (s[len -1 ] ==' ' )) len--; -/* limit to udma5 */ -if (!memcmp (s,"Maxtor " ,7 )) { -printk (KERN_INFO "ata%u(%u): applying pessimistic Maxtor errata fix\n" , +for (n =0 ; sil_blacklist[n].product; n++) +if (!memcmp (sil_blacklist[n].product, s, +strlen (sil_blacklist[n].product))) { + quirks = sil_blacklist[n].quirk; +break ; + } + +/* limit requests to 15 sectors */ +if ((class_rev <=0x01 ) && (quirks &SIL_QUIRK_MOD15WRITE )) { +printk (KERN_INFO "ata%u(%u): applying Seagate errata fix\n" , ap->id, dev->devno); - ap->udma_mask &=ATA_UDMA5 ; + ap->host->max_sectors =15 ; + ap->host->hostt->max_sectors =15 ;return ; } -/* limit requests to 15 sectors */ -if ((len >4 ) && (!memcmp (s,"ST" ,2 ))) { -if ((!memcmp (s + len -2 ,"AS" ,2 )) || - (!memcmp (s + len -3 ,"ASL" ,3 ))) { -printk (KERN_INFO "ata%u(%u): applying pessimistic Seagate errata fix\n" , - ap->id, dev->devno); - ap->host->max_sectors =15 ; - ap->host->hostt->max_sectors =15 ; -return ; - } +/* limit to udma5 */ +/* is this for (class_rev <= 0x01) only, too? */ +if (quirks &SIL_QUIRK_UDMA5MAX ) { +printk (KERN_INFO "ata%u(%u): applying Maxtor errata fix %s\n" , + ap->id, dev->devno, s); + ap->udma_mask &=ATA_UDMA5 ; +return ; } }
@@ -236,6 +304,7 @@unsigned long base;void *mmio_base;int rc; +u32 tmp;if (!printed_version++) printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -267,7 +336,7 @@ probe_ent->pdev = pdev; probe_ent->port_ops = sil_port_info[ent->driver_data].port_ops; probe_ent->sht = sil_port_info[ent->driver_data].sht; - probe_ent->n_ports =2 ; + probe_ent->n_ports = (ent->driver_data == sil_3114) ?4 :2 ; probe_ent->pio_mask = sil_port_info[ent->driver_data].pio_mask; probe_ent->udma_mask = sil_port_info[ent->driver_data].udma_mask; probe_ent->irq = pdev->irq;
@@ -295,6 +364,28 @@ probe_ent->port[1 ].bmdma_addr = base +SIL_IDE1_BMDMA ; probe_ent->port[1 ].scr_addr = base +SIL_IDE1_SCR ;ata_std_ports (&probe_ent->port[1 ]); + +/* make sure IDE0/1 interrupts are not masked */ + tmp =readl (mmio_base +SIL_SYSCFG ); +if (tmp & (SIL_MASK_IDE0_INT |SIL_MASK_IDE1_INT )) { + tmp &= ~(SIL_MASK_IDE0_INT |SIL_MASK_IDE1_INT ); +writel (tmp, mmio_base +SIL_SYSCFG ); +readl (mmio_base +SIL_SYSCFG );/* flush */ + } + +if (ent->driver_data == sil_3114) { + probe_ent->port[2 ].cmd_addr = base +SIL_IDE2_TF ; + probe_ent->port[2 ].ctl_addr = base +SIL_IDE2_CTL ; + probe_ent->port[2 ].bmdma_addr = base +SIL_IDE2_BMDMA ; + probe_ent->port[2 ].scr_addr = base +SIL_IDE2_SCR ; +ata_std_ports (&probe_ent->port[2 ]); + + probe_ent->port[3 ].cmd_addr = base +SIL_IDE3_TF ; + probe_ent->port[3 ].ctl_addr = base +SIL_IDE3_CTL ; + probe_ent->port[3 ].bmdma_addr = base +SIL_IDE3_BMDMA ; + probe_ent->port[3 ].scr_addr = base +SIL_IDE3_SCR ; +ata_std_ports (&probe_ent->port[3 ]); + }pci_set_master (pdev);
drivers/scsi/sata_svw.c +70 -59
214 lines not on this page · raw message