diff mbox series

[1/7] RDMA/bnxt_re: Add chip context to identify 57500 series

Message ID 1546236607-15948-2-git-send-email-devesh.sharma@broadcom.com (mailing list archive)
State Superseded
Headers show
Series Add support Broadcom's 57500 series of adapters | expand

Commit Message

Devesh Sharma Dec. 31, 2018, 6:10 a.m. UTC
Adding setup and destroy routines for chip-context. The
chip context would be used frequently in control and data
path to take execution flow depending on the chip type.
chip context structure pointer is added to the relevant
data structures.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/bnxt_re.h    |  1 +
 drivers/infiniband/hw/bnxt_re/main.c       | 43 ++++++++++++++++++++++++++++++
 drivers/infiniband/hw/bnxt_re/qplib_fp.h   |  1 +
 drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |  1 +
 drivers/infiniband/hw/bnxt_re/qplib_res.h  | 15 ++++++++++-
 5 files changed, 60 insertions(+), 1 deletion(-)

Comments

Jason Gunthorpe Jan. 2, 2019, 8:56 p.m. UTC | #1
On Mon, Dec 31, 2018 at 01:10:01AM -0500, Devesh Sharma wrote:
> Adding setup and destroy routines for chip-context. The
> chip context would be used frequently in control and data
> path to take execution flow depending on the chip type.
> chip context structure pointer is added to the relevant
> data structures.
> 
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
>  drivers/infiniband/hw/bnxt_re/bnxt_re.h    |  1 +
>  drivers/infiniband/hw/bnxt_re/main.c       | 43 ++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/bnxt_re/qplib_fp.h   |  1 +
>  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |  1 +
>  drivers/infiniband/hw/bnxt_re/qplib_res.h  | 15 ++++++++++-
>  5 files changed, 60 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> index 31baa893..6c16515 100644
> +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> @@ -124,6 +124,7 @@ struct bnxt_re_dev {
>  #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
>  	struct net_device		*netdev;
>  	unsigned int			version, major, minor;
> +	struct bnxt_qplib_chip_ctx	*chip_ctx;
>  	struct bnxt_en_dev		*en_dev;
>  	struct bnxt_msix_entry		msix_entries[BNXT_RE_MAX_MSIX];
>  	int				num_msix;
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index e7a997f..e3e1944 100644
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -80,6 +80,38 @@
>  static struct workqueue_struct *bnxt_re_wq;
>  static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev);
>  
> +static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> +{
> +	struct bnxt_qplib_chip_ctx *chip_ctx;
> +
> +	chip_ctx = rdev->chip_ctx;
> +	rdev->chip_ctx = NULL;
> +	rdev->rcfw.res = NULL;
> +	rdev->qplib_res.cctx = NULL;
> +	kfree(chip_ctx);
> +}
> +
> +static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
> +{
> +	struct bnxt_qplib_chip_ctx *chip_ctx;
> +	struct bnxt_en_dev *en_dev;
> +	struct bnxt *bp;
> +
> +	en_dev = rdev->en_dev;
> +	bp = netdev_priv(en_dev->net);
> +
> +	chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
> +	if (!chip_ctx)
> +		return -ENOMEM;

It seems a bit weird to kzalloc this? Why not just inline it in the
rdev struct?

Jason
Devesh Sharma Jan. 3, 2019, 6 a.m. UTC | #2
On Thu, Jan 3, 2019 at 2:26 AM Jason Gunthorpe <jgg@mellanox.com> wrote:
>
> On Mon, Dec 31, 2018 at 01:10:01AM -0500, Devesh Sharma wrote:
> > Adding setup and destroy routines for chip-context. The
> > chip context would be used frequently in control and data
> > path to take execution flow depending on the chip type.
> > chip context structure pointer is added to the relevant
> > data structures.
> >
> > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> >  drivers/infiniband/hw/bnxt_re/bnxt_re.h    |  1 +
> >  drivers/infiniband/hw/bnxt_re/main.c       | 43 ++++++++++++++++++++++++++++++
> >  drivers/infiniband/hw/bnxt_re/qplib_fp.h   |  1 +
> >  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |  1 +
> >  drivers/infiniband/hw/bnxt_re/qplib_res.h  | 15 ++++++++++-
> >  5 files changed, 60 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > index 31baa893..6c16515 100644
> > +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > @@ -124,6 +124,7 @@ struct bnxt_re_dev {
> >  #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
> >       struct net_device               *netdev;
> >       unsigned int                    version, major, minor;
> > +     struct bnxt_qplib_chip_ctx      *chip_ctx;
> >       struct bnxt_en_dev              *en_dev;
> >       struct bnxt_msix_entry          msix_entries[BNXT_RE_MAX_MSIX];
> >       int                             num_msix;
> > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> > index e7a997f..e3e1944 100644
> > +++ b/drivers/infiniband/hw/bnxt_re/main.c
> > @@ -80,6 +80,38 @@
> >  static struct workqueue_struct *bnxt_re_wq;
> >  static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev);
> >
> > +static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> > +{
> > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > +
> > +     chip_ctx = rdev->chip_ctx;
> > +     rdev->chip_ctx = NULL;
> > +     rdev->rcfw.res = NULL;
> > +     rdev->qplib_res.cctx = NULL;
> > +     kfree(chip_ctx);
> > +}
> > +
> > +static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
> > +{
> > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > +     struct bnxt_en_dev *en_dev;
> > +     struct bnxt *bp;
> > +
> > +     en_dev = rdev->en_dev;
> > +     bp = netdev_priv(en_dev->net);
> > +
> > +     chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
> > +     if (!chip_ctx)
> > +             return -ENOMEM;
>
> It seems a bit weird to kzalloc this? Why not just inline it in the
> rdev struct?
I did not wanted to pile up another structure to the bnxt_re_device
structure and increase its size by the sizeof (struct
bnxt_qplib_chip_ctx).
eventually this struct may grow bigger. I am not aware if inline'ing
is preferred, if that is the case, I will change it.
>
> Jason
Jason Gunthorpe Jan. 3, 2019, 3:47 p.m. UTC | #3
On Thu, Jan 03, 2019 at 11:30:19AM +0530, Devesh Sharma wrote:
> On Thu, Jan 3, 2019 at 2:26 AM Jason Gunthorpe <jgg@mellanox.com> wrote:
> >
> > On Mon, Dec 31, 2018 at 01:10:01AM -0500, Devesh Sharma wrote:
> > > Adding setup and destroy routines for chip-context. The
> > > chip context would be used frequently in control and data
> > > path to take execution flow depending on the chip type.
> > > chip context structure pointer is added to the relevant
> > > data structures.
> > >
> > > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > > Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> > >  drivers/infiniband/hw/bnxt_re/bnxt_re.h    |  1 +
> > >  drivers/infiniband/hw/bnxt_re/main.c       | 43 ++++++++++++++++++++++++++++++
> > >  drivers/infiniband/hw/bnxt_re/qplib_fp.h   |  1 +
> > >  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |  1 +
> > >  drivers/infiniband/hw/bnxt_re/qplib_res.h  | 15 ++++++++++-
> > >  5 files changed, 60 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > index 31baa893..6c16515 100644
> > > +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > @@ -124,6 +124,7 @@ struct bnxt_re_dev {
> > >  #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
> > >       struct net_device               *netdev;
> > >       unsigned int                    version, major, minor;
> > > +     struct bnxt_qplib_chip_ctx      *chip_ctx;
> > >       struct bnxt_en_dev              *en_dev;
> > >       struct bnxt_msix_entry          msix_entries[BNXT_RE_MAX_MSIX];
> > >       int                             num_msix;
> > > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> > > index e7a997f..e3e1944 100644
> > > +++ b/drivers/infiniband/hw/bnxt_re/main.c
> > > @@ -80,6 +80,38 @@
> > >  static struct workqueue_struct *bnxt_re_wq;
> > >  static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev);
> > >
> > > +static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> > > +{
> > > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > > +
> > > +     chip_ctx = rdev->chip_ctx;
> > > +     rdev->chip_ctx = NULL;
> > > +     rdev->rcfw.res = NULL;
> > > +     rdev->qplib_res.cctx = NULL;
> > > +     kfree(chip_ctx);
> > > +}
> > > +
> > > +static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
> > > +{
> > > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > > +     struct bnxt_en_dev *en_dev;
> > > +     struct bnxt *bp;
> > > +
> > > +     en_dev = rdev->en_dev;
> > > +     bp = netdev_priv(en_dev->net);
> > > +
> > > +     chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
> > > +     if (!chip_ctx)
> > > +             return -ENOMEM;
> >
> > It seems a bit weird to kzalloc this? Why not just inline it in the
> > rdev struct?
> I did not wanted to pile up another structure to the bnxt_re_device
> structure and increase its size by the sizeof (struct
> bnxt_qplib_chip_ctx).
> eventually this struct may grow bigger. I am not aware if inline'ing
> is preferred, if that is the case, I will change it.

If struct is not near PAGE_SIZE don't worry about it

Jason
Devesh Sharma Jan. 3, 2019, 4:29 p.m. UTC | #4
On Thu, Jan 3, 2019 at 9:17 PM Jason Gunthorpe <jgg@mellanox.com> wrote:
>
> On Thu, Jan 03, 2019 at 11:30:19AM +0530, Devesh Sharma wrote:
> > On Thu, Jan 3, 2019 at 2:26 AM Jason Gunthorpe <jgg@mellanox.com> wrote:
> > >
> > > On Mon, Dec 31, 2018 at 01:10:01AM -0500, Devesh Sharma wrote:
> > > > Adding setup and destroy routines for chip-context. The
> > > > chip context would be used frequently in control and data
> > > > path to take execution flow depending on the chip type.
> > > > chip context structure pointer is added to the relevant
> > > > data structures.
> > > >
> > > > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > > > Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> > > >  drivers/infiniband/hw/bnxt_re/bnxt_re.h    |  1 +
> > > >  drivers/infiniband/hw/bnxt_re/main.c       | 43 ++++++++++++++++++++++++++++++
> > > >  drivers/infiniband/hw/bnxt_re/qplib_fp.h   |  1 +
> > > >  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |  1 +
> > > >  drivers/infiniband/hw/bnxt_re/qplib_res.h  | 15 ++++++++++-
> > > >  5 files changed, 60 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > > index 31baa893..6c16515 100644
> > > > +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > > @@ -124,6 +124,7 @@ struct bnxt_re_dev {
> > > >  #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
> > > >       struct net_device               *netdev;
> > > >       unsigned int                    version, major, minor;
> > > > +     struct bnxt_qplib_chip_ctx      *chip_ctx;
> > > >       struct bnxt_en_dev              *en_dev;
> > > >       struct bnxt_msix_entry          msix_entries[BNXT_RE_MAX_MSIX];
> > > >       int                             num_msix;
> > > > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> > > > index e7a997f..e3e1944 100644
> > > > +++ b/drivers/infiniband/hw/bnxt_re/main.c
> > > > @@ -80,6 +80,38 @@
> > > >  static struct workqueue_struct *bnxt_re_wq;
> > > >  static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev);
> > > >
> > > > +static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
> > > > +{
> > > > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > > > +
> > > > +     chip_ctx = rdev->chip_ctx;
> > > > +     rdev->chip_ctx = NULL;
> > > > +     rdev->rcfw.res = NULL;
> > > > +     rdev->qplib_res.cctx = NULL;
> > > > +     kfree(chip_ctx);
> > > > +}
> > > > +
> > > > +static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
> > > > +{
> > > > +     struct bnxt_qplib_chip_ctx *chip_ctx;
> > > > +     struct bnxt_en_dev *en_dev;
> > > > +     struct bnxt *bp;
> > > > +
> > > > +     en_dev = rdev->en_dev;
> > > > +     bp = netdev_priv(en_dev->net);
> > > > +
> > > > +     chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
> > > > +     if (!chip_ctx)
> > > > +             return -ENOMEM;
> > >
> > > It seems a bit weird to kzalloc this? Why not just inline it in the
> > > rdev struct?
> > I did not wanted to pile up another structure to the bnxt_re_device
> > structure and increase its size by the sizeof (struct
> > bnxt_qplib_chip_ctx).
> > eventually this struct may grow bigger. I am not aware if inline'ing
> > is preferred, if that is the case, I will change it.
>
> If struct is not near PAGE_SIZE don't worry about it
>
Okay will change it.
> Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index 31baa893..6c16515 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -124,6 +124,7 @@  struct bnxt_re_dev {
 #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
 	struct net_device		*netdev;
 	unsigned int			version, major, minor;
+	struct bnxt_qplib_chip_ctx	*chip_ctx;
 	struct bnxt_en_dev		*en_dev;
 	struct bnxt_msix_entry		msix_entries[BNXT_RE_MAX_MSIX];
 	int				num_msix;
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index e7a997f..e3e1944 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -80,6 +80,38 @@ 
 static struct workqueue_struct *bnxt_re_wq;
 static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev);
 
+static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
+{
+	struct bnxt_qplib_chip_ctx *chip_ctx;
+
+	chip_ctx = rdev->chip_ctx;
+	rdev->chip_ctx = NULL;
+	rdev->rcfw.res = NULL;
+	rdev->qplib_res.cctx = NULL;
+	kfree(chip_ctx);
+}
+
+static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
+{
+	struct bnxt_qplib_chip_ctx *chip_ctx;
+	struct bnxt_en_dev *en_dev;
+	struct bnxt *bp;
+
+	en_dev = rdev->en_dev;
+	bp = netdev_priv(en_dev->net);
+
+	chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
+	if (!chip_ctx)
+		return -ENOMEM;
+	chip_ctx->chip_num = bp->chip_num;
+
+	rdev->chip_ctx = chip_ctx;
+	rdev->qplib_res.cctx = chip_ctx;
+	rdev->rcfw.res = &rdev->qplib_res;
+
+	return 0;
+}
+
 /* SR-IOV helper functions */
 
 static void bnxt_re_get_sriov_func_type(struct bnxt_re_dev *rdev)
@@ -278,6 +310,7 @@  static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev)
 
 	rc = en_dev->en_ops->bnxt_register_device(en_dev, BNXT_ROCE_ULP,
 						  &bnxt_re_ulp_ops, rdev);
+	rdev->qplib_res.pdev = rdev->en_dev->pdev;
 	return rc;
 }
 
@@ -903,6 +936,7 @@  static void bnxt_re_free_nq_res(struct bnxt_re_dev *rdev)
 	int i;
 
 	for (i = 0; i < rdev->num_msix - 1; i++) {
+		rdev->nq[i].res = NULL;
 		bnxt_re_net_ring_free(rdev, rdev->nq[i].ring_id);
 		bnxt_qplib_free_nq(&rdev->nq[i]);
 	}
@@ -947,6 +981,7 @@  static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev)
 		goto dealloc_res;
 
 	for (i = 0; i < rdev->num_msix - 1; i++) {
+		rdev->nq[i].res = &rdev->qplib_res;
 		rdev->nq[i].hwq.max_elements = BNXT_RE_MAX_CQ_COUNT +
 			BNXT_RE_MAX_SRQC_COUNT + 2;
 		rc = bnxt_qplib_alloc_nq(rdev->en_dev->pdev, &rdev->nq[i]);
@@ -1260,6 +1295,8 @@  static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev)
 			dev_warn(rdev_to_dev(rdev),
 				 "Failed to free MSI-X vectors: %#x", rc);
 	}
