diff options
Diffstat (limited to 'drivers/pci/htirq.c')
-rw-r--r-- | drivers/pci/htirq.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/pci/htirq.c b/drivers/pci/htirq.c index 279c940a0039..7c5aef13fcdb 100644 --- a/drivers/pci/htirq.c +++ b/drivers/pci/htirq.c | |||
@@ -82,6 +82,18 @@ void unmask_ht_irq(unsigned int irq) | |||
82 | write_ht_irq_msg(irq, &msg); | 82 | write_ht_irq_msg(irq, &msg); |
83 | } | 83 | } |
84 | 84 | ||
85 | static unsigned int build_irq_for_pci_dev(struct pci_dev *dev) | ||
86 | { | ||
87 | unsigned int irq; | ||
88 | |||
89 | irq = dev->bus->number; | ||
90 | irq <<= 8; | ||
91 | irq |= dev->devfn; | ||
92 | irq <<= 12; | ||
93 | |||
94 | return irq; | ||
95 | } | ||
96 | |||
85 | /** | 97 | /** |
86 | * __ht_create_irq - create an irq and attach it to a device. | 98 | * __ht_create_irq - create an irq and attach it to a device. |
87 | * @dev: The hypertransport device to find the irq capability on. | 99 | * @dev: The hypertransport device to find the irq capability on. |
@@ -97,7 +109,8 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update) | |||
97 | u32 data; | 109 | u32 data; |
98 | int max_irq; | 110 | int max_irq; |
99 | int pos; | 111 | int pos; |
100 | int irq; | 112 | unsigned int irq; |
113 | unsigned int irq_want; | ||
101 | 114 | ||
102 | pos = pci_find_ht_capability(dev, HT_CAPTYPE_IRQ); | 115 | pos = pci_find_ht_capability(dev, HT_CAPTYPE_IRQ); |
103 | if (!pos) | 116 | if (!pos) |
@@ -125,8 +138,13 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update) | |||
125 | cfg->msg.address_lo = 0xffffffff; | 138 | cfg->msg.address_lo = 0xffffffff; |
126 | cfg->msg.address_hi = 0xffffffff; | 139 | cfg->msg.address_hi = 0xffffffff; |
127 | 140 | ||
141 | irq_want= build_irq_for_pci_dev(dev); | ||
142 | #ifdef CONFIG_HAVE_SPARSE_IRQ | ||
143 | irq = create_irq_nr(irq_want + idx); | ||
144 | #else | ||
128 | irq = create_irq(); | 145 | irq = create_irq(); |
129 | if (irq < 0) { | 146 | #endif |
147 | if (irq == 0) { | ||
130 | kfree(cfg); | 148 | kfree(cfg); |
131 | return -EBUSY; | 149 | return -EBUSY; |
132 | } | 150 | } |