• James Hutchinson's avatar
    media: m88ds3103: serialize reset messages in m88ds3103_set_frontend · 326326f0
    James Hutchinson authored
    [ Upstream commit 981fbe3d ]
    
    Ref: https://bugzilla.kernel.org/show_bug.cgi?id=199323
    
    Users are experiencing problems with the DVBSky S960/S960C USB devices
    since the following commit:
    
    9d659ae1: ("locking/mutex: Add lock handoff to avoid starvation")
    
    The device malfunctions after running for an indeterminable period of
    time, and the problem can only be cleared by rebooting the machine.
    
    It is possible to encourage the problem to surface by blocking the
    signal to the LNB.
    
    Further debugging revealed the cause of the problem.
    
    In the following capture:
    - thread #1325 is running m88ds3103_set_frontend
    - thread #42 is running ts2020_stat_work
    
    a> [1325] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 07 80
       [1325] usb 1-1: dvb_usb_v2_generic_io: <<< 08
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 09 01 01 68 3f
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 08 ff
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 03 11
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 09 01 01 60 3d
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07 ff
    b> [1325] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 07 00
       [1325] usb 1-1: dvb_usb_v2_generic_io: <<< 07
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 03 11
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 09 01 01 60 21
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07 ff
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 03 11
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07
       [42] usb 1-1: dvb_usb_v2_generic_io: >>> 09 01 01 60 66
       [42] usb 1-1: dvb_usb_v2_generic_io: <<< 07 ff
       [1325] usb 1-1: dvb_usb_v2_generic_io: >>> 08 68 02 03 11
       [1325] usb 1-1: dvb_usb_v2_generic_io: <<< 07
       [1325] usb 1-1: dvb_usb_v2_generic_io: >>> 08 60 02 10 0b
       [1325] usb 1-1: dvb_usb_v2_generic_io: <<< 07
    
    Two i2c messages are sent to perform a reset in m88ds3103_set_frontend:
    
      a. 0x07, 0x80
      b. 0x07, 0x00
    
    However, as shown in the capture, the regmap mutex is being handed over
    to another thread (ts2020_stat_work) in between these two messages.
    
    >From here, the device responds to every i2c message with an 07 message,
    and will only return to normal operation following a power cycle.
    
    Use regmap_multi_reg_write to group the two reset messages, ensuring
    both are processed before the regmap mutex is unlocked.
    Signed-off-by: default avatarJames Hutchinson <jahutchinson99@googlemail.com>
    Reviewed-by: default avatarAntti Palosaari <crope@iki.fi>
    Signed-off-by: default avatarSean Young <sean@mess.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    326326f0
m88ds3103.c 33.7 KB