Here is a patch against 2.6.1-rc1 for hid force feedback devices.
hid-core.c: - Use INT out urbs instead of bulk out urbs. That's the way it should be.
hid-ff.c: - Email address update. - Added ids of Logitech MOMO force wheel.
hid-lgff.c: - Fixes an obvious list handling issue. - The first value in the "rumble" report was actually the report's id. Removed it, since hid-core.c takes care of it. - Email address update.
-- Johann Deneux PS: please CC to me when replying, I am not registred on linux-usb-devel.
diff -u linux-2.6.1-rc1/drivers/usb/input/hid-core.c linux-2.6.1-rc1-new/drivers/usb/input/hid-core.c --- linux-2.6.1-rc1/drivers/usb/input/hid-core.c 2004-01-06 17:43:56.000000000 +0000 +++ linux-2.6.1-rc1-new/drivers/usb/input/hid-core.c 2004-01-06 17:50:37.000000000 +0000 @@ -1525,9 +1526,9 @@ continue; if (!(hid->urbout = usb_alloc_urb(0, GFP_KERNEL))) goto fail; - pipe = usb_sndbulkpipe(dev, endpoint->bEndpointAddress); - usb_fill_bulk_urb(hid->urbout, dev, pipe, hid->outbuf, 0, - hid_irq_out, hid); + pipe = usb_sndintpipe(dev, endpoint->bEndpointAddress); + usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0, + hid_irq_out, hid, 1); hid->urbout->transfer_dma = hid->outbuf_dma; hid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; } diff -u linux-2.6.1-rc1/drivers/usb/input/hid-ff.c linux-2.6.1-rc1-new/drivers/usb/input/hid-ff.c --- linux-2.6.1-rc1/drivers/usb/input/hid-ff.c 2003-12-18 02:58:49.000000000 +0000 +++ linux-2.6.1-rc1-new/drivers/usb/input/hid-ff.c 2004-01-06 17:56:00.000000000 +0000 @@ -5,7 +5,7 @@ * Not all hid devices use the same protocol. For example, some use PID, * other use their own proprietary procotol. * - * Copyright (c) 2002 Johann Deneux + * Copyright (c) 2002-2004 Johann Deneux */ /* @@ -24,7 +24,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so by - * e-mail - mail your message to <[EMAIL PROTECTED]> + * e-mail - mail your message to <[EMAIL PROTECTED]> */ #include <linux/input.h> @@ -52,8 +52,9 @@ static struct hid_ff_initializer inits[] = { #ifdef CONFIG_LOGITECH_FF - {0x46d, 0xc211, hid_lgff_init}, - {0x46d, 0xc283, hid_lgff_init}, + {0x46d, 0xc211, hid_lgff_init}, // Logitech Cordless rumble pad + {0x46d, 0xc283, hid_lgff_init}, // Logitech Wingman Force 3d + {0x46d, 0xc295, hid_lgff_init}, // Logitech MOMO force wheel #endif #ifdef CONFIG_HID_PID {0x45e, 0x001b, hid_pid_init}, diff -u linux-2.6.1-rc1/drivers/usb/input/hid-lgff.c linux-2.6.1-rc1-new/drivers/usb/input/hid-lgff.c --- linux-2.6.1-rc1/drivers/usb/input/hid-lgff.c 2003-12-18 02:59:17.000000000 +0000 +++ linux-2.6.1-rc1-new/drivers/usb/input/hid-lgff.c 2004-01-06 17:50:37.000000000 +0000 @@ -6,7 +6,7 @@ * - WingMan Cordless RumblePad * - WingMan Force 3D * - * Copyright (c) 2002 Johann Deneux + * Copyright (c) 2002-2004 Johann Deneux */ /* @@ -25,13 +25,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so by - * e-mail - mail your message to <[EMAIL PROTECTED]> + * e-mail - mail your message to <[EMAIL PROTECTED]> */ #include <linux/input.h> #include <linux/sched.h> -#define DEBUG +//#define DEBUG #include <linux/usb.h> #include <linux/circ_buf.h> @@ -179,8 +179,7 @@ kfree(private); return -1; } - private->rumble->field[0]->value[0] = 0x03; - private->rumble->field[0]->value[1] = 0x42; + private->rumble->field[0]->value[0] = 0x42; private->condition = hid_lgff_duplicate_report(report); @@ -207,7 +206,7 @@ add_timer(&private->timer); /*TODO: only run the timer when at least one effect is playing */ - printk(KERN_INFO "Force feedback for Logitech force feedback devices by Johann Deneux <[EMAIL PROTECTED]>\n"); + printk(KERN_INFO "Force feedback for Logitech force feedback devices by Johann Deneux <[EMAIL PROTECTED]>\n"); return 0; } @@ -254,7 +253,7 @@ signed short* ff; u16 idVendor = hid->dev->descriptor.idVendor; u16 idProduct = hid->dev->descriptor.idProduct; - struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list); + struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct)) dev++; @@ -511,10 +510,10 @@ hid_submit_report(hid, lgff->constant, USB_DIR_OUT); } - if (left != lgff->rumble->field[0]->value[3] - || right != lgff->rumble->field[0]->value[4]) { - lgff->rumble->field[0]->value[3] = left; - lgff->rumble->field[0]->value[4] = right; + if (left != lgff->rumble->field[0]->value[2] + || right != lgff->rumble->field[0]->value[3]) { + lgff->rumble->field[0]->value[2] = left; + lgff->rumble->field[0]->value[3] = right; dbg("(left,right)=(%04x, %04x)", left, right); hid_submit_report(hid, lgff->rumble, USB_DIR_OUT); }