All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW
@ 2021-10-05 15:53 Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr Jakub Kicinski
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 15:53 UTC (permalink / raw)
  To: davem
  Cc: netdev, gregkh, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree, Jakub Kicinski

We're trying to make all writes to netdev->dev_addr go via helpers.
A lot of places pass netdev->dev_addr to of_get_ethdev_address() and
device_get_ethdev_addr() so this set adds new functions which wrap
the functionality.

Jakub Kicinski (4):
  of: net: add a helper for loading netdev->dev_addr
  ethernet: use of_get_ethdev_address()
  device property: add a helper for loading netdev->dev_addr
  ethernet: use device_get_ethdev_addr()

 drivers/base/property.c                       | 20 +++++++++++++++
 drivers/net/ethernet/allwinner/sun4i-emac.c   |  2 +-
 drivers/net/ethernet/altera/altera_tse_main.c |  2 +-
 drivers/net/ethernet/apm/xgene-v2/main.c      |  2 +-
 .../net/ethernet/apm/xgene/xgene_enet_main.c  |  2 +-
 drivers/net/ethernet/arc/emac_main.c          |  2 +-
 drivers/net/ethernet/atheros/ag71xx.c         |  2 +-
 drivers/net/ethernet/broadcom/bcm4908_enet.c  |  2 +-
 drivers/net/ethernet/broadcom/bcmsysport.c    |  2 +-
 drivers/net/ethernet/broadcom/bgmac-bcma.c    |  2 +-
 .../net/ethernet/broadcom/bgmac-platform.c    |  2 +-
 .../net/ethernet/broadcom/genet/bcmgenet.c    |  2 +-
 drivers/net/ethernet/cadence/macb_main.c      |  2 +-
 .../net/ethernet/cavium/octeon/octeon_mgmt.c  |  2 +-
 drivers/net/ethernet/ethoc.c                  |  2 +-
 drivers/net/ethernet/ezchip/nps_enet.c        |  2 +-
 drivers/net/ethernet/freescale/fec_mpc52xx.c  |  2 +-
 .../ethernet/freescale/fs_enet/fs_enet-main.c |  2 +-
 drivers/net/ethernet/freescale/gianfar.c      |  2 +-
 drivers/net/ethernet/freescale/ucc_geth.c     |  2 +-
 drivers/net/ethernet/hisilicon/hisi_femac.c   |  2 +-
 drivers/net/ethernet/hisilicon/hix5hd2_gmac.c |  2 +-
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |  2 +-
 drivers/net/ethernet/korina.c                 |  2 +-
 drivers/net/ethernet/lantiq_xrx200.c          |  2 +-
 drivers/net/ethernet/litex/litex_liteeth.c    |  2 +-
 drivers/net/ethernet/marvell/mvneta.c         |  2 +-
 drivers/net/ethernet/marvell/pxa168_eth.c     |  2 +-
 drivers/net/ethernet/marvell/sky2.c           |  2 +-
 drivers/net/ethernet/mediatek/mtk_eth_soc.c   |  2 +-
 drivers/net/ethernet/micrel/ks8851_common.c   |  2 +-
 drivers/net/ethernet/nxp/lpc_eth.c            |  2 +-
 drivers/net/ethernet/qualcomm/qca_spi.c       |  2 +-
 drivers/net/ethernet/qualcomm/qca_uart.c      |  2 +-
 drivers/net/ethernet/renesas/ravb_main.c      |  2 +-
 .../ethernet/samsung/sxgbe/sxgbe_platform.c   |  2 +-
 drivers/net/ethernet/socionext/sni_ave.c      |  2 +-
 drivers/net/ethernet/ti/netcp_core.c          |  2 +-
 drivers/net/ethernet/xilinx/xilinx_emaclite.c |  2 +-
 drivers/of/of_net.c                           | 25 +++++++++++++++++++
 include/linux/of_net.h                        |  6 +++++
 include/linux/property.h                      |  2 ++
 42 files changed, 91 insertions(+), 38 deletions(-)

-- 
2.31.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr
  2021-10-05 15:53 [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW Jakub Kicinski
@ 2021-10-05 15:53 ` Jakub Kicinski
  2021-10-05 16:15   ` Rob Herring
  2021-10-05 15:53 ` [PATCH net-next 2/4] ethernet: use of_get_ethdev_address() Jakub Kicinski
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 15:53 UTC (permalink / raw)
  To: davem
  Cc: netdev, gregkh, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree, Jakub Kicinski

Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
of VLANs...") introduced a rbtree for faster Ethernet address look
up. To maintain netdev->dev_addr in this tree we need to make all
the writes to it got through appropriate helpers.

There are roughly 40 places where netdev->dev_addr is passed
as the destination to a of_get_mac_address() call. Add a helper
which takes a dev pointer instead, so it can call an appropriate
helper.

Note that of_get_mac_address() already assumes the address is
6 bytes long (ETH_ALEN) so use eth_hw_addr_set().

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 drivers/of/of_net.c    | 25 +++++++++++++++++++++++++
 include/linux/of_net.h |  6 ++++++
 2 files changed, 31 insertions(+)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index dbac3a172a11..f1a9bf7578e7 100644
--- a/drivers/of/of_net.c
+++ b/drivers/of/of_net.c
@@ -143,3 +143,28 @@ int of_get_mac_address(struct device_node *np, u8 *addr)
 	return of_get_mac_addr_nvmem(np, addr);
 }
 EXPORT_SYMBOL(of_get_mac_address);
+
+/**
+ * of_get_ethdev_address()
+ * @np:		Caller's Device Node
+ * @dev:	Pointer to netdevice which address will be updated
+ *
+ * Search the device tree for the best MAC address to use.
+ * If found set @dev->dev_addr to that address.
+ *
+ * See documentation of of_get_mac_address() for more information on how
+ * the best address is determined.
+ *
+ * Return: 0 on success and errno in case of error.
+ */
+int of_get_ethdev_address(struct device_node *np, struct net_device *dev)
+{
+	u8 addr[ETH_ALEN];
+	int ret;
+
+	ret = of_get_mac_address(np, addr);
+	if (!ret)
+		eth_hw_addr_set(dev, addr);
+	return ret;
+}
+EXPORT_SYMBOL(of_get_ethdev_address);
diff --git a/include/linux/of_net.h b/include/linux/of_net.h
index daef3b0d9270..314b9accd98c 100644
--- a/include/linux/of_net.h
+++ b/include/linux/of_net.h
@@ -14,6 +14,7 @@
 struct net_device;
 extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
 extern int of_get_mac_address(struct device_node *np, u8 *mac);
+int of_get_ethdev_address(struct device_node *np, struct net_device *dev);
 extern struct net_device *of_find_net_device_by_node(struct device_node *np);
 #else
 static inline int of_get_phy_mode(struct device_node *np,
@@ -27,6 +28,11 @@ static inline int of_get_mac_address(struct device_node *np, u8 *mac)
 	return -ENODEV;
 }
 
+static inline int of_get_ethdev_address(struct device_node *np, struct net_device *dev)
+{
+	return -ENODEV;
+}
+
 static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
 {
 	return NULL;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 2/4] ethernet: use of_get_ethdev_address()
  2021-10-05 15:53 [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr Jakub Kicinski
@ 2021-10-05 15:53 ` Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 4/4] ethernet: use device_get_ethdev_addr() Jakub Kicinski
  3 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 15:53 UTC (permalink / raw)
  To: davem
  Cc: netdev, gregkh, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree, Jakub Kicinski

