Commit db7220c4 authored by Vicki Pfau's avatar Vicki Pfau Committed by Dmitry Torokhov
Browse files

Input: xpad - fix support for some third-party controllers



Some third-party controllers, such as the HORPIAD FPS for Nintendo Switch and
Gamesir-G3w, require a specific packet that the first-party XInput driver sends
before it will start sending reports. It's not currently known what this packet
does, but since the first-party driver always sends it's unlikely that this
could cause issues with existing controllers.

Co-authored-by: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: default avatarVicki Pfau <vi@endrift.com>
Link: https://lore.kernel.org/r/20230324040446.3487725-3-vi@endrift.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 8fb1bcd0
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -264,6 +264,7 @@ static const struct xpad_device {
	{ 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE },
	{ 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
	{ 0x0f0d, 0x00c5, "Hori Fighting Commander ONE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
	{ 0x0f0d, 0x00dc, "HORIPAD FPS for Nintendo Switch", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
	{ 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
	{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
	{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
@@ -2013,6 +2014,28 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
		goto err_free_in_urb;
	}

	if (xpad->xtype == XTYPE_XBOX360) {
		/*
		 * Some third-party controllers Xbox 360-style controllers
		 * require this message to finish initialization.
		*/
		u8 dummy[20];

		error = usb_control_msg_recv(udev, 0,
					     /* bRequest */ 0x01,
					     /* bmRequestType */
					     USB_TYPE_VENDOR | USB_DIR_IN |
						USB_RECIP_INTERFACE,
					     /* wValue */ 0x100,
					     /* wIndex */ 0x00,
					     dummy, sizeof(dummy),
					     25, GFP_KERNEL);
		if (error)
			dev_warn(&xpad->dev->dev,
				 "unable to receive magic message: %d\n",
				 error);
	}

	ep_irq_in = ep_irq_out = NULL;

	for (i = 0; i < 2; i++) {