Message ID | 20211125033615.483750-1-kamalheib1@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Jason Gunthorpe |
Headers | show |
Series | [for-next] RDMA/bnxt_re: Remove pkey table | expand |
> -----Original Message----- > From: Kamal Heib <kamalheib1@gmail.com> > Sent: Thursday, November 25, 2021 9:06 AM > To: linux-rdma@vger.kernel.org > Cc: Selvin Xavier <selvin.xavier@broadcom.com>; Jason Gunthorpe > <jgg@ziepe.ca>; Kamal Heib <kamalheib1@gmail.com> > Subject: [PATCH for-next] RDMA/bnxt_re: Remove pkey table > > The RoCE spec requires RoCE devices to support only the default pkey. > However the bnxt_re driver maintains 0xFFFF entries pkey table and uses > only the first entry. Remove the pkey table and hard code a table of length > one hard wired with the default pkey. > > Signed-off-by: Kamal Heib <kamalheib1@gmail.com> > --- > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 9 +-- > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 ++- > drivers/infiniband/hw/bnxt_re/qplib_res.c | 50 ------------ > drivers/infiniband/hw/bnxt_re/qplib_res.h | 7 -- > drivers/infiniband/hw/bnxt_re/qplib_sp.c | 99 +---------------------- > drivers/infiniband/hw/bnxt_re/qplib_sp.h | 9 --- > 6 files changed, 10 insertions(+), 175 deletions(-) > > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > index 29cc0d14399a..3224f18a66e5 100644 > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > @@ -262,13 +262,12 @@ void bnxt_re_query_fw_str(struct ib_device > *ibdev, char *str) int bnxt_re_query_pkey(struct ib_device *ibdev, u32 > port_num, > u16 index, u16 *pkey) > { > - struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev); > + if (index > 0) > + return -EINVAL; > > - /* Ignore port_num */ > + *pkey = IB_DEFAULT_PKEY_FULL; > > - memset(pkey, 0, sizeof(*pkey)); > - return bnxt_qplib_get_pkey(&rdev->qplib_res, > - &rdev->qplib_res.pkey_tbl, index, pkey); > + return 0; > } > > int bnxt_re_query_gid(struct ib_device *ibdev, u32 port_num, diff --git > a/drivers/infiniband/hw/bnxt_re/qplib_fp.c > b/drivers/infiniband/hw/bnxt_re/qplib_fp.c > index ca88849559bf..f6472cca9ec7 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c > +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c > @@ -46,6 +46,7 @@ > #include <linux/delay.h> > #include <linux/prefetch.h> > #include <linux/if_ether.h> > +#include <rdma/ib_mad.h> > > #include "roce_hsi.h" > > @@ -1232,7 +1233,7 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res > *res, struct bnxt_qplib_qp *qp) > struct bnxt_qplib_rcfw *rcfw = res->rcfw; > struct cmdq_modify_qp req; > struct creq_modify_qp_resp resp; > - u16 cmd_flags = 0, pkey; > + u16 cmd_flags = 0; > u32 temp32[4]; > u32 bmask; > int rc; > @@ -1255,11 +1256,9 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res > *res, struct bnxt_qplib_qp *qp) > if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS) > req.access = qp->access; > > - if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY) { > - if (!bnxt_qplib_get_pkey(res, &res->pkey_tbl, > - qp->pkey_index, &pkey)) > - req.pkey = cpu_to_le16(pkey); > - } > + if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY) > + req.pkey = IB_DEFAULT_PKEY_FULL; > + > if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_QKEY) > req.qkey = cpu_to_le32(qp->qkey); > > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c > b/drivers/infiniband/hw/bnxt_re/qplib_res.c > index bc1ba4b51ba4..126d4f26f75a 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_res.c > +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c > @@ -649,31 +649,6 @@ static void bnxt_qplib_init_sgid_tbl(struct > bnxt_qplib_sgid_tbl *sgid_tbl, > memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); } > > -static void bnxt_qplib_free_pkey_tbl(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl) > -{ > - if (!pkey_tbl->tbl) > - dev_dbg(&res->pdev->dev, "PKEY tbl not present\n"); > - else > - kfree(pkey_tbl->tbl); > - > - pkey_tbl->tbl = NULL; > - pkey_tbl->max = 0; > - pkey_tbl->active = 0; > -} > - > -static int bnxt_qplib_alloc_pkey_tbl(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, > - u16 max) > -{ > - pkey_tbl->tbl = kcalloc(max, sizeof(u16), GFP_KERNEL); > - if (!pkey_tbl->tbl) > - return -ENOMEM; > - > - pkey_tbl->max = max; > - return 0; > -}; > - > /* PDs */ > int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pdt, struct > bnxt_qplib_pd *pd) { > @@ -843,24 +818,6 @@ static int bnxt_qplib_alloc_dpi_tbl(struct > bnxt_qplib_res *res, > return -ENOMEM; > } > > -/* PKEYs */ > -static void bnxt_qplib_cleanup_pkey_tbl(struct bnxt_qplib_pkey_tbl > *pkey_tbl) -{ > - memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max); > - pkey_tbl->active = 0; > -} > - > -static void bnxt_qplib_init_pkey_tbl(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl) > -{ > - u16 pkey = 0xFFFF; > - > - memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max); > - > - /* pkey default = 0xFFFF */ > - bnxt_qplib_add_pkey(res, pkey_tbl, &pkey, false); > -} > - > /* Stats */ > static void bnxt_qplib_free_stats_ctx(struct pci_dev *pdev, > struct bnxt_qplib_stats *stats) @@ - > 891,21 +848,18 @@ static int bnxt_qplib_alloc_stats_ctx(struct pci_dev > *pdev, > > void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res) { > - bnxt_qplib_cleanup_pkey_tbl(&res->pkey_tbl); > bnxt_qplib_cleanup_sgid_tbl(res, &res->sgid_tbl); } > > int bnxt_qplib_init_res(struct bnxt_qplib_res *res) { > bnxt_qplib_init_sgid_tbl(&res->sgid_tbl, res->netdev); > - bnxt_qplib_init_pkey_tbl(res, &res->pkey_tbl); > > return 0; > } > > void bnxt_qplib_free_res(struct bnxt_qplib_res *res) { > - bnxt_qplib_free_pkey_tbl(res, &res->pkey_tbl); > bnxt_qplib_free_sgid_tbl(res, &res->sgid_tbl); > bnxt_qplib_free_pd_tbl(&res->pd_tbl); > bnxt_qplib_free_dpi_tbl(res, &res->dpi_tbl); @@ -924,10 +878,6 > @@ int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev > *pdev, > if (rc) > goto fail; > > - rc = bnxt_qplib_alloc_pkey_tbl(res, &res->pkey_tbl, dev_attr- > >max_pkey); > - if (rc) > - goto fail; > - > rc = bnxt_qplib_alloc_pd_tbl(res, &res->pd_tbl, dev_attr->max_pd); > if (rc) > goto fail; > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h > b/drivers/infiniband/hw/bnxt_re/qplib_res.h > index e1411a2352a7..982e2c96dac2 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_res.h > +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h > @@ -185,12 +185,6 @@ struct bnxt_qplib_sgid_tbl { > u8 *vlan; > }; > > -struct bnxt_qplib_pkey_tbl { > - u16 *tbl; > - u16 max; > - u16 active; > -}; > - > struct bnxt_qplib_dpi { > u32 dpi; > void __iomem *dbr; > @@ -258,7 +252,6 @@ struct bnxt_qplib_res { > struct bnxt_qplib_rcfw *rcfw; > struct bnxt_qplib_pd_tbl pd_tbl; > struct bnxt_qplib_sgid_tbl sgid_tbl; > - struct bnxt_qplib_pkey_tbl pkey_tbl; > struct bnxt_qplib_dpi_tbl dpi_tbl; > bool prio; > bool is_vf; > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c > b/drivers/infiniband/hw/bnxt_re/qplib_sp.c > index 379e715ebd30..b802981b7171 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c > +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c > @@ -146,17 +146,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw > *rcfw, > attr->max_srq = le16_to_cpu(sb->max_srq); > attr->max_srq_wqes = le32_to_cpu(sb->max_srq_wr) - 1; > attr->max_srq_sges = sb->max_srq_sge; > - attr->max_pkey = le32_to_cpu(sb->max_pkeys); > - /* > - * Some versions of FW reports more than 0xFFFF. > - * Restrict it for now to 0xFFFF to avoid > - * reporting trucated value > - */ > - if (attr->max_pkey > 0xFFFF) { > - /* ib_port_attr::pkey_tbl_len is u16 */ > - attr->max_pkey = 0xFFFF; > - } > - > + attr->max_pkey = 1; > attr->max_inline_data = le32_to_cpu(sb->max_inline_data); > attr->l2_db_size = (sb->l2_db_space_size + 1) * > (0x01 << RCFW_DBR_BASE_PAGE_SHIFT); @@ - > 414,93 +404,6 @@ int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl > *sgid_tbl, > return rc; > } > > -/* pkeys */ > -int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index, > - u16 *pkey) > -{ > - if (index == 0xFFFF) { > - *pkey = 0xFFFF; > - return 0; > - } > - if (index >= pkey_tbl->max) { > - dev_err(&res->pdev->dev, > - "Index %d exceeded PKEY table max (%d)\n", > - index, pkey_tbl->max); > - return -EINVAL; > - } > - memcpy(pkey, &pkey_tbl->tbl[index], sizeof(*pkey)); > - return 0; > -} > - > -int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, > - bool update) > -{ > - int i, rc = 0; > - > - if (!pkey_tbl) { > - dev_err(&res->pdev->dev, "PKEY table not allocated\n"); > - return -EINVAL; > - } > - > - /* Do we need a pkey_lock here? */ > - if (!pkey_tbl->active) { > - dev_err(&res->pdev->dev, "PKEY table has no active > entries\n"); > - return -ENOMEM; > - } > - for (i = 0; i < pkey_tbl->max; i++) { > - if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey))) > - break; > - } > - if (i == pkey_tbl->max) { > - dev_err(&res->pdev->dev, > - "PKEY 0x%04x not found in the pkey table\n", > *pkey); > - return -ENOMEM; > - } > - memset(&pkey_tbl->tbl[i], 0, sizeof(*pkey)); > - pkey_tbl->active--; > - > - /* unlock */ > - return rc; > -} > - > -int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, > - bool update) > -{ > - int i, free_idx, rc = 0; > - > - if (!pkey_tbl) { > - dev_err(&res->pdev->dev, "PKEY table not allocated\n"); > - return -EINVAL; > - } > - > - /* Do we need a pkey_lock here? */ > - if (pkey_tbl->active == pkey_tbl->max) { > - dev_err(&res->pdev->dev, "PKEY table is full\n"); > - return -ENOMEM; > - } > - free_idx = pkey_tbl->max; > - for (i = 0; i < pkey_tbl->max; i++) { > - if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey))) > - return -EALREADY; > - else if (!pkey_tbl->tbl[i] && free_idx == pkey_tbl->max) > - free_idx = i; > - } > - if (free_idx == pkey_tbl->max) { > - dev_err(&res->pdev->dev, > - "PKEY table is FULL but count is not MAX??\n"); > - return -ENOMEM; > - } > - /* Add PKEY to the pkey_tbl */ > - memcpy(&pkey_tbl->tbl[free_idx], pkey, sizeof(*pkey)); > - pkey_tbl->active++; > - > - /* unlock */ > - return rc; > -} > - > /* AH */ > int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah > *ah, > bool block) > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h > b/drivers/infiniband/hw/bnxt_re/qplib_sp.h > index a18f568cb23e..5939e8fc8353 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h > +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h > @@ -255,15 +255,6 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl > *sgid_tbl, int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, > struct bnxt_qplib_gid *gid, u16 gid_idx, > const u8 *smac); > -int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index, > - u16 *pkey); > -int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, > - bool update); > -int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res, > - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, > - bool update); > int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, > struct bnxt_qplib_dev_attr *attr, bool vf); int > bnxt_qplib_set_func_resources(struct bnxt_qplib_res *res, Looks good to me. Reviewed-By: Devesh Sharma <devesh.s.sharma@oracle.com> > -- > 2.31.1
On Thu, Nov 25, 2021 at 05:36:15AM +0200, Kamal Heib wrote: > The RoCE spec requires RoCE devices to support only the default pkey. > However the bnxt_re driver maintains 0xFFFF entries pkey table and uses > only the first entry. Remove the pkey table and hard code a table of > length one hard wired with the default pkey. > > Signed-off-by: Kamal Heib <kamalheib1@gmail.com> > Reviewed-By: Devesh Sharma <devesh.s.sharma@oracle.com> > --- > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 9 +-- > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 ++- > drivers/infiniband/hw/bnxt_re/qplib_res.c | 50 ------------ > drivers/infiniband/hw/bnxt_re/qplib_res.h | 7 -- > drivers/infiniband/hw/bnxt_re/qplib_sp.c | 99 +---------------------- > drivers/infiniband/hw/bnxt_re/qplib_sp.h | 9 --- > 6 files changed, 10 insertions(+), 175 deletions(-) Applied to for-next, thanks Jason
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c index 29cc0d14399a..3224f18a66e5 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -262,13 +262,12 @@ void bnxt_re_query_fw_str(struct ib_device *ibdev, char *str) int bnxt_re_query_pkey(struct ib_device *ibdev, u32 port_num, u16 index, u16 *pkey) { - struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev); + if (index > 0) + return -EINVAL; - /* Ignore port_num */ + *pkey = IB_DEFAULT_PKEY_FULL; - memset(pkey, 0, sizeof(*pkey)); - return bnxt_qplib_get_pkey(&rdev->qplib_res, - &rdev->qplib_res.pkey_tbl, index, pkey); + return 0; } int bnxt_re_query_gid(struct ib_device *ibdev, u32 port_num, diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c index ca88849559bf..f6472cca9ec7 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c @@ -46,6 +46,7 @@ #include <linux/delay.h> #include <linux/prefetch.h> #include <linux/if_ether.h> +#include <rdma/ib_mad.h> #include "roce_hsi.h" @@ -1232,7 +1233,7 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) struct bnxt_qplib_rcfw *rcfw = res->rcfw; struct cmdq_modify_qp req; struct creq_modify_qp_resp resp; - u16 cmd_flags = 0, pkey; + u16 cmd_flags = 0; u32 temp32[4]; u32 bmask; int rc; @@ -1255,11 +1256,9 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS) req.access = qp->access; - if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY) { - if (!bnxt_qplib_get_pkey(res, &res->pkey_tbl, - qp->pkey_index, &pkey)) - req.pkey = cpu_to_le16(pkey); - } + if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY) + req.pkey = IB_DEFAULT_PKEY_FULL; + if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_QKEY) req.qkey = cpu_to_le32(qp->qkey); diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c index bc1ba4b51ba4..126d4f26f75a 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_res.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c @@ -649,31 +649,6 @@ static void bnxt_qplib_init_sgid_tbl(struct bnxt_qplib_sgid_tbl *sgid_tbl, memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); } -static void bnxt_qplib_free_pkey_tbl(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl) -{ - if (!pkey_tbl->tbl) - dev_dbg(&res->pdev->dev, "PKEY tbl not present\n"); - else - kfree(pkey_tbl->tbl); - - pkey_tbl->tbl = NULL; - pkey_tbl->max = 0; - pkey_tbl->active = 0; -} - -static int bnxt_qplib_alloc_pkey_tbl(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, - u16 max) -{ - pkey_tbl->tbl = kcalloc(max, sizeof(u16), GFP_KERNEL); - if (!pkey_tbl->tbl) - return -ENOMEM; - - pkey_tbl->max = max; - return 0; -}; - /* PDs */ int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pdt, struct bnxt_qplib_pd *pd) { @@ -843,24 +818,6 @@ static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res *res, return -ENOMEM; } -/* PKEYs */ -static void bnxt_qplib_cleanup_pkey_tbl(struct bnxt_qplib_pkey_tbl *pkey_tbl) -{ - memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max); - pkey_tbl->active = 0; -} - -static void bnxt_qplib_init_pkey_tbl(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl) -{ - u16 pkey = 0xFFFF; - - memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max); - - /* pkey default = 0xFFFF */ - bnxt_qplib_add_pkey(res, pkey_tbl, &pkey, false); -} - /* Stats */ static void bnxt_qplib_free_stats_ctx(struct pci_dev *pdev, struct bnxt_qplib_stats *stats) @@ -891,21 +848,18 @@ static int bnxt_qplib_alloc_stats_ctx(struct pci_dev *pdev, void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res) { - bnxt_qplib_cleanup_pkey_tbl(&res->pkey_tbl); bnxt_qplib_cleanup_sgid_tbl(res, &res->sgid_tbl); } int bnxt_qplib_init_res(struct bnxt_qplib_res *res) { bnxt_qplib_init_sgid_tbl(&res->sgid_tbl, res->netdev); - bnxt_qplib_init_pkey_tbl(res, &res->pkey_tbl); return 0; } void bnxt_qplib_free_res(struct bnxt_qplib_res *res) { - bnxt_qplib_free_pkey_tbl(res, &res->pkey_tbl); bnxt_qplib_free_sgid_tbl(res, &res->sgid_tbl); bnxt_qplib_free_pd_tbl(&res->pd_tbl); bnxt_qplib_free_dpi_tbl(res, &res->dpi_tbl); @@ -924,10 +878,6 @@ int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev, if (rc) goto fail; - rc = bnxt_qplib_alloc_pkey_tbl(res, &res->pkey_tbl, dev_attr->max_pkey); - if (rc) - goto fail; - rc = bnxt_qplib_alloc_pd_tbl(res, &res->pd_tbl, dev_attr->max_pd); if (rc) goto fail; diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h index e1411a2352a7..982e2c96dac2 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_res.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h @@ -185,12 +185,6 @@ struct bnxt_qplib_sgid_tbl { u8 *vlan; }; -struct bnxt_qplib_pkey_tbl { - u16 *tbl; - u16 max; - u16 active; -}; - struct bnxt_qplib_dpi { u32 dpi; void __iomem *dbr; @@ -258,7 +252,6 @@ struct bnxt_qplib_res { struct bnxt_qplib_rcfw *rcfw; struct bnxt_qplib_pd_tbl pd_tbl; struct bnxt_qplib_sgid_tbl sgid_tbl; - struct bnxt_qplib_pkey_tbl pkey_tbl; struct bnxt_qplib_dpi_tbl dpi_tbl; bool prio; bool is_vf; diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c index 379e715ebd30..b802981b7171 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c @@ -146,17 +146,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, attr->max_srq = le16_to_cpu(sb->max_srq); attr->max_srq_wqes = le32_to_cpu(sb->max_srq_wr) - 1; attr->max_srq_sges = sb->max_srq_sge; - attr->max_pkey = le32_to_cpu(sb->max_pkeys); - /* - * Some versions of FW reports more than 0xFFFF. - * Restrict it for now to 0xFFFF to avoid - * reporting trucated value - */ - if (attr->max_pkey > 0xFFFF) { - /* ib_port_attr::pkey_tbl_len is u16 */ - attr->max_pkey = 0xFFFF; - } - + attr->max_pkey = 1; attr->max_inline_data = le32_to_cpu(sb->max_inline_data); attr->l2_db_size = (sb->l2_db_space_size + 1) * (0x01 << RCFW_DBR_BASE_PAGE_SHIFT); @@ -414,93 +404,6 @@ int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, return rc; } -/* pkeys */ -int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index, - u16 *pkey) -{ - if (index == 0xFFFF) { - *pkey = 0xFFFF; - return 0; - } - if (index >= pkey_tbl->max) { - dev_err(&res->pdev->dev, - "Index %d exceeded PKEY table max (%d)\n", - index, pkey_tbl->max); - return -EINVAL; - } - memcpy(pkey, &pkey_tbl->tbl[index], sizeof(*pkey)); - return 0; -} - -int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, - bool update) -{ - int i, rc = 0; - - if (!pkey_tbl) { - dev_err(&res->pdev->dev, "PKEY table not allocated\n"); - return -EINVAL; - } - - /* Do we need a pkey_lock here? */ - if (!pkey_tbl->active) { - dev_err(&res->pdev->dev, "PKEY table has no active entries\n"); - return -ENOMEM; - } - for (i = 0; i < pkey_tbl->max; i++) { - if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey))) - break; - } - if (i == pkey_tbl->max) { - dev_err(&res->pdev->dev, - "PKEY 0x%04x not found in the pkey table\n", *pkey); - return -ENOMEM; - } - memset(&pkey_tbl->tbl[i], 0, sizeof(*pkey)); - pkey_tbl->active--; - - /* unlock */ - return rc; -} - -int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, - bool update) -{ - int i, free_idx, rc = 0; - - if (!pkey_tbl) { - dev_err(&res->pdev->dev, "PKEY table not allocated\n"); - return -EINVAL; - } - - /* Do we need a pkey_lock here? */ - if (pkey_tbl->active == pkey_tbl->max) { - dev_err(&res->pdev->dev, "PKEY table is full\n"); - return -ENOMEM; - } - free_idx = pkey_tbl->max; - for (i = 0; i < pkey_tbl->max; i++) { - if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey))) - return -EALREADY; - else if (!pkey_tbl->tbl[i] && free_idx == pkey_tbl->max) - free_idx = i; - } - if (free_idx == pkey_tbl->max) { - dev_err(&res->pdev->dev, - "PKEY table is FULL but count is not MAX??\n"); - return -ENOMEM; - } - /* Add PKEY to the pkey_tbl */ - memcpy(&pkey_tbl->tbl[free_idx], pkey, sizeof(*pkey)); - pkey_tbl->active++; - - /* unlock */ - return rc; -} - /* AH */ int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah, bool block) diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h index a18f568cb23e..5939e8fc8353 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h @@ -255,15 +255,6 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, struct bnxt_qplib_gid *gid, u16 gid_idx, const u8 *smac); -int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index, - u16 *pkey); -int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, - bool update); -int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res, - struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey, - bool update); int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, struct bnxt_qplib_dev_attr *attr, bool vf); int bnxt_qplib_set_func_resources(struct bnxt_qplib_res *res,
The RoCE spec requires RoCE devices to support only the default pkey. However the bnxt_re driver maintains 0xFFFF entries pkey table and uses only the first entry. Remove the pkey table and hard code a table of length one hard wired with the default pkey. Signed-off-by: Kamal Heib <kamalheib1@gmail.com> --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 9 +-- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 ++- drivers/infiniband/hw/bnxt_re/qplib_res.c | 50 ------------ drivers/infiniband/hw/bnxt_re/qplib_res.h | 7 -- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 99 +---------------------- drivers/infiniband/hw/bnxt_re/qplib_sp.h | 9 --- 6 files changed, 10 insertions(+), 175 deletions(-)