diff options
| -rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 53 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 2 | 
2 files changed, 27 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index 5636eb6f9307..ac7347ad90be 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c @@ -1440,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)  	struct ocrdma_alloc_pd_range_rsp *rsp;  	/* Pre allocate the DPP PDs */ -	cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); -	if (!cmd) -		return -ENOMEM; -	cmd->pd_count = dev->attr.max_dpp_pds; -	cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; -	status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); -	if (status) -		goto mbx_err; -	rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; - -	if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) { -		dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> -				OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; -		dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & -				OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; -		dev->pd_mgr->max_dpp_pd = rsp->pd_count; -		pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long); -		dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size, -						     GFP_KERNEL); +	if (dev->attr.max_dpp_pds) { +		cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, +					  sizeof(*cmd)); +		if (!cmd) +			return -ENOMEM; +		cmd->pd_count = dev->attr.max_dpp_pds; +		cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; +		status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); +		rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; + +		if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && +		    rsp->pd_count) { +			dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> +					OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; +			dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & +					OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; +			dev->pd_mgr->max_dpp_pd = rsp->pd_count; +			pd_bitmap_size = +				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));  	if (!cmd) @@ -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;  	status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); -	if (status) -		goto mbx_err;  	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 &  					OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;  		dev->pd_mgr->max_normal_pd = rsp->pd_count; @@ -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,  						      GFP_KERNEL);  	} +	kfree(cmd);  	if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {  		/* Enable PD resource manager */  		dev->pd_mgr->pd_prealloc_valid = true; -	} else { -		return -ENOMEM; +		return 0;  	} -mbx_err: -	kfree(cmd);  	return status;  } diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index 06e8ab7825b9..9dcb66077d6c 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c @@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,  	if (!pd)  		return ERR_PTR(-ENOMEM); -	if (udata && uctx) { +	if (udata && uctx && dev->attr.max_dpp_pds) {  		pd->dpp_enabled =  			ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;  		pd->num_dpp_qp =  | 
