aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMike Miller (OS Dev) <mikem@beardog.cca.cpqcorp.net>2007-10-17 04:10:04 -0400
committerJens Axboe <jens.axboe@oracle.com>2007-10-17 04:10:04 -0400
commit8bf50f71cbfc7d043f0f135da72b3feefeaa0eb8 (patch)
tree0472a163acf62a47bd45ec16ab698dd63648cdeb /drivers
parent9e91fdb32d449a6b57f8236a793ae2f3df79b4d8 (diff)
cciss: disable DMA refetch on Smart Array P600
This patch disables DMA refetch in the PCI bridge. We have disabled DMA prefetch for quite some time. Testing with XEN revealed another ASIC bug. If dom0 resides on a P600 the board can can an MCA bi accessing invalid memory addresses. Apparently, we need to disable both prefetch and refetch. My understanding is a refetch operation should not occur but it is a valid thing to do if prefetched data is no longer available for whatever reason. Please consider this patch for inclusion. Signed-off-by: Mike Miller <mike.miller@hp.com> Signed-off-by: Alex Chiang <achiang@hp.com> -------------------------------------------------------------------------------- Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/cciss.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 3fb7e8bc436d..e330c26c5ad9 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -3035,15 +3035,20 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
3035 } 3035 }
3036#endif 3036#endif
3037 3037
3038 /* Disabling DMA prefetch for the P600 3038 /* Disabling DMA prefetch and refetch for the P600.
3039 * An ASIC bug may result in a prefetch beyond 3039 * An ASIC bug may result in accesses to invalid memory addresses.
3040 * physical memory. 3040 * We've disabled prefetch for some time now. Testing with XEN
3041 * kernels revealed a bug in the refetch if dom0 resides on a P600.
3041 */ 3042 */
3042 if(board_id == 0x3225103C) { 3043 if(board_id == 0x3225103C) {
3043 __u32 dma_prefetch; 3044 __u32 dma_prefetch;
3045 __u32 dma_refetch;
3044 dma_prefetch = readl(c->vaddr + I2O_DMA1_CFG); 3046 dma_prefetch = readl(c->vaddr + I2O_DMA1_CFG);
3045 dma_prefetch |= 0x8000; 3047 dma_prefetch |= 0x8000;
3046 writel(dma_prefetch, c->vaddr + I2O_DMA1_CFG); 3048 writel(dma_prefetch, c->vaddr + I2O_DMA1_CFG);
3049 pci_read_config_dword(pdev, PCI_COMMAND_PARITY, &dma_refetch);
3050 dma_refetch |= 0x1;
3051 pci_write_config_dword(pdev, PCI_COMMAND_PARITY, dma_refetch);
3047 } 3052 }
3048 3053
3049#ifdef CCISS_DEBUG 3054#ifdef CCISS_DEBUG