This will help to check the status of protocol while dequeuing an
skb packet. In some instaces we will end up kernel crash,
where proto close is called and we trying to dequeue an packet.
[ 500.142902] [<
ffffff80080f9ce4>] do_raw_spin_lock+0x1c/0xe0
[ 500.148643] [<
ffffff80088f1c7c>] _raw_spin_lock_irqsave+0x38/0x48
[ 500.154917] [<
ffffff8008780ce8>] skb_dequeue+0x28/0x84
[ 500.160209] [<
ffffff8000ad6f48>] 0xffffff8000ad6f48
[ 500.165230] [<
ffffff8000ad6610>] 0xffffff8000ad6610
[ 500.170257] [<
ffffff80080c7ce8>] process_one_work+0x238/0x3e4
[ 500.176174] [<
ffffff80080c8330>] worker_thread+0x2bc/0x3d4
[ 500.181821] [<
ffffff80080cdabc>] kthread+0x138/0x140
[ 500.186945] [<
ffffff80080844e0>] ret_from_fork+0x10/0x18
Signed-off-by: Balakrishna Godavarthi <bgodavar@codeaurora.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
{
struct sk_buff *skb = hu->tx_skb;
- if (!skb)
- skb = hu->proto->dequeue(hu);
- else
+ if (!skb) {
+ if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
+ skb = hu->proto->dequeue(hu);
+ } else
hu->tx_skb = NULL;
return skb;