]> www.infradead.org Git - nvme.git/commitdiff
net: pcs: xpcs: Split up xpcs_create() body to sub-functions
authorSerge Semin <fancer.lancer@gmail.com>
Mon, 1 Jul 2024 18:28:33 +0000 (21:28 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 5 Jul 2024 08:35:49 +0000 (09:35 +0100)
As an initial preparation before adding the fwnode-based DW XPCS device
support let's split the xpcs_create() function code up to a set of the
small sub-functions. Thus the xpcs_create() implementation will get to
look simpler and turn to be more coherent. Further updates will just touch
the new sub-functions a bit: add platform-specific device info, add the
reference clock getting and enabling.

The xpcs_create() method will now contain the next static methods calls:

xpcs_create_data() - create the DW XPCS device descriptor, pre-initialize
it' fields and increase the mdio device refcount-er;

xpcs_init_id() - find XPCS ID instance and save it in the device
descriptor;

xpcs_init_iface() - find MAC/PCS interface descriptor and perform
basic initialization specific to it: soft-reset, disable polling.

The update doesn't imply any semantic change but merely makes the code
looking simpler and more ready for adding new features support.

Note the xpcs_destroy() has been moved to being defined below the
xpcs_create_mdiodev() function as the driver now implies having the
protagonist-then-antagonist functions definition order.

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/pcs/pcs-xpcs.c

index 99adbf15ab360703bb240f32cda4af33a77e05d5..2dcfd0ff069ad61e69b106f6640fcdda4545395d 100644 (file)
@@ -1365,12 +1365,9 @@ static const struct phylink_pcs_ops xpcs_phylink_ops = {
        .pcs_link_up = xpcs_link_up,
 };
 
-static struct dw_xpcs *xpcs_create(struct mdio_device *mdiodev,
-                                  phy_interface_t interface)
+static struct dw_xpcs *xpcs_create_data(struct mdio_device *mdiodev)
 {
        struct dw_xpcs *xpcs;
-       u32 xpcs_id;
-       int i, ret;
 
        xpcs = kzalloc(sizeof(*xpcs), GFP_KERNEL);
        if (!xpcs)
@@ -1378,59 +1375,89 @@ static struct dw_xpcs *xpcs_create(struct mdio_device *mdiodev,
 
        mdio_device_get(mdiodev);
        xpcs->mdiodev = mdiodev;
+       xpcs->pcs.ops = &xpcs_phylink_ops;
+       xpcs->pcs.neg_mode = true;
+       xpcs->pcs.poll = true;
+
+       return xpcs;
+}
+
+static void xpcs_free_data(struct dw_xpcs *xpcs)
+{
+       mdio_device_put(xpcs->mdiodev);
+       kfree(xpcs);
+}
+
+static int xpcs_init_id(struct dw_xpcs *xpcs)
+{
+       u32 xpcs_id;
+       int i, ret;
 
        xpcs_id = xpcs_get_id(xpcs);
 
        for (i = 0; i < ARRAY_SIZE(xpcs_id_list); i++) {
                const struct xpcs_id *entry = &xpcs_id_list[i];
-               const struct xpcs_compat *compat;
 
                if ((xpcs_id & entry->mask) != entry->id)
                        continue;
 
                xpcs->id = entry;
 
-               compat = xpcs_find_compat(entry, interface);
-               if (!compat) {
-                       ret = -ENODEV;
-                       goto out;
-               }
+               break;
+       }
 
-               ret = xpcs_dev_flag(xpcs);
-               if (ret)
-                       goto out;
+       if (!xpcs->id)
+               return -ENODEV;
 
-               xpcs->pcs.ops = &xpcs_phylink_ops;
-               xpcs->pcs.neg_mode = true;
+       ret = xpcs_dev_flag(xpcs);
+       if (ret < 0)
+               return ret;
 
-               if (xpcs->dev_flag != DW_DEV_TXGBE) {
-                       xpcs->pcs.poll = true;
+       return 0;
+}
 
-                       ret = xpcs_soft_reset(xpcs, compat);
-                       if (ret)
-                               goto out;
-               }
+static int xpcs_init_iface(struct dw_xpcs *xpcs, phy_interface_t interface)
+{
+       const struct xpcs_compat *compat;
 
-               return xpcs;
+       compat = xpcs_find_compat(xpcs->id, interface);
+       if (!compat)
+               return -EINVAL;
+
+       if (xpcs->dev_flag == DW_DEV_TXGBE) {
+               xpcs->pcs.poll = false;
+               return 0;
        }
 
-       ret = -ENODEV;
+       return xpcs_soft_reset(xpcs, compat);
+}
+
+static struct dw_xpcs *xpcs_create(struct mdio_device *mdiodev,
+                                  phy_interface_t interface)
+{
+       struct dw_xpcs *xpcs;
+       int ret;
+
+       xpcs = xpcs_create_data(mdiodev);
+       if (IS_ERR(xpcs))
+               return xpcs;
+
+       ret = xpcs_init_id(xpcs);
+       if (ret)
+               goto out;
+
+       ret = xpcs_init_iface(xpcs, interface);
+       if (ret)
+               goto out;
+
+       return xpcs;
 
 out:
-       mdio_device_put(mdiodev);
-       kfree(xpcs);
+       xpcs_free_data(xpcs);
 
        return ERR_PTR(ret);
 }
 
-void xpcs_destroy(struct dw_xpcs *xpcs)
-{
-       if (xpcs)
-               mdio_device_put(xpcs->mdiodev);
-       kfree(xpcs);
-}
-EXPORT_SYMBOL_GPL(xpcs_destroy);
-
 struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr,
                                    phy_interface_t interface)
 {
@@ -1455,5 +1482,14 @@ struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr,
 }
 EXPORT_SYMBOL_GPL(xpcs_create_mdiodev);
 
+void xpcs_destroy(struct dw_xpcs *xpcs)
+{
+       if (!xpcs)
+               return;
+
+       xpcs_free_data(xpcs);
+}
+EXPORT_SYMBOL_GPL(xpcs_destroy);
+
 MODULE_DESCRIPTION("Synopsys DesignWare XPCS library");
 MODULE_LICENSE("GPL v2");