FAILED: patch "[PATCH] HID: magicmouse: avoid setting up battery timer when not" failed to apply to 6.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.15-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.15.y
git checkout FETCH_HEAD
git cherry-pick -x 9bdc30e35cbc1aa78ccf01040354209f1e11ca22
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025081244-result-from-825c@gregkh' --subject-prefix 'PATCH 6.15.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 9bdc30e35cbc1aa78ccf01040354209f1e11ca22 Mon Sep 17 00:00:00 2001
From: Aditya Garg <[email protected]>
Date: Mon, 30 Jun 2025 12:37:13 +0000
Subject: [PATCH] HID: magicmouse: avoid setting up battery timer when not
needed
Currently, the battery timer is set up for all devices using hid-magicmouse, irrespective of whether they actually need it or not.
The current implementation requires the battery timer for Magic Mouse 2 and Magic Trackpad 2 when connected via USB only. Add checks to ensure that the battery timer is only set up when they are connected via USB.
drivers/hid/hid-magicmouse.c +38 -22
@@ -791,17 +791,31 @@ static void magicmouse_enable_mt_work(struct work_struct *work)hid_err (msc->hdev,"unable to request touch data (%d)\n" , ret); } +static bool is_usb_magicmouse2 (__u32 vendor,__u32 product) +{ +if (vendor !=USB_VENDOR_ID_APPLE ) +return false; +return product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 || + product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC ; +} + +static bool is_usb_magictrackpad2 (__u32 vendor,__u32 product) +{ +if (vendor !=USB_VENDOR_ID_APPLE ) +return false; +return product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || + product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ; +} +static int magicmouse_fetch_battery (struct hid_device *hdev) {#ifdef CONFIG_HID_BATTERY_STRENGTH struct hid_report_enum *report_enum;struct hid_report *report; -if (!hdev->battery || hdev->vendor !=USB_VENDOR_ID_APPLE || - (hdev->product !=USB_DEVICE_ID_APPLE_MAGICMOUSE2 && - hdev->product !=USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC && - hdev->product !=USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && - hdev->product !=USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC )) +if (!hdev->battery || + (!is_usb_magicmouse2 (hdev->vendor, hdev->product) && + !is_usb_magictrackpad2 (hdev->vendor, hdev->product)))return -1 ; report_enum = &hdev->report_enum[hdev->battery_report_type];
@@ -863,17 +877,17 @@ static int magicmouse_probe(struct hid_device *hdev,return ret; } -timer_setup (&msc->battery_timer, magicmouse_battery_timer_tick,0 ); -mod_timer (&msc->battery_timer, - jiffies +msecs_to_jiffies (USB_BATTERY_TIMEOUT_MS )); -magicmouse_fetch_battery (hdev); +if (is_usb_magicmouse2 (id->vendor, id->product) || +is_usb_magictrackpad2 (id->vendor, id->product)) { +timer_setup (&msc->battery_timer, magicmouse_battery_timer_tick,0 ); +mod_timer (&msc->battery_timer, + jiffies +msecs_to_jiffies (USB_BATTERY_TIMEOUT_MS )); +magicmouse_fetch_battery (hdev); + } -if (id->vendor ==USB_VENDOR_ID_APPLE && - (id->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 || - id->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || - ((id->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || - id->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ) && - hdev->type !=HID_TYPE_USBMOUSE ))) +if (is_usb_magicmouse2 (id->vendor, id->product) || + (is_usb_magictrackpad2 (id->vendor, id->product) && + hdev->type !=HID_TYPE_USBMOUSE ))return 0 ;if (!msc->input) {
@@ -936,7 +950,10 @@ static int magicmouse_probe(struct hid_device *hdev,return 0 ; err_stop_hw: -timer_delete_sync (&msc->battery_timer); +if (is_usb_magicmouse2 (id->vendor, id->product) || +is_usb_magictrackpad2 (id->vendor, id->product)) +timer_delete_sync (&msc->battery_timer); +hid_hw_stop (hdev);return ret; }
@@ -947,7 +964,9 @@ static void magicmouse_remove(struct hid_device *hdev)if (msc) {cancel_delayed_work_sync (&msc->work); -timer_delete_sync (&msc->battery_timer); +if (is_usb_magicmouse2 (hdev->vendor, hdev->product) || +is_usb_magictrackpad2 (hdev->vendor, hdev->product)) +timer_delete_sync (&msc->battery_timer); }hid_hw_stop (hdev);
@@ -964,11 +983,8 @@ static const __u8 *magicmouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,* 0x05, 0x01, // Usage Page (Generic Desktop) 0 * 0x09, 0x02, // Usage (Mouse) 2 */ -if (hdev->vendor ==USB_VENDOR_ID_APPLE && - (hdev->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 || - hdev->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || - hdev->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || - hdev->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ) && +if ((is_usb_magicmouse2 (hdev->vendor, hdev->product) || +is_usb_magictrackpad2 (hdev->vendor, hdev->product)) && *rsize ==83 && rdesc[46 ] ==0x84 && rdesc[58 ] ==0x85 ) {hid_info (hdev,"fixing up magicmouse battery report descriptor\n" );
PATCH 1/1 HID: magicmouse: avoid setting up battery timer when not needed
commit 9bdc30e35cbc1aa78ccf01040354209f1e11ca22 upstream.
Currently, the battery timer is set up for all devices using hid-magicmouse, irrespective of whether they actually need it or not.
The current implementation requires the battery timer for Magic Mouse 2 and Magic Trackpad 2 when connected via USB only. Add checks to ensure that the battery timer is only set up when they are connected via USB.
--- drivers/hid/hid-magicmouse.c | 56 ++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 19 deletions(-)
drivers/hid/hid-magicmouse.c +37 -19
@@ -779,16 +779,30 @@ static void magicmouse_enable_mt_work(struct work_struct *work)hid_err (msc->hdev,"unable to request touch data (%d)\n" , ret); } +static bool is_usb_magicmouse2 (__u32 vendor,__u32 product) +{ +if (vendor !=USB_VENDOR_ID_APPLE ) +return false; +return product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 ; +} + +static bool is_usb_magictrackpad2 (__u32 vendor,__u32 product) +{ +if (vendor !=USB_VENDOR_ID_APPLE ) +return false; +return product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || + product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ; +} +static int magicmouse_fetch_battery (struct hid_device *hdev) {#ifdef CONFIG_HID_BATTERY_STRENGTH struct hid_report_enum *report_enum;struct hid_report *report; -if (!hdev->battery || hdev->vendor !=USB_VENDOR_ID_APPLE || - (hdev->product !=USB_DEVICE_ID_APPLE_MAGICMOUSE2 && - hdev->product !=USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && - hdev->product !=USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC )) +if (!hdev->battery || + (!is_usb_magicmouse2 (hdev->vendor, hdev->product) && + !is_usb_magictrackpad2 (hdev->vendor, hdev->product)))return -1 ; report_enum = &hdev->report_enum[hdev->battery_report_type];
@@ -850,16 +864,17 @@ static int magicmouse_probe(struct hid_device *hdev,return ret; } -timer_setup (&msc->battery_timer, magicmouse_battery_timer_tick,0 ); -mod_timer (&msc->battery_timer, - jiffies +msecs_to_jiffies (USB_BATTERY_TIMEOUT_MS )); -magicmouse_fetch_battery (hdev); +if (is_usb_magicmouse2 (id->vendor, id->product) || +is_usb_magictrackpad2 (id->vendor, id->product)) { +timer_setup (&msc->battery_timer, magicmouse_battery_timer_tick,0 ); +mod_timer (&msc->battery_timer, + jiffies +msecs_to_jiffies (USB_BATTERY_TIMEOUT_MS )); +magicmouse_fetch_battery (hdev); + } -if (id->vendor ==USB_VENDOR_ID_APPLE && - (id->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 || - ((id->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || - id->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ) && - hdev->type !=HID_TYPE_USBMOUSE ))) +if (is_usb_magicmouse2 (id->vendor, id->product) || + (is_usb_magictrackpad2 (id->vendor, id->product) && + hdev->type !=HID_TYPE_USBMOUSE ))return 0 ;if (!msc->input) {
@@ -915,7 +930,10 @@ static int magicmouse_probe(struct hid_device *hdev,return 0 ; err_stop_hw: -timer_delete_sync (&msc->battery_timer); +if (is_usb_magicmouse2 (id->vendor, id->product) || +is_usb_magictrackpad2 (id->vendor, id->product)) +timer_delete_sync (&msc->battery_timer); +hid_hw_stop (hdev);return ret; }
@@ -926,7 +944,9 @@ static void magicmouse_remove(struct hid_device *hdev)if (msc) {cancel_delayed_work_sync (&msc->work); -timer_delete_sync (&msc->battery_timer); +if (is_usb_magicmouse2 (hdev->vendor, hdev->product) || +is_usb_magictrackpad2 (hdev->vendor, hdev->product)) +timer_delete_sync (&msc->battery_timer); }hid_hw_stop (hdev);
@@ -943,10 +963,8 @@ static const __u8 *magicmouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,* 0x05, 0x01, // Usage Page (Generic Desktop) 0 * 0x09, 0x02, // Usage (Mouse) 2 */ -if (hdev->vendor ==USB_VENDOR_ID_APPLE && - (hdev->product ==USB_DEVICE_ID_APPLE_MAGICMOUSE2 || - hdev->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || - hdev->product ==USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC ) && +if ((is_usb_magicmouse2 (hdev->vendor, hdev->product) || +is_usb_magictrackpad2 (hdev->vendor, hdev->product)) && *rsize ==83 && rdesc[46 ] ==0x84 && rdesc[58 ] ==0x85 ) {hid_info (hdev,"fixing up magicmouse battery report descriptor\n" );
Signature · 1 line
2.50.1