diff options
author | Mitesh Ahuja <mitesh.ahuja@avagotech.com> | 2015-05-19 02:02:37 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2015-05-18 10:25:24 -0400 |
commit | 59582d86e23f30466413a04cc4db678b09f937ea (patch) | |
tree | c0b625a86ddb2298c55349b1521e7f2f9d0c7c3d | |
parent | 038ab8b7432c0280f064a47173dc5b6412243674 (diff) |
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: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-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) | |||
1440 | struct ocrdma_alloc_pd_range_rsp *rsp; | 1440 | struct ocrdma_alloc_pd_range_rsp *rsp; |
1441 | 1441 | ||
1442 | /* Pre allocate the DPP PDs */ | 1442 | /* Pre allocate the DPP PDs */ |
1443 | cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); | 1443 | if (dev->attr.max_dpp_pds) { |
1444 | if (!cmd) | 1444 | cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, |
1445 | return -ENOMEM; | 1445 | sizeof(*cmd)); |
1446 | cmd->pd_count = dev->attr.max_dpp_pds; | 1446 | if (!cmd) |
1447 | cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; | 1447 | return -ENOMEM; |
1448 | status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); | 1448 | cmd->pd_count = dev->attr.max_dpp_pds; |
1449 | if (status) | 1449 | cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP; |
1450 | goto mbx_err; | 1450 | status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); |
1451 | rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; | 1451 | rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; |
1452 | 1452 | ||
1453 | if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) { | 1453 | if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && |
1454 | dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> | 1454 | rsp->pd_count) { |
1455 | OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; | 1455 | dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> |
1456 | dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & | 1456 | OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT; |
1457 | OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; | 1457 | dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & |
1458 | dev->pd_mgr->max_dpp_pd = rsp->pd_count; | 1458 | OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; |
1459 | pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long); | 1459 | dev->pd_mgr->max_dpp_pd = rsp->pd_count; |
1460 | dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size, | 1460 | pd_bitmap_size = |
1461 | GFP_KERNEL); | 1461 | BITS_TO_LONGS(rsp->pd_count) * sizeof(long); |
1462 | dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size, | ||
1463 | GFP_KERNEL); | ||
1464 | } | ||
1465 | kfree(cmd); | ||
1462 | } | 1466 | } |
1463 | kfree(cmd); | ||
1464 | 1467 | ||
1465 | cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); | 1468 | cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd)); |
1466 | if (!cmd) | 1469 | if (!cmd) |
@@ -1468,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) | |||
1468 | 1471 | ||
1469 | cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds; | 1472 | cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds; |
1470 | status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); | 1473 | status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); |
1471 | if (status) | ||
1472 | goto mbx_err; | ||
1473 | rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; | 1474 | rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd; |
1474 | if (rsp->pd_count) { | 1475 | if (!status && rsp->pd_count) { |
1475 | dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid & | 1476 | dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid & |
1476 | OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; | 1477 | OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK; |
1477 | dev->pd_mgr->max_normal_pd = rsp->pd_count; | 1478 | 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 | dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size, | 1480 | dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size, |
1480 | GFP_KERNEL); | 1481 | GFP_KERNEL); |
1481 | } | 1482 | } |
1483 | kfree(cmd); | ||
1482 | 1484 | ||
1483 | if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) { | 1485 | if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) { |
1484 | /* Enable PD resource manager */ | 1486 | /* Enable PD resource manager */ |
1485 | dev->pd_mgr->pd_prealloc_valid = true; | 1487 | dev->pd_mgr->pd_prealloc_valid = true; |
1486 | } else { | 1488 | return 0; |
1487 | return -ENOMEM; | ||
1488 | } | 1489 | } |
1489 | mbx_err: | ||
1490 | kfree(cmd); | ||
1491 | return status; | 1490 | return status; |
1492 | } | 1491 | } |
1493 | 1492 | ||
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, | |||
365 | if (!pd) | 365 | if (!pd) |
366 | return ERR_PTR(-ENOMEM); | 366 | return ERR_PTR(-ENOMEM); |
367 | 367 | ||
368 | if (udata && uctx) { | 368 | if (udata && uctx && dev->attr.max_dpp_pds) { |
369 | pd->dpp_enabled = | 369 | pd->dpp_enabled = |
370 | ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R; | 370 | ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R; |
371 | pd->num_dpp_qp = | 371 | pd->num_dpp_qp = |