etherdevice: Use ether_addr_copy to copy an Ethernet address
Some systems can use the normally known u16 alignment of Ethernet addresses to save some code/text bytes and cycles. This does not change currently emitted code on x86 by gcc 4.8. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
a53d34c346
Коммит
286ab723d4
|
@ -217,6 +217,28 @@ static inline void eth_hw_addr_random(struct net_device *dev)
|
|||
eth_random_addr(dev->dev_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ether_addr_copy - Copy an Ethernet address
|
||||
* @dst: Pointer to a six-byte array Ethernet address destination
|
||||
* @src: Pointer to a six-byte array Ethernet address source
|
||||
*
|
||||
* Please note: dst & src must both be aligned to u16.
|
||||
*/
|
||||
static inline void ether_addr_copy(u8 *dst, const u8 *src)
|
||||
{
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
*(u32 *)dst = *(const u32 *)src;
|
||||
*(u16 *)(dst + 4) = *(const u16 *)(src + 4);
|
||||
#else
|
||||
u16 *a = (u16 *)dst;
|
||||
const u16 *b = (const u16 *)src;
|
||||
|
||||
a[0] = b[0];
|
||||
a[1] = b[1];
|
||||
a[2] = b[2];
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* eth_hw_addr_inherit - Copy dev_addr from another net_device
|
||||
* @dst: pointer to net_device to copy dev_addr to
|
||||
|
@ -229,7 +251,7 @@ static inline void eth_hw_addr_inherit(struct net_device *dst,
|
|||
struct net_device *src)
|
||||
{
|
||||
dst->addr_assign_type = src->addr_assign_type;
|
||||
memcpy(dst->dev_addr, src->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(dst->dev_addr, src->dev_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Загрузка…
Ссылка в новой задаче