summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2012-05-24 17:23:37 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2012-05-24 17:23:37 +0200
commitc7dab042cfbc3b555ffd1448feef37cdc672346d (patch)
treee10fd73f8c16c5b37fc657636f8eea49596d8cec
parentd35c966a0849216c1f879068ceab1ec00950e6f9 (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.c33
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 = &regs->dma_ctrl;
- txrdy_mask = GRTM_REV0_DMA_CTRL_TXRDY;
- } else {
- txrdy_reg = &regs->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(&regs->dma_ctrl) &
+ GRTM_REV0_DMA_CTRL_TXRDY;
+ } else {
+ txrdy = READ_REG(&regs->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;