linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] r8169: Load MAC address from device tree if present
@ 2019-02-04 16:42 Thierry Reding
  2019-02-04 16:42 ` [PATCH v2 2/2] r8169: Avoid pointer aliasing Thierry Reding
  2019-02-04 19:30 ` [PATCH v2 1/2] r8169: Load MAC address from device tree if present Heiner Kallweit
  0 siblings, 2 replies; 18+ messages in thread
From: Thierry Reding @ 2019-02-04 16:42 UTC (permalink / raw)
  To: David S. Miller
  Cc: Heiner Kallweit, Andrew Lunn, Realtek linux nic maintainers,
	netdev, linux-kernel, devicetree

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 to 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] 18+ messages in thread
* Re: [PATCH v2 2/2] r8169: Avoid pointer aliasing
@ 2019-02-06  2:27 Paul Zimmerman
  2019-02-06  2:52 ` Joe Perches
  0 siblings, 1 reply; 18+ messages in thread
From: Paul Zimmerman @ 2019-02-06  2:27 UTC (permalink / raw)
  To: Joe Perches; +Cc: Eric Dumazet, Heiner Kallweit, David Miller, linux-kernel

On Tue, 2019-02-05, Joe Perches wrote:
> On Tue, 2019-02-05 at 12:04 -0800, Eric Dumazet wrote:
>> 
>> On 02/05/2019 10:42 AM, Joe Perches wrote:
>> > It's declared after a pointer so it is already is 2 byte aligned.
>> > 
>> > A lot of drivers wouldn't work otherwise.
>> 
>> Maybe these drivers are only used on arches where this does not matter.
>
> Possible.
>
> I had only grepped through the sources looking for
> declarations using:
>
> $ git grep -B1 '\[ETH_ALEN\];' -- '*.c' | grep -A1 '\*'
>
> It's quite a few files in net/ too btw.
> 
> I still think adding __align(<even#>) is unnecessary here unless
> it follows something like a bool or a u8.

Um, guys, this is practically C-101.

From C99, 6.7.2.1:

> 13/ Within a structure object, the non-bit-field members and the units in
> which bit-fields reside have addresses that increase in the order in which
> they are declared. A pointer to a structure object, suitably converted,
> points to its initial member (or if that member is a bit-field, then to the
> unit in which it resides), and vice versa. There may be unnamed padding
> within a structure object, but not at its beginning.

AFAIK there is no such language in the spec regarding variable layout on
the stack. So Joe, you are totally off-base here.

-- Paul

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

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

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-04 16:42 [PATCH v2 1/2] r8169: Load MAC address from device tree if present Thierry Reding
2019-02-04 16:42 ` [PATCH v2 2/2] r8169: Avoid pointer aliasing Thierry Reding
2019-02-04 16:59   ` Andrew Lunn
2019-02-04 18:44   ` Heiner Kallweit
2019-02-05  3:20   ` David Miller
2019-02-05 18:42     ` Joe Perches
2019-02-05 19:14       ` David Miller
2019-02-05 19:19         ` Joe Perches
2019-02-06  7:25           ` Michal Kubecek
2019-02-05 20:04       ` Eric Dumazet
2019-02-05 20:18         ` Joe Perches
2019-02-05 20:23           ` Eric Dumazet
2019-02-05 20:23           ` Heiner Kallweit
2019-02-04 19:30 ` [PATCH v2 1/2] r8169: Load MAC address from device tree if present Heiner Kallweit
2019-02-06  2:27 [PATCH v2 2/2] r8169: Avoid pointer aliasing Paul Zimmerman
2019-02-06  2:52 ` Joe Perches
2019-02-06  3:25   ` Paul Zimmerman
2019-02-06  3:49     ` Joe Perches

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).