USB-Modem, CDC-Ethernet und SuSE Problem: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(Netzwerk)
(eingefügt)
Zeile 1: Zeile 1:
{{Autor}}--[[Benutzer:Yehudi|Yehudi]] 13:25, 15. Sep 2006 (CEST)
+
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:
 +
 
 +
<nowiki>--- 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;</nowiki>
 +
 
 +
 
 +
 
 +
 
 +
Bei meinem Fritz!BOX USB Ethernetinterface hat es mit dem Patch geklappt.
  
 
http://www.linux-club.de/ftopic45256.html
 
http://www.linux-club.de/ftopic45256.html
 +
 +
== Quellen und weiterführende Links ==
 +
* http://www.linux-club.de/viewtopic.php?t=43585 - Der Patch ist aus Bug 105621
  
 
----
 
----
  
 
[[Netzwerk|zurück zum Netzwerk]][[Category:TCP/IP]]
 
[[Netzwerk|zurück zum Netzwerk]][[Category:TCP/IP]]

Version vom 14. Juli 2007, 15:17 Uhr

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

Quellen und weiterführende Links


zurück zum Netzwerk