aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2019-02-06 07:30:18 -0500
committerDavid S. Miller <davem@davemloft.net>2019-02-06 16:40:08 -0500
commitdeedf1feb255c7a390309f615e50de37cb82fb61 (patch)
tree6bd19596f8d8862ae28b99259db0c62ae7f24ab2
parent04c7788c2bb3542e5c8c9d7175193e4d925edf20 (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.c16
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)
7113static void rtl_read_mac_address(struct rtl8169_private *tp, 7113static 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)
7316static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 7325static 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;