12c6eb461SHans Petter Selasky /*-
2d8571d3eSHans Petter Selasky * Copyright (c) 2015-2016 Mellanox Technologies, Ltd. All rights reserved.
3c7818b48SHans Petter Selasky *
429a2e474SHans Petter Selasky * Redistribution and use in source and binary forms, with or without
529a2e474SHans Petter Selasky * modification, are permitted provided that the following conditions
629a2e474SHans Petter Selasky * are met:
729a2e474SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright
829a2e474SHans Petter Selasky * notice unmodified, this list of conditions, and the following
9c7818b48SHans Petter Selasky * disclaimer.
1029a2e474SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright
1129a2e474SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the
1229a2e474SHans Petter Selasky * documentation and/or other materials provided with the distribution.
13c7818b48SHans Petter Selasky *
1429a2e474SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1529a2e474SHans Petter Selasky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1629a2e474SHans Petter Selasky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1729a2e474SHans Petter Selasky * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1829a2e474SHans Petter Selasky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1929a2e474SHans Petter Selasky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2029a2e474SHans Petter Selasky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2129a2e474SHans Petter Selasky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2229a2e474SHans Petter Selasky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2329a2e474SHans Petter Selasky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24c7818b48SHans Petter Selasky */
25307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_ETHERDEVICE_H_
26307f78f3SVladimir Kondratyev #define _LINUXKPI_LINUX_ETHERDEVICE_H_
27c7818b48SHans Petter Selasky
28c7818b48SHans Petter Selasky #include <linux/types.h>
293cd6d6ffSBjoern A. Zeeb #include <linux/device.h>
30cc792250SBjoern A. Zeeb #include <linux/skbuff.h>
31cc792250SBjoern A. Zeeb #include <linux/netdevice.h>
32c7818b48SHans Petter Selasky
33e6ef991eSHans Petter Selasky #include <sys/random.h>
34e6ef991eSHans Petter Selasky #include <sys/libkern.h>
35e6ef991eSHans Petter Selasky
36f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8079 1
37f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8079_LEN 256
38f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8472 2
39f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8472_LEN 512
40f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8636 3
41f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8636_LEN 256
42f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8436 4
43f837e46dSHans Petter Selasky #define ETH_MODULE_SFF_8436_LEN 256
44f837e46dSHans Petter Selasky
45f837e46dSHans Petter Selasky struct ethtool_eeprom {
46f837e46dSHans Petter Selasky u32 offset;
47f837e46dSHans Petter Selasky u32 len;
48f837e46dSHans Petter Selasky };
49f837e46dSHans Petter Selasky
50f837e46dSHans Petter Selasky struct ethtool_modinfo {
51f837e46dSHans Petter Selasky u32 type;
52f837e46dSHans Petter Selasky u32 eeprom_len;
53f837e46dSHans Petter Selasky };
54f837e46dSHans Petter Selasky
5529a2e474SHans Petter Selasky static inline bool
is_zero_ether_addr(const u8 * addr)5629a2e474SHans Petter Selasky is_zero_ether_addr(const u8 * addr)
57c7818b48SHans Petter Selasky {
58a1295b24SEd Maste return ((addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]) ==
59a1295b24SEd Maste 0x00);
60c7818b48SHans Petter Selasky }
61c7818b48SHans Petter Selasky
6229a2e474SHans Petter Selasky static inline bool
is_unicast_ether_addr(const u8 * addr)63a4618caaSBjoern A. Zeeb is_unicast_ether_addr(const u8 * addr)
64a4618caaSBjoern A. Zeeb {
65a4618caaSBjoern A. Zeeb return ((addr[0] & 0x01) == 0x00);
66a4618caaSBjoern A. Zeeb }
67a4618caaSBjoern A. Zeeb
68a4618caaSBjoern A. Zeeb static inline bool
is_multicast_ether_addr(const u8 * addr)6929a2e474SHans Petter Selasky is_multicast_ether_addr(const u8 * addr)
70c7818b48SHans Petter Selasky {
71a4618caaSBjoern A. Zeeb return ((addr[0] & 0x01) == 0x01);
72c7818b48SHans Petter Selasky }
73c7818b48SHans Petter Selasky
7429a2e474SHans Petter Selasky static inline bool
is_broadcast_ether_addr(const u8 * addr)7529a2e474SHans Petter Selasky is_broadcast_ether_addr(const u8 * addr)
76c7818b48SHans Petter Selasky {
77a1295b24SEd Maste return ((addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
78a1295b24SEd Maste 0xff);
79c7818b48SHans Petter Selasky }
80c7818b48SHans Petter Selasky
8129a2e474SHans Petter Selasky static inline bool
is_valid_ether_addr(const u8 * addr)8229a2e474SHans Petter Selasky is_valid_ether_addr(const u8 * addr)
83c7818b48SHans Petter Selasky {
84c7818b48SHans Petter Selasky return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
85c7818b48SHans Petter Selasky }
86c7818b48SHans Petter Selasky
8729a2e474SHans Petter Selasky static inline void
ether_addr_copy(u8 * dst,const u8 * src)8829a2e474SHans Petter Selasky ether_addr_copy(u8 * dst, const u8 * src)
897c3892fcSHans Petter Selasky {
907c3892fcSHans Petter Selasky memcpy(dst, src, 6);
917c3892fcSHans Petter Selasky }
92c7818b48SHans Petter Selasky
93e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_unaligned(const u8 * pa,const u8 * pb)94834227baSBjoern A. Zeeb ether_addr_equal_unaligned(const u8 *pa, const u8 *pb)
95e6ef991eSHans Petter Selasky {
96e6ef991eSHans Petter Selasky return (memcmp(pa, pb, 6) == 0);
97e6ef991eSHans Petter Selasky }
98834227baSBjoern A. Zeeb #define ether_addr_equal(_pa, _pb) ether_addr_equal_unaligned(_pa, _pb)
99e6ef991eSHans Petter Selasky
100e6ef991eSHans Petter Selasky static inline bool
ether_addr_equal_64bits(const u8 * pa,const u8 * pb)101e6ef991eSHans Petter Selasky ether_addr_equal_64bits(const u8 *pa, const u8 *pb)
102e6ef991eSHans Petter Selasky {
103e6ef991eSHans Petter Selasky return (memcmp(pa, pb, 6) == 0);
104e6ef991eSHans Petter Selasky }
105e6ef991eSHans Petter Selasky
106e6ef991eSHans Petter Selasky static inline void
eth_broadcast_addr(u8 * pa)107510ebed7SHans Petter Selasky eth_broadcast_addr(u8 *pa)
108510ebed7SHans Petter Selasky {
109510ebed7SHans Petter Selasky memset(pa, 0xff, 6);
110510ebed7SHans Petter Selasky }
111510ebed7SHans Petter Selasky
112510ebed7SHans Petter Selasky static inline void
eth_zero_addr(u8 * pa)1130e3bbe91SHans Petter Selasky eth_zero_addr(u8 *pa)
1140e3bbe91SHans Petter Selasky {
1150e3bbe91SHans Petter Selasky memset(pa, 0, 6);
1160e3bbe91SHans Petter Selasky }
1170e3bbe91SHans Petter Selasky
1180e3bbe91SHans Petter Selasky static inline void
random_ether_addr(u8 * dst)119e6ef991eSHans Petter Selasky random_ether_addr(u8 *dst)
120e6ef991eSHans Petter Selasky {
121a8a16c71SConrad Meyer arc4random_buf(dst, 6);
122e6ef991eSHans Petter Selasky
123e6ef991eSHans Petter Selasky dst[0] &= 0xfe;
124e6ef991eSHans Petter Selasky dst[0] |= 0x02;
125e6ef991eSHans Petter Selasky }
126e6ef991eSHans Petter Selasky
1273cd6d6ffSBjoern A. Zeeb static inline void
eth_random_addr(u8 * dst)1283cd6d6ffSBjoern A. Zeeb eth_random_addr(u8 *dst)
1293cd6d6ffSBjoern A. Zeeb {
1303cd6d6ffSBjoern A. Zeeb
1313cd6d6ffSBjoern A. Zeeb random_ether_addr(dst);
1323cd6d6ffSBjoern A. Zeeb }
1333cd6d6ffSBjoern A. Zeeb
1343cd6d6ffSBjoern A. Zeeb static inline int
device_get_mac_address(struct device * dev,char * dst)1353cd6d6ffSBjoern A. Zeeb device_get_mac_address(struct device *dev, char *dst)
1363cd6d6ffSBjoern A. Zeeb {
1373cd6d6ffSBjoern A. Zeeb
1383cd6d6ffSBjoern A. Zeeb /* XXX get mac address from FDT? */
1393cd6d6ffSBjoern A. Zeeb return (-ENOENT);
1403cd6d6ffSBjoern A. Zeeb }
1413cd6d6ffSBjoern A. Zeeb
142cc792250SBjoern A. Zeeb /* Returns network byte order. */
143cc792250SBjoern A. Zeeb static inline uint16_t
eth_type_trans(struct sk_buff * skb,struct net_device * dev)144cc792250SBjoern A. Zeeb eth_type_trans(struct sk_buff *skb, struct net_device *dev)
145cc792250SBjoern A. Zeeb {
146cc792250SBjoern A. Zeeb pr_debug("%s: TODO\n", __func__);
147cc792250SBjoern A. Zeeb return (htons(ETHERTYPE_8023));
148cc792250SBjoern A. Zeeb }
149cc792250SBjoern A. Zeeb
150cc792250SBjoern A. Zeeb static inline void
eth_hw_addr_set(struct net_device * dev,const u8 * addr)151cc792250SBjoern A. Zeeb eth_hw_addr_set(struct net_device *dev, const u8 *addr)
152cc792250SBjoern A. Zeeb {
153cc792250SBjoern A. Zeeb pr_debug("%s: TODO (if we want to)\n", __func__);
154cc792250SBjoern A. Zeeb }
155cc792250SBjoern A. Zeeb
156cc792250SBjoern A. Zeeb static inline int
eth_platform_get_mac_address(struct device * dev __unused,u8 * addr __unused)157cc792250SBjoern A. Zeeb eth_platform_get_mac_address(struct device *dev __unused, u8 *addr __unused)
158cc792250SBjoern A. Zeeb {
159cc792250SBjoern A. Zeeb pr_debug("%s: TODO\n", __func__);
160cc792250SBjoern A. Zeeb return (-ENODEV);
161cc792250SBjoern A. Zeeb }
162cc792250SBjoern A. Zeeb
163307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_ETHERDEVICE_H_ */
164