diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2011-05-04 11:41:46 -0700 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2011-05-13 01:04:59 +0100 |
commit | 9a7baa6c15344dee34d5a9dd0308dc43fc29c488 (patch) | |
tree | 918662021bbc43c575b1f20b3a83f337e20e1a26 | |
parent | 8a7c0708b6fb7be245c21e9f6aabb0d8fd968a03 (diff) | |
download | ethtool-9a7baa6c15344dee34d5a9dd0308dc43fc29c488.tar.gz |
Add support for __be64 and bitops, centralize several needed macros
This change is meant to add support for __be64 values and bitops to
ethtool. In addition the patch pulls the SIOCETHTOOL define and the
ARRAY_SIZE define into ethtool-util.h for later use by the rxclass files.
These changes will be needed in order to support network flow
classifier rule configuration.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
-rw-r--r-- | ethtool-bitops.h | 25 | ||||
-rw-r--r-- | ethtool-util.h | 16 |
2 files changed, 39 insertions, 2 deletions
diff --git a/ethtool-bitops.h b/ethtool-bitops.h new file mode 100644 index 0000000..b1eb426 --- /dev/null +++ b/ethtool-bitops.h @@ -0,0 +1,25 @@ +#ifndef ETHTOOL_BITOPS_H__ +#define ETHTOOL_BITOPS_H__ + +#define BITS_PER_BYTE 8 +#define BITS_PER_LONG (BITS_PER_BYTE * sizeof(long)) +#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_LONG) + +static inline void set_bit(int nr, unsigned long *addr) +{ + addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG); +} + +static inline void clear_bit(int nr, unsigned long *addr) +{ + addr[nr / BITS_PER_LONG] &= ~(1UL << (nr % BITS_PER_LONG)); +} + +static inline int test_bit(unsigned int nr, const unsigned long *addr) +{ + return !!((1UL << (nr % BITS_PER_LONG)) & + (((unsigned long *)addr)[nr / BITS_PER_LONG])); +} + +#endif diff --git a/ethtool-util.h b/ethtool-util.h index 6a4f3f4..d8b621c 100644 --- a/ethtool-util.h +++ b/ethtool-util.h @@ -15,6 +15,7 @@ #ifndef HAVE_BE_TYPES typedef __uint16_t __be16; typedef __uint32_t __be32; +typedef unsigned long long __be64; #endif typedef unsigned long long u64; @@ -28,11 +29,15 @@ typedef __int32_t s32; #if __BYTE_ORDER == __BIG_ENDIAN static inline u16 cpu_to_be16(u16 value) { - return value; + return value; } static inline u32 cpu_to_be32(u32 value) { - return value; + return value; +} +static inline u64 cpu_to_be64(u64 value) +{ + return value; } #else static inline u16 cpu_to_be16(u16 value) @@ -43,8 +48,15 @@ static inline u32 cpu_to_be32(u32 value) { return cpu_to_be16(value >> 16) | (cpu_to_be16(value) << 16); } +static inline u64 cpu_to_be64(u64 value) +{ + return cpu_to_be32(value >> 32) | ((u64)cpu_to_be32(value) << 32); +} #endif +#define ntohll cpu_to_be64 +#define htonll cpu_to_be64 + #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif |