mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 15:51:30 -05:00
Bluetooth: hci_h5: avoid sending two SYNC messages
Previously, h5_open() called h5_link_control() to send a SYNC message. But h5_link_control() only enqueues the packet and requires the caller to call hci_uart_tx_wakeup(). Thus, after H5_SYNC_TIMEOUT ran out (100ms), h5_timed_event() would be called and, realizing that the state was still H5_UNINITIALIZED, it would re-enqueue the SYNC and call hci_uart_tx_wakeup(). Consequently, two SYNC packets would be sent and initialization would unnecessarily wait for 100ms. The naive solution of calling hci_uart_tx_wakeup() in h5_open() does not work because it will only schedule tx work if the HCI_PROTO_READY bit is set and hci_serdev only sets it after h5_open() returns. This patch removes the extraneous SYNC being enqueued and makes h5_timed_event() wake up on the next jiffy. Signed-off-by: Javier Nieto <jgnieto@cs.stanford.edu> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
committed by
Luiz Augusto von Dentz
parent
484f117689
commit
01622e9a53
@@ -213,7 +213,6 @@ static void h5_peer_reset(struct hci_uart *hu)
|
||||
static int h5_open(struct hci_uart *hu)
|
||||
{
|
||||
struct h5 *h5;
|
||||
const unsigned char sync[] = { 0x01, 0x7e };
|
||||
|
||||
BT_DBG("hu %p", hu);
|
||||
|
||||
@@ -243,9 +242,11 @@ static int h5_open(struct hci_uart *hu)
|
||||
|
||||
set_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags);
|
||||
|
||||
/* Send initial sync request */
|
||||
h5_link_control(hu, sync, sizeof(sync));
|
||||
mod_timer(&h5->timer, jiffies + H5_SYNC_TIMEOUT);
|
||||
/*
|
||||
* Wait one jiffy because the UART layer won't set HCI_UART_PROTO_READY,
|
||||
* which allows us to send link packets, until this function returns.
|
||||
*/
|
||||
mod_timer(&h5->timer, jiffies + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user