From 81cba0be7e27777f629370ecab5f065fdf47eca9 Mon Sep 17 00:00:00 2001 From: Brian Gix Date: Tue, 28 Jul 2020 17:24:49 -0700 Subject: [PATCH] mesh: Add guard against wedging outbound queue When using HCI command chains, the first packet send that starts an outbound sequence needs to still exist when command chain completes, or the outbound queue will wedge. The simplest solution is to send packets at least twice on an empty queue, if there is a chance it could be canceled. --- mesh/mesh-io-generic.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mesh/mesh-io-generic.c b/mesh/mesh-io-generic.c index 86952516e..4b26b1181 100644 --- a/mesh/mesh-io-generic.c +++ b/mesh/mesh-io-generic.c @@ -714,6 +714,14 @@ static bool send_tx(struct mesh_io *io, struct mesh_io_send_info *info, sending = !l_queue_isempty(pvt->tx_pkts); l_queue_push_tail(pvt->tx_pkts, tx); + + /* + * If transmitter is idle, send packets at least twice to + * guard against in-line cancelation of HCI command chain. + */ + if (info->type == MESH_IO_TIMING_TYPE_GENERAL && !sending && + tx->info.u.gen.cnt == 1) + tx->info.u.gen.cnt++; } if (!sending) { -- 2.47.3