Comment 3 for bug 264697

Revision history for this message
ManuPeng (mvieuxmaire) wrote :

Alright, I've fixed it and I'll try to describe the steps here. I use an AVM Fritz Card DSL SL, but not for much longer, the amazing amount of crap I've had to deal with regularly over the years to get this thing working has had its toll on me. I'm going the router way in a month and it will all be plug&play from then on. Oh, and the router won't be AVM harder, that I swear...

I digress but I want AVM to know they've lost a customer by not providing better drivers for linux.

This is for the DSL SL card, adjust to your card type:
0) There are enough guides as to how to install the AVM cards, from installing the relevant DEB packages to editing capi.conf and editing the provider file:
http://wiki.ubuntuusers.de/AVM_Fritz!Card_DSL
My goal here is only to explain how to compile the kernel module, since no kernel module is to be found on the last Intrepid beta and most likely none will be on the final release.

1) Find a computer with a working internet connection and download:
http://packages.ubuntu.com/hardy-updates/avm-fritz-kernel-source

2) Get back on your broken Intrepid and open the downloaded DEB- package with the archive manager. You want to extract the source code that's inside data.tar.gz/./usr/src/avm-fritz.tgz/fritz/fcdslsl

3) With a terminal, go into the extracted directory, you should see a "src" and a "lib" directory.

4) sudo make
It will fail because of the function "find_task_by_pid()" that has been removed from the kernel. I've contacted the developer who removed it to ask if a replacement function is available.

5) For now though, we will have edit the source code, it's nothing big though. Open driver.c inside the "src" directory with any text editor and search for "find_task_by_pid", it will appear 3 times in the file but needs be commented out (the /* and */ or // signs for non-developers) only 2 times:
a) in function exit_debug_buffer
line 420
old: if (find_task_by_pid...
new: /*if (find_task_by_pid...

line 424
old: }
new: }*/

b) in function kill_thread
line 1439
old: if (NULL == find_task_by_pid...
new: /*if (NULL == find_task_by_pid...

line 1441
old: } else {
new: } else {*/

line 1453
old: }
new: //}

6) Save and exit. In the terminal try again "sudo make". This time it should compile fine, if it does, then execute:
sudo make install
sudo depmod -a
modprobe fcdslsl

7) Enter:
sudo capiinit
It didn't work for me, something about fdssbase.bin, the firmware, not being found. It's in /usr/share/isdn/<kernel> but capiinit strangely won't work until you've copied it to /usr/share/isdn, don't ask me why.

8) Now the following should work:
sudo capiinit
sudo drdsl

9) The rest is as usual, you need a file in /etc/ppp/peers for your provider, and you have to "pon" this provider later to establish the connection.

I release a tool called "patch" has been invented, I'll work on getting this mess here clean up and who knows, maybe even packaged in a neat DEB. I have to learn how to do this first though. Hope this helps... I'm typing this online on my brand new Intrepid!