Skip to content

Commit

Permalink
bnxt_en: Use auxiliary bus calls over proprietary calls
Browse files Browse the repository at this point in the history
Wherever possible use the function ops provided by auxiliary bus
instead of using proprietary ops.

Defined bnxt_re_suspend and bnxt_re_resume calls which can be
invoked by the bnxt_en driver instead of the ULP stop/start calls.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
  • Loading branch information
Ajit Khaparde committed Feb 2, 2023
1 parent 63669ab commit 3b65e94
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 57 deletions.
102 changes: 61 additions & 41 deletions drivers/infiniband/hw/bnxt_re/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,45 +226,6 @@ static void bnxt_re_set_resource_limits(struct bnxt_re_dev *rdev)
bnxt_re_limit_vf_res(&rdev->qplib_ctx, num_vfs);
}

/* for handling bnxt_en callbacks later */
static void bnxt_re_stop(void *p)
{
struct bnxt_re_dev *rdev = p;
struct bnxt *bp;

if (!rdev)
return;

/* L2 driver invokes this callback during device error/crash or device
* reset. Current RoCE driver doesn't recover the device in case of
* error. Handle the error by dispatching fatal events to all qps
* ie. by calling bnxt_re_dev_stop and release the MSIx vectors as
* L2 driver want to modify the MSIx table.
*/
bp = netdev_priv(rdev->netdev);

ibdev_info(&rdev->ibdev, "Handle device stop call from L2 driver");
/* Check the current device state from L2 structure and move the
* device to detached state if FW_FATAL_COND is set.
* This prevents more commands to HW during clean-up,
* in case the device is already in error.
*/
if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);

bnxt_re_dev_stop(rdev);
bnxt_re_stop_irq(rdev);
/* Move the device states to detached and avoid sending any more
* commands to HW
*/
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
}

static void bnxt_re_start(void *p)
{
}

static void bnxt_re_sriov_config(void *p, int num_vfs)
{
struct bnxt_re_dev *rdev = p;
Expand Down Expand Up @@ -341,8 +302,6 @@ static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
}

static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
.ulp_stop = bnxt_re_stop,
.ulp_start = bnxt_re_start,
.ulp_sriov_config = bnxt_re_sriov_config,
.ulp_irq_stop = bnxt_re_stop_irq,
.ulp_irq_restart = bnxt_re_start_irq
Expand Down Expand Up @@ -1585,6 +1544,65 @@ static int bnxt_re_probe(struct auxiliary_device *adev,
return rc;
}

static int bnxt_re_suspend(struct auxiliary_device *adev, pm_message_t state)
{
struct bnxt_re_dev *rdev = auxiliary_get_drvdata(adev);
struct bnxt *bp;

if (!rdev)
return 0;

mutex_lock(&bnxt_re_mutex);
/* L2 driver may invoke this callback during device error/crash or device
* reset. Current RoCE driver doesn't recover the device in case of
* error. Handle the error by dispatching fatal events to all qps
* ie. by calling bnxt_re_dev_stop and release the MSIx vectors as
* L2 driver want to modify the MSIx table.
*/
bp = netdev_priv(rdev->netdev);

ibdev_info(&rdev->ibdev, "Handle device suspend call");
/* Check the current device state from L2 structure and move the
* device to detached state if FW_FATAL_COND is set.
* This prevents more commands to HW during clean-up,
* in case the device is already in error.
*/
if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);

bnxt_re_dev_stop(rdev);
bnxt_re_stop_irq(rdev);
/* Move the device states to detached and avoid sending any more
* commands to HW
*/
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
mutex_unlock(&bnxt_re_mutex);

return 0;
}

static int bnxt_re_resume(struct auxiliary_device *adev)
{
struct bnxt_re_dev *rdev = auxiliary_get_drvdata(adev);

if (!rdev)
return 0;

mutex_lock(&bnxt_re_mutex);
/* L2 driver may invoke this callback during device recovery, resume.
* reset. Current RoCE driver doesn't recover the device in case of
* error. Handle the error by dispatching fatal events to all qps
* ie. by calling bnxt_re_dev_stop and release the MSIx vectors as
* L2 driver want to modify the MSIx table.
*/

ibdev_info(&rdev->ibdev, "Handle device resume call");
mutex_unlock(&bnxt_re_mutex);

return 0;
}

static const struct auxiliary_device_id bnxt_re_id_table[] = {
{ .name = BNXT_ADEV_NAME ".rdma", },
{},
Expand All @@ -1597,6 +1615,8 @@ static struct auxiliary_driver bnxt_re_driver = {
.probe = bnxt_re_probe,
.remove = bnxt_re_remove,
.shutdown = bnxt_re_shutdown,
.suspend = bnxt_re_suspend,
.resume = bnxt_re_resume,
.id_table = bnxt_re_id_table,
};

Expand Down
40 changes: 26 additions & 14 deletions drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,26 +271,31 @@ static void bnxt_ulp_put(struct bnxt_ulp *ulp)

void bnxt_ulp_stop(struct bnxt *bp)
{
struct bnxt_aux_priv *aux_priv = bp->aux_priv;
struct bnxt_en_dev *edev = bp->edev;
struct bnxt_ulp_ops *ops;
struct bnxt_ulp *ulp;

if (!edev)
return;

edev->flags |= BNXT_EN_FLAG_ULP_STOPPED;
ulp = edev->ulp_tbl;
ops = rtnl_dereference(ulp->ulp_ops);
if (!ops || !ops->ulp_stop)
return;
ops->ulp_stop(ulp->handle);
if (aux_priv) {
struct auxiliary_device *adev;

adev = &aux_priv->aux_dev;
if (adev->dev.driver) {
struct auxiliary_driver *adrv;
pm_message_t pm = {};

adrv = to_auxiliary_drv(adev->dev.driver);
adrv->suspend(adev, pm);
}
}
}

void bnxt_ulp_start(struct bnxt *bp, int err)
{
struct bnxt_aux_priv *aux_priv = bp->aux_priv;
struct bnxt_en_dev *edev = bp->edev;
struct bnxt_ulp_ops *ops;
struct bnxt_ulp *ulp;

if (!edev)
return;
Expand All @@ -300,11 +305,18 @@ void bnxt_ulp_start(struct bnxt *bp, int err)
if (err)
return;

ulp = edev->ulp_tbl;
ops = rtnl_dereference(ulp->ulp_ops);
if (!ops || !ops->ulp_start)
return;
ops->ulp_start(ulp->handle);
if (aux_priv) {
struct auxiliary_device *adev;

adev = &aux_priv->aux_dev;
if (adev->dev.driver) {
struct auxiliary_driver *adrv;

adrv = to_auxiliary_drv(adev->dev.driver);
adrv->resume(adev);
}
}

}

void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs)
Expand Down
2 changes: 0 additions & 2 deletions drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ struct bnxt_msix_entry {
};

struct bnxt_ulp_ops {
void (*ulp_stop)(void *);
void (*ulp_start)(void *);
void (*ulp_sriov_config)(void *, int);
void (*ulp_irq_stop)(void *);
void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
Expand Down

0 comments on commit 3b65e94

Please sign in to comment.