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