/* Address substitution (IEC62439-3 pp 26, 50): replace mac
         * address of outgoing frame with that of the outgoing slave's.
         */
-       memcpy(hsr_ethhdr->ethhdr.h_source, skb->dev->dev_addr, ETH_ALEN);
+       ether_addr_copy(hsr_ethhdr->ethhdr.h_source, skb->dev->dev_addr);
 
        return dev_queue_xmit(skb);
 }
 
        /* Payload: MacAddressA */
        hsr_sp = (typeof(hsr_sp)) skb_put(skb, sizeof(*hsr_sp));
-       memcpy(hsr_sp->MacAddressA, hsr_dev->dev_addr, ETH_ALEN);
+       ether_addr_copy(hsr_sp->MacAddressA, hsr_dev->dev_addr);
 
        dev_queue_xmit(skb);
        return;
 
 
 /* Default multicast address for HSR Supervision frames */
-static const unsigned char def_multicast_addr[ETH_ALEN] = {
+static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
        0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
 };
 
        hsr_priv->announce_timer.function = hsr_announce;
        hsr_priv->announce_timer.data = (unsigned long) hsr_priv;
 
-       memcpy(hsr_priv->sup_multicast_addr, def_multicast_addr, ETH_ALEN);
+       ether_addr_copy(hsr_priv->sup_multicast_addr, def_multicast_addr);
        hsr_priv->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
 
 /* FIXME: should I modify the value of these?
        hsr_dev->features |= NETIF_F_VLAN_CHALLENGED;
 
        /* Set hsr_dev's MAC address to that of mac_slave1 */
-       memcpy(hsr_dev->dev_addr, hsr_priv->slave[0]->dev_addr, ETH_ALEN);
+       ether_addr_copy(hsr_dev->dev_addr, hsr_priv->slave[0]->dev_addr);
 
        /* Set required header length */
        for (i = 0; i < HSR_MAX_SLAVE; i++) {
 
        if (!node)
                return -ENOMEM;
 
-       memcpy(node->MacAddressA, addr_a, ETH_ALEN);
-       memcpy(node->MacAddressB, addr_b, ETH_ALEN);
+       ether_addr_copy(node->MacAddressA, addr_a);
+       ether_addr_copy(node->MacAddressB, addr_b);
 
        rcu_read_lock();
        oldnode = list_first_or_null_rcu(self_node_db,
                /* Node is known, but frame was received from an unknown
                 * address. Node is PICS_SUBS capable; merge its AddrB.
                 */
-               memcpy(node->MacAddressB, hsr_ethsup->ethhdr.h_source, ETH_ALEN);
+               ether_addr_copy(node->MacAddressB, hsr_ethsup->ethhdr.h_source);
                node->AddrB_if = dev_idx;
                return node;
        }
        if (!node)
                return NULL;
 
-       memcpy(node->MacAddressA, hsr_sp->MacAddressA, ETH_ALEN);
-       memcpy(node->MacAddressB, hsr_ethsup->ethhdr.h_source, ETH_ALEN);
+       ether_addr_copy(node->MacAddressA, hsr_sp->MacAddressA);
+       ether_addr_copy(node->MacAddressB, hsr_ethsup->ethhdr.h_source);
        if (!ether_addr_equal(hsr_sp->MacAddressA, hsr_ethsup->ethhdr.h_source))
                node->AddrB_if = dev_idx;
        else
        rcu_read_lock();
        node = find_node_by_AddrB(&hsr_priv->node_db, ethhdr->h_source);
        if (node)
-               memcpy(ethhdr->h_source, node->MacAddressA, ETH_ALEN);
+               ether_addr_copy(ethhdr->h_source, node->MacAddressA);
        rcu_read_unlock();
 }
 
        rcu_read_lock();
        node = find_node_by_AddrA(&hsr_priv->node_db, ethhdr->h_dest);
        if (node && (node->AddrB_if == dev_idx))
-               memcpy(ethhdr->h_dest, node->MacAddressB, ETH_ALEN);
+               ether_addr_copy(ethhdr->h_dest, node->MacAddressB);
        rcu_read_unlock();
 }
 
                node = list_first_or_null_rcu(&hsr_priv->node_db,
                                                struct node_entry, mac_list);
                if (node)
-                       memcpy(addr, node->MacAddressA, ETH_ALEN);
+                       ether_addr_copy(addr, node->MacAddressA);
                return node;
        }
 
        node = _pos;
        list_for_each_entry_continue_rcu(node, &hsr_priv->node_db, mac_list) {
-               memcpy(addr, node->MacAddressA, ETH_ALEN);
+               ether_addr_copy(addr, node->MacAddressA);
                return node;
        }
 
                return -ENOENT; /* No such entry */
        }
 
-       memcpy(addr_b, node->MacAddressB, ETH_ALEN);
+       ether_addr_copy(addr_b, node->MacAddressB);
 
        tdiff = jiffies - node->time_in[HSR_DEV_SLAVE_A];
        if (node->time_in_stale[HSR_DEV_SLAVE_A])