-
Notifications
You must be signed in to change notification settings - Fork 165
/
driver-arista-net-tg3-disallow-broadcom-default-mac.patch
68 lines (61 loc) · 2.16 KB
/
driver-arista-net-tg3-disallow-broadcom-default-mac.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
For Arista platforms, after calling kexec in fast-reboot, the MAC address
From: byu343 <byu@arista.com>
of management interface is reset to 00:10:18:00:00:00. This patch can recover
the MAC with the one previously saved by Arista Aboot.
---
drivers/net/ethernet/broadcom/tg3.c | 37 +++++++++++++++++------------------
1 file changed, 18 insertions(+), 19 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 72198ef56..997de31f9 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -9365,6 +9365,15 @@ static int tg3_halt(struct tg3 *tp, int kind, bool silent)
return err;
}
+static inline int is_valid_bcm_ether_addr(const u8 *addr)
+{
+ if (!is_valid_ether_addr(addr))
+ return 0;
+ /* Disallow Broadcom default MAC 00:10:18:00:00:00 to avoid conflicts */
+ return (addr[0] || addr[1] != 0x10 || addr[2] != 0x18 ||
+ addr[3] || addr[4] || addr[5]);
+}
+
static int tg3_set_mac_addr(struct net_device *dev, void *p)
{
struct tg3 *tp = netdev_priv(dev);
@@ -17040,28 +17049,18 @@ static int tg3_get_device_address(struct tg3 *tp)
addr[5] = (lo >> 0) & 0xff;
/* Some old bootcode may report a 0 MAC address in SRAM */
- addr_ok = is_valid_ether_addr(addr);
+ addr_ok = is_valid_bcm_ether_addr(addr);
}
if (!addr_ok) {
- /* Next, try NVRAM. */
- if (!tg3_flag(tp, NO_NVRAM) &&
- !tg3_nvram_read_be32(tp, mac_offset + 0, &hi) &&
- !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) {
- memcpy(&addr[0], ((char *)&hi) + 2, 2);
- memcpy(&addr[2], (char *)&lo, sizeof(lo));
- }
- /* Finally just fetch it out of the MAC control regs. */
- else {
- hi = tr32(MAC_ADDR_0_HIGH);
- lo = tr32(MAC_ADDR_0_LOW);
+ hi = tr32(MAC_ADDR_0_HIGH);
+ lo = tr32(MAC_ADDR_0_LOW);
- addr[5] = lo & 0xff;
- addr[4] = (lo >> 8) & 0xff;
- addr[3] = (lo >> 16) & 0xff;
- addr[2] = (lo >> 24) & 0xff;
- addr[1] = hi & 0xff;
- addr[0] = (hi >> 8) & 0xff;
- }
+ addr[5] = lo & 0xff;
+ addr[4] = (lo >> 8) & 0xff;
+ addr[3] = (lo >> 16) & 0xff;
+ addr[2] = (lo >> 24) & 0xff;
+ addr[1] = hi & 0xff;
+ addr[0] = (hi >> 8) & 0xff;
}
if (!is_valid_ether_addr(addr))