Skip to content

Commit

Permalink
bnxt_en: Use direct API instead of indirection
Browse files Browse the repository at this point in the history
For a single ULP user there is no need for complicating function
indirection calls. Remove all this complexity in favour of direct
function calls exported by the bnxt_en driver. This allows to
simplify the code greatly.

Suggested-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
  • Loading branch information
ajitkhaparde authored and intel-lab-lkp committed Oct 25, 2022
1 parent 92c7d0e commit 8a686d1
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 116 deletions.
71 changes: 16 additions & 55 deletions drivers/infiniband/hw/bnxt_re/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -353,23 +353,6 @@ static struct bnxt_ulp_ops bnxt_re_ulp_ops = {

/* RoCE -> Net driver */

/* Driver registration routines used to let the networking driver (bnxt_en)
* to know that the RoCE driver is now installed
*/
static int bnxt_re_unregister_netdev(struct bnxt_re_dev *rdev)
{
struct bnxt_en_dev *en_dev;
int rc;

if (!rdev)
return -EINVAL;

en_dev = rdev->en_dev;

rc = en_dev->en_ops->bnxt_unregister_device(rdev->en_dev);
return rc;
}

static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev)
{
struct bnxt_en_dev *en_dev;
Expand All @@ -380,26 +363,12 @@ static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev)

en_dev = rdev->en_dev;

rc = en_dev->en_ops->bnxt_register_device(en_dev,
&bnxt_re_ulp_ops, rdev);
rdev->qplib_res.pdev = rdev->en_dev->pdev;
rc = bnxt_register_dev(en_dev, &bnxt_re_ulp_ops, rdev);
if (!rc)
rdev->qplib_res.pdev = rdev->en_dev->pdev;
return rc;
}

static int bnxt_re_free_msix(struct bnxt_re_dev *rdev)
{
struct bnxt_en_dev *en_dev;

if (!rdev)
return -EINVAL;

en_dev = rdev->en_dev;

en_dev->en_ops->bnxt_free_msix(rdev->en_dev);

return 0;
}

static int bnxt_re_request_msix(struct bnxt_re_dev *rdev)
{
int rc = 0, num_msix_want = BNXT_RE_MAX_MSIX, num_msix_got;
Expand All @@ -412,9 +381,9 @@ static int bnxt_re_request_msix(struct bnxt_re_dev *rdev)

num_msix_want = min_t(u32, BNXT_RE_MAX_MSIX, num_online_cpus());

num_msix_got = en_dev->en_ops->bnxt_request_msix(en_dev,
rdev->msix_entries,
num_msix_want);
num_msix_got = bnxt_req_msix_vecs(en_dev,
rdev->msix_entries,
num_msix_want);
if (num_msix_got < BNXT_RE_MIN_MSIX) {
rc = -EINVAL;
goto done;
Expand Down Expand Up @@ -475,7 +444,7 @@ static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev,
req.ring_id = cpu_to_le16(fw_ring_id);
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (rc)
ibdev_err(&rdev->ibdev, "Failed to free HW ring:%d :%#x",
req.ring_id, rc);
Expand Down Expand Up @@ -512,7 +481,7 @@ static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev,
req.int_mode = ring_attr->mode;
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (!rc)
*fw_ring_id = le16_to_cpu(resp.ring_id);

Expand Down Expand Up @@ -540,7 +509,7 @@ static int bnxt_re_net_stats_ctx_free(struct bnxt_re_dev *rdev,
req.stat_ctx_id = cpu_to_le32(fw_stats_ctx_id);
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (rc)
ibdev_err(&rdev->ibdev, "Failed to free HW stats context %#x",
rc);
Expand Down Expand Up @@ -573,7 +542,7 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,
req.stat_ctx_flags = STAT_CTX_ALLOC_REQ_STAT_CTX_FLAGS_ROCE;
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (!rc)
*fw_stats_ctx_id = le32_to_cpu(resp.stat_ctx_id);

Expand Down Expand Up @@ -1079,7 +1048,7 @@ static int bnxt_re_query_hwrm_pri2cos(struct bnxt_re_dev *rdev, u8 dir,

bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (rc)
return rc;

Expand Down Expand Up @@ -1265,7 +1234,7 @@ static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
req.hwrm_intf_upd = HWRM_VERSION_UPDATE;
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, &fw_msg);
rc = bnxt_send_msg(en_dev, &fw_msg);
if (rc) {
ibdev_err(&rdev->ibdev, "Failed to query HW version, rc = 0x%x",
rc);
Expand Down Expand Up @@ -1328,20 +1297,12 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev)
bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id, type);
bnxt_qplib_free_rcfw_channel(&rdev->rcfw);
}
if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags)) {
rc = bnxt_re_free_msix(rdev);
if (rc)
ibdev_warn(&rdev->ibdev,
"Failed to free MSI-X vectors: %#x", rc);
}
if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags))
bnxt_free_msix_vecs(rdev->en_dev);

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)
ibdev_warn(&rdev->ibdev,
"Failed to unregister with netdev: %#x", rc);
}
if (test_and_clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags))
bnxt_unregister_dev(rdev->en_dev);
}

/* worker thread for polling periodic events. Now used for QoS programming*/
Expand Down
64 changes: 18 additions & 46 deletions drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@

static DEFINE_IDA(bnxt_aux_dev_ids);

static int bnxt_register_dev(struct bnxt_en_dev *edev,
struct bnxt_ulp_ops *ulp_ops,
void *handle)
int bnxt_register_dev(struct bnxt_en_dev *edev,
struct bnxt_ulp_ops *ulp_ops,
void *handle)
{
struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev);
Expand All @@ -55,8 +55,9 @@ static int bnxt_register_dev(struct bnxt_en_dev *edev,

return 0;
}
EXPORT_SYMBOL(bnxt_register_dev);

static int bnxt_unregister_dev(struct bnxt_en_dev *edev)
void bnxt_unregister_dev(struct bnxt_en_dev *edev)
{
struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev);
Expand All @@ -65,7 +66,7 @@ static int bnxt_unregister_dev(struct bnxt_en_dev *edev)

ulp = edev->ulp_tbl;
if (ulp->msix_requested)
edev->en_ops->bnxt_free_msix(edev);
bnxt_free_msix_vecs(edev);

if (ulp->max_async_event_id)
bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, true);
Expand All @@ -78,8 +79,9 @@ static int bnxt_unregister_dev(struct bnxt_en_dev *edev)
}
kfree(ulp);
edev->ulp_tbl = NULL;
return 0;
return;
}
EXPORT_SYMBOL(bnxt_unregister_dev);

static void bnxt_fill_msix_vecs(struct bnxt *bp, struct bnxt_msix_entry *ent)
{
Expand All @@ -101,7 +103,7 @@ static void bnxt_fill_msix_vecs(struct bnxt *bp, struct bnxt_msix_entry *ent)
}
}

static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev,
int bnxt_req_msix_vecs(struct bnxt_en_dev *edev,
struct bnxt_msix_entry *ent,
int num_msix)
{
Expand Down Expand Up @@ -164,8 +166,9 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev,
edev->flags |= BNXT_EN_FLAG_MSIX_REQUESTED;
return avail_msix;
}
EXPORT_SYMBOL(bnxt_req_msix_vecs);

static void bnxt_free_msix_vecs(struct bnxt_en_dev *edev)
void bnxt_free_msix_vecs(struct bnxt_en_dev *edev)
{
struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev);
Expand All @@ -184,6 +187,7 @@ static void bnxt_free_msix_vecs(struct bnxt_en_dev *edev)

return;
}
EXPORT_SYMBOL(bnxt_free_msix_vecs);

int bnxt_get_ulp_msix_num(struct bnxt *bp)
{
Expand Down Expand Up @@ -218,7 +222,7 @@ int bnxt_get_ulp_stat_ctxs(struct bnxt *bp)
return 0;
}

static int bnxt_send_msg(struct bnxt_en_dev *edev,
int bnxt_send_msg(struct bnxt_en_dev *edev,
struct bnxt_fw_msg *fw_msg)
{
struct net_device *dev = edev->net;
Expand Down Expand Up @@ -252,6 +256,7 @@ static int bnxt_send_msg(struct bnxt_en_dev *edev,
hwrm_req_drop(bp, req);
return rc;
}
EXPORT_SYMBOL(bnxt_send_msg);

static void bnxt_ulp_get(struct bnxt_ulp *ulp)
{
Expand Down Expand Up @@ -310,14 +315,11 @@ void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs)
if (!edev)
return;

rcu_read_lock();
ops = rcu_dereference(ulp->ulp_ops);
if (!ops || !ops->ulp_sriov_config) {
rcu_read_unlock();
ops = rtnl_dereference(ulp->ulp_ops);
if (!ops || !ops->ulp_sriov_config)
return;
}

bnxt_ulp_get(ulp);
rcu_read_unlock();
ops->ulp_sriov_config(ulp->handle, num_vfs);
bnxt_ulp_put(ulp);
}
Expand Down Expand Up @@ -384,10 +386,9 @@ void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl)
if (!edev)
return;

rcu_read_lock();
ulp = edev->ulp_tbl;

