Anyone using wait_until_sent?

Anyone successfully using wait_until_sent? We need have a gap between messages on a 2 wire RS485 line. Getting an opps. Not doing locking in the ko. Here is a trace:

colibri-vf login: [   54.924891] mstp: Device ttyLP2 set to MS/TP @ 38400
[   54.930275] mstp: Setting Nmax_master to 127
[   54.938882] mstp: Setting Nmax_info_frames to 9
[   54.944928] mstp: Setting This_Station to 5
[   54.949418] mstp: Setting Tusage_timeout to 30
[   55.499888] BUG: scheduling while atomic: swapper/0/0x00000100
[   55.505822] Modules linked in: mstp(O) ad7793 [last unloaded: ad7793]
[   55.512543] CPU: 0 PID: 0 Comm: swapper Tainted: G           O    4.1.15-ge3c858e-dirty #144
[   55.521099] Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
[   55.527616] Backtrace:
[   55.530244] [<80012aec>] (dump_backtrace) from [<80012d0c>] (show_stack+0x18/0x1c)
[   55.537898]  r7:8083ddc0 r6:80802310 r5:807f9cd4 r4:00000000
[   55.543888] [<80012cf4>] (show_stack) from [<80586900>] (dump_stack+0x24/0x28)
[   55.551218] [<805868dc>] (dump_stack) from [<8003efa0>] (__schedule_bug+0x54/0x64)
[   55.558888] [<8003ef4c>] (__schedule_bug) from [<80587bd8>] (__schedule+0x36c/0x4bc)
[   55.566700]  r5:807f9cd4 r4:807fe4b0
[   55.570452] [<8058786c>] (__schedule) from [<80587d6c>] (schedule+0x44/0x9c)
[   55.577574]  r9:00000000 r8:8083ddc0 r7:8083ddc0 r6:80802cd0 r5:807f9cd4 r4:807f8000
[   55.585715] [<80587d28>] (schedule) from [<80589e90>] (schedule_timeout+0xe4/0x158)
[   55.593444]  r5:807f9cd4 r4:fffc44ed
[   55.597191] [<80589dac>] (schedule_timeout) from [<800563ec>] (msleep_interruptible+0x4c/0x80)
[   55.605876]  r9:00000005 r8:807f8030 r7:80802cd0 r6:00000001 r5:fffc44ed r4:807f8018
[   55.614031] [<800563a0>] (msleep_interruptible) from [<802fddbc>] (uart_wait_until_sent+0x90/0xec)
[   55.623058]  r5:fffc44ed r4:87a0b010
[   55.626871] [<802fdd2c>] (uart_wait_until_sent) from [<7f00d6ac>] (SendFrame+0x160/0x278 [mstp])
[   55.635733]  r9:00000005 r8:00000008 r7:00000008 r6:85dbd200 r5:00000008 r4:7f00ed8c
[   55.643907] [<7f00d54c>] (SendFrame [mstp]) from [<7f00da68>] (MasterNodeStateMachine+0x2a4/0xa10 [mstp])
[   55.653548]  r10:8083ddc0 r9:8083e7d8 r8:00000000 r7:00000005 r6:00000000 r5:7f00ebec
[   55.661743]  r4:7f00ed8c r3:00000000
[   55.665517] [<7f00d7c4>] (MasterNodeStateMachine [mstp]) from [<7f00e1f4>] (mstpWork.part.2+0x20/0x48 [mstp])
[   55.675506]  r10:8083ddc0 r9:8083e7d8 r8:8083e5d8 r7:80802cd0 r6:7f00e21c r5:00000100
[   55.683701]  r4:7f00ed8c
[   55.686380] [<7f00e1d4>] (mstpWork.part.2 [mstp]) from [<7f00e2e0>] (mstp_timer_function+0xc4/0x114 [mstp])
[   55.696192]  r5:00000100 r4:7f00ed8c
[   55.699997] [<7f00e21c>] (mstp_timer_function [mstp]) from [<80056038>] (call_timer_fn+0x2c/0xa0)
[   55.708951]  r7:80802cd0 r6:7f00e21c r5:00000100 r4:807f9e28
[   55.714911] [<8005600c>] (call_timer_fn) from [<800565a0>] (run_timer_softirq+0x180/0x1f4)
[   55.723248]  r6:00200200 r5:00000000 r4:807f9e28
[   55.728103] [<80056420>] (run_timer_softirq) from [<80026834>] (__do_softirq+0x118/0x23c)
[   55.736355]  r10:40000001 r9:8082c1c0 r8:00000100 r7:807f8000 r6:8082c1c4 r5:00000001
[   55.744555]  r4:00000000
[   55.747196] [<8002671c>] (__do_softirq) from [<80026bec>] (irq_exit+0xb8/0x100)
[   55.754581]  r10:807fa0d4 r9:8081f930 r8:87806000 r7:00000000 r6:00000000 r5:00000010
[   55.762776]  r4:8080b3b4
[   55.765427] [<80026b34>] (irq_exit) from [<8004cd38>] (__handle_domain_irq+0x60/0xb0)
[   55.773333]  r5:00000010 r4:8080b3b4
[   55.777090] [<8004ccd8>] (__handle_domain_irq) from [<80009364>] (gic_handle_irq+0x2c/0x5c)
[   55.785512]  r9:8081f930 r8:807fa0cc r7:88002100 r6:807f9f20 r5:807fa364 r4:8800210c
[   55.793648] [<80009338>] (gic_handle_irq) from [<80013780>] (__irq_svc+0x40/0x54)
[   55.801261] Exception stack(0x807f9f20 to 0x807f9f68)
[   55.806413] 9f20: 00000001 00000000 00000000 8001d5e0 807f8000 807fa0cc 00000000 00000000
[   55.814685] 9f40: 807fa0cc 8081f930 807fa0d4 807f9f74 807f9f78 807f9f68 8000ffa8 8000ffac
[   55.822924] 9f60: 60080013 ffffffff
[   55.826477]  r7:807f9f54 r6:ffffffff r5:60080013 r4:8000ffac
[   55.832446] [<8000ff6c>] (arch_cpu_idle) from [<80045fc4>] (cpu_startup_entry+0x1c8/0x254)
[   55.840823] [<80045dfc>] (cpu_startup_entry) from [<80585174>] (rest_init+0x78/0x7c)
[   55.848660]  r7:ffffffff
[   55.851310] [<805850fc>] (rest_init) from [<80768cd4>] (start_kernel+0x390/0x39c)
[   55.858884] [<80768944>] (start_kernel) from [<80008078>] (0x80008078)
[   55.865493] bad: scheduling from the idle thread!
[   55.870285] CPU: 0 PID: 0 Comm: swapper Tainted: G        W  O    4.1.15-ge3c858e-dirty #144
[   55.878782] Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
[   55.885286] Backtrace:
[   55.887886] [<80012aec>] (dump_backtrace) from [<80012d0c>] (show_stack+0x18/0x1c)
[   55.895524]  r7:00000000 r6:00000000 r5:80802310 r4:807fe4b0
[   55.901474] [<80012cf4>] (show_stack) from [<80586900>] (dump_stack+0x24/0x28)
[   55.908803] [<805868dc>] (dump_stack) from [<80042ad4>] (dequeue_task_idle+0x20/0x28)
[   55.916730] [<80042ab4>] (dequeue_task_idle) from [<8003f21c>] (dequeue_task+0x80/0xc4)
[   55.924827] [<8003f19c>] (dequeue_task) from [<80040164>] (deactivate_task+0x30/0x34)
[   55.932724]  r9:00000000 r8:807fe6fc r7:8083ddc0 r6:80802310 r5:807f9cd4 r4:807fe4b0
[   55.940849] [<80040134>] (deactivate_task) from [<80587a54>] (__schedule+0x1e8/0x4bc)
[   55.948772] [<8058786c>] (__schedule) from [<80587d6c>] (schedule+0x44/0x9c)
[   55.955887]  r9:00000000 r8:8083ddc0 r7:8083ddc0 r6:80802cd0 r5:807f9cd4 r4:807f8000
[   55.964019] [<80587d28>] (schedule) from [<80589e90>] (schedule_timeout+0xe4/0x158)
[   55.971741]  r5:807f9cd4 r4:fffc44ed
[   55.975502] [<80589dac>] (schedule_timeout) from [<800563ec>] (msleep_interruptible+0x4c/0x80)
[   55.984183]  r9:00000005 r8:807f8030 r7:80802cd0 r6:00000001 r5:fffc44ed r4:807f8018
[   55.992312] [<800563a0>] (msleep_interruptible) from [<802fddbc>] (uart_wait_until_sent+0x90/0xec)
[   56.001341]  r5:fffc44ed r4:87a0b010
[   56.005122] [<802fdd2c>] (uart_wait_until_sent) from [<7f00d6ac>] (SendFrame+0x160/0x278 [mstp])
[   56.013985]  r9:00000005 r8:00000008 r7:00000008 r6:85dbd200 r5:00000008 r4:7f00ed8c
[   56.022199] [<7f00d54c>] (SendFrame [mstp]) from [<7f00da68>] (MasterNodeStateMachine+0x2a4/0xa10 [mstp])
[   56.031844]  r10:8083ddc0 r9:8083e7d8 r8:00000000 r7:00000005 r6:00000000 r5:7f00ebec
[   56.040039]  r4:7f00ed8c r3:00000000
[   56.043850] [<7f00d7c4>] (MasterNodeStateMachine [mstp]) from [<7f00e1f4>] (mstpWork.part.2+0x20/0x48 [mstp])
[   56.053838]  r10:8083ddc0 r9:8083e7d8 r8:8083e5d8 r7:80802cd0 r6:7f00e21c r5:00000100
[   56.062040]  r4:7f00ed8c
[   56.064748] [<7f00e1d4>] (mstpWork.part.2 [mstp]) from [<7f00e2e0>] (mstp_timer_function+0xc4/0x114 [mstp])
[   56.074568]  r5:00000100 r4:7f00ed8c
[   56.078351] [<7f00e21c>] (mstp_timer_function [mstp]) from [<80056038>] (call_timer_fn+0x2c/0xa0)
[   56.087300]  r7:80802cd0 r6:7f00e21c r5:00000100 r4:807f9e28
[   56.093251] [<8005600c>] (call_timer_fn) from [<800565a0>] (run_timer_softirq+0x180/0x1f4)
[   56.101580]  r6:00200200 r5:00000000 r4:807f9e28
[   56.106420] [<80056420>] (run_timer_softirq) from [<80026834>] (__do_softirq+0x118/0x23c)
[   56.114684]  r10:40000001 r9:8082c1c0 r8:00000100 r7:807f8000 r6:8082c1c4 r5:00000001
[   56.122875]  r4:00000000
[   56.125506] [<8002671c>] (__do_softirq) from [<80026bec>] (irq_exit+0xb8/0x100)
[   56.132888]  r10:807fa0d4 r9:8081f930 r8:87806000 r7:00000000 r6:00000000 r5:00000010
[   56.141092]  r4:8080b3b4
[   56.143770] [<80026b34>] (irq_exit) from [<8004cd38>] (__handle_domain_irq+0x60/0xb0)
[   56.151687]  r5:00000010 r4:8080b3b4
[   56.155435] [<8004ccd8>] (__handle_domain_irq) from [<80009364>] (gic_handle_irq+0x2c/0x5c)
[   56.163853]  r9:8081f930 r8:807fa0cc r7:88002100 r6:807f9f20 r5:807fa364 r4:8800210c
[   56.171985] [<80009338>] (gic_handle_irq) from [<80013780>] (__irq_svc+0x40/0x54)
[   56.179540] Exception stack(0x807f9f20 to 0x807f9f68)
[   56.184687] 9f20: 00000001 00000000 00000000 8001d5e0 807f8000 807fa0cc 00000000 00000000
[   56.192947] 9f40: 807fa0cc 8081f930 807fa0d4 807f9f74 807f9f78 807f9f68 8000ffa8 8000ffac
[   56.201190] 9f60: 60080013 ffffffff
[   56.204743]  r7:807f9f54 r6:ffffffff r5:60080013 r4:8000ffac
[   56.210727] [<8000ff6c>] (arch_cpu_idle) from [<80045fc4>] (cpu_startup_entry+0x1c8/0x254)
[   56.219102] [<80045dfc>] (cpu_startup_entry) from [<80585174>] (rest_init+0x78/0x7c)
[   56.226913]  r7:ffffffff
[   56.229560] [<805850fc>] (rest_init) from [<80768cd4>] (start_kernel+0x390/0x39c)
[   56.237137] [<80768944>] (start_kernel) from [<80008078>] (0x80008078)
[   56.244812] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[   56.252935] pgd = 85c3c000
[   56.255651] [00000000] *pgd=00000000
[   56.259273] Internal error: Oops: 80000005 [#1] ARM
[   56.264159] Modules linked in: mstp(O) ad7793 [last unloaded: ad7793]
[   56.270689] CPU: 0 PID: 62 Comm: systemd-journal Tainted: G        W  O    4.1.15-ge3c858e-dirty #144
[   56.279912] Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
[   56.286362] task: 85cd44c0 ti: 85ce2000 task.ti: 85ce2000
[   56.291777] PC is at 0x0
[   56.294336] LR is at enqueue_task+0x44/0x80
[   56.298536] pc : [<00000000>]    lr : [<8003f160>]    psr: 60070193
[   56.298536] sp : 85ce3c18  ip : 80802720  fp : 85ce3c3c
[   56.310021] r10: 8083ddc0  r9 : 8083e7d8  r8 : 8083e5d8
[   56.315254] r7 : 0000000d  r6 : 1872e697  r5 : 60070113  r4 : 80802310
[   56.321785] r3 : 00000000  r2 : 00000001  r1 : 807fe4b0  r0 : 80802310
[   56.328321] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   56.335553] Control: 10c5387d  Table: 85c3c059  DAC: 00000015
[   56.341312] Process systemd-journal (pid: 62, stack limit = 0x85ce2208)
[   56.347930] Stack: (0x85ce3c18 to 0x85ce4000)
[   56.352298] 3c00:                                                       00000001 807fe4b0
[   56.360494] 3c20: 80055c30 807fe4b0 80055ff8 80802cd0 85ce3c4c 85ce3c40 80040130 8003f128
[   56.368691] 3c40: 85ce3c6c 85ce3c50 80040344 8004010c 7f00e21c 80802cd0 807fe4b0 00000100
[   56.376888] 3c60: 85ce3c84 85ce3c70 80040444 80040304 85ce3cc8 00000100 85ce3c94 85ce3c88
[   56.385085] 3c80: 80056008 80040424 85ce3cbc 85ce3c98 80056038 80056004 800267c4 20070113
[   56.393282] 3ca0: 00000000 85ce3cc8 00000000 00200200 85ce3cfc 85ce3cc0 800565a0 80056018
[   56.401479] 3cc0: 8082c180 8083e9d8 85ce3cc8 85ce3cc8 00000000 00000000 00000001 8082c1c4
[   56.409677] 3ce0: 85ce2000 00000100 8082c1c0 40000001 85ce3d5c 85ce3d00 80026834 8005642c
[   56.417873] 3d00: 00000010 87cd8140 00000000 00400100 80802cd0 fffc47d6 8058ce88 0000000a
[   56.426071] 3d20: 8082c180 808027c8 8082c1c0 85ce2000 80050298 8080b3b4 00000010 00000000
[   56.434268] 3d40: 807f9f20 87806000 00000000 875c5180 85ce3d74 85ce3d60 80026bec 80026728
[   56.442465] 3d60: 8080b3b4 00000010 85ce3d9c 85ce3d78 8004cd38 80026b40 8800210c 807fa364
[   56.450663] 3d80: 85ce3dc0 88002100 00000000 00000000 85ce3dbc 85ce3da0 80009364 8004cce4
[   56.458859] 3da0: 8021eb60 60070013 ffffffff 85ce3df4 85ce3e34 85ce3dc0 80013780 80009344
[   56.467056] 3dc0: 87b3b000 00000000 0001c720 00000000 85ce3e6c 87b3b000 87b3b640 87b3b630
[   56.475253] 3de0: 00000000 00000000 875c5180 85ce3e34 00000000 85ce3e08 8020704c 8021eb60
[   56.483450] 3e00: 60070013 ffffffff 00000000 00000000 00000000 00000001 87b3b000 85ce3e6c
[   56.491648] 3e20: 875c52c0 00000000 85ce3eac 85ce3e38 8020704c 8021ea58 80298728 80297d4c
[   56.499845] 3e40: 85ce3e64 00000044 8083221c 80802a68 00400000 00000000 85ce3edc 85ce3e68
[   56.508042] 3e60: 800498f0 80589128 00000117 00100000 00000000 00000000 00000000 000000a0
[   56.516239] 3e80: 800551cc 00002068 875c5180 85ce3ef8 85ce3ec0 875c3660 00000000 000081a0
[   56.524437] 3ea0: 85ce3ef4 85ce3eb0 800dba6c 80206cac 00000000 85c9eb40 85ce3f80 85ce3f80
[   56.532634] 3ec0: 565d667e 00000000 85ce2000 875c3660 85da4c00 00400000 00000000 00000000
[   56.540831] 3ee0: 875c5180 875c3660 85ce3f4c 85ce3ef8 800c17a0 800db908 00002068 85ce3f88
[   56.549028] 3f00: 185e5abf 00000107 00400000 00000000 565d667e 00000000 565d667e 00000000
[   56.557225] 3f20: 565d667e 00000000 85da4c00 85da4c00 85da4c00 85da4c00 00400000 00000000
[   56.565422] 3f40: 85ce3f8c 85ce3f50 800c1b64 800c1728 00000060 85da4c00 8005892c 8005bf70
[   56.573619] 3f60: 00000038 00000000 7e9726ec 5675b6a0 000000c2 8000f7a4 85ce2000 00000000
[   56.581816] 3f80: 85ce3fa4 85ce3f90 800c1c54 800c1a50 00000000 7e9723c4 00000000 85ce3fa8
[   56.590013] 3fa0: 8000f600 800c1c44 00000000 7e9726ec 0000000d 00000000 00400000 00000000
[   56.598211] 3fc0: 00000000 7e9726ec 5675b6a0 000000c2 00000009 00000009 e00e81aa e2cbbb21
[   56.606408] 3fe0: 54b8be80 7e972334 54b668f9 76eb0b64 60070010 0000000d 00000000 00000000
[   56.614586] Backtrace:
[   56.617075] [<8003f11c>] (enqueue_task) from [<80040130>] (activate_task+0x30/0x34)
[   56.624740]  r7:80802cd0 r6:80055ff8 r4:807fe4b0
[   56.629431] [<80040100>] (activate_task) from [<80040344>] (try_to_wake_up+0x4c/0x120)
[   56.637368] [<800402f8>] (try_to_wake_up) from [<80040444>] (wake_up_process+0x2c/0x44)
[   56.645374]  r5:00000100 r4:807fe4b0
[   56.649019] [<80040418>] (wake_up_process) from [<80056008>] (process_timeout+0x10/0x14)
[   56.657111]  r5:00000100 r4:85ce3cc8
[   56.660740] [<80055ff8>] (process_timeout) from [<80056038>] (call_timer_fn+0x2c/0xa0)
[   56.668678] [<8005600c>] (call_timer_fn) from [<800565a0>] (run_timer_softirq+0x180/0x1f4)
[   56.676950]  r6:00200200 r5:00000000 r4:85ce3cc8
[   56.681649] [<80056420>] (run_timer_softirq) from [<80026834>] (__do_softirq+0x118/0x23c)
[   56.689829]  r10:40000001 r9:8082c1c0 r8:00000100 r7:85ce2000 r6:8082c1c4 r5:00000001
[   56.697748]  r4:00000000
[   56.700307] [<8002671c>] (__do_softirq) from [<80026bec>] (irq_exit+0xb8/0x100)
[   56.707621]  r10:875c5180 r9:00000000 r8:87806000 r7:807f9f20 r6:00000000 r5:00000010
[   56.715539]  r4:8080b3b4
[   56.718107] [<80026b34>] (irq_exit) from [<8004cd38>] (__handle_domain_irq+0x60/0xb0)
[   56.725941]  r5:00000010 r4:8080b3b4
[   56.729577] [<8004ccd8>] (__handle_domain_irq) from [<80009364>] (gic_handle_irq+0x2c/0x5c)
[   56.737928]  r9:00000000 r8:00000000 r7:88002100 r6:85ce3dc0 r5:807fa364 r4:8800210c
[   56.745769] [<80009338>] (gic_handle_irq) from [<80013780>] (__irq_svc+0x40/0x54)
[   56.753260] Exception stack(0x85ce3dc0 to 0x85ce3e08)
[   56.758330] 3dc0: 87b3b000 00000000 0001c720 00000000 85ce3e6c 87b3b000 87b3b640 87b3b630
[   56.766526] 3de0: 00000000 00000000 875c5180 85ce3e34 00000000 85ce3e08 8020704c 8021eb60
[   56.774711] 3e00: 60070013 ffffffff
[   56.778202]  r7:85ce3df4 r6:ffffffff r5:60070013 r4:8021eb60
[   56.783954] [<8021ea4c>] (ubifs_release_budget) from [<8020704c>] (ubifs_setattr+0x3ac/0x42c)
[   56.792481]  r9:00000000 r8:875c52c0 r7:85ce3e6c r6:87b3b000 r5:00000001 r4:00000000
[   56.800341] [<80206ca0>] (ubifs_setattr) from [<800dba6c>] (notify_change+0x170/0x348)
[   56.808259]  r10:000081a0 r9:00000000 r8:875c3660 r7:85ce3ec0 r6:85ce3ef8 r5:875c5180
[   56.816168]  r4:00002068
[   56.818745] [<800db8fc>] (notify_change) from [<800c17a0>] (do_truncate+0x84/0xa8)
[   56.826319]  r10:875c3660 r9:875c5180 r8:00000000 r7:00000000 r6:00400000 r5:85da4c00
[   56.834237]  r4:875c3660
[   56.836800] [<800c171c>] (do_truncate) from [<800c1b64>] (do_sys_ftruncate+0x120/0x198)
[   56.844804]  r7:00000000 r6:00400000 r5:85da4c00 r4:85da4c00
[   56.850540] [<800c1a44>] (do_sys_ftruncate) from [<800c1c54>] (SyS_ftruncate64+0x1c/0x24)
[   56.858717]  r10:00000000 r9:85ce2000 r8:8000f7a4 r7:000000c2 r6:5675b6a0 r5:7e9726ec
[   56.866635]  r4:00000000
[   56.869212] [<800c1c38>] (SyS_ftruncate64) from [<8000f600>] (ret_fast_syscall+0x0/0x3c)
[   56.877317] Code: bad PC value
[   56.880393] ---[ end trace 1c27de18a5dfd773 ]---
[   56.885021] Kernel panic - not syncing: Fatal exception in interrupt
[   56.891388] ---[ end Kernel panic - not syncing: Fatal exception in interrupt

Thanks,
Paul

This is the line that looks like the source of my problems: BUG: scheduling while atomic:

Found patches that fixed this. Summary of kernel changes:
/drivers/tty/tty_buffer.c, change to tty_flip_buffer_push().
/drivers/tty/serial/serial_core.c , replace call to msleep_interruptible with call to udelay
/drivers/tty/serial/fsl_lpuart.c, added printk to lpuart_probe for checking lpuart/lpuart32 usage

hi Paul, is the issue solved now.