p = bus_to_virt(bdp->cbd_bufaddr); 
p = cpm2cpu_addr(bdp->cbd_bufaddr);  
static int cpm_uart_tx_pump(struct uart_port *port){	volatile cbd_t *bdp;	unsigned char *p;	int count;	struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;	struct circ_buf *xmit = &port->info->xmit;	/* Handle xon/xoff */	if (port->x_char) {		/* Pick next descriptor and fill from buffer */		bdp = pinfo->tx_cur;		p = bus_to_virt(bdp->cbd_bufaddr);		*p++ = xmit->buf[xmit->tail];		bdp->cbd_datlen = 1;		bdp->cbd_sc |= BD_SC_READY;		/* Get next BD. */		if (bdp->cbd_sc & BD_SC_WRAP)			bdp = pinfo->tx_bd_base;		else			bdp++;		pinfo->tx_cur = bdp;		port->icount.tx++;		port->x_char = 0;		return 1;	}	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {		cpm_uart_stop_tx(port, 0);		return 0;	}	/* Pick next descriptor and fill from buffer */	bdp = pinfo->tx_cur;	while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) {		count = 0;		p = bus_to_virt(bdp->cbd_bufaddr);		while (count < pinfo->tx_fifosize) {			*p++ = xmit->buf[xmit->tail];			xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);			port->icount.tx++;			count++;			if (xmit->head == xmit->tail)				break;		}		bdp->cbd_datlen = count;		bdp->cbd_sc |= BD_SC_READY;		/* Get next BD. */		if (bdp->cbd_sc & BD_SC_WRAP)			bdp = pinfo->tx_bd_base;		else			bdp++;	}	pinfo->tx_cur = bdp;	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)		uart_write_wakeup(port);	if (uart_circ_empty(xmit)) {		cpm_uart_stop_tx(port, 0);		return 0;	}	return 1;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/311c46273f0e8b140d4cc68e13128cbc22114807/cpm_uart_core.c/clean/drivers/serial/cpm_uart/cpm_uart_core.c