From 2e6c7d9b66e182ac3188c494ea94f797425fef05 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 19 Nov 2009 17:07:10 -0700 Subject: [PATCH] --- yaml --- r: 168857 b: refs/heads/master c: 228c4f5cfbf1cda411d9aa7204a612a63c89b1e8 h: refs/heads/master i: 168855: 00d17ceb8454d72056d2c3e9e8077d3bf8c76feb v: v3 --- [refs] | 2 +- trunk/drivers/dma/ioat/dca.c | 2 +- trunk/drivers/dma/ioat/dma_v3.c | 6 ++++++ trunk/drivers/dma/ioat/hw.h | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index a9d8592bdb92..6fa939e3eb4f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e22dde9904c2d26a522f1a2b89854a8238bf0933 +refs/heads/master: 228c4f5cfbf1cda411d9aa7204a612a63c89b1e8 diff --git a/trunk/drivers/dma/ioat/dca.c b/trunk/drivers/dma/ioat/dca.c index 14f0a782df44..abd9038e06b1 100644 --- a/trunk/drivers/dma/ioat/dca.c +++ b/trunk/drivers/dma/ioat/dca.c @@ -103,7 +103,7 @@ static int dca_enabled_in_bios(struct pci_dev *pdev) return res; } -static int system_has_dca_enabled(struct pci_dev *pdev) +int system_has_dca_enabled(struct pci_dev *pdev) { if (boot_cpu_has(X86_FEATURE_DCA)) return dca_enabled_in_bios(pdev); diff --git a/trunk/drivers/dma/ioat/dma_v3.c b/trunk/drivers/dma/ioat/dma_v3.c index 35d1e33afd5b..4f305f61f878 100644 --- a/trunk/drivers/dma/ioat/dma_v3.c +++ b/trunk/drivers/dma/ioat/dma_v3.c @@ -1117,6 +1117,7 @@ static int __devinit ioat3_dma_self_test(struct ioatdma_device *device) int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca) { struct pci_dev *pdev = device->pdev; + int dca_en = system_has_dca_enabled(pdev); struct dma_device *dma; struct dma_chan *c; struct ioat_chan_common *chan; @@ -1137,6 +1138,11 @@ int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca) dma->device_prep_dma_interrupt = ioat3_prep_interrupt_lock; cap = readl(device->reg_base + IOAT_DMA_CAP_OFFSET); + + /* dca is incompatible with raid operations */ + if (dca_en && (cap & (IOAT_CAP_XOR|IOAT_CAP_PQ))) + cap &= ~(IOAT_CAP_XOR|IOAT_CAP_PQ); + if (cap & IOAT_CAP_XOR) { is_raid_device = true; dma->max_xor = 8; diff --git a/trunk/drivers/dma/ioat/hw.h b/trunk/drivers/dma/ioat/hw.h index 99afb12bd409..60e675455b6a 100644 --- a/trunk/drivers/dma/ioat/hw.h +++ b/trunk/drivers/dma/ioat/hw.h @@ -39,6 +39,8 @@ #define IOAT_VER_3_0 0x30 /* Version 3.0 */ #define IOAT_VER_3_2 0x32 /* Version 3.2 */ +int system_has_dca_enabled(struct pci_dev *pdev); + struct ioat_dma_descriptor { uint32_t size; union {