From d27c286bcf26145dc260f79c1b4302e0763883e5 Mon Sep 17 00:00:00 2001 From: Tom Knot Date: Tue, 14 Aug 2018 18:02:57 +0200 Subject: [PATCH] Added locking behaviour to prevent byte swapping due to UART/SPI asynchronousness --- modules/unipi/src/unipi_spi.c | 7 +++++++ modules/unipi/src/unipi_uart.c | 1 + version.txt | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/unipi/src/unipi_spi.c b/modules/unipi/src/unipi_spi.c index e143896..592bfbd 100644 --- a/modules/unipi/src/unipi_spi.c +++ b/modules/unipi/src/unipi_spi.c @@ -60,6 +60,7 @@ struct neuronspi_char_driver neuronspi_cdrv = }; struct mutex neuronspi_master_mutex; +struct mutex neuronspi_uart_mutex; struct mutex unipi_inv_speed_mutex; struct spinlock *neuronspi_spi_w_spinlock; int neuronspi_model_id = -1; @@ -747,6 +748,7 @@ int neuronspi_spi_send_message(struct spi_device* spi_dev, u8 *send_buf, u8 *rec #if NEURONSPI_DETAILED_DEBUG > 1 printk(KERN_INFO "UNIPISPI: SPI CRC1 Correct"); #endif + mutex_lock(&neuronspi_uart_mutex); if (d_data && recv_buf[0] == 0x41) { d_data->uart_buf[0] = recv_buf[3]; #if NEURONSPI_DETAILED_DEBUG > 0 @@ -770,6 +772,10 @@ int neuronspi_spi_send_message(struct spi_device* spi_dev, u8 *send_buf, u8 *rec } } } + mutex_unlock(&neuronspi_uart_mutex); + if (d_data && recv_buf[0] == 0x65) { + mutex_lock(&neuronspi_uart_mutex); + } } #if NEURONSPI_DETAILED_DEBUG > 0 else { @@ -1536,6 +1542,7 @@ static s32 __init neuronspi_init(void) neuronspi_probe_spinlock = kzalloc(sizeof(struct spinlock), GFP_ATOMIC); spin_lock_init(neuronspi_probe_spinlock); mutex_init(&neuronspi_master_mutex); + mutex_init(&neuronspi_uart_mutex); mutex_init(&unipi_inv_speed_mutex); memset(&neuronspi_s_dev, 0, sizeof(neuronspi_s_dev)); ret = spi_register_driver(&neuronspi_spi_driver); diff --git a/modules/unipi/src/unipi_uart.c b/modules/unipi/src/unipi_uart.c index d0b875d..56e7b9c 100644 --- a/modules/unipi/src/unipi_uart.c +++ b/modules/unipi/src/unipi_uart.c @@ -579,6 +579,7 @@ void neuronspi_uart_rx_proc(struct kthread_work *ws) end_flag = 1; mutex_unlock(&neuronspi_master_mutex); } + mutex_unlock(&neuronspi_uart_mutex); } kfree(recv_buf); kfree(send_buf); diff --git a/version.txt b/version.txt index b2d3493..cd9c38b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -Repository:unipi-kernel ActiveBranch:[master] PrecedingRelease:v.0.12 PrecedingRevision:100(1ab48c5) LatestCommit:Mon Aug 6 16:55:47 CEST 2018 +Repository:unipi-kernel ActiveBranch:[master] PrecedingRelease:v.0.12 PrecedingRevision:101(d663411) LatestCommit:Tue Aug 14 18:02:57 CEST 2018 -- 2.34.1