- Periféricos da Apple conectados via Bluetooth no Linux costumavam travar o relatório de bateria em 0% devido a limitações de driver.
- Tentativas anteriores de ler a carga sem fio causavam congelamento total do sistema operacional devido a conflitos de execução.
- O problema técnico ocorria porque o driver tentava colocar o kernel em modo de espera dentro de um contexto atômico proibido.
- Novos patches contornam o travamento migrando a requisição de leitura de bateria para uma fila de trabalho de menor prioridade.
- A atualização em revisão também adiciona a capacidade de monitorar o status de carregamento ativo do Magic Mouse e Trackpad 2.
Usar periféricos da Apple no Linux é uma prática comum entre desenvolvedores e criadores de conteúdo que preferem a ergonomia física do Magic Keyboard, Magic Mouse ou Magic Trackpad, mas optam pelo sistema operacional do pinguim em suas estações de trabalho. No entanto, essa convivência sempre foi acompanhada por pequenos incômodos técnicos.
O mais persistente deles era o “ponto cego” da bateria: quando conectados via Bluetooth, os dispositivos sempre reportavam 0% de carga, forçando o usuário a adivinhar o momento de recarregar ou a conectar um cabo USB apenas para verificar a autonomia.
Uma nova série de patches enviada para a lista de discussão do kernel Linux finalmente resolve essa limitação estrutural. O trabalho do desenvolvedor independente Alec Hall revela que o problema não era a falta de dados enviados pelo hardware da Apple, mas sim um bug crítico de temporização no kernel que travava o computador por completo sempre que o sistema tentava ler a bateria sem fio.
O conflito de contexto que congelava o sistema
Os drivers oficiais do Linux para os dispositivos de entrada da Apple (hid-apple e hid-magicmouse) já possuíam a lógica necessária para solicitar o nível de bateria do hardware. O sistema faz isso enviando uma requisição de relatório específica (conhecida tecnicamente como GET_REPORT para o relatório de entrada 0x90).
O problema reside na diferença de comportamento entre as conexões USB e Bluetooth dentro da arquitetura do kernel Linux:
- Via USB: A requisição de bateria funciona de forma assíncrona e segura.
- Via Bluetooth: O transporte de dados sem fio utiliza o subsistema UHID (User-space HID). Ativar a mesma solicitação de bateria de forma direta sob essa pilha de protocolos resultava em um congelamento total e instantâneo do sistema operacional (hard-lock).
Esse travamento severo acontecia devido a um conflito de contexto de execução no kernel. A rotina que dispara a verificação de bateria roda a partir de um temporizador do sistema, o que no Linux caracteriza um contexto atômico. Em contextos atômicos, o processador executa tarefas de altíssima prioridade e o código é terminantemente proibido de “dormir” ou pausar.
No entanto, para obter a resposta de bateria via Bluetooth, o subsistema de transporte precisa colocar a execução em espera (modo sleep) dentro da função hid_hw_request() até que o hardware sem fio responda. Quando o kernel tenta colocar uma tarefa para dormir dentro de um contexto atômico onde isso é proibido, a máquina entra em colapso e trava por completo.
A solução: migração para filas de trabalho
Para contornar o congelamento sem abrir mão da leitura de energia, os patches propostos por Alec Hall alteram a engenharia de fluxo de dados dos drivers.
Em vez de disparar a requisição diretamente do temporizador atômico, o código de ambos os drivers foi modificado para delegar a tarefa a uma workqueue (fila de trabalho).
O detalhe técnico: Ao transferir a solicitação de bateria para uma fila de trabalho, o processo passa a rodar em um contexto de processo comum. Nesse ambiente de menor prioridade, o driver pode suspender temporariamente a execução com segurança enquanto aguarda a resposta do módulo Bluetooth, eliminando o risco de travamento do computador.
Além de corrigir o fluxo de energia para exibir a porcentagem real, o terceiro patch do conjunto adiciona suporte para ler o status de carregamento do Magic Mouse 2 e do Magic Trackpad 2. O driver agora interpreta um byte específico de status enviado pelo hardware da Apple para identificar se o dispositivo está ativamente recebendo carga.
Os patches foram testados com sucesso em um Magic Keyboard modelo 2021 e em um Magic Trackpad 2 utilizando a pilha Bluetooth padrão do Linux (BlueZ). A proposta agora passa pelo crivo dos mantenedores do subsistema HID do kernel Linux antes de ser integrada à árvore principal do sistema.
