diff options
-rw-r--r-- | drivers/misc/mic/scif/scif_nodeqp.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/misc/mic/scif/scif_nodeqp.c b/drivers/misc/mic/scif/scif_nodeqp.c index 7180d566c74b..c66ca1a5814e 100644 --- a/drivers/misc/mic/scif/scif_nodeqp.c +++ b/drivers/misc/mic/scif/scif_nodeqp.c | |||
@@ -435,6 +435,21 @@ free_p2p: | |||
435 | return NULL; | 435 | return NULL; |
436 | } | 436 | } |
437 | 437 | ||
438 | /* Uninitialize and release resources from a p2p mapping */ | ||
439 | static void scif_deinit_p2p_info(struct scif_dev *scifdev, | ||
440 | struct scif_p2p_info *p2p) | ||
441 | { | ||
442 | struct scif_hw_dev *sdev = scifdev->sdev; | ||
443 | |||
444 | dma_unmap_sg(&sdev->dev, p2p->ppi_sg[SCIF_PPI_MMIO], | ||
445 | p2p->sg_nentries[SCIF_PPI_MMIO], DMA_BIDIRECTIONAL); | ||
446 | dma_unmap_sg(&sdev->dev, p2p->ppi_sg[SCIF_PPI_APER], | ||
447 | p2p->sg_nentries[SCIF_PPI_APER], DMA_BIDIRECTIONAL); | ||
448 | scif_p2p_freesg(p2p->ppi_sg[SCIF_PPI_MMIO]); | ||
449 | scif_p2p_freesg(p2p->ppi_sg[SCIF_PPI_APER]); | ||
450 | kfree(p2p); | ||
451 | } | ||
452 | |||
438 | /** | 453 | /** |
439 | * scif_node_connect: Respond to SCIF_NODE_CONNECT interrupt message | 454 | * scif_node_connect: Respond to SCIF_NODE_CONNECT interrupt message |
440 | * @dst: Destination node | 455 | * @dst: Destination node |
@@ -477,8 +492,10 @@ static void scif_node_connect(struct scif_dev *scifdev, int dst) | |||
477 | if (!p2p_ij) | 492 | if (!p2p_ij) |
478 | return; | 493 | return; |
479 | p2p_ji = scif_init_p2p_info(dev_j, dev_i); | 494 | p2p_ji = scif_init_p2p_info(dev_j, dev_i); |
480 | if (!p2p_ji) | 495 | if (!p2p_ji) { |
496 | scif_deinit_p2p_info(dev_i, p2p_ij); | ||
481 | return; | 497 | return; |
498 | } | ||
482 | list_add_tail(&p2p_ij->ppi_list, &dev_i->p2p); | 499 | list_add_tail(&p2p_ij->ppi_list, &dev_i->p2p); |
483 | list_add_tail(&p2p_ji->ppi_list, &dev_j->p2p); | 500 | list_add_tail(&p2p_ji->ppi_list, &dev_j->p2p); |
484 | 501 | ||