|
@@ -130,40 +130,71 @@ struct rt2x00_field32 {
|
|
|
|
|
|
/*
|
|
/*
|
|
* Power of two check, this will check
|
|
* Power of two check, this will check
|
|
- * if the mask that has been given contains
|
|
|
|
- * and contiguous set of bits.
|
|
|
|
|
|
+ * if the mask that has been given contains and contiguous set of bits.
|
|
|
|
+ * Note that we cannot use the is_power_of_2() function since this
|
|
|
|
+ * check must be done at compile-time.
|
|
*/
|
|
*/
|
|
#define is_power_of_two(x) ( !((x) & ((x)-1)) )
|
|
#define is_power_of_two(x) ( !((x) & ((x)-1)) )
|
|
#define low_bit_mask(x) ( ((x)-1) & ~(x) )
|
|
#define low_bit_mask(x) ( ((x)-1) & ~(x) )
|
|
#define is_valid_mask(x) is_power_of_two(1 + (x) + low_bit_mask(x))
|
|
#define is_valid_mask(x) is_power_of_two(1 + (x) + low_bit_mask(x))
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Macro's to find first set bit in a variable.
|
|
|
|
+ * These macro's behaves the same as the __ffs() function with
|
|
|
|
+ * the most important difference that this is done during
|
|
|
|
+ * compile-time rather then run-time.
|
|
|
|
+ */
|
|
|
|
+#define compile_ffs2(__x) \
|
|
|
|
+ ( ((__x) & 0x1) ? 0 : 1 )
|
|
|
|
+
|
|
|
|
+#define compile_ffs4(__x) \
|
|
|
|
+ ( ((__x) & 0x3) ? \
|
|
|
|
+ compile_ffs2(__x) : (compile_ffs2((__x) >> 2) + 2) )
|
|
|
|
+
|
|
|
|
+#define compile_ffs8(__x) \
|
|
|
|
+ ( ((__x) & 0xf) ? \
|
|
|
|
+ compile_ffs4(__x) : (compile_ffs4((__x) >> 4) + 4) )
|
|
|
|
+
|
|
|
|
+#define compile_ffs16(__x) \
|
|
|
|
+ ( ((__x) & 0xff) ? \
|
|
|
|
+ compile_ffs8(__x) : (compile_ffs8((__x) >> 8) + 8) )
|
|
|
|
+
|
|
|
|
+#define compile_ffs32(__x) \
|
|
|
|
+ ( ((__x) & 0xffff) ? \
|
|
|
|
+ compile_ffs16(__x) : (compile_ffs16((__x) >> 16) + 16) )
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * This macro will check the requirements for the FIELD{8,16,32} macros
|
|
|
|
+ * The mask should be a constant non-zero contiguous set of bits which
|
|
|
|
+ * does not exceed the given typelimit.
|
|
|
|
+ */
|
|
|
|
+#define FIELD_CHECK(__mask, __type) \
|
|
|
|
+ BUILD_BUG_ON(!__builtin_constant_p(__mask) || \
|
|
|
|
+ !(__mask) || \
|
|
|
|
+ !is_valid_mask(__mask) || \
|
|
|
|
+ (__mask) != (__type)(__mask)) \
|
|
|
|
+
|
|
#define FIELD8(__mask) \
|
|
#define FIELD8(__mask) \
|
|
({ \
|
|
({ \
|
|
- BUILD_BUG_ON(!(__mask) || \
|
|
|
|
- !is_valid_mask(__mask) || \
|
|
|
|
- (__mask) != (u8)(__mask)); \
|
|
|
|
|
|
+ FIELD_CHECK(__mask, u8); \
|
|
(struct rt2x00_field8) { \
|
|
(struct rt2x00_field8) { \
|
|
- __ffs(__mask), (__mask) \
|
|
|
|
|
|
+ compile_ffs8(__mask), (__mask) \
|
|
}; \
|
|
}; \
|
|
})
|
|
})
|
|
|
|
|
|
#define FIELD16(__mask) \
|
|
#define FIELD16(__mask) \
|
|
({ \
|
|
({ \
|
|
- BUILD_BUG_ON(!(__mask) || \
|
|
|
|
- !is_valid_mask(__mask) || \
|
|
|
|
- (__mask) != (u16)(__mask));\
|
|
|
|
|
|
+ FIELD_CHECK(__mask, u16); \
|
|
(struct rt2x00_field16) { \
|
|
(struct rt2x00_field16) { \
|
|
- __ffs(__mask), (__mask) \
|
|
|
|
|
|
+ compile_ffs16(__mask), (__mask) \
|
|
}; \
|
|
}; \
|
|
})
|
|
})
|
|
|
|
|
|
#define FIELD32(__mask) \
|
|
#define FIELD32(__mask) \
|
|
({ \
|
|
({ \
|
|
- BUILD_BUG_ON(!(__mask) || \
|
|
|
|
- !is_valid_mask(__mask) || \
|
|
|
|
- (__mask) != (u32)(__mask));\
|
|
|
|
|
|
+ FIELD_CHECK(__mask, u32); \
|
|
(struct rt2x00_field32) { \
|
|
(struct rt2x00_field32) { \
|
|
- __ffs(__mask), (__mask) \
|
|
|
|
|
|
+ compile_ffs32(__mask), (__mask) \
|
|
}; \
|
|
}; \
|
|
})
|
|
})
|
|
|
|
|