Patch "net: dpaa2-switch: disable the control interface on error path" has been added to the 5.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: dpaa2-switch: disable the control interface on error path

to the 5.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-dpaa2-switch-disable-the-control-interface-on-er.patch
and it can be found in the queue-5.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f273137eae967d3677ad7c82156e0523b6fb86ae
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Thu Aug 19 17:17:55 2021 +0300

    net: dpaa2-switch: disable the control interface on error path
    
    [ Upstream commit cd0a719fbd702eb4b455a6ad986483750125588a ]
    
    Currently dpaa2_switch_takedown has a funny name and does not do the
    opposite of dpaa2_switch_init, which makes probing fail when we need to
    handle an -EPROBE_DEFER.
    
    A sketch of what dpaa2_switch_init does:
    
            dpsw_open
    
            dpaa2_switch_detect_features
    
            dpsw_reset
    
            for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
                    dpsw_if_disable
    
                    dpsw_if_set_stp
    
                    dpsw_vlan_remove_if_untagged
    
                    dpsw_if_set_tci
    
                    dpsw_vlan_remove_if
            }
    
            dpsw_vlan_remove
    
            alloc_ordered_workqueue
    
            dpsw_fdb_remove
    
            dpaa2_switch_ctrl_if_setup
    
    When dpaa2_switch_takedown is called from the error path of
    dpaa2_switch_probe(), the control interface, enabled by
    dpaa2_switch_ctrl_if_setup from dpaa2_switch_init, remains enabled,
    because dpaa2_switch_takedown does not call
    dpaa2_switch_ctrl_if_teardown.
    
    Since dpaa2_switch_probe might fail due to EPROBE_DEFER of a PHY, this
    means that a second probe of the driver will happen with the control
    interface directly enabled.
    
    This will trigger a second error:
    
    [   93.273528] fsl_dpaa2_switch dpsw.0: dpsw_ctrl_if_set_pools() failed
    [   93.281966] fsl_dpaa2_switch dpsw.0: fsl_mc_driver_probe failed: -13
    [   93.288323] fsl_dpaa2_switch: probe of dpsw.0 failed with error -13
    
    Which if we investigate the /dev/dpaa2_mc_console log, we find out is
    caused by:
    
    [E, ctrl_if_set_pools:2211, DPMNG]  ctrl_if must be disabled
    
    So make dpaa2_switch_takedown do the opposite of dpaa2_switch_init (in
    reasonable limits, no reason to change STP state, re-add VLANs etc), and
    rename it to something more conventional, like dpaa2_switch_teardown.
    
    Fixes: 613c0a5810b7 ("staging: dpaa2-switch: enable the control interface")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Reviewed-by: Ioana Ciornei <ioana.ciornei@xxxxxxx>
    Link: https://lore.kernel.org/r/20210819141755.1931423-1-vladimir.oltean@xxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
index 87321b7239cf..58964d22cb17 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
@@ -3038,26 +3038,30 @@ static int dpaa2_switch_port_init(struct ethsw_port_priv *port_priv, u16 port)
 	return err;
 }
 
-static void dpaa2_switch_takedown(struct fsl_mc_device *sw_dev)
+static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
+{
+	dpsw_ctrl_if_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
+	dpaa2_switch_free_dpio(ethsw);
+	dpaa2_switch_destroy_rings(ethsw);
+	dpaa2_switch_drain_bp(ethsw);
+	dpaa2_switch_free_dpbp(ethsw);
+}
+
+static void dpaa2_switch_teardown(struct fsl_mc_device *sw_dev)
 {
 	struct device *dev = &sw_dev->dev;
 	struct ethsw_core *ethsw = dev_get_drvdata(dev);
 	int err;
 
+	dpaa2_switch_ctrl_if_teardown(ethsw);
+
+	destroy_workqueue(ethsw->workqueue);
+
 	err = dpsw_close(ethsw->mc_io, 0, ethsw->dpsw_handle);
 	if (err)
 		dev_warn(dev, "dpsw_close err %d\n", err);
 }
 
-static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
-{
-	dpsw_ctrl_if_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
-	dpaa2_switch_free_dpio(ethsw);
-	dpaa2_switch_destroy_rings(ethsw);
-	dpaa2_switch_drain_bp(ethsw);
-	dpaa2_switch_free_dpbp(ethsw);
-}
-
 static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
 {
 	struct ethsw_port_priv *port_priv;
@@ -3068,8 +3072,6 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
 	dev = &sw_dev->dev;
 	ethsw = dev_get_drvdata(dev);
 
-	dpaa2_switch_ctrl_if_teardown(ethsw);
-
 	dpaa2_switch_teardown_irqs(sw_dev);
 
 	dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
@@ -3084,9 +3086,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
 	kfree(ethsw->acls);
 	kfree(ethsw->ports);
 
-	dpaa2_switch_takedown(sw_dev);
-
-	destroy_workqueue(ethsw->workqueue);
+	dpaa2_switch_teardown(sw_dev);
 
 	fsl_mc_portal_free(ethsw->mc_io);
 
@@ -3199,7 +3199,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev)
 			       GFP_KERNEL);
 	if (!(ethsw->ports)) {
 		err = -ENOMEM;
-		goto err_takedown;
+		goto err_teardown;
 	}
 
 	ethsw->fdbs = kcalloc(ethsw->sw_attr.num_ifs, sizeof(*ethsw->fdbs),
@@ -3270,8 +3270,8 @@ err_free_fdbs:
 err_free_ports:
 	kfree(ethsw->ports);
 
-err_takedown:
-	dpaa2_switch_takedown(sw_dev);
+err_teardown:
+	dpaa2_switch_teardown(sw_dev);
 
 err_free_cmdport:
 	fsl_mc_portal_free(ethsw->mc_io);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux