• Vladimir Oltean's avatar
    net: dsa: tag_ocelot_8021q: break circular dependency with ocelot switch lib · 49f885b2
    Vladimir Oltean authored
    Michael reported that when using the "ocelot-8021q" tagging protocol,
    the switch driver module must be manually loaded before the tagging
    protocol can be loaded/is available.
    
    This appears to be the same problem described here:
    https://lore.kernel.org/netdev/20210908220834.d7gmtnwrorhharna@skbuf/
    where due to the fact that DSA tagging protocols make use of symbols
    exported by the switch drivers, circular dependencies appear and this
    breaks module autoloading.
    
    The ocelot_8021q driver needs the ocelot_can_inject() and
    ocelot_port_inject_frame() functions from the switch library. Previously
    the wrong approach was taken to solve that dependency: shims were
    provided for the case where the ocelot switch library was compiled out,
    but that turns out to be insufficient, because the dependency when the
    switch lib _is_ compiled is problematic too.
    
    We cannot declare ocelot_can_inject() and ocelot_port_inject_frame() as
    static inline functions, because these access I/O functions like
    __ocelot_write_ix() which is called by ocelot_write_rix(). Making those
    static inline basically means exposing the whole guts of the ocelot
    switch library, not ideal...
    
    We already have one tagging protocol driver which calls into the switch
    driver during xmit but not using any exported symbol: sja1105_defer_xmit.
    We can do the same thing here: create a kthread worker and one work item
    per skb, and let the switch driver itself do the register accesses to
    send the skb, and then consume it.
    
    Fixes: 0a6f17c6 ("net: dsa: tag_ocelot_8021q: add support for PTP timestamping")
    Reported-by: default avatarMichael Walle <michael@walle.cc>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    49f885b2
ocelot.h 10.8 KB