From 67679e56d0d2f7aaf5dd802e812640755f68b418 Mon Sep 17 00:00:00 2001
From: David Sidrane <david_s5@nscdg.com>
Date: Tue, 12 Sep 2017 13:00:03 -1000
Subject: [PATCH] [BACKPORT] stm32:stm32f40xxx I2C ensure proper error
 handling.

  Injecting data errors would cause the driver to
  continually reenter the isr with BERR an RxNE.
  This fix allows the error to be cleared and
  propagated to the waiting task.
---
 .../00034-BACKPORT-stm32f4-I2C-fix.patch      | 41 +++++++++++++++++++
 nuttx-patches/CMakeLists.txt                  |  1 +
 2 files changed, 42 insertions(+)
 create mode 100644 nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch

diff --git a/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch b/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch
new file mode 100644
index 0000000000..d91fe719a6
--- /dev/null
+++ b/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch
@@ -0,0 +1,41 @@
+diff --git NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c
+index 2bb715c..481b851 100644
+--- NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c
++++ NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c
+@@ -1828,6 +1828,20 @@ static int stm32_i2c_isr(struct stm32_i2c_priv_s *priv)
+    * the ISR cycle to handle the sending/receiving of the messages.
+    */
+ 
++  /* First check for errors */
++
++  if ((status & I2C_SR1_ERRORMASK) != 0)
++    {
++         stm32_i2c_traceevent(priv, I2CEVENT_ERROR, status & I2C_SR1_ERRORMASK);
++
++         /* Clear interrupt flags */
++
++         stm32_i2c_putreg(priv, STM32_I2C_SR1_OFFSET, 0);
++
++         priv->dcnt = -1;
++         priv->msgc = 0;
++    }
++
+   if (priv->dcnt == -1 && priv->msgc == 0)
+     {
+       i2cinfo("Shutting down I2C ISR\n");
+@@ -2027,7 +2041,6 @@ static int stm32_i2c_transfer(FAR struct i2c_master_s *dev, FAR struct i2c_msg_s
+                               int count)
+ {
+   FAR struct stm32_i2c_priv_s *priv = (struct stm32_i2c_priv_s *)dev;
+-  stm32_i2c_sem_wait(priv);   /* Ensure that address or flags don't change meanwhile */
+   uint32_t status = 0;
+ #ifdef I2C1_FSMC_CONFLICT
+   uint32_t ahbenr;
+@@ -2035,6 +2048,7 @@ static int stm32_i2c_transfer(FAR struct i2c_master_s *dev, FAR struct i2c_msg_s
+   int ret = 0;
+ 
+   ASSERT(count);
++  stm32_i2c_sem_wait(priv);   /* Ensure that address or flags don't change meanwhile */
+ 
+ #ifdef I2C1_FSMC_CONFLICT
+   /* Disable FSMC that shares a pin with I2C1 (LBAR) */
diff --git a/nuttx-patches/CMakeLists.txt b/nuttx-patches/CMakeLists.txt
index e82acfb036..5079eb76ad 100644
--- a/nuttx-patches/CMakeLists.txt
+++ b/nuttx-patches/CMakeLists.txt
@@ -62,6 +62,7 @@ set(nuttx_patches
 	00031-BACKPORT-fix-arm-none-eabi-gcc-7-warnings-apps.patch
 	00032-BACKPORT-stm32f7-pinmap-FMC-I2C4-fixes.patch
 	00033-BACKPORT-stm32f7-sdmmc-dcache-fix.patch
+	00034-BACKPORT-stm32f4-I2C-fix.patch
 	90000-PENDING-wip-inflight-to-upstream.patch
 	)
 
-- 
GitLab