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)80*e812916dSAlexander Lobakin static inline int linkmode_intersects(const unsigned long *src1,
81*e812916dSAlexander Lobakin const unsigned long *src2)
82*e812916dSAlexander Lobakin {
83*e812916dSAlexander Lobakin return bitmap_intersects(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
84*e812916dSAlexander Lobakin }
85*e812916dSAlexander 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