• Daniel Mack's avatar
    wcn36xx: fix buffer commit logic on TX path · 9a81cc23
    Daniel Mack authored
    When wcn36xx_dxe_tx_frame() is entered while the device is still processing
    the queue asyncronously, we are racing against the firmware code with
    updates to the buffer descriptors. Presumably, the firmware scans the ring
    buffer that holds the descriptors and scans for a valid control descriptor,
    and then assumes that the next descriptor contains the payload. If, however,
    the control descriptor is marked valid, but the payload descriptor isn't,
    the packet is not sent out.
    
    Another issue with the current code is that is lacks memory barriers before
    descriptors are marked valid. This is important because the CPU may reorder
    writes to memory, even if it is allocated as coherent DMA area, and hence
    the device may see incompletely written data.
    
    To fix this, the code in wcn36xx_dxe_tx_frame() was restructured a bit so
    that the payload descriptor is made valid before the control descriptor.
    Memory barriers are added to ensure coherency of shared memory areas.
    Signed-off-by: default avatarDaniel Mack <daniel@zonque.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    9a81cc23
dxe.c 23.9 KB