From: Denis Vlasenko Comment says "Read high byte first as some registers increment..." but code doesn't guarantee that, I think: return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port)); Compiler can reorder it. Make the order explicit. Signed-off-by: Denis Vlasenko Cc: James Bottomley Signed-off-by: Andrew Morton --- drivers/scsi/aic7xxx/aic79xx_core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff -puN drivers/scsi/aic7xxx/aic79xx_core.c~aic7xxx-fix-byte-i-o-order-in-ahd_inw drivers/scsi/aic7xxx/aic79xx_core.c --- a/drivers/scsi/aic7xxx/aic79xx_core.c~aic7xxx-fix-byte-i-o-order-in-ahd_inw +++ a/drivers/scsi/aic7xxx/aic79xx_core.c @@ -323,7 +323,9 @@ ahd_inw(struct ahd_softc *ahd, u_int por * or have other side effects when the low byte is * read. */ - return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port)); + uint16_t r = ahd_inb(ahd, port+1) << 8; + r |= ahd_inb(ahd, port); + return r; } void _