Faster than memcpy/memset on some architectures.
Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        if (outlen < MC_CMD_GET_MAC_ADDRESSES_OUT_LEN)
                return -EIO;
 
-       memcpy(mac_address,
-              MCDI_PTR(outbuf, GET_MAC_ADDRESSES_OUT_MAC_ADDR_BASE), ETH_ALEN);
+       ether_addr_copy(mac_address,
+                       MCDI_PTR(outbuf, GET_MAC_ADDRESSES_OUT_MAC_ADDR_BASE));
        return 0;
 }
 
                table->dev_uc_count = -1;
        } else {
                table->dev_uc_count = 1 + netdev_uc_count(net_dev);
-               memcpy(table->dev_uc_list[0].addr, net_dev->dev_addr,
-                      ETH_ALEN);
+               ether_addr_copy(table->dev_uc_list[0].addr, net_dev->dev_addr);
                i = 1;
                netdev_for_each_uc_addr(uc, net_dev) {
-                       memcpy(table->dev_uc_list[i].addr,
-                              uc->addr, ETH_ALEN);
+                       ether_addr_copy(table->dev_uc_list[i].addr, uc->addr);
                        i++;
                }
        }
                eth_broadcast_addr(table->dev_mc_list[0].addr);
                i = 1;
                netdev_for_each_mc_addr(mc, net_dev) {
-                       memcpy(table->dev_mc_list[i].addr,
-                              mc->addr, ETH_ALEN);
+                       ether_addr_copy(table->dev_mc_list[i].addr, mc->addr);
                        i++;
                }
        }
 
                return rc;
 
        /* Initialise MAC address to permanent address */
-       memcpy(efx->net_dev->dev_addr, efx->net_dev->perm_addr, ETH_ALEN);
+       ether_addr_copy(efx->net_dev->dev_addr, efx->net_dev->perm_addr);
 
        return 0;
 }
                return -EADDRNOTAVAIL;
        }
 
-       memcpy(net_dev->dev_addr, new_addr, net_dev->addr_len);
+       ether_addr_copy(net_dev->dev_addr, new_addr);
        efx_sriov_mac_address_changed(efx);
 
        /* Reconfigure the MAC */
 
 }
 
 /* MAC address mask including only I/G bit */
-static const u8 mac_addr_ig_mask[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
+static const u8 mac_addr_ig_mask[ETH_ALEN] __aligned(2) = {0x01, 0, 0, 0, 0, 0};
 
 #define IP4_ADDR_FULL_MASK     ((__force __be32)~0)
 #define PORT_FULL_MASK         ((__force __be16)~0)
                rule->flow_type = ETHER_FLOW;
                if (spec.match_flags &
                    (EFX_FILTER_MATCH_LOC_MAC | EFX_FILTER_MATCH_LOC_MAC_IG)) {
-                       memcpy(mac_entry->h_dest, spec.loc_mac, ETH_ALEN);
+                       ether_addr_copy(mac_entry->h_dest, spec.loc_mac);
                        if (spec.match_flags & EFX_FILTER_MATCH_LOC_MAC)
-                               memset(mac_mask->h_dest, ~0, ETH_ALEN);
+                               eth_broadcast_addr(mac_mask->h_dest);
                        else
-                               memcpy(mac_mask->h_dest, mac_addr_ig_mask,
-                                      ETH_ALEN);
+                               ether_addr_copy(mac_mask->h_dest,
+                                               mac_addr_ig_mask);
                }
                if (spec.match_flags & EFX_FILTER_MATCH_REM_MAC) {
-                       memcpy(mac_entry->h_source, spec.rem_mac, ETH_ALEN);
-                       memset(mac_mask->h_source, ~0, ETH_ALEN);
+                       ether_addr_copy(mac_entry->h_source, spec.rem_mac);
+                       eth_broadcast_addr(mac_mask->h_source);
                }
                if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) {
                        mac_entry->h_proto = spec.ether_type;
                                spec.match_flags |= EFX_FILTER_MATCH_LOC_MAC;
                        else
                                return -EINVAL;
-                       memcpy(spec.loc_mac, mac_entry->h_dest, ETH_ALEN);
+                       ether_addr_copy(spec.loc_mac, mac_entry->h_dest);
                }
                if (!is_zero_ether_addr(mac_mask->h_source)) {
                        if (!is_broadcast_ether_addr(mac_mask->h_source))
                                return -EINVAL;
                        spec.match_flags |= EFX_FILTER_MATCH_REM_MAC;
-                       memcpy(spec.rem_mac, mac_entry->h_source, ETH_ALEN);
+                       ether_addr_copy(spec.rem_mac, mac_entry->h_source);
                }
                if (mac_mask->h_proto) {
                        if (mac_mask->h_proto != ETHER_TYPE_FULL_MASK)
 
        }
 
        /* Read the MAC addresses */
-       memcpy(efx->net_dev->perm_addr, nvconfig->mac_address[0], ETH_ALEN);
+       ether_addr_copy(efx->net_dev->perm_addr, nvconfig->mac_address[0]);
 
        netif_dbg(efx, probe, efx->net_dev, "PHY is %d phy_id %d\n",
                  efx->phy_type, efx->mdio.prtad);
 
        }
        if (addr != NULL) {
                spec->match_flags |= EFX_FILTER_MATCH_LOC_MAC;
-               memcpy(spec->loc_mac, addr, ETH_ALEN);
+               ether_addr_copy(spec->loc_mac, addr);
        }
        return 0;
 }
 
        int rc;
 
        BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_IN_LEN != 0);
+       /* we need __aligned(2) for ether_addr_copy */
+       BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST & 1);
+       BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_OFST & 1);
 
        rc = efx_mcdi_rpc(efx, MC_CMD_GET_BOARD_CFG, NULL, 0,
                          outbuf, sizeof(outbuf), &outlen);
        }
 
        if (mac_address)
-               memcpy(mac_address,
-                      port_num ?
-                      MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1) :
-                      MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0),
-                      ETH_ALEN);
+               ether_addr_copy(mac_address,
+                               port_num ?
+                               MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1) :
+                               MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0));
        if (fw_subtype_list) {
                for (i = 0;
                     i < MCDI_VAR_ARRAY_LEN(outlen,
        MCDI_SET_DWORD(inbuf, WOL_FILTER_SET_IN_WOL_TYPE, type);
        MCDI_SET_DWORD(inbuf, WOL_FILTER_SET_IN_FILTER_MODE,
                       MC_CMD_FILTER_MODE_SIMPLE);
-       memcpy(MCDI_PTR(inbuf, WOL_FILTER_SET_IN_MAGIC_MAC), mac, ETH_ALEN);
+       ether_addr_copy(MCDI_PTR(inbuf, WOL_FILTER_SET_IN_MAGIC_MAC), mac);
 
        rc = efx_mcdi_rpc(efx, MC_CMD_WOL_FILTER_SET, inbuf, sizeof(inbuf),
                          outbuf, sizeof(outbuf), &outlen);
 
 
        BUILD_BUG_ON(MC_CMD_SET_MAC_OUT_LEN != 0);
 
-       memcpy(MCDI_PTR(cmdbytes, SET_MAC_IN_ADDR),
-              efx->net_dev->dev_addr, ETH_ALEN);
+       ether_addr_copy(MCDI_PTR(cmdbytes, SET_MAC_IN_ADDR),
+                       efx->net_dev->dev_addr);
 
        MCDI_SET_DWORD(cmdbytes, SET_MAC_IN_MTU,
                        EFX_MAX_FRAME_LEN(efx->net_dev->mtu));
 
 } __packed;
 
 /* Loopback test source MAC address */
-static const unsigned char payload_source[ETH_ALEN] = {
+static const u8 payload_source[ETH_ALEN] __aligned(2) = {
        0x00, 0x0f, 0x53, 0x1b, 0x1b, 0x1b,
 };
 
        struct efx_loopback_payload *payload = &state->payload;
 
        /* Initialise the layerII header */
-       memcpy(&payload->header.h_dest, net_dev->dev_addr, ETH_ALEN);
-       memcpy(&payload->header.h_source, &payload_source, ETH_ALEN);
+       ether_addr_copy((u8 *)&payload->header.h_dest, net_dev->dev_addr);
+       ether_addr_copy((u8 *)&payload->header.h_source, payload_source);
        payload->header.h_proto = htons(ETH_P_IP);
 
        /* saddr set later and used as incrementing count */
 
 
        /* Fill the remaining addresses */
        list_for_each_entry(local_addr, &efx->local_addr_list, link) {
-               memcpy(peer->mac_addr, local_addr->addr, ETH_ALEN);
+               ether_addr_copy(peer->mac_addr, local_addr->addr);
                peer->tci = 0;
                ++peer;
                ++peer_count;
                goto fail_vfs;
 
        rtnl_lock();
-       memcpy(vfdi_status->peers[0].mac_addr,
-              net_dev->dev_addr, ETH_ALEN);
+       ether_addr_copy(vfdi_status->peers[0].mac_addr, net_dev->dev_addr);
        efx->vf_init_count = efx->vf_count;
        rtnl_unlock();
 
 
        if (!efx->vf_init_count)
                return;
-       memcpy(vfdi_status->peers[0].mac_addr,
-              efx->net_dev->dev_addr, ETH_ALEN);
+       ether_addr_copy(vfdi_status->peers[0].mac_addr,
+                       efx->net_dev->dev_addr);
        queue_work(vfdi_workqueue, &efx->peer_work);
 }
 
        vf = efx->vf + vf_i;
 
        mutex_lock(&vf->status_lock);
-       memcpy(vf->addr.mac_addr, mac, ETH_ALEN);
+       ether_addr_copy(vf->addr.mac_addr, mac);
        __efx_sriov_update_vf_addr(vf);
        mutex_unlock(&vf->status_lock);
 
        vf = efx->vf + vf_i;
 
        ivi->vf = vf_i;
-       memcpy(ivi->mac, vf->addr.mac_addr, ETH_ALEN);
+       ether_addr_copy(ivi->mac, vf->addr.mac_addr);
        ivi->tx_rate = 0;
        tci = ntohs(vf->addr.tci);
        ivi->vlan = tci & VLAN_VID_MASK;