• Guido Kiener's avatar
    usb: gadget: net2280: Fix overrun of OUT messages · 9d6a54c1
    Guido Kiener authored
    The OUT endpoint normally blocks (NAK) subsequent packets when a
    short packet was received and returns an incomplete queue entry to
    the gadget driver. Thereby the gadget driver can detect a short packet
    when reading queue entries with a length that is not equal to a
    multiple of packet size.
    
    The start_queue() function enables receiving OUT packets regardless of
    the content of the OUT FIFO. This results in a race: With the current
    code, it's possible that the "!ep->is_in && (readl(&ep->regs->ep_stat)
    & BIT(NAK_OUT_PACKETS))" test in start_dma() will fail, then a short
    packet will be received, and then start_queue() will call
    stop_out_naking(). That's what we don't want (OUT naking gets turned
    off while there is data in the FIFO) because then the next driver
    request might receive a mixture of old and new packets.
    
    With the patch, this race can't occur because the FIFO's state is
    tested after we know that OUT naking is already turned on, and OUT
    naking is stopped only when both of the conditions are met.  This
    ensures that all received data is delivered to the gadget driver,
    which can detect a short packet now before new packets are appended
    to the last short packet.
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGuido Kiener <guido.kiener@rohde-schwarz.com>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    9d6a54c1
net2280.c 99.8 KB