Messages in this thread Patch in this message | | | From | Andy Shevchenko <> | Subject | [resend, PATCH net-next v1 2/2] net: thunderbolt: Use separate header data type for the Rx | Date | Tue, 29 Nov 2022 18:13:59 +0200 |
| |
The same data type structure is used for bitwise operations and regular ones. It makes sparse unhappy, for example:
.../thunderbolt.c:718:23: warning: cast to restricted __le32
.../thunderbolt.c:953:23: warning: incorrect type in initializer (different base types) .../thunderbolt.c:953:23: expected restricted __wsum [usertype] wsum .../thunderbolt.c:953:23: got restricted __be32 [usertype]
Split the header to bitwise one and specific for Rx to make sparse happy. Assure the layout by involving static_assert() against size and offsets of the member of the structures.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> --- drivers/net/thunderbolt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/net/thunderbolt.c b/drivers/net/thunderbolt.c index 4dbc6c7f2e10..f7b3d0d4646c 100644 --- a/drivers/net/thunderbolt.c +++ b/drivers/net/thunderbolt.c @@ -58,12 +58,32 @@ * supported then @frame_id is filled, otherwise it stays %0. */ struct thunderbolt_ip_frame_header { + __le32 frame_size; + __le16 frame_index; + __le16 frame_id; + __le32 frame_count; +}; + +/* Same as &struct thunderbolt_ip_frame_header for Rx */ +struct thunderbolt_ip_frame_rx_hdr { u32 frame_size; u16 frame_index; u16 frame_id; u32 frame_count; }; +static_assert(sizeof(struct thunderbolt_ip_frame_header) == + sizeof(struct thunderbolt_ip_frame_rx_hdr)); + +#define TBIP_FRAME_HDR_MATCH(x) \ + static_assert(offsetof(struct thunderbolt_ip_frame_header, frame_##x) == \ + offsetof(struct thunderbolt_ip_frame_rx_hdr, frame_##x)) +TBIP_FRAME_HDR_MATCH(size); +TBIP_FRAME_HDR_MATCH(index); +TBIP_FRAME_HDR_MATCH(id); +TBIP_FRAME_HDR_MATCH(count); +#undef TBIP_FRAME_HDR_MATCH + enum thunderbolt_ip_frame_pdf { TBIP_PDF_FRAME_START = 1, TBIP_PDF_FRAME_END, @@ -193,7 +213,7 @@ struct tbnet { struct delayed_work login_work; struct work_struct connected_work; struct work_struct disconnect_work; - struct thunderbolt_ip_frame_header rx_hdr; + struct thunderbolt_ip_frame_rx_hdr rx_hdr; struct tbnet_ring rx_ring; atomic_t frame_id; struct tbnet_ring tx_ring; -- 2.35.1
| |