Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: hci_h5: Complements reliable packet processing logic

As shown in the schematic diagram below.There may be a critical
scenario in the current code. If the device does not receive an
pure ack sent by the host due to insufficient receive buffer or
other reasons and triggers a retransmission, the host will always
be in an 'out-of-order' state.The state machine will get stuck.

host device
SEQ3,ACK4 --------->
<--------- SEQ4,ACK4
pure ACK ---------> (not received)
(out-of-order) <--------- SEQ4,ACK4(retransmission)
........
(out-of-order) <--------- SEQ4,ACK4(retransmission)

According to the description in the core specification: "whenever
a reliable packet is received, an acknowledgment shall be generated."
So set H5_TX_ACK_REQ bit to trigger retransmission of pure ack packet
when "out-of-order" occurs.

Signed-off-by: Qiqi Zhang <eddy.zhang@rock-chips.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Qiqi Zhang and committed by
Luiz Augusto von Dentz
3c0d41f1 288c9022

+2
+2
drivers/bluetooth/hci_h5.c
··· 463 463 if (H5_HDR_RELIABLE(hdr) && H5_HDR_SEQ(hdr) != h5->tx_ack) { 464 464 bt_dev_err(hu->hdev, "Out-of-order packet arrived (%u != %u)", 465 465 H5_HDR_SEQ(hdr), h5->tx_ack); 466 + set_bit(H5_TX_ACK_REQ, &h5->flags); 467 + hci_uart_tx_wakeup(hu); 466 468 h5_reset_rx(h5); 467 469 return 0; 468 470 }