aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMintz, Yuval <Yuval.Mintz@cavium.com>2017-03-14 09:26:01 -0400
committerDavid S. Miller <davem@davemloft.net>2017-03-14 14:37:05 -0400
commit4621ceb279d065151eb940ce8a4728b10c0646c7 (patch)
treedab5cb10c3ce5523b604b4f620bd106b4fca70c8
parent752ecb2da11124a948567076b60767dc8034cfa5 (diff)
qed: Free previous connections when releasing iSCSI
Fixes: fc831825f99e ("qed: Add support for hardware offloaded iSCSI") Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_iscsi.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
index 3a44d6b395fa..7e73b05eeab8 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
@@ -786,6 +786,23 @@ static void qed_iscsi_release_connection(struct qed_hwfn *p_hwfn,
786 spin_unlock_bh(&p_hwfn->p_iscsi_info->lock); 786 spin_unlock_bh(&p_hwfn->p_iscsi_info->lock);
787} 787}
788 788
789void qed_iscsi_free_connection(struct qed_hwfn *p_hwfn,
790 struct qed_iscsi_conn *p_conn)
791{
792 qed_chain_free(p_hwfn->cdev, &p_conn->xhq);
793 qed_chain_free(p_hwfn->cdev, &p_conn->uhq);
794 qed_chain_free(p_hwfn->cdev, &p_conn->r2tq);
795 dma_free_coherent(&p_hwfn->cdev->pdev->dev,
796 sizeof(struct tcp_upload_params),
797 p_conn->tcp_upload_params_virt_addr,
798 p_conn->tcp_upload_params_phys_addr);
799 dma_free_coherent(&p_hwfn->cdev->pdev->dev,
800 sizeof(struct scsi_terminate_extra_params),
801 p_conn->queue_cnts_virt_addr,
802 p_conn->queue_cnts_phys_addr);
803 kfree(p_conn);
804}
805
789struct qed_iscsi_info *qed_iscsi_alloc(struct qed_hwfn *p_hwfn) 806struct qed_iscsi_info *qed_iscsi_alloc(struct qed_hwfn *p_hwfn)
790{ 807{
791 struct qed_iscsi_info *p_iscsi_info; 808 struct qed_iscsi_info *p_iscsi_info;
@@ -807,6 +824,17 @@ void qed_iscsi_setup(struct qed_hwfn *p_hwfn,
807void qed_iscsi_free(struct qed_hwfn *p_hwfn, 824void qed_iscsi_free(struct qed_hwfn *p_hwfn,
808 struct qed_iscsi_info *p_iscsi_info) 825 struct qed_iscsi_info *p_iscsi_info)
809{ 826{
827 struct qed_iscsi_conn *p_conn = NULL;
828
829 while (!list_empty(&p_hwfn->p_iscsi_info->free_list)) {
830 p_conn = list_first_entry(&p_hwfn->p_iscsi_info->free_list,
831 struct qed_iscsi_conn, list_entry);
832 if (p_conn) {
833 list_del(&p_conn->list_entry);
834 qed_iscsi_free_connection(p_hwfn, p_conn);
835 }
836 }
837
810 kfree(p_iscsi_info); 838 kfree(p_iscsi_info);
811} 839}
812 840