* [PATCH v2 1/3] net: ftmac100: change driver name from nds32_mac to ftmac100 @ 2023-01-19 19:51 Sergei Antonov 2023-01-19 19:51 ` [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting Sergei Antonov 2023-01-19 19:51 ` [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks Sergei Antonov 0 siblings, 2 replies; 6+ messages in thread From: Sergei Antonov @ 2023-01-19 19:51 UTC (permalink / raw) To: u-boot, joe.hershberger, rfried.dev; +Cc: bmeng.cn, Sergei Antonov So it will be named similarly to the related ftgmac100 driver. The old name 'nds32_mac' is not referred to anywhere in U-Boot. Signed-off-by: Sergei Antonov <saproj@gmail.com> Reviewed-by: Ramon Fried <rfried.dev@gmail.com> --- v1 -> v2: no change drivers/net/ftmac100.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index c30ace96bb13..b3da9479ea5e 100644 --- a/drivers/net/ftmac100.c +++ b/drivers/net/ftmac100.c @@ -434,7 +434,7 @@ static const struct udevice_id ftmac100_ids[] = { }; U_BOOT_DRIVER(ftmac100) = { - .name = "nds32_mac", + .name = "ftmac100", .id = UCLASS_ETH, .of_match = ftmac100_ids, .bind = ftmac100_bind, -- 2.34.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting 2023-01-19 19:51 [PATCH v2 1/3] net: ftmac100: change driver name from nds32_mac to ftmac100 Sergei Antonov @ 2023-01-19 19:51 ` Sergei Antonov 2023-02-02 22:05 ` Tom Rini 2023-01-19 19:51 ` [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks Sergei Antonov 1 sibling, 1 reply; 6+ messages in thread From: Sergei Antonov @ 2023-01-19 19:51 UTC (permalink / raw) To: u-boot, joe.hershberger, rfried.dev; +Cc: bmeng.cn, Sergei Antonov Replace 'phys_addr_t iobase' with 'struct ftmac100 *ftmac100' in order to cast once on assignment and remove casting in a number of other places. Signed-off-by: Sergei Antonov <saproj@gmail.com> Reviewed-by: Ramon Fried <rfried.dev@gmail.com> --- v1 -> v2: no change drivers/net/ftmac100.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index b3da9479ea5e..bb39e837bbe7 100644 --- a/drivers/net/ftmac100.c +++ b/drivers/net/ftmac100.c @@ -28,7 +28,7 @@ struct ftmac100_data { struct ftmac100_rxdes rxdes[PKTBUFSRX]; int rx_index; const char *name; - phys_addr_t iobase; + struct ftmac100 *ftmac100; }; /* @@ -36,7 +36,7 @@ struct ftmac100_data { */ static void ftmac100_reset(struct ftmac100_data *priv) { - struct ftmac100 *ftmac100 = (struct ftmac100 *)(uintptr_t)priv->iobase; + struct ftmac100 *ftmac100 = priv->ftmac100; debug ("%s()\n", __func__); @@ -57,7 +57,7 @@ static void ftmac100_reset(struct ftmac100_data *priv) static void ftmac100_set_mac(struct ftmac100_data *priv , const unsigned char *mac) { - struct ftmac100 *ftmac100 = (struct ftmac100 *)(uintptr_t)priv->iobase; + struct ftmac100 *ftmac100 = priv->ftmac100; unsigned int maddr = mac[0] << 8 | mac[1]; unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5]; @@ -72,7 +72,7 @@ static void ftmac100_set_mac(struct ftmac100_data *priv , */ static void _ftmac100_halt(struct ftmac100_data *priv) { - struct ftmac100 *ftmac100 = (struct ftmac100 *)(uintptr_t)priv->iobase; + struct ftmac100 *ftmac100 = priv->ftmac100; debug ("%s()\n", __func__); writel (0, &ftmac100->maccr); } @@ -82,7 +82,7 @@ static void _ftmac100_halt(struct ftmac100_data *priv) */ static int _ftmac100_init(struct ftmac100_data *priv, unsigned char enetaddr[6]) { - struct ftmac100 *ftmac100 = (struct ftmac100 *)(uintptr_t)priv->iobase; + struct ftmac100 *ftmac100 = priv->ftmac100; struct ftmac100_txdes *txdes = priv->txdes; struct ftmac100_rxdes *rxdes = priv->rxdes; unsigned int maccr; @@ -187,7 +187,7 @@ static int __ftmac100_recv(struct ftmac100_data *priv) */ static int _ftmac100_send(struct ftmac100_data *priv, void *packet, int length) { - struct ftmac100 *ftmac100 = (struct ftmac100 *)(uintptr_t)priv->iobase; + struct ftmac100 *ftmac100 = priv->ftmac100; struct ftmac100_txdes *curr_des = priv->txdes; ulong start; @@ -400,7 +400,7 @@ static int ftmac100_of_to_plat(struct udevice *dev) struct eth_pdata *pdata = dev_get_plat(dev); const char *mac; pdata->iobase = dev_read_addr(dev); - priv->iobase = pdata->iobase; + priv->ftmac100 = (struct ftmac100 *)pdata->iobase; mac = dtbmacaddr(0); if (mac) memcpy(pdata->enetaddr , mac , 6); -- 2.34.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting 2023-01-19 19:51 ` [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting Sergei Antonov @ 2023-02-02 22:05 ` Tom Rini 2023-02-03 19:09 ` Sergei Antonov 0 siblings, 1 reply; 6+ messages in thread From: Tom Rini @ 2023-02-02 22:05 UTC (permalink / raw) To: Sergei Antonov; +Cc: u-boot, joe.hershberger, rfried.dev, bmeng.cn [-- Attachment #1: Type: text/plain, Size: 1069 bytes --] On Thu, Jan 19, 2023 at 10:51:15PM +0300, Sergei Antonov wrote: > Replace 'phys_addr_t iobase' with 'struct ftmac100 *ftmac100' > in order to cast once on assignment and remove casting in a > number of other places. > > Signed-off-by: Sergei Antonov <saproj@gmail.com> > Reviewed-by: Ramon Fried <rfried.dev@gmail.com> This introduces: riscv32: + ae350_rv32 +(ae350_rv32) drivers/net/ftmac100.c: In function 'ftmac100_of_to_plat': +(ae350_rv32) drivers/net/ftmac100.c:317:26: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] +(ae350_rv32) 317 | priv->ftmac100 = (struct ftmac100 *)pdata->iobase; +(ae350_rv32) | ^ +(ae350_rv32) cc1: all warnings being treated as errors +(ae350_rv32) make[3]: *** [scripts/Makefile.build:257: drivers/net/ftmac100.o] Error 1 +(ae350_rv32) make[2]: *** [scripts/Makefile.build:397: drivers/net] Error 2 +(ae350_rv32) make[1]: *** [Makefile:1857: drivers] Error 2 +(ae350_rv32) make: *** [Makefile:177: sub-make] Error 2 -- Tom [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 659 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting 2023-02-02 22:05 ` Tom Rini @ 2023-02-03 19:09 ` Sergei Antonov 0 siblings, 0 replies; 6+ messages in thread From: Sergei Antonov @ 2023-02-03 19:09 UTC (permalink / raw) To: Tom Rini; +Cc: u-boot, joe.hershberger, rfried.dev, bmeng.cn On Fri, 3 Feb 2023 at 01:05, Tom Rini <trini@konsulko.com> wrote: > > On Thu, Jan 19, 2023 at 10:51:15PM +0300, Sergei Antonov wrote: > > > Replace 'phys_addr_t iobase' with 'struct ftmac100 *ftmac100' > > in order to cast once on assignment and remove casting in a > > number of other places. > > > > Signed-off-by: Sergei Antonov <saproj@gmail.com> > > Reviewed-by: Ramon Fried <rfried.dev@gmail.com> > > This introduces: > riscv32: + ae350_rv32 > +(ae350_rv32) drivers/net/ftmac100.c: In function 'ftmac100_of_to_plat': > +(ae350_rv32) drivers/net/ftmac100.c:317:26: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > +(ae350_rv32) 317 | priv->ftmac100 = (struct ftmac100 *)pdata->iobase; Thanks! I have just sent a v3 of the patch in which cast is replaced with phys_to_virt(). ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks 2023-01-19 19:51 [PATCH v2 1/3] net: ftmac100: change driver name from nds32_mac to ftmac100 Sergei Antonov 2023-01-19 19:51 ` [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting Sergei Antonov @ 2023-01-19 19:51 ` Sergei Antonov 2023-02-04 0:30 ` Ramon Fried 1 sibling, 1 reply; 6+ messages in thread From: Sergei Antonov @ 2023-01-19 19:51 UTC (permalink / raw) To: u-boot, joe.hershberger, rfried.dev; +Cc: bmeng.cn, Sergei Antonov Register mii_bus with read and write callbacks to allow the 'mii' command to work. Use a timeout of 10 ms to wait for the R/W operations to complete. Signed-off-by: Sergei Antonov <saproj@gmail.com> --- v1 -> v2: * fix a typo in the description * add a dependency from MII to Kconfig * rebase to the current master drivers/net/Kconfig | 1 + drivers/net/ftmac100.c | 103 +++++++++++++++++++++++++++++++++++++++++ drivers/net/ftmac100.h | 9 ++++ 3 files changed, 113 insertions(+) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 7873538cc2df..017931956990 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -406,6 +406,7 @@ config FSL_FM_10GEC_REGULAR_NOTATION config FTMAC100 bool "Ftmac100 Ethernet Support" + select MII help This MAC is present in Andestech SoCs. diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index cc88ea17ffe7..1cf109b278cc 100644 --- a/drivers/net/ftmac100.c +++ b/drivers/net/ftmac100.c @@ -12,9 +12,13 @@ #include <env.h> #include <malloc.h> #include <net.h> +#include <phy.h> +#include <miiphy.h> +#include <dm/device_compat.h> #include <asm/global_data.h> #include <linux/delay.h> #include <linux/io.h> +#include <linux/iopoll.h> #include "ftmac100.h" #include <dm.h> @@ -23,12 +27,16 @@ DECLARE_GLOBAL_DATA_PTR; #define ETH_ZLEN 60 +/* Timeout for a mdio read/write operation */ +#define FTMAC100_MDIO_TIMEOUT_USEC 10000 + struct ftmac100_data { struct ftmac100_txdes txdes[1]; struct ftmac100_rxdes rxdes[PKTBUFSRX]; int rx_index; const char *name; struct ftmac100 *ftmac100; + struct mii_dev *bus; }; /* @@ -322,10 +330,104 @@ static int ftmac100_of_to_plat(struct udevice *dev) return 0; } +/* + * struct mii_bus functions + */ +static int ftmac100_mdio_read(struct mii_dev *bus, int addr, int devad, + int reg) +{ + struct ftmac100_data *priv = bus->priv; + struct ftmac100 *ftmac100 = priv->ftmac100; + int phycr = FTMAC100_PHYCR_PHYAD(addr) | + FTMAC100_PHYCR_REGAD(reg) | + FTMAC100_PHYCR_MIIRD; + int ret; + + writel(phycr, &ftmac100->phycr); + + ret = readl_poll_timeout(&ftmac100->phycr, phycr, + !(phycr & FTMAC100_PHYCR_MIIRD), + FTMAC100_MDIO_TIMEOUT_USEC); + if (ret) + pr_err("%s: mdio read failed (addr=0x%x reg=0x%x)\n", + bus->name, addr, reg); + else + ret = phycr & FTMAC100_PHYCR_MIIRDATA; + + return ret; +} + +static int ftmac100_mdio_write(struct mii_dev *bus, int addr, int devad, + int reg, u16 value) +{ + struct ftmac100_data *priv = bus->priv; + struct ftmac100 *ftmac100 = priv->ftmac100; + int phycr = FTMAC100_PHYCR_PHYAD(addr) | + FTMAC100_PHYCR_REGAD(reg) | + FTMAC100_PHYCR_MIIWR; + int ret; + + writel(value, &ftmac100->phywdata); + writel(phycr, &ftmac100->phycr); + + ret = readl_poll_timeout(&ftmac100->phycr, phycr, + !(phycr & FTMAC100_PHYCR_MIIWR), + FTMAC100_MDIO_TIMEOUT_USEC); + if (ret) + pr_err("%s: mdio write failed (addr=0x%x reg=0x%x)\n", + bus->name, addr, reg); + + return ret; +} + +static int ftmac100_mdio_init(struct udevice *dev) +{ + struct ftmac100_data *priv = dev_get_priv(dev); + struct mii_dev *bus; + int ret; + + bus = mdio_alloc(); + if (!bus) + return -ENOMEM; + + bus->read = ftmac100_mdio_read; + bus->write = ftmac100_mdio_write; + bus->priv = priv; + + ret = mdio_register_seq(bus, dev_seq(dev)); + if (ret) { + mdio_free(bus); + return ret; + } + + priv->bus = bus; + + return 0; +} + static int ftmac100_probe(struct udevice *dev) { struct ftmac100_data *priv = dev_get_priv(dev); priv->name = dev->name; + int ret = 0; + + ret = ftmac100_mdio_init(dev); + if (ret) { + dev_err(dev, "Failed to initialize mdiobus: %d\n", ret); + goto out; + } + +out: + return ret; +} + +static int ftmac100_remove(struct udevice *dev) +{ + struct ftmac100_data *priv = dev_get_priv(dev); + + mdio_unregister(priv->bus); + mdio_free(priv->bus); + return 0; } @@ -354,6 +456,7 @@ U_BOOT_DRIVER(ftmac100) = { .bind = ftmac100_bind, .of_to_plat = ftmac100_of_to_plat, .probe = ftmac100_probe, + .remove = ftmac100_remove, .ops = &ftmac100_ops, .priv_auto = sizeof(struct ftmac100_data), .plat_auto = sizeof(struct eth_pdata), diff --git a/drivers/net/ftmac100.h b/drivers/net/ftmac100.h index 75a49f628a69..21d339f835bf 100644 --- a/drivers/net/ftmac100.h +++ b/drivers/net/ftmac100.h @@ -92,6 +92,15 @@ struct ftmac100 { #define FTMAC100_MACCR_RX_MULTIPKT (1 << 16) #define FTMAC100_MACCR_RX_BROADPKT (1 << 17) +/* + * PHY control register + */ +#define FTMAC100_PHYCR_MIIRDATA 0xffff +#define FTMAC100_PHYCR_PHYAD(x) (((x) & 0x1f) << 16) +#define FTMAC100_PHYCR_REGAD(x) (((x) & 0x1f) << 21) +#define FTMAC100_PHYCR_MIIWR BIT(27) +#define FTMAC100_PHYCR_MIIRD BIT(26) + /* * Transmit descriptor, aligned to 16 bytes */ -- 2.34.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks 2023-01-19 19:51 ` [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks Sergei Antonov @ 2023-02-04 0:30 ` Ramon Fried 0 siblings, 0 replies; 6+ messages in thread From: Ramon Fried @ 2023-02-04 0:30 UTC (permalink / raw) To: Sergei Antonov; +Cc: u-boot, joe.hershberger, bmeng.cn On Thu, Jan 19, 2023 at 9:51 PM Sergei Antonov <saproj@gmail.com> wrote: > > Register mii_bus with read and write callbacks to allow the 'mii' > command to work. Use a timeout of 10 ms to wait for the R/W > operations to complete. > > Signed-off-by: Sergei Antonov <saproj@gmail.com> > --- > > v1 -> v2: > * fix a typo in the description > * add a dependency from MII to Kconfig > * rebase to the current master > > drivers/net/Kconfig | 1 + > drivers/net/ftmac100.c | 103 +++++++++++++++++++++++++++++++++++++++++ > drivers/net/ftmac100.h | 9 ++++ > 3 files changed, 113 insertions(+) > > diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig > index 7873538cc2df..017931956990 100644 > --- a/drivers/net/Kconfig > +++ b/drivers/net/Kconfig > @@ -406,6 +406,7 @@ config FSL_FM_10GEC_REGULAR_NOTATION > > config FTMAC100 > bool "Ftmac100 Ethernet Support" > + select MII > help > This MAC is present in Andestech SoCs. > > diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c > index cc88ea17ffe7..1cf109b278cc 100644 > --- a/drivers/net/ftmac100.c > +++ b/drivers/net/ftmac100.c > @@ -12,9 +12,13 @@ > #include <env.h> > #include <malloc.h> > #include <net.h> > +#include <phy.h> > +#include <miiphy.h> > +#include <dm/device_compat.h> > #include <asm/global_data.h> > #include <linux/delay.h> > #include <linux/io.h> > +#include <linux/iopoll.h> > > #include "ftmac100.h" > #include <dm.h> > @@ -23,12 +27,16 @@ DECLARE_GLOBAL_DATA_PTR; > > #define ETH_ZLEN 60 > > +/* Timeout for a mdio read/write operation */ > +#define FTMAC100_MDIO_TIMEOUT_USEC 10000 > + > struct ftmac100_data { > struct ftmac100_txdes txdes[1]; > struct ftmac100_rxdes rxdes[PKTBUFSRX]; > int rx_index; > const char *name; > struct ftmac100 *ftmac100; > + struct mii_dev *bus; > }; > > /* > @@ -322,10 +330,104 @@ static int ftmac100_of_to_plat(struct udevice *dev) > return 0; > } > > +/* > + * struct mii_bus functions > + */ > +static int ftmac100_mdio_read(struct mii_dev *bus, int addr, int devad, > + int reg) > +{ > + struct ftmac100_data *priv = bus->priv; > + struct ftmac100 *ftmac100 = priv->ftmac100; > + int phycr = FTMAC100_PHYCR_PHYAD(addr) | > + FTMAC100_PHYCR_REGAD(reg) | > + FTMAC100_PHYCR_MIIRD; > + int ret; > + > + writel(phycr, &ftmac100->phycr); > + > + ret = readl_poll_timeout(&ftmac100->phycr, phycr, > + !(phycr & FTMAC100_PHYCR_MIIRD), > + FTMAC100_MDIO_TIMEOUT_USEC); > + if (ret) > + pr_err("%s: mdio read failed (addr=0x%x reg=0x%x)\n", > + bus->name, addr, reg); > + else > + ret = phycr & FTMAC100_PHYCR_MIIRDATA; > + > + return ret; > +} > + > +static int ftmac100_mdio_write(struct mii_dev *bus, int addr, int devad, > + int reg, u16 value) > +{ > + struct ftmac100_data *priv = bus->priv; > + struct ftmac100 *ftmac100 = priv->ftmac100; > + int phycr = FTMAC100_PHYCR_PHYAD(addr) | > + FTMAC100_PHYCR_REGAD(reg) | > + FTMAC100_PHYCR_MIIWR; > + int ret; > + > + writel(value, &ftmac100->phywdata); > + writel(phycr, &ftmac100->phycr); > + > + ret = readl_poll_timeout(&ftmac100->phycr, phycr, > + !(phycr & FTMAC100_PHYCR_MIIWR), > + FTMAC100_MDIO_TIMEOUT_USEC); > + if (ret) > + pr_err("%s: mdio write failed (addr=0x%x reg=0x%x)\n", > + bus->name, addr, reg); > + > + return ret; > +} > + > +static int ftmac100_mdio_init(struct udevice *dev) > +{ > + struct ftmac100_data *priv = dev_get_priv(dev); > + struct mii_dev *bus; > + int ret; > + > + bus = mdio_alloc(); > + if (!bus) > + return -ENOMEM; > + > + bus->read = ftmac100_mdio_read; > + bus->write = ftmac100_mdio_write; > + bus->priv = priv; > + > + ret = mdio_register_seq(bus, dev_seq(dev)); > + if (ret) { > + mdio_free(bus); > + return ret; > + } > + > + priv->bus = bus; > + > + return 0; > +} > + > static int ftmac100_probe(struct udevice *dev) > { > struct ftmac100_data *priv = dev_get_priv(dev); > priv->name = dev->name; > + int ret = 0; > + > + ret = ftmac100_mdio_init(dev); > + if (ret) { > + dev_err(dev, "Failed to initialize mdiobus: %d\n", ret); > + goto out; > + } > + > +out: > + return ret; > +} > + > +static int ftmac100_remove(struct udevice *dev) > +{ > + struct ftmac100_data *priv = dev_get_priv(dev); > + > + mdio_unregister(priv->bus); > + mdio_free(priv->bus); > + > return 0; > } > > @@ -354,6 +456,7 @@ U_BOOT_DRIVER(ftmac100) = { > .bind = ftmac100_bind, > .of_to_plat = ftmac100_of_to_plat, > .probe = ftmac100_probe, > + .remove = ftmac100_remove, > .ops = &ftmac100_ops, > .priv_auto = sizeof(struct ftmac100_data), > .plat_auto = sizeof(struct eth_pdata), > diff --git a/drivers/net/ftmac100.h b/drivers/net/ftmac100.h > index 75a49f628a69..21d339f835bf 100644 > --- a/drivers/net/ftmac100.h > +++ b/drivers/net/ftmac100.h > @@ -92,6 +92,15 @@ struct ftmac100 { > #define FTMAC100_MACCR_RX_MULTIPKT (1 << 16) > #define FTMAC100_MACCR_RX_BROADPKT (1 << 17) > > +/* > + * PHY control register > + */ > +#define FTMAC100_PHYCR_MIIRDATA 0xffff > +#define FTMAC100_PHYCR_PHYAD(x) (((x) & 0x1f) << 16) > +#define FTMAC100_PHYCR_REGAD(x) (((x) & 0x1f) << 21) > +#define FTMAC100_PHYCR_MIIWR BIT(27) > +#define FTMAC100_PHYCR_MIIRD BIT(26) > + > /* > * Transmit descriptor, aligned to 16 bytes > */ > -- > 2.34.1 > Reviewed-by: Ramon Fried <rfried.dev@gmail.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-02-04 0:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-01-19 19:51 [PATCH v2 1/3] net: ftmac100: change driver name from nds32_mac to ftmac100 Sergei Antonov 2023-01-19 19:51 ` [PATCH v2 2/3] net: ftmac100: simplify priv->iobase casting Sergei Antonov 2023-02-02 22:05 ` Tom Rini 2023-02-03 19:09 ` Sergei Antonov 2023-01-19 19:51 ` [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks Sergei Antonov 2023-02-04 0:30 ` Ramon Fried
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox