lkml.org 
[lkml]   [2021]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 126/177] usb: cdnsp: Fix lack of spin_lock_irqsave/spin_lock_restore
    Date
    From: Pawel Laszczak <pawell@cadence.com>

    commit 4c4e162d9cf38528c4f13df09d5755cbc06f6c77 upstream.

    Patch puts content of cdnsp_gadget_pullup function inside
    spin_lock_irqsave and spin_lock_restore section.
    This construction is required here to keep the data consistency,
    otherwise some data can be changed e.g. from interrupt context.

    Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver")
    Reported-by: Ken (Jian) He <jianhe@ambarella.com>
    cc: <stable@vger.kernel.org>
    Signed-off-by: Pawel Laszczak <pawell@cadence.com>
    Reviewed-by: Peter Chen <peter.chen@kernel.org>
    Link: https://lore.kernel.org/r/20211214045527.26823-1-pawell@gli-login.cadence.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/usb/cdns3/cdnsp-gadget.c | 12 ++++++++++++
    1 file changed, 12 insertions(+)

    --- a/drivers/usb/cdns3/cdnsp-gadget.c
    +++ b/drivers/usb/cdns3/cdnsp-gadget.c
    @@ -1541,15 +1541,27 @@ static int cdnsp_gadget_pullup(struct us
    {
    struct cdnsp_device *pdev = gadget_to_cdnsp(gadget);
    struct cdns *cdns = dev_get_drvdata(pdev->dev);
    + unsigned long flags;

    trace_cdnsp_pullup(is_on);

    + /*
    + * Disable events handling while controller is being
    + * enabled/disabled.
    + */
    + disable_irq(cdns->dev_irq);
    + spin_lock_irqsave(&pdev->lock, flags);
    +
    if (!is_on) {
    cdnsp_reset_device(pdev);
    cdns_clear_vbus(cdns);
    } else {
    cdns_set_vbus(cdns);
    }
    +
    + spin_unlock_irqrestore(&pdev->lock, flags);
    + enable_irq(cdns->dev_irq);
    +
    return 0;
    }


    \
     
     \ /
      Last update: 2021-12-20 16:01    [W:4.377 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site