0001 #ifndef __LINKMODE_H
0002 #define __LINKMODE_H
0003
0004 #include <linux/bitmap.h>
0005 #include <linux/ethtool.h>
0006 #include <uapi/linux/ethtool.h>
0007
0008 static inline void linkmode_zero(unsigned long *dst)
0009 {
0010 bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
0011 }
0012
0013 static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
0014 {
0015 bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
0016 }
0017
0018 static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
0019 const unsigned long *b)
0020 {
0021 bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
0022 }
0023
0024 static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
0025 const unsigned long *b)
0026 {
0027 bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
0028 }
0029
0030 static inline bool linkmode_empty(const unsigned long *src)
0031 {
0032 return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
0033 }
0034
0035 static inline int linkmode_andnot(unsigned long *dst, const unsigned long *src1,
0036 const unsigned long *src2)
0037 {
0038 return bitmap_andnot(dst, src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
0039 }
0040
0041 static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
0042 {
0043 __set_bit(nr, addr);
0044 }
0045
0046 static inline void linkmode_set_bit_array(const int *array, int array_size,
0047 unsigned long *addr)
0048 {
0049 int i;
0050
0051 for (i = 0; i < array_size; i++)
0052 linkmode_set_bit(array[i], addr);
0053 }
0054
0055 static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
0056 {
0057 __clear_bit(nr, addr);
0058 }
0059
0060 static inline void linkmode_mod_bit(int nr, volatile unsigned long *addr,
0061 int set)
0062 {
0063 if (set)
0064 linkmode_set_bit(nr, addr);
0065 else
0066 linkmode_clear_bit(nr, addr);
0067 }
0068
0069 static inline int linkmode_test_bit(int nr, const volatile unsigned long *addr)
0070 {
0071 return test_bit(nr, addr);
0072 }
0073
0074 static inline int linkmode_equal(const unsigned long *src1,
0075 const unsigned long *src2)
0076 {
0077 return bitmap_equal(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
0078 }
0079
0080 static inline int linkmode_intersects(const unsigned long *src1,
0081 const unsigned long *src2)
0082 {
0083 return bitmap_intersects(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
0084 }
0085
0086 static inline int linkmode_subset(const unsigned long *src1,
0087 const unsigned long *src2)
0088 {
0089 return bitmap_subset(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
0090 }
0091
0092 void linkmode_resolve_pause(const unsigned long *local_adv,
0093 const unsigned long *partner_adv,
0094 bool *tx_pause, bool *rx_pause);
0095
0096 void linkmode_set_pause(unsigned long *advertisement, bool tx, bool rx);
0097
0098 #endif