Dma-controller reporting Bad Desc(2)

Hey all,

I’ve been experiencing some issues on my Radxa Rock5B since it’s been set up. I used the Radxa Ubuntu Image.

I’ve ran some diagnostics like memtester and smartctl but everything reports that there are no errors.

I am however always getting the following message when the shell gets spun up after boot:

dma-p1330 fea30000.dam-controller: fill_queue:2264 Bad Desc(2)

Is this something I should look deeper into? Where can I start?

Thanks

2 Likes

I got the same with nvme

I also have an NVMe SSD.

Hi,

got the same issue :

[21039.595485] r8125 0004:41:00.0 enP4p65s0: rss get rxnfc
[21039.596400] r8125 0004:41:00.0 enP4p65s0: rss get rxnfc
[21143.671116] dma-pl330 fea30000.dma-controller: pl330_submit_req:1738 Try increasing mcbufsz (258/256)
[21143.671134] dma-pl330 fea30000.dma-controller: fill_queue:2264 Bad Desc(3)
[21159.720957] r8125 0004:41:00.0 enP4p65s0: rss get rxnfc
[21159.721733] r8125 0004:41:00.0 enP4p65s0: rss get rxnfc

running Debian on NVMe SSD

no answer ???

hey radxa guy, can you give us a solution ?

1 Like

Also experiencing the same as @xcorp. Not sure how to increase mcbufsz. Happens quite a lot unfortunately.

Same issue here.

This suggests the default value of “MCODE_BUFF_PER_REQ” that is hardcoded in Linux kernel drivers/dma/pl330.c is too small.

/*
 * With 256 bytes, we can do more than 2.5MB and 5MB xfers per req
 * at 1byte/burst for P<->M and M<->M respectively.
 * For typical scenario, at 1word/burst, 10MB and 20MB xfers per req
 * should be enough for P<->M and M<->M respectively.
 */
#define MCODE_BUFF_PER_REQ	256

// In pl330_add()
/* Use default MC buffer size if not provided */
if (!pl330->mcbufsz)
	pl330->mcbufsz = MCODE_BUFF_PER_REQ * 2;

// In pl330_submit_req()
if (ret > pl330->mcbufsz / 2) {
	dev_info(pl330->ddma.dev, "%s:%d Try increasing mcbufsz (%i/%i)\n",
			__func__, __LINE__, ret, pl330->mcbufsz / 2);
	ret = -ENOMEM;
	goto xfer_exit;
}

// In fill_queue()
	ret = pl330_submit_req(pch->thread, desc);
	if (!ret) {
		desc->status = BUSY;
	} else if (ret == -EAGAIN) {
		/* QFull or DMAC Dying */
		break;
	} else {
		/* Unacceptable request */
		desc->status = DONE;
		dev_err(pch->dmac->ddma.dev, "%s:%d Bad Desc(%d)\n",
				__func__, __LINE__, desc->txd.cookie);
		tasklet_schedule(&pch->task);
	}