Use the new of_get_ethdev_address() helper for the cases
where dev->dev_addr is passed in directly as the destination.

  @@
  expression dev, np;
  @@
  - of_get_mac_address(np, dev->dev_addr)
  + of_get_ethdev_address(np, dev)

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 drivers/net/ethernet/allwinner/sun4i-emac.c           | 2 +-
 drivers/net/ethernet/altera/altera_tse_main.c         | 2 +-
 drivers/net/ethernet/arc/emac_main.c                  | 2 +-
 drivers/net/ethernet/atheros/ag71xx.c                 | 2 +-
 drivers/net/ethernet/broadcom/bcm4908_enet.c          | 2 +-
 drivers/net/ethernet/broadcom/bcmsysport.c            | 2 +-
 drivers/net/ethernet/broadcom/bgmac-bcma.c            | 2 +-
 drivers/net/ethernet/broadcom/bgmac-platform.c        | 2 +-
 drivers/net/ethernet/cadence/macb_main.c              | 2 +-
 drivers/net/ethernet/cavium/octeon/octeon_mgmt.c      | 2 +-
 drivers/net/ethernet/ethoc.c                          | 2 +-
 drivers/net/ethernet/ezchip/nps_enet.c                | 2 +-
 drivers/net/ethernet/freescale/fec_mpc52xx.c          | 2 +-
 drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | 2 +-
 drivers/net/ethernet/freescale/gianfar.c              | 2 +-
 drivers/net/ethernet/freescale/ucc_geth.c             | 2 +-
 drivers/net/ethernet/hisilicon/hisi_femac.c           | 2 +-
 drivers/net/ethernet/hisilicon/hix5hd2_gmac.c         | 2 +-
 drivers/net/ethernet/korina.c                         | 2 +-
 drivers/net/ethernet/lantiq_xrx200.c                  | 2 +-
 drivers/net/ethernet/litex/litex_liteeth.c            | 2 +-
 drivers/net/ethernet/marvell/mvneta.c                 | 2 +-
 drivers/net/ethernet/marvell/pxa168_eth.c             | 2 +-
 drivers/net/ethernet/marvell/sky2.c                   | 2 +-
 drivers/net/ethernet/mediatek/mtk_eth_soc.c           | 2 +-
 drivers/net/ethernet/micrel/ks8851_common.c           | 2 +-
 drivers/net/ethernet/nxp/lpc_eth.c                    | 2 +-
 drivers/net/ethernet/qualcomm/qca_spi.c               | 2 +-
 drivers/net/ethernet/qualcomm/qca_uart.c              | 2 +-
 drivers/net/ethernet/renesas/ravb_main.c              | 2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c   | 2 +-
 drivers/net/ethernet/socionext/sni_ave.c              | 2 +-
 drivers/net/ethernet/ti/netcp_core.c                  | 2 +-
 drivers/net/ethernet/xilinx/xilinx_emaclite.c         | 2 +-
 34 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c
index 40b8138349b7..800ee022388f 100644
--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
@@ -852,7 +852,7 @@ static int emac_probe(struct platform_device *pdev)
 	}
 
 	/* Read MAC-address from DT */
-	ret = of_get_mac_address(np, ndev->dev_addr);
+	ret = of_get_ethdev_address(np, ndev);
 	if (ret) {
 		/* if the MAC address is invalid get a random one */
 		eth_hw_addr_random(ndev);
diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c
index 1c00d719e5d7..7b75b0cd7ac9 100644
--- a/drivers/net/ethernet/altera/altera_tse_main.c
+++ b/drivers/net/ethernet/altera/altera_tse_main.c
@@ -1524,7 +1524,7 @@ static int altera_tse_probe(struct platform_device *pdev)
 	priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE;
 
 	/* get default MAC address from device tree */
-	ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr);
+	ret = of_get_ethdev_address(pdev->dev.of_node, ndev);
 	if (ret)
 		eth_hw_addr_random(ndev);
 
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c
index 215b5144b885..c642c3d3e600 100644
--- a/drivers/net/ethernet/arc/emac_main.c
+++ b/drivers/net/ethernet/arc/emac_main.c
@@ -941,7 +941,7 @@ int arc_emac_probe(struct net_device *ndev, int interface)
 	}
 
 	/* Get MAC address from device tree */
-	err = of_get_mac_address(dev->of_node, ndev->dev_addr);
+	err = of_get_ethdev_address(dev->of_node, ndev);
 	if (err)
 		eth_hw_addr_random(ndev);
 
diff --git a/drivers/net/ethernet/atheros/ag71xx.c b/drivers/net/ethernet/atheros/ag71xx.c
index 02ae98aabf91..1aaaf8a4e7c5 100644
--- a/drivers/net/ethernet/atheros/ag71xx.c
+++ b/drivers/net/ethernet/atheros/ag71xx.c
@@ -1968,7 +1968,7 @@ static int ag71xx_probe(struct platform_device *pdev)
 	ag->stop_desc->ctrl = 0;
 	ag->stop_desc->next = (u32)ag->stop_desc_dma;
 
