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

_