static void qed_rdma_resc_free(struct qed_hwfn *p_hwfn)
{
- struct qed_bmap *rcid_map = &p_hwfn->p_rdma_info->real_cid_map;
struct qed_rdma_info *p_rdma_info = p_hwfn->p_rdma_info;
- int wait_count = 0;
-
- /* when destroying a_RoCE QP the control is returned to the user after
- * the synchronous part. The asynchronous part may take a little longer.
- * We delay for a short while if an async destroy QP is still expected.
- * Beyond the added delay we clear the bitmap anyway.
- */
- while (bitmap_weight(rcid_map->bitmap, rcid_map->max_count)) {
- msleep(100);
- if (wait_count++ > 20) {
- DP_NOTICE(p_hwfn, "cid bitmap wait timed out\n");
- break;
- }
- }
qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->cid_map, 1);
qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->pd_map, 1);
return qed_rdma_start_fw(p_hwfn, params, p_ptt);
}
+void qed_roce_stop(struct qed_hwfn *p_hwfn)
+{
+ struct qed_bmap *rcid_map = &p_hwfn->p_rdma_info->real_cid_map;
+ int wait_count = 0;
+
+ /* when destroying a_RoCE QP the control is returned to the user after
+ * the synchronous part. The asynchronous part may take a little longer.
+ * We delay for a short while if an async destroy QP is still expected.
+ * Beyond the added delay we clear the bitmap anyway.
+ */
+ while (bitmap_weight(rcid_map->bitmap, rcid_map->max_count)) {
+ msleep(100);
+ if (wait_count++ > 20) {
+ DP_NOTICE(p_hwfn, "cid bitmap wait timed out\n");
+ break;
+ }
+ }
+}
+
static int qed_rdma_stop(void *rdma_cxt)
{
struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
qed_wr(p_hwfn, p_ptt, PRS_REG_LIGHT_L2_ETHERTYPE_EN,
(ll2_ethertype_en & 0xFFFE));
+ qed_roce_stop(p_hwfn);
qed_ptt_release(p_hwfn, p_ptt);
/* Get SPQ entry */