driver/linuxspidev: Clear queue on allocation
SWD idle clocks are added to the queue by advancing the queue index
assuming the queue is zeroed. If the queue isn't zeroed, these idle
clocks end up being filled with junk data. Lets clear the queue and
associated buffers on queue allocation.
TEST: Connects successfully and ran the following TCL command:
dump_image /dev/null 0x20000000 0x42000
Host: Unnamed Qualcomm SoC with QUPv3 based SPI port
Target: RT500
Signed-off-by: Richard Pasek <rpasek@google.com>
Change-Id: Ie660c10c27c4d0937ab0629138935ddbf5aeb0ae
Fixes: 83e0293f7b
("Add Linux SPI device SWD adapter support")
Reviewed-on: https://review.openocd.org/c/openocd/+/8730
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-by: Jonathon Reinhart <jrreinhart@google.com>
Tested-by: jenkins
This commit is contained in:
parent
82277462b9
commit
d09f53a930
|
@ -230,10 +230,21 @@ static void spidev_free_queue(void)
|
||||||
tx_flip_buf = NULL;
|
tx_flip_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spidev_clear_queue(void)
|
||||||
|
{
|
||||||
|
queue_fill = 0;
|
||||||
|
queue_buf_fill = 0;
|
||||||
|
|
||||||
|
memset(queue_infos, 0, sizeof(struct queue_info) * max_queue_entries);
|
||||||
|
memset(queue_tx_buf, 0, queue_buf_size);
|
||||||
|
memset(queue_rx_buf, 0, queue_buf_size);
|
||||||
|
memset(tx_flip_buf, 0, queue_buf_size);
|
||||||
|
}
|
||||||
|
|
||||||
static int spidev_alloc_queue(unsigned int new_queue_entries)
|
static int spidev_alloc_queue(unsigned int new_queue_entries)
|
||||||
{
|
{
|
||||||
if (queue_fill || queue_buf_fill) {
|
if (queue_fill || queue_buf_fill) {
|
||||||
LOG_ERROR("Can't realloc allocate queue when queue is in use");
|
LOG_ERROR("Can't realloc queue when queue is in use");
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,6 +270,8 @@ static int spidev_alloc_queue(unsigned int new_queue_entries)
|
||||||
max_queue_entries = new_queue_entries;
|
max_queue_entries = new_queue_entries;
|
||||||
queue_buf_size = new_queue_buf_size;
|
queue_buf_size = new_queue_buf_size;
|
||||||
|
|
||||||
|
spidev_clear_queue();
|
||||||
|
|
||||||
LOG_DEBUG("Set queue entries to %u (buffers %u bytes)", max_queue_entries, queue_buf_size);
|
LOG_DEBUG("Set queue entries to %u (buffers %u bytes)", max_queue_entries, queue_buf_size);
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -400,12 +413,7 @@ static int spidev_swd_execute_queue(unsigned int end_idle_bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
skip:
|
skip:
|
||||||
// Clear everything in the queue
|
spidev_clear_queue();
|
||||||
queue_fill = 0;
|
|
||||||
queue_buf_fill = 0;
|
|
||||||
memset(queue_infos, 0, sizeof(queue_infos[0]) * max_queue_entries);
|
|
||||||
memset(queue_tx_buf, 0, queue_buf_size);
|
|
||||||
memset(queue_rx_buf, 0, queue_buf_size);
|
|
||||||
|
|
||||||
int retval = queue_retval;
|
int retval = queue_retval;
|
||||||
queue_retval = ERROR_OK;
|
queue_retval = ERROR_OK;
|
||||||
|
|
Loading…
Reference in New Issue