Commit 59582d86 authored by Mitesh Ahuja's avatar Mitesh Ahuja Committed by Doug Ledford

RDMA/ocrdma: Prevent allocation of DPP PDs if FW doesnt support it

If DPP PDs are not supported by the FW, allocate only normal PDs.
Signed-off-by: default avatarMitesh Ahuja <mitesh.ahuja@avagotech.com>
Signed-off-by: default avatarPadmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@avagotech.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 038ab8b7
...@@ -1440,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) ...@@ -1440,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
struct ocrdma_alloc_pd_range_rsp *rsp; struct ocrdma_alloc_pd_range_rsp *rsp;
/* Pre allocate the DPP PDs */ /* Pre allocate the DPP PDs */
cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); if (dev->attr.max_dpp_pds) {
if (!cmd) cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE,
return -ENOMEM; sizeof(*cmd));
cmd->pd_count = dev->attr.max_dpp_pds; if (!cmd)
cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; return -ENOMEM;
status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); cmd->pd_count = dev->attr.max_dpp_pds;
if (status) cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
goto mbx_err; status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) { if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) &&
dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> rsp->pd_count) {
OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
dev->pd_mgr->max_dpp_pd = rsp->pd_count; OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long); dev->pd_mgr->max_dpp_pd = rsp->pd_count;
dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size, pd_bitmap_size =
GFP_KERNEL); BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
GFP_KERNEL);
}
kfree(cmd);
} }
kfree(cmd);
cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
if (!cmd) if (!cmd)
...@@ -1468,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) ...@@ -1468,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds; cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds;
status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
if (status)
goto mbx_err;
rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
if (rsp->pd_count) { if (!status && rsp->pd_count) {
dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid & dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid &
OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
dev->pd_mgr->max_normal_pd = rsp->pd_count; dev->pd_mgr->max_normal_pd = rsp->pd_count;
...@@ -1479,15 +1480,13 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) ...@@ -1479,15 +1480,13 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size, dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size,
GFP_KERNEL); GFP_KERNEL);
} }
kfree(cmd);
if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) { if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {
/* Enable PD resource manager */ /* Enable PD resource manager */
dev->pd_mgr->pd_prealloc_valid = true; dev->pd_mgr->pd_prealloc_valid = true;
} else { return 0;
return -ENOMEM;
} }
mbx_err:
kfree(cmd);
return status; return status;
} }
......
...@@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev, ...@@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,
if (!pd) if (!pd)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
if (udata && uctx) { if (udata && uctx && dev->attr.max_dpp_pds) {
pd->dpp_enabled = pd->dpp_enabled =
ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R; ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
pd->num_dpp_qp = pd->num_dpp_qp =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment