From: mikem@beardog.cca.cpqcorp.net This patch addresses a bug in the ASIC on the 6400 series controllers. When prefetching from host memory we grab an extra 750 or so bytes of data. If this occurs on a memory boundary the machine will MCA. This bug affects IPF and Alpha based platforms. It is not known to be a problem on x86. Prefetch will be disabled via the f/w. We need to enable it on x86 to address a _big_ performance hit on RAID 1 operations. It is in the 2.4 tree. --- drivers/block/cciss.c | 11 +++++++++++ drivers/block/cciss_cmd.h | 1 + 2 files changed, 12 insertions(+) diff -puN drivers/block/cciss.c~cciss-05-ASIC-bug-workaround drivers/block/cciss.c --- 25/drivers/block/cciss.c~cciss-05-ASIC-bug-workaround 2004-02-04 20:21:45.000000000 -0800 +++ 25-akpm/drivers/block/cciss.c 2004-02-04 20:21:45.000000000 -0800 @@ -2277,6 +2277,17 @@ static int cciss_pci_init(ctlr_info_t *c printk("Does not appear to be a valid CISS config table\n"); return -1; } + +#ifdef CONFIG_X86 +{ + /* Need to enable prefetch in the SCSI core for 6400 in x86 */ + __u32 prefetch; + prefetch = readl(&(c->cfgtable->SCSI_Prefetch)); + prefetch |= 0x100; + writel(prefetch, &(c->cfgtable->SCSI_Prefetch)); +} +#endif + #ifdef CCISS_DEBUG printk("Trying to put board into Simple mode\n"); #endif /* CCISS_DEBUG */ diff -puN drivers/block/cciss_cmd.h~cciss-05-ASIC-bug-workaround drivers/block/cciss_cmd.h --- 25/drivers/block/cciss_cmd.h~cciss-05-ASIC-bug-workaround 2004-02-04 20:21:45.000000000 -0800 +++ 25-akpm/drivers/block/cciss_cmd.h 2004-02-04 20:21:45.000000000 -0800 @@ -265,6 +265,7 @@ typedef struct _CfgTable_struct { DWORD Reserved; BYTE ServerName[16]; DWORD HeartBeat; + DWORD SCSI_Prefetch; } CfgTable_struct; #pragma pack() #endif // CCISS_CMD_H _