int rc = 0;
 
        pd->rdev = rdev;
-       if (bnxt_qplib_alloc_pd(&rdev->qplib_res.pd_tbl, &pd->qplib_pd)) {
+       if (bnxt_qplib_alloc_pd(&rdev->qplib_res, &pd->qplib_pd)) {
                ibdev_err(&rdev->ibdev, "Failed to allocate HW PD");
                rc = -ENOMEM;
                goto fail;
 
 }
 
 /* PDs */
-int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pdt, struct bnxt_qplib_pd *pd)
+int bnxt_qplib_alloc_pd(struct bnxt_qplib_res  *res, struct bnxt_qplib_pd *pd)
 {
+       struct bnxt_qplib_pd_tbl *pdt = &res->pd_tbl;
        u32 bit_num;
+       int rc = 0;
 
+       mutex_lock(&res->pd_tbl_lock);
        bit_num = find_first_bit(pdt->tbl, pdt->max);
-       if (bit_num == pdt->max)
-               return -ENOMEM;
+       if (bit_num == pdt->max) {
+               rc = -ENOMEM;
+               goto exit;
+       }
 
        /* Found unused PD */
        clear_bit(bit_num, pdt->tbl);
        pd->id = bit_num;
-       return 0;
+exit:
+       mutex_unlock(&res->pd_tbl_lock);
+       return rc;
 }
 
 int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res,
                          struct bnxt_qplib_pd_tbl *pdt,
                          struct bnxt_qplib_pd *pd)
 {
+       int rc = 0;
+
+       mutex_lock(&res->pd_tbl_lock);
        if (test_and_set_bit(pd->id, pdt->tbl)) {
                dev_warn(&res->pdev->dev, "Freeing an unused PD? pdn = %d\n",
                         pd->id);
-               return -EINVAL;
+               rc = -EINVAL;
+               goto exit;
        }
        pd->id = 0;
-       return 0;
+exit:
+       mutex_unlock(&res->pd_tbl_lock);
+       return rc;
 }
 
 static void bnxt_qplib_free_pd_tbl(struct bnxt_qplib_pd_tbl *pdt)
 
        pdt->max = max;
        memset((u8 *)pdt->tbl, 0xFF, bytes);
+       mutex_init(&res->pd_tbl_lock);
 
        return 0;
 }
 
        struct net_device               *netdev;
        struct bnxt_qplib_rcfw          *rcfw;
        struct bnxt_qplib_pd_tbl        pd_tbl;
+       /* To protect the pd table bit map */
+       struct mutex                    pd_tbl_lock;
        struct bnxt_qplib_sgid_tbl      sgid_tbl;
        struct bnxt_qplib_dpi_tbl       dpi_tbl;
        /* To protect the dpi table bit map */
                         struct bnxt_qplib_hwq *hwq);
 int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,
                              struct bnxt_qplib_hwq_attr *hwq_attr);
-int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pd_tbl,
+int bnxt_qplib_alloc_pd(struct bnxt_qplib_res *res,
                        struct bnxt_qplib_pd *pd);
 int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res,
                          struct bnxt_qplib_pd_tbl *pd_tbl,