mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
bnxt_en: Use auxiliary bus calls over proprietary calls
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>
This commit is contained in:
parent
63669ab384
commit
3b65e9456c
|
|
@ -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;
|
||||
|
|
@ -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
|
||||
|
|
@ -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", },
|
||||
{},
|
||||
|
|
@ -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,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user