Als ich gestern Jaunty auf Karmic aktualisierte, stellte ich erschrocken fest, dass weitere Anpassungen von Kernel-Funktionen dazu geführt haben, dass die Anleitung von der_Alex1980 (http://forum.ubuntuusers.de/topic/howto-avm-fritz-card-dsl-pci-unter-interprid-/) unter Ubuntu 9.10. (Karmic Koala) nicht mehr funktioniert. Ich habe sie deshalb kopiert und überarbeitet und neu ins Forum eingestellt. Damit auch die Besitzer einer amd64-Umgebung mal zu ihrem Recht kommen, beziehen sich die Links auf diese Architektur.
Zunächst müssen alle CAPI Pakete wie im Wiki beschrieben installiert werden, als da wären: libcapi20-dev, libcapi20-3, capiutils, pppdcapiplugin, drdsl. Diese Pakete sind auch auf der Desktop-Installations-CD zu finden.
Nun benötigen wir den Treiber-Quellcode und die Firmware. Beide ziehen wir uns an einem internetfähigen PC aus dem Hardy-Repository auf einen USB Stick und kopieren sie dann ins Home Verzeichnis.
Die Firmware wird ganz normal per dpkg installiert.
Wir holen uns dauerhaft root Rechte, damit wir uns das 'sudo' vor jedem Befehl sparen...
1 | rdratlos@nero:~/fritz$ sudo -s |
Installieren der Fritz Firmware...
1 | root@nero:~/fritz# dpkg -i avm-fritz-firmware-2.6.24-25_3.11+2.6.24.18-25.2_amd64.deb |
Damit das CAPI-System die Firmware findet, müssen noch einige Dinge geändert werden. Zum einen muss in der Datei /etc/isdn/capi.conf die Auskommentierung für die entsprechende Karte entfernt werden. Bei der Fritz Card DSL SL heißt das Treibermodul fcdslsl bzw. bei der normalen Fritz Card DSL (Achtung: in einer 64-bit Architektur wird nur die Version 2.0 unterstützt!) fcdsl2.
# card file proto io irq mem cardnr options fcdslsl fdssbase.bin DSS1 - - - -
# card file proto io irq mem cardnr options fcdsl2 fds2base.bin DSS1 - - - -
Mehr Infos dazu auch im Wiki
Die Firmware selbst befindet sich in einem Unterverzeichnis von /usr/share/isdn (in unserem Fall 2.6.24-25). Um vom Kernel gefunden zu werden, muss noch ein symbolischer Link mit dem aktuellen Kernelbezeichner auf dieses Verzeichnis gesetzt werden...
1 | root@nero:/usr/share/isdn# ln -s 2.6.24-25 `uname -r` |
Kompilieren und Installieren des Treibers
Da das avm-kernel-source Paket einige Abhängigkeiten besitzt, die nicht erfüllt sind, wollen wir es nicht installieren, sondern nur entpacken.
1 2 3 4 | root@nero:~/fritz# dpkg -x avm-fritz-kernel-source_3.11+2.6.24.18-25.2_amd64.deb . root@nero:~/fritz# cp ./usr/src/avm-fritz.tgz /usr/src root@nero:~/fritz# cd /usr/src root@nero:/usr/src# tar -xzvf avm-fritz.tgz |
Wir wechseln ins Verzeichnis /usr/src/fritz/fcdslsl. Wenn wir jetzt 'make' aufrufen bekommen wir einen Fehler, weil sich die Kernel-Schnittstellen geändert haben.
/usr/src/fritz/fcdsl/src/driver.c:1401: Fehler: Implizite Deklaration der Funktion »find_task_by_pid«
Laut dieser Diskussion in der LKML ist die Funktion nicht mehr zuverlässig und sollte durch find_task_by_vpid() ersetzt werden. Dies haben wir auch gemäß Anleitung von der_Alex1980 bis jaunty erfolgreich gemacht. In karmic ist auch diese Kernel-Funktion verschwunden. Bis sich mal ein netter Kernel-Entwickler findet, der das Thread-Handling des Treibers für die aktuellen Kernelversionen umschreibt, bleibt keine Chance als ganz auf diese Funktion zu verzichten. Die Verwendung der Kernel-Funktion pid_task wie für fglrx vorgeschlagen, führt zum Absturz von capiinit. Also kommentieren wir in der Datei driver.c alle Vorkommen (bei fcdslsl drei) von find_task_by_pid aus.
... static void exit_debug_buffer (dbg_buf_p dbp) { assert (dbp != NULL); // info (find_task_by_pid (dbp->pid) != NULL); LOG("Stopping debug thread...\n"); atomic_set (&dbp->stop, 1); // find_task_by_pid not supported anymore by kernel // if (find_task_by_pid (dbp->pid)) { wake_up_interruptible (&dbg_wait); // } else { // hfree (dbp); // } } /* exit_debug_buffer */ ... static void kill_thread (void) { atomic_set (&thread_flag, 0); // if (NULL == find_task_by_pid (thread_pid)) { // LOG("Thread[%d] has died before!\n", thread_pid); // } else { if (!atomic_read (&thread_capi_flag)) { SCHED_WAKEUP_CAPI; } else { SCHED_WAKEUP; } LOG("Thread signalled, waiting for termination...\n"); wait_for_completion(&thread_sync); /* Wait for complete Thread Sync <arnd.feldmueller@web.de> */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) down (&thread_sync); #endif LOG("Thread[%d] terminated.\n", thread_pid); // } thread_pid = -1; } /* kill_thread */ ...
Weiterhin wurde die Kernel-Funktion capi_ctr_reseted in capi_ctr_down umbenannt. Also ersetzen wir in der Datei driver.c alle Vorkommen (bei fcdslsl zwei) von capi_ctr_reseted durch capi_ctr_down. Jetzt sollte der Treiber fehlerfrei kompiliert und gebaut werden können.
Also ...
1 2 3 4 5 6 7 | root@nero:/usr/src/fritz/fcdslsl# make clean root@nero:/usr/src/fritz/fcdslsl# make root@nero:/usr/src/fritz/fcdslsl# make install root@nero:/usr/src/fritz/fcdslsl# depmod -a root@nero:/usr/src/fritz/fcdslsl# modprobe fcdslsl root@nero:/usr/src/fritz/fcdslsl# capiinit root@nero:/usr/src/fritz/fcdslsl# drdsl |
Nach dem Ausführen von make install befindet sich der Treiber im Unterverzeichnis extra des Module-Directory (/lib/modules/uname -r
/extra).
Nun noch den Internetzugang wie im Wiki beschrieben einrichten
Diese Anleitung funktioniert für die Fritz Card DSL SL (fcdslsl) unter Karmic. Sie sollte auch auf die Variante V2 und die Fritz Caed DSL anwendbar sein. Vielleicht posted ja jemand die entsprechende Erfolgsmeldung.
Nachdem auch ich kein DKMS-Experte bin, abschließend noch der Hinweis, dass nach jedem Kernel-Update folgende Schritte mit Root-Rechten ausgeführt werden müssen:
1 2 3 4 5 6 7 8 9 | root@nero:/usr/share/isdn# ln -s 2.6.24-25 `uname -r` root@nero:/usr/share/isdn# cd /usr/src/fritz/fcdslsl root@nero:/usr/src/fritz/fcdslsl# make clean root@nero:/usr/src/fritz/fcdslsl# make root@nero:/usr/src/fritz/fcdslsl# make install root@nero:/usr/src/fritz/fcdslsl# depmod -a root@nero:/usr/src/fritz/fcdslsl# modprobe fcdslsl root@nero:/usr/src/fritz/fcdslsl# capiinit root@nero:/usr/src/fritz/fcdslsl# drdsl |
Viel Erfolg!