-	err = of_get_mac_address(np, ndev->dev_addr);
+	err = of_get_ethdev_address(np, ndev);
 	if (err) {
 		netif_err(ag, probe, ndev, "invalid MAC address, using random address\n");
 		eth_random_addr(ndev->dev_addr);
diff --git a/drivers/net/ethernet/broadcom/bcm4908_enet.c b/drivers/net/ethernet/broadcom/bcm4908_enet.c
index 02a569500234..aa3b5672eab2 100644
--- a/drivers/net/ethernet/broadcom/bcm4908_enet.c
+++ b/drivers/net/ethernet/broadcom/bcm4908_enet.c
@@ -715,7 +715,7 @@ static int bcm4908_enet_probe(struct platform_device *pdev)
 		return err;
 
 	SET_NETDEV_DEV(netdev, &pdev->dev);
-	err = of_get_mac_address(dev->of_node, netdev->dev_addr);
+	err = of_get_ethdev_address(dev->of_node, netdev);
 	if (err)
 		eth_hw_addr_random(netdev);
 	netdev->netdev_ops = &bcm4908_enet_netdev_ops;
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index 0c34bef1a431..b813745e8de3 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -2555,7 +2555,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
 	}
 
 	/* Initialize netdevice members */
-	ret = of_get_mac_address(dn, dev->dev_addr);
+	ret = of_get_ethdev_address(dn, dev);
 	if (ret) {
 		dev_warn(&pdev->dev, "using random Ethernet MAC\n");
 		eth_hw_addr_random(dev);
diff --git a/drivers/net/ethernet/broadcom/bgmac-bcma.c b/drivers/net/ethernet/broadcom/bgmac-bcma.c
index 7190e3f0da91..e6f48786949c 100644
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
@@ -140,7 +140,7 @@ static int bgmac_probe(struct bcma_device *core)
 
 	bcma_set_drvdata(core, bgmac);
 
-	err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
+	err = of_get_ethdev_address(bgmac->dev->of_node, bgmac->net_dev);
 	if (err == -EPROBE_DEFER)
 		return err;
 
diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c
index df8ff839cc62..c6412c523637 100644
--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
@@ -191,7 +191,7 @@ static int bgmac_probe(struct platform_device *pdev)
 	bgmac->dev = &pdev->dev;
 	bgmac->dma_dev = &pdev->dev;
 
-	ret = of_get_mac_address(np, bgmac->net_dev->dev_addr);
+	ret = of_get_ethdev_address(np, bgmac->net_dev);
 	if (ret == -EPROBE_DEFER)
 		return ret;
 
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
index b58297aeb793..683f14665c2c 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -4774,7 +4774,7 @@ static int macb_probe(struct platform_device *pdev)
 	if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR)
 		bp->rx_intr_mask |= MACB_BIT(RXUBR);
 
-	err = of_get_mac_address(np, bp->dev->dev_addr);
+	err = of_get_ethdev_address(np, bp->dev);
 	if (err == -EPROBE_DEFER)
 		goto err_out_free_netdev;
 	else if (err)
diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
index 30463a6d1f8c..4e39d712e121 100644
--- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
+++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
@@ -1501,7 +1501,7 @@ static int octeon_mgmt_probe(struct platform_device *pdev)
 	netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM;
 	netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN;
 
-	result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
+	result = of_get_ethdev_address(pdev->dev.of_node, netdev);
 	if (result)
 		eth_hw_addr_random(netdev);
 
diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c
index 7eb7d28a489d..cd3a3b8f23b6 100644
--- a/drivers/net/ethernet/ethoc.c
+++ b/drivers/net/ethernet/ethoc.c
@@ -1147,7 +1147,7 @@ static int ethoc_probe(struct platform_device *pdev)
 		eth_hw_addr_set(netdev, pdata->hwaddr);
 		priv->phy_id = pdata->phy_id;
 	} else {
-		of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
+		of_get_ethdev_address(pdev->dev.of_node, netdev);
 		priv->phy_id = -1;
 	}
 
diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c
index f5935eb5a791..323340826dab 100644
--- a/drivers/net/ethernet/ezchip/nps_enet.c
+++ b/drivers/net/ethernet/ezchip/nps_enet.c
@@ -601,7 +601,7 @@ static s32 nps_enet_probe(struct platform_device *pdev)
 	dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base);
 
 	/* set kernel MAC address to dev */
-	err = of_get_mac_address(dev->of_node, ndev->dev_addr);
+	err = of_get_ethdev_address(dev->of_node, ndev);
 	if (err)
 		eth_hw_addr_random(ndev);
 
diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c
index 5e418850d32d..bbbde9f701c2 100644
--- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
@@ -890,7 +890,7 @@ static int mpc52xx_fec_probe(struct platform_device *op)
 	 *
 	 * First try to read MAC address from DT
 	 */
-	rv = of_get_mac_address(np, ndev->dev_addr);
+	rv = of_get_ethdev_address(np, ndev);
 	if (rv) {
 		struct mpc52xx_fec __iomem *fec = priv->fec;
 
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
index 2db6e38a772e..bacf25318f87 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
@@ -1005,7 +1005,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
 	spin_lock_init(&fep->lock);
 	spin_lock_init(&fep->tx_lock);
 
-	of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
+	of_get_ethdev_address(ofdev->dev.of_node, ndev);
 
 	ret = fep->ops->allocate_bd(ndev);
 	if (ret)
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index af6ad94bf24a..acab58fd3db3 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -753,7 +753,7 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
 	if (stash_len || stash_idx)
 		priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
 
-	err = of_get_mac_address(np, dev->dev_addr);
+	err = of_get_ethdev_address(np, dev);
 	if (err) {
 		eth_hw_addr_random(dev);
 		dev_info(&ofdev->dev, "Using random MAC address: %pM\n", dev->dev_addr);
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index e84517a4d245..823221c912ab 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3731,7 +3731,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
 		goto err_free_netdev;
 	}
 
-	of_get_mac_address(np, dev->dev_addr);
+	of_get_ethdev_address(np, dev);
 
 	ugeth->ug_info = ug_info;
 	ugeth->dev = device;
diff --git a/drivers/net/ethernet/hisilicon/hisi_femac.c b/drivers/net/ethernet/hisilicon/hisi_femac.c
index c4057de39523..29190eb890c8 100644
--- a/drivers/net/ethernet/hisilicon/hisi_femac.c
+++ b/drivers/net/ethernet/hisilicon/hisi_femac.c
@@ -841,7 +841,7 @@ static int hisi_femac_drv_probe(struct platform_device *pdev)
 			   (unsigned long)phy->phy_id,
 			   phy_modes(phy->interface));
 
