Hello

i'd like to ask to questions related to serial communication.

1. Is there any reason why DMA is disabled by default in beagle bone black 
serial_omap driver (CONFIG_SERIAL_8250_DMA=n) ?
    Is it safe to recompile it with CONFIG_SERIAL_8250_DMA=y?

2. I encountered board freeze (most probably deadlock but I'm not sure) 
when using pppd and n_gsm to communicate with GSM modem over serial line.
    When I connected to the board from internet and issued some command 
wich output a lot of data, board got stuck but when output little data
    board behaved correctly. After digging into n_gsm driver I discovered 
that board gets stuck when 8250 driver calls gsmld_write_wakeu() indicating 
upper layer (n_gsm)
    that is has room again for new data. n_gsm in return sends more data to 
8250 driver directly in the gsmld_write_wakeup() , which is called from 
interrupt. I thought this could be the source of the deadlog but I didn't 
discover anything wrong. However the problem got treated when I instead of 
directly sending data in  gsmld_write_wakeup()  scheduled tasklet and only 
inside it I sent the data.

Any hint what could be wrong with the original code? The behaviour was the 
same both in 4.19.94-ti-r37 and 4.14.49-ti-r54.
Tank you for any help
regards
Pavel



Instead of

static void gsmld_write_wakeup(struct tty_struct *tty)
{
    struct gsm_mux *gsm = tty->disc_data;
    unsigned long flags;

    /* Queue poll */
    clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
    spin_lock_irqsave(&gsm->tx_lock, flags);
    gsm_data_kick(gsm);
    if (gsm->tx_bytes < TX_THRESH_LO) {
        gsm_dlci_data_sweep(gsm);
    }
    spin_unlock_irqrestore(&gsm->tx_lock, flags);
}




this

static void gsmld_write_wakeup(struct tty_struct *tty)
{
    struct gsm_mux *gsm = tty->disc_data;
 
    /* Queue poll */
    clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
    tasklet_schedule(&gsm->wkup_tasklet);
}

static void wkup_tasklet_handler(unsigned long data)
{
    struct gsm_mux *gsm = (struct gsm_mux *)data;
    unsigned long flags;

    spin_lock_irqsave(&gsm->tx_lock, flags);
    gsm_data_kick(gsm);
    if (gsm->tx_bytes < TX_THRESH_LO) {
        gsm_dlci_data_sweep(gsm);
    }
    spin_unlock_irqrestore(&gsm->tx_lock, flags);
}

this is call stack trace from omap driver up to n_gsm driver resulting in 
freez

[  361.652243] [<bf309b98>] (gsmld_write_wakeup [n_gsm]) from [<c07f7e5c>] 
(tty_wakeup+0x60/0x6c)
[  361.652255] [<c07f7e5c>] (tty_wakeup) from [<c0802ac4>] 
(tty_port_default_wakeup+0x24/0x30)
[  361.652266] [<c0802ac4>] (tty_port_default_wakeup) from [<c0802614>] 
(tty_port_tty_wakeup+0x20/0x24)
[  361.652277] [<c0802614>] (tty_port_tty_wakeup) from [<c081c074>] 
(uart_write_wakeup+0x24/0x2c)
[  361.652288] [<c081c074>] (uart_write_wakeup) from [<c0820460>] 
(serial8250_tx_chars+0x104/0x208)
[  361.652300] [<c0820460>] (serial8250_tx_chars) from [<c0821280>] 
(serial8250_handle_irq.part.11+0xd8/0xdc)
[  361.652312] [<c0821280>] (serial8250_handle_irq.part.11) from 
[<c08212ac>] (serial8250_handle_irq+0x28/0x2c)
[  361.652323] [<c08212ac>] (serial8250_handle_irq) from [<c082359c>] 
(omap8250_irq+0x3c/0x54)
[  361.652336] [<c082359c>] (omap8250_irq) from [<c01af844>] 
(__handle_irq_event_percpu+0x84/0x2d0)
[  361.652349] [<c01af844>] (__handle_irq_event_percpu) from [<c01afacc>] 
(handle_irq_event_percpu+0x3c/0x90)
[  361.652361] [<c01afacc>] (handle_irq_event_percpu) from [<c01afb68>] 
(handle_irq_event+0x48/0x6c)
[  361.652373] [<c01afb68>] (handle_irq_event) from [<c01b3aa8>] 
(handle_level_irq+0xdc/0x158)
[  361.652384] [<c01b3aa8>] (handle_level_irq) from [<c01ae8d4>] 
(generic_handle_irq+0x34/0x44)
[  361.652396] [<c01ae8d4>] (generic_handle_irq) from [<c01aefd4>] 
(__handle_domain_irq+0x8c/0xfc)
[  361.652408] [<c01aefd4>] (__handle_domain_irq) from [<c01022c0>] 
(omap_intc_handle_irq+0x44/0x9c)
[  361.652419] [<c01022c0>] (omap_intc_handle_irq) from [<c0101a0c>] 
(__irq_svc+0x6c/0xa8)

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/47e941c4-17de-4f19-941e-73eaa072c799%40googlegroups.com.

Reply via email to