2018-09-29 21:04:09 +00:00
|
|
|
#ifndef __LINKMODE_H
|
|
|
|
#define __LINKMODE_H
|
|
|
|
|
|
|
|
#include <linux/bitmap.h>
|
|
|
|
#include <linux/ethtool.h>
|
|
|
|
#include <uapi/linux/ethtool.h>
|
|
|
|
|
|
|
|
static inline void linkmode_zero(unsigned long *dst)
|
|
|
|
{
|
|
|
|
bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2023-11-15 11:39:18 +00:00
|
|
|
static inline void linkmode_fill(unsigned long *dst)
|
|
|
|
{
|
|
|
|
bitmap_fill(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2018-09-29 21:04:09 +00:00
|
|
|
static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
|
|
|
|
{
|
|
|
|
bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
|
|
|
|
const unsigned long *b)
|
|
|
|
{
|
|
|
|
bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
|
|
|
|
const unsigned long *b)
|
|
|
|
{
|
|
|
|
bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool linkmode_empty(const unsigned long *src)
|
|
|
|
{
|
|
|
|
return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2024-08-01 20:00:03 +00:00
|
|
|
static inline bool linkmode_andnot(unsigned long *dst,
|
|
|
|
const unsigned long *src1,
|
|
|
|
const unsigned long *src2)
|
2018-09-29 21:04:09 +00:00
|
|
|
{
|
|
|
|
return bitmap_andnot(dst, src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
linkmode: convert linkmode_{test,set,clear,mod}_bit() to macros
Since commit b03fc1173c0c ("bitops: let optimize out non-atomic bitops
on compile-time constants"), the non-atomic bitops are macros which can
be expanded by the compilers into compile-time expressions, which will
result in better optimized object code. Unfortunately, turned out that
passing `volatile` to those macros discards any possibility of
optimization, as the compilers then don't even try to look whether
the passed bitmap is known at compilation time. In addition to that,
the mentioned linkmode helpers are marked with `inline`, not
`__always_inline`, meaning that it's not guaranteed some compiler won't
uninline them for no reason, which will also effectively prevent them
from being optimized (it's a well-known thing the compilers sometimes
uninline `2 + 2`).
Convert linkmode_*_bit() from inlines to macros. Their calling
convention are 1:1 with the corresponding bitops, so that it's not even
needed to enumerate and map the arguments, only the names. No changes in
vmlinux' object code (compiled by LLVM for x86_64) whatsoever, but that
doesn't necessarily means the change is meaningless.
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Yury Norov <yury.norov@gmail.com>
Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2024-03-27 15:23:44 +00:00
|
|
|
#define linkmode_test_bit test_bit
|
|
|
|
#define linkmode_set_bit __set_bit
|
|
|
|
#define linkmode_clear_bit __clear_bit
|
|
|
|
#define linkmode_mod_bit __assign_bit
|
2018-09-29 21:04:09 +00:00
|
|
|
|
2023-10-19 15:28:15 +00:00
|
|
|
static inline void linkmode_set_bit_array(const int *array, int array_size,
|
|
|
|
unsigned long *addr)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < array_size; i++)
|
|
|
|
linkmode_set_bit(array[i], addr);
|
|
|
|
}
|
|
|
|
|
2018-09-29 21:04:09 +00:00
|
|
|
static inline int linkmode_equal(const unsigned long *src1,
|
|
|
|
const unsigned long *src2)
|
|
|
|
{
|
|
|
|
return bitmap_equal(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2020-07-20 18:08:00 +00:00
|
|
|
static inline int linkmode_intersects(const unsigned long *src1,
|
|
|
|
const unsigned long *src2)
|
|
|
|
{
|
|
|
|
return bitmap_intersects(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2019-10-15 10:28:46 +00:00
|
|
|
static inline int linkmode_subset(const unsigned long *src1,
|
|
|
|
const unsigned long *src2)
|
|
|
|
{
|
|
|
|
return bitmap_subset(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
|
|
|
}
|
|
|
|
|
2020-02-15 15:49:27 +00:00
|
|
|
void linkmode_resolve_pause(const unsigned long *local_adv,
|
|
|
|
const unsigned long *partner_adv,
|
|
|
|
bool *tx_pause, bool *rx_pause);
|
|
|
|
|
2020-02-15 15:49:32 +00:00
|
|
|
void linkmode_set_pause(unsigned long *advertisement, bool tx, bool rx);
|
|
|
|
|
2018-09-29 21:04:09 +00:00
|
|
|
#endif /* __LINKMODE_H */
|