summaryrefslogtreecommitdiffstats
path: root/net/dsa
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2019-09-12 15:16:45 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-09-21 07:18:13 +0200
commit0d84424bdfcd15e9ce01cfcd28e5c9e2a599f8db (patch)
tree23e8bf6e2efea5b62c6477909c7d0418ef363b2a /net/dsa
parent7f4aa339581bf60abd8909e9cfbb04205c596615 (diff)
downloadlinux-stable-0d84424bdfcd15e9ce01cfcd28e5c9e2a599f8db.tar.gz
linux-stable-0d84424bdfcd15e9ce01cfcd28e5c9e2a599f8db.tar.bz2
linux-stable-0d84424bdfcd15e9ce01cfcd28e5c9e2a599f8db.zip
net: dsa: Fix load order between DSA drivers and taggers
[ Upstream commit 23426a25e55a417dc104df08781b6eff95e65f3f ] The DSA core, DSA taggers and DSA drivers all make use of module_init(). Hence they get initialised at device_initcall() time. The ordering is non-deterministic. It can be a DSA driver is bound to a device before the needed tag driver has been initialised, resulting in the message: No tagger for this switch Rather than have this be fatal, return -EPROBE_DEFER so that it is tried again later once all the needed drivers have been loaded. Fixes: d3b8c04988ca ("dsa: Add boilerplate helper to register DSA tag driver modules") Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/dsa')
-rw-r--r--net/dsa/dsa2.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 820dd8da57fc..1739b98a8f4b 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -577,6 +577,8 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
tag_protocol = ds->ops->get_tag_protocol(ds, dp->index);
tag_ops = dsa_tag_driver_get(tag_protocol);
if (IS_ERR(tag_ops)) {
+ if (PTR_ERR(tag_ops) == -ENOPROTOOPT)
+ return -EPROBE_DEFER;
dev_warn(ds->dev, "No tagger for this switch\n");
return PTR_ERR(tag_ops);
}