[PATCH] Fixed errors check in mpc5200_psc_interrupt_handler()

Aleksandr Platonov pam at wolpike.com
Tue Feb 4 14:22:16 UTC 2014


Hi.

  - We should check error bits in psc->sr_csr (not in psc->isr_imr)
  - SR_ERROR should also contains SR_RB bit

P.S. Changes were made according with linux code 
(http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/tty/serial/mpc52xx_uart.c 
function mpc52xx_uart_int_rx_chars()) and MPC5200b user's manual 
(chapter 15.2.2.3))


   c/src/lib/libbsp/powerpc/gen5200/console/console.c |   12 +++++++-----
  c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h |   11 ++++++-----
  2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/c/src/lib/libbsp/powerpc/gen5200/console/console.c 
b/c/src/lib/libbsp/powerpc/gen5200/console/console.c
index a70e06d..ed86bdd 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/console/console.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/console/console.c
@@ -284,6 +284,7 @@ static void 
mpc5200_psc_interrupt_handler(rtems_irq_hdl_param handle)
  {
    unsigned char c;
    uint16_t isr;
+  uint16_t sr;
    int minor = (int)handle;
    struct mpc5200_psc *psc =
      (struct mpc5200_psc *)(&mpc5200.psc[psc_minor_to_regset[minor]]);
@@ -344,14 +345,15 @@ static void 
mpc5200_psc_interrupt_handler(rtems_irq_hdl_param handle)
      }
    }

-  if(isr & ISR_ERROR) {
-    if(isr & ISR_RB)
+  sr = psc->sr_csr;
+  if(sr & SR_ERROR) {
+    if(sr & SR_RB)
        channel_info[minor].breaks_detected++;
-    if(isr & ISR_FE)
+    if(sr & SR_FE)
        channel_info[minor].framing_errors++;
-    if(isr & ISR_PE)
+    if(sr & SR_PE)
        channel_info[minor].parity_errors++;
-    if(isr & ISR_OE)
+    if(sr & SR_OE)
        channel_info[minor].overrun_errors++;

      /*
diff --git a/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h 
b/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h
index 89e3968..318c54a 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h
@@ -977,6 +977,12 @@ typedef struct mpc5200_ {
      volatile uint8_t  mr;            /* + 0x00 */
      volatile uint8_t  res1[3];
      volatile uint16_t sr_csr;        /* + 0x04 */
+#define SR_RB      (1 << 15)
+#define SR_FE          (1 << 14)
+#define SR_PE          (1 << 13)
+#define SR_OE          (1 << 12)
+#define SR_ERROR       (SR_RB | SR_FE | SR_PE | SR_OE)
+
      volatile uint16_t res2[1];
      volatile uint16_t cr;            /* + 0x08 */
      volatile uint16_t res3[1];
@@ -986,11 +992,6 @@ typedef struct mpc5200_ {
      volatile uint16_t isr_imr;       /* + 0x14 */
  #define ISR_TX_RDY      (1 << 8)
  #define ISR_RX_RDY_FULL (1 << 9)
-#define ISR_RB      (1 << 15)
-#define ISR_FE          (1 << 14)
-#define ISR_PE          (1 << 13)
-#define ISR_OE          (1 << 12)
-#define ISR_ERROR       (ISR_FE | ISR_PE | ISR_OE)

  #define IMR_TX_RDY      (1 << 8)
  #define IMR_RX_RDY_FULL (1 << 9)



More information about the devel mailing list