USB Geräte per Bash Script resetten (Gerät hängt sich öfter mal auf)

T

tecci

Grünschnabel
Hallo.

Ich habe eine USB Netzwerkkarte an einem Linux Router System. (LogiLink mit MosChio MCS 7830).
OS ist Debian 6.
System ist ein MSI Wind PC, den ich mit SSD ausgestattet habe, und als Server laufen lasse. Das Board hat leider nur eine NIC, und keinen PCI/PCIe Slot, so dass ich oben genannte USB NIC als WAN Port verwende.

Leider ist es nun so, dass diese USB NIC einige Probleme hat. Sie hängt sich im Betrieb öfters mal auf.
Selbst eine Neukonfiguration per ifconfig bringt nichts. Es kommen keine brauchbaren Daten mehr raus. Die Activity LED am Switch blinkt zwar, aber es kommt eben nichts mehr durch.

Abhilfe kann nur geschaffen werden, indem ich entweder neu starte, oder die USB NIC vom USB abstecke und wieder anstecke, und dann per IFCONFIG neu konfiguriere.
Eine Autoconfig per etc/network/interfaces ist ebenfalls nicht möglich. Da hängt es sich sofort auf. Bei Handkonfiguration im laufenden Betrieb klappt es eine Zeit, bis es irgendwann zu dem Fehler kommt.

Einen Software-Reset bekomme ich derzeit nur wie folgt hin:
Code:
Modprobe -vr ehci_hcd
modprobe -v ehci_hcd

Aber das resettet mir dann gleich den USB komplett.
Es fliegt dann auch der USB Stick mit /etc und /home aus dem System, und auch der UMTS Internetstick (der als Fallback Internetverbindung da ist)
Tastatur, SD-Cardreader etc "fliegt auch kurz raus"

/etc und /home habe ich mittlerweile schon so eingerichtet, dass es nur noch mit dem USB Stick synchronisiert wird, um das Problem zu entschärfen.

Aber gibt es denn eine (sinnvolle) Möglichkeit, gezielt einzelne USB Geräte auf Shellebene zu resetten?
In einem Beispiel, was ich sah, wurde es mit C relaisiert, das ist aber schon fast zu viel des guten.
Ich will es eigentlich nur in mein Network Watchdog Bash Script einbauen (das macht z.B. automatisch Internet Reconnects), welches alle Minute per Cron aufgerufen wird.

Viele Grüße


Edit: Hier ist übrigens das C-Beispiel, habs nochmal gefunden.
Ob es funktioniert, habe ich nicht probiert.
Ist die USB.h eigentlich eine Standardbibliothek?
Wenn es keine Möglichkeit gibt, einen Reset einzelner USB Ports/Geräte über ein BashScript zu realisieren, werde ich wohl oder übel C nehmen müssen.

Code:
#include <stdio.h>
#include <usb.h>

int main(void)
{
      struct usb_bus *busses;
      usb_init();
      usb_find_busses();
      usb_find_devices();
      busses = usb_get_busses();
      struct usb_bus *bus;
      int c, i, a;
      /* ... */
      for (bus = busses; bus; bus = bus->next) {
        struct usb_device *dev;
        int val;
        usb_dev_handle *junk;
        for (dev = bus->devices; dev; dev = dev->next) {
          char buf[1024];
          junk = usb_open ( dev );
          usb_get_string_simple(junk,2,buf,1023);
          if ( junk == NULL ){
            printf("Can't open %p (%s)\n", dev, buf );
          } else {
            val = usb_reset(junk);
            printf( "reset %p %d (%s)\n", dev, val, buf );
          }
          usb_close(junk);
        }
      }
}



P.P.S.

Ich habe irgendwo gelesen, man könnte die Spannungsversurgung einzelner USB Ports per Software abschalten und einschalten.
Das kurze Unterbrechen der Spannungsversorgung wäre in meinem Fall auch Zielführend, wäre ja fast wie aus und wiedereinstecken.


Grüße
 
Zuletzt bearbeitet:
Hi.
Danke für den Link.
Zweichenzeitlich habe ich etwas gefunden, was für das aktuelle Problem als Lösung funktioniert:

echo 0 > /sys/bus/usb/devices/1-3/authorized
echo 1 > /sys/bus/usb/devices/1-3/authorized

das 1-3 ist geräte/portspezifisch und muss in anderen fällen evtl angepasst werden.

Ob es jetzt nur gerade bei meinem aktuellen Problem / Gerät hilft, oder ob es eine "universelle" Lösung ist, weiß ich nicht.


Grüße
 
Hmm, eine "universelle" Lösung schent es nicht zu sein.
Es hat zwar bei dem Problem geholfen, aber auch nur 2 mal.
Dann ist die Firmware des NIC Sticks komplett abgestürzt oder sowas.
Selbst ein kompletter USB Reset via Modprobe half dann nicht mehr. Da musste ich dann wirklich nen "Hartreset" durch Abstecken machen.


Vielleicht trete ich den dummen Logilink Netzwerkstick einfach in meine Bastelkiste und hol mir nen anderen von einem anderen Hersteller. Vielleicht laufen die dann besser.

Edit:
Habe jetzt einen Zwischenerfolg erzielt, indem ich auch noch den Powerlevel auf suspend gesetzt habe. Mal sehen, ob das zuverlässig hilft der es auch nur zufällig mal klappt.


So, hier mal ein kleines Script, was scheinbar funktioniert. Mal sehen wie oft/zuverlässig.
Ist momentan q+d hardcoded auf mein system. Wenns gut klappt mache ich es vielleicht dynamisch mit automatischer Suche des passenden USB Ports.

Code:
#!/bin/bash
ifconfig eth1 down
echo "USB NIC Reset"
echo "Turning off"

echo 0 > /sys/bus/usb/devices/1-3/authorized
echo suspend > /sys/bus/usb/devices/1-3/power/level
echo "Wait 5 Sec"
sleep 5
echo "Turning on"
echo on > /sys/bus/usb/devices/1-3/power/level
echo 1 > /sys/bus/usb/devices/1-3/authorized
ifconfig eth1 192.168.222.222 netmask 255.255.255.0
ifconfig eth1 up

mfg
 
Zuletzt bearbeitet:
Also langsam glaube ich echt an einen Hardwaredefekt.
Das zuletzt gepostete Script, incl einiger weiterer Überarbeitungen (Spannung des Ports schon am Corehob im PC ausschalten, geht nach ähnlichem Prinzip)
nützt zwar schon viel.
Aber der Fehler, dass die USB NIC "Hängen bleibt" tritt immer noch auf, mit zunehmender Häufigkeit.
Es bringt die Netzwerkkarte in 90% der Fälle wieder auf die Beine. Irgendwann hängt sich auch mal der Kernel-Treiber komplett auf, wenn die NIC mal wieder spinnt.
Teilweise muss ich 3-4 mal hintereinander resetten, wobei dann gerne mal der Kernel ansich aussteigt, wenn ich das zeitlich ungünstig mache.

Ich weiß echt nicht, was das sein könnte.
 
Also ich hab mir vor kurzem ein USB-Gerät gebaut und hatte auch vermutlich einen ähnlichen Fehler. Wenn der µC (für USB) abgestürzt ist (wegen schlechter Lötstelle), dann hat das z.T. den Kernel aus dem Konzept gebracht. Bzw bis zu einem Timeout.

Das ganze kann man sich auch schön über "dmesg" angucken. Meine externe Festplatte macht da, ab und zu, ganz ähnliche Probleme.

Ich hatte auch das Problem, wenn mein HTC DHD dran war, dass dann die Festplatte ausgestiegen ist und der Kernel gewartet hat bis zum IO-Error. Abhilfe hat ein USB-Hub mit Netzteil gebracht. Vll. liegt es an der Spannungsversorgung (die USB NIC startet kurz neu, da die Spannung zusammen bricht und der Kernel merkt es nicht usw ...) Oder es kan auch wirklich eine HW-Fehler sein. Teste es doch mal unter einem anderen System?
 

Ähnliche Themen

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Festplatte friert ein nach suspend/resume

Ubuntu X / dbus problem

OpenSuse 11.1 USB Festplatte wird nicht erkannt

Ausführbare Datei aus icon_switch.c

Zurück
Oben