Applied On Wed, 2020-07-29 at 08:52 -0700, Brian Gix wrote: > 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) {