aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c44
1 files changed, 4 insertions, 40 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index a2002e7dc188..762bff18187d 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -24,20 +24,8 @@
24#include "pci.h" 24#include "pci.h"
25#include "msi.h" 25#include "msi.h"
26 26
27static struct kmem_cache* msi_cachep;
28
29static int pci_msi_enable = 1; 27static int pci_msi_enable = 1;
30 28
31static int msi_cache_init(void)
32{
33 msi_cachep = kmem_cache_create("msi_cache", sizeof(struct msi_desc),
34 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
35 if (!msi_cachep)
36 return -ENOMEM;
37
38 return 0;
39}
40
41static void msi_set_enable(struct pci_dev *dev, int enable) 29static void msi_set_enable(struct pci_dev *dev, int enable)
42{ 30{
43 int pos; 31 int pos;
@@ -221,28 +209,12 @@ void unmask_msi_irq(unsigned int irq)
221 209
222static int msi_free_irq(struct pci_dev* dev, int irq); 210static int msi_free_irq(struct pci_dev* dev, int irq);
223 211
224static int msi_init(void)
225{
226 static int status = -ENOMEM;
227
228 if (!status)
229 return status;
230
231 status = msi_cache_init();
232 if (status < 0) {
233 pci_msi_enable = 0;
234 printk(KERN_WARNING "PCI: MSI cache init failed\n");
235 return status;
236 }
237
238 return status;
239}
240 212
241static struct msi_desc* alloc_msi_entry(void) 213static struct msi_desc* alloc_msi_entry(void)
242{ 214{
243 struct msi_desc *entry; 215 struct msi_desc *entry;
244 216
245 entry = kmem_cache_zalloc(msi_cachep, GFP_KERNEL); 217 entry = kzalloc(sizeof(struct msi_desc), GFP_KERNEL);
246 if (!entry) 218 if (!entry)
247 return NULL; 219 return NULL;
248 220
@@ -368,7 +340,7 @@ static int msi_capability_init(struct pci_dev *dev)
368 /* Configure MSI capability structure */ 340 /* Configure MSI capability structure */
369 irq = arch_setup_msi_irq(dev, entry); 341 irq = arch_setup_msi_irq(dev, entry);
370 if (irq < 0) { 342 if (irq < 0) {
371 kmem_cache_free(msi_cachep, entry); 343 kfree(entry);
372 return irq; 344 return irq;
373 } 345 }
374 entry->link.head = irq; 346 entry->link.head = irq;
@@ -441,7 +413,7 @@ static int msix_capability_init(struct pci_dev *dev,
441 /* Configure MSI-X capability structure */ 413 /* Configure MSI-X capability structure */
442 irq = arch_setup_msi_irq(dev, entry); 414 irq = arch_setup_msi_irq(dev, entry);
443 if (irq < 0) { 415 if (irq < 0) {
444 kmem_cache_free(msi_cachep, entry); 416 kfree(entry);
445 break; 417 break;
446 } 418 }
447 entries[i].vector = irq; 419 entries[i].vector = irq;
@@ -530,10 +502,6 @@ int pci_enable_msi(struct pci_dev* dev)
530 if (pci_msi_supported(dev) < 0) 502 if (pci_msi_supported(dev) < 0)
531 return -EINVAL; 503 return -EINVAL;
532 504
533 status = msi_init();
534 if (status < 0)
535 return status;
536
537 pos = pci_find_capability(dev, PCI_CAP_ID_MSI); 505 pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
538 if (!pos) 506 if (!pos)
539 return -EINVAL; 507 return -EINVAL;
@@ -604,7 +572,7 @@ static int msi_free_irq(struct pci_dev* dev, int irq)
604 get_irq_msi(entry->link.tail)->link.head = entry->link.head; 572 get_irq_msi(entry->link.tail)->link.head = entry->link.head;
605 573
606 arch_teardown_msi_irq(irq); 574 arch_teardown_msi_irq(irq);
607 kmem_cache_free(msi_cachep, entry); 575 kfree(entry);
608 576
609 if (type == PCI_CAP_ID_MSIX) { 577 if (type == PCI_CAP_ID_MSIX) {
610 writel(1, base + entry_nr * PCI_MSIX_ENTRY_SIZE + 578 writel(1, base + entry_nr * PCI_MSIX_ENTRY_SIZE +
@@ -641,10 +609,6 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
641 if (!entries || pci_msi_supported(dev) < 0) 609 if (!entries || pci_msi_supported(dev) < 0)
642 return -EINVAL; 610 return -EINVAL;
643 611
644 status = msi_init();
645 if (status < 0)
646 return status;
647
648 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); 612 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
649 if (!pos) 613 if (!pos)
650 return -EINVAL; 614 return -EINVAL;