FAILED: patch "[PATCH] Bluetooth: hci_uart: clear HCI_UART_SENDING when write_work" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 1b0d946d6f08bd39211385bc703a440911b41e46
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026071338-cut-deflected-2e46@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1b0d946d6f08bd39211385bc703a440911b41e46 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <[email protected]>
Date: Sat, 13 Jun 2026 21:43:37 +0300
Subject: [PATCH] Bluetooth: hci_uart: clear HCI_UART_SENDING when write_work
is canceled
HCI_UART_SENDING bit in tx_state means write_work is pending and blocks queueing it again. Currently this bit is not cleared when canceling the work in hci_uart_close(), which blocks future writes when device is reopened later if write_work was pending.
Fix by clearing HCI_UART_SENDING when canceling the work.
Also make clearing of tx_skb safe by using disable_work_sync + enable_work instead of just cancel_work_sync. hci_uart_flush() purges the proto tx queue so we can cancel the pending write_work there, instead of doing it just in hci_uart_close(). Re-enable and possibly requeue the work after queue flush.
drivers/bluetooth/hci_ldisc.c +10 -4
@@ -239,6 +239,8 @@ static int hci_uart_flush(struct hci_dev *hdev)BT_DBG ("hdev %p tty %p" , hdev, tty); +disable_work_sync (&hu->write_work); +if (hu->tx_skb) {kfree_skb (hu->tx_skb); hu->tx_skb =NULL ; }
@@ -254,6 +256,14 @@ static int hci_uart_flush(struct hci_dev *hdev)percpu_up_read (&hu->proto_lock); +/* Resume TX. Also reschedule in case work was queued concurrently; +* this may schedule write_work although there's nothing to do. +*/ +enable_work (&hu->write_work); +clear_bit (HCI_UART_SENDING , &hu->tx_state); +if (test_bit (HCI_UART_TX_WAKEUP , &hu->tx_state)) +hci_uart_tx_wakeup (hu); +return 0 ; }
@@ -271,12 +281,8 @@ static int hci_uart_open(struct hci_dev *hdev)/* Close device */ static int hci_uart_close (struct hci_dev *hdev) { -struct hci_uart *hu =hci_get_drvdata (hdev); -BT_DBG ("hdev %p" , hdev); -cancel_work_sync (&hu->write_work); -hci_uart_flush (hdev); hdev->flush =NULL ;return 0 ;