Latest working kernel version: 2.6.27.15 Earliest failing kernel version: 2.6.28 Distribution: ArchLinux Problem Description: From version 2.6.28 on no device file is created anymore for this gamepad - rendering it useless. Latest tested version is 2.6.29-rc3-git12. A quick web search shows some people on Ubuntu and one other ArchLinux user having the same problem with this specific gamepad. Additional dmesg output after plugging out and plugging in again: usb 2-1: USB disconnect, address 2 usb 2-1: new low speed USB device using uhci_hcd and address 3 usb 2-1: configuration #1 chosen from 1 choice Output of lsusb -v for the device on an affected kernel: Bus 002 Device 002: ID 044f:b304 ThrustMaster, Inc. Firestorm Dual Power Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x044f ThrustMaster, Inc. idProduct 0xb304 Firestorm Dual Power bcdDevice 1.00 iManufacturer 4 THRUSTMASTER iProduct 30 FireStorm Dual Power 2 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 400mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 33 US bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 108 Report Descriptor: (length is 108) Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x05 ] 5 Gamepad Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x01 ] 1 Pointer Item(Main ): Collection, data= [ 0x00 ] 0 Physical Item(Global): Usage Page, data= [ 0x09 ] 9 Buttons Item(Local ): Usage Minimum, data= [ 0x01 ] 1 Button 1 (Primary) Item(Local ): Usage Maximum, data= [ 0x0c ] 12 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x0c ] 12 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x01 ] 1 Constant Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x39 ] 57 Hat Switch Item(Global): Logical Maximum, data= [ 0x07 ] 7 Item(Global): Physical Minimum, data= [ 0x00 ] 0 Item(Global): Physical Maximum, data= [ 0x0e 0x01 ] 270 Item(Global): Unit, data= [ 0x40 0x00 ] 64 System: None, Unit: None^4 Item(Global): Report Size, data= [ 0x04 ] 4 Item(Main ): Input, data= [ 0x42 ] 66 Data Variable Absolute No_Wrap Linear Preferred_State Null_State Non_Volatile Bitfield Item(Local ): Usage, data= [ 0x30 ] 48 Direction-X Item(Local ): Usage, data= [ 0x31 ] 49 Direction-Y Item(Global): Logical Minimum, data= [ 0x80 ] 128 Item(Global): Logical Maximum, data= [ 0x7f ] 127 Item(Global): Physical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Unit, data= [ 0x00 0x00 ] 0 System: None, Unit: (None) Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x02 ] 2 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage, data= [ 0x35 ] 53 Rotate-Z Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage, data= [ 0x36 ] 54 Slider Item(Global): Logical Minimum, data= [ 0x00 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage, data= [ 0xbb ] 187 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Physical Minimum, data= [ 0x00 ] 0 Item(Global): Physical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x04 ] 4 Item(Main ): Output, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 16 Device Status: 0x0002 (Bus Powered) Remote Wakeup Enabled
Bug still present as of 2.6.28.5 and 2.6.29-rc5.
Okay, I toyed around a little. The device works perfectly again if I remove line 1616 in drivers/hid/hid-core.c - by which I mean the following line: { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, Apparently the device is disabled intentionally, but that really doesn't seem to make sense here.
That is a bug, and I already have fix for that queued in my tree ("HID: move tmff and zpff devices from ignore_list to blacklist" from Anssi Hannula).