ops = rcu_dereference(ulp->ulp_ops);
ops = rtnl_dereference(ulp->ulp_ops);
if (!ops || !ops->ulp_async_notifier)
return;
if (!ulp->async_events_bmap || event_id > ulp->max_async_event_id)
Expand All @@ -397,35 +398,8 @@ void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl)
smp_rmb();
if (test_bit(event_id, ulp->async_events_bmap))
ops->ulp_async_notifier(ulp->handle, cmpl);
rcu_read_unlock();
}

static int bnxt_register_async_events(struct bnxt_en_dev *edev,
unsigned long *events_bmap,
u16 max_id)
{
struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev);
struct bnxt_ulp *ulp;

ulp = edev->ulp_tbl;
ulp->async_events_bmap = events_bmap;
/* Make sure bnxt_ulp_async_events() sees this order */
smp_wmb();
ulp->max_async_event_id = max_id;
bnxt_hwrm_func_drv_rgtr(bp, events_bmap, max_id + 1, true);
return 0;
}

static const struct bnxt_en_ops bnxt_en_ops_tbl = {
.bnxt_register_device = bnxt_register_dev,
.bnxt_unregister_device = bnxt_unregister_dev,
.bnxt_request_msix = bnxt_req_msix_vecs,
.bnxt_free_msix = bnxt_free_msix_vecs,
.bnxt_send_fw_msg = bnxt_send_msg,
.bnxt_register_fw_async_events = bnxt_register_async_events,
};

void bnxt_aux_dev_free(struct bnxt *bp)
{
kfree(bp->aux_dev);
Expand Down Expand Up @@ -494,15 +468,13 @@ void bnxt_aux_dev_release(struct device *dev)
container_of(dev, struct bnxt_aux_dev, aux_dev.dev);
struct bnxt *bp = netdev_priv(bnxt_adev->edev->net);

bnxt_adev->edev->en_ops = NULL;
kfree(bnxt_adev->edev);
bnxt_adev->edev = NULL;
bp->edev = NULL;
}

static inline void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
{
edev->en_ops = &bnxt_en_ops_tbl;
edev->net = bp->dev;
edev->pdev = bp->pdev;
edev->l2_db_size = bp->db_size;
Expand Down
24 changes: 9 additions & 15 deletions drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ struct bnxt_fw_msg {

struct bnxt_ulp {
void *handle;
struct bnxt_ulp_ops __rcu *ulp_ops;
struct bnxt_ulp_ops *ulp_ops;
unsigned long *async_events_bmap;
u16 max_async_event_id;
u16 msix_requested;
Expand All @@ -65,7 +65,6 @@ struct bnxt_en_dev {
BNXT_EN_FLAG_ROCEV2_CAP)
#define BNXT_EN_FLAG_MSIX_REQUESTED 0x4
#define BNXT_EN_FLAG_ULP_STOPPED 0x8
const struct bnxt_en_ops *en_ops;
struct bnxt_ulp *ulp_tbl;
int l2_db_size; /* Doorbell BAR size in
* bytes mapped by L2
Expand All @@ -77,19 +76,6 @@ struct bnxt_en_dev {
*/
};

struct bnxt_en_ops {
int (*bnxt_register_device)(struct bnxt_en_dev *edev,
struct bnxt_ulp_ops *ulp_ops, void *handle);
int (*bnxt_unregister_device)(struct bnxt_en_dev *edev);
int (*bnxt_request_msix)(struct bnxt_en_dev *edev,
struct bnxt_msix_entry *ent, int num_msix);
void (*bnxt_free_msix)(struct bnxt_en_dev *edev);
int (*bnxt_send_fw_msg)(struct bnxt_en_dev *edev,
struct bnxt_fw_msg *fw_msg);
int (*bnxt_register_fw_async_events)(struct bnxt_en_dev *edev,
unsigned long *events_bmap, u16 max_id);
};

static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev)
{
if (edev && edev->ulp_tbl)
Expand All @@ -112,4 +98,12 @@ int bnxt_rdma_aux_device_add(struct bnxt *bp);
void bnxt_rdma_aux_device_uninit(struct bnxt_aux_dev *bnxt_adev);
void bnxt_rdma_aux_device_init(struct bnxt *bp);
void bnxt_aux_dev_free(struct bnxt *bp);

int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,
void *handle);
void bnxt_unregister_dev(struct bnxt_en_dev *edev);
int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, struct bnxt_msix_entry *ent,
int num_msix);
void bnxt_free_msix_vecs(struct bnxt_en_dev *edev);
int bnxt_send_msg(struct bnxt_en_dev *edev, struct bnxt_fw_msg *fw_msg);
#endif

0 comments on commit 8a686d1

Please sign in to comment.