diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2012-05-24 17:23:37 +0200 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2012-05-24 17:23:37 +0200 |
commit | c7dab042cfbc3b555ffd1448feef37cdc672346d (patch) | |
tree | e10fd73f8c16c5b37fc657636f8eea49596d8cec | |
parent | d35c966a0849216c1f879068ceab1ec00950e6f9 (diff) |
GRTM: fixed bug where transmitter start loop was optimized awayrcc-v1.2.3
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/tmtc/grtm.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c b/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c index 946d794bf6..8c5bc95b93 100644 --- a/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c +++ b/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c @@ -772,8 +772,7 @@ static int grtm_start(struct grtm_priv *pDev) struct grtm_regs *regs = pDev->regs; int i; struct grtm_ioc_config *cfg = &pDev->config; - volatile unsigned int *txrdy_reg; - unsigned int txrdy_mask; + unsigned int txrdy; /* Clear Descriptors */ memset(pDev->bds,0,0x400); @@ -829,21 +828,23 @@ static int grtm_start(struct grtm_priv *pDev) i--; } - /* Location of TXRDY Bit is different for different revisions */ - if ( pDev->subrev == 0 ) { - txrdy_reg = ®s->dma_ctrl; - txrdy_mask = GRTM_REV0_DMA_CTRL_TXRDY; - } else { - txrdy_reg = ®s->dma_status; - txrdy_mask = GRTM_REV1_DMA_STS_TXRDY; - } - /* Check transmitter startup OK */ - i=0; - while( !(READ_REG(txrdy_reg) & txrdy_mask) && (i<1000000) ){ - i++; - } - if ( !(READ_REG(txrdy_reg) & txrdy_mask) ){ + i = 1000000; + do { + /* Location of TXRDY Bit is different for different revisions */ + if ( pDev->subrev == 0 ) { + txrdy = READ_REG(®s->dma_ctrl) & + GRTM_REV0_DMA_CTRL_TXRDY; + } else { + txrdy = READ_REG(®s->dma_status) & + GRTM_REV1_DMA_STS_TXRDY; + } + if (txrdy != 0) + break; + + asm volatile ("nop"::); + } while ( --i > 0 ); + if ( i == 0 ) { /* Reset Failed */ DBG("GRTM: start: Reseting transmitter failed (%d)\n",i); return RTEMS_IO_ERROR; |