[PATCH 1/3] net: ftmac100: change driver name from nds32_mac to ftmac100

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 --- 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,

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 --- 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);

On Wed, Dec 28, 2022 at 1:55 PM Sergei Antonov saproj@gmail.com 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
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
Reviewed-by: Ramon Fried rfried.dev@gmail.com

Register mii_bus with read and write callbacks tp 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 --- drivers/net/ftmac100.c | 103 +++++++++++++++++++++++++++++++++++++++++ drivers/net/ftmac100.h | 9 ++++ 2 files changed, 112 insertions(+)
diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index bb39e837bbe7..10395c94f9d1 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" #ifdef CONFIG_DM_ETH @@ -23,12 +27,16 @@ DECLARE_GLOBAL_DATA_PTR; #endif #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; };
/* @@ -408,10 +416,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; }
@@ -440,6 +542,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 */

On Wed, Dec 28, 2022 at 1:55 PM Sergei Antonov saproj@gmail.com wrote:
Register mii_bus with read and write callbacks tp 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
drivers/net/ftmac100.c | 103 +++++++++++++++++++++++++++++++++++++++++ drivers/net/ftmac100.h | 9 ++++ 2 files changed, 112 insertions(+)
diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index bb39e837bbe7..10395c94f9d1 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" #ifdef CONFIG_DM_ETH @@ -23,12 +27,16 @@ DECLARE_GLOBAL_DATA_PTR; #endif #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;
};
/* @@ -408,10 +416,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;
}
@@ -440,6 +542,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

On Tue, 10 Jan 2023 at 20:13, Ramon Fried rfried.dev@gmail.com wrote:
Reviewed-by: Ramon Fried rfried.dev@gmail.com
Hello, Ramon! I have just submitted a v2 of this patch. The only substantial difference there is a Kconfig addition. If you are fine with it, could you please give it your "Reviewed-by"?

On Thu, Jan 19, 2023 at 9:55 PM Sergei Antonov saproj@gmail.com wrote:
On Tue, 10 Jan 2023 at 20:13, Ramon Fried rfried.dev@gmail.com wrote:
Reviewed-by: Ramon Fried rfried.dev@gmail.com
Hello, Ramon! I have just submitted a v2 of this patch. The only substantial difference there is a Kconfig addition. If you are fine with it, could you please give it your "Reviewed-by"?
Done.

On Wed, Dec 28, 2022 at 1:55 PM Sergei Antonov saproj@gmail.com wrote:
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
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
Reviewed-by: Ramon Fried rfried.dev@gmail.com
participants (2)
-
Ramon Fried
-
Sergei Antonov