Message ID | 20230705095231.457860-1-xu.yang_2@nxp.com |
---|---|
State | New |
Headers | show |
Series | usb: misc: ehset: fix wrong if condition | expand |
> -----Original Message----- > > A negative number from ret means the host controller had failed to send > usb message and 0 means succeed. Therefore, the if logic is wrong here > and this patch will fix it. > > Fixes: f2b42379c576 ("usb: misc: ehset: Rework test mode entry") > cc: <stable@vger.kernel.org> > Signed-off-by: Xu Yang <xu.yang_2@nxp.com> > --- > drivers/usb/misc/ehset.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/misc/ehset.c b/drivers/usb/misc/ehset.c > index 986d6589f053..36b6e9fa7ffb 100644 > --- a/drivers/usb/misc/ehset.c > +++ b/drivers/usb/misc/ehset.c > @@ -77,7 +77,7 @@ 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) > + if (ret < 0) > break; > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > USB_RT_PORT, USB_PORT_FEAT_TEST, > @@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf, > break; > case TEST_J_PID: > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > - if (!ret) > + if (ret < 0) > break; > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > USB_RT_PORT, USB_PORT_FEAT_TEST, > @@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf, > break; > case TEST_K_PID: > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > - if (!ret) > + if (ret < 0) > break; > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > USB_RT_PORT, USB_PORT_FEAT_TEST, > @@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf, > break; > case TEST_PACKET_PID: > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > - if (!ret) > + if (ret < 0) > break; > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > USB_RT_PORT, USB_PORT_FEAT_TEST, > -- > 2.34.1 A gentle ping.
On Wed, Jul 26, 2023 at 01:54:15AM +0000, Xu Yang wrote: > > -----Original Message----- > > > > A negative number from ret means the host controller had failed to send > > usb message and 0 means succeed. Therefore, the if logic is wrong here > > and this patch will fix it. > > > > Fixes: f2b42379c576 ("usb: misc: ehset: Rework test mode entry") > > cc: <stable@vger.kernel.org> > > Signed-off-by: Xu Yang <xu.yang_2@nxp.com> > > --- > > drivers/usb/misc/ehset.c | 8 ++++---- > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/usb/misc/ehset.c b/drivers/usb/misc/ehset.c > > index 986d6589f053..36b6e9fa7ffb 100644 > > --- a/drivers/usb/misc/ehset.c > > +++ b/drivers/usb/misc/ehset.c > > @@ -77,7 +77,7 @@ 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) > > + if (ret < 0) > > break; > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > @@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf, > > break; > > case TEST_J_PID: > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > - if (!ret) > > + if (ret < 0) > > break; > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > @@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf, > > break; > > case TEST_K_PID: > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > - if (!ret) > > + if (ret < 0) > > break; > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > @@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf, > > break; > > case TEST_PACKET_PID: > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > - if (!ret) > > + if (ret < 0) > > break; > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > -- > > 2.34.1 > > A gentle ping. Have you teted this? It feels odd that the code could be that broken, how did it ever work in the first place? thanks, greg k-h
Hi Greg, > On Wed, Jul 26, 2023 at 01:54:15AM +0000, Xu Yang wrote: > > > -----Original Message----- > > > > > > A negative number from ret means the host controller had failed to send > > > usb message and 0 means succeed. Therefore, the if logic is wrong here > > > and this patch will fix it. > > > > > > Fixes: f2b42379c576 ("usb: misc: ehset: Rework test mode entry") > > > cc: <stable@vger.kernel.org> > > > Signed-off-by: Xu Yang <xu.yang_2@nxp.com> > > > --- > > > drivers/usb/misc/ehset.c | 8 ++++---- > > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/usb/misc/ehset.c b/drivers/usb/misc/ehset.c > > > index 986d6589f053..36b6e9fa7ffb 100644 > > > --- a/drivers/usb/misc/ehset.c > > > +++ b/drivers/usb/misc/ehset.c > > > @@ -77,7 +77,7 @@ 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) > > > + if (ret < 0) > > > break; > > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > > @@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf, > > > break; > > > case TEST_J_PID: > > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > > - if (!ret) > > > + if (ret < 0) > > > break; > > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > > @@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf, > > > break; > > > case TEST_K_PID: > > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > > - if (!ret) > > > + if (ret < 0) > > > break; > > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > > @@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf, > > > break; > > > case TEST_PACKET_PID: > > > ret = ehset_prepare_port_for_testing(hub_udev, portnum); > > > - if (!ret) > > > + if (ret < 0) > > > break; > > > ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, > > > USB_RT_PORT, USB_PORT_FEAT_TEST, > > > -- > > > 2.34.1 > > > > A gentle ping. > > Have you teted this? It feels odd that the code could be that broken, > how did it ever work in the first place? Yes, I tested this patch and it works. If without this patch , the driver will skip sending USB_PORT_FEAT_TEST packet even though USB_PORT_FEAT_SUSPEND packet is successful. You can also check the original handling of TEST_HS_HOST_PORT_SUSPEND_RESUME: 114 case TEST_HS_HOST_PORT_SUSPEND_RESUME: 115 /* Test: wait for 15secs -> suspend -> 15secs delay -> resume */ 116 msleep(15 * 1000); 117 ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, 118 USB_RT_PORT, USB_PORT_FEAT_SUSPEND, 119 portnum, NULL, 0, 1000, GFP_KERNEL); 120 if (ret < 0) 121 break; This patch will align to this if condition. I also wonder why no one report this issue. Thanks, Xu Yang > > thanks, > > greg k-h
diff --git a/drivers/usb/misc/ehset.c b/drivers/usb/misc/ehset.c index 986d6589f053..36b6e9fa7ffb 100644 --- a/drivers/usb/misc/ehset.c +++ b/drivers/usb/misc/ehset.c @@ -77,7 +77,7 @@ 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) + if (ret < 0) break; ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, USB_RT_PORT, USB_PORT_FEAT_TEST, @@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf, break; case TEST_J_PID: ret = ehset_prepare_port_for_testing(hub_udev, portnum); - if (!ret) + if (ret < 0) break; ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, USB_RT_PORT, USB_PORT_FEAT_TEST, @@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf, break; case TEST_K_PID: ret = ehset_prepare_port_for_testing(hub_udev, portnum); - if (!ret) + if (ret < 0) break; ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, USB_RT_PORT, USB_PORT_FEAT_TEST, @@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf, break; case TEST_PACKET_PID: ret = ehset_prepare_port_for_testing(hub_udev, portnum); - if (!ret) + if (ret < 0) break; ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE, USB_RT_PORT, USB_PORT_FEAT_TEST,
A negative number from ret means the host controller had failed to send usb message and 0 means succeed. Therefore, the if logic is wrong here and this patch will fix it. Fixes: f2b42379c576 ("usb: misc: ehset: Rework test mode entry") cc: <stable@vger.kernel.org> Signed-off-by: Xu Yang <xu.yang_2@nxp.com> --- drivers/usb/misc/ehset.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)