From: Saeed Mahameed <saeedm@mellanox.com> To: "claudiu.manoil@nxp.com" <claudiu.manoil@nxp.com>, "davem@davemloft.net" <davem@davemloft.net> Cc: "linux-arm-kernel@lists.infradead.org" <linux-arm-kernel@lists.infradead.org>, "leoyang.li@nxp.com" <leoyang.li@nxp.com>, "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>, "netdev@vger.kernel.org" <netdev@vger.kernel.org>, "alexandru.marginean@nxp.com" <alexandru.marginean@nxp.com>, "robh+dt@kernel.org" <robh+dt@kernel.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org> Subject: Re: [PATCH net-next 1/3] enetc: Add mdio bus driver for the PCIe MDIO endpoint Date: Tue, 23 Jul 2019 20:49:27 +0000 [thread overview] Message-ID: <2e3c565cacae6050656aeb7c0132736c60f9f4ee.camel@mellanox.com> (raw) In-Reply-To: <1563894955-545-2-git-send-email-claudiu.manoil@nxp.com> On Tue, 2019-07-23 at 18:15 +0300, Claudiu Manoil wrote: > ENETC ports can manage the MDIO bus via local register > interface. However there's also a centralized way > to manage the MDIO bus, via the MDIO PCIe endpoint > device integrated by the same root complex that also > integrates the ENETC ports (eth controllers). > > Depending on board design and use case, centralized > access to MDIO may be better than using local ENETC > port registers. For instance, on the LS1028A QDS board > where MDIO muxing is requiered. Also, the LS1028A on-chip > switch doesn't have a local MDIO register interface. > > The current patch registers the above PCIe enpoint as a > separate MDIO bus and provides a driver for it by re-using > the code used for local MDIO access. It also allows the > ENETC port PHYs to be managed by this driver if the local > "mdio" node is missing from the ENETC port node. > > Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> > --- > .../net/ethernet/freescale/enetc/enetc_mdio.c | 90 > +++++++++++++++++++ > .../net/ethernet/freescale/enetc/enetc_pf.c | 5 +- > 2 files changed, 94 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > index 77b9cd10ba2b..efa8a29f463d 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > +++ b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > @@ -197,3 +197,93 @@ void enetc_mdio_remove(struct enetc_pf *pf) > mdiobus_free(pf->mdio); > } > } > + > +#define ENETC_MDIO_DEV_ID 0xee01 > +#define ENETC_MDIO_DEV_NAME "FSL PCIe IE Central MDIO" > +#define ENETC_MDIO_BUS_NAME ENETC_MDIO_DEV_NAME " Bus" > +#define ENETC_MDIO_DRV_NAME ENETC_MDIO_DEV_NAME " driver" > +#define ENETC_MDIO_DRV_ID "fsl_enetc_mdio" > + > +static int enetc_pci_mdio_probe(struct pci_dev *pdev, > + const struct pci_device_id *ent) > +{ > + struct device *dev = &pdev->dev; > + struct mii_bus *bus; > + int err; > + > + bus = mdiobus_alloc_size(sizeof(u32 *)); > + if (!bus) > + return -ENOMEM; > + > + bus->name = ENETC_MDIO_BUS_NAME; > + bus->read = enetc_mdio_read; > + bus->write = enetc_mdio_write; > + bus->parent = dev; > + snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); > + > + pcie_flr(pdev); > + err = pci_enable_device_mem(pdev); > + if (err) { > + dev_err(dev, "device enable failed\n"); mdiobus_free(bus) is missing here and in every error path. > + return err; > + } > + > + err = pci_request_mem_regions(pdev, ENETC_MDIO_DRV_ID); > + if (err) { > + dev_err(dev, "pci_request_regions failed\n"); > + goto err_pci_mem_reg; > + } > + > + bus->priv = pci_iomap_range(pdev, 0, ENETC_MDIO_REG_OFFSET, 0); > + if (!bus->priv) { > + err = -ENXIO; > + dev_err(dev, "ioremap failed\n"); > + goto err_ioremap; > + } > + > + err = of_mdiobus_register(bus, dev->of_node); > + if (err) > + goto err_mdiobus_reg; > + > + pci_set_drvdata(pdev, bus); > + > + return 0; > + > +err_mdiobus_reg: > + iounmap(bus->priv); > +err_ioremap: > + pci_release_mem_regions(pdev); > +err_pci_mem_reg: > + pci_disable_device(pdev); > + > + return err; > +} > + > +static void enetc_pci_mdio_remove(struct pci_dev *pdev) > +{ > + struct mii_bus *bus = pci_get_drvdata(pdev); > + > + mdiobus_unregister(bus); > + iounmap(bus->priv); > + mdiobus_free(bus); > + this should come last to be symmetrical with probe flow. > + pci_release_mem_regions(pdev); > + pci_disable_device(pdev); > +} > + > +static const struct pci_device_id enetc_pci_mdio_id_table[] = { > + { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_MDIO_DEV_ID) }, > + { 0, } /* End of table. */ > +}; > +MODULE_DEVICE_TABLE(pci, enetc_mdio_id_table); > + > +static struct pci_driver enetc_pci_mdio_driver = { > + .name = ENETC_MDIO_DRV_ID, > + .id_table = enetc_pci_mdio_id_table, > + .probe = enetc_pci_mdio_probe, > + .remove = enetc_pci_mdio_remove, > +}; > +module_pci_driver(enetc_pci_mdio_driver); > + > +MODULE_DESCRIPTION(ENETC_MDIO_DRV_NAME); > +MODULE_LICENSE("Dual BSD/GPL"); > diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c > b/drivers/net/ethernet/freescale/enetc/enetc_pf.c > index 258b3cb38a6f..7d6513ff8507 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c > +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c > @@ -750,6 +750,7 @@ static int enetc_of_get_phy(struct > enetc_ndev_priv *priv) > { > struct enetc_pf *pf = enetc_si_priv(priv->si); > struct device_node *np = priv->dev->of_node; > + struct device_node *mdio_np; > int err; > > if (!np) { > @@ -773,7 +774,9 @@ static int enetc_of_get_phy(struct > enetc_ndev_priv *priv) > priv->phy_node = of_node_get(np); > } > > - if (!of_phy_is_fixed_link(np)) { > + mdio_np = of_get_child_by_name(np, "mdio"); > + if (mdio_np) { > + of_node_put(mdio_np); > err = enetc_mdio_probe(pf); > if (err) { > of_node_put(priv->phy_node);
WARNING: multiple messages have this Message-ID (diff)
From: Saeed Mahameed <saeedm@mellanox.com> To: "claudiu.manoil@nxp.com" <claudiu.manoil@nxp.com>, "davem@davemloft.net" <davem@davemloft.net> Cc: "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>, "netdev@vger.kernel.org" <netdev@vger.kernel.org>, "alexandru.marginean@nxp.com" <alexandru.marginean@nxp.com>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "leoyang.li@nxp.com" <leoyang.li@nxp.com>, "robh+dt@kernel.org" <robh+dt@kernel.org>, "linux-arm-kernel@lists.infradead.org" <linux-arm-kernel@lists.infradead.org> Subject: Re: [PATCH net-next 1/3] enetc: Add mdio bus driver for the PCIe MDIO endpoint Date: Tue, 23 Jul 2019 20:49:27 +0000 [thread overview] Message-ID: <2e3c565cacae6050656aeb7c0132736c60f9f4ee.camel@mellanox.com> (raw) In-Reply-To: <1563894955-545-2-git-send-email-claudiu.manoil@nxp.com> On Tue, 2019-07-23 at 18:15 +0300, Claudiu Manoil wrote: > ENETC ports can manage the MDIO bus via local register > interface. However there's also a centralized way > to manage the MDIO bus, via the MDIO PCIe endpoint > device integrated by the same root complex that also > integrates the ENETC ports (eth controllers). > > Depending on board design and use case, centralized > access to MDIO may be better than using local ENETC > port registers. For instance, on the LS1028A QDS board > where MDIO muxing is requiered. Also, the LS1028A on-chip > switch doesn't have a local MDIO register interface. > > The current patch registers the above PCIe enpoint as a > separate MDIO bus and provides a driver for it by re-using > the code used for local MDIO access. It also allows the > ENETC port PHYs to be managed by this driver if the local > "mdio" node is missing from the ENETC port node. > > Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> > --- > .../net/ethernet/freescale/enetc/enetc_mdio.c | 90 > +++++++++++++++++++ > .../net/ethernet/freescale/enetc/enetc_pf.c | 5 +- > 2 files changed, 94 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > index 77b9cd10ba2b..efa8a29f463d 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > +++ b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c > @@ -197,3 +197,93 @@ void enetc_mdio_remove(struct enetc_pf *pf) > mdiobus_free(pf->mdio); > } > } > + > +#define ENETC_MDIO_DEV_ID 0xee01 > +#define ENETC_MDIO_DEV_NAME "FSL PCIe IE Central MDIO" > +#define ENETC_MDIO_BUS_NAME ENETC_MDIO_DEV_NAME " Bus" > +#define ENETC_MDIO_DRV_NAME ENETC_MDIO_DEV_NAME " driver" > +#define ENETC_MDIO_DRV_ID "fsl_enetc_mdio" > + > +static int enetc_pci_mdio_probe(struct pci_dev *pdev, > + const struct pci_device_id *ent) > +{ > + struct device *dev = &pdev->dev; > + struct mii_bus *bus; > + int err; > + > + bus = mdiobus_alloc_size(sizeof(u32 *)); > + if (!bus) > + return -ENOMEM; > + > + bus->name = ENETC_MDIO_BUS_NAME; > + bus->read = enetc_mdio_read; > + bus->write = enetc_mdio_write; > + bus->parent = dev; > + snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); > + > + pcie_flr(pdev); > + err = pci_enable_device_mem(pdev); > + if (err) { > + dev_err(dev, "device enable failed\n"); mdiobus_free(bus) is missing here and in every error path. > + return err; > + } > + > + err = pci_request_mem_regions(pdev, ENETC_MDIO_DRV_ID); > + if (err) { > + dev_err(dev, "pci_request_regions failed\n"); > + goto err_pci_mem_reg; > + } > + > + bus->priv = pci_iomap_range(pdev, 0, ENETC_MDIO_REG_OFFSET, 0); > + if (!bus->priv) { > + err = -ENXIO; > + dev_err(dev, "ioremap failed\n"); > + goto err_ioremap; > + } > + > + err = of_mdiobus_register(bus, dev->of_node); > + if (err) > + goto err_mdiobus_reg; > + > + pci_set_drvdata(pdev, bus); > + > + return 0; > + > +err_mdiobus_reg: > + iounmap(bus->priv); > +err_ioremap: > + pci_release_mem_regions(pdev); > +err_pci_mem_reg: > + pci_disable_device(pdev); > + > + return err; > +} > + > +static void enetc_pci_mdio_remove(struct pci_dev *pdev) > +{ > + struct mii_bus *bus = pci_get_drvdata(pdev); > + > + mdiobus_unregister(bus); > + iounmap(bus->priv); > + mdiobus_free(bus); > + this should come last to be symmetrical with probe flow. > + pci_release_mem_regions(pdev); > + pci_disable_device(pdev); > +} > + > +static const struct pci_device_id enetc_pci_mdio_id_table[] = { > + { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_MDIO_DEV_ID) }, > + { 0, } /* End of table. */ > +}; > +MODULE_DEVICE_TABLE(pci, enetc_mdio_id_table); > + > +static struct pci_driver enetc_pci_mdio_driver = { > + .name = ENETC_MDIO_DRV_ID, > + .id_table = enetc_pci_mdio_id_table, > + .probe = enetc_pci_mdio_probe, > + .remove = enetc_pci_mdio_remove, > +}; > +module_pci_driver(enetc_pci_mdio_driver); > + > +MODULE_DESCRIPTION(ENETC_MDIO_DRV_NAME); > +MODULE_LICENSE("Dual BSD/GPL"); > diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c > b/drivers/net/ethernet/freescale/enetc/enetc_pf.c > index 258b3cb38a6f..7d6513ff8507 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c > +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c > @@ -750,6 +750,7 @@ static int enetc_of_get_phy(struct > enetc_ndev_priv *priv) > { > struct enetc_pf *pf = enetc_si_priv(priv->si); > struct device_node *np = priv->dev->of_node; > + struct device_node *mdio_np; > int err; > > if (!np) { > @@ -773,7 +774,9 @@ static int enetc_of_get_phy(struct > enetc_ndev_priv *priv) > priv->phy_node = of_node_get(np); > } > > - if (!of_phy_is_fixed_link(np)) { > + mdio_np = of_get_child_by_name(np, "mdio"); > + if (mdio_np) { > + of_node_put(mdio_np); > err = enetc_mdio_probe(pf); > if (err) { > of_node_put(priv->phy_node); _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-07-23 20:49 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-07-23 15:15 [PATCH net-next 0/3] enetc: Add mdio bus driver for the PCIe MDIO endpoint Claudiu Manoil 2019-07-23 15:15 ` Claudiu Manoil 2019-07-23 15:15 ` [PATCH net-next 1/3] " Claudiu Manoil 2019-07-23 15:15 ` Claudiu Manoil 2019-07-23 20:49 ` Saeed Mahameed [this message] 2019-07-23 20:49 ` Saeed Mahameed 2019-07-23 20:49 ` Saeed Mahameed 2019-07-24 9:55 ` Claudiu Manoil 2019-07-24 9:55 ` Claudiu Manoil 2019-07-24 9:55 ` Claudiu Manoil 2019-07-23 22:24 ` Andrew Lunn 2019-07-23 22:24 ` Andrew Lunn 2019-07-24 9:53 ` Claudiu Manoil 2019-07-24 9:53 ` Claudiu Manoil 2019-07-24 9:53 ` Claudiu Manoil 2019-07-24 12:57 ` Claudiu Manoil 2019-07-24 12:57 ` Claudiu Manoil 2019-07-24 12:57 ` Claudiu Manoil 2019-07-23 15:15 ` [PATCH net-next 2/3] dt-bindings: net: fsl: enetc: Add bindings for the central MDIO PCIe endpoint Claudiu Manoil 2019-07-23 15:15 ` Claudiu Manoil 2019-07-23 15:15 ` [PATCH net-next 3/3] arm64: dts: ls1028a: Enable eth port1 on the ls1028a QDS board Claudiu Manoil 2019-07-23 15:15 ` Claudiu Manoil
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=2e3c565cacae6050656aeb7c0132736c60f9f4ee.camel@mellanox.com \ --to=saeedm@mellanox.com \ --cc=alexandru.marginean@nxp.com \ --cc=claudiu.manoil@nxp.com \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=leoyang.li@nxp.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=robh+dt@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.