net: enetc: allow the enetc_reconfigure() callback to fail
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 3 Feb 2023 00:11:14 +0000 (02:11 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 4 Feb 2023 04:05:57 +0000 (20:05 -0800)
enetc_reconfigure() was modified in commit c33bfaf91c4c ("net: enetc:
set up XDP program under enetc_reconfigure()") to take an optional
callback that runs while the netdev is down, but this callback currently
cannot fail.

Code up the error handling so that the interface is restarted with the
old resources if the callback fails.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc.c

index 3a80f259b17e94618af0a6159e23650e8423d6ac..5d7eeb1b5a23b204361024d4e0e881387b53d5fd 100644 (file)
@@ -2574,8 +2574,11 @@ static int enetc_reconfigure(struct enetc_ndev_priv *priv, bool extended,
         * without reconfiguration.
         */
        if (!netif_running(priv->ndev)) {
-               if (cb)
-                       cb(priv, ctx);
+               if (cb) {
+                       err = cb(priv, ctx);
+                       if (err)
+                               return err;
+               }
 
                return 0;
        }
@@ -2596,8 +2599,11 @@ static int enetc_reconfigure(struct enetc_ndev_priv *priv, bool extended,
        enetc_free_rxtx_rings(priv);
 
        /* Interface is down, run optional callback now */
-       if (cb)
-               cb(priv, ctx);
+       if (cb) {
+               err = cb(priv, ctx);
+               if (err)
+                       goto out_restart;
+       }
 
        enetc_assign_tx_resources(priv, tx_res);
        enetc_assign_rx_resources(priv, rx_res);
@@ -2606,6 +2612,10 @@ static int enetc_reconfigure(struct enetc_ndev_priv *priv, bool extended,
 
        return 0;
 
+out_restart:
+       enetc_setup_bdrs(priv, extended);
+       enetc_start(priv->ndev);
+       enetc_free_rx_resources(rx_res, priv->num_rx_rings);
 out_free_tx_res:
        enetc_free_tx_resources(tx_res, priv->num_tx_rings);
 out: