]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
Bluetooth: btmtksdio: mask out interrupt status
authorSean Wang <sean.wang@mediatek.com>
Wed, 12 Jan 2022 07:39:17 +0000 (15:39 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 11:57:57 +0000 (13:57 +0200)
[ Upstream commit db3f1f9b5d88d8d7f9eaa486f71784dd319285ff ]

Currently, there is a loop in btmtksdio_txrx_work() which iteratively
executes until the variable int_status is zero.

But the variable int_status should be masked out with the actual interrupt
sources (MTK_REG_CHISR bit 0-15) before we check the loop condition.
Otherwise, RX_PKT_LEN (MTK_REG_CHISR bit 16-31) which is read-only and
unclearable would cause the loop to get stuck on some chipsets like
MT7663s.

Fixes: 26270bc189ea ("Bluetooth: btmtksdio: move interrupt service to work")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bluetooth/btmtksdio.c

index 72e00264d9f185a504d40c6fcbb3a0f9a3759911..86a52eb77e01b46fd04382c3ed909c1b3cffb57b 100644 (file)
@@ -92,6 +92,7 @@ MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
 #define TX_EMPTY               BIT(2)
 #define TX_FIFO_OVERFLOW       BIT(8)
 #define FW_MAILBOX_INT         BIT(15)
+#define INT_MASK               GENMASK(15, 0)
 #define RX_PKT_LEN             GENMASK(31, 16)
 
 #define MTK_REG_CSICR          0xc0
@@ -565,6 +566,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
                 * FIFO.
                 */
                sdio_writel(bdev->func, int_status, MTK_REG_CHISR, NULL);
+               int_status &= INT_MASK;
 
                if ((int_status & FW_MAILBOX_INT) &&
                    bdev->data->chipid == 0x7921) {