Re: [PATCH v2] scsi: arm: Convert acornscsi-io.S to C

From: Breno Rodrigues Alves

Date: Thu Oct 22 2026 - 16:34:59 EST


Hi Bart,

Thanks for the review.

> Why eight readl() calls instead of a loop?

The eight readl() calls mirror the assembly's unrolled 16-byte body
(4x ldmia + 4x stmia over 16 bytes). Collapsed into a loop in v3 —
the compiler unrolls it for the aligned case.

> Additionally, please use put_unaligned_be32() instead of open-coding
> it. Is the code below equivalent to the loop above?

Almost, but not quite — two subtleties:

1. w0 is declared as u16, which truncates the readl() result. It
happens to work because the compose step only uses the low 16
bits, but u32 is less surprising. Fixed in v3.

2. put_unaligned_be32() would byte-swap relative to the original
assembly. The asm did a plain 32-bit store:

and r3, r3, lr ; r3 = w0 & 0xffff
orr r3, r3, r4, lsl #16 ; r3 |= w1 << 16
str r3, [r1] ; plain 32-bit store

On little-endian ARM that writes [w0_lo, w0_hi, w1_lo, w1_hi],
i.e. put_unaligned_le32() semantics. put_unaligned_be32()
writes [w1_hi, w1_lo, w0_hi, w0_lo] — reversed.
acornscsi_data_read() feeds SCSI payload bytes verbatim into the
upper layer, so that reversal would corrupt the transferred data.

v3 uses put_unaligned_le32() / get_unaligned_le32() / le16().
Note: <asm/unaligned.h> was removed in 6.12; the include is now
<linux/unaligned.h>.

v3 follows as a reply to this message. The 16-, 8- and 4-byte bodies
are now a single 4-byte loop per direction.