aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/ocxl/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/ocxl/link.c')
-rw-r--r--drivers/misc/ocxl/link.c25
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
305err_mapping:
306 irq_dispose_mapping(spa->virq);
307err_name:
308 kfree(spa->irq_name);
309err_xsl:
310 unmap_irq_registers(spa);
311 return rc;
307} 312}
308 313
309static void release_xsl_irq(struct link *link) 314static 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