Encontrar o dispositivo
Primeiro, precisamos descobrir qual é o número do dispositivo. Se a porta estiver ativada e você puder vê-la com o comando lsusb
, use ls /sys/bus/pci/drivers/xhci_hcd
. O dispositivo será um número no formato xxxx: xx: xx.x e provavelmente será as primeiras entradas retornadas do comando ls
.
Redefinindo a porta
Se a porta não estiver visível, isso significa que a porta não está funcionando, mas pode ser redefinida removendo toda a energia da máquina. Desligue o computador, remova todas as baterias e cabos de alimentação e aguarde 10 segundos. Em seguida, conecte o cabo de volta e inicialize a máquina. Em seguida, procure o número do dispositivo novamente.
O número do meu dispositivo é 0000: 04: 00.0, mas pode ser diferente. Um exemplo que eu vi é em outro lugar 0000: 00: 14.0. Lembre-se ou anote seu (s) número (s). Nós precisaremos disso para encadernar e desvincular. Pode haver mais de um se você tiver várias portas usb 3.
Determinando a estrutura de gerenciamento de energia
Para apt / aptitude / dpkg (ubuntu / debian / mint):
dpkg --get-selections | grep pm-utils
Se algo é retornado, você tem pm.
Para gerenciador de pacotes pacman (arch)
pacman -Qe | grep pm-utils
Se algo é retornado, você tem pm.
Para gerenciador de pacotes rpm (fedora, centos, etc ...):
rpm -qa | grep pm-utils
Se algo é retornado, você tem pm.
Para outros , você pode tentar isso, eu não sei como todos eles funcionam e não tenho um sistema para testá-los.
Nota: só porque os pacotes instalados não implicam que você está usando, mas há uma boa chance que você esteja. Outra coisa que você pode fazer é simplesmente cd /etc/pm/
e, se existir, você pode colocar o script lá. Tecnicamente, acho que não há nada de errado em ter um roteiro desvinculado em ambos os lugares. Se alguém quiser deixar um comentário sobre se isso é verdade ou não, ou se há uma maneira melhor de determinar se o pm é usado, isso seria fantástico.
systemd suspend script (não usa os utilitários)
Se você estiver usando systemd ou systemctl sem pm, precisamos colocar o script em /usr/lib/systemd/system-sleep/xhci_hcd.sleep
.
Para minha máquina, o script se parece com:
#!/bin/sh
#File: /usr/lib/systemd/system-sleep/xhci_hcd.sleep
case $1/$2 in
pre/*)
# Unbind
echo "Unbinding xhci Device"
echo -n "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/unbind
;;
post/*)
# bind xhci_dev
echo "Rebinding xhci Device"
echo -n "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/bind
;;
esac
Substitua o 0000: 04: 00.0 pelo número do seu dispositivo nas duas instâncias. Se você tiver vários números de dispositivos, execute o bind e desvincule para cada um. ou seja, se você tiver portas xxxx: xx: xx.x e yyyy: yy: yy.y, você precisará de echo -n "xxxx:xx:xx.x" > /sys/bus/pci/drivers/xhci_hcd/unbind
e echo -n "yyyy:yy:yy.y" > /sys/bus/pci/drivers/xhci_hcd/unbind
para desvincular os dois dispositivos e echo -n "xxxx:xx:xx.x" > /sys/bus/pci/drivers/xhci_hcd/bind
e echo -n "yyyy:yy:yy.y" > /sys/bus/pci/drivers/xhci_hcd/bind
para ligar os dispositivos. Eu coloquei o primeiro comando echo para nos deixar ver quando a ligação e desvinculação acontece quando olhamos para os logs usando journalctl -b -u systemd-suspend
. Mais informações sobre gerenciamento de energia com systemd / systemctl. Salve esse arquivo e execute sudo chmod a+x /usr/lib/systemd/system-sleep/xhci_hcd.sleep
para torná-lo executável. Pessoalmente, eu iria reiniciar o sistema para garantir que o novo arquivo tenha efeito, mas acredito que possa entrar em vigor imediatamente. Se isso não acontecer e você colocar o sistema em repouso (ou suspender / hibernar), veja como você redefiniu a porta acima.
pm suspend script (utilitários do pm instalados)
Se você estiver usando o pm utils, precisamos colocar o script em /etc/pm/sleep.d/20_custom-xhci_hcd
#!/bin/sh
#File: "/etc/pm/sleep.d/20_custom-xhci_hcd"
case "${1}" in
hibernate|sleep)
#unbind
echo "Unbinding xhci device"
echo -n "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/unbind
;;
resume|thaw)
# bind
echo "Binding xhci device"
ehco -n "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/bind
;;
esac
Substitua o 0000: 04: 00.0 pelo número do seu dispositivo nas duas instâncias. Se você tiver vários números de dispositivos, execute a ligação e desvincule cada dispositivo. Veja as instruções abaixo do script para script suspenso systemd, mas use chmod a+x /etc/pm/sleep.d/20_custom-xhci_hcd
para tornar o arquivo executável. Em seguida, reinicie e teste.
Mais recursos úteis: