Hi, > It would be better if you remove the #ifdef within the functions. > So something like... > <snip>
> #ifdef __LITTLE_ENDIAN > static inline void sisusb_memcpy(void *d, void *s, int count) > { > memcpy(d, s, count); > } > #else > static inline void sisusb_memcpy(void *d, void *s, int count) > { > memcpy_and_reverse(d, s, count); > } > #endif > <snip> > > And for the above 2, something like... > > #ifdef __BIG_ENDIAN > static inline void sisusb_reverse(u32 *s, u32 *d) > { > *d = ((*s << 16) & 0xffff0000) | ((*s >> 16) & 0xffff); > } > #else > static inline void sisiusb_reverse(u32 *s, u32 *d) > { > *d = *s; > } > #endif Thanks. I re-fixed the patch according to your advice. And, because it's used #ifdef in other part, I also fixed it. Would you please check it? Signed-off-by: Mitsuhiro Koga <[EMAIL PROTECTED]> --- diff -urp a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c --- a/drivers/usb/misc/sisusbvga/sisusb.c 2006-08-07 03:20:11.000000000 +0900 +++ b/drivers/usb/misc/sisusbvga/sisusb.c 2006-08-16 15:53:59.000000000 +0900 @@ -76,6 +76,63 @@ static struct usb_driver sisusb_driver; DEFINE_MUTEX(disconnect_mutex); +#ifdef __BIG_ENDIAN +static inline void sisusb_memcpy(u16 *dst, u16 *src, int count) +{ + while (count--) + *(dst++) = cpu_to_le16(*(src++)); +} +#else +static inline void sisusb_memcpy(u16 *dst, u16 *src, int count) +{ + memcpy(dst, src, count); +} +#endif + +#ifdef __BIG_ENDIAN +static inline void sisusb_order_wmem_24bit(char *src, u32 *dst) +{ + *dst = (*src << 16) | + (*(src + 1) << 8) | + *(src + 2); +} +#else +static inline void sisusb_order_wmem_24bit(char *src, u32 *dst) +{ + *dst = (*(src + 2) << 16) | + (*(src + 1) << 8) | + *src; +} +#endif + +#ifdef __BIG_ENDIAN +static inline void sisusb_order_rmem_24bit(u32 *src, char *dst) +{ + *dst = (*src >> 16) & 0xff; + *(dst + 1) = (*src >> 8) & 0xff; + *(dst + 2) = *src & 0xff; +} +#else +static inline void sisusb_order_rmem_24bit(u32 *src, char *dst) +{ + *(dst + 2) = (*src >> 16) & 0xff; + *(dst + 1) = (*src >> 8) & 0xff; + *dst = *src & 0xff; +} +#endif + +#ifdef __BIG_ENDIAN +static inline void sisusb_order_mem_32bit(u32 *src, u32 *dst) +{ + *dst = ((*src << 16) & 0xffff0000) | ((*src >> 16) & 0xffff); +} +#else +static inline void sisusb_order_mem_32bit(u32 *src, u32 *dst) +{ + *dst = *src; +} +#endif + static void sisusb_free_buffers(struct sisusb_usb_data *sisusb) { @@ -408,7 +465,11 @@ static int sisusb_send_bulk_msg(struct s } else if (fromkern) { - memcpy(buffer, kernbuffer, passsize); + if ((len & 3) == 0) + sisusb_memcpy((u16 *)buffer, (u16 *)kernbuffer, passsize / 2); + else + memcpy(buffer, kernbuffer, passsize); + kernbuffer += passsize; } @@ -872,25 +933,9 @@ static int sisusb_write_mem_bulk(struct if (userbuffer) { if (copy_from_user(&buf, userbuffer, 3)) return -EFAULT; -#ifdef __BIG_ENDIAN - swap32 = (buf[0] << 16) | - (buf[1] << 8) | - buf[2]; -#else - swap32 = (buf[2] << 16) | - (buf[1] << 8) | - buf[0]; -#endif + sisusb_order_wmem_24bit(&buf, &swap32); } else -#ifdef __BIG_ENDIAN - swap32 = (kernbuffer[0] << 16) | - (kernbuffer[1] << 8) | - kernbuffer[2]; -#else - swap32 = (kernbuffer[2] << 16) | - (kernbuffer[1] << 8) | - kernbuffer[0]; -#endif + sisusb_order_wmem_24bit(kernbuffer, &swap32); ret = sisusb_write_memio_24bit(sisusb, SISUSB_TYPE_MEM, @@ -907,7 +952,7 @@ static int sisusb_write_mem_bulk(struct if (get_user(swap32, (u32 __user *)userbuffer)) return -EFAULT; } else - swap32 = *((u32 *)kernbuffer); + sisusb_order_mem_32bit((u32 *)kernbuffer, &swap32); ret = sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, @@ -1227,15 +1272,7 @@ static int sisusb_read_mem_bulk(struct s addr, &swap32); if (!ret) { (*bytes_read) += 3; -#ifdef __BIG_ENDIAN - buf[0] = (swap32 >> 16) & 0xff; - buf[1] = (swap32 >> 8) & 0xff; - buf[2] = swap32 & 0xff; -#else - buf[2] = (swap32 >> 16) & 0xff; - buf[1] = (swap32 >> 8) & 0xff; - buf[0] = swap32 & 0xff; -#endif + sisusb_order_rmem_24bit(&swap32, &buf[0]); if (userbuffer) { if (copy_to_user(userbuffer, &buf[0], 3)) return -EFAULT; @@ -1259,7 +1296,7 @@ static int sisusb_read_mem_bulk(struct s userbuffer += 4; } else { - *((u32 *)kernbuffer) = swap32; + sisusb_order_mem_32bit((u32 *)kernbuffer, &swap32); kernbuffer += 4; } addr += 4; @@ -3435,6 +3472,9 @@ static void sisusb_disconnect(struct usb static struct usb_device_id sisusb_table [] = { { USB_DEVICE(0x0711, 0x0900) }, + { USB_DEVICE(0x0711, 0x0901) }, + { USB_DEVICE(0x0711, 0x0902) }, + { USB_DEVICE(0x0711, 0x0920) }, { USB_DEVICE(0x182d, 0x021c) }, { USB_DEVICE(0x182d, 0x0269) }, { } ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel