diff options
author | Mintz, Yuval <Yuval.Mintz@cavium.com> | 2017-03-14 09:26:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-03-14 14:37:05 -0400 |
commit | 4621ceb279d065151eb940ce8a4728b10c0646c7 (patch) | |
tree | dab5cb10c3ce5523b604b4f620bd106b4fca70c8 | |
parent | 752ecb2da11124a948567076b60767dc8034cfa5 (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.c | 28 |
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 | ||
789 | void 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 | |||
789 | struct qed_iscsi_info *qed_iscsi_alloc(struct qed_hwfn *p_hwfn) | 806 | struct 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, | |||
807 | void qed_iscsi_free(struct qed_hwfn *p_hwfn, | 824 | void 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 | ||