Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp533003pxf; Wed, 7 Apr 2021 05:52:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw3XDcb48Q7RYVKCTxX3s0OoaNij9GAH798LL2hZXvpC6b5NKy2mYzHyd1Yz1h95wcXO0fR X-Received: by 2002:a17:906:6789:: with SMTP id q9mr3637011ejp.295.1617799922865; Wed, 07 Apr 2021 05:52:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617799922; cv=none; d=google.com; s=arc-20160816; b=hzGGzJFgmUQGoft9L+DvG7J76IyEEd9TBcLITnynSlMrRZfrOHx9LI8sIJH9budiwq kMsR7tMRQOhuEbWCnqcdphmbiScoY2ztmGUDSj2++XEYxeHbic4aHdnheSfazMIYSswM E07r+yOSyVfu6LKkwNiHYj+nU9ZLUdCTNQm6ev49LxtOMASwm2FxG6u5OcucLTNv2a0S vCcaFpqdSEpoyTXKpeDJ4XjuL4UgEz4GU4Wj2rGGmMXhzFwWt0ol1sEKZm35MD1ekaoL arRacW/HC/x+AjgvrgFap8ZCLFyiHjks3/u1QC4kiEtFGQoDOh+Zl4uowCJCDgrws0FX dRLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=q+28b1zyD0ipnp7X7qaRNoB7yZQlbx9y5m7NwMvG7cM=; b=Wq5/8NdnvvthPpAsz6S+7GpNrSCub3YFsHKAUvi7lqHuaEJ1Jlv324KEK1oKaB4KNN MuOZwR8ris5l27ZLe4tuCKhl3xiydd0gXmf8YXNne/AB+ZRkA5i4OOIPBxhl5mF5KGbR WKgjCgicNOtYBs2wOH1xsvkpQIHa6VgXggDZIxVGjLjnMkuZYjEkiKw9Mimzd+lPCsyO djq3pkYt4bqHir+GpTGa4fLB6THkZ2qUkP/cH5ebRrCrSKerZapNc5YVn7UDEQaCC+5N AoUDR0c+10xy990BAsX/WB10pwhZr8P6A1WdEny22ItLtm4cGHzYrSUzVCfeV/XIMZbI oPAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@walle.cc header.s=mail2016061301 header.b=VpG+SaxC; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cq25si12523797edb.77.2021.04.07.05.51.39; Wed, 07 Apr 2021 05:52:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@walle.cc header.s=mail2016061301 header.b=VpG+SaxC; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344002AbhDFWKH (ORCPT + 99 others); Tue, 6 Apr 2021 18:10:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343952AbhDFWKC (ORCPT ); Tue, 6 Apr 2021 18:10:02 -0400 Received: from ssl.serverraum.org (ssl.serverraum.org [IPv6:2a01:4f8:151:8464::1:2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D845EC06175F; Tue, 6 Apr 2021 15:09:53 -0700 (PDT) Received: from mwalle01.fritz.box (unknown [IPv6:2a02:810c:c200:2e91:fa59:71ff:fe9b:b851]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ssl.serverraum.org (Postfix) with ESMTPSA id 5A4362224F; Wed, 7 Apr 2021 00:09:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=walle.cc; s=mail2016061301; t=1617746989; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=q+28b1zyD0ipnp7X7qaRNoB7yZQlbx9y5m7NwMvG7cM=; b=VpG+SaxCrsqgK5AJ1uhvjqYL1Iz1HzqgMpALtpVAFdxlIxmlhhlsMp0jMDGwL6tEuMwcYt gqCojAcZb5LTi3qRkB2cRnKgQoGxBEBC4LAyNNK/cZJSH10jI46hzGor743DDIpxqYvtuU vzVbTRLjt5LlEXPfhBM/l7+qzAuqI30= From: Michael Walle To: ath9k-devel@qca.qualcomm.com, UNGLinuxDriver@microchip.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, netdev@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-renesas-soc@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-amlogic@lists.infradead.org, linux-oxnas@groups.io, linux-omap@vger.kernel.org, linux-wireless@vger.kernel.org, devicetree@vger.kernel.org, linux-staging@lists.linux.dev Cc: Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Russell King , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Andreas Larsson , "David S . Miller" , Jakub Kicinski , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , Joyce Ooi , Chris Snook , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , bcm-kernel-feedback-list@broadcom.com, Florian Fainelli , Nicolas Ferre , Claudiu Beznea , Sunil Goutham , Fugang Duan , Madalin Bucur , Pantelis Antoniou , Claudiu Manoil , Li Yang , Yisen Zhuang , Salil Mehta , Hauke Mehrtens , Thomas Petazzoni , Vadym Kochan , Taras Chornyi , Mirko Lindner , Stephen Hemminger , Felix Fietkau , John Crispin , Sean Wang , Mark Lee , Matthias Brugger , Bryan Whitehead , Vladimir Zapolskiy , Sergei Shtylyov , Byungho An , Kunihiko Hayashi , Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , Maxime Coquelin , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Kevin Hilman , Neil Armstrong , Jerome Brunet , Martin Blumenstingl , Vinod Koul , Nobuhiro Iwamatsu , Grygorii Strashko , Wingman Kwok , Murali Karicheri , Michal Simek , Radhey Shyam Pandey , Kalle Valo , Lorenzo Bianconi , Ryder Lee , Stanislaw Gruszka , Helmut Schaa , Heiner Kallweit , Rob Herring , Frank Rowand , Greg Kroah-Hartman , =?UTF-8?q?J=C3=A9r=C3=B4me=20Pouiller?= , Vivien Didelot , Vladimir Oltean , Michael Walle Subject: [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes Date: Wed, 7 Apr 2021 00:09:21 +0200 Message-Id: <20210406220921.24313-3-michael@walle.cc> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210406220921.24313-1-michael@walle.cc> References: <20210406220921.24313-1-michael@walle.cc> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org of_get_mac_address() already supports fetching the MAC address by an nvmem provider. But until now, it was just working for platform devices. Esp. it was not working for DSA ports and PCI devices. It gets more common that PCI devices have a device tree binding since SoCs contain integrated root complexes. Use the nvmem of_* binding to fetch the nvmem cells by a struct device_node. We still have to try to read the cell by device first because there might be a nvmem_cell_lookup associated with that device. Signed-off-by: Michael Walle --- Please note, that I've kept the nvmem_get_mac_address() which operates on a device. The new of_get_mac_addr_nvmem() is almost identical and there are no users of the former function right now, but it seems to be the "newer" version to get the MAC address for a "struct device". Thus I've kept it. Please advise, if I should kill it though. drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c index 2d5d5e59aea5..2323c6063eaf 100644 --- a/drivers/of/of_net.c +++ b/drivers/of/of_net.c @@ -11,6 +11,7 @@ #include #include #include +#include /** * of_get_phy_mode - Get phy mode for given device_node @@ -59,15 +60,39 @@ static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr) static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr) { struct platform_device *pdev = of_find_device_by_node(np); + struct nvmem_cell *cell; + const void *mac; + size_t len; int ret; - if (!pdev) - return -ENODEV; + /* Try lookup by device first, there might be a nvmem_cell_lookup + * associated with a given device. + */ + if (pdev) { + ret = nvmem_get_mac_address(&pdev->dev, addr); + put_device(&pdev->dev); + return ret; + } + + cell = of_nvmem_cell_get(np, "mac-address"); + if (IS_ERR(cell)) + return PTR_ERR(cell); + + mac = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + + if (IS_ERR(mac)) + return PTR_ERR(mac); + + if (len != ETH_ALEN || !is_valid_ether_addr(mac)) { + kfree(mac); + return -EINVAL; + } - ret = nvmem_get_mac_address(&pdev->dev, addr); - put_device(&pdev->dev); + ether_addr_copy(addr, mac); + kfree(mac); - return ret; + return 0; } /** -- 2.20.1