diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2012-05-24 17:23:37 +0200 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-02-26 15:24:22 +0100 |
commit | ce36d905aa130ccda30c2c5dc37ef078f4a1b1b7 (patch) | |
tree | 20fe2f3d7cda3c1b090efbd88979f7c04917a39f | |
parent | b6fed6def20cff66c7de1cbfbd2928805b6ac2a2 (diff) |
GRTM: fixed bug where transmitter start loop was optimized away
-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 de1df727ad..49025bc047 100644 --- a/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c +++ b/c/src/lib/libbsp/sparc/shared/tmtc/grtm.c @@ -761,8 +761,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); @@ -818,21 +817,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; |