Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6: (41 commits) Revert "PCI: remove duplicate device id from ata_piix" msi: Make MSI useable more architectures msi: Kill the msi_desc array. msi: Remove attach_msi_entry. msi: Fix msi_remove_pci_irq_vectors. msi: Remove msi_lock. msi: Kill msi_lookup_irq MSI: Combine pci_(save|restore)_msi/msix_state MSI: Remove pci_scan_msi_device() MSI: Replace pci_msi_quirk with calls to pci_no_msi() PCI: remove duplicate device id from ipr PCI: remove duplicate device id from ata_piix PCI: power management: remove noise on non-manageable hw PCI: cleanup MSI code PCI: make isa_bridge Alpha-only PCI: remove quirk_sis_96x_compatible() PCI: Speed up the Intel SMBus unhiding quirk PCI Quirk: 1k I/O space IOBL_ADR fix on P64H2 shpchp: delete trailing whitespace shpchp: remove DBG_XXX_ROUTINE ...
This commit is contained in:
@@ -64,12 +64,17 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask)
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
int ia64_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
|
||||
{
|
||||
struct msi_msg msg;
|
||||
unsigned long dest_phys_id;
|
||||
unsigned int vector;
|
||||
unsigned int irq, vector;
|
||||
|
||||
irq = create_irq();
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
set_irq_msi(irq, desc);
|
||||
dest_phys_id = cpu_physical_id(first_cpu(cpu_online_map));
|
||||
vector = irq;
|
||||
|
||||
@@ -89,12 +94,12 @@ int ia64_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
write_msi_msg(irq, &msg);
|
||||
set_irq_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq);
|
||||
|
||||
return 0;
|
||||
return irq;
|
||||
}
|
||||
|
||||
void ia64_teardown_msi_irq(unsigned int irq)
|
||||
{
|
||||
return; /* no-op */
|
||||
destroy_irq(irq);
|
||||
}
|
||||
|
||||
static void ia64_ack_msi_irq(unsigned int irq)
|
||||
@@ -126,12 +131,12 @@ static struct irq_chip ia64_msi_chip = {
|
||||
};
|
||||
|
||||
|
||||
int arch_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
|
||||
{
|
||||
if (platform_setup_msi_irq)
|
||||
return platform_setup_msi_irq(irq, pdev);
|
||||
return platform_setup_msi_irq(pdev, desc);
|
||||
|
||||
return ia64_setup_msi_irq(irq, pdev);
|
||||
return ia64_setup_msi_irq(pdev, desc);
|
||||
}
|
||||
|
||||
void arch_teardown_msi_irq(unsigned int irq)
|
||||
|
@@ -59,13 +59,12 @@ void sn_teardown_msi_irq(unsigned int irq)
|
||||
sn_intr_free(nasid, widget, sn_irq_info);
|
||||
sn_msi_info[irq].sn_irq_info = NULL;
|
||||
|
||||
return;
|
||||
destroy_irq(irq);
|
||||
}
|
||||
|
||||
int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
int sn_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *entry)
|
||||
{
|
||||
struct msi_msg msg;
|
||||
struct msi_desc *entry;
|
||||
int widget;
|
||||
int status;
|
||||
nasid_t nasid;
|
||||
@@ -73,8 +72,8 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
struct pcibus_bussoft *bussoft = SN_PCIDEV_BUSSOFT(pdev);
|
||||
struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev);
|
||||
int irq;
|
||||
|
||||
entry = get_irq_data(irq);
|
||||
if (!entry->msi_attrib.is_64)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -84,6 +83,11 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
if (provider == NULL || provider->dma_map_consistent == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
irq = create_irq();
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
set_irq_msi(irq, entry);
|
||||
/*
|
||||
* Set up the vector plumbing. Let the prom (via sn_intr_alloc)
|
||||
* decide which cpu to direct this msi at by default.
|
||||
@@ -95,12 +99,15 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
SWIN_WIDGETNUM(bussoft->bs_base);
|
||||
|
||||
sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
|
||||
if (! sn_irq_info)
|
||||
if (! sn_irq_info) {
|
||||
destroy_irq(irq);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
status = sn_intr_alloc(nasid, widget, sn_irq_info, irq, -1, -1);
|
||||
if (status) {
|
||||
kfree(sn_irq_info);
|
||||
destroy_irq(irq);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -121,6 +128,7 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
if (! bus_addr) {
|
||||
sn_intr_free(nasid, widget, sn_irq_info);
|
||||
kfree(sn_irq_info);
|
||||
destroy_irq(irq);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -139,7 +147,7 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
||||
write_msi_msg(irq, &msg);
|
||||
set_irq_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq);
|
||||
|
||||
return 0;
|
||||
return irq;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
Referens i nytt ärende
Block a user