changeset 2158:b2eee5fc1db7

* src/at91_serial.c (at91_serial_ISR): Only call the DSR if there is work to do.
author asl
date Mon, 13 Mar 2006 07:46:36 +0000
parents 1674688917d0
children 90fe3e2dc215
files packages/devs/serial/arm/at91/current/ChangeLog packages/devs/serial/arm/at91/current/src/at91_serial.c
diffstat 2 files changed, 13 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/serial/arm/at91/current/ChangeLog
+++ b/packages/devs/serial/arm/at91/current/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-05  Oliver Munz  <munz@speag.ch>
+
+	* src/at91_serial.c (at91_serial_ISR): Only call the DSR if there
+	is work to do.
+	
 2006-02-28  Andrew Lunn  <andrew.lunn@ascom.ch>
             Oliver Munz  <munz@speag.ch>
 
--- a/packages/devs/serial/arm/at91/current/src/at91_serial.c
+++ b/packages/devs/serial/arm/at91/current/src/at91_serial.c
@@ -524,7 +524,8 @@ at91_serial_ISR(cyg_vector_t vector, cyg
     at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv;
     const CYG_ADDRWORD base = at91_chan->base;
     CYG_WORD32 stat, mask;
-
+    cyg_uint32 retcode = 0;
+    
     HAL_READ_UINT32(base + AT91_US_CSR, stat);
     HAL_READ_UINT32(base + AT91_US_IMR, mask);
     stat &= mask;
@@ -540,14 +541,17 @@ at91_serial_ISR(cyg_vector_t vector, cyg
             (CYG_ADDRESS) at91_chan->rcv_buffer[at91_chan->curbuf]
                 + at91_chan->rcv_chunk_size + RCVBUF_EXTRA - x
         );
+        retcode = CYG_ISR_CALL_DSR;
     }
 
-    if (stat & (AT91_US_IER_TxRDY | AT91_US_IER_ENDTX))
+    if (stat & (AT91_US_IER_TxRDY | AT91_US_IER_ENDTX)) {
       HAL_WRITE_UINT32(base + AT91_US_IDR, AT91_US_IER_TxRDY | AT91_US_IER_ENDTX);
+      retcode = CYG_ISR_CALL_DSR;
+    }
+    at91_chan->stat |= stat;
 
-    at91_chan->stat |= stat;
     cyg_drv_interrupt_acknowledge(vector);
-    return CYG_ISR_CALL_DSR;
+    return retcode;
 }
 
 // Serial I/O - high level interrupt handler (DSR)