Commit 2c52ad74 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman
Browse files

Revert "usb: misc: ehset: Workaround for "special" hubs"



This reverts commit ce3e90d5.

The commit in question added list of quirky hubs, but the match
implementation clearly hasn't been tested at all.

First, hub_udev->dev.parent does not represent a USB interface so using
to_usb_interface() makes no sense and we'd be passing a random pointer
to usb_match_id().

Second, if hub_udev is a root hub it doesn't even even represent a USB
device.

Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Fixes: ce3e90d5 ("usb: misc: ehset: Workaround for "special" hubs")
Cc: Razvan Heghedus <heghedus.razvan@gmail.com>
Link: https://lore.kernel.org/r/20211007090601.19156-1-johan@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f3351eca
Loading
Loading
Loading
Loading
+16 −65
Original line number Diff line number Diff line
@@ -18,47 +18,6 @@
#define TEST_SINGLE_STEP_GET_DEV_DESC		0x0107
#define TEST_SINGLE_STEP_SET_FEATURE		0x0108

/*
 * A list of USB hubs which requires to disable the power
 * to the port before starting the testing procedures.
 */
static const struct usb_device_id ehset_hub_list[] = {
	{USB_DEVICE(0x0424, 0x4502)},
	{USB_DEVICE(0x0424, 0x4913)},
	{USB_DEVICE(0x0451, 0x8027)},
	{}
};

static int ehset_prepare_port_for_testing(struct usb_device *hub_udev, u16 portnum)
{
	int ret = 0;

	/*
	 * The USB2.0 spec chapter 11.24.2.13 says that the USB port which is
	 * going under test needs to be put in suspend before sending the
	 * test command. Most hubs don't enforce this precondition, but there
	 * are some hubs which needs to disable the power to the port before
	 * starting the test.
	 */
	if (usb_match_id(to_usb_interface(hub_udev->dev.parent), ehset_hub_list)) {
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_CLEAR_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_ENABLE,
					   portnum, NULL, 0, 1000, GFP_KERNEL);
		/* Wait for the port to be disabled. It's an arbitrary value
		 * which worked every time.
		 */
		msleep(100);
	} else {
		/* For the hubs which are compliant with the spec,
		 * put the port in SUSPEND.
		 */
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_SUSPEND,
					   portnum, NULL, 0, 1000, GFP_KERNEL);
	}
	return ret;
}

static int ehset_probe(struct usb_interface *intf,
		       const struct usb_device_id *id)
{
@@ -71,32 +30,24 @@ static int ehset_probe(struct usb_interface *intf,

	switch (test_pid) {
	case TEST_SE0_NAK_PID:
		ret = ehset_prepare_port_for_testing(hub_udev, portnum);
		if (!ret)
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_TEST,
					   (USB_TEST_SE0_NAK << 8) | portnum,
					   NULL, 0, 1000, GFP_KERNEL);
		break;
	case TEST_J_PID:
		ret = ehset_prepare_port_for_testing(hub_udev, portnum);
		if (!ret)
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_TEST,
					   (USB_TEST_J << 8) | portnum, NULL, 0,
					   1000, GFP_KERNEL);
		break;
	case TEST_K_PID:
		ret = ehset_prepare_port_for_testing(hub_udev, portnum);
		if (!ret)
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_TEST,
					   (USB_TEST_K << 8) | portnum, NULL, 0,
					   1000, GFP_KERNEL);
		break;
	case TEST_PACKET_PID:
		ret = ehset_prepare_port_for_testing(hub_udev, portnum);
		if (!ret)
		ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
					   USB_RT_PORT, USB_PORT_FEAT_TEST,
					   (USB_TEST_PACKET << 8) | portnum,