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); } }
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); }