--- serverworks.c 2002-08-02 17:39:44.000000000 -0700 +++ /home/duncan/cvs/linux-2.4/drivers/ide/serverworks.c 2003-04-23 16:37:45.000000000 -0700 @@ -100,6 +100,12 @@ #include #include +const char *bad_ata100[] = { + "ST340016A", + "ST380021A", + NULL +}; + static struct pci_dev *bmide_dev; static byte svwks_revision = 0; @@ -107,6 +113,14 @@ extern int (*svwks_display_info)(char *, char **, off_t, int); /* ide-proc.c */ extern char *ide_media_verbose(ide_drive_t *); +static int check_in_drive_lists (ide_drive_t *drive, const char **list) +{ + while (*list) + if (!strcmp(*list++, drive->id->model)) + return 1; + return 0; +} + static int svwks_get_info (char *buffer, char **addr, off_t offset, int count) { char *p = buffer; @@ -420,7 +434,8 @@ int ultra100 = (ultra66 && svwks_revision >= SVWKS_CSB5_REVISION_NEW) ? 1 : 0; byte speed; - if ((id->dma_ultra & 0x0020) && (udma_66) && (ultra100)) { + if ((id->dma_ultra & 0x0020) && (udma_66) && (ultra100) && + !check_in_drive_lists(drive, bad_ata100)) { speed = XFER_UDMA_5; } else if (id->dma_ultra & 0x0010) { speed = ((udma_66) && (ultra66)) ? XFER_UDMA_4 : XFER_UDMA_2;