Mercurial > ecos
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)
