Revert "usb: misc: ehset: Workaround for "special" hubs"
authorJohan Hovold <johan@kernel.org>
Thu, 7 Oct 2021 09:06:01 +0000 (11:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Oct 2021 10:48:54 +0000 (12:48 +0200)
This reverts commit ce3e90d5a0cdbcb2ddebbf9e4363e59fa779ad3a.

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: Johan Hovold <johan@kernel.org>
Fixes: ce3e90d5a0cd ("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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/ehset.c

index b848bbd..f87890f 100644 (file)
 #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,36 +30,28 @@ 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);
+               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);
+               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);
+               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,
-                                                  NULL, 0, 1000, GFP_KERNEL);
+               ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
+                                          USB_RT_PORT, USB_PORT_FEAT_TEST,
+                                          (USB_TEST_PACKET << 8) | portnum,
+                                          NULL, 0, 1000, GFP_KERNEL);
                break;
        case TEST_HS_HOST_PORT_SUSPEND_RESUME:
                /* Test: wait for 15secs -> suspend -> 15secs delay -> resume */