pata_sis: add mode_filter method for certain sis5513 chipsets
This mirrors a very old commit (3160d5416f
, "sis5513: add
->udma_filter method for chipset_family >= ATA_133") to the old sis5513
IDE driver that prevents certain setups from working.
UDMA6 (ATA/133) is not supported on some chipsets and we need to ensure
this mode is not chosen even if a connected drive supports it. Port this
old patch forward to the new PATA driver to ensure UDMA5 is the highest
mode used if that is what is supported.
Kernel bugzilla #41582.
Reviewed-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Dan McGee <dpmcgee@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
023a0175ad
commit
f30f9a5e7b
@ -509,6 +509,27 @@ static void sis_133_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
|||||||
pci_write_config_dword(pdev, port, t1);
|
pci_write_config_dword(pdev, port, t1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sis_133_mode_filter - mode selection filter
|
||||||
|
* @adev: ATA device
|
||||||
|
*
|
||||||
|
* Block UDMA6 on devices that do not support it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned long sis_133_mode_filter(struct ata_device *adev, unsigned long mask)
|
||||||
|
{
|
||||||
|
struct ata_port *ap = adev->link->ap;
|
||||||
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
|
int port = sis_port_base(adev);
|
||||||
|
u32 t1;
|
||||||
|
|
||||||
|
pci_read_config_dword(pdev, port, &t1);
|
||||||
|
/* if ATA133 is disabled, mask it out */
|
||||||
|
if (!(t1 & 0x08))
|
||||||
|
mask &= ~(0xC0 << ATA_SHIFT_UDMA);
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
static struct scsi_host_template sis_sht = {
|
static struct scsi_host_template sis_sht = {
|
||||||
ATA_BMDMA_SHT(DRV_NAME),
|
ATA_BMDMA_SHT(DRV_NAME),
|
||||||
};
|
};
|
||||||
@ -530,6 +551,7 @@ static struct ata_port_operations sis_133_ops = {
|
|||||||
.set_piomode = sis_133_set_piomode,
|
.set_piomode = sis_133_set_piomode,
|
||||||
.set_dmamode = sis_133_set_dmamode,
|
.set_dmamode = sis_133_set_dmamode,
|
||||||
.cable_detect = sis_133_cable_detect,
|
.cable_detect = sis_133_cable_detect,
|
||||||
|
.mode_filter = sis_133_mode_filter,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ata_port_operations sis_133_early_ops = {
|
static struct ata_port_operations sis_133_early_ops = {
|
||||||
@ -779,10 +801,13 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
switch(trueid) {
|
switch(trueid) {
|
||||||
case 0x5518: /* SIS 962/963 */
|
case 0x5518: /* SIS 962/963 */
|
||||||
|
dev_info(&pdev->dev,
|
||||||
|
"SiS 962/963 MuTIOL IDE UDMA133 controller\n");
|
||||||
chipset = &sis133;
|
chipset = &sis133;
|
||||||
if ((idemisc & 0x40000000) == 0) {
|
if ((idemisc & 0x40000000) == 0) {
|
||||||
pci_write_config_dword(pdev, 0x54, idemisc | 0x40000000);
|
pci_write_config_dword(pdev, 0x54, idemisc | 0x40000000);
|
||||||
printk(KERN_INFO "SIS5513: Switching to 5513 register mapping\n");
|
dev_info(&pdev->dev,
|
||||||
|
"Switching to 5513 register mapping\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x0180: /* SIS 965/965L */
|
case 0x0180: /* SIS 965/965L */
|
||||||
|
Loading…
Reference in New Issue
Block a user