diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-03-10 14:42:11 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-03-10 14:42:11 -0500 |
commit | 8448f0119a4309ef9626cf8e2dc5abb881e6dc2a (patch) | |
tree | e71e959bd5eec178c38273e3ccff30e7905b6e07 /arch | |
parent | 8054c3634cb3cb9d426c8ade934389213b857858 (diff) | |
parent | 3d74a539ae07a8f3c061332e426fc07b2310cf05 (diff) |
Merge branch 'stable/pcifront-fixes' into stable/irq.cleanup
* stable/pcifront-fixes:
pci/xen: When free-ing MSI-X/MSI irq->desc also use generic code.
pci/xen: Cleanup: convert int** to int[]
pci/xen: Use xen_allocate_pirq_msi instead of xen_allocate_pirq
xen-pcifront: Sanity check the MSI/MSI-X values
xen-pcifront: don't use flush_scheduled_work()
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/xen/pci.h | 8 | ||||
-rw-r--r-- | arch/x86/pci/xen.c | 13 |
2 files changed, 12 insertions, 9 deletions
diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h index 2329b3eaf8d3..aa8620989162 100644 --- a/arch/x86/include/asm/xen/pci.h +++ b/arch/x86/include/asm/xen/pci.h | |||
@@ -27,16 +27,16 @@ static inline void __init xen_setup_pirqs(void) | |||
27 | * its own functions. | 27 | * its own functions. |
28 | */ | 28 | */ |
29 | struct xen_pci_frontend_ops { | 29 | struct xen_pci_frontend_ops { |
30 | int (*enable_msi)(struct pci_dev *dev, int **vectors); | 30 | int (*enable_msi)(struct pci_dev *dev, int vectors[]); |
31 | void (*disable_msi)(struct pci_dev *dev); | 31 | void (*disable_msi)(struct pci_dev *dev); |
32 | int (*enable_msix)(struct pci_dev *dev, int **vectors, int nvec); | 32 | int (*enable_msix)(struct pci_dev *dev, int vectors[], int nvec); |
33 | void (*disable_msix)(struct pci_dev *dev); | 33 | void (*disable_msix)(struct pci_dev *dev); |
34 | }; | 34 | }; |
35 | 35 | ||
36 | extern struct xen_pci_frontend_ops *xen_pci_frontend; | 36 | extern struct xen_pci_frontend_ops *xen_pci_frontend; |
37 | 37 | ||
38 | static inline int xen_pci_frontend_enable_msi(struct pci_dev *dev, | 38 | static inline int xen_pci_frontend_enable_msi(struct pci_dev *dev, |
39 | int **vectors) | 39 | int vectors[]) |
40 | { | 40 | { |
41 | if (xen_pci_frontend && xen_pci_frontend->enable_msi) | 41 | if (xen_pci_frontend && xen_pci_frontend->enable_msi) |
42 | return xen_pci_frontend->enable_msi(dev, vectors); | 42 | return xen_pci_frontend->enable_msi(dev, vectors); |
@@ -48,7 +48,7 @@ static inline void xen_pci_frontend_disable_msi(struct pci_dev *dev) | |||
48 | xen_pci_frontend->disable_msi(dev); | 48 | xen_pci_frontend->disable_msi(dev); |
49 | } | 49 | } |
50 | static inline int xen_pci_frontend_enable_msix(struct pci_dev *dev, | 50 | static inline int xen_pci_frontend_enable_msix(struct pci_dev *dev, |
51 | int **vectors, int nvec) | 51 | int vectors[], int nvec) |
52 | { | 52 | { |
53 | if (xen_pci_frontend && xen_pci_frontend->enable_msix) | 53 | if (xen_pci_frontend && xen_pci_frontend->enable_msix) |
54 | return xen_pci_frontend->enable_msix(dev, vectors, nvec); | 54 | return xen_pci_frontend->enable_msix(dev, vectors, nvec); |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 2a12f3dbdd02..8634e1b49c03 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
@@ -150,21 +150,21 @@ static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
150 | return -ENOMEM; | 150 | return -ENOMEM; |
151 | 151 | ||
152 | if (type == PCI_CAP_ID_MSIX) | 152 | if (type == PCI_CAP_ID_MSIX) |
153 | ret = xen_pci_frontend_enable_msix(dev, &v, nvec); | 153 | ret = xen_pci_frontend_enable_msix(dev, v, nvec); |
154 | else | 154 | else |
155 | ret = xen_pci_frontend_enable_msi(dev, &v); | 155 | ret = xen_pci_frontend_enable_msi(dev, v); |
156 | if (ret) | 156 | if (ret) |
157 | goto error; | 157 | goto error; |
158 | i = 0; | 158 | i = 0; |
159 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 159 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
160 | irq = xen_allocate_pirq(v[i], 0, /* not sharable */ | 160 | xen_allocate_pirq_msi( |
161 | (type == PCI_CAP_ID_MSIX) ? | 161 | (type == PCI_CAP_ID_MSIX) ? |
162 | "pcifront-msi-x" : "pcifront-msi"); | 162 | "pcifront-msi-x" : "pcifront-msi", |
163 | &irq, &v[i], XEN_ALLOC_IRQ); | ||
163 | if (irq < 0) { | 164 | if (irq < 0) { |
164 | ret = -1; | 165 | ret = -1; |
165 | goto free; | 166 | goto free; |
166 | } | 167 | } |
167 | |||
168 | ret = set_irq_msi(irq, msidesc); | 168 | ret = set_irq_msi(irq, msidesc); |
169 | if (ret) | 169 | if (ret) |
170 | goto error_while; | 170 | goto error_while; |
@@ -193,6 +193,9 @@ static void xen_teardown_msi_irqs(struct pci_dev *dev) | |||
193 | xen_pci_frontend_disable_msix(dev); | 193 | xen_pci_frontend_disable_msix(dev); |
194 | else | 194 | else |
195 | xen_pci_frontend_disable_msi(dev); | 195 | xen_pci_frontend_disable_msi(dev); |
196 | |||
197 | /* Free the IRQ's and the msidesc using the generic code. */ | ||
198 | default_teardown_msi_irqs(dev); | ||
196 | } | 199 | } |
197 | 200 | ||
198 | static void xen_teardown_msi_irq(unsigned int irq) | 201 | static void xen_teardown_msi_irq(unsigned int irq) |