On Mon, Nov 30, 2015 at 3:15 PM,  <madcatxs...@devoid-pointer.net> wrote:
> Hi all,
>
> my completely off-the-bat guess would be that the combo uses multiple 
> interfaces as well, the patch seems to ignore everything but iface 0. Can you 
> comment out the 'if' that does this and give it a go?

Just a FYI: https://bugzilla.kernel.org/show_bug.cgi?id=108121

I just been reported that the patch I attached here fixed the issue.
I'll send it to the list tomorrow unless Jiri beats me at picking it
up before :)

Cheers,
Benjamin

>
> Michal
>
> On Mon Nov 30 14:03:51 2015 GMT+0100, Joshua Clayton wrote:
>> Simon et al,
>> My logitech cordless mouse is not detected in linux-next
>> I have bisected the breakage to this patch,
>>  commit 29fae1c85166ef525b8b6518e749295e0c9d1e20 in linux-next.
>>
>> On Monday, November 02, 2015 07:56:52 AM Simon Wood wrote:
>> > At present the G29 is mis-identified as a DFGT, this patch ensures
>> > that the wheel is correctly detected and allows setting the LEDs and
>> > turning range via the '/sys' interface.
>> >
>> > This wheel can also emulate other types of Logitech wheels.
>> >
>> > Signed-off-by: Simon Wood <si...@mungewell.org>
>> > ---
>> >  drivers/hid/hid-core.c  |  1 +
>> >  drivers/hid/hid-lg.c    |  9 ++++++++
>> >  drivers/hid/hid-lg4ff.c | 57 
>> > +++++++++++++++++++++++++++++++++++++++++++++----
>> >  3 files changed, 63 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>> > index 70a11ac..949d804 100644
>> > --- a/drivers/hid/hid-core.c
>> > +++ b/drivers/hid/hid-core.c
>> > @@ -1896,6 +1896,7 @@ static const struct hid_device_id 
>> > hid_have_special_driver[] = {
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) },
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
>> > +   { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_G29_WHEEL) },
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) },
>> >     { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
>> > USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
>> > diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
>> > index 5332fb7..c20ac76 100644
>> > --- a/drivers/hid/hid-lg.c
>> > +++ b/drivers/hid/hid-lg.c
>> > @@ -620,6 +620,7 @@ static int lg_input_mapped(struct hid_device *hdev, 
>> > struct hid_input *hi,
>> >                     usage->code == ABS_Y || usage->code == ABS_Z ||
>> >                     usage->code == ABS_RZ)) {
>> >             switch (hdev->product) {
>> > +           case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
>> >             case USB_DEVICE_ID_LOGITECH_WHEEL:
>> >             case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
>> >             case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
>> > @@ -658,10 +659,18 @@ static int lg_event(struct hid_device *hdev, struct 
>> > hid_field *field,
>> >
>> >  static int lg_probe(struct hid_device *hdev, const struct hid_device_id 
>> > *id)
>> >  {
>> > +   struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
>> > +   __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
>> >     unsigned int connect_mask = HID_CONNECT_DEFAULT;
>> >     struct lg_drv_data *drv_data;
>> >     int ret;
>> >
>> > +   /* Only work with the 1st interface (G29 presents multiple) */
>> > +   if (iface_num != 0) {
>> > +           dbg_hid("%s: ignoring ifnum %d\n", __func__, iface_num);
>> > +           return -ENODEV;
>> > +   }
>> > +
>> >     drv_data = kzalloc(sizeof(struct lg_drv_data), GFP_KERNEL);
>> >     if (!drv_data) {
>> >             hid_err(hdev, "Insufficient memory, cannot allocate driver 
>> > data\n");
>> > diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
>> > index b363d88..fbddcb3 100644
>> > --- a/drivers/hid/hid-lg4ff.c
>> > +++ b/drivers/hid/hid-lg4ff.c
>> > @@ -45,7 +45,8 @@
>> >  #define LG4FF_MODE_G25_IDX 3
>> >  #define LG4FF_MODE_DFGT_IDX 4
>> >  #define LG4FF_MODE_G27_IDX 5
>> > -#define LG4FF_MODE_MAX_IDX 6
>> > +#define LG4FF_MODE_G29_IDX 6
>> > +#define LG4FF_MODE_MAX_IDX 7
>> >
>> >  #define LG4FF_MODE_NATIVE BIT(LG4FF_MODE_NATIVE_IDX)
>> >  #define LG4FF_MODE_DFEX BIT(LG4FF_MODE_DFEX_IDX)
>> > @@ -53,6 +54,7 @@
>> >  #define LG4FF_MODE_G25 BIT(LG4FF_MODE_G25_IDX)
>> >  #define LG4FF_MODE_DFGT BIT(LG4FF_MODE_DFGT_IDX)
>> >  #define LG4FF_MODE_G27 BIT(LG4FF_MODE_G27_IDX)
>> > +#define LG4FF_MODE_G29 BIT(LG4FF_MODE_G29_IDX)
>> >
>> >  #define LG4FF_DFEX_TAG "DF-EX"
>> >  #define LG4FF_DFEX_NAME "Driving Force / Formula EX"
>> > @@ -62,6 +64,8 @@
>> >  #define LG4FF_G25_NAME "G25 Racing Wheel"
>> >  #define LG4FF_G27_TAG "G27"
>> >  #define LG4FF_G27_NAME "G27 Racing Wheel"
>> > +#define LG4FF_G29_TAG "G29"
>> > +#define LG4FF_G29_NAME "G29 Racing Wheel"
>> >  #define LG4FF_DFGT_TAG "DFGT"
>> >  #define LG4FF_DFGT_NAME "Driving Force GT"
>> >
>> > @@ -140,6 +144,7 @@ static const struct lg4ff_wheel lg4ff_devices[] = {
>> >     {USB_DEVICE_ID_LOGITECH_G25_WHEEL,   lg4ff_wheel_effects, 40, 900, 
>> > lg4ff_set_range_g25},
>> >     {USB_DEVICE_ID_LOGITECH_DFGT_WHEEL,  lg4ff_wheel_effects, 40, 900, 
>> > lg4ff_set_range_g25},
>> >     {USB_DEVICE_ID_LOGITECH_G27_WHEEL,   lg4ff_wheel_effects, 40, 900, 
>> > lg4ff_set_range_g25},
>> > +   {USB_DEVICE_ID_LOGITECH_G29_WHEEL,   lg4ff_wheel_effects, 40, 900, 
>> > lg4ff_set_range_g25},
>> >     {USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2, lg4ff_wheel_effects, 40, 270, 
>> > NULL},
>> >     {USB_DEVICE_ID_LOGITECH_WII_WHEEL,   lg4ff_wheel_effects, 40, 270, 
>> > NULL}
>> >  };
>> > @@ -157,6 +162,9 @@ static const struct lg4ff_multimode_wheel 
>> > lg4ff_multimode_wheels[] = {
>> >     {USB_DEVICE_ID_LOGITECH_G27_WHEEL,
>> >      LG4FF_MODE_NATIVE | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFP 
>> > | LG4FF_MODE_DFEX,
>> >      LG4FF_G27_TAG, LG4FF_G27_NAME},
>> > +   {USB_DEVICE_ID_LOGITECH_G29_WHEEL,
>> > +    LG4FF_MODE_NATIVE | LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 
>> > | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
>> > +    LG4FF_G29_TAG, LG4FF_G29_NAME},
>> >  };
>> >
>> >  static const struct lg4ff_alternate_mode lg4ff_alternate_modes[] = {
>> > @@ -165,7 +173,8 @@ static const struct lg4ff_alternate_mode 
>> > lg4ff_alternate_modes[] = {
>> >     [LG4FF_MODE_DFP_IDX] = {USB_DEVICE_ID_LOGITECH_DFP_WHEEL, 
>> > LG4FF_DFP_TAG, LG4FF_DFP_NAME},
>> >     [LG4FF_MODE_G25_IDX] = {USB_DEVICE_ID_LOGITECH_G25_WHEEL, 
>> > LG4FF_G25_TAG, LG4FF_G25_NAME},
>> >     [LG4FF_MODE_DFGT_IDX] = {USB_DEVICE_ID_LOGITECH_DFGT_WHEEL, 
>> > LG4FF_DFGT_TAG, LG4FF_DFGT_NAME},
>> > -   [LG4FF_MODE_G27_IDX] = {USB_DEVICE_ID_LOGITECH_G27_WHEEL, 
>> > LG4FF_G27_TAG, LG4FF_G27_NAME}
>> > +   [LG4FF_MODE_G27_IDX] = {USB_DEVICE_ID_LOGITECH_G27_WHEEL, 
>> > LG4FF_G27_TAG, LG4FF_G27_NAME},
>> > +   [LG4FF_MODE_G29_IDX] = {USB_DEVICE_ID_LOGITECH_G29_WHEEL, 
>> > LG4FF_G29_TAG, LG4FF_G29_NAME},
>> >  };
>> >
>> >  /* Multimode wheel identificators */
>> > @@ -197,8 +206,24 @@ static const struct lg4ff_wheel_ident_info 
>> > lg4ff_dfgt_ident_info = {
>> >     USB_DEVICE_ID_LOGITECH_DFGT_WHEEL
>> >  };
>> >
>> > +static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info = {
>> > +   LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | 
>> > LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
>> > +   0xfff8,
>> > +   0x1350,
>> > +   USB_DEVICE_ID_LOGITECH_G29_WHEEL
>> > +};
>> > +
>> > +static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info2 = {
>> > +   LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | 
>> > LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
>> > +   0xff00,
>> > +   0x8900,
>> > +   USB_DEVICE_ID_LOGITECH_G29_WHEEL
>> > +};
>> > +
>> >  /* Multimode wheel identification checklists */
>> >  static const struct lg4ff_wheel_ident_info *lg4ff_main_checklist[] = {
>> > +   &lg4ff_g29_ident_info,
>> > +   &lg4ff_g29_ident_info2,
>> >     &lg4ff_dfgt_ident_info,
>> >     &lg4ff_g27_ident_info,
>> >     &lg4ff_g25_ident_info,
>> > @@ -237,6 +262,12 @@ static const struct lg4ff_compat_mode_switch 
>> > lg4ff_mode_switch_ext09_g27 = {
>> >      0xf8, 0x09, 0x04, 0x01, 0x00, 0x00, 0x00}      /* Switch mode to G27 
>> > with detach */
>> >  };
>> >
>> > +static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g29 
>> > = {
>> > +   2,
>> > +   {0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,      /* Revert mode upon 
>> > USB reset */
>> > +    0xf8, 0x09, 0x05, 0x01, 0x01, 0x00, 0x00}      /* Switch mode to G29 
>> > with detach */
>> > +};
>> > +
>> >  /* EXT_CMD1 - Understood by DFP, G25, G27 and DFGT */
>> >  static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext01_dfp 
>> > = {
>> >     1,
>> > @@ -650,6 +681,23 @@ static const struct lg4ff_compat_mode_switch 
>> > *lg4ff_get_mode_switch_command(cons
>> >                     return NULL;
>> >             }
>> >             break;
>> > +   case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
>> > +           switch (target_product_id) {
>> > +           case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
>> > +                   return &lg4ff_mode_switch_ext09_dfp;
>> > +           case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
>> > +                   return &lg4ff_mode_switch_ext09_dfgt;
>> > +           case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
>> > +                   return &lg4ff_mode_switch_ext09_g25;
>> > +           case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
>> > +                   return &lg4ff_mode_switch_ext09_g27;
>> > +           case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
>> > +                   return &lg4ff_mode_switch_ext09_g29;
>> > +           /* G29 can only be switched to DF-EX, DFP, DFGT, G25, G27 or 
>> > its native mode */
>> > +           default:
>> > +                   return NULL;
>> > +           }
>> > +           break;
>> >     case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
>> >             switch (target_product_id) {
>> >             case USB_DEVICE_ID_LOGITECH_WHEEL:
>> > @@ -1232,12 +1280,13 @@ int lg4ff_init(struct hid_device *hid)
>> >             entry->wdata.set_range(hid, entry->wdata.range);
>> >
>> >  #ifdef CONFIG_LEDS_CLASS
>> > -   /* register led subsystem - G27 only */
>> > +   /* register led subsystem - G27/G29 only */
>> >     entry->wdata.led_state = 0;
>> >     for (j = 0; j < 5; j++)
>> >             entry->wdata.led[j] = NULL;
>> >
>> > -   if (lg4ff_devices[i].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL) {
>> > +   if (lg4ff_devices[i].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL ||
>> > +                   lg4ff_devices[i].product_id == 
>> > USB_DEVICE_ID_LOGITECH_G29_WHEEL) {
>> >             struct led_classdev *led;
>> >             size_t name_sz;
>> >             char *name;
>>
>> I have a logitech cordless mouse/keyboard combo.  The keyboard still works.
>>
>> The following is part of my dmesg output on the previous commit (with the 
>> mouse working),
>>
>> before:
>>
>> [    1.566674] usb 4-3: New USB device found, idVendor=046d, idProduct=c517
>> [    1.566779] usb 4-3: New USB device strings: Mfr=1, Product=2, 
>> SerialNumber=0
>> [    1.566881] usb 4-3: Product: USB Receiver
>> [    1.566982] usb 4-3: Manufacturer: Logitech
>> [    1.573671] input: Logitech USB Receiver as 
>> /devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.0/0003:046D:C517.0003/input/input14
>> [    1.624510] logitech 0003:046D:C517.0003: input,hidraw0: USB HID v1.10 
>> Keyboard [Logitech USB Receiver] on usb-0000:00:12.1-3/input0
>> [    1.629313] tsc: Refined TSC clocksource calibration: 2511.094 MHz
>> [    1.629407] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 
>> 0x243229b6f8a, max_idle_ns: 440795226168 ns
>> [    1.631370] logitech 0003:046D:C517.0004: fixing up Logitech keyboard 
>> report descriptor
>> [    1.632203] input: Logitech USB Receiver as 
>> /devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.1/0003:046D:C517.0004/input/input15
>> [    1.677588] random: nonblocking pool is initialized
>> [    1.683359] logitech 0003:046D:C517.0004: input,hiddev0,hidraw1: USB HID 
>> v1.10 Mouse [Logitech USB Receiver] on usb-0000:00:12.1-3/input1
>>
>> after:
>>
>> [    1.577748] usb 4-3: New USB device found, idVendor=046d, idProduct=c517
>> [    1.577859] usb 4-3: New USB device strings: Mfr=1, Product=2, 
>> SerialNumber=0
>> [    1.577963] usb 4-3: Product: USB Receiver
>> [    1.578064] usb 4-3: Manufacturer: Logitech
>> [    1.584746] input: Logitech USB Receiver as 
>> /devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.0/0003:046D:C517.0003/input/input14
>> [    1.635596] logitech 0003:046D:C517.0003: input,hidraw0: USB HID v1.10 
>> Keyboard [Logitech USB Receiver] on usb-0000:00:12.1-3/input0
>> [    1.642389] tsc: Refined TSC clocksource calibration: 2511.093 MHz
>> [    1.642507] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 
>> 0x24322913340, max_idle_ns: 440795255552 ns
>> [    1.696567] random: nonblocking pool is initialized
>>
>>
>> I can only guess that it is either now being misidentified (regression).
>> ... or do I perhaps need to enable a different driver now???
>> Happy to help if I can.
>>
>> warmest regards,
>>
>> Joshua Clayton
>>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to