Commit 28874b7e authored by Julien May's avatar Julien May Committed by Greg Kroah-Hartman

USB: Fix bug with byte order in isp116x-hcd.c fio write/read

URB payload data are transfered in wrong byte order on a big endinan
architecture (AVR32).
Signed-off-by: default avatarJulien May <mailinglist@miromico.ch>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent df3e1ab7
...@@ -94,6 +94,10 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len) ...@@ -94,6 +94,10 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
u16 w; u16 w;
int quot = len % 4; int quot = len % 4;
/* buffer is already in 'usb data order', which is LE. */
/* When reading buffer as u16, we have to take care byte order */
/* doesn't get mixed up */
if ((unsigned long)dp2 & 1) { if ((unsigned long)dp2 & 1) {
/* not aligned */ /* not aligned */
for (; len > 1; len -= 2) { for (; len > 1; len -= 2) {
...@@ -105,8 +109,11 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len) ...@@ -105,8 +109,11 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
isp116x_write_data16(isp116x, (u16) * dp); isp116x_write_data16(isp116x, (u16) * dp);
} else { } else {
/* aligned */ /* aligned */
for (; len > 1; len -= 2) for (; len > 1; len -= 2) {
isp116x_raw_write_data16(isp116x, *dp2++); /* Keep byte order ! */
isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++));
}
if (len) if (len)
isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2)); isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
} }
...@@ -124,6 +131,10 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len) ...@@ -124,6 +131,10 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
u16 w; u16 w;
int quot = len % 4; int quot = len % 4;
/* buffer is already in 'usb data order', which is LE. */
/* When reading buffer as u16, we have to take care byte order */
/* doesn't get mixed up */
if ((unsigned long)dp2 & 1) { if ((unsigned long)dp2 & 1) {
/* not aligned */ /* not aligned */
for (; len > 1; len -= 2) { for (; len > 1; len -= 2) {
...@@ -131,12 +142,16 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len) ...@@ -131,12 +142,16 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
*dp++ = w & 0xff; *dp++ = w & 0xff;
*dp++ = (w >> 8) & 0xff; *dp++ = (w >> 8) & 0xff;
} }
if (len) if (len)
*dp = 0xff & isp116x_read_data16(isp116x); *dp = 0xff & isp116x_read_data16(isp116x);
} else { } else {
/* aligned */ /* aligned */
for (; len > 1; len -= 2) for (; len > 1; len -= 2) {
*dp2++ = isp116x_raw_read_data16(isp116x); /* Keep byte order! */
*dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x));
}
if (len) if (len)
*(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x); *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment