net: sfp: add mandatory attach/detach methods for sfp buses
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 28 May 2019 09:57:34 +0000 (10:57 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 31 May 2019 19:37:46 +0000 (12:37 -0700)
Add attach and detach methods for SFP buses, which will allow us to get
rid of the netdev storage in sfp-bus.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phylink.c
drivers/net/phy/sfp-bus.c
include/linux/sfp.h

index eb07c3d8f09efb945e320e0f404caf161840752d..503f4b221696a4383d6d8efee8c4ffe91cb4982a 100644 (file)
@@ -1650,6 +1650,20 @@ int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd)
 }
 EXPORT_SYMBOL_GPL(phylink_mii_ioctl);
 
+static void phylink_sfp_attach(void *upstream, struct sfp_bus *bus)
+{
+       struct phylink *pl = upstream;
+
+       pl->netdev->sfp_bus = bus;
+}
+
+static void phylink_sfp_detach(void *upstream, struct sfp_bus *bus)
+{
+       struct phylink *pl = upstream;
+
+       pl->netdev->sfp_bus = NULL;
+}
+
 static int phylink_sfp_module_insert(void *upstream,
                                     const struct sfp_eeprom_id *id)
 {
@@ -1768,6 +1782,8 @@ static void phylink_sfp_disconnect_phy(void *upstream)
 }
 
 static const struct sfp_upstream_ops sfp_phylink_ops = {
+       .attach = phylink_sfp_attach,
+       .detach = phylink_sfp_detach,
        .module_insert = phylink_sfp_module_insert,
        .link_up = phylink_sfp_link_up,
        .link_down = phylink_sfp_link_down,
index e9c187946cca6339a8f50943a308d4f6e6acab01..0608203cc752ab2c18ad9010f447f8daeda97afb 100644 (file)
@@ -351,7 +351,7 @@ static int sfp_register_bus(struct sfp_bus *bus)
        bus->socket_ops->attach(bus->sfp);
        if (bus->started)
                bus->socket_ops->start(bus->sfp);
-       bus->netdev->sfp_bus = bus;
+       bus->upstream_ops->attach(bus->upstream, bus);
        bus->registered = true;
        return 0;
 }
@@ -360,8 +360,8 @@ static void sfp_unregister_bus(struct sfp_bus *bus)
 {
        const struct sfp_upstream_ops *ops = bus->upstream_ops;
 
-       bus->netdev->sfp_bus = NULL;
        if (bus->registered) {
+               bus->upstream_ops->detach(bus->upstream, bus);
                if (bus->started)
                        bus->socket_ops->stop(bus->sfp);
                bus->socket_ops->detach(bus->sfp);
index d9d9de3fcf8e297a49f86a0e8103c815102fefbb..a3f0336dd7038210b23279c109df119f8ff1b0e0 100644 (file)
@@ -469,6 +469,10 @@ struct sfp_bus;
 
 /**
  * struct sfp_upstream_ops - upstream operations structure
+ * @attach: called when the sfp socket driver is bound to the upstream
+ *   (mandatory).
+ * @detach: called when the sfp socket driver is unbound from the upstream
+ *   (mandatory).
  * @module_insert: called after a module has been detected to determine
  *   whether the module is supported for the upstream device.
  * @module_remove: called after the module has been removed.
@@ -481,6 +485,8 @@ struct sfp_bus;
  *   been removed.
  */
 struct sfp_upstream_ops {
+       void (*attach)(void *priv, struct sfp_bus *bus);
+       void (*detach)(void *priv, struct sfp_bus *bus);
        int (*module_insert)(void *priv, const struct sfp_eeprom_id *id);
        void (*module_remove)(void *priv);
        void (*link_down)(void *priv);