Skip to content

Commit 57d77ac

Browse files
talih0kartben
authored andcommitted
drivers: dma_xmc4xxx: Fix pending_length in stat when source_data_size > 1
Block_ts stores the number of transfers from DMA source, not the transferred length in bytes. Regression from 9c4cd30. Signed-off-by: Andriy Gelman <[email protected]>
1 parent ccdf23a commit 57d77ac

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

drivers/dma/dma_xmc4xxx.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ struct dma_xmc4xxx_channel {
3333
dma_callback_t cb;
3434
void *user_data;
3535
uint32_t dest_address;
36-
uint16_t block_ts;
36+
uint32_t transfer_size;
3737
uint8_t source_data_size;
3838
uint8_t dlr_line;
3939
uint8_t channel_direction;
@@ -294,7 +294,7 @@ static int dma_xmc4xxx_config(const struct device *dev, uint32_t channel, struct
294294

295295
dev_data->channels[channel].cb = config->dma_callback;
296296
dev_data->channels[channel].user_data = config->user_data;
297-
dev_data->channels[channel].block_ts = block->block_size / config->source_data_size;
297+
dev_data->channels[channel].transfer_size = block->block_size;
298298
dev_data->channels[channel].source_data_size = config->source_data_size;
299299
dev_data->channels[channel].dlr_line = dlr_line;
300300
dev_data->channels[channel].channel_direction = config->channel_direction;
@@ -384,7 +384,7 @@ static int dma_xmc4xxx_reload(const struct device *dev, uint32_t channel, uint32
384384
LOG_ERR("Block transactions must be <= 4095");
385385
return -EINVAL;
386386
}
387-
dma_channel->block_ts = block_ts;
387+
dma_channel->transfer_size = size;
388388
dma_channel->dest_address = dst;
389389

390390
/* do we need to clear any errors */
@@ -416,14 +416,15 @@ static int dma_xmc4xxx_get_status(const struct device *dev, uint32_t channel,
416416
/* appear to guarantee that the last value is fully transferred to dest. */
417417
if (dma_channel->dest_addr_adj == DMA_ADDR_ADJ_INCREMENT) {
418418
transferred_bytes = dma->CH[channel].DAR - dma_channel->dest_address;
419-
stat->pending_length = dma_channel->block_ts - transferred_bytes;
419+
stat->pending_length = dma_channel->transfer_size - transferred_bytes;
420420
} else if (dma_channel->dest_addr_adj == DMA_ADDR_ADJ_DECREMENT) {
421421
transferred_bytes = dma_channel->dest_address - dma->CH[channel].DAR;
422-
stat->pending_length = dma_channel->block_ts - transferred_bytes;
422+
stat->pending_length = dma_channel->transfer_size - transferred_bytes;
423423
} else {
424-
transferred_bytes = XMC_DMA_CH_GetTransferredData(dma, channel);
425-
stat->pending_length = dma_channel->block_ts - transferred_bytes;
426-
stat->pending_length *= dma_channel->source_data_size;
424+
uint32_t num_source_transfers = XMC_DMA_CH_GetTransferredData(dma, channel);
425+
426+
stat->pending_length = dma_channel->transfer_size -
427+
num_source_transfers * dma_channel->source_data_size;
427428
}
428429

429430
/* stat->dir and other remaining fields are not set. They are not */

0 commit comments

Comments
 (0)