1 | #ifndef __LINKMODE_H |
2 | #define __LINKMODE_H |
3 | |
4 | #include <linux/bitmap.h> |
5 | #include <linux/ethtool.h> |
6 | #include <uapi/linux/ethtool.h> |
7 | |
8 | static inline void linkmode_zero(unsigned long *dst) |
9 | { |
10 | bitmap_zero(dst, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
11 | } |
12 | |
13 | static inline void linkmode_copy(unsigned long *dst, const unsigned long *src) |
14 | { |
15 | bitmap_copy(dst, src, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
16 | } |
17 | |
18 | static inline void linkmode_and(unsigned long *dst, const unsigned long *a, |
19 | const unsigned long *b) |
20 | { |
21 | bitmap_and(dst, src1: a, src2: b, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
22 | } |
23 | |
24 | static inline void linkmode_or(unsigned long *dst, const unsigned long *a, |
25 | const unsigned long *b) |
26 | { |
27 | bitmap_or(dst, src1: a, src2: b, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
28 | } |
29 | |
30 | static inline bool linkmode_empty(const unsigned long *src) |
31 | { |
32 | return bitmap_empty(src, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
33 | } |
34 | |
35 | static inline int linkmode_andnot(unsigned long *dst, const unsigned long *src1, |
36 | const unsigned long *src2) |
37 | { |
38 | return bitmap_andnot(dst, src1, src2, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
39 | } |
40 | |
41 | static inline void linkmode_set_bit(int nr, volatile unsigned long *addr) |
42 | { |
43 | __set_bit(nr, addr); |
44 | } |
45 | |
46 | static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr) |
47 | { |
48 | __clear_bit(nr, addr); |
49 | } |
50 | |
51 | static inline void linkmode_mod_bit(int nr, volatile unsigned long *addr, |
52 | int set) |
53 | { |
54 | if (set) |
55 | linkmode_set_bit(nr, addr); |
56 | else |
57 | linkmode_clear_bit(nr, addr); |
58 | } |
59 | |
60 | static inline int linkmode_test_bit(int nr, const volatile unsigned long *addr) |
61 | { |
62 | return test_bit(nr, addr); |
63 | } |
64 | |
65 | static inline void linkmode_set_bit_array(const int *array, int array_size, |
66 | unsigned long *addr) |
67 | { |
68 | int i; |
69 | |
70 | for (i = 0; i < array_size; i++) |
71 | linkmode_set_bit(nr: array[i], addr); |
72 | } |
73 | |
74 | static inline int linkmode_equal(const unsigned long *src1, |
75 | const unsigned long *src2) |
76 | { |
77 | return bitmap_equal(src1, src2, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
78 | } |
79 | |
80 | static inline int linkmode_intersects(const unsigned long *src1, |
81 | const unsigned long *src2) |
82 | { |
83 | return bitmap_intersects(src1, src2, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
84 | } |
85 | |
86 | static inline int linkmode_subset(const unsigned long *src1, |
87 | const unsigned long *src2) |
88 | { |
89 | return bitmap_subset(src1, src2, nbits: __ETHTOOL_LINK_MODE_MASK_NBITS); |
90 | } |
91 | |
92 | void linkmode_resolve_pause(const unsigned long *local_adv, |
93 | const unsigned long *partner_adv, |
94 | bool *tx_pause, bool *rx_pause); |
95 | |
96 | void linkmode_set_pause(unsigned long *advertisement, bool tx, bool rx); |
97 | |
98 | #endif /* __LINKMODE_H */ |
99 | |