-	ret = of_get_mac_address(node, ndev->dev_addr);
+	ret = of_get_ethdev_address(node, ndev);
 	if (ret) {
 		eth_hw_addr_random(ndev);
 		dev_warn(dev, "using random MAC address %pM\n",
diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
index c1aae0fca5e9..5f7ccdc834b7 100644
--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
@@ -1219,7 +1219,7 @@ static int hix5hd2_dev_probe(struct platform_device *pdev)
 		goto out_phy_node;
 	}
 
-	ret = of_get_mac_address(node, ndev->dev_addr);
+	ret = of_get_ethdev_address(node, ndev);
 	if (ret) {
 		eth_hw_addr_random(ndev);
 		netdev_warn(ndev, "using random MAC address %pM\n",
diff --git a/drivers/net/ethernet/korina.c b/drivers/net/ethernet/korina.c
index 097516af4325..df9a8eefa007 100644
--- a/drivers/net/ethernet/korina.c
+++ b/drivers/net/ethernet/korina.c
@@ -1298,7 +1298,7 @@ static int korina_probe(struct platform_device *pdev)
 
 	if (mac_addr)
 		eth_hw_addr_set(dev, mac_addr);
-	else if (of_get_mac_address(pdev->dev.of_node, dev->dev_addr) < 0)
+	else if (of_get_ethdev_address(pdev->dev.of_node, dev) < 0)
 		eth_hw_addr_random(dev);
 
 	clk = devm_clk_get_optional(&pdev->dev, "mdioclk");
diff --git a/drivers/net/ethernet/lantiq_xrx200.c b/drivers/net/ethernet/lantiq_xrx200.c
index 9b7307eba97c..ecf1e11d9b91 100644
--- a/drivers/net/ethernet/lantiq_xrx200.c
+++ b/drivers/net/ethernet/lantiq_xrx200.c
@@ -527,7 +527,7 @@ static int xrx200_probe(struct platform_device *pdev)
 		return PTR_ERR(priv->clk);
 	}
 
-	err = of_get_mac_address(np, net_dev->dev_addr);
+	err = of_get_ethdev_address(np, net_dev);
 	if (err)
 		eth_hw_addr_random(net_dev);
 
diff --git a/drivers/net/ethernet/litex/litex_liteeth.c b/drivers/net/ethernet/litex/litex_liteeth.c
index a9bdbf0dcfe1..3d9385a4989b 100644
--- a/drivers/net/ethernet/litex/litex_liteeth.c
+++ b/drivers/net/ethernet/litex/litex_liteeth.c
@@ -266,7 +266,7 @@ static int liteeth_probe(struct platform_device *pdev)
 	priv->tx_base = buf_base + priv->num_rx_slots * priv->slot_size;
 	priv->tx_slot = 0;
 
-	err = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
+	err = of_get_ethdev_address(pdev->dev.of_node, netdev);
 	if (err)
 		eth_hw_addr_random(netdev);
 
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 1ee9fb8cbc1b..761155af25d8 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -5242,7 +5242,7 @@ static int mvneta_probe(struct platform_device *pdev)
 		goto err_free_ports;
 	}
 
-	err = of_get_mac_address(dn, dev->dev_addr);
+	err = of_get_ethdev_address(dn, dev);
 	if (!err) {
 		mac_from = "device tree";
 	} else {
diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c
index eada23217010..898b513f74e0 100644
--- a/drivers/net/ethernet/marvell/pxa168_eth.c
+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
@@ -1434,7 +1434,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
 
 	INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
 
-	err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr);
+	err = of_get_ethdev_address(pdev->dev.of_node, dev);
 	if (err) {
 		/* try reading the mac address, if set by the bootloader */
 		pxa168_eth_get_mac_address(dev, dev->dev_addr);
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
index ce131cfd93ac..0da18b3f1c01 100644
--- a/drivers/net/ethernet/marvell/sky2.c
+++ b/drivers/net/ethernet/marvell/sky2.c
@@ -4720,7 +4720,7 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
 	 * 1) from device tree data
 	 * 2) from internal registers set by bootloader
 	 */
-	ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr);
+	ret = of_get_ethdev_address(hw->pdev->dev.of_node, dev);
 	if (ret)
 		memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
 			      ETH_ALEN);
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 398c23cec815..75d67d1b5f6b 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2588,7 +2588,7 @@ static int __init mtk_init(struct net_device *dev)
 	struct mtk_eth *eth = mac->hw;
 	int ret;
 
-	ret = of_get_mac_address(mac->of_node, dev->dev_addr);
+	ret = of_get_ethdev_address(mac->of_node, dev);
 	if (ret) {
 		/* If the mac address is invalid, use random mac address */
 		eth_hw_addr_random(dev);
diff --git a/drivers/net/ethernet/micrel/ks8851_common.c b/drivers/net/ethernet/micrel/ks8851_common.c
index 0613528efdae..2c4e5e602be7 100644
--- a/drivers/net/ethernet/micrel/ks8851_common.c
+++ b/drivers/net/ethernet/micrel/ks8851_common.c
@@ -195,7 +195,7 @@ static void ks8851_init_mac(struct ks8851_net *ks, struct device_node *np)
 	struct net_device *dev = ks->netdev;
 	int ret;
 
-	ret = of_get_mac_address(np, dev->dev_addr);
+	ret = of_get_ethdev_address(np, dev);
 	if (!ret) {
 		ks8851_write_mac_addr(dev);
 		return;
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c
index 11ce9fe435ba..43fd569aa5f1 100644
--- a/drivers/net/ethernet/nxp/lpc_eth.c
+++ b/drivers/net/ethernet/nxp/lpc_eth.c
@@ -1350,7 +1350,7 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
 	__lpc_get_mac(pldat, ndev->dev_addr);
 
 	if (!is_valid_ether_addr(ndev->dev_addr)) {
-		of_get_mac_address(np, ndev->dev_addr);
+		of_get_ethdev_address(np, ndev);
 	}
 	if (!is_valid_ether_addr(ndev->dev_addr))
 		eth_hw_addr_random(ndev);
diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c
index 8427fe1b8fd1..955cce644392 100644
--- a/drivers/net/ethernet/qualcomm/qca_spi.c
+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
@@ -968,7 +968,7 @@ qca_spi_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, qcaspi_devs);
 
-	ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr);
+	ret = of_get_ethdev_address(spi->dev.of_node, qca->net_dev);
 	if (ret) {
 		eth_hw_addr_random(qca->net_dev);
 		dev_info(&spi->dev, "Using random MAC address: %pM\n",
diff --git a/drivers/net/ethernet/qualcomm/qca_uart.c b/drivers/net/ethernet/qualcomm/qca_uart.c
index ce3f7ce31adc..27c4f43176aa 100644
--- a/drivers/net/ethernet/qualcomm/qca_uart.c
+++ b/drivers/net/ethernet/qualcomm/qca_uart.c
@@ -347,7 +347,7 @@ static int qca_uart_probe(struct serdev_device *serdev)
 
 	of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
 
-	ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr);
+	ret = of_get_ethdev_address(serdev->dev.of_node, qca->net_dev);
 	if (ret) {
 		eth_hw_addr_random(qca->net_dev);
 		dev_info(&serdev->dev, "Using random MAC address: %pM\n",
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 9a4888543384..50038e76c72f 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -132,7 +132,7 @@ static void ravb_read_mac_address(struct device_node *np,
 {
 	int ret;
 
-	ret = of_get_mac_address(np, ndev->dev_addr);
+	ret = of_get_ethdev_address(np, ndev);
 	if (ret) {
 		u32 mahr = ravb_read(ndev, MAHR);
 		u32 malr = ravb_read(ndev, MALR);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
index 4639ed9438a3..926532466691 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
@@ -118,7 +118,7 @@ static int sxgbe_platform_probe(struct platform_device *pdev)
 	}
 
 	/* Get MAC address if available (DT) */
-	of_get_mac_address(node, priv->dev->dev_addr);
+	of_get_ethdev_address(node, priv->dev);
 
 	/* Get the TX/RX IRQ numbers */
 	for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c
index ae31ed93aaf0..4b0fe0f58bbf 100644
--- a/drivers/net/ethernet/socionext/sni_ave.c
+++ b/drivers/net/ethernet/socionext/sni_ave.c
@@ -1599,7 +1599,7 @@ static int ave_probe(struct platform_device *pdev)
 
 	ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
 
-	ret = of_get_mac_address(np, ndev->dev_addr);
+	ret = of_get_ethdev_address(np, ndev);
 	if (ret) {
 		/* if the mac address is invalid, use random mac address */
 		eth_hw_addr_random(ndev);
diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c
index a4cd44a39e3d..b666e1b53c5f 100644
--- a/drivers/net/ethernet/ti/netcp_core.c
+++ b/drivers/net/ethernet/ti/netcp_core.c
@@ -2035,7 +2035,7 @@ static int netcp_create_interface(struct netcp_device *netcp_device,
 		devm_iounmap(dev, efuse);
 		devm_release_mem_region(dev, res.start, size);
 	} else {
-		ret = of_get_mac_address(node_interface, ndev->dev_addr);
+		ret = of_get_ethdev_address(node_interface, ndev);
 		if (ret)
 			eth_random_addr(ndev->dev_addr);
 	}
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
index 0d4394125d51..b95aee8607a4 100644
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
@@ -1157,7 +1157,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
 	lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
 	lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
 
-	rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
+	rc = of_get_ethdev_address(ofdev->dev.of_node, ndev);
 	if (rc) {
 		dev_warn(dev, "No MAC address found, using random\n");
 		eth_hw_addr_random(ndev);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr
  2021-10-05 15:53 [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr Jakub Kicinski
  2021-10-05 15:53 ` [PATCH net-next 2/4] ethernet: use of_get_ethdev_address() Jakub Kicinski
@ 2021-10-05 15:53 ` Jakub Kicinski
  2021-10-05 15:57   ` Greg KH
  2021-10-06  7:43   ` Heikki Krogerus
  2021-10-05 15:53 ` [PATCH net-next 4/4] ethernet: use device_get_ethdev_addr() Jakub Kicinski
  3 siblings, 2 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 15:53 UTC (permalink / raw)
  To: davem
  Cc: netdev, gregkh, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree, Jakub Kicinski

Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
of VLANs...") introduced a rbtree for faster Ethernet address look
up. To maintain netdev->dev_addr in this tree we need to make all
the writes to it got through appropriate helpers.

There is a handful of drivers which pass netdev->dev_addr as
the destination buffer to device_get_mac_address(). Add a helper
which takes a dev pointer instead, so it can call an appropriate
helper.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 drivers/base/property.c  | 20 ++++++++++++++++++++
 include/linux/property.h |  2 ++
 2 files changed, 22 insertions(+)

diff --git a/drivers/base/property.c b/drivers/base/property.c
index 453918eb7390..1c8d4676addc 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -997,6 +997,26 @@ void *device_get_mac_address(struct device *dev, char *addr, int alen)
 }
 EXPORT_SYMBOL(device_get_mac_address);
 
+/**
+ * device_get_ethdev_addr - Set netdev's MAC address from a given device
+ * @dev:	Pointer to the device
+ * @netdev:	Pointer to netdev to write the address to
+ *
+ * Wrapper around device_get_mac_address() which writes the address
+ * directly to netdev->dev_addr.
+ */
+void *device_get_ethdev_addr(struct device *dev, struct net_device *netdev)
+{
+	u8 addr[ETH_ALEN];
+	void *ret;
+
+	ret = device_get_mac_address(dev, addr, ETH_ALEN);
+	if (ret)
+		eth_hw_addr_set(netdev, addr);
+	return ret;
+}
+EXPORT_SYMBOL(device_get_ethdev_addr);
+
 /**
  * fwnode_irq_get - Get IRQ directly from a fwnode
  * @fwnode:	Pointer to the firmware node
diff --git a/include/linux/property.h b/include/linux/property.h
index 357513a977e5..24dc4d2b9dbd 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -15,6 +15,7 @@
 #include <linux/types.h>
 
 struct device;
+struct net_device;
 
 enum dev_prop_type {
 	DEV_PROP_U8,
@@ -390,6 +391,7 @@ const void *device_get_match_data(struct device *dev);
 int device_get_phy_mode(struct device *dev);
 
 void *device_get_mac_address(struct device *dev, char *addr, int alen);
+void *device_get_ethdev_addr(struct device *dev, struct net_device *netdev);
 
 int fwnode_get_phy_mode(struct fwnode_handle *fwnode);
 void *fwnode_get_mac_address(struct fwnode_handle *fwnode,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 4/4] ethernet: use device_get_ethdev_addr()
  2021-10-05 15:53 [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW Jakub Kicinski
                   ` (2 preceding siblings ...)
  2021-10-05 15:53 ` [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr Jakub Kicinski
@ 2021-10-05 15:53 ` Jakub Kicinski
  3 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 15:53 UTC (permalink / raw)
  To: davem
  Cc: netdev, gregkh, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree, Jakub Kicinski

Use the new device_get_ethdev_addr() helper for the cases
where dev->dev_addr is passed in directly as the destination.

  @@
  expression dev, np;
  @@
  - device_get_mac_address(np, dev->dev_addr, ETH_ALEN)
  + device_get_ethdev_addr(np, dev)

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 drivers/net/ethernet/apm/xgene-v2/main.c         | 2 +-
 drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 2 +-
 drivers/net/ethernet/broadcom/genet/bcmgenet.c   | 2 +-
 drivers/net/ethernet/hisilicon/hns/hns_enet.c    | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/apm/xgene-v2/main.c b/drivers/net/ethernet/apm/xgene-v2/main.c
index 80399c8980bd..119e488979f9 100644
--- a/drivers/net/ethernet/apm/xgene-v2/main.c
+++ b/drivers/net/ethernet/apm/xgene-v2/main.c
@@ -36,7 +36,7 @@ static int xge_get_resources(struct xge_pdata *pdata)
 		return -ENOMEM;
 	}
 
-	if (!device_get_mac_address(dev, ndev->dev_addr, ETH_ALEN))
+	if (!device_get_ethdev_addr(dev, ndev))
 		eth_hw_addr_random(ndev);
 
 	memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index 5f1fc6582d74..111cd88984c9 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -1731,7 +1731,7 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
 		xgene_get_port_id_acpi(dev, pdata);
 #endif
 
-	if (!device_get_mac_address(dev, ndev->dev_addr, ETH_ALEN))
+	if (!device_get_ethdev_addr(dev, ndev))
 		eth_hw_addr_random(ndev);
 
 	memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 02fe98cbabb0..541763968201 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -4084,7 +4084,7 @@ static int bcmgenet_probe(struct platform_device *pdev)
 	if (pd && !IS_ERR_OR_NULL(pd->mac_address))
 		eth_hw_addr_set(dev, pd->mac_address);
 	else
-		if (!device_get_mac_address(&pdev->dev, dev->dev_addr, ETH_ALEN))
+		if (!device_get_ethdev_addr(&pdev->dev, dev))
 			if (has_acpi_companion(&pdev->dev))
 				bcmgenet_get_hw_addr(priv, dev->dev_addr);
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 2c4801e49aa1..f4ed877e16e9 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1212,7 +1212,7 @@ static void hns_init_mac_addr(struct net_device *ndev)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
 
-	if (!device_get_mac_address(priv->dev, ndev->dev_addr, ETH_ALEN)) {
+	if (!device_get_ethdev_addr(priv->dev, ndev)) {
 		eth_hw_addr_random(ndev);
 		dev_warn(priv->dev, "No valid mac, use random mac %pM",
 			 ndev->dev_addr);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr
  2021-10-05 15:53 ` [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr Jakub Kicinski
@ 2021-10-05 15:57   ` Greg KH
  2021-10-06  7:43   ` Heikki Krogerus
  1 sibling, 0 replies; 12+ messages in thread
From: Greg KH @ 2021-10-05 15:57 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: davem, netdev, rafael, andrew, hkallweit1, linux, robh+dt,
	frowand.list, heikki.krogerus, devicetree

On Tue, Oct 05, 2021 at 08:53:20AM -0700, Jakub Kicinski wrote:
> Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> of VLANs...") introduced a rbtree for faster Ethernet address look
> up. To maintain netdev->dev_addr in this tree we need to make all
> the writes to it got through appropriate helpers.
> 
> There is a handful of drivers which pass netdev->dev_addr as
> the destination buffer to device_get_mac_address(). Add a helper
> which takes a dev pointer instead, so it can call an appropriate
> helper.
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
>  drivers/base/property.c  | 20 ++++++++++++++++++++
>  include/linux/property.h |  2 ++
>  2 files changed, 22 insertions(+)

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr
  2021-10-05 15:53 ` [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr Jakub Kicinski
@ 2021-10-05 16:15   ` Rob Herring
  2021-10-05 16:29     ` Jakub Kicinski
  0 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2021-10-05 16:15 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David Miller, netdev, Greg Kroah-Hartman, Rafael J. Wysocki,
	Andrew Lunn, Heiner Kallweit, Russell King, Frank Rowand,
	Heikki Krogerus, devicetree

On Tue, Oct 5, 2021 at 10:53 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> of VLANs...") introduced a rbtree for faster Ethernet address look
> up. To maintain netdev->dev_addr in this tree we need to make all
> the writes to it got through appropriate helpers.
>
> There are roughly 40 places where netdev->dev_addr is passed
> as the destination to a of_get_mac_address() call. Add a helper
> which takes a dev pointer instead, so it can call an appropriate
> helper.
>
> Note that of_get_mac_address() already assumes the address is
> 6 bytes long (ETH_ALEN) so use eth_hw_addr_set().
>
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
>  drivers/of/of_net.c    | 25 +++++++++++++++++++++++++

Can we move this file to drivers/net/ given it's always merged via the
net tree? It's also the only thing left not part of the driver
subsystems.

>  include/linux/of_net.h |  6 ++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
> index dbac3a172a11..f1a9bf7578e7 100644
> --- a/drivers/of/of_net.c
> +++ b/drivers/of/of_net.c
> @@ -143,3 +143,28 @@ int of_get_mac_address(struct device_node *np, u8 *addr)
>         return of_get_mac_addr_nvmem(np, addr);
>  }
>  EXPORT_SYMBOL(of_get_mac_address);
> +
> +/**
> + * of_get_ethdev_address()
> + * @np:                Caller's Device Node
> + * @dev:       Pointer to netdevice which address will be updated
> + *
> + * Search the device tree for the best MAC address to use.
> + * If found set @dev->dev_addr to that address.
> + *
> + * See documentation of of_get_mac_address() for more information on how
> + * the best address is determined.
> + *
> + * Return: 0 on success and errno in case of error.
> + */
> +int of_get_ethdev_address(struct device_node *np, struct net_device *dev)
> +{
> +       u8 addr[ETH_ALEN];
> +       int ret;
> +
> +       ret = of_get_mac_address(np, addr);
> +       if (!ret)
> +               eth_hw_addr_set(dev, addr);
> +       return ret;
> +}
> +EXPORT_SYMBOL(of_get_ethdev_address);
> diff --git a/include/linux/of_net.h b/include/linux/of_net.h
> index daef3b0d9270..314b9accd98c 100644
> --- a/include/linux/of_net.h
> +++ b/include/linux/of_net.h
> @@ -14,6 +14,7 @@
>  struct net_device;
>  extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
>  extern int of_get_mac_address(struct device_node *np, u8 *mac);
> +int of_get_ethdev_address(struct device_node *np, struct net_device *dev);
>  extern struct net_device *of_find_net_device_by_node(struct device_node *np);
>  #else
>  static inline int of_get_phy_mode(struct device_node *np,
> @@ -27,6 +28,11 @@ static inline int of_get_mac_address(struct device_node *np, u8 *mac)
>         return -ENODEV;
>  }
>
> +static inline int of_get_ethdev_address(struct device_node *np, struct net_device *dev)
> +{
> +       return -ENODEV;
> +}
> +
>  static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
>  {
>         return NULL;
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr
  2021-10-05 16:15   ` Rob Herring
@ 2021-10-05 16:29     ` Jakub Kicinski
  2021-10-05 16:39       ` Rob Herring
  0 siblings, 1 reply; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 16:29 UTC (permalink / raw)
  To: Rob Herring
  Cc: David Miller, netdev, Greg Kroah-Hartman, Rafael J. Wysocki,
	Andrew Lunn, Heiner Kallweit, Russell King, Frank Rowand,
	Heikki Krogerus, devicetree

On Tue, 5 Oct 2021 11:15:48 -0500 Rob Herring wrote:
> On Tue, Oct 5, 2021 at 10:53 AM Jakub Kicinski <kuba@kernel.org> wrote:
> > Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> > of VLANs...") introduced a rbtree for faster Ethernet address look
> > up. To maintain netdev->dev_addr in this tree we need to make all
> > the writes to it got through appropriate helpers.
> >
> > There are roughly 40 places where netdev->dev_addr is passed
> > as the destination to a of_get_mac_address() call. Add a helper
> > which takes a dev pointer instead, so it can call an appropriate
> > helper.
> >
> > Note that of_get_mac_address() already assumes the address is
> > 6 bytes long (ETH_ALEN) so use eth_hw_addr_set().
> >
> > Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> > ---
> >  drivers/of/of_net.c    | 25 +++++++++++++++++++++++++  
> 
> Can we move this file to drivers/net/ given it's always merged via the
> net tree? It's also the only thing left not part of the driver
> subsystems.

Hm, our driver core historically lives under net/core, not drivers/net,
how about drivers/of/of_net.c -> net/core/of_net.c ?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr
  2021-10-05 16:29     ` Jakub Kicinski
@ 2021-10-05 16:39       ` Rob Herring
  2021-10-05 16:54         ` Jakub Kicinski
  0 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2021-10-05 16:39 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David Miller, netdev, Greg Kroah-Hartman, Rafael J. Wysocki,
	Andrew Lunn, Heiner Kallweit, Russell King, Frank Rowand,
	Heikki Krogerus, devicetree

On Tue, Oct 5, 2021 at 11:29 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Tue, 5 Oct 2021 11:15:48 -0500 Rob Herring wrote:
> > On Tue, Oct 5, 2021 at 10:53 AM Jakub Kicinski <kuba@kernel.org> wrote:
> > > Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> > > of VLANs...") introduced a rbtree for faster Ethernet address look
> > > up. To maintain netdev->dev_addr in this tree we need to make all
> > > the writes to it got through appropriate helpers.
> > >
> > > There are roughly 40 places where netdev->dev_addr is passed
> > > as the destination to a of_get_mac_address() call. Add a helper
> > > which takes a dev pointer instead, so it can call an appropriate
> > > helper.
> > >
> > > Note that of_get_mac_address() already assumes the address is
> > > 6 bytes long (ETH_ALEN) so use eth_hw_addr_set().
> > >
> > > Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> > > ---
> > >  drivers/of/of_net.c    | 25 +++++++++++++++++++++++++
> >
> > Can we move this file to drivers/net/ given it's always merged via the
> > net tree? It's also the only thing left not part of the driver
> > subsystems.
>
> Hm, our driver core historically lives under net/core, not drivers/net,
> how about drivers/of/of_net.c -> net/core/of_net.c ?

Sure.

Rob

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr
  2021-10-05 16:39       ` Rob Herring
@ 2021-10-05 16:54         ` Jakub Kicinski
  0 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-05 16:54 UTC (permalink / raw)
  To: Rob Herring
  Cc: David Miller, netdev, Greg Kroah-Hartman, Rafael J. Wysocki,
	Andrew Lunn, Heiner Kallweit, Russell King, Frank Rowand,
	Heikki Krogerus, devicetree

On Tue, 5 Oct 2021 11:39:39 -0500 Rob Herring wrote:
> On Tue, Oct 5, 2021 at 11:29 AM Jakub Kicinski <kuba@kernel.org> wrote:
> > On Tue, 5 Oct 2021 11:15:48 -0500 Rob Herring wrote:  
> > > Can we move this file to drivers/net/ given it's always merged via the
> > > net tree? It's also the only thing left not part of the driver
> > > subsystems.  
> >
> > Hm, our driver core historically lives under net/core, not drivers/net,
> > how about drivers/of/of_net.c -> net/core/of_net.c ?  
> 
> Sure.

I'll send out the rename as soon as this gets merged. If anyone has 
a different idea on where to move this code please chime in.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr
  2021-10-05 15:53 ` [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr Jakub Kicinski
  2021-10-05 15:57   ` Greg KH
@ 2021-10-06  7:43   ` Heikki Krogerus
  2021-10-06 12:59     ` Jakub Kicinski
  1 sibling, 1 reply; 12+ messages in thread
From: Heikki Krogerus @ 2021-10-06  7:43 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: davem, netdev, gregkh, rafael, andrew, hkallweit1, linux,
	robh+dt, frowand.list, devicetree

On Tue, Oct 05, 2021 at 08:53:20AM -0700, Jakub Kicinski wrote:
> Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> of VLANs...") introduced a rbtree for faster Ethernet address look
> up. To maintain netdev->dev_addr in this tree we need to make all
> the writes to it got through appropriate helpers.
> 
> There is a handful of drivers which pass netdev->dev_addr as
> the destination buffer to device_get_mac_address(). Add a helper
> which takes a dev pointer instead, so it can call an appropriate
> helper.
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
>  drivers/base/property.c  | 20 ++++++++++++++++++++
>  include/linux/property.h |  2 ++
>  2 files changed, 22 insertions(+)
> 
> diff --git a/drivers/base/property.c b/drivers/base/property.c
> index 453918eb7390..1c8d4676addc 100644
> --- a/drivers/base/property.c
> +++ b/drivers/base/property.c
> @@ -997,6 +997,26 @@ void *device_get_mac_address(struct device *dev, char *addr, int alen)
>  }
>  EXPORT_SYMBOL(device_get_mac_address);
>  
> +/**
> + * device_get_ethdev_addr - Set netdev's MAC address from a given device
> + * @dev:	Pointer to the device
> + * @netdev:	Pointer to netdev to write the address to
> + *
> + * Wrapper around device_get_mac_address() which writes the address
> + * directly to netdev->dev_addr.
> + */
> +void *device_get_ethdev_addr(struct device *dev, struct net_device *netdev)
> +{
> +	u8 addr[ETH_ALEN];
> +	void *ret;
> +
> +	ret = device_get_mac_address(dev, addr, ETH_ALEN);
> +	if (ret)
> +		eth_hw_addr_set(netdev, addr);
> +	return ret;
> +}
> +EXPORT_SYMBOL(device_get_ethdev_addr);

Is there some reason why can't this be in net/ethernet/eth.c?

I would really prefer that we don't add any more subsystem specific
functions into this file (drivers/base/property.c).

Shouldn't actually fwnode_get_mac_addr() and fwnode_get_mac_address()
be moved to net/ethernet/eth.c as well?

>  /**
>   * fwnode_irq_get - Get IRQ directly from a fwnode
>   * @fwnode:	Pointer to the firmware node
> diff --git a/include/linux/property.h b/include/linux/property.h
> index 357513a977e5..24dc4d2b9dbd 100644
> --- a/include/linux/property.h
> +++ b/include/linux/property.h
> @@ -15,6 +15,7 @@
>  #include <linux/types.h>
>  
>  struct device;
> +struct net_device;
>  
>  enum dev_prop_type {
>  	DEV_PROP_U8,
> @@ -390,6 +391,7 @@ const void *device_get_match_data(struct device *dev);
>  int device_get_phy_mode(struct device *dev);
>  
>  void *device_get_mac_address(struct device *dev, char *addr, int alen);
> +void *device_get_ethdev_addr(struct device *dev, struct net_device *netdev);

So this you would then introduce in linux/etherdevce.h (?)
But not here, in include/linux/property.h

thanks,

-- 
heikki

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr
  2021-10-06  7:43   ` Heikki Krogerus
@ 2021-10-06 12:59     ` Jakub Kicinski
  0 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2021-10-06 12:59 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: davem, netdev, gregkh, rafael, andrew, hkallweit1, linux,
	robh+dt, frowand.list, devicetree

On Wed, 6 Oct 2021 10:43:13 +0300 Heikki Krogerus wrote:
> On Tue, Oct 05, 2021 at 08:53:20AM -0700, Jakub Kicinski wrote:
> > Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
> > of VLANs...") introduced a rbtree for faster Ethernet address look
> > up. To maintain netdev->dev_addr in this tree we need to make all
> > the writes to it got through appropriate helpers.
> > 
> > There is a handful of drivers which pass netdev->dev_addr as
> > the destination buffer to device_get_mac_address(). Add a helper
> > which takes a dev pointer instead, so it can call an appropriate
> > helper.
> > 
> > Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> > ---
> >  drivers/base/property.c  | 20 ++++++++++++++++++++
> >  include/linux/property.h |  2 ++
> >  2 files changed, 22 insertions(+)
> > 
> > diff --git a/drivers/base/property.c b/drivers/base/property.c
> > index 453918eb7390..1c8d4676addc 100644
> > --- a/drivers/base/property.c
> > +++ b/drivers/base/property.c
> > @@ -997,6 +997,26 @@ void *device_get_mac_address(struct device *dev, char *addr, int alen)
> >  }
> >  EXPORT_SYMBOL(device_get_mac_address);
> >  
> > +/**
> > + * device_get_ethdev_addr - Set netdev's MAC address from a given device
> > + * @dev:	Pointer to the device
> > + * @netdev:	Pointer to netdev to write the address to
> > + *
> > + * Wrapper around device_get_mac_address() which writes the address
> > + * directly to netdev->dev_addr.
> > + */
> > +void *device_get_ethdev_addr(struct device *dev, struct net_device *netdev)
> > +{
> > +	u8 addr[ETH_ALEN];
> > +	void *ret;
> > +
> > +	ret = device_get_mac_address(dev, addr, ETH_ALEN);
> > +	if (ret)
> > +		eth_hw_addr_set(netdev, addr);
> > +	return ret;
> > +}
> > +EXPORT_SYMBOL(device_get_ethdev_addr);  
> 
> Is there some reason why can't this be in net/ethernet/eth.c?
> 
> I would really prefer that we don't add any more subsystem specific
> functions into this file (drivers/base/property.c).

Sure.

> Shouldn't actually fwnode_get_mac_addr() and fwnode_get_mac_address()
> be moved to net/ethernet/eth.c as well?

Fine by me, there's already a handful of such helpers there. 

I'll add the refactoring I posted as a RFC to the series as well:

https://lore.kernel.org/all/20211006022444.3155482-1-kuba@kernel.org/

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-10-06 12:59 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-05 15:53 [PATCH net-next 0/4] net: add a helpers for loading netdev->dev_addr from FW Jakub Kicinski
2021-10-05 15:53 ` [PATCH net-next 1/4] of: net: add a helper for loading netdev->dev_addr Jakub Kicinski
2021-10-05 16:15   ` Rob Herring
2021-10-05 16:29     ` Jakub Kicinski
2021-10-05 16:39       ` Rob Herring
2021-10-05 16:54         ` Jakub Kicinski
2021-10-05 15:53 ` [PATCH net-next 2/4] ethernet: use of_get_ethdev_address() Jakub Kicinski
2021-10-05 15:53 ` [PATCH net-next 3/4] device property: add a helper for loading netdev->dev_addr Jakub Kicinski
2021-10-05 15:57   ` Greg KH
2021-10-06  7:43   ` Heikki Krogerus
2021-10-06 12:59     ` Jakub Kicinski
2021-10-05 15:53 ` [PATCH net-next 4/4] ethernet: use device_get_ethdev_addr() Jakub Kicinski

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.