From 669d4a8ccb34e110890bc50af83874337aaf874b Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Wed, 11 Apr 2018 14:04:50 +0200 Subject: [PATCH] drivers/ethernet: Optimize memory read/write operations in ENC28J60 SPI API helps to directly transfer bytes from/to relevant buffers, so let's take advantage of it. Signed-off-by: Tomasz Bursztyka --- drivers/ethernet/eth_enc28j60.c | 88 +++++++++++++++------------- drivers/ethernet/eth_enc28j60_priv.h | 1 - 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/drivers/ethernet/eth_enc28j60.c b/drivers/ethernet/eth_enc28j60.c index f27ecdbea2f..4976ca24ecf 100644 --- a/drivers/ethernet/eth_enc28j60.c +++ b/drivers/ethernet/eth_enc28j60.c @@ -177,36 +177,41 @@ static void eth_enc28j60_write_mem(struct device *dev, u8_t *data_buffer, u16_t buf_len) { struct eth_enc28j60_runtime *context = dev->driver_data; - struct spi_buf tx_buf = { - .buf = context->mem_buf + u8_t buf[1] = { ENC28J60_SPI_WBM }; + struct spi_buf tx_buf[2] = { + { + .buf = buf, + .len = 1 + }, }; const struct spi_buf_set tx = { - .buffers = &tx_buf, - .count = 1 + .buffers = tx_buf, + .count = 2 }; - u8_t *index_buf; u16_t num_segments; u16_t num_remaining; + int i; - index_buf = data_buffer; num_segments = buf_len / MAX_BUFFER_LENGTH; num_remaining = buf_len - MAX_BUFFER_LENGTH * num_segments; - for (int i = 0; i < num_segments; - ++i, index_buf += MAX_BUFFER_LENGTH) { - context->mem_buf[0] = ENC28J60_SPI_WBM; - memcpy(context->mem_buf + 1, index_buf, MAX_BUFFER_LENGTH); - tx_buf.len = MAX_BUFFER_LENGTH + 1; + for (i = 0; i < num_segments; i++, data_buffer += MAX_BUFFER_LENGTH) { + tx_buf[1].buf = data_buffer; + tx_buf[1].len = MAX_BUFFER_LENGTH; - spi_write(context->spi, &context->spi_cfg, &tx); + if (spi_write(context->spi, &context->spi_cfg, &tx)) { + SYS_LOG_ERR("Failed to write memory"); + return; + } } if (num_remaining > 0) { - context->mem_buf[0] = ENC28J60_SPI_WBM; - memcpy(context->mem_buf + 1, index_buf, num_remaining); - tx_buf.len = num_remaining + 1; + tx_buf[1].buf = data_buffer; + tx_buf[1].len = num_remaining; - spi_write(context->spi, &context->spi_cfg, &tx); + if (spi_write(context->spi, &context->spi_cfg, &tx)) { + SYS_LOG_ERR("Failed to write memory"); + } } } @@ -214,50 +219,49 @@ static void eth_enc28j60_read_mem(struct device *dev, u8_t *data_buffer, u16_t buf_len) { struct eth_enc28j60_runtime *context = dev->driver_data; - struct spi_buf tx_buf = { - .buf = context->mem_buf + u8_t buf[1] = { ENC28J60_SPI_RBM }; + const struct spi_buf tx_buf = { + .buf = buf, + .len = 1 }; const struct spi_buf_set tx = { .buffers = &tx_buf, .count = 1 }; + struct spi_buf rx_buf[2] = { + { + .buf = NULL, + .len = 1 + }, + }; + const struct spi_buf_set rx = { + .buffers = rx_buf, + .count = 2 + }; u16_t num_segments; u16_t num_remaining; - int ret; + int i; num_segments = buf_len / MAX_BUFFER_LENGTH; num_remaining = buf_len - MAX_BUFFER_LENGTH * num_segments; - for (int i = 0; i < num_segments; - ++i, data_buffer += MAX_BUFFER_LENGTH) { - context->mem_buf[0] = ENC28J60_SPI_RBM; + for (i = 0; i < num_segments; i++, data_buffer += MAX_BUFFER_LENGTH) { - tx_buf.len = MAX_BUFFER_LENGTH + 1; + rx_buf[1].buf = data_buffer; + rx_buf[1].len = MAX_BUFFER_LENGTH; - ret = spi_transceive(context->spi, &context->spi_cfg, &tx, &tx); - if (!ret) { - if (data_buffer) { - memcpy(data_buffer, context->mem_buf + 1, - MAX_BUFFER_LENGTH); - } - } else { - SYS_LOG_DBG("Failed to read memory"); + if (spi_transceive(context->spi, &context->spi_cfg, &tx, &rx)) { + SYS_LOG_ERR("Failed to read memory"); + return; } } if (num_remaining > 0) { - context->mem_buf[0] = ENC28J60_SPI_RBM; + rx_buf[1].buf = data_buffer; + rx_buf[1].len = num_remaining; - tx_buf.len = num_remaining + 1; - - ret = spi_transceive(context->spi, &context->spi_cfg, &tx, &tx); - if (!ret) { - if (data_buffer) { - memcpy(data_buffer, context->mem_buf + 1, - num_remaining); - } - } else { - SYS_LOG_DBG("Failed to read memory"); + if (spi_transceive(context->spi, &context->spi_cfg, &tx, &rx)) { + SYS_LOG_ERR("Failed to read memory"); } } } diff --git a/drivers/ethernet/eth_enc28j60_priv.h b/drivers/ethernet/eth_enc28j60_priv.h index f665d98c86a..31c6c8a51b7 100644 --- a/drivers/ethernet/eth_enc28j60_priv.h +++ b/drivers/ethernet/eth_enc28j60_priv.h @@ -236,7 +236,6 @@ struct eth_enc28j60_runtime { struct spi_cs_control spi_cs; struct spi_config spi_cfg; struct gpio_callback gpio_cb; - u8_t mem_buf[MAX_BUFFER_LENGTH + 1]; u8_t tx_tsv[TSV_SIZE]; u8_t rx_rsv[RSV_SIZE]; struct k_sem tx_rx_sem;