qed: Read queue state before releasing buffer
authorRam Amrani <Ram.Amrani@cavium.com>
Mon, 20 Feb 2017 20:43:31 +0000 (22:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Feb 2017 22:11:54 +0000 (17:11 -0500)
Currently the state is read only after the buffers are relesed.

Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_roce.c

index 50fdcd3fa9b4f772be28da78b233175955623e58..65d5b9a942f915e98b93f56be0def264c72c9040 100644 (file)
@@ -1768,13 +1768,13 @@ static int qed_roce_query_qp(struct qed_hwfn *p_hwfn,
        if (rc)
                goto err_resp;
 
-       dma_free_coherent(&p_hwfn->cdev->pdev->dev, sizeof(*p_resp_ramrod_res),
-                         p_resp_ramrod_res, resp_ramrod_res_phys);
-
        out_params->rq_psn = le32_to_cpu(p_resp_ramrod_res->psn);
        rq_err_state = GET_FIELD(le32_to_cpu(p_resp_ramrod_res->err_flag),
                                 ROCE_QUERY_QP_RESP_OUTPUT_PARAMS_ERROR_FLG);
 
+       dma_free_coherent(&p_hwfn->cdev->pdev->dev, sizeof(*p_resp_ramrod_res),
+                         p_resp_ramrod_res, resp_ramrod_res_phys);
+
        if (!(qp->req_offloaded)) {
                /* Don't send query qp for the requester */
                out_params->sq_psn = qp->sq_psn;
@@ -1815,9 +1815,6 @@ static int qed_roce_query_qp(struct qed_hwfn *p_hwfn,
        if (rc)
                goto err_req;
 
-       dma_free_coherent(&p_hwfn->cdev->pdev->dev, sizeof(*p_req_ramrod_res),
-                         p_req_ramrod_res, req_ramrod_res_phys);
-
        out_params->sq_psn = le32_to_cpu(p_req_ramrod_res->psn);
        sq_err_state = GET_FIELD(le32_to_cpu(p_req_ramrod_res->flags),
                                 ROCE_QUERY_QP_REQ_OUTPUT_PARAMS_ERR_FLG);
@@ -1825,6 +1822,9 @@ static int qed_roce_query_qp(struct qed_hwfn *p_hwfn,
                GET_FIELD(le32_to_cpu(p_req_ramrod_res->flags),
                          ROCE_QUERY_QP_REQ_OUTPUT_PARAMS_SQ_DRAINING_FLG);
 
+       dma_free_coherent(&p_hwfn->cdev->pdev->dev, sizeof(*p_req_ramrod_res),
+                         p_req_ramrod_res, req_ramrod_res_phys);
+
        out_params->draining = false;
 
        if (rq_err_state)