libxdma: fix next adjacent descriptors
Fix the setting of the next adjacent fields in descriptors. Following commit 5faf23ec the next_adj field of all descriptors is set according to the index of the descriptor rather than its address which causes issues when dma_alloc_coherent doesn't return an address which is page aligned (which happens). Moreover, in the case of a transfer which number of descriptors is bigger than a full page, the next_adj field is set to the maximum (63) for all descriptors untill the last page of descriptors where it starts decreasing. Last, even before this commit, the next_adj field inside a block of adjacent descriptors is not decreasing untill coming near page end, which is not compliant with what the documentation says : "Every descriptor in the descriptor list must accurately describe the descriptor or block ofdescriptors that follows. In a block of adjacent descriptors, the Nxt_adj value decrements from the first descriptor to the second to last descriptor which has a value of zero. Likewise, eachdescriptor in the block points to the next descriptor in the block, except for the last descriptor which might point to a new block or might terminate the list." This commit aligns the blocks of adjacent descriptors to XDMA_MAX_ADJ_BLOCK_SIZE and makes the next_adj field decrease inside each block untill the second to last descriptor in the block or in the full transfer. The size of the page being a multiple of the size of the block (4096 = sizeof(xdma_desc) * 128 = sizeof(xdma_desc) * 2 * XDMA_MAX_ADJ_BLOCK_SIZE
Showing
Please register or sign in to comment