lkml.org 
[lkml]   [2022]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.15 081/109] media: cec-adap.c: fix is_configuring state
    Date
    From: Hans Verkuil <hverkuil-cisco@xs4all.nl>

    [ Upstream commit 59267fc34f4900dcd2ec3295f6be04b79aee2186 ]

    If an adapter is trying to claim a free logical address then it is
    in the 'is_configuring' state. If during that process the cable is
    disconnected (HPD goes low, which in turn invalidates the physical
    address), then cec_adap_unconfigure() is called, and that set the
    is_configuring boolean to false, even though the thread that's
    trying to claim an LA is still running.

    Don't touch the is_configuring bool in cec_adap_unconfigure(), it
    will eventually be cleared by the thread. By making that change
    the cec_config_log_addr() function also had to change: it was
    aborting if is_configuring became false (since that is what
    cec_adap_unconfigure() did), but that no longer works. Instead
    check if the physical address is invalid. That is a much
    more appropriate check anyway.

    This fixes a bug where the the adapter could be disabled even
    though the device was still configuring. This could cause POLL
    transmits to time out.

    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/cec/core/cec-adap.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c
    index 1f599e300e42..67776a0d31e8 100644
    --- a/drivers/media/cec/core/cec-adap.c
    +++ b/drivers/media/cec/core/cec-adap.c
    @@ -1272,7 +1272,7 @@ static int cec_config_log_addr(struct cec_adapter *adap,
    * While trying to poll the physical address was reset
    * and the adapter was unconfigured, so bail out.
    */
    - if (!adap->is_configuring)
    + if (adap->phys_addr == CEC_PHYS_ADDR_INVALID)
    return -EINTR;

    if (err)
    @@ -1329,7 +1329,6 @@ static void cec_adap_unconfigure(struct cec_adapter *adap)
    adap->phys_addr != CEC_PHYS_ADDR_INVALID)
    WARN_ON(adap->ops->adap_log_addr(adap, CEC_LOG_ADDR_INVALID));
    adap->log_addrs.log_addr_mask = 0;
    - adap->is_configuring = false;
    adap->is_configured = false;
    cec_flush(adap);
    wake_up_interruptible(&adap->kthread_waitq);
    @@ -1521,9 +1520,10 @@ static int cec_config_thread_func(void *arg)
    for (i = 0; i < las->num_log_addrs; i++)
    las->log_addr[i] = CEC_LOG_ADDR_INVALID;
    cec_adap_unconfigure(adap);
    + adap->is_configuring = false;
    adap->kthread_config = NULL;
    - mutex_unlock(&adap->lock);
    complete(&adap->config_completion);
    + mutex_unlock(&adap->lock);
    return 0;
    }

    --
    2.35.1
    \
     
     \ /
      Last update: 2022-05-30 16:19    [W:4.609 / U:0.576 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site