Проблема: 0% заряда в беспроводном режиме
До сих пор в Linux поддержка периферии Apple была «смешанной»: устройства распознавались, но мониторинг батареи работал только при проводном подключении через USB. При использовании Bluetooth, которое является основным сценарием для Magic Mouse 2, Magic Keyboard и Magic Trackpad 2, драйверы hid-magicmouse и hid-apple возвращали значение 0%, что делало невозможным планирование зарядки.
Техническая суть исправления
Разработчик Alec Hall выявил корень проблемы: драйверы уже умеют запрашивать отчет о батарее (GET_REPORT для input report 0x90), но реализация вызывала deadlock (взаимную блокировку) при попытке сделать это по Bluetooth. Запрос выполнялся в таймерном колбэке (atomic context), где транспорт uhid пытался выполнить спящую операцию hid_hw_request().
Решение заключается в переносе запроса в workqueue (очередь рабочих задач), что позволяет безопасно выполнять спящие вызовы. Также добавлена интерпретация байта статуса от производителя для определения состояния зарядки.
Сравнение функциональности
| Параметр | Подключение по USB | Подключение по Bluetooth (до патчей) | Подключение по Bluetooth (после патчей) |
|---|---|---|---|
| Мониторинг заряда | Работает | Возвращает 0% | Работает корректно |
| Определение статуса зарядки | Частично | Недоступно | Определяется через vendor status byte |
| Стабильность системы | Стабильно | Риск hard-lock при запросе | Стабильно (запрос через workqueue) |
Статус и тестирование
Патчи протестированы на Magic Keyboard 2021 и Magic Trackpad 2 в среде BlueZ (uhid). На данный момент серия патчей находится на стадии ревью в мейнстриме ядра Linux. Успешное слияние исправит критический недостаток UX для пользователей Apple-периферии в Linux-окружении.
Источник: Phoronix ↗
