The code was basically like this (assuming size_t can be u64) var_u64 |= var_u8 << 24 var_u8 is first promoted to i32 and then the shift is done. Next, it is promoted to u64 by first signextending to 64 bits. This is very unlikely what was intended. So now it is first forced to u32. var_u64 |= (u32)var_u8 << 24 Signed-off-by: Kees Bakker <kees@xxxxxxxxxxxx> --- drivers/staging/gpib/agilent_82357a/agilent_82357a.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/staging/gpib/agilent_82357a/agilent_82357a.c b/drivers/staging/gpib/agilent_82357a/agilent_82357a.c index bbc7e8866872..f3a1b81be22d 100644 --- a/drivers/staging/gpib/agilent_82357a/agilent_82357a.c +++ b/drivers/staging/gpib/agilent_82357a/agilent_82357a.c @@ -679,10 +679,10 @@ static ssize_t agilent_82357a_generic_write(gpib_board_t *board, uint8_t *buffer kfree(status_data); return -EIO; } - *bytes_written = status_data[2]; - *bytes_written |= status_data[3] << 8; - *bytes_written |= status_data[4] << 16; - *bytes_written |= status_data[5] << 24; + *bytes_written = (u32)status_data[2]; + *bytes_written |= (u32)status_data[3] << 8; + *bytes_written |= (u32)status_data[4] << 16; + *bytes_written |= (u32)status_data[5] << 24; kfree(status_data); //printk("%s: write completed, bytes_written=%i\n", __func__, (int)*bytes_written); -- 2.47.0