aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/ioat/dma_v3.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2009-11-19 19:07:10 -0500
committerDan Williams <dan.j.williams@intel.com>2009-11-19 19:07:10 -0500
commit228c4f5cfbf1cda411d9aa7204a612a63c89b1e8 (patch)
tree0920f900732ce598fef2cdc0c4899860534e837d /drivers/dma/ioat/dma_v3.c
parente22dde9904c2d26a522f1a2b89854a8238bf0933 (diff)
ioat3: dca and raid operations are incompatible
RAID operations cause a system hang on platforms with DCA (Direct-Cache-Access) enabled. So turn off RAID capabilities in this case. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/dma/ioat/dma_v3.c')
-rw-r--r--drivers/dma/ioat/dma_v3.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c
index 35d1e33afd5b..4f305f61f878 100644
--- a/drivers/dma/ioat/dma_v3.c
+++ b/drivers/dma/ioat/dma_v3.c
@@ -1117,6 +1117,7 @@ static int __devinit ioat3_dma_self_test(struct ioatdma_device *device)
1117int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca) 1117int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca)
1118{ 1118{
1119 struct pci_dev *pdev = device->pdev; 1119 struct pci_dev *pdev = device->pdev;
1120 int dca_en = system_has_dca_enabled(pdev);
1120 struct dma_device *dma; 1121 struct dma_device *dma;
1121 struct dma_chan *c; 1122 struct dma_chan *c;
1122 struct ioat_chan_common *chan; 1123 struct ioat_chan_common *chan;
@@ -1137,6 +1138,11 @@ int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca)
1137 dma->device_prep_dma_interrupt = ioat3_prep_interrupt_lock; 1138 dma->device_prep_dma_interrupt = ioat3_prep_interrupt_lock;
1138 1139
1139 cap = readl(device->reg_base + IOAT_DMA_CAP_OFFSET); 1140 cap = readl(device->reg_base + IOAT_DMA_CAP_OFFSET);
1141
1142 /* dca is incompatible with raid operations */
1143 if (dca_en && (cap & (IOAT_CAP_XOR|IOAT_CAP_PQ)))
1144 cap &= ~(IOAT_CAP_XOR|IOAT_CAP_PQ);
1145
1140 if (cap & IOAT_CAP_XOR) { 1146 if (cap & IOAT_CAP_XOR) {
1141 is_raid_device = true; 1147 is_raid_device = true;
1142 dma->max_xor = 8; 1148 dma->max_xor = 8;