• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

2.6.11-rc4, VIA VT6102 und via-rhine / rhinefet

SoeDib

Member
Moin alle,
wer - wie ich - einen neueren Kernel verwenden möchte und statt des Ethernettreibers "via-rhine" lieber den Treiber "rhinefet" von Via für den VT6102 benutzen möchte, wird feststellen, daß der Treiber (zumindest) nicht mit den (Vanilla-)Sourcen kompiliert werden kann. Um das zum Laufen zu kriegen, mußte ich rhine_main.c im rhinefet-Quellverzeichnis etwas verändern. Ich hab zwar eigentlich nicht viel Ahnung vom Programmieren oder von Ethernet-Karten - aber funktionieren tuts trotzdem. Die Veränderungen sind hier als Diff wiedergegeben:

Code:
--- rhine_main.c	2005-02-17 20:45:36.000000000 +0000
+++ rhine_main.c-2.6.11-rc4-soe-1	2005-02-17 21:31:35.000000000 +0000
@@ -15,13 +15,29 @@
  *
  * File: rhine_main.c
  *
- * Purpose: Functions for Linux drver interfaces.
+ * Purpose: Functions for Linux driver interfaces.
  *
  * Author: Chuang Liang-Shing, AJ Jiang
  *
  * Date: Aug 15, 2003
  *
  */
+ 
+/*
+ * ********************************************************************
+ * Fixed version for use with kernel 2.6.11-rc4 (and above, probably)
+ *
+ * The fixes rely mainly on guesses derived from the differences
+ * between the kernel sources for SuSE's 2.6.5-7.145-default and
+ * the Vanilla 2.6.11-rc4 kernels. On my machine this version compiles,
+ * installs and runs nicely, but if it doesn't on your's, I'm probably
+ * not the right one to ask why  - in other words: I'm neither a
+ * programmer nor an expert on ethernet devices ;-)
+ * 
+ * Soe (s_dibbern {at} web.de)
+ * 2005-02-17
+ * ********************************************************************
+ */
 
 #undef __NO_VERSION__
 
@@ -1208,7 +1224,7 @@
     //drop frame not met IEEE 802.3
     if (pInfo->flags & RHINE_FLAGS_VAL_PKT_LEN) {
         if ((skb->protocol==htons(ETH_P_802_2)) &&
-            (skb->len!=ntohs(skb->mac.ethernet->h_proto))) {
+            (skb->len!=ntohs(eth_hdr(skb)->h_proto))) {
             skb_put(skb,-(pRD->rdesc0.f15Length-4));
             pStats->rx_length_errors++;
             return FALSE;
@@ -2851,8 +2867,8 @@
 
     netif_stop_queue(dev);
     spin_lock_irq(&pInfo->lock);
-    pci_save_state(pcid, pInfo->pci_state);
-
+    pci_save_state(pcid);
+	
 #ifdef ETHTOOL_GWOL
         rhine_shutdown(pInfo);
     if (pInfo->flags & RHINE_FLAGS_WOL_ENABLED) {
@@ -2885,7 +2901,7 @@
 
     pci_set_power_state(pcid, 0);
     pci_enable_wake(pcid, 0, 0);
-    pci_restore_state(pcid, pInfo->pci_state);
+    pci_restore_state(pcid);
 
     enable_mmio(pInfo);

Den Code einfach hier rauskopieren, unter (z.B.) "patch_rhinefet-2.6.11-rc4" abspeichern, in das Verzeichnis der rhinefet-Quellen (also dasjenige, in dem "rhine_main.c" liegt) verschieben und mit "patch -b <patch_rhinefet-2.6.11-rc4" ausführen. Die Option "-b" sorgt dafür, daß vor dem patchen eine Backup-Kopie von rhine_main.c unter dem Namen rhine_main.c.orig angelegt wird.

ACHTUNG: Ich sehe gerade, daß mein Browser beim Markieren an jede Zeile ein Leerzeichen anhängt - das verwirrt "patch". Man kann zum Speichern einen Editor wie Kate oder SciTE verwenden, die können unnötige Leerzeichen am Zeilenende automatisch vor dem Speichern entfernen. Also, wenn der Patch fehlschlägt oder sonst unerwartet verläuft, bitte die Zeilenenden kontrollieren.

Grüße,
SD
 
Oben