Exemple #1
0
static void l4ser_shm_tx_chars(struct uart_port *port)
{
	struct l4ser_shm_uart_port *l4port = (struct l4ser_shm_uart_port *)port;
	struct circ_buf *xmit = &port->state->xmit;
	int c, do_trigger = 0;

	struct tty_struct *tty = port->state->port.tty;
	tty->hw_stopped = 0;
	tty->stopped = 0;

	if (port->x_char) {
		if (tx_buf(port, &port->x_char, 1)) {
			L4XV_V(f);
			port->icount.tx++;
			port->x_char = 0;
			L4XV_L(f);
			l4shmc_trigger(&l4port->tx_sig);
			L4XV_U(f);
		}
		return;
	}

	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
		return;
	}

	while (!uart_circ_empty(xmit)) {
		unsigned long r;
		c = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
		if (!(r = tx_buf(port, &xmit->buf[xmit->tail], c)))
			break;
		xmit->tail = (xmit->tail + r) & (UART_XMIT_SIZE - 1);
		port->icount.tx += r;
		do_trigger = 1;
	}

	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
		uart_write_wakeup(port);

	if (do_trigger) {
		L4XV_V(f);
		L4XV_L(f);
		l4shmc_trigger(&l4port->tx_sig);
		L4XV_U(f);
	}
}
Exemple #2
0
int collision (void)
{
    unsigned short csr, sta;

    /* tell G64 to start bounce with LRR and BRD set */
    print (2, "\rTest Remote collision:\n");
    csr = LRREQ_BIT + BRDIS_BIT;
    if (set_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in set LRR+BRD");
    print (2, "LRR + BRD set in RT\r");

    /* test first the receive buffer */
    csr = RB_BIT;
    if (set_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in set RB");
    if (wait_for_csr (TB_BIT, TB_BIT, 60, 1) == 0) {
	print (1, "Erreur de synchro. Le RT n'a pas mits son bit TB a 1\n");
	erreur++;
	return (1);
    }
    print (1, "Test du receive buffer");

    rx_buf ();			/* test receive buffer */
    rx_buf ();			/* test receive buffer */
    rx_buf ();			/* test receive buffer */
    print (1, "\n");
    csr = RB_BIT;
    if (clr_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in clr RB");

    /* Wait for the end of the G64 */
    if (wait_for_csr (TB_BIT, 0, 60, 1) == 0) {
	print (1, "Erreur de synchro. Le RT n'a pas mis son bit TB a 0\n");
	erreur++;
	return (1);
    }

    /* Then test the transmit buffer */
    csr = TB_BIT;
    if (set_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in set TB");
    if (wait_for_csr (RB_BIT, RB_BIT, 60, 1) == 0) {
	print (1, "Erreur de synchro. Le RT n'a pas mits son bit RB a 1\n");
	erreur++;
	return (1);
    }
    print (1, "Test du transmit buffer");
    tx_buf ();			/* test transmit buffer */
    tx_buf ();			/* test transmit buffer */
    tx_buf ();			/* test transmit buffer */
    print (1, "\n");
    csr = TB_BIT;
    if (clr_csr (bc, rt, &csr, &sta) == -1)
	BAD1 ("system error in clr TB");

    /* Wait for the end of the G64 */
    if (wait_for_csr (RB_BIT, 0, 60, 1) == 0) {
	print (1, "Erreur de synchro. Le RT n'a pas mis son bit RB a 0\n");
	return (1);
    }

    /* clear collision pattern LRR and BRD set */
    csr = LRREQ_BIT + BRDIS_BIT;
    if (clr_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in clr LRR+BRD");

    if (get_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in get_csr");
    if ((csr & INV_BIT) == INV_BIT) {
	print (0, "Le G64 a detecte une ou plusieurs erreurs au cours du test collision\n");
	erreur++;
	csr = INV_BIT;
	if (clr_csr (bc, rt, &csr, &status) == -1)
	    BAD1 ("system error in clr INV");
	if (t_err)
	    return t_err;
    }
    return (erreur);
}