]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
97d98dfc488c0f35e2e61a34ddfe645772ac95e2
[thirdparty/kernel/stable-queue.git] /
1 From 0c84bde4f37ba27d50e4c70ecacd33fe4a57030d Mon Sep 17 00:00:00 2001
2 From: Sean Young <sean@mess.org>
3 Date: Thu, 8 Aug 2024 10:35:19 +0200
4 Subject: media: Revert "media: dvb-usb: Fix unexpected infinite loop in dvb_usb_read_remote_control()"
5
6 From: Sean Young <sean@mess.org>
7
8 commit 0c84bde4f37ba27d50e4c70ecacd33fe4a57030d upstream.
9
10 This reverts commit 2052138b7da52ad5ccaf74f736d00f39a1c9198c.
11
12 This breaks the TeVii s480 dual DVB-S2 S660. The device has a bulk in
13 endpoint but no corresponding out endpoint, so the device does not pass
14 the "has both receive and send bulk endpoint" test.
15
16 Seemingly this device does not use dvb_usb_generic_rw() so I have tried
17 removing the generic_bulk_ctrl_endpoint entry, but this resulted in
18 different problems.
19
20 As we have no explanation yet, revert.
21
22 $ dmesg | grep -i -e dvb -e dw21 -e usb\ 4
23 [ 0.999122] usb 1-1: new high-speed USB device number 2 using ehci-pci
24 [ 1.023123] usb 4-1: new high-speed USB device number 2 using ehci-pci
25 [ 1.130247] usb 1-1: New USB device found, idVendor=9022, idProduct=d482,
26 +bcdDevice= 0.01
27 [ 1.130257] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
28 [ 1.152323] usb 4-1: New USB device found, idVendor=9022, idProduct=d481,
29 +bcdDevice= 0.01
30 [ 1.152329] usb 4-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
31 [ 6.701033] dvb-usb: found a 'TeVii S480.2 USB' in cold state, will try to
32 +load a firmware
33 [ 6.701178] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
34 [ 6.701179] dw2102: start downloading DW210X firmware
35 [ 6.703715] dvb-usb: found a 'Microsoft Xbox One Digital TV Tuner' in cold
36 +state, will try to load a firmware
37 [ 6.703974] dvb-usb: downloading firmware from file 'dvb-usb-dib0700-1.20.fw'
38 [ 6.756432] usb 1-1: USB disconnect, device number 2
39 [ 6.862119] dvb-usb: found a 'TeVii S480.2 USB' in warm state.
40 [ 6.862194] dvb-usb: TeVii S480.2 USB error while loading driver (-22)
41 [ 6.862209] dvb-usb: found a 'TeVii S480.1 USB' in cold state, will try to
42 +load a firmware
43 [ 6.862244] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
44 [ 6.862245] dw2102: start downloading DW210X firmware
45 [ 6.914811] usb 4-1: USB disconnect, device number 2
46 [ 7.014131] dvb-usb: found a 'TeVii S480.1 USB' in warm state.
47 [ 7.014487] dvb-usb: TeVii S480.1 USB error while loading driver (-22)
48 [ 7.014538] usbcore: registered new interface driver dw2102
49
50 Closes: https://lore.kernel.org/stable/20240801165146.38991f60@mir/
51
52 Fixes: 2052138b7da5 ("media: dvb-usb: Fix unexpected infinite loop in dvb_usb_read_remote_control()")
53 Reported-by: Stefan Lippers-Hollmann <s.l-h@gmx.de>
54 Cc: stable@vger.kernel.org
55 Signed-off-by: Sean Young <sean@mess.org>
56 Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
57 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
58 ---
59 drivers/media/usb/dvb-usb/dvb-usb-init.c | 35 +++----------------------------
60 1 file changed, 4 insertions(+), 31 deletions(-)
61
62 --- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
63 +++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
64 @@ -23,40 +23,11 @@ static int dvb_usb_force_pid_filter_usag
65 module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444);
66 MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (default: 0).");
67
68 -static int dvb_usb_check_bulk_endpoint(struct dvb_usb_device *d, u8 endpoint)
69 -{
70 - if (endpoint) {
71 - int ret;
72 -
73 - ret = usb_pipe_type_check(d->udev, usb_sndbulkpipe(d->udev, endpoint));
74 - if (ret)
75 - return ret;
76 - ret = usb_pipe_type_check(d->udev, usb_rcvbulkpipe(d->udev, endpoint));
77 - if (ret)
78 - return ret;
79 - }
80 - return 0;
81 -}
82 -
83 -static void dvb_usb_clear_halt(struct dvb_usb_device *d, u8 endpoint)
84 -{
85 - if (endpoint) {
86 - usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, endpoint));
87 - usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, endpoint));
88 - }
89 -}
90 -
91 static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
92 {
93 struct dvb_usb_adapter *adap;
94 int ret, n, o;
95
96 - ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint);
97 - if (ret)
98 - return ret;
99 - ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint_response);
100 - if (ret)
101 - return ret;
102 for (n = 0; n < d->props.num_adapters; n++) {
103 adap = &d->adapter[n];
104 adap->dev = d;
105 @@ -132,8 +103,10 @@ static int dvb_usb_adapter_init(struct d
106 * when reloading the driver w/o replugging the device
107 * sometimes a timeout occurs, this helps
108 */
109 - dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint);
110 - dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint_response);
111 + if (d->props.generic_bulk_ctrl_endpoint != 0) {
112 + usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
113 + usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
114 + }
115
116 return 0;
117