xref: /openbmc/linux/include/linux/linkmode.h (revision 08dfa5a1)
1b31cdffaSAndrew Lunn #ifndef __LINKMODE_H
2b31cdffaSAndrew Lunn #define __LINKMODE_H
3b31cdffaSAndrew Lunn 
4b31cdffaSAndrew Lunn #include <linux/bitmap.h>
5b31cdffaSAndrew Lunn #include <linux/ethtool.h>
6b31cdffaSAndrew Lunn #include <uapi/linux/ethtool.h>
7b31cdffaSAndrew Lunn 
linkmode_zero(unsigned long * dst)8b31cdffaSAndrew Lunn static inline void linkmode_zero(unsigned long *dst)
9b31cdffaSAndrew Lunn {
10b31cdffaSAndrew Lunn 	bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
11b31cdffaSAndrew Lunn }
12b31cdffaSAndrew Lunn 
linkmode_copy(unsigned long * dst,const unsigned long * src)13b31cdffaSAndrew Lunn static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
14b31cdffaSAndrew Lunn {
15b31cdffaSAndrew Lunn 	bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
16b31cdffaSAndrew Lunn }
17b31cdffaSAndrew Lunn 
linkmode_and(unsigned long * dst,const unsigned long * a,const unsigned long * b)18b31cdffaSAndrew Lunn static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
19b31cdffaSAndrew Lunn 				const unsigned long *b)
20b31cdffaSAndrew Lunn {
21b31cdffaSAndrew Lunn 	bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
22b31cdffaSAndrew Lunn }
23b31cdffaSAndrew Lunn 
linkmode_or(unsigned long * dst,const unsigned long * a,const unsigned long * b)24b31cdffaSAndrew Lunn static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
25b31cdffaSAndrew Lunn 				const unsigned long *b)
26b31cdffaSAndrew Lunn {
27b31cdffaSAndrew Lunn 	bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
28b31cdffaSAndrew Lunn }
29b31cdffaSAndrew Lunn 
linkmode_empty(const unsigned long * src)30b31cdffaSAndrew Lunn static inline bool linkmode_empty(const unsigned long *src)
31b31cdffaSAndrew Lunn {
32b31cdffaSAndrew Lunn 	return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
33b31cdffaSAndrew Lunn }
34b31cdffaSAndrew Lunn 
linkmode_andnot(unsigned long * dst,const unsigned long * src1,const unsigned long * src2)35b31cdffaSAndrew Lunn static inline int linkmode_andnot(unsigned long *dst, const unsigned long *src1,
36b31cdffaSAndrew Lunn 				  const unsigned long *src2)
37b31cdffaSAndrew Lunn {
38b31cdffaSAndrew Lunn 	return bitmap_andnot(dst, src1, src2,  __ETHTOOL_LINK_MODE_MASK_NBITS);
39b31cdffaSAndrew Lunn }
40b31cdffaSAndrew Lunn 
linkmode_set_bit(int nr,volatile unsigned long * addr)41b31cdffaSAndrew Lunn static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
42b31cdffaSAndrew Lunn {
43b31cdffaSAndrew Lunn 	__set_bit(nr, addr);
44b31cdffaSAndrew Lunn }
45b31cdffaSAndrew Lunn 
linkmode_set_bit_array(const int * array,int array_size,unsigned long * addr)46719655a1SAndrew Lunn static inline void linkmode_set_bit_array(const int *array, int array_size,
47719655a1SAndrew Lunn 					  unsigned long *addr)
48719655a1SAndrew Lunn {
49719655a1SAndrew Lunn 	int i;
50719655a1SAndrew Lunn 
51719655a1SAndrew Lunn 	for (i = 0; i < array_size; i++)
52719655a1SAndrew Lunn 		linkmode_set_bit(array[i], addr);
53719655a1SAndrew Lunn }
54719655a1SAndrew Lunn 
linkmode_clear_bit(int nr,volatile unsigned long * addr)55b31cdffaSAndrew Lunn static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
56b31cdffaSAndrew Lunn {
57b31cdffaSAndrew Lunn 	__clear_bit(nr, addr);
58b31cdffaSAndrew Lunn }
59b31cdffaSAndrew Lunn 
linkmode_mod_bit(int nr,volatile unsigned long * addr,int set)6078a24df3SAndrew Lunn static inline void linkmode_mod_bit(int nr, volatile unsigned long *addr,
6178a24df3SAndrew Lunn 				    int set)
6278a24df3SAndrew Lunn {
6378a24df3SAndrew Lunn 	if (set)
6478a24df3SAndrew Lunn 		linkmode_set_bit(nr, addr);
6578a24df3SAndrew Lunn 	else
6678a24df3SAndrew Lunn 		linkmode_clear_bit(nr, addr);
6778a24df3SAndrew Lunn }
6878a24df3SAndrew Lunn 
linkmode_test_bit(int nr,const volatile unsigned long * addr)698062e233SRussell King static inline int linkmode_test_bit(int nr, const volatile unsigned long *addr)
70b31cdffaSAndrew Lunn {
71b31cdffaSAndrew Lunn 	return test_bit(nr, addr);
72b31cdffaSAndrew Lunn }
73b31cdffaSAndrew Lunn 
linkmode_equal(const unsigned long * src1,const unsigned long * src2)74b31cdffaSAndrew Lunn static inline int linkmode_equal(const unsigned long *src1,
75b31cdffaSAndrew Lunn 				 const unsigned long *src2)
76b31cdffaSAndrew Lunn {
77b31cdffaSAndrew Lunn 	return bitmap_equal(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
78b31cdffaSAndrew Lunn }
79b31cdffaSAndrew Lunn 
linkmode_intersects(const unsigned long * src1,const unsigned long * src2)80e812916dSAlexander Lobakin static inline int linkmode_intersects(const unsigned long *src1,
81e812916dSAlexander Lobakin 				      const unsigned long *src2)
82e812916dSAlexander Lobakin {
83e812916dSAlexander Lobakin 	return bitmap_intersects(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
84e812916dSAlexander Lobakin }
85e812916dSAlexander Lobakin 
linkmode_subset(const unsigned long * src1,const unsigned long * src2)86554032cdSRussell King static inline int linkmode_subset(const unsigned long *src1,
87554032cdSRussell King 				  const unsigned long *src2)
88554032cdSRussell King {
89554032cdSRussell King 	return bitmap_subset(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
90554032cdSRussell King }
91554032cdSRussell King 
92a87ae8a9SRussell King void linkmode_resolve_pause(const unsigned long *local_adv,
93a87ae8a9SRussell King 			    const unsigned long *partner_adv,
94a87ae8a9SRussell King 			    bool *tx_pause, bool *rx_pause);
95a87ae8a9SRussell King 
9645c767faSRussell King void linkmode_set_pause(unsigned long *advertisement, bool tx, bool rx);
9745c767faSRussell King 
98b31cdffaSAndrew Lunn #endif /* __LINKMODE_H */
99