Re: [PATCH 6.10 288/809] media: dvb-usb: Fix unexpected infinite loop in dvb_usb_read_remote_control()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2024/8/1 22:51, Stefan Lippers-Hollmann wrote:
Hi

On 2024-07-30, Greg Kroah-Hartman wrote:
6.10-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Zheng Yejian <zhengyejian1@xxxxxxxxxx>

[ Upstream commit 2052138b7da52ad5ccaf74f736d00f39a1c9198c ]

Infinite log printing occurs during fuzz test:

   rc rc1: DViCO FusionHDTV DVB-T USB (LGZ201) as ...
   ...
   dvb-usb: schedule remote query interval to 100 msecs.
   dvb-usb: DViCO FusionHDTV DVB-T USB (LGZ201) successfully initialized ...
   dvb-usb: bulk message failed: -22 (1/0)
   dvb-usb: bulk message failed: -22 (1/0)
   dvb-usb: bulk message failed: -22 (1/0)
   ...
   dvb-usb: bulk message failed: -22 (1/0)

Looking into the codes, there is a loop in dvb_usb_read_remote_control(),
that is in rc_core_dvb_usb_remote_init() create a work that will call
dvb_usb_read_remote_control(), and this work will reschedule itself at
'rc_interval' intervals to recursively call dvb_usb_read_remote_control(),
see following code snippet:
[...]

This patch, as part of v6.10.3-rc3 breaks my TeVii s480 dual DVB-S2
card, reverting just this patch from v6.10-rc3 fixes the situation
again (a co-installed Microsoft Xbox One Digital TV DVB-T2 Tuner
keeps working).

broken, v6.10.3-rc3:

$ dmesg | grep -i -e dvb -e dw21 -e usb\ 4
[    0.999122] usb 1-1: new high-speed USB device number 2 using ehci-pci
[    1.023123] usb 4-1: new high-speed USB device number 2 using ehci-pci
[    1.130247] usb 1-1: New USB device found, idVendor=9022, idProduct=d482, bcdDevice= 0.01
[    1.130257] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    1.152323] usb 4-1: New USB device found, idVendor=9022, idProduct=d481, bcdDevice= 0.01
[    1.152329] usb 4-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    6.701033] dvb-usb: found a 'TeVii S480.2 USB' in cold state, will try to load a firmware
[    6.701178] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    6.701179] dw2102: start downloading DW210X firmware
[    6.703715] dvb-usb: found a 'Microsoft Xbox One Digital TV Tuner' in cold state, will try to load a firmware
[    6.703974] dvb-usb: downloading firmware from file 'dvb-usb-dib0700-1.20.fw'
[    6.756432] usb 1-1: USB disconnect, device number 2
[    6.862119] dvb-usb: found a 'TeVii S480.2 USB' in warm state.
[    6.862194] dvb-usb: TeVii S480.2 USB error while loading driver (-22)
[    6.862209] dvb-usb: found a 'TeVii S480.1 USB' in cold state, will try to load a firmware
[    6.862244] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    6.862245] dw2102: start downloading DW210X firmware
[    6.914811] usb 4-1: USB disconnect, device number 2
[    7.014131] dvb-usb: found a 'TeVii S480.1 USB' in warm state.
[    7.014487] dvb-usb: TeVii S480.1 USB error while loading driver (-22)
Hi, Sean and Hans!

The device properties of TeVii S480.1 that fail to be loaded should be 's660_properties'
in drivers/media/usb/dvb-usb/dw2102.c:

  static struct dvb_usb_device_properties s660_properties = {
    ...
    .generic_bulk_ctrl_endpoint = 0x81,
    ...
    .devices = {
      {"TeVii S660 USB",
        {&dw2102_table[TEVII_S660], NULL},
        {NULL},
       },
      {"TeVii S480.1 USB",
        {&dw2102_table[TEVII_S480_1], NULL},
        {NULL},
       },
      {"TeVii S480.2 USB",
         &dw2102_table[TEVII_S480_2], NULL},
        {NULL},
       },
    ...
  }

