GRTM: fixed bug where transmitter start loop was optimized away

This commit is contained in:
Daniel Hellstrom
2012-05-24 17:23:37 +02:00
parent e9378fa191
commit f00fee8eb1

View File

@@ -761,8 +761,7 @@ static int grtm_start(struct grtm_priv *pDev)
struct grtm_regs *regs = pDev->regs; struct grtm_regs *regs = pDev->regs;
int i; int i;
struct grtm_ioc_config *cfg = &pDev->config; struct grtm_ioc_config *cfg = &pDev->config;
volatile unsigned int *txrdy_reg; unsigned int txrdy;
unsigned int txrdy_mask;
/* Clear Descriptors */ /* Clear Descriptors */
memset(pDev->bds,0,0x400); memset(pDev->bds,0,0x400);
@@ -818,21 +817,23 @@ static int grtm_start(struct grtm_priv *pDev)
i--; i--;
} }
/* Check transmitter startup OK */
i = 1000000;
do {
/* Location of TXRDY Bit is different for different revisions */ /* Location of TXRDY Bit is different for different revisions */
if ( pDev->subrev == 0 ) { if ( pDev->subrev == 0 ) {
txrdy_reg = &regs->dma_ctrl; txrdy = READ_REG(&regs->dma_ctrl) &
txrdy_mask = GRTM_REV0_DMA_CTRL_TXRDY; GRTM_REV0_DMA_CTRL_TXRDY;
} else { } else {
txrdy_reg = &regs->dma_status; txrdy = READ_REG(&regs->dma_status) &
txrdy_mask = GRTM_REV1_DMA_STS_TXRDY; GRTM_REV1_DMA_STS_TXRDY;
} }
if (txrdy != 0)
break;
/* Check transmitter startup OK */ asm volatile ("nop"::);
i=0; } while ( --i > 0 );
while( !(READ_REG(txrdy_reg) & txrdy_mask) && (i<1000000) ){ if ( i == 0 ) {
i++;
}
if ( !(READ_REG(txrdy_reg) & txrdy_mask) ){
/* Reset Failed */ /* Reset Failed */
DBG("GRTM: start: Reseting transmitter failed (%d)\n",i); DBG("GRTM: start: Reseting transmitter failed (%d)\n",i);
return RTEMS_IO_ERROR; return RTEMS_IO_ERROR;