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