[PATCH v2 02/16] thunderbolt: Don't pass a bitfield to FIELD_GET

david.laight.linux
2025-12-12T19:38:15Z

From: David Laight <david.laight.linux@gmail.com>

None of sizeof(), typeof() or __auto_type can be used with bitfields
which makes it difficult to assign a #define parameter to a local
without promoting char and short to int.

Change:
u32 thunderbolt_version:8;
to the equivalent:
u8 thunderbolt_version;
(and the other three bytes of 'DWORD 4' to match).

This is necessary so that FIELD_GET can use sizeof() to verify 'reg'.

Signed-off-by: David Laight <david.laight.linux@gmail.com>
---

Changes for v2:
- Change structure definition instead of call to FIELD_GET().

FIELD_GET currently uses _Generic() which behaves differently for
gcc and clang (I suspect both are wrong!).
gcc treats 'u32 foo:8' as 'u8', but will take the 'default' for other
widths (which will generate an error in FIED_GET().
clang treats 'u32 foo:n' as 'u32'.

drivers/thunderbolt/tb_regs.h | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/thunderbolt/tb_regs.h b/drivers/thunderbolt/tb_regs.h
index c0bf136236e6..f35f062beb34 100644
--- a/drivers/thunderbolt/tb_regs.h
+++ b/drivers/thunderbolt/tb_regs.h
@@ -180,14 +180,14 @@ struct tb_regs_switch_header {
u32 route_hi:31;
bool enabled:1;
/* DWORD 4 */
- u32 plug_events_delay:8; /*
- * RW, pause between plug events in
- * milliseconds. Writing 0x00 is interpreted
- * as 255ms.
- */
- u32 cmuv:8;
- u32 __unknown4:8;
- u32 thunderbolt_version:8;
+ u8 plug_events_delay; /*
+ * RW, pause between plug events in
+ * milliseconds. Writing 0x00 is interpreted
+ * as 255ms.
+ */
+ u8 cmuv;
+ u8 __unknown4;
+ u8 thunderbolt_version;
} __packed;

/* Used with the router thunderbolt_version */
--
2.39.5