[PATCH v4 08/18] net: davinci_emac: potentially get the MAC address from MTD
From: Bartosz Golaszewski <hidden>
Date: 2018-07-02 07:41:42
Also in:
linux-omap, lkml, netdev
2018-06-29 22:35 GMT+02:00 David Lechner [off-list ref]:
On 06/29/2018 03:09 PM, David Lechner wrote:quoted
On 06/29/2018 04:40 AM, Bartosz Golaszewski wrote:quoted
From: Bartosz Golaszewski <redacted> On da850-evm board we can read the MAC address from MTD. It's currently done in the relevant board file, but we want to get rid of all the MAC reading callbacks from the board file (SPI and NAND). Move the reading of the MAC address from SPI to the emac driver's probe function. Signed-off-by: Bartosz Golaszewski <redacted> --- drivers/net/ethernet/ti/davinci_emac.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)diff --git a/drivers/net/ethernet/ti/davinci_emac.cb/drivers/net/ethernet/ti/davinci_emac.c index a1a6445b5a7e..48e6a7755811 100644--- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c@@ -67,7 +67,7 @@ #include <linux/of_irq.h> #include <linux/of_net.h> #include <linux/mfd/syscon.h> - +#include <linux/mtd/mtd.h> #include <asm/irq.h> #include <asm/page.h>@@ -1783,7 +1783,10 @@ static int davinci_emac_probe(structplatform_device *pdev) struct cpdma_params dma_params; struct clk *emac_clk; unsigned long emac_bus_frequency; - +#ifdef CONFIG_MTD + size_t mac_addr_len; + struct mtd_info *mtd; +#endif /* CONFIG_MTD */ /* obtain emac clock from kernel */ emac_clk = devm_clk_get(&pdev->dev, NULL);@@ -1815,6 +1818,19 @@ static int davinci_emac_probe(structplatform_device *pdev) goto err_free_netdev; } +#ifdef CONFIG_MTDWhat about the case when MTD is compiled as a module?quoted
+ mtd = get_mtd_device_nm("MAC-Address");What about the case when PTR_ERR(mtd) == -EPROBE_DEFER?To answer my own question: because get_mtd_device_nm() doesn't ever return -EPROBE_DEFER. I'm trying to make this work on LCDK, but the emac driver probes before any mtd device is registered, so, I just get -ENODEV even though I've added a partition to the device tree labeled "MAC-Address". You can see in the kernel messages that MTD is not probed until later.
I tested it on da850-evm - all MTD & SPI related modules need to be built-in for it to work, so: CONFIG_MTD=y CONFIG_MTD_M25P80=y CONFIG_SPI_DAVINCI=y Best regards, Bartosz Golaszewski
quoted
quoted
+ if (!IS_ERR(mtd)) { + rc = mtd_read(mtd, 0, ETH_ALEN, + &mac_addr_len, priv->mac_addr); + if (rc == 0) + dev_info(&pdev->dev, + "Read MAC addr from SPI Flash: %pM\n", + priv->mac_addr); + put_mtd_device(mtd); + } +#endif /* CONFIG_MTD */ + /* MAC addr and PHY mask , RMII enable info from platform_data */ memcpy(priv->mac_addr, pdata->mac_addr, ETH_ALEN); priv->phy_id = pdata->phy_id;