Suspend eines USB-Hubs

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Benutzeravatar
shellshock
Beiträge: 26
Registriert: 22.12.2014 13:49:58

Suspend eines USB-Hubs

Beitrag von shellshock » 08.06.2024 16:00:48

Moin zusammen,

mittels

Code: Alles auswählen

lsusb
ermittle ich auf einer Debian (Bookworm) angeschlossene/aktive USB-Devices. Eines davon ist ein USB-Hub:
Bus 003 Device 004: ID 0bda:5411 Realtek Semiconductor Corp. RTS5411 Hub
Sobald das Notebook in den Standby/Hibernate-Modus wechselt, möchte ich diesen USB-Hub abschalten bzw. vom Port nicht mehr mit Strom versorgen.

Ist so etwas möglich? Kann mir da jemand etwas unter die Arme greifen?

Danke!

mat6937
Beiträge: 3361
Registriert: 09.12.2014 10:44:00

Re: Suspend eines USB-Hubs

Beitrag von mat6937 » 08.06.2024 19:50:16

shellshock hat geschrieben: ↑ zum Beitrag ↑
08.06.2024 16:00:48
Bus 003 Device 004: ID 0bda:5411 Realtek Semiconductor Corp. RTS5411 Hub
Sobald das Notebook in den Standby/Hibernate-Modus wechselt, möchte ich diesen USB-Hub abschalten bzw. vom Port nicht mehr mit Strom versorgen.
Versuch mal mit:

Code: Alles auswählen

apt install usb-modeswitch
danach:

Code: Alles auswählen

usb_modeswitch -v 0x0bda -p 0x5411 -R
Debian 12.8 mit LXDE, OpenBSD 7.6 mit i3wm, FreeBSD 14.1 mit Xfce

Benutzeravatar
shellshock
Beiträge: 26
Registriert: 22.12.2014 13:49:58

Re: Suspend eines USB-Hubs

Beitrag von shellshock » 09.06.2024 08:49:12

Nein, funktioniert leider nicht. Die Ausgabe:
Look for default devices ...
Found devices in default mode (1)
Access device 017 on bus 003
Get the current device configuration ...
Current configuration number is 1
Use interface number 0
with class 9
Warning: no switching method given. See documentation
Reset USB device .
Device was reset
-> Run lsusb to note any changes. Bye!

mat6937
Beiträge: 3361
Registriert: 09.12.2014 10:44:00

Re: Suspend eines USB-Hubs

Beitrag von mat6937 » 09.06.2024 09:12:39

shellshock hat geschrieben: ↑ zum Beitrag ↑
09.06.2024 08:49:12
Nein, funktioniert leider nicht.
Man könnte auch unbind (und bind) benutzen, wenn man den richtigen Port und die richtige/aktuelle device-ID kennt, denn anders als die vendor- und product-ID, sind diese nicht konstant bzw. können sich ändern.

Code: Alles auswählen

:~$ ls -la /sys/bus/usb/drivers/usb/*bind
--w------- 1 root root 4096  9. Jun 09:04 /sys/bus/usb/drivers/usb/bind
--w------- 1 root root 4096  9. Jun 09:04 /sys/bus/usb/drivers/usb/unbind
Nur als Beispiel (d. h. nicht so anwenden, weil die device-ID bei dir eine andere ist):

Code: Alles auswählen

echo '1-3.3:1.0' > /sys/bus/usb/drivers/r8712u/unbind
Debian 12.8 mit LXDE, OpenBSD 7.6 mit i3wm, FreeBSD 14.1 mit Xfce

Benutzeravatar
thunder11
Beiträge: 2146
Registriert: 19.04.2023 09:08:30

Re: Suspend eines USB-Hubs

Beitrag von thunder11 » 09.06.2024 10:17:41

Vielleicht hilft dass;
https://www.baeldung.com/linux/control-usb-power-supply

Code: Alles auswählen

susb -t
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M
...
...
Infos über den Hub:

Code: Alles auswählen

udevadm info /sys/bus/usb/devices/1-0:1.0 
P: /devices/pci0000:00/0000:00:14.0/usb1/1-0:1.0
M: 1-0:1.0
R: 0
U: usb
T: usb_interface
V: hub
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-0:1.0
E: SUBSYSTEM=usb
E: DEVTYPE=usb_interface
E: DRIVER=hub
E: PRODUCT=1d6b/2/607
E: TYPE=9/0/1
E: INTERFACE=9/0/0
E: MODALIAS=usb:v1D6Bp0002d0607dc09dsc00dp01ic09isc00ip00in00
E: USEC_INITIALIZED=705727
E: ID_USB_CLASS_FROM_DATABASE=Hub
E: ID_USB_PROTOCOL_FROM_DATABASE=Single TT
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=2.0 root hub
E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:0:1.0
E: ID_PATH=pci-0000:00:14.0-usb-0:0:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_0_1_0

Benutzeravatar
shellshock
Beiträge: 26
Registriert: 22.12.2014 13:49:58

Re: Suspend eines USB-Hubs

Beitrag von shellshock » 09.06.2024 21:26:37

Mit dem Tool uhubctl konnte ich es lösen. Während der Laufzeit lassen sich die Ports des USB-Hubs deaktivieren:

Code: Alles auswählen

uhubctl -l 3-1.4 -a off
Jetzt habe ich mir einen systemd-Service gebastelt, der vor dem Suspend/Hibernate etc. den Befehl absetzen soll:

Code: Alles auswählen

[Unit]
Description=Suspend USB-Hub
Before=sleep.target suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/sbin/uhubctl -l 3-1.4 -a off
ExecStartPost=/bin/sleep 5

[Install]
WantedBy=sleep.target suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Funktioniert leider nicht. Das System ändert vor dem Absetzen irgendwie den Status des Hubs.

Die Ausgabe von

Code: Alles auswählen

journalctl -u suspend-usbhub.service
ist:

Code: Alles auswählen

Jun 09 21:05:59 T480 systemd[1]: Starting suspend-usbhub.service - Suspend USB-Hub...
Führt er aber nicht aus, sondern erst nach dem Wakeup/Starts des Rechners. :roll:

Kann man das irgendwie erzwingen, dass es vor dem Suspend ausgeführt wird und der Rechner darauf warten soll?

Benutzeravatar
shellshock
Beiträge: 26
Registriert: 22.12.2014 13:49:58

Re: Suspend eines USB-Hubs

Beitrag von shellshock » 14.06.2024 10:02:55

Habe es jetzt wie folgt gelöst.

Code: Alles auswählen

sudo nano /usr/lib/systemd/system-sleep/suspend-hub
#!/bin/bash

Code: Alles auswählen

case $1 in
   pre)
      # Aktionen vor dem Suspend     
      # USB-Hub deaktivieren
      uhubctl --vendor 0bda -a off
      uhubctl --vendor 2109 -a off -p 4
      uhubctl --vendor 2109 -a off -p 3
      sleep 3
   ;;
   post)
      # Aktionen nach dem Suspend
      # USB-Hub aktivieren
      uhubctl --vendor 2109 -a on -p 4
      uhubctl --vendor 2109 -a on -p 3
   ;;
esac

Code: Alles auswählen

sudo chmod +x /usr/lib/systemd/system-sleep/suspend-hub

Antworten