Fixing problems with AnyDATA CDMA modems and Linux

Jon Kåre Hellan - (email)

This page tells how you make AnyDATA CDMA wireless modems work properly with Linux. Mine is an ADU-E100A, although ICE in Norway calls it D-10. Other variants are ADU-E100D and ADU-E100H. They are USB modems, connected to the computer with a cable.

Notes

Limited updating

My modem no longer works, so I cannot test with newer kernels and distributions. Therefore, this page will probably get out of date. Bug reports are welcome, of course.

Newer modems

Linux supports a number of newer Anydata modems, including ADU-310, ADU-500 and ADU-620. They can be configured in the way described here. However, I haven't tested them myself. Many 3g and CDMA modems look like a CD or memory stick when you first plug them in, and you have to switch them over before you can use them as modems. Look into usb_modeswitch or huaweiAktBbo if you have this problem. Sometimes, it's sufficient to "eject" the storage device.

The ICE CDMA network in Norway

ICE distributed the Anydata ADU-E100A USB modem until autumn 2007, rebranding it D-10. From October 2007, they are distributing another modem, which they call D50. I have not tested this modem or tried to configure it. Linux is supported, and there are several success stories on the web.

A couple of points before we start:

  • All commands mentioned below should be given as the root user from a terminal window.
  • A couple of times I tell you to watch the log file '/var/log/messages'. On some distros, the information may turn up in different log files.

The latest releases of all major desktop oriented Linux distributions already support the modem correctly. These include

  • Ubuntu Edgy, Feisty and newer
  • Ubuntu Dapper with current updates
  • Fedora Core 6, Fedora 7 and newer
  • Fedora Core 5 with current updates
  • OpenSuse 10.2 and newer
  • Debian Etch

and many others. So these days, most people can go straight to configuring the modem. However, if you are running kernel 2.6.17 or older, and have problems, please read the following sections.

People have been reporting two kinds of problems:

The modem doesn't respond at all
You can work around this without rebuilding your kernel.
New connections can't be made once the first has been closed
You have to build a new kernel to fix this, until the fix reaches your distribution.

After telling how to fix these, the page has a few words about configuring the modem.

The modem doesn't respond at all

There used to be a typo in the modem driver which caused this misbehaviour. The bug was introduced in kernel version 2.6.15 and fixed in 2.6.18. However, there could also be other reasons for the modem not responding. It won't work if it isn't plugged in!

The workaround is to use the generic usbserial driver. Give these commands:

rmmod anydata usbserial
modprobe usbserial vendor=0x16d5 product=0x6501

If you get an error message after 'rmmod anydata', that's OK.

Now you can turn the modem off and back on and try to connect. Assuming that you got connected, the next step is to make sure things are set up correctly next time without manual work. You have to

  • Arrange for the generic usbserial driver to be called with the right parameters when it is loaded.
  • Move the anydata driver out of the way so it doesn't get loaded again.
  • Tell the system that the anydata driver is no longer there.

On my Debian sid system, I did it like this:


echo "options usbserial vendor=0x16d5 product=0x6501" > /etc/modprobe/anydata
cd /lib/modules/`uname -r`

Those are backticks, not forward quotes.

mv drivers/usb/serial/anydata.ko drivers/usb/serial/anydata.ko-
depmod

Give the command 'rmmod anydata' once more. It may have got loaded when you turned the modem back on.

You could also fix the typo in the modem driver and build a new kernel. The patch is here. But if you're going to build a new kernel, you may as well fix both problems. You do so by following the directions below.

New connections can't be made once the first has been closed

You can connect to the network once. But after you disconnect, you have to turn the modem off and back on before you can reconnect to the network. After the unsuccessful attempt to reconnect, you'll see something like this in /var/log/messages:

Jul 20 19:53:32 localhost pppd[5321]: pppd 2.4.4 started by root, uid 0
...
Jul 20 19:53:33 localhost chat[5322]: send (ATZ^M)
Jul 20 19:53:33 localhost chat[5322]: expect (OK)
Jul 20 19:53:36 localhost chat[5322]: ~^?}#@!}!}(} }7}!}$}%}4}"}} } } } }#}%B#}%}'}"}
Jul 20 19:53:42 localhost chat[5322]:  } } } }#}%B#}%}'}"}(}"R$~~^?}#@!}!}*} }7}!}$}%}

Daniel Kozák discovered that he could solve this problem by making another driver handle AnyDATA modems. This driver was originally made for GSM/GPRS cards made by Option, and is named 'option'. More information - in Czech - here and here. This fix is included in the standard kernel since version 2.6.18. Some vendors backported the fix to their versions of the kernel. For instance, it is included in Ubuntu Dapper kernels since update 2.6.15-26. For others, here are versions of the patch for recent kernels:

Patch for 2.6.15 download
Patch for 2.6.16 download
Patch for 2.6.17 download

Configuring the modem

Some people like to write configuration files by hand, but I used the pppconfig program and got a setup that worked. You can use the modem configuration utility that comes with your Linux distribution.

The information you are going to need is

Phone number
All CDMA providers seem to be using #777
Login name
My provider (ICE) uses "cdma" for all customers.
Password
My provider uses "cdma".
Authentication method
My provider uses CHAP.
Speed
Doesn't seem to matter. I could enter 9600 and still get maximum speed.
Port
Often /dev/ttyUSB0. If it isn't, you have to watch the log while plugging in the modem. Type

# tail -f /var/log/messages

in a terminal window, and look for lines like

Jul 20 21:53:55 localhost kernel: usb 2-1: GSM modem (1-port) converter now attached to ttyUSB0

If you chose the generic usbserial workaround, the converter would be called 'generic' instead.

The modem has two /dev/ttyUSBn interfaces. We only use the lower numbered one. The other one is apparently for control, but the documentation hasn't been released.

I ended up with the following configuration files: '/etc/ppp/peers/cdma', '/etc/ppp/chap-secrets' and '/etc/chatscripts/cdma'. I've left them just as pppconfig made them. To get on the network, I give the command 'pon cdma', and the command to close the connection is 'poff cdma'. On distros which don't have pon and poff, you can use 'pppd call cdma' instead. There are also graphical dialers.