From: Wei Fang <wei.fang@nxp.com>
To: Michael Walle <michael@walle.cc>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Jose Abreu <Jose.Abreu@synopsys.com>,
Sergey Shtylyov <s.shtylyov@omp.ru>,
Shenwei Wang <shenwei.wang@nxp.com>,
Clark Wang <xiaoning.wang@nxp.com>,
dl-linux-imx <linux-imx@nxp.com>,
Sean Wang <sean.wang@mediatek.com>,
Landen Chao <Landen.Chao@mediatek.com>,
DENG Qingfang <dqfext@gmail.com>,
Florian Fainelli <f.fainelli@gmail.com>,
Vladimir Oltean <olteanv@gmail.com>,
Matthias Brugger <matthias.bgg@gmail.com>
Cc: "netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-renesas-soc@vger.kernel.org"
<linux-renesas-soc@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"linux-mediatek@lists.infradead.org"
<linux-mediatek@lists.infradead.org>,
Andrew Lunn <andrew@lunn.ch>,
Geert Uytterhoeven <geert+renesas@glider.be>
Subject: RE: [PATCH RFC net-next v2 09/12] net: ethernet: freescale: fec: Separate C22 and C45 transactions for xgmac
Date: Wed, 28 Dec 2022 03:31:53 +0000 [thread overview]
Message-ID: <DB9PR04MB8106662C6101FD0C2B35104888F29@DB9PR04MB8106.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <20221227-v6-2-rc1-c45-seperation-v2-9-ddb37710e5a7@walle.cc>
> -----Original Message-----
> From: Michael Walle <michael@walle.cc>
> Sent: 2022年12月28日 7:07
> To: Heiner Kallweit <hkallweit1@gmail.com>; Russell King
> <linux@armlinux.org.uk>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>; Jose Abreu <Jose.Abreu@synopsys.com>;
> Sergey Shtylyov <s.shtylyov@omp.ru>; Wei Fang <wei.fang@nxp.com>;
> Shenwei Wang <shenwei.wang@nxp.com>; Clark Wang
> <xiaoning.wang@nxp.com>; dl-linux-imx <linux-imx@nxp.com>; Sean Wang
> <sean.wang@mediatek.com>; Landen Chao <Landen.Chao@mediatek.com>;
> DENG Qingfang <dqfext@gmail.com>; Florian Fainelli <f.fainelli@gmail.com>;
> Vladimir Oltean <olteanv@gmail.com>; Matthias Brugger
> <matthias.bgg@gmail.com>
> Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org;
> linux-renesas-soc@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
> linux-mediatek@lists.infradead.org; Andrew Lunn <andrew@lunn.ch>; Geert
> Uytterhoeven <geert+renesas@glider.be>; Michael Walle <michael@walle.cc>
> Subject: [PATCH RFC net-next v2 09/12] net: ethernet: freescale: fec: Separate
> C22 and C45 transactions for xgmac
>
> From: Andrew Lunn <andrew@lunn.ch>
>
> The fec MDIO bus driver can perform both C22 and C45 transfers.
> Create separate functions for each and register the C45 versions using
> the new API calls where appropriate.
>
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
> v2:
> - [al] Fixup some indentation
> ---
> drivers/net/ethernet/freescale/fec_main.c | 153
> ++++++++++++++++++++----------
> 1 file changed, 103 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c
> b/drivers/net/ethernet/freescale/fec_main.c
> index 644f3c963730..e6238e53940d 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1987,47 +1987,74 @@ static int fec_enet_mdio_wait(struct
> fec_enet_private *fep)
> return ret;
> }
>
> -static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
> +static int fec_enet_mdio_read_c22(struct mii_bus *bus, int mii_id, int
> regnum)
> {
> struct fec_enet_private *fep = bus->priv;
> struct device *dev = &fep->pdev->dev;
> int ret = 0, frame_start, frame_addr, frame_op;
> - bool is_c45 = !!(regnum & MII_ADDR_C45);
>
> ret = pm_runtime_resume_and_get(dev);
> if (ret < 0)
> return ret;
>
> - if (is_c45) {
> - frame_start = FEC_MMFR_ST_C45;
> + /* C22 read */
> + frame_op = FEC_MMFR_OP_READ;
> + frame_start = FEC_MMFR_ST;
> + frame_addr = regnum;
>
> - /* write address */
> - frame_addr = (regnum >> 16);
> - writel(frame_start | FEC_MMFR_OP_ADDR_WRITE |
> - FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> - FEC_MMFR_TA | (regnum & 0xFFFF),
> - fep->hwp + FEC_MII_DATA);
> + /* start a read op */
> + writel(frame_start | frame_op |
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> + FEC_MMFR_TA, fep->hwp + FEC_MII_DATA);
>
> - /* wait for end of transfer */
> - ret = fec_enet_mdio_wait(fep);
> - if (ret) {
> - netdev_err(fep->netdev, "MDIO address write timeout\n");
> - goto out;
> - }
> + /* wait for end of transfer */
> + ret = fec_enet_mdio_wait(fep);
> + if (ret) {
> + netdev_err(fep->netdev, "MDIO read timeout\n");
> + goto out;
> + }
>
> - frame_op = FEC_MMFR_OP_READ_C45;
> + ret = FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA));
>
> - } else {
> - /* C22 read */
> - frame_op = FEC_MMFR_OP_READ;
> - frame_start = FEC_MMFR_ST;
> - frame_addr = regnum;
> +out:
> + pm_runtime_mark_last_busy(dev);
> + pm_runtime_put_autosuspend(dev);
> +
> + return ret;
> +}
> +
> +static int fec_enet_mdio_read_c45(struct mii_bus *bus, int mii_id,
> + int devad, int regnum)
> +{
> + struct fec_enet_private *fep = bus->priv;
> + struct device *dev = &fep->pdev->dev;
> + int ret = 0, frame_start, frame_op;
> +
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret < 0)
> + return ret;
> +
> + frame_start = FEC_MMFR_ST_C45;
> +
> + /* write address */
> + writel(frame_start | FEC_MMFR_OP_ADDR_WRITE |
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(devad) |
> + FEC_MMFR_TA | (regnum & 0xFFFF),
> + fep->hwp + FEC_MII_DATA);
> +
> + /* wait for end of transfer */
> + ret = fec_enet_mdio_wait(fep);
> + if (ret) {
> + netdev_err(fep->netdev, "MDIO address write timeout\n");
> + goto out;
> }
>
> + frame_op = FEC_MMFR_OP_READ_C45;
> +
> /* start a read op */
> writel(frame_start | frame_op |
> - FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> - FEC_MMFR_TA, fep->hwp + FEC_MII_DATA);
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(devad) |
> + FEC_MMFR_TA, fep->hwp + FEC_MII_DATA);
>
> /* wait for end of transfer */
> ret = fec_enet_mdio_wait(fep);
> @@ -2045,45 +2072,69 @@ static int fec_enet_mdio_read(struct mii_bus
> *bus, int mii_id, int regnum)
> return ret;
> }
>
> -static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
> - u16 value)
> +static int fec_enet_mdio_write_c22(struct mii_bus *bus, int mii_id, int
> regnum,
> + u16 value)
> {
> struct fec_enet_private *fep = bus->priv;
> struct device *dev = &fep->pdev->dev;
> int ret, frame_start, frame_addr;
> - bool is_c45 = !!(regnum & MII_ADDR_C45);
>
> ret = pm_runtime_resume_and_get(dev);
> if (ret < 0)
> return ret;
>
> - if (is_c45) {
> - frame_start = FEC_MMFR_ST_C45;
> + /* C22 write */
> + frame_start = FEC_MMFR_ST;
> + frame_addr = regnum;
>
> - /* write address */
> - frame_addr = (regnum >> 16);
> - writel(frame_start | FEC_MMFR_OP_ADDR_WRITE |
> - FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> - FEC_MMFR_TA | (regnum & 0xFFFF),
> - fep->hwp + FEC_MII_DATA);
> + /* start a write op */
> + writel(frame_start | FEC_MMFR_OP_WRITE |
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> + FEC_MMFR_TA | FEC_MMFR_DATA(value),
> + fep->hwp + FEC_MII_DATA);
>
> - /* wait for end of transfer */
> - ret = fec_enet_mdio_wait(fep);
> - if (ret) {
> - netdev_err(fep->netdev, "MDIO address write timeout\n");
> - goto out;
> - }
> - } else {
> - /* C22 write */
> - frame_start = FEC_MMFR_ST;
> - frame_addr = regnum;
> + /* wait for end of transfer */
> + ret = fec_enet_mdio_wait(fep);
> + if (ret)
> + netdev_err(fep->netdev, "MDIO write timeout\n");
> +
> + pm_runtime_mark_last_busy(dev);
> + pm_runtime_put_autosuspend(dev);
> +
> + return ret;
> +}
> +
> +static int fec_enet_mdio_write_c45(struct mii_bus *bus, int mii_id,
> + int devad, int regnum, u16 value)
> +{
> + struct fec_enet_private *fep = bus->priv;
> + struct device *dev = &fep->pdev->dev;
> + int ret, frame_start;
> +
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret < 0)
> + return ret;
> +
> + frame_start = FEC_MMFR_ST_C45;
> +
> + /* write address */
> + writel(frame_start | FEC_MMFR_OP_ADDR_WRITE |
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(devad) |
> + FEC_MMFR_TA | (regnum & 0xFFFF),
> + fep->hwp + FEC_MII_DATA);
> +
> + /* wait for end of transfer */
> + ret = fec_enet_mdio_wait(fep);
> + if (ret) {
> + netdev_err(fep->netdev, "MDIO address write timeout\n");
> + goto out;
> }
>
> /* start a write op */
> writel(frame_start | FEC_MMFR_OP_WRITE |
> - FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |
> - FEC_MMFR_TA | FEC_MMFR_DATA(value),
> - fep->hwp + FEC_MII_DATA);
> + FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(devad) |
> + FEC_MMFR_TA | FEC_MMFR_DATA(value),
> + fep->hwp + FEC_MII_DATA);
>
> /* wait for end of transfer */
> ret = fec_enet_mdio_wait(fep);
> @@ -2381,8 +2432,10 @@ static int fec_enet_mii_init(struct platform_device
> *pdev)
> }
>
> fep->mii_bus->name = "fec_enet_mii_bus";
> - fep->mii_bus->read = fec_enet_mdio_read;
> - fep->mii_bus->write = fec_enet_mdio_write;
> + fep->mii_bus->read = fec_enet_mdio_read_c22;
> + fep->mii_bus->write = fec_enet_mdio_write_c22;
> + fep->mii_bus->read_c45 = fec_enet_mdio_read_c45;
> + fep->mii_bus->write_c45 = fec_enet_mdio_write_c45;
> snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
> pdev->name, fep->dev_id + 1);
> fep->mii_bus->priv = fep;
>
It looks good to me.
Reviewed-by: Wei Fang <wei.fang@nxp.com>
next prev parent reply other threads:[~2022-12-28 3:32 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-27 23:07 [PATCH RFC net-next v2 00/12] net: mdio: Start separating C22 and C45 Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 01/12] net: mdio: Add dedicated C45 API to MDIO bus drivers Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 02/12] net: pcs: pcs-xpcs: Use C45 MDIO API Michael Walle
2023-01-03 13:28 ` Vladimir Oltean
2022-12-27 23:07 ` [PATCH RFC net-next v2 03/12] net: mdio: mdiobus_register: update validation test Michael Walle
2023-01-03 10:13 ` Russell King (Oracle)
2023-01-03 10:21 ` Michael Walle
2023-01-03 22:19 ` Russell King (Oracle)
2023-01-09 12:35 ` Michael Walle
2023-01-09 12:41 ` Vladimir Oltean
2022-12-27 23:07 ` [PATCH RFC net-next v2 04/12] net: mdio: C22 is now optional, EOPNOTSUPP if not provided Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 05/12] net: mdio: Move mdiobus_c45_addr() next to users Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 06/12] net: mdio: mdio-bitbang: Separate C22 and C45 transactions Michael Walle
2023-01-03 13:15 ` Vladimir Oltean
2023-01-03 13:27 ` Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 07/12] net: mdio: mvmdio: Convert XSMI bus to new API Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 08/12] net: ethernet: freescale: xgmac: Separate C22 and C45 transactions for xgmac Michael Walle
2023-01-03 13:55 ` Vladimir Oltean
2022-12-27 23:07 ` [PATCH RFC net-next v2 09/12] net: ethernet: freescale: fec: " Michael Walle
2022-12-28 3:31 ` Wei Fang [this message]
2023-01-03 13:57 ` Vladimir Oltean
2022-12-27 23:07 ` [PATCH RFC net-next v2 10/12] net: mdio: add mdiobus_c45_read/write_nested helpers Michael Walle
2022-12-27 23:07 ` [PATCH RFC net-next v2 11/12] net: dsa: Separate C22 and C45 MDIO bus transaction methods Michael Walle
2023-01-03 15:31 ` Vladimir Oltean
2023-01-03 15:48 ` Andrew Lunn
2023-01-03 15:56 ` Vladimir Oltean
2023-01-16 7:51 ` Michael Walle
2023-01-16 19:28 ` Vladimir Oltean
2022-12-27 23:07 ` [PATCH RFC net-next v2 12/12] net: dsa: mv88e6xxx: Separate C22 and C45 transactions Michael Walle
2023-01-03 16:20 ` Vladimir Oltean
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=DB9PR04MB8106662C6101FD0C2B35104888F29@DB9PR04MB8106.eurprd04.prod.outlook.com \
--to=wei.fang@nxp.com \
--cc=Jose.Abreu@synopsys.com \
--cc=Landen.Chao@mediatek.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=dqfext@gmail.com \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=geert+renesas@glider.be \
--cc=hkallweit1@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=matthias.bgg@gmail.com \
--cc=michael@walle.cc \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=s.shtylyov@omp.ru \
--cc=sean.wang@mediatek.com \
--cc=shenwei.wang@nxp.com \
--cc=xiaoning.wang@nxp.com \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).