All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/2] r8169: Load MAC address from device tree if present
@ 2019-02-06 12:30 Thierry Reding
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Thierry Reding @ 2019-02-06 12:30 UTC (permalink / raw)
  To: David S. Miller
  Cc: Heiner Kallweit, Andrew Lunn, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

From: Thierry Reding <treding@nvidia.com>

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 <treding@nvidia.com>
---
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);
 
-- 
2.19.1


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

* [PATCH v3 2/2] r8169: Avoid pointer aliasing
  2019-02-06 12:30 [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
@ 2019-02-06 12:30 ` Thierry Reding
  2019-02-06 12:35   ` Thierry Reding
                     ` (2 more replies)
  2019-02-06 12:33 ` [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
                   ` (2 subsequent siblings)
  3 siblings, 3 replies; 8+ messages in thread
From: Thierry Reding @ 2019-02-06 12:30 UTC (permalink / raw)
  To: David S. Miller
  Cc: Heiner Kallweit, Andrew Lunn, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

From: Thierry Reding <treding@nvidia.com>

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 <andrew@lunn.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
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;
-- 
2.19.1


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

* Re: [PATCH v3 1/2] r8169: Load MAC address from device tree if present
  2019-02-06 12:30 [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
@ 2019-02-06 12:33 ` Thierry Reding
  2019-02-06 13:29 ` Andrew Lunn
  2019-02-06 21:40 ` David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: Thierry Reding @ 2019-02-06 12:33 UTC (permalink / raw)
  To: David S. Miller
  Cc: Heiner Kallweit, Andrew Lunn, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 920 bytes --]

On Wed, Feb 06, 2019 at 01:30:17PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <treding@nvidia.com>
> ---
> 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(-)

Sorry, I forgot to include Heiner's Reviewed-by tag here, but with any
luck patchwork will pick it up if I do this:

This patch previously:

Reviewed-by: Heiner Kallweit <hkallweit1@gmail.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH v3 2/2] r8169: Avoid pointer aliasing
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
@ 2019-02-06 12:35   ` Thierry Reding
  2019-02-06 13:28   ` Andrew Lunn
  2019-02-06 21:40   ` David Miller
  2 siblings, 0 replies; 8+ messages in thread
From: Thierry Reding @ 2019-02-06 12:35 UTC (permalink / raw)
  To: David S. Miller
  Cc: Heiner Kallweit, Andrew Lunn, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1047 bytes --]

On Wed, Feb 06, 2019 at 01:30:18PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <andrew@lunn.ch>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> 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(-)

I also forgot Andrew's Reviewed-by here, but technically the patch has
changed, so I'll leave it up to him to confirm he's still okay with this
version.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH v3 2/2] r8169: Avoid pointer aliasing
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
  2019-02-06 12:35   ` Thierry Reding
@ 2019-02-06 13:28   ` Andrew Lunn
  2019-02-06 21:40   ` David Miller
  2 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2019-02-06 13:28 UTC (permalink / raw)
  To: Thierry Reding
  Cc: David S. Miller, Heiner Kallweit, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

On Wed, Feb 06, 2019 at 01:30:18PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <andrew@lunn.ch>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> 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()

Hi Thierry

The point of this patch was to try to avoid the pointer aliasing,
which is what leads to the alignment requirements. But if you are
forced to align it because of is_valid_ether_addr() i would just drop
this patch. Aliasing is going to happen whatever.

But if you want to keep it.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [PATCH v3 1/2] r8169: Load MAC address from device tree if present
  2019-02-06 12:30 [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
  2019-02-06 12:33 ` [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
@ 2019-02-06 13:29 ` Andrew Lunn
  2019-02-06 21:40 ` David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2019-02-06 13:29 UTC (permalink / raw)
  To: Thierry Reding
  Cc: David S. Miller, Heiner Kallweit, Joe Perches, Eric Dumazet,
	Paul Zimmerman, Michal Kubecek, Realtek linux nic maintainers,
	netdev, linux-kernel

On Wed, Feb 06, 2019 at 01:30:17PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <treding@nvidia.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [PATCH v3 1/2] r8169: Load MAC address from device tree if present
  2019-02-06 12:30 [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
                   ` (2 preceding siblings ...)
  2019-02-06 13:29 ` Andrew Lunn
@ 2019-02-06 21:40 ` David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2019-02-06 21:40 UTC (permalink / raw)
  To: thierry.reding
  Cc: hkallweit1, andrew, joe, eric.dumazet, pauldzim, mkubecek,
	nic_swsd, netdev, linux-kernel

From: Thierry Reding <thierry.reding@gmail.com>
Date: Wed,  6 Feb 2019 13:30:17 +0100

> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <treding@nvidia.com>

Applied.

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

* Re: [PATCH v3 2/2] r8169: Avoid pointer aliasing
  2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
  2019-02-06 12:35   ` Thierry Reding
  2019-02-06 13:28   ` Andrew Lunn
@ 2019-02-06 21:40   ` David Miller
  2 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2019-02-06 21:40 UTC (permalink / raw)
  To: thierry.reding
  Cc: hkallweit1, andrew, joe, eric.dumazet, pauldzim, mkubecek,
	nic_swsd, netdev, linux-kernel

From: Thierry Reding <thierry.reding@gmail.com>
Date: Wed,  6 Feb 2019 13:30:18 +0100

> From: Thierry Reding <treding@nvidia.com>
> 
> 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 <andrew@lunn.ch>
> Signed-off-by: Thierry Reding <treding@nvidia.com>

Applied.

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

end of thread, other threads:[~2019-02-06 21:40 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-06 12:30 [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
2019-02-06 12:30 ` [PATCH v3 2/2] r8169: Avoid pointer aliasing Thierry Reding
2019-02-06 12:35   ` Thierry Reding
2019-02-06 13:28   ` Andrew Lunn
2019-02-06 21:40   ` David Miller
2019-02-06 12:33 ` [PATCH v3 1/2] r8169: Load MAC address from device tree if present Thierry Reding
2019-02-06 13:29 ` Andrew Lunn
2019-02-06 21:40 ` David Miller

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.