diff options
Diffstat (limited to 'arch/sparc/kernel/pci_msi.c')
-rw-r--r-- | arch/sparc/kernel/pci_msi.c | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/arch/sparc/kernel/pci_msi.c b/arch/sparc/kernel/pci_msi.c index 548b8ca9c210..580651af73f2 100644 --- a/arch/sparc/kernel/pci_msi.c +++ b/arch/sparc/kernel/pci_msi.c | |||
@@ -30,13 +30,10 @@ static irqreturn_t sparc64_msiq_interrupt(int irq, void *cookie) | |||
30 | 30 | ||
31 | err = ops->dequeue_msi(pbm, msiqid, &head, &msi); | 31 | err = ops->dequeue_msi(pbm, msiqid, &head, &msi); |
32 | if (likely(err > 0)) { | 32 | if (likely(err > 0)) { |
33 | struct irq_desc *desc; | 33 | unsigned int irq; |
34 | unsigned int virt_irq; | ||
35 | 34 | ||
36 | virt_irq = pbm->msi_irq_table[msi - pbm->msi_first]; | 35 | irq = pbm->msi_irq_table[msi - pbm->msi_first]; |
37 | desc = irq_desc + virt_irq; | 36 | generic_handle_irq(irq); |
38 | |||
39 | desc->handle_irq(virt_irq, desc); | ||
40 | } | 37 | } |
41 | 38 | ||
42 | if (unlikely(err < 0)) | 39 | if (unlikely(err < 0)) |
@@ -114,14 +111,14 @@ static void free_msi(struct pci_pbm_info *pbm, int msi_num) | |||
114 | 111 | ||
115 | static struct irq_chip msi_irq = { | 112 | static struct irq_chip msi_irq = { |
116 | .name = "PCI-MSI", | 113 | .name = "PCI-MSI", |
117 | .mask = mask_msi_irq, | 114 | .irq_mask = mask_msi_irq, |
118 | .unmask = unmask_msi_irq, | 115 | .irq_unmask = unmask_msi_irq, |
119 | .enable = unmask_msi_irq, | 116 | .irq_enable = unmask_msi_irq, |
120 | .disable = mask_msi_irq, | 117 | .irq_disable = mask_msi_irq, |
121 | /* XXX affinity XXX */ | 118 | /* XXX affinity XXX */ |
122 | }; | 119 | }; |
123 | 120 | ||
124 | static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, | 121 | static int sparc64_setup_msi_irq(unsigned int *irq_p, |
125 | struct pci_dev *pdev, | 122 | struct pci_dev *pdev, |
126 | struct msi_desc *entry) | 123 | struct msi_desc *entry) |
127 | { | 124 | { |
@@ -131,17 +128,17 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, | |||
131 | int msi, err; | 128 | int msi, err; |
132 | u32 msiqid; | 129 | u32 msiqid; |
133 | 130 | ||
134 | *virt_irq_p = virt_irq_alloc(0, 0); | 131 | *irq_p = irq_alloc(0, 0); |
135 | err = -ENOMEM; | 132 | err = -ENOMEM; |
136 | if (!*virt_irq_p) | 133 | if (!*irq_p) |
137 | goto out_err; | 134 | goto out_err; |
138 | 135 | ||
139 | set_irq_chip_and_handler_name(*virt_irq_p, &msi_irq, | 136 | irq_set_chip_and_handler_name(*irq_p, &msi_irq, handle_simple_irq, |
140 | handle_simple_irq, "MSI"); | 137 | "MSI"); |
141 | 138 | ||
142 | err = alloc_msi(pbm); | 139 | err = alloc_msi(pbm); |
143 | if (unlikely(err < 0)) | 140 | if (unlikely(err < 0)) |
144 | goto out_virt_irq_free; | 141 | goto out_irq_free; |
145 | 142 | ||
146 | msi = err; | 143 | msi = err; |
147 | 144 | ||
@@ -152,7 +149,7 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, | |||
152 | if (err) | 149 | if (err) |
153 | goto out_msi_free; | 150 | goto out_msi_free; |
154 | 151 | ||
155 | pbm->msi_irq_table[msi - pbm->msi_first] = *virt_irq_p; | 152 | pbm->msi_irq_table[msi - pbm->msi_first] = *irq_p; |
156 | 153 | ||
157 | if (entry->msi_attrib.is_64) { | 154 | if (entry->msi_attrib.is_64) { |
158 | msg.address_hi = pbm->msi64_start >> 32; | 155 | msg.address_hi = pbm->msi64_start >> 32; |
@@ -163,24 +160,24 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, | |||
163 | } | 160 | } |
164 | msg.data = msi; | 161 | msg.data = msi; |
165 | 162 | ||
166 | set_irq_msi(*virt_irq_p, entry); | 163 | irq_set_msi_desc(*irq_p, entry); |
167 | write_msi_msg(*virt_irq_p, &msg); | 164 | write_msi_msg(*irq_p, &msg); |
168 | 165 | ||
169 | return 0; | 166 | return 0; |
170 | 167 | ||
171 | out_msi_free: | 168 | out_msi_free: |
172 | free_msi(pbm, msi); | 169 | free_msi(pbm, msi); |
173 | 170 | ||
174 | out_virt_irq_free: | 171 | out_irq_free: |
175 | set_irq_chip(*virt_irq_p, NULL); | 172 | irq_set_chip(*irq_p, NULL); |
176 | virt_irq_free(*virt_irq_p); | 173 | irq_free(*irq_p); |
177 | *virt_irq_p = 0; | 174 | *irq_p = 0; |
178 | 175 | ||
179 | out_err: | 176 | out_err: |
180 | return err; | 177 | return err; |
181 | } | 178 | } |
182 | 179 | ||
183 | static void sparc64_teardown_msi_irq(unsigned int virt_irq, | 180 | static void sparc64_teardown_msi_irq(unsigned int irq, |
184 | struct pci_dev *pdev) | 181 | struct pci_dev *pdev) |
185 | { | 182 | { |
186 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; | 183 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; |
@@ -189,12 +186,12 @@ static void sparc64_teardown_msi_irq(unsigned int virt_irq, | |||
189 | int i, err; | 186 | int i, err; |
190 | 187 | ||
191 | for (i = 0; i < pbm->msi_num; i++) { | 188 | for (i = 0; i < pbm->msi_num; i++) { |
192 | if (pbm->msi_irq_table[i] == virt_irq) | 189 | if (pbm->msi_irq_table[i] == irq) |
193 | break; | 190 | break; |
194 | } | 191 | } |
195 | if (i >= pbm->msi_num) { | 192 | if (i >= pbm->msi_num) { |
196 | printk(KERN_ERR "%s: teardown: No MSI for irq %u\n", | 193 | printk(KERN_ERR "%s: teardown: No MSI for irq %u\n", |
197 | pbm->name, virt_irq); | 194 | pbm->name, irq); |
198 | return; | 195 | return; |
199 | } | 196 | } |
200 | 197 | ||
@@ -205,14 +202,14 @@ static void sparc64_teardown_msi_irq(unsigned int virt_irq, | |||
205 | if (err) { | 202 | if (err) { |
206 | printk(KERN_ERR "%s: teardown: ops->teardown() on MSI %u, " | 203 | printk(KERN_ERR "%s: teardown: ops->teardown() on MSI %u, " |
207 | "irq %u, gives error %d\n", | 204 | "irq %u, gives error %d\n", |
208 | pbm->name, msi_num, virt_irq, err); | 205 | pbm->name, msi_num, irq, err); |
209 | return; | 206 | return; |
210 | } | 207 | } |
211 | 208 | ||
212 | free_msi(pbm, msi_num); | 209 | free_msi(pbm, msi_num); |
213 | 210 | ||
214 | set_irq_chip(virt_irq, NULL); | 211 | irq_set_chip(irq, NULL); |
215 | virt_irq_free(virt_irq); | 212 | irq_free(irq); |
216 | } | 213 | } |
217 | 214 | ||
218 | static int msi_bitmap_alloc(struct pci_pbm_info *pbm) | 215 | static int msi_bitmap_alloc(struct pci_pbm_info *pbm) |
@@ -287,8 +284,9 @@ static int bringup_one_msi_queue(struct pci_pbm_info *pbm, | |||
287 | 284 | ||
288 | nid = pbm->numa_node; | 285 | nid = pbm->numa_node; |
289 | if (nid != -1) { | 286 | if (nid != -1) { |
290 | cpumask_t numa_mask = *cpumask_of_node(nid); | 287 | cpumask_t numa_mask; |
291 | 288 | ||
289 | cpumask_copy(&numa_mask, cpumask_of_node(nid)); | ||
292 | irq_set_affinity(irq, &numa_mask); | 290 | irq_set_affinity(irq, &numa_mask); |
293 | } | 291 | } |
294 | err = request_irq(irq, sparc64_msiq_interrupt, 0, | 292 | err = request_irq(irq, sparc64_msiq_interrupt, 0, |