The 'generic_bulk_ctrl_endpoint' is 0x81, so it should be caused by the failure
after run:

   ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint);

Refer to the comment in drivers/media/usb/dvb-usb/dvb-usb.h:
  * @generic_bulk_ctrl_endpoint: most of the DVB USB devices have a generic
  *  endpoint which received control messages with bulk transfers. When this
  *  is non-zero, one can use dvb_usb_generic_rw and dvb_usb_generic_write-
  *  helper functions.

The user can configure a non-zero 'generic_bulk_ctrl_endpoint', but not use it
to do bulk transfers, is it right? If that's the case, does that mean that it
can't compulsorily check bulk endpoint?  Or, is it possible that the bulk endpoint
check is in the wrong place?

I'm a complete newbie for dvb_usb and don't have a dvb device :(

[    7.014538] usbcore: registered new interface driver dw2102
[    7.278244] dvb-usb: found a 'Microsoft Xbox One Digital TV Tuner' in warm state.
[    7.278403] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    7.278915] dvbdev: DVB: registering new adapter (Microsoft Xbox One Digital TV Tuner)
[    7.279137] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    7.460377] usb 6-5: DVB: registering adapter 0 frontend 0 (Panasonic MN88472)...
[    7.460389] dvbdev: dvb_create_media_entity: media entity 'Panasonic MN88472' registered.
[    7.460822] dvb-usb: Microsoft Xbox One Digital TV Tuner successfully initialized and connected.
[    7.460998] usbcore: registered new interface driver dvb_usb_dib0700
[    8.496278] usb 1-1: new high-speed USB device number 3 using ehci-pci
[    8.625238] usb 1-1: config 1 interface 0 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 2
[    8.626608] usb 1-1: New USB device found, idVendor=9022, idProduct=d660, bcdDevice= 0.00
[    8.626613] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    8.626616] usb 1-1: Product: DVBS2BOX
[    8.626618] usb 1-1: Manufacturer: TBS-Tech
[    8.627027] dvb-usb: found a 'TeVii S660 USB' in cold state, will try to load a firmware
[    8.627079] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    8.627081] dw2102: start downloading DW210X firmware
[    8.655186] usb 4-1: new high-speed USB device number 3 using ehci-pci
[    8.781321] dvb-usb: found a 'TeVii S660 USB' in warm state.
[    8.781775] dvb-usb: TeVii S660 USB error while loading driver (-22)
[    8.784340] usb 4-1: config 1 interface 0 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 2
[    8.785705] usb 4-1: New USB device found, idVendor=9022, idProduct=d660, bcdDevice= 0.00
[    8.785714] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    8.785718] usb 4-1: Product: DVBS2BOX
[    8.785721] usb 4-1: Manufacturer: TBS-Tech
[    8.786247] dvb-usb: found a 'TeVii S660 USB' in cold state, will try to load a firmware
[    8.786299] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    8.786301] dw2102: start downloading DW210X firmware
[    8.941215] dvb-usb: found a 'TeVii S660 USB' in warm state.
[    8.941532] dvb-usb: TeVii S660 USB error while loading driver (-22)
[   16.107993] mn88472 12-0018: downloading firmware from file 'dvb-demod-mn88472-02.fw'

working, v6.10.3-rc3 with this patch reverted:

