Последовательный драйвер start_tx () Операция, вызываемая дважды для одной записи - PullRequest
2 голосов
/ 23 марта 2012

При каких обстоятельствах операция uart_ops.start_tx () может быть вызвана дважды подряд в последовательном драйвере Linux 2.6?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Не должно быть никаких проблем, называя это в быстрой последовательности любое количество раз. Если это сделано конкурирующими процессорами, start_tx() делает спин-блокировку на port->lock. Если это делается последовательно, специфичный для uart драйвер проверяет, запущен ли он уже. (От linux-2.6.27.8/drivers/mmc/card/sdio_uart.c):

    if (!(port->ier & UART_IER_THRI)) {
            port->ier |= UART_IER_THRI;
            sdio_out(port, UART_IER, port->ier);
    }

С точки зрения более высокого уровня, последовательное ядро ​​проверяет, запущен ли передатчик, а также на правильность его запуска (linux-2.6.27.8/drivers/serial/serial_core.c):

static void __uart_start(struct tty_struct *tty)
{
        struct uart_state *state = tty->driver_data;
        struct uart_port *port = state->port;

        if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf &&
            !tty->stopped && !tty->hw_stopped)
                port->ops->start_tx(port);
}
0 голосов
/ 22 февраля 2013

Я работаю в этой области на старом ядре, 2.6.10. Я также видел 2 (или более) вызова функции драйвера start_tx, получивших одну «запись» в пространстве пользователя. Через STY я отключил любой «опост» в слое tty. После этого я видел только один start_tx для каждой записи. Я подозреваю, что слой дисциплины линии добавляет вызовы start_tx.

Анекдот, я знаю, но подумал, что это может помочь.

...