bnxt_en: Use auxiliary bus calls over proprietary calls
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Wed, 7 Sep 2022 20:22:42 +0000 (13:22 -0700)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Thu, 2 Feb 2023 03:02:14 +0000 (19:02 -0800)
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>
drivers/infiniband/hw/bnxt_re/main.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h

index fa64fe9..ffcd2a4 100644 (file)
@@ -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 @@ err:
        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,
 };
 
index 218c565..72815f3 100644 (file)
@@ -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)
index 6ce2a18..adc5a9a 100644 (file)
@@ -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 *);