diff options
author | Thierry Reding <treding@nvidia.com> | 2019-02-06 07:30:18 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-06 16:40:08 -0500 |
commit | deedf1feb255c7a390309f615e50de37cb82fb61 (patch) | |
tree | 6bd19596f8d8862ae28b99259db0c62ae7f24ab2 | |
parent | 04c7788c2bb3542e5c8c9d7175193e4d925edf20 (diff) |
r8169: Avoid pointer aliasing
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>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 16 |
1 files 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) | |||
7113 | static void rtl_read_mac_address(struct rtl8169_private *tp, | 7113 | static void rtl_read_mac_address(struct rtl8169_private *tp, |
7114 | u8 mac_addr[ETH_ALEN]) | 7114 | u8 mac_addr[ETH_ALEN]) |
7115 | { | 7115 | { |
7116 | u32 value; | ||
7117 | |||
7116 | /* Get MAC address */ | 7118 | /* Get MAC address */ |
7117 | switch (tp->mac_version) { | 7119 | switch (tp->mac_version) { |
7118 | case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: | 7120 | case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: |
7119 | case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: | 7121 | case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: |
7120 | *(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); | 7122 | value = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); |
7121 | *(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); | 7123 | mac_addr[0] = (value >> 0) & 0xff; |
7124 | mac_addr[1] = (value >> 8) & 0xff; | ||
7125 | mac_addr[2] = (value >> 16) & 0xff; | ||
7126 | mac_addr[3] = (value >> 24) & 0xff; | ||
7127 | |||
7128 | value = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); | ||
7129 | mac_addr[4] = (value >> 0) & 0xff; | ||
7130 | mac_addr[5] = (value >> 8) & 0xff; | ||
7122 | break; | 7131 | break; |
7123 | default: | 7132 | default: |
7124 | break; | 7133 | break; |
@@ -7316,7 +7325,8 @@ static int rtl_get_ether_clk(struct rtl8169_private *tp) | |||
7316 | static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 7325 | static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
7317 | { | 7326 | { |
7318 | const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; | 7327 | const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; |
7319 | u8 mac_addr[ETH_ALEN] __aligned(4) = {}; | 7328 | /* align to u16 for is_valid_ether_addr() */ |
7329 | u8 mac_addr[ETH_ALEN] __aligned(2) = {}; | ||
7320 | struct rtl8169_private *tp; | 7330 | struct rtl8169_private *tp; |
7321 | struct net_device *dev; | 7331 | struct net_device *dev; |
7322 | int chipset, region, i; | 7332 | int chipset, region, i; |