diff options
author | Andrew Lunn <andrew@lunn.ch> | 2019-09-12 15:16:45 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-15 20:49:19 +0200 |
commit | 23426a25e55a417dc104df08781b6eff95e65f3f (patch) | |
tree | 69ed995df9f624e54000def38dd9f44a6da8a879 | |
parent | net/sched: fix race between deactivation and dequeue for NOLOCK qdisc (diff) | |
download | linux-23426a25e55a417dc104df08781b6eff95e65f3f.tar.xz linux-23426a25e55a417dc104df08781b6eff95e65f3f.zip |
net: dsa: Fix load order between DSA drivers and taggers
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>
-rw-r--r-- | net/dsa/dsa2.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 3abd173ebacb..96f787cf9b6e 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -623,6 +623,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); } |