From cfa98ba06b4b3a7eef3a8e4e85873803b7adf337 Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Fri, 1 Feb 2013 15:25:37 -0700 Subject: [PATCH] --- yaml --- r: 375679 b: refs/heads/master c: b77b2637b39ecc380bb08992380d7d48452b0872 h: refs/heads/master i: 375677: f7765993f74b3b7ea65c2e81ee8de0f1d00581ff 375675: 299c7e30a0cd1abf7034769e0d64657b70cf9d6c 375671: d42c62aee08087c6f4e54736dee24915d53ba17d 375663: b4c31e912918d292bcbe1a196fe1217c4a43b01c 375647: 61a384ef018eeb980e173032631d0db442dee38c 375615: d4ddef84f94fba501e2ac6ee0a9c13b6d8a9ae03 375551: ce0d482f90f30a5b407ff5adbf308cd28b7453c0 v: v3 --- [refs] | 2 +- trunk/drivers/ntb/ntb_transport.c | 32 +++++++++++++++++++------------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 689180ed1bd5..7c106e2d6f2a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 113fc505b83b2d16e820ca74fa07f99a34877b1d +refs/heads/master: b77b2637b39ecc380bb08992380d7d48452b0872 diff --git a/trunk/drivers/ntb/ntb_transport.c b/trunk/drivers/ntb/ntb_transport.c index 79a3203eccd9..be416d6850f0 100644 --- a/trunk/drivers/ntb/ntb_transport.c +++ b/trunk/drivers/ntb/ntb_transport.c @@ -507,17 +507,37 @@ static void ntb_transport_setup_qp_mw(struct ntb_transport *nt, qp->tx_pkts = 0; } +static void ntb_free_mw(struct ntb_transport *nt, int num_mw) +{ + struct ntb_transport_mw *mw = &nt->mw[num_mw]; + struct pci_dev *pdev = ntb_query_pdev(nt->ndev); + + if (!mw->virt_addr) + return; + + dma_free_coherent(&pdev->dev, mw->size, mw->virt_addr, mw->dma_addr); + mw->virt_addr = NULL; +} + static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size) { struct ntb_transport_mw *mw = &nt->mw[num_mw]; struct pci_dev *pdev = ntb_query_pdev(nt->ndev); + /* No need to re-setup */ + if (mw->size == ALIGN(size, 4096)) + return 0; + + if (mw->size != 0) + ntb_free_mw(nt, num_mw); + /* Alloc memory for receiving data. Must be 4k aligned */ mw->size = ALIGN(size, 4096); mw->virt_addr = dma_alloc_coherent(&pdev->dev, mw->size, &mw->dma_addr, GFP_KERNEL); if (!mw->virt_addr) { + mw->size = 0; dev_err(&pdev->dev, "Unable to allocate MW buffer of size %d\n", (int) mw->size); return -ENOMEM; @@ -529,18 +549,6 @@ static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size) return 0; } -static void ntb_free_mw(struct ntb_transport *nt, int num_mw) -{ - struct ntb_transport_mw *mw = &nt->mw[num_mw]; - struct pci_dev *pdev = ntb_query_pdev(nt->ndev); - - if (!mw->virt_addr) - return; - - dma_free_coherent(&pdev->dev, mw->size, mw->virt_addr, mw->dma_addr); - mw->virt_addr = NULL; -} - static void ntb_qp_link_cleanup(struct work_struct *work) { struct ntb_transport_qp *qp = container_of(work,