USB-Modem, CDC-Ethernet und SuSE Problem

Aus Linupedia.org
Wechseln zu: Navigation, Suche

Autor: Haveaniceday

Nur für 10.0, falls die Geräte unter 9.3 schon unterstützt wurden.

Es gibt ein bekanntes und gelöstes Problem im Bereich USB-Erkennung. Aus diesem Grund werden einige USB-Modem Geräte und USB Ethernetschnittstellen nicht richtig erkannt.

Lösung A: Das Modul "von Hand" in /etc/sysconfig/kernel das Modul in MODULES_LOADED_ON_BOOT="" eintragen.

Lösung B: Warten bis SuSE einen Kernelupdate rausgibt. Edit: "kotd" enthält den Fix.

Lösung C: folgenden Patch in einen selbstgebauten Kernel einbauen: Code:

--- gregkh-2.6.orig/drivers/usb/core/sysfs.c 
+++ gregkh-2.6/drivers/usb/core/sysfs.c 
@@ -462,30 +462,23 @@ static ssize_t show_modalias(struct devi 
 { 
    struct usb_interface *intf; 
    struct usb_device *udev; 
-   int len; 
+   struct usb_host_interface *alt; 
  
    intf = to_usb_interface(dev); 
    udev = interface_to_usbdev(intf); 
+   alt = intf->cur_altsetting; 
  
-   len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic", 
-                le16_to_cpu(udev->descriptor.idVendor), 
-                le16_to_cpu(udev->descriptor.idProduct), 
-                le16_to_cpu(udev->descriptor.bcdDevice), 
-                udev->descriptor.bDeviceClass, 
-                udev->descriptor.bDeviceSubClass, 
-                udev->descriptor.bDeviceProtocol); 
-   buf += len; 
- 
-   if (udev->descriptor.bDeviceClass == 0) { 
-      struct usb_host_interface *alt = intf->cur_altsetting; 
- 
-      return len + sprintf(buf, "%02Xisc%02Xip%02X\n", 
-                alt->desc.bInterfaceClass, 
-                alt->desc.bInterfaceSubClass, 
-                alt->desc.bInterfaceProtocol); 
-    } else { 
-      return len + sprintf(buf, "*isc*ip*\n"); 
-   } 
+   return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X" 
+         "ic%02Xisc%02Xip%02X\n", 
+         le16_to_cpu(udev->descriptor.idVendor), 
+         le16_to_cpu(udev->descriptor.idProduct), 
+         le16_to_cpu(udev->descriptor.bcdDevice), 
+         udev->descriptor.bDeviceClass, 
+         udev->descriptor.bDeviceSubClass, 
+         udev->descriptor.bDeviceProtocol, 
+         alt->desc.bInterfaceClass, 
+         alt->desc.bInterfaceSubClass, 
+         alt->desc.bInterfaceProtocol); 
 } 
 static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); 
  
--- gregkh-2.6.orig/drivers/usb/core/usb.c 
+++ gregkh-2.6/drivers/usb/core/usb.c 
@@ -569,6 +569,7 @@ static int usb_hotplug (struct device *d 
 { 
    struct usb_interface *intf; 
    struct usb_device *usb_dev; 
+   struct usb_host_interface *alt; 
    int i = 0; 
    int length = 0; 
  
@@ -585,7 +586,8 @@ static int usb_hotplug (struct device *d 
  
    intf = to_usb_interface(dev); 
    usb_dev = interface_to_usbdev (intf); 
-    
+   alt = intf->cur_altsetting; 
+ 
    if (usb_dev->devnum < 0) { 
       pr_debug ("usb %s: already deleted?\n", dev->bus_id); 
       return -ENODEV; 
@@ -627,46 +629,27 @@ static int usb_hotplug (struct device *d 
             usb_dev->descriptor.bDeviceProtocol)) 
       return -ENOMEM; 
  
-   if (usb_dev->descriptor.bDeviceClass == 0) { 
-      struct usb_host_interface *alt = intf->cur_altsetting; 
+   if (add_hotplug_env_var(envp, num_envp, &i, 
+            buffer, buffer_size, &length, 
+            "INTERFACE=%d/%d/%d", 
+            alt->desc.bInterfaceClass, 
+            alt->desc.bInterfaceSubClass, 
+            alt->desc.bInterfaceProtocol)) 
+      return -ENOMEM; 
  
-      /* 2.4 only exposed interface zero.  in 2.5, hotplug 
-       * agents are called for all interfaces, and can use 
-       * $DEVPATH/bInterfaceNumber if necessary. 
-       */ 
-      if (add_hotplug_env_var(envp, num_envp, &i, 
-               buffer, buffer_size, &length, 
-               "INTERFACE=%d/%d/%d", 
-               alt->desc.bInterfaceClass, 
-               alt->desc.bInterfaceSubClass, 
-               alt->desc.bInterfaceProtocol)) 
-         return -ENOMEM; 
- 
-      if (add_hotplug_env_var(envp, num_envp, &i, 
-               buffer, buffer_size, &length, 
-               "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", 
-               le16_to_cpu(usb_dev->descriptor.idVendor), 
-               le16_to_cpu(usb_dev->descriptor.idProduct), 
-               le16_to_cpu(usb_dev->descriptor.bcdDevice), 
-               usb_dev->descriptor.bDeviceClass, 
-               usb_dev->descriptor.bDeviceSubClass, 
-               usb_dev->descriptor.bDeviceProtocol, 
-               alt->desc.bInterfaceClass, 
-               alt->desc.bInterfaceSubClass, 
-               alt->desc.bInterfaceProtocol)) 
-         return -ENOMEM; 
-    } else { 
-      if (add_hotplug_env_var(envp, num_envp, &i, 
-               buffer, buffer_size, &length, 
-               "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*", 
-               le16_to_cpu(usb_dev->descriptor.idVendor), 
-               le16_to_cpu(usb_dev->descriptor.idProduct), 
-               le16_to_cpu(usb_dev->descriptor.bcdDevice), 
-               usb_dev->descriptor.bDeviceClass, 
-               usb_dev->descriptor.bDeviceSubClass, 
-               usb_dev->descriptor.bDeviceProtocol)) 
-         return -ENOMEM; 
-   } 
+   if (add_hotplug_env_var(envp, num_envp, &i, 
+            buffer, buffer_size, &length, 
+            "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", 
+            le16_to_cpu(usb_dev->descriptor.idVendor), 
+            le16_to_cpu(usb_dev->descriptor.idProduct), 
+            le16_to_cpu(usb_dev->descriptor.bcdDevice), 
+            usb_dev->descriptor.bDeviceClass, 
+            usb_dev->descriptor.bDeviceSubClass, 
+            usb_dev->descriptor.bDeviceProtocol, 
+            alt->desc.bInterfaceClass, 
+            alt->desc.bInterfaceSubClass, 
+            alt->desc.bInterfaceProtocol)) 
+      return -ENOMEM; 
  
    envp[i] = NULL; 
 


Bei meinem Fritz!BOX USB Ethernetinterface hat es mit dem Patch geklappt.

http://www.linux-club.de/ftopic45256.html


siehe auch

Quellen und weiterführende Links


zurück zum Netzwerk