From patchwork Wed Feb 6 12:30:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1037478 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iU3wLvID"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vglH14qJz9sMr for ; Wed, 6 Feb 2019 23:30:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730320AbfBFMaW (ORCPT ); Wed, 6 Feb 2019 07:30:22 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:40077 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727710AbfBFMaW (ORCPT ); Wed, 6 Feb 2019 07:30:22 -0500 Received: by mail-wr1-f68.google.com with SMTP id p4so7336095wrt.7; Wed, 06 Feb 2019 04:30:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=XocHWDy3JkZ230roSe3THeQ0tWX1M8J9RndFd/nyPiA=; b=iU3wLvIDIn1V03I2qpz/8uvH657etNti2xYmuQtzLZiNBTIx+JxpdRvUUEwV+2pt4Q zhgkgivv8KjE27gBd/ps3m9ScmQ4zrowUF8BNXBtjolJTRdxXXjbraUkChgLWMzHkPa5 gPG/fz8L5daD1OG4mw/WXTVAN58yjHmMXvLa2pVntWwohhbVx6CCfoGZ/6U03zct4j5W OE3JgDRqH4cGrlnPQ19jt9y6uT1nlknvmcozyvS+9577h9I8E0Psy+/9typWHzOHLURe u6UxGmxxXJC6NQdue0cif1LChtxcEKcbEjpQ7KxAaNnOZ7BliRg6dCWbs/KG9SuGyKk3 TUoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=XocHWDy3JkZ230roSe3THeQ0tWX1M8J9RndFd/nyPiA=; b=gqqbxqM1ZKx1WrOtQeTi//ncutSCEr0jsqyeAfxZiJO9pd7nhUbu+eLuZxcZON/7cV 5tE495HdmNKrcmttSPDe1FLO0zhqOk0cf2+zJ2Wc9qhjysn60cIUoG6hhcGa+uSWMvCW iOkh5INTWgJx6MFlYl6E7kx9L5nmmxEdwMxwGu2mwPS6PITrgGWh3ZE6Jar3+AUdTW+k LAhh51T7vk1YkWKX7LZS92Fuvthry9X/13D/odtK27HQZN9Uzo9rmF+V83fsZtw+Czox XNqai1Xdg93hiLWCSQZ7MWKfKmWh3SqNdFb97Hlt/9QY2DMjM141sRzE2oy/ZNwOdZHS 4e6g== X-Gm-Message-State: AHQUAuabTvnxnrsaYPI+n4ILTKqeg9I4VWf/uhNd+Nv5A+hjBw/kYvnw JpCxYWyr3BIcl0dKZs0DBzA= X-Google-Smtp-Source: AHgI3IZAdyWmFS2kHzphCquPPW9IcbrdW4bZ8ePa8ygSAwRkMHmsTpPFtLl8Xdixdw/1FEwuWDgJQA== X-Received: by 2002:adf:c505:: with SMTP id q5mr7606109wrf.84.1549456220083; Wed, 06 Feb 2019 04:30:20 -0800 (PST) Received: from localhost (pD9E51040.dip0.t-ipconnect.de. [217.229.16.64]) by smtp.gmail.com with ESMTPSA id a132sm33860801wmh.5.2019.02.06.04.30.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 06 Feb 2019 04:30:19 -0800 (PST) From: Thierry Reding To: "David S. Miller" Cc: Heiner Kallweit , Andrew Lunn , Joe Perches , Eric Dumazet , Paul Zimmerman , Michal Kubecek , Realtek linux nic maintainers , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/2] r8169: Load MAC address from device tree if present Date: Wed, 6 Feb 2019 13:30:17 +0100 Message-Id: <20190206123018.24802-1-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Thierry Reding If the system was booted using a device tree and if the device tree contains a MAC address, use it instead of reading one from the EEPROM. This is useful in situations where the EEPROM isn't properly programmed or where the firmware wants to override the existing MAC address. Signed-off-by: Thierry Reding Reviewed-by: Heiner Kallweit Reviewed-by: Andrew Lunn --- Applies on net-next. Changes in v2: - rewrite error check for readability - initialize mac_addr array drivers/net/ethernet/realtek/r8169.c | 36 ++++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index e8a112149a62..501891be7c56 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -7110,6 +7110,21 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags); } +static void rtl_read_mac_address(struct rtl8169_private *tp, + u8 mac_addr[ETH_ALEN]) +{ + /* Get MAC address */ + switch (tp->mac_version) { + case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: + *(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); + *(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); + break; + default: + break; + } +} + DECLARE_RTL_COND(rtl_link_list_ready_cond) { return RTL_R8(tp, MCU) & LINK_LIST_RDY; @@ -7301,6 +7316,7 @@ static int rtl_get_ether_clk(struct rtl8169_private *tp) static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; + u8 mac_addr[ETH_ALEN] __aligned(4) = {}; struct rtl8169_private *tp; struct net_device *dev; int chipset, region, i; @@ -7403,20 +7419,14 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) u64_stats_init(&tp->rx_stats.syncp); u64_stats_init(&tp->tx_stats.syncp); - /* Get MAC address */ - switch (tp->mac_version) { - u8 mac_addr[ETH_ALEN] __aligned(4); - case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: - *(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); - *(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); + /* get MAC address */ + rc = eth_platform_get_mac_address(&pdev->dev, mac_addr); + if (rc) + rtl_read_mac_address(tp, mac_addr); + + if (is_valid_ether_addr(mac_addr)) + rtl_rar_set(tp, mac_addr); - if (is_valid_ether_addr(mac_addr)) - rtl_rar_set(tp, mac_addr); - break; - default: - break; - } for (i = 0; i < ETH_ALEN; i++) dev->dev_addr[i] = RTL_R8(tp, MAC0 + i); From patchwork Wed Feb 6 12:30:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1037477 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="utJhRuLq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vglC2T2Lz9sMr for ; Wed, 6 Feb 2019 23:30:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730438AbfBFMaY (ORCPT ); Wed, 6 Feb 2019 07:30:24 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:35960 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728167AbfBFMaX (ORCPT ); Wed, 6 Feb 2019 07:30:23 -0500 Received: by mail-wr1-f67.google.com with SMTP id z3so7363133wrv.3; Wed, 06 Feb 2019 04:30:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=p+V+ugKLmy1ndrNliBfqiopLtR1Ests8dXxdeFR9BBs=; b=utJhRuLqjsE0TQIzdZfoW29ZLUG3Ys/qOs74lzpfuny257ZbdvxMQWwxL4/+/HJxap aPClm2CY6SFZk3eydMqrGAKJWvLj81OYk045+mtKuby2N4W0lXHXHXTaLv1AO5jb1hhP CjUP9bkhTgbJFw+xyECkk5sM/3XV3S/HEnxLW4D/hKQL2sqWiibslRv7iHOSvuIEK8Ml Z1q1FtP+Zosoi8ZIQbFmgpVhMJRFbVLxI6oY2f/pejd32wpqQFEwb1S8iSp2rYcK/r5c CUt7SZ6WgF66fb0gFNij1fQcCtT0LRQatkzoAOcTSIJD10edQAK0BbyIWH/J7TotJedq SG0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=p+V+ugKLmy1ndrNliBfqiopLtR1Ests8dXxdeFR9BBs=; b=efkbHOucmTCtZgQz6aIEfk3sbht1nonNOkhxiTaHItRmMmjow8gFGq+pCzq/CqSo5p txEe8G8WM//Mf+1OjdLGXl5uwXJ6TyEKK1I7847EvhcBjboE5r/GO/lYJ9Zt3fdENTC9 bhRu9BUh6HJOwnaaM1CN2A7lLcSuvk5FX3j/g2QsdQPtFmKlOJ63u0FY9oCnQOOZdd1a sXOVz3T0z36FhzuWf0+eygdFgq94YxGfeC3qLBQlxvNLQJrdbDvO6fFECCfL/VeeRSwb drB7z+TLAogJICrLLW74xVKUA81as3gr1+24RFgQYknqw8J8ZlUADV/RuHE1IKMGnIg5 U29g== X-Gm-Message-State: AHQUAubqOkaQvsWhLGfDBXwT/9apFkvwVLbTd7w9qfOiHVIutIYLlNdm Lhyl6FpVkgz/8+O0j+N76ic= X-Google-Smtp-Source: AHgI3IZMKEuaHFpSRJE348VNK/JYaycjUA+1v0IpGqweptfYndOMZLbriZHwwrL4rsTm1I5ofPUzDg== X-Received: by 2002:a05:6000:1144:: with SMTP id d4mr7572918wrx.136.1549456221584; Wed, 06 Feb 2019 04:30:21 -0800 (PST) Received: from localhost (pD9E51040.dip0.t-ipconnect.de. [217.229.16.64]) by smtp.gmail.com with ESMTPSA id x12sm18283182wrt.20.2019.02.06.04.30.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 06 Feb 2019 04:30:21 -0800 (PST) From: Thierry Reding To: "David S. Miller" Cc: Heiner Kallweit , Andrew Lunn , Joe Perches , Eric Dumazet , Paul Zimmerman , Michal Kubecek , Realtek linux nic maintainers , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/2] r8169: Avoid pointer aliasing Date: Wed, 6 Feb 2019 13:30:18 +0100 Message-Id: <20190206123018.24802-2-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190206123018.24802-1-thierry.reding@gmail.com> References: <20190206123018.24802-1-thierry.reding@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Thierry Reding Read MAC address 32-bit at a time and manually extract the individual bytes. This avoids pointer aliasing and gives the compiler a better chance of optimizing the operation. Suggested-by: Andrew Lunn Signed-off-by: Thierry Reding Reviewed-by: Andrew Lunn --- Applies to net-next. I tested this on a Jetson TX2 with an add-in Realtek ethernet card that has a properly programmed OTP to verify that I got the endianess right. Seems like everything works and the device behaves the same with or without this patch. Changes in v3: - align MAC address to u16 for is_valid_ether_addr() drivers/net/ethernet/realtek/r8169.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 501891be7c56..1dd72137fd53 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -7113,12 +7113,21 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) static void rtl_read_mac_address(struct rtl8169_private *tp, u8 mac_addr[ETH_ALEN]) { + u32 value; + /* Get MAC address */ switch (tp->mac_version) { case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: - *(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); - *(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); + value = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); + mac_addr[0] = (value >> 0) & 0xff; + mac_addr[1] = (value >> 8) & 0xff; + mac_addr[2] = (value >> 16) & 0xff; + mac_addr[3] = (value >> 24) & 0xff; + + value = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); + mac_addr[4] = (value >> 0) & 0xff; + mac_addr[5] = (value >> 8) & 0xff; break; default: break; @@ -7316,7 +7325,8 @@ static int rtl_get_ether_clk(struct rtl8169_private *tp) static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; - u8 mac_addr[ETH_ALEN] __aligned(4) = {}; + /* align to u16 for is_valid_ether_addr() */ + u8 mac_addr[ETH_ALEN] __aligned(2) = {}; struct rtl8169_private *tp; struct net_device *dev; int chipset, region, i;