mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-11 18:35:28 +00:00
Keyborg: make a copy of response before transmitting
Before transmitting the response back to the master, the slave should make a copy of it. Otherwise, if the buffer is reused, we run the risk of overwriting the last response before it's sent out. We got away with this before because we didn't overwrite it fast enough. Let's fix this to be safe. BUG=None TEST=Build and boot BRANCH=None Change-Id: If3c50692d554119de9ff0f0ae0de450b923b11af Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/200672 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
committed by
chrome-internal-fetch
parent
951ee9e379
commit
64e5cc33d9
@@ -31,7 +31,6 @@ static const struct dma_option dma_rx_option = {
|
||||
|
||||
static uint8_t out_msg[SPI_PACKET_MAX_SIZE + 2];
|
||||
static uint8_t in_msg[SPI_PACKET_MAX_SIZE];
|
||||
static uint8_t * const reply_msg = out_msg + 1;
|
||||
|
||||
static inline int wait_for_signal(uint32_t port, uint32_t mask,
|
||||
int value, int timeout_us)
|
||||
@@ -324,11 +323,14 @@ int spi_slave_send_response_async(struct spi_comm_packet *resp)
|
||||
if (size > SPI_PACKET_MAX_SIZE)
|
||||
return EC_ERROR_OVERFLOW;
|
||||
|
||||
if (out_msg != (uint8_t *)resp)
|
||||
memcpy(out_msg, resp, size);
|
||||
|
||||
master_slave_sync(100);
|
||||
|
||||
if (spi->sr & STM32_SPI_SR_RXNE)
|
||||
in_msg[0] = spi->dr;
|
||||
spi->dr = *((uint8_t *)resp);
|
||||
spi->dr = out_msg[0];
|
||||
|
||||
/* Set N_CHG (master SPI_NSS) to high */
|
||||
STM32_GPIO_BSRR(GPIO_A) = 1 << 1;
|
||||
@@ -340,7 +342,7 @@ int spi_slave_send_response_async(struct spi_comm_packet *resp)
|
||||
dma_clear_isr(STM32_DMAC_SPI1_TX);
|
||||
dma_clear_isr(STM32_DMAC_SPI1_RX);
|
||||
dma_start_rx(&dma_rx_option, size - 1, in_msg);
|
||||
dma_prepare_tx(&dma_tx_option, size - 1, ((uint8_t *)resp)+1);
|
||||
dma_prepare_tx(&dma_tx_option, size - 1, out_msg + 1);
|
||||
dma_go(dma_get_channel(STM32_DMAC_SPI1_TX));
|
||||
|
||||
master_slave_sync(5);
|
||||
@@ -367,7 +369,7 @@ int spi_slave_send_response_flush(void)
|
||||
|
||||
static void spi_slave_nack(void)
|
||||
{
|
||||
struct spi_comm_packet *resp = (struct spi_comm_packet *)reply_msg;
|
||||
struct spi_comm_packet *resp = (struct spi_comm_packet *)out_msg;
|
||||
|
||||
resp->cmd_sts = EC_ERROR_UNKNOWN;
|
||||
resp->size = 0;
|
||||
@@ -376,7 +378,7 @@ static void spi_slave_nack(void)
|
||||
|
||||
static void spi_slave_hello_back(const struct spi_comm_packet *cmd)
|
||||
{
|
||||
struct spi_comm_packet *resp = (struct spi_comm_packet *)reply_msg;
|
||||
struct spi_comm_packet *resp = (struct spi_comm_packet *)out_msg;
|
||||
uint8_t buf[SPI_PACKET_MAX_SIZE];
|
||||
int i, sz;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user