+
+	bnxt_re_destroy_chip_ctx(rdev);
 	if (test_and_clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags)) {
 		rc = bnxt_re_unregister_netdev(rdev);
 		if (rc)
@@ -1297,6 +1334,12 @@  static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
 	}
 	set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
 
+	rc = bnxt_re_setup_chip_ctx(rdev);
+	if (rc) {
+		dev_err(rdev_to_dev(rdev), "Failed to get chip context\n");
+		return -EINVAL;
+	}
+
 	/* Check whether VF or PF */
 	bnxt_re_get_sriov_func_type(rdev);
 
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
index 72352ca..f317bae 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
@@ -439,6 +439,7 @@  struct bnxt_qplib_cq {
 
 struct bnxt_qplib_nq {
 	struct pci_dev		*pdev;
+	struct bnxt_qplib_res	*res;
 
 	int			vector;
 	cpumask_t		mask;
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
index be0ef0e..8011d67 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
@@ -187,6 +187,7 @@  struct bnxt_qplib_qp_node {
 /* RCFW Communication Channels */
 struct bnxt_qplib_rcfw {
 	struct pci_dev		*pdev;
+	struct bnxt_qplib_res	*res;
 	int			vector;
 	struct tasklet_struct	worker;
 	bool			requested;
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h
index 1e80aa7..9ad1843 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h
@@ -180,12 +180,20 @@  struct bnxt_qplib_ctx {
 	u64				hwrm_intf_ver;
 };
 
+struct bnxt_qplib_chip_ctx {
+	u16	chip_num;
+	u8	chip_rev;
+	u8	chip_metal;
+};
+
+#define CHIP_NUM_57500          0x1750
+
 struct bnxt_qplib_res {
 	struct pci_dev			*pdev;
+	struct bnxt_qplib_chip_ctx	*cctx;
 	struct net_device		*netdev;
 
 	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;
@@ -193,6 +201,11 @@  struct bnxt_qplib_res {
 	bool				prio;
 };
 
+static inline bool bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx *cctx)
+{
+        return (cctx->chip_num == CHIP_NUM_57500);
+}
+
 #define to_bnxt_qplib(ptr, type, member)	\
 	container_of(ptr, type, member)