aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/ioat.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/ioat.c')
-rw-r--r--drivers/dma/ioat.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c
index ae5817bfc015..f7276bf2fe7e 100644
--- a/drivers/dma/ioat.c
+++ b/drivers/dma/ioat.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Intel I/OAT DMA Linux driver 2 * Intel I/OAT DMA Linux driver
3 * Copyright(c) 2004 - 2007 Intel Corporation. 3 * Copyright(c) 2007 Intel Corporation.
4 * 4 *
5 * This program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License, 6 * under the terms and conditions of the GNU General Public License,
@@ -29,6 +29,7 @@
29#include <linux/module.h> 29#include <linux/module.h>
30#include <linux/pci.h> 30#include <linux/pci.h>
31#include <linux/interrupt.h> 31#include <linux/interrupt.h>
32#include <linux/dca.h>
32#include "ioatdma.h" 33#include "ioatdma.h"
33#include "ioatdma_registers.h" 34#include "ioatdma_registers.h"
34#include "ioatdma_hw.h" 35#include "ioatdma_hw.h"
@@ -49,6 +50,7 @@ struct ioat_device {
49 struct pci_dev *pdev; 50 struct pci_dev *pdev;
50 void __iomem *iobase; 51 void __iomem *iobase;
51 struct ioatdma_device *dma; 52 struct ioatdma_device *dma;
53 struct dca_provider *dca;
52}; 54};
53 55
54static int __devinit ioat_probe(struct pci_dev *pdev, 56static int __devinit ioat_probe(struct pci_dev *pdev,
@@ -57,6 +59,10 @@ static int __devinit ioat_probe(struct pci_dev *pdev,
57static void __devexit ioat_remove(struct pci_dev *pdev); 59static void __devexit ioat_remove(struct pci_dev *pdev);
58#endif 60#endif
59 61
62static int ioat_dca_enabled = 1;
63module_param(ioat_dca_enabled, int, 0644);
64MODULE_PARM_DESC(ioat_dca_enabled, "control support of dca service (default: 1)");
65
60static int ioat_setup_functionality(struct pci_dev *pdev, void __iomem *iobase) 66static int ioat_setup_functionality(struct pci_dev *pdev, void __iomem *iobase)
61{ 67{
62 struct ioat_device *device = pci_get_drvdata(pdev); 68 struct ioat_device *device = pci_get_drvdata(pdev);
@@ -67,6 +73,8 @@ static int ioat_setup_functionality(struct pci_dev *pdev, void __iomem *iobase)
67 switch (version) { 73 switch (version) {
68 case IOAT_VER_1_2: 74 case IOAT_VER_1_2:
69 device->dma = ioat_dma_probe(pdev, iobase); 75 device->dma = ioat_dma_probe(pdev, iobase);
76 if (ioat_dca_enabled)
77 device->dca = ioat_dca_init(pdev, iobase);
70 break; 78 break;
71 default: 79 default:
72 err = -ENODEV; 80 err = -ENODEV;
@@ -83,6 +91,13 @@ static void ioat_shutdown_functionality(struct pci_dev *pdev)
83 ioat_dma_remove(device->dma); 91 ioat_dma_remove(device->dma);
84 device->dma = NULL; 92 device->dma = NULL;
85 } 93 }
94
95 if (device->dca) {
96 unregister_dca_provider(device->dca);
97 free_dca_provider(device->dca);
98 device->dca = NULL;
99 }
100
86} 101}
87 102
88static struct pci_driver ioat_pci_drv = { 103static struct pci_driver ioat_pci_drv = {