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
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel