Re: [PATCH net] net: rnpgbe: fix mailbox endianness handling
From: Yibo Dong <dong100@mucse.com>
Date: 2026-06-17 11:47:23
Also in:
lkml
On Wed, Jun 17, 2026 at 11:40:42AM +0200, Andrew Lunn wrote: Hi Andrew:
On Wed, Jun 17, 2026 at 04:35:31PM +0800, Dong Yibo wrote:quoted
Mailbox data is exchanged through 32-bit MMIO accesses but the mailbox payload is defined using little-endian FW structures with __le16 and __le32 fields.Given you are using __le16 and __le32, why did sparse not find these issues? It would be good to understand this, because if sparse missed this, what else has sparse missed which is also broken? Andrew
My understanding is as follows: The firmware structures are defined with__le16 / __le32 for wire format, but the original code cast these struct pointers to u32 * before passing them to the mailbox read/write routines: - Send path: (u32 *)&req -> msg buffer -> writel() - Receive path: readl() -> msg buffer -> (u32 *)&reply Sparse only sees pure u32 = u32 assignments here, so no type mismatch is reported. In fact, readl()/writel() operate on 'native CPU-ordered u32 values', not little-endian values. The __le annotations correctly describe the firmware wire format, but the original mailbox transport using plain u32 * buffers erased all endian type information at the MMIO boundary, hiding this mismatch from sparse. I have also checked the rest of the rnpgbe driver: all __le types are confined strictly to mailbox firmware structures, and this fix covers all MMIO <-> structure data transfer paths. Comparisons between two __le fields (e.g., reply->opcode != req->opcode) are safe, as both values share the same byte order. Thanks for your feedback!