Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nrf5x: Fix EP OUT race conditions #1279

Merged
merged 1 commit into from
Jan 19, 2022

Commits on Jan 14, 2022

  1. nrf5x: Fix EP OUT race conditions

    When dcd_edpt_xfer() starts new transfer two separate problems were observed.
    For both problems stream of OUT packets was pouring from host.
    
    First problem was that total_len and actual_len were not atomic.
    In case where incoming OUT packets are less (63) than MPS (64), actual_len and total_len
    are set 63.
    Then transfer complete from USBD is called that will schedule next 64 bytes transfer.
    At that point incoming packet would start DMA if there is place in RAM, normally
    it does not happen since actual_len == total_len.
    If packets arrives and interrupt is raised after total_len is set (64) but actual_len is still 63 from
    previous transfer, interrupt code sees that there is place in ram (1 byte) and transfer this 1 byte
    to buffer that was already filled with previous packet.
    To remedy this USB interrupt is blocked during transfer setup.
    
    Second problem can happen when dcd_edpt_xfer setups xfer->total_len and actual_len correctly
    but then context switch happens before xfer->data_received is checked.
    If during this time two packets arrive one will be copied to RAM second will stay in endpoint with
    data_received set to 1.
    Then when xfer_edpt_xfer() checks data_receive flag it starts DMA again overwriting data.
    To remedy this, data_received is checked together with check if data was already transferred.
    If transfer was complete, there is no need to start DMA yet.
    In such case data_received will be handled in same place by next xfer_edpt_xfer() correctly.
    kasjer committed Jan 14, 2022
    Configuration menu
    Copy the full SHA
    da44fe3 View commit details
    Browse the repository at this point in the history