Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 53355
b: refs/heads/master
c: 9c83133
h: refs/heads/master
i:
  53353: f6f46a8
  53351: 2b862f2
v: v3
  • Loading branch information
Michael Ellerman authored and Greg Kroah-Hartman committed May 3, 2007
1 parent da9f6ce commit ea27ddd
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7fe3730de729b758e9f69b862b9255d998671b5f
refs/heads/master: 9c8313343c83c0ca731ceb8d2a4ab1e022ed9c94
63 changes: 44 additions & 19 deletions trunk/drivers/pci/msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,13 +334,15 @@ static int msi_capability_init(struct pci_dev *dev)
msi_mask_bits_reg(pos, is_64bit_address(control)),
maskbits);
}
list_add(&entry->list, &dev->msi_list);

/* Configure MSI capability structure */
ret = arch_setup_msi_irq(dev, entry);
ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI);
if (ret) {
list_del(&entry->list);
kfree(entry);
return ret;
}
list_add(&entry->list, &dev->msi_list);

/* Set MSI enabled bits */
pci_intx(dev, 0); /* disable intx */
Expand All @@ -365,7 +367,7 @@ static int msix_capability_init(struct pci_dev *dev,
struct msix_entry *entries, int nvec)
{
struct msi_desc *entry;
int irq, pos, i, j, nr_entries, ret;
int pos, i, j, nr_entries, ret;
unsigned long phys_addr;
u32 table_offset;
u16 control;
Expand Down Expand Up @@ -404,30 +406,33 @@ static int msix_capability_init(struct pci_dev *dev,
entry->dev = dev;
entry->mask_base = base;

/* Configure MSI-X capability structure */
ret = arch_setup_msi_irq(dev, entry);
if (ret) {
kfree(entry);
break;
}
entries[i].vector = entry->irq;
list_add(&entry->list, &dev->msi_list);
}
if (i != nvec) {
int avail = i - 1;
i--;
for (; i >= 0; i--) {
irq = (entries + i)->vector;
msi_free_irq(dev, irq);
(entries + i)->vector = 0;

ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
if (ret) {
int avail = 0;
list_for_each_entry(entry, &dev->msi_list, list) {
if (entry->irq != 0) {
avail++;
msi_free_irq(dev, entry->irq);
}
}

/* If we had some success report the number of irqs
* we succeeded in setting up.
*/
if (avail <= 0)
avail = -EBUSY;
if (avail == 0)
avail = ret;
return avail;
}

i = 0;
list_for_each_entry(entry, &dev->msi_list, list) {
entries[i].vector = entry->irq;
set_irq_msi(entry->irq, entry);
i++;
}
/* Set MSI-X enabled bits */
pci_intx(dev, 0); /* disable intx */
msix_set_enable(dev, 1);
Expand Down Expand Up @@ -694,3 +699,23 @@ arch_msi_check_device(struct pci_dev* dev, int nvec, int type)
return 0;
}

int __attribute__ ((weak))
arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *entry)
{
return 0;
}

int __attribute__ ((weak))
arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
struct msi_desc *entry;
int ret;

list_for_each_entry(entry, &dev->msi_list, list) {
ret = arch_setup_msi_irq(dev, entry);
if (ret)
return ret;
}

return 0;
}
1 change: 1 addition & 0 deletions trunk/include/linux/msi.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct msi_desc {
*/
int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
void arch_teardown_msi_irq(unsigned int irq);
extern int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
extern int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);


Expand Down

0 comments on commit ea27ddd

Please sign in to comment.