| From 55ba54bfd1fcedd49938251b660d474d70cde18c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Jun 2021 21:13:14 -0700 |
| Subject: ibmvnic: set ltb->buff to NULL after freeing |
| |
| From: Sukadev Bhattiprolu <sukadev@linux.ibm.com> |
| |
| [ Upstream commit 552a33729f1a7cc5115d0752064fe9abd6e3e336 ] |
| |
| free_long_term_buff() checks ltb->buff to decide whether we have a long |
| term buffer to free. So set ltb->buff to NULL afer freeing. While here, |
| also clear ->map_id, fix up some coding style and log an error. |
| |
| Fixes: 9c4eaabd1bb39 ("Check CRQ command return codes") |
| Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/ibm/ibmvnic.c | 26 +++++++++++++++----------- |
| 1 file changed, 15 insertions(+), 11 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c |
| index 765b38c8b252..458619aa84f4 100644 |
| --- a/drivers/net/ethernet/ibm/ibmvnic.c |
| +++ b/drivers/net/ethernet/ibm/ibmvnic.c |
| @@ -212,12 +212,11 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, |
| mutex_lock(&adapter->fw_lock); |
| adapter->fw_done_rc = 0; |
| reinit_completion(&adapter->fw_done); |
| - rc = send_request_map(adapter, ltb->addr, |
| - ltb->size, ltb->map_id); |
| + |
| + rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id); |
| if (rc) { |
| - dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); |
| - mutex_unlock(&adapter->fw_lock); |
| - return rc; |
| + dev_err(dev, "send_request_map failed, rc = %d\n", rc); |
| + goto out; |
| } |
| |
| rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); |
| @@ -225,20 +224,23 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, |
| dev_err(dev, |
| "Long term map request aborted or timed out,rc = %d\n", |
| rc); |
| - dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); |
| - mutex_unlock(&adapter->fw_lock); |
| - return rc; |
| + goto out; |
| } |
| |
| if (adapter->fw_done_rc) { |
| dev_err(dev, "Couldn't map long term buffer,rc = %d\n", |
| adapter->fw_done_rc); |
| + rc = -1; |
| + goto out; |
| + } |
| + rc = 0; |
| +out: |
| + if (rc) { |
| dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); |
| - mutex_unlock(&adapter->fw_lock); |
| - return -1; |
| + ltb->buff = NULL; |
| } |
| mutex_unlock(&adapter->fw_lock); |
| - return 0; |
| + return rc; |
| } |
| |
| static void free_long_term_buff(struct ibmvnic_adapter *adapter, |
| @@ -258,6 +260,8 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter, |
| adapter->reset_reason != VNIC_RESET_TIMEOUT) |
| send_request_unmap(adapter, ltb->map_id); |
| dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); |
| + ltb->buff = NULL; |
| + ltb->map_id = 0; |
| } |
| |
| static int reset_long_term_buff(struct ibmvnic_adapter *adapter, |
| -- |
| 2.30.2 |
| |