summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2021-10-07 11:06:01 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-10-07 12:48:54 +0200
commit2c52ad743fee10c0815db77a4e47f2416d407123 (patch)
treef9a3c74d7847d86a83df66595dc5f7f2041fa26a /drivers
parentf3351eca1fb16abc4c33392a980e1ec1a6f6aa59 (diff)
Revert "usb: misc: ehset: Workaround for "special" hubs"
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/misc/ehset.c81
1 files changed, 16 insertions, 65 deletions
diff --git a/drivers/usb/misc/ehset.c b/drivers/usb/misc/ehset.c
index b848bbdee802..f87890f9cd26 100644
--- a/drivers/usb/misc/ehset.c
+++ b/drivers/usb/misc/ehset.c
@@ -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,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 */