net: dsa: exit probe if no switch were found
Subsystems (3)
RFC PATCH 3/3 net: dsa: exit probe if no switch were found
If no switch were found in dsa_setup_dst, return -ENODEV and exit the dsa_probe cleanly.
--- net/dsa/dsa.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
net/dsa/dsa.c +15 -4
@@ -844,10 +844,11 @@ static inline void dsa_of_remove(struct device *dev) }#endif -static void dsa_setup_dst (struct dsa_switch_tree *dst,struct net_device *dev, +static int dsa_setup_dst (struct dsa_switch_tree *dst,struct net_device *dev,struct device *parent,struct dsa_platform_data *pd) {int i; +unsigned configured =0 ; dst->pd = pd; dst->master_netdev = dev;
@@ -867,9 +868,17 @@ static void dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev, dst->ds[i] = ds;if (ds->drv->poll_link !=NULL ) dst->link_poll_needed =1 ; + + ++configured; }/* +* If no switch was found, exit cleanly +*/ +if (!configured) +return -ENODEV ; + +/* * If we use a tagging format that doesn't have an ethertype * field, make sure that all packets from this point on get * sent to the tag format's receive function.
@@ -885,6 +894,8 @@ static void dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev, dst->link_poll_timer.expires =round_jiffies (jiffies +HZ );add_timer (&dst->link_poll_timer); } + +return 0 ; }static int dsa_probe (struct platform_device *pdev)
@@ -934,9 +945,9 @@ static int dsa_probe(struct platform_device *pdev)platform_set_drvdata (pdev, dst); -dsa_setup_dst (dst, dev, &pdev->dev, pd); - -return 0 ; + ret =dsa_setup_dst (dst, dev, &pdev->dev, pd); +if (!ret) +return 0 ; out:dsa_of_remove (&pdev->dev);
Signature · 1 line
1.9.1
Quoted 56 lines · Neil Armstrong
If no switch were found in
dsa_setup_dst, return-ENODEVand exit thedsa_probecleanly.Signed-off-by Neil Armstrong <[email protected]>--- net/dsa/dsa.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)net/dsa/dsa.c +12
-1@@ -844,10 +844,11 @@ static inline void dsa_of_remove(struct device *dev) }#endif -static void dsa_setup_dst (struct dsa_switch_tree *dst,struct net_device *dev, +static int dsa_setup_dst (struct dsa_switch_tree *dst,struct net_device *dev,struct device *parent,struct dsa_platform_data *pd) {int i; +unsigned configured =0 ; dst->pd = pd; dst->master_netdev = dev;@@ -867,9 +868,17 @@ static void dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev, dst->ds[i] = ds;if (ds->drv->poll_link !=NULL ) dst->link_poll_needed =1 ; + + ++configured; }/* +* If no switch was found, exit cleanly +*/ +if (!configured) +return -ENODEV ; + +/* * If we use a tagging format that doesn't have an ethertype * field, make sure that all packets from this point on get * sent to the tag format's receive function. @@ -885,6 +894,8 @@ static void dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev, dst->link_poll_timer.expires =round_jiffies (jiffies +HZ );add_timer (&dst->link_poll_timer); } + +return 0 ; }static int dsa_probe (struct platform_device *pdev)@@ -934,9 +945,9 @@ static int dsa_probe(struct platform_device *pdev)platform_set_drvdata (pdev, dst);
net/dsa/dsa.c static int dsa_probe(struct platform_device *pdev) · line 953
Quoted 10 lines
net/dsa/dsa.c +3
-3-dsa_setup_dst (dst, dev, &pdev->dev, pd); - -return 0 ; + ret =dsa_setup_dst (dst, dev, &pdev->dev, pd); +if (!ret) +return 0 ; out:dsa_of_remove (&pdev->dev);
Couldn't we use the probe defer mechanism here ? (until complete rework is done)
How could we re-probe after a register_switch_driver ?
Neil
Andrew Lunn
maintainerQuoted 3 lines · Neil Armstrong
Quoted 2 lines · Neil Armstrong
If no switch were found in
dsa_setup_dst, return-ENODEVand exit thedsa_probecleanly.
...
Quoted 1 line
Couldn't we use the probe defer mechanism here ? (until complete rework is done)
Hi Neil
I was thinking the same last night. We know the switch should be there, otherwise it would not be in DT. So returning -EPROBE_DEFER would be valid.
Andrew
Quoted 9 lines · Andrew Lunn
Quoted 3 lines · Neil Armstrong
Quoted 2 lines · Neil Armstrong
If no switch were found in
dsa_setup_dst, return-ENODEVand exit thedsa_probecleanly....
Quoted 1 line
Couldn't we use the probe defer mechanism here ? (until complete rework is done)
Quoted 8 lines
Hi Neil
I was thinking the same last night. We know the switch should be there, otherwise it would not be in DT. So returning -EPROBE_DEFER would be valid.
Andrew
Hi,
It makes sens but does a module insertion triggers the differed probe ?
I will still post this change in a next set of patch.
Neil
Quoted 16 lines · Neil Armstrong
Quoted 15 lines · Andrew Lunn
Quoted 3 lines · Neil Armstrong
Quoted 2 lines · Neil Armstrong
If no switch were found in
dsa_setup_dst, return-ENODEVand exit thedsa_probecleanly....
Quoted 1 line
Couldn't we use the probe defer mechanism here ? (until complete rework is done)
Hi Neil
I was thinking the same last night. We know the switch should be there, otherwise it would not be in DT. So returning -EPROBE_DEFER would be valid.
Quoted 5 lines
Quoted 2 lines
Andrew
Hi,
It makes sens but does a module insertion triggers the differed probe ?
That's a good question, I am not convinced this is the case. Even with the EPROBE_DEFER returned if the list of drivers is empty, you would still very likely run into the following circular dependency, if you make everything built as a module:
- dsa provides register_switch_driver and unregister_switch_driver
- switch drivers in drivers/net/dsa/* depend on these two symbols, so until these symbols are loaded, the module loader cannot complete their load successfully
- dsa will not be able to make any progress, that is, its driver list will be empty as long as no switch driver is loaded
If you build dsa into your kernel, you might be fine though, or in a better shape at least.
Signature · 1 line
Florian