Como desativar a suspensão automática de USB no kernel 3.7.10 ou superior?

38

Atualizei meu HTPC do kernel 3.7.10 para 3.10.7 e parece que CONFIG_USB_SUSPEND agora saiu das opções do kernel e está incluído no PM.

O principal problema que estou enfrentando é que tenho um disco rígido externo e, ao suspender e ativar o HTPC, ele não está disponível para o sistema. O HDD acorda (você pode ouvi-lo girar novamente), mas quando você tenta acessar o ponto de montagem, obtém o seguinte erro:

ZOTAC ~ # ls /media
ls: reading directory /media: Input/output error

E no dmesg:

[  253.278260] EXT4-fs warning (device sdb1): __ext4_read_dirblock:908: error reading   directory block (ino 2, block 0)

Nos kernels anteriores, a configuração de CONFIG_USB_SUSPEND = N resolveria o problema, pois o HDD lidaria com sua hibernação sozinho e o ponto de montagem sempre era acessível. Quando o HDD estava em suspensão e o HTPC precisava de algo do ponto de montagem do HDD, o próprio HDD acordava e operava sem problemas.

No momento, tentei o seguinte sem sucesso:

  1. Altere manualmente / sys / bus / usb / devices / usb * / power / control para "on" em vez de "auto" .
  2. Altere manualmente / sys / bus / usb / devices / usb * / power / suspensão automática para "-1" em vez de "0" .

Porém, ao ativar novamente o HTPC, o ponto de montagem fica inacessível novamente. Como solução alternativa, posso desmontar e remontar o ponto de montagem e ele funciona novamente sem problemas, mas tenho certeza de que deve haver uma maneira de evitar que o sistema operacional lide com a suspensão automática do usb.

Alguma idéia de como desativar a suspensão automática do usb no kernel 3.7.10 ou superior?

Pedro
fonte
A cauda /sys/bus/usb/devices/<BUS>-<DEVPATH>/power/persistte dá 1? Será que grep CONFIG_PM_RUNTIME /boot/config-$(uname -r)dar-lhe y? power-management.txt
Runium 8/13
11
power/persist1e não tenho nenhum arquivo de configuração /boot. CONFIG_PM_RUNTIME=yestá configurado no .configarquivo do kernel .
Peter

Respostas:

33

Para Ubuntu e Debian , usbcoreé compilado no kernel, então criar entradas na /etc/modprobe.dvontade não trabalho: é preciso mudar os parâmetros de inicialização do kernel.

Edite o /etc/default/grubarquivo e altere a GRUB_CMDLINE_LINUX_DEFAULTlinha para adicionar a usbcore.autosuspend=-1opção:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"

Observe que quit splashjá havia opções presentes. Portanto, mantenha outras opções que você também tem.

Depois de salvar o arquivo, atualize o grub:

sudo update-grub

E reinicie .

Agora verifique o autosuspendvalor:

cat /sys/module/usbcore/parameters/autosuspend

E deve ser exibido -1.

Na documentação do kernel, afirma-se que algum dia no futuro esse parâmetro será alterado para autosuspend_delay_ms(em vez de autosuspend).

Rael Gugelmin Cunha
fonte
11
Isso parece ser verdade para o Debian também.
Benjamin Trent
2
Rael, muito obrigado por isso. O mesmo vale para a versão mais recente do Kali. Adicionei o item acima e meu USB IRToy (v2) agora está funcionando corretamente.
joat
11
Eu tenho um cartão USB em um dos slots mPCIE e simplesmente não queria a verdade. Executando o Debian Jessie. Isso resolveu meu problema, resolvendo uma enorme dor de cabeça, OBRIGADO!
X18
Eu tentei isso no Ubuntu 15.10, mas o valor não é aplicado (o valor é 2). Há mais alguma coisa que eu possa tentar?
Jonas Adler
Ainda estou em 14.04. Porém, nas versões mais recentes do kernel, o parâmetro para mudar é autosuspend_delay_ms.
Rael Gugelmin Cunha
20

De acordo com a documentação da árvore do kernel , o tempo de atraso de suspensão automática é controlado pelo autosuspendparâmetro module in usbcore. Definir o atraso de inatividade padrão inicial como -1 impedirá a suspensão automática de qualquer dispositivo USB. Você ainda deve poder ativar a suspensão automática para dispositivos selecionados.

O usbcore.autosuspendparâmetro do kernel pode ser definido quando o módulo é carregado manualmente:

$ modprobe usbcore autosuspend=-1

ou adicionando a seguinte linha a um arquivo de configuração em /etc/modprobe.d:

options usbcore autosuspend=-1

Se usbcorefor compilado no kernel, o parâmetro poderá ser ajustado adicionando o seguinte à linha de comando do kernel:

usbcore.autosuspend=-1

Por fim, a opção pode ser ajustada em tempo de execução, fazendo o seguinte:

echo -1 >/sys/module/usbcore/parameters/autosuspend

A alteração afetará todos os novos dispositivos USB. Os dispositivos já existentes não serão afetados.

Thomas Nyman
fonte
2
Eu usbcorecompilei no kernel, mas usar a modprobe.dopção não parece funcionar. Apesar de modprobe -c usbcore | grep autosuspendexibi-lo como -1, cat /sys/module/usbcore/parameters/autosuspendeu recebo #2
Peter
11
@ Peter: autosuspendestá obsoleto. O novo arquivo é o autosuspend_delay_msque leva ms em vez de segundos. ref . Mas power/controldefinir como ondeve ter o mesmo efeito.
Runium
@Sukminder, o que devo configurar para manter a suspensão automática desativada para sempre? Eu tentei usar autosuspend=-1ambos modprobe.de kernelparâmetro, mas o disco rígido ainda suspende e não acorda muito bem.
Peter
11
@ Peter: Se eu soubesse eu vou te dizer :). Estou apenas citando qual doc. diz. Seu pt. 1 em seu post deveria ter feito isso até onde eu sei, não tenho idéia do porquê. Você já tentou conjunto autosuspend_delay_msa -1? (In /sys/bus/usb/devices/<device>/power/autosuspend_delay_ms)
Runium 10/10
11
Estou no kernel 4.4 e autosuspend_delay_msnão está lá. Mas autosuspendé.
Mariano Dupont
3

Eu tenho um problema semelhante com um Microsoft Wheel Mouse Optical USB e PS / 2 compatível desde a atualização do sistema Linux Mint Debian Edition para o kernel 3.10-2-amd64. Suspeitou-se de uma suspensão automática inadequada pelo gerenciamento de energia USB do kernel . No Debian, isso é compilado como o usbcoremódulo no kernel.

Você pode alterar isso permanentemente emitindo na linha de comando:

sudo echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf > /dev/null

Alguns kernels podem exigir autosuspend=0, no entanto.

Se o seu sistema usa initrd(provavelmente), reconstrua o initrdpara o seu kernel.

Por exemplo:

uname -r
sudo dpkg-reconfigure linux-image-3.10-2-amd64

Reinicie e verifique com:

cat /sys/module/usbcore/parameters/autosuspend

que deve render -1agora.

Serge Stroobandt
fonte
Eu não uso initrde as ações descritas aqui não funcionam neste caso, pois já foram respondidas antes.
Peter