• A
    usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() · 93a6d346
    Anurag Kumar Vulisha 提交于
    [ Upstream commit b7a4fbe2300a8965ea760c7e871507b84aea17f6 ]
    
    Availability of TRB's is calculated using dwc3_calc_trbs_left(), which
    determines total available TRB's based on the HWO bit set in a TRB.
    
    In the present code, __dwc3_prepare_one_trb() is called with a TRB which
    needs to be prepared for transfer. This __dwc3_prepare_one_trb() calls
    dwc3_calc_trbs_left() to determine total available TRBs and set IOC bit
    if the total available TRBs are zero. Since the present working TRB (which
    is passed as an argument to __dwc3_prepare_one_trb() )  doesn't yet have
    the HWO bit set before calling dwc3_calc_trbs_left(), there are chances
    that dwc3_calc_trbs_left() wrongly calculates this present working TRB
    as free(since the HWO bit is not yet set) and returns the total available
    TRBs as greater than zero (including the present working TRB). This could
    be a problem.
    
    This patch corrects the above mentioned problem in __dwc3_prepare_one_trb()
    by increementing the dep->trb_enqueue at the last (after preparing the TRB)
    instead of increementing at the start and setting the IOC bit only if the
    total available TRBs returned by dwc3_calc_trbs_left() is 1 . Since we are
    increementing the dep->trb_enqueue at the last, the present working TRB is
    also considered as available by dwc3_calc_trbs_left() and non zero value is
    returned . So, according to the modified logic, when the total available
    TRBs is equal to 1 that means the total available TRBs in the pool are 0.
    Signed-off-by: NAnurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
    Reviewed-by: NThinh Nguyen <thinhn@synopsys.com>
    Tested-by: NTejas Joglekar <tejas.joglekar@synopsys.com>
    Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    93a6d346
gadget.c 81.3 KB