[PATCH v1] Bluetooth: btmtk: add event filter to filter specific event

Paul Menzel pmenzel at molgen.mpg.de
Tue Apr 7 00:14:29 PDT 2026


Dear Chris,


Thank you for the patch.

Am 07.04.26 um 08:47 schrieb Chris Lu:
> Due to some Bluetooth hosts have mechanism to detect invalid events,
> causing abnormal behavior.

Sorry, this description is much too short and general. Please elaborate, 
and document details.

> Add a event filter to prevent debugging events from being sent to host.

a*n*

What are debugging events, and how can they be detected?

> Signed-off-by: Chris Lu <chris.lu at mediatek.com>

Should there be a Fixes: tag, so it gets backported?

> ---
>   drivers/bluetooth/btmtk.c | 22 ++++++++++++++++++++++
>   drivers/bluetooth/btmtk.h |  7 +++++++
>   drivers/bluetooth/btusb.c |  2 ++
>   3 files changed, 31 insertions(+)
> 
> diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> index 55516b4602db..302d6ddf9062 100644
> --- a/drivers/bluetooth/btmtk.c
> +++ b/drivers/bluetooth/btmtk.c
> @@ -1503,6 +1503,28 @@ int btmtk_usb_shutdown(struct hci_dev *hdev)
>   	return 0;
>   }
>   EXPORT_SYMBOL_GPL(btmtk_usb_shutdown);
> +
> +int btmtk_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
> +{
> +	struct hci_event_hdr *hdr = (void *)skb->data;
> +
> +	if (hdr->evt == HCI_EV_CMD_COMPLETE) {
> +		struct hci_ev_cmd_complete *ec;
> +		u16 opcode;
> +
> +		ec = (void *)(skb->data + HCI_EVENT_HDR_SIZE);
> +		opcode = __le16_to_cpu(ec->opcode);
> +
> +		/* Filter vendor opcode */
> +		if (opcode == 0xfc5d) {
> +			kfree_skb(skb);
> +			return 0;
> +		}
> +	}
> +
> +	return hci_recv_frame(hdev, skb);
> +}
> +EXPORT_SYMBOL_GPL(btmtk_recv_event);
>   #endif
>   
>   MODULE_AUTHOR("Sean Wang <sean.wang at mediatek.com>");
> diff --git a/drivers/bluetooth/btmtk.h b/drivers/bluetooth/btmtk.h
> index adaf385626ee..08b73927c8f3 100644
> --- a/drivers/bluetooth/btmtk.h
> +++ b/drivers/bluetooth/btmtk.h
> @@ -218,6 +218,8 @@ int btmtk_usb_suspend(struct hci_dev *hdev);
>   int btmtk_usb_setup(struct hci_dev *hdev);
>   
>   int btmtk_usb_shutdown(struct hci_dev *hdev);
> +
> +int btmtk_recv_event(struct hci_dev *hdev, struct sk_buff *skb);
>   #else
>   
>   static inline int btmtk_set_bdaddr(struct hci_dev *hdev,
> @@ -296,4 +298,9 @@ static inline int btmtk_usb_shutdown(struct hci_dev *hdev)
>   {
>   	return -EOPNOTSUPP;
>   }
> +
> +static inline int btmtk_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
> +{
> +	return -EOPNOTSUPP;
> +}
>   #endif
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index f9d515ee9124..daf8a387e660 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -4150,6 +4150,8 @@ static int btusb_probe(struct usb_interface *intf,
>   	} else if (id->driver_info & BTUSB_MEDIATEK) {
>   		/* Allocate extra space for Mediatek device */
>   		priv_size += sizeof(struct btmtk_data);
> +
> +		data->recv_event = btmtk_recv_event;
>   	}
>   
>   	data->recv_acl = hci_recv_frame;


Kind regards,

Paul



More information about the Linux-mediatek mailing list