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: Julien May <mailinglist@miromico.ch> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
df3e1ab733
Коммит
28874b7ec4
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
*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);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче