18d59ecb2SHans Petter Selasky /*-
2d8571d3eSHans Petter Selasky  * Copyright (c) 2015-2016 Mellanox Technologies, Ltd. All rights reserved.
38d59ecb2SHans Petter Selasky  *
48d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
58d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
68d59ecb2SHans Petter Selasky  * are met:
78d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
88d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
98d59ecb2SHans Petter Selasky  *    disclaimer.
108d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
118d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
128d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
138d59ecb2SHans Petter Selasky  *
148d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
158d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
168d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
178d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
188d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
198d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
208d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
218d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
238d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248d59ecb2SHans Petter Selasky  */
25307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_ETHERDEVICE_H_
26307f78f3SVladimir Kondratyev #define	_LINUXKPI_LINUX_ETHERDEVICE_H_
278d59ecb2SHans Petter Selasky 
288d59ecb2SHans Petter Selasky #include <linux/types.h>
293cd6d6ffSBjoern A. Zeeb #include <linux/device.h>
308d59ecb2SHans Petter Selasky 
31e6ef991eSHans Petter Selasky #include <sys/random.h>
32e6ef991eSHans Petter Selasky #include <sys/libkern.h>
33e6ef991eSHans Petter Selasky 
34f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8079		1
35f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8079_LEN		256
36f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8472		2
37f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8472_LEN		512
38f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8636		3
39f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8636_LEN		256
40f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8436		4
41f837e46dSHans Petter Selasky #define	ETH_MODULE_SFF_8436_LEN		256
42f837e46dSHans Petter Selasky 
43f837e46dSHans Petter Selasky struct ethtool_eeprom {
44f837e46dSHans Petter Selasky 	u32	offset;
45f837e46dSHans Petter Selasky 	u32	len;
46f837e46dSHans Petter Selasky };
47f837e46dSHans Petter Selasky 
48f837e46dSHans Petter Selasky struct ethtool_modinfo {
49f837e46dSHans Petter Selasky 	u32	type;
50f837e46dSHans Petter Selasky 	u32	eeprom_len;
51f837e46dSHans Petter Selasky };
52f837e46dSHans Petter Selasky 
538d59ecb2SHans Petter Selasky static inline bool
is_zero_ether_addr(const u8 * addr)548d59ecb2SHans Petter Selasky is_zero_ether_addr(const u8 * addr)
558d59ecb2SHans Petter Selasky {
568d59ecb2SHans Petter Selasky 	return ((addr[0] + addr[1] + addr[2] + addr[3] + addr[4] + addr[5]) == 0x00);
578d59ecb2SHans Petter Selasky }
588d59ecb2SHans Petter Selasky 
598d59ecb2SHans Petter Selasky static inline bool
is_multicast_ether_addr(const u8 * addr)608d59ecb2SHans Petter Selasky is_multicast_ether_addr(const u8 * addr)
618d59ecb2SHans Petter Selasky {
628d59ecb2SHans Petter Selasky 	return (0x01 & addr[0]);
638d59ecb2SHans Petter Selasky }
648d59ecb2SHans Petter Selasky 
658d59ecb2SHans Petter Selasky static inline bool
is_broadcast_ether_addr(const u8 * addr)668d59ecb2SHans Petter Selasky is_broadcast_ether_addr(const u8 * addr)
678d59ecb2SHans Petter Selasky {
688d59ecb2SHans Petter Selasky 	return ((addr[0] + addr[1] + addr[2] + addr[3] + addr[4] + addr[5]) == (6 * 0xff));
698d59ecb2SHans Petter Selasky }
708d59ecb2SHans Petter Selasky 
718d59ecb2SHans Petter Selasky static inline bool
is_valid_ether_addr(const u8 * addr)728d59ecb2SHans Petter Selasky is_valid_ether_addr(const u8 * addr)
738d59ecb2SHans Petter Selasky {
748d59ecb2SHans Petter Selasky 	return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
758d59ecb2SHans Petter Selasky }
768d59ecb2SHans Petter Selasky 
778d59ecb2SHans Petter Selasky static inline void
ether_addr_copy(u8 * dst,const u8 * src)788d59ecb2SHans Petter Selasky ether_addr_copy(u8 * dst, const u8 * src)
798d59ecb2SHans Petter Selasky {
808d59ecb2SHans Petter Selasky 	memcpy(dst, src, 6);
818d59ecb2SHans Petter Selasky }
828d59ecb2SHans Petter Selasky 
83e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_unaligned(const u8 * pa,const u8 * pb)84834227baSBjoern A. Zeeb ether_addr_equal_unaligned(const u8 *pa, const u8 *pb)
85e6ef991eSHans Petter Selasky {
86e6ef991eSHans Petter Selasky 	return (memcmp(pa, pb, 6) == 0);
87e6ef991eSHans Petter Selasky }
88834227baSBjoern A. Zeeb #define	ether_addr_equal(_pa, _pb)	ether_addr_equal_unaligned(_pa, _pb)
89e6ef991eSHans Petter Selasky 
90e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_64bits(const u8 * pa,const u8 * pb)91e6ef991eSHans Petter Selasky ether_addr_equal_64bits(const u8 *pa, const u8 *pb)
92e6ef991eSHans Petter Selasky {
93e6ef991eSHans Petter Selasky 	return (memcmp(pa, pb, 6) == 0);
94e6ef991eSHans Petter Selasky }
95e6ef991eSHans Petter Selasky 
96e6ef991eSHans Petter Selasky static inline void
eth_broadcast_addr(u8 * pa)97510ebed7SHans Petter Selasky eth_broadcast_addr(u8 *pa)
98510ebed7SHans Petter Selasky {
99510ebed7SHans Petter Selasky 	memset(pa, 0xff, 6);
100510ebed7SHans Petter Selasky }
101510ebed7SHans Petter Selasky 
102510ebed7SHans Petter Selasky static inline void
eth_zero_addr(u8 * pa)1030e3bbe91SHans Petter Selasky eth_zero_addr(u8 *pa)
1040e3bbe91SHans Petter Selasky {
1050e3bbe91SHans Petter Selasky 	memset(pa, 0, 6);
1060e3bbe91SHans Petter Selasky }
1070e3bbe91SHans Petter Selasky 
1080e3bbe91SHans Petter Selasky static inline void
random_ether_addr(u8 * dst)109e6ef991eSHans Petter Selasky random_ether_addr(u8 *dst)
110e6ef991eSHans Petter Selasky {
111a8a16c71SConrad Meyer 	arc4random_buf(dst, 6);
112e6ef991eSHans Petter Selasky 
113e6ef991eSHans Petter Selasky 	dst[0] &= 0xfe;
114e6ef991eSHans Petter Selasky 	dst[0] |= 0x02;
115e6ef991eSHans Petter Selasky }
116e6ef991eSHans Petter Selasky 
1173cd6d6ffSBjoern A. Zeeb static inline void
eth_random_addr(u8 * dst)1183cd6d6ffSBjoern A. Zeeb eth_random_addr(u8 *dst)
1193cd6d6ffSBjoern A. Zeeb {
1203cd6d6ffSBjoern A. Zeeb 
1213cd6d6ffSBjoern A. Zeeb 	random_ether_addr(dst);
1223cd6d6ffSBjoern A. Zeeb }
1233cd6d6ffSBjoern A. Zeeb 
1243cd6d6ffSBjoern A. Zeeb static inline int
device_get_mac_address(struct device * dev,char * dst)1253cd6d6ffSBjoern A. Zeeb device_get_mac_address(struct device *dev, char *dst)
1263cd6d6ffSBjoern A. Zeeb {
1273cd6d6ffSBjoern A. Zeeb 
1283cd6d6ffSBjoern A. Zeeb 	/* XXX get mac address from FDT? */
1293cd6d6ffSBjoern A. Zeeb 	return (-ENOENT);
1303cd6d6ffSBjoern A. Zeeb }
1313cd6d6ffSBjoern A. Zeeb 
132307f78f3SVladimir Kondratyev #endif					/* _LINUXKPI_LINUX_ETHERDEVICE_H_ */
133