$ dmesg | grep -i -e dvb -e dw21 -e usb\ 4
[    1.136231] usb 1-1: new high-speed USB device number 2 using ehci-pci
[    1.161156] usb 4-1: new high-speed USB device number 2 using ehci-pci
[    1.267579] usb 1-1: New USB device found, idVendor=9022, idProduct=d482, bcdDevice= 0.01
[    1.267588] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    1.291329] usb 4-1: New USB device found, idVendor=9022, idProduct=d481, bcdDevice= 0.01
[    1.291338] usb 4-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    3.135217] dvb-usb: found a 'TeVii S480.2 USB' in cold state, will try to load a firmware
[    3.135430] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    3.135432] dw2102: start downloading DW210X firmware
[    3.166588] dvb-usb: found a 'Microsoft Xbox One Digital TV Tuner' in cold state, will try to load a firmware
[    3.167079] dvb-usb: downloading firmware from file 'dvb-usb-dib0700-1.20.fw'
[    3.188357] usb 1-1: USB disconnect, device number 2
[    3.287145] dvb-usb: found a 'TeVii S480.2 USB' in warm state.
[    3.287222] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    3.287254] dvbdev: DVB: registering new adapter (TeVii S480.2 USB)
[    3.287258] usb 1-1: media controller created
[    3.287355] dvb-usb: MAC address: 01:01:01:01:01:01
[    3.287499] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    3.290759] dvb-usb: no frontend was attached by 'TeVii S480.2 USB'
[    3.315441] rc rc0: lirc_dev: driver dw2102 registered at minor = 0, scancode receiver, no transmitter
[    3.315640] dvb-usb: schedule remote query interval to 150 msecs.
[    3.315646] dvb-usb: TeVii S480.2 USB successfully initialized and connected.
[    3.315730] dvb-usb: found a 'TeVii S480.1 USB' in cold state, will try to load a firmware
[    3.315786] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    3.315790] dw2102: start downloading DW210X firmware
[    3.340783] dvb-usb: TeVii S480.2 USB successfully deinitialized and disconnected.
[    3.369557] usb 4-1: USB disconnect, device number 2
[    3.470172] dvb-usb: found a 'TeVii S480.1 USB' in warm state.
[    3.470320] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    3.470371] dvbdev: DVB: registering new adapter (TeVii S480.1 USB)
[    3.470377] usb 4-1: media controller created
[    3.470516] dvb-usb: MAC address: a1:a1:a1:a1:a1:a1
[    3.470724] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    3.472540] dvb-usb: no frontend was attached by 'TeVii S480.1 USB'
[    3.474008] rc rc1: lirc_dev: driver dw2102 registered at minor = 0, scancode receiver, no transmitter
[    3.474268] dvb-usb: schedule remote query interval to 150 msecs.
[    3.474274] dvb-usb: TeVii S480.1 USB successfully initialized and connected.
[    3.474331] usbcore: registered new interface driver dw2102
[    3.511730] dvb-usb: TeVii S480.1 USB successfully deinitialized and disconnected.
[    3.743260] dvb-usb: found a 'Microsoft Xbox One Digital TV Tuner' in warm state.
[    3.743496] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    3.744132] dvbdev: DVB: registering new adapter (Microsoft Xbox One Digital TV Tuner)
[    3.744363] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    3.924797] usb 6-5: DVB: registering adapter 0 frontend 0 (Panasonic MN88472)...
[    3.924805] dvbdev: dvb_create_media_entity: media entity 'Panasonic MN88472' registered.
[    3.925073] dvb-usb: Microsoft Xbox One Digital TV Tuner successfully initialized and connected.
[    3.925220] usbcore: registered new interface driver dvb_usb_dib0700
[    4.928291] usb 1-1: new high-speed USB device number 3 using ehci-pci
[    5.057227] usb 1-1: config 1 interface 0 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 2
[    5.060100] usb 1-1: New USB device found, idVendor=9022, idProduct=d660, bcdDevice= 0.00
[    5.060106] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    5.060109] usb 1-1: Product: DVBS2BOX
[    5.060112] usb 1-1: Manufacturer: TBS-Tech
[    5.060517] dvb-usb: found a 'TeVii S660 USB' in cold state, will try to load a firmware
[    5.060560] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    5.060562] dw2102: start downloading DW210X firmware
[    5.105152] usb 4-1: new high-speed USB device number 3 using ehci-pci
[    5.214345] dvb-usb: found a 'TeVii S660 USB' in warm state.
[    5.214663] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    5.215024] dvbdev: DVB: registering new adapter (TeVii S660 USB)
[    5.215031] usb 1-1: media controller created
[    5.234371] usb 4-1: config 1 interface 0 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 2
[    5.235622] usb 4-1: New USB device found, idVendor=9022, idProduct=d660, bcdDevice= 0.00
[    5.235632] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    5.235635] usb 4-1: Product: DVBS2BOX
[    5.235638] usb 4-1: Manufacturer: TBS-Tech
[    5.236096] dvb-usb: found a 'TeVii S660 USB' in cold state, will try to load a firmware
[    5.236154] dvb-usb: downloading firmware from file 'dvb-usb-s660.fw'
[    5.236157] dw2102: start downloading DW210X firmware
[    5.390220] dvb-usb: found a 'TeVii S660 USB' in warm state.
[    5.390437] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[    5.390831] dvbdev: DVB: registering new adapter (TeVii S660 USB)
[    5.390837] usb 4-1: media controller created
[    5.457940] dvb-usb: MAC address: 00:18:bd:XX:XX:XX
[    5.458189] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    5.559308] dw2102: Attached ds3000+ts2020!
[    5.559318] usb 1-1: DVB: registering adapter 1 frontend 0 (Montage Technology DS3000)...
[    5.559327] dvbdev: dvb_create_media_entity: media entity 'Montage Technology DS3000' registered.
[    5.560578] rc rc1: lirc_dev: driver dw2102 registered at minor = 1, scancode receiver, no transmitter
[    5.560745] dvb-usb: schedule remote query interval to 150 msecs.
[    5.560748] dvb-usb: TeVii S660 USB successfully initialized and connected.
[    5.643009] dvb-usb: MAC address: 00:18:bd:XX:XX:XX
[    5.643244] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[    5.756627] dw2102: Attached ds3000+ts2020!
[    5.756632] usb 4-1: DVB: registering adapter 2 frontend 0 (Montage Technology DS3000)...
[    5.756641] dvbdev: dvb_create_media_entity: media entity 'Montage Technology DS3000' registered.
[    5.758025] rc rc2: lirc_dev: driver dw2102 registered at minor = 2, scancode receiver, no transmitter
[    5.758194] dvb-usb: schedule remote query interval to 150 msecs.
[    5.758197] dvb-usb: TeVii S660 USB successfully initialized and connected.
[   12.578584] mn88472 12-0018: downloading firmware from file 'dvb-demod-mn88472-02.fw'
[   12.732107] ds3000_firmware_ondemand: Waiting for firmware upload (dvb-fe-ds3000.fw)...
[   13.338071] ds3000_firmware_ondemand: Waiting for firmware upload (dvb-fe-ds3000.fw)...
[   13.339290] ds3000_firmware_ondemand: Waiting for firmware upload (dvb-fe-ds3000.fw)...
[   13.970274] ds3000_firmware_ondemand: Waiting for firmware upload (dvb-fe-ds3000.fw)...

The https://www.linuxtv.org/wiki/index.php/TeVii_S480 is a PCIe card
which combines a USB host controller with two onboard TeVii s660 USB
DVB-S2 cards.

07:00.0 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ohci-pci
         Kernel modules: ohci_pci
07:00.1 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ehci-pci
         Kernel modules: ehci_pci
07:00.2 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ohci-pci
         Kernel modules: ohci_pci
07:00.3 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ehci-pci
         Kernel modules: ehci_pci
07:00.4 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ohci-pci
         Kernel modules: ohci_pci
07:00.5 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ehci-pci
         Kernel modules: ehci_pci
07:00.6 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ohci-pci
         Kernel modules: ohci_pci
07:00.7 USB controller [0c03]: MosChip Semiconductor Technology Ltd. MCS9990 PCIe to 4-Port USB 2.0 Host Controller [9710:9990]
         Subsystem: Asix Electronics Corporation (Wrong ID) Device [a000:4000]
         Kernel driver in use: ehci-pci
         Kernel modules: ehci_pci

:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/1p, 480M
     |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=dw2102, 480M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/1p, 480M
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/1p, 480M
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/1p, 480M
     |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=dw2102, 480M

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 9022:d660 TeVii Technology Ltd. DVB-S2 S660
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 9022:d660 TeVii Technology Ltd. DVB-S2 S660

Regards
	Stefan Lippers-Hollmann


--
Thanks,
Zheng Yejian





[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux