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_fill(unsigned long * dst)1396fa96e1SRussell King (Oracle) static inline void linkmode_fill(unsigned long *dst)
1496fa96e1SRussell King (Oracle) {
1596fa96e1SRussell King (Oracle) bitmap_fill(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
1696fa96e1SRussell King (Oracle) }
1796fa96e1SRussell King (Oracle)
linkmode_copy(unsigned long * dst,const unsigned long * src)18b31cdffaSAndrew Lunn static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
19b31cdffaSAndrew Lunn {
20b31cdffaSAndrew Lunn bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
21b31cdffaSAndrew Lunn }
22b31cdffaSAndrew Lunn
linkmode_and(unsigned long * dst,const unsigned long * a,const unsigned long * b)23b31cdffaSAndrew Lunn static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
24b31cdffaSAndrew Lunn const unsigned long *b)
25b31cdffaSAndrew Lunn {
26b31cdffaSAndrew Lunn bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
27b31cdffaSAndrew Lunn }
28b31cdffaSAndrew Lunn
linkmode_or(unsigned long * dst,const unsigned long * a,const unsigned long * b)29b31cdffaSAndrew Lunn static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
30b31cdffaSAndrew Lunn const unsigned long *b)
31b31cdffaSAndrew Lunn {
32b31cdffaSAndrew Lunn bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
33b31cdffaSAndrew Lunn }
34b31cdffaSAndrew Lunn
linkmode_empty(const unsigned long * src)35b31cdffaSAndrew Lunn static inline bool linkmode_empty(const unsigned long *src)
36b31cdffaSAndrew Lunn {
37b31cdffaSAndrew Lunn return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
38b31cdffaSAndrew Lunn }
39b31cdffaSAndrew Lunn
linkmode_andnot(unsigned long * dst,const unsigned long * src1,const unsigned long * src2)40*7e1d512dSSimon Horman static inline bool linkmode_andnot(unsigned long *dst,
41*7e1d512dSSimon Horman const unsigned long *src1,
42b31cdffaSAndrew Lunn const unsigned long *src2)
43b31cdffaSAndrew Lunn {
44b31cdffaSAndrew Lunn return bitmap_andnot(dst, src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
45b31cdffaSAndrew Lunn }
46b31cdffaSAndrew Lunn
478fab6a9dSAlexander Lobakin #define linkmode_test_bit test_bit
488fab6a9dSAlexander Lobakin #define linkmode_set_bit __set_bit
498fab6a9dSAlexander Lobakin #define linkmode_clear_bit __clear_bit
508fab6a9dSAlexander Lobakin #define linkmode_mod_bit __assign_bit
51b31cdffaSAndrew Lunn
linkmode_set_bit_array(const int * array,int array_size,unsigned long * addr)5220c6e05bSJakub Kicinski static inline void linkmode_set_bit_array(const int *array, int array_size,
5320c6e05bSJakub Kicinski unsigned long *addr)
5420c6e05bSJakub Kicinski {
5520c6e05bSJakub Kicinski int i;
5620c6e05bSJakub Kicinski
5720c6e05bSJakub Kicinski for (i = 0; i < array_size; i++)
5820c6e05bSJakub Kicinski linkmode_set_bit(array[i], addr);
5920c6e05bSJakub Kicinski }
6020c6e05bSJakub Kicinski
linkmode_equal(const unsigned long * src1,const unsigned long * src2)61b31cdffaSAndrew Lunn static inline int linkmode_equal(const unsigned long *src1,
62b31cdffaSAndrew Lunn const unsigned long *src2)
63b31cdffaSAndrew Lunn {
64b31cdffaSAndrew Lunn return bitmap_equal(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
65b31cdffaSAndrew Lunn }
66b31cdffaSAndrew Lunn
linkmode_intersects(const unsigned long * src1,const unsigned long * src2)67e812916dSAlexander Lobakin static inline int linkmode_intersects(const unsigned long *src1,
68e812916dSAlexander Lobakin const unsigned long *src2)
69e812916dSAlexander Lobakin {
70e812916dSAlexander Lobakin return bitmap_intersects(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
71e812916dSAlexander Lobakin }
72e812916dSAlexander Lobakin
linkmode_subset(const unsigned long * src1,const unsigned long * src2)73554032cdSRussell King static inline int linkmode_subset(const unsigned long *src1,
74554032cdSRussell King const unsigned long *src2)
75554032cdSRussell King {
76554032cdSRussell King return bitmap_subset(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
77554032cdSRussell King }
78554032cdSRussell King
79a87ae8a9SRussell King void linkmode_resolve_pause(const unsigned long *local_adv,
80a87ae8a9SRussell King const unsigned long *partner_adv,
81a87ae8a9SRussell King bool *tx_pause, bool *rx_pause);
82a87ae8a9SRussell King
8345c767faSRussell King void linkmode_set_pause(unsigned long *advertisement, bool tx, bool rx);
8445c767faSRussell King
85b31cdffaSAndrew Lunn #endif /* __LINKMODE_H */
86