diff options
Diffstat (limited to 'drivers/misc/ocxl/link.c')
-rw-r--r-- | drivers/misc/ocxl/link.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/misc/ocxl/link.c b/drivers/misc/ocxl/link.c index 31695a078485..d50b861d7e57 100644 --- a/drivers/misc/ocxl/link.c +++ b/drivers/misc/ocxl/link.c | |||
@@ -273,9 +273,9 @@ static int setup_xsl_irq(struct pci_dev *dev, struct link *link) | |||
273 | spa->irq_name = kasprintf(GFP_KERNEL, "ocxl-xsl-%x-%x-%x", | 273 | spa->irq_name = kasprintf(GFP_KERNEL, "ocxl-xsl-%x-%x-%x", |
274 | link->domain, link->bus, link->dev); | 274 | link->domain, link->bus, link->dev); |
275 | if (!spa->irq_name) { | 275 | if (!spa->irq_name) { |
276 | unmap_irq_registers(spa); | ||
277 | dev_err(&dev->dev, "Can't allocate name for xsl interrupt\n"); | 276 | dev_err(&dev->dev, "Can't allocate name for xsl interrupt\n"); |
278 | return -ENOMEM; | 277 | rc = -ENOMEM; |
278 | goto err_xsl; | ||
279 | } | 279 | } |
280 | /* | 280 | /* |
281 | * At some point, we'll need to look into allowing a higher | 281 | * At some point, we'll need to look into allowing a higher |
@@ -283,11 +283,10 @@ static int setup_xsl_irq(struct pci_dev *dev, struct link *link) | |||
283 | */ | 283 | */ |
284 | spa->virq = irq_create_mapping(NULL, hwirq); | 284 | spa->virq = irq_create_mapping(NULL, hwirq); |
285 | if (!spa->virq) { | 285 | if (!spa->virq) { |
286 | kfree(spa->irq_name); | ||
287 | unmap_irq_registers(spa); | ||
288 | dev_err(&dev->dev, | 286 | dev_err(&dev->dev, |
289 | "irq_create_mapping failed for translation interrupt\n"); | 287 | "irq_create_mapping failed for translation interrupt\n"); |
290 | return -EINVAL; | 288 | rc = -EINVAL; |
289 | goto err_name; | ||
291 | } | 290 | } |
292 | 291 | ||
293 | dev_dbg(&dev->dev, "hwirq %d mapped to virq %d\n", hwirq, spa->virq); | 292 | dev_dbg(&dev->dev, "hwirq %d mapped to virq %d\n", hwirq, spa->virq); |
@@ -295,15 +294,21 @@ static int setup_xsl_irq(struct pci_dev *dev, struct link *link) | |||
295 | rc = request_irq(spa->virq, xsl_fault_handler, 0, spa->irq_name, | 294 | rc = request_irq(spa->virq, xsl_fault_handler, 0, spa->irq_name, |
296 | link); | 295 | link); |
297 | if (rc) { | 296 | if (rc) { |
298 | irq_dispose_mapping(spa->virq); | ||
299 | kfree(spa->irq_name); | ||
300 | unmap_irq_registers(spa); | ||
301 | dev_err(&dev->dev, | 297 | dev_err(&dev->dev, |
302 | "request_irq failed for translation interrupt: %d\n", | 298 | "request_irq failed for translation interrupt: %d\n", |
303 | rc); | 299 | rc); |
304 | return -EINVAL; | 300 | rc = -EINVAL; |
301 | goto err_mapping; | ||
305 | } | 302 | } |
306 | return 0; | 303 | return 0; |
304 | |||
305 | err_mapping: | ||
306 | irq_dispose_mapping(spa->virq); | ||
307 | err_name: | ||
308 | kfree(spa->irq_name); | ||
309 | err_xsl: | ||
310 | unmap_irq_registers(spa); | ||
311 | return rc; | ||
307 | } | 312 | } |
308 | 313 | ||
309 | static void release_xsl_irq(struct link *link) | 314 | static void release_xsl_irq(struct link *link) |
@@ -566,7 +571,7 @@ int ocxl_link_update_pe(void *link_handle, int pasid, __u16 tid) | |||
566 | 571 | ||
567 | mutex_lock(&spa->spa_lock); | 572 | mutex_lock(&spa->spa_lock); |
568 | 573 | ||
569 | pe->tid = tid; | 574 | pe->tid = cpu_to_be32(tid); |
570 | 575 | ||
571 | /* | 576 | /* |
572 | * The barrier makes sure the PE is updated | 577 | * The barrier makes sure the PE is updated |