提交 2074a106 编写于 作者: A Alan Cox 提交者: Bartlomiej Zolnierkiewicz

ide/pci/serverworks.c: Fix corruption/timeouts with MegaIDE

It turns out from customer reports to Red Hat and some PCI dumps that the
MegaIDE in RAID mode doesn't provide the drive tuning data that the
serverworks driver expects but sometimes does provide something that
fools the code.

For the RAID class case skip the oem setup and don't trust the BIOS data.
We then tune from scratch and this sorts it out. (This has been confirmed
on an afflicted IBM blade)

[libata serverworks.c never trusts the BIOS in the first place so is
accidentally immune]
Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
上级 6c6a2a8d
...@@ -158,6 +158,12 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -158,6 +158,12 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
pci_read_config_word(dev, 0x4A, &csb5_pio); pci_read_config_word(dev, 0x4A, &csb5_pio);
pci_read_config_byte(dev, 0x54, &ultra_enable); pci_read_config_byte(dev, 0x54, &ultra_enable);
/* If we are in RAID mode (eg AMI MegaIDE) then we can't it
turns out trust the firmware configuration */
if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
goto oem_setup_failed;
/* Per Specified Design by OEM, and ASIC Architect */ /* Per Specified Design by OEM, and ASIC Architect */
if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) ||
(dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) { (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册