xref: /linux-6.15/include/linux/linkmode.h (revision 7e1d512d)
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