At present (September 2004), the Air Prime 5220 is the only device available for this service. Verizon officially supports it only on Microsoft Windows, and Apple has a driver for Mac OS X. Fortunately, it isn't hard to get it working on Linux. (Note: AirPrime was acquired by Sierra Wireless in the summer of 2003).
The 5220 card cannot make voice calls. Several other features of the MSM 5500 are also unavailable.
To get the card going on Linux, you first must install the Linux driver for the OHCI USB host adapter and then a Linux USB driver for the MSM itself. Finally, the Linux point-to-point protocol daemon pppd can be configured to place calls over the MSM's virtual serial port.
# lspci -vv -s06:00.0 06:00.0 USB Controller: Lucent Microelectronics USS-312 USB Controller (rev 10) (prog-if 10 [OHCI]) Subsystem: Lucent Microelectronics USS-312 USB Controller Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort-
If you configure the OHCI driver as a module, you can either set up the Linux hotplug subsystem to load it on demand when this card is inserted or you can append usb-ohci to /etc/modules so that it will be loaded at boot time.
Since changes to /etc/modules require a reboot to take effect, you can avoid a reboot by also manually installing the module into your running kernel with the command modprobe usb-ohci .
Note that you will need to be root both to edit /etc/modules and to run the modprobe command.
Verify that the usb-ohci driver found the 5220's USB host adapter with the MSM chip attached:
$ cat /proc/bus/usb/devices T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0 D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 0.00 S: Product=USB OHCI Root Hub S: SerialNumber=e8987000 C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms T: Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=16 #Cfgs= 1 P: Vendor=0f3d ProdID=0112 Rev= 0.01 S: Manufacturer=AirPrime, Incorporated S: Product=AirPrime CDMA Wireless PC Card C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=serial E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=128ms E: Ad=8a(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=0b(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=serial E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=05(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms [remainder of output removed]
# modprobe usbserial vendor=0xf3d product=0x0112and appending this line to /etc/modules will cause it to be automatically (re)loaded the next time you reboot:
usbserial vendor=0xf3d product=0x0112Verify that the usbserial driver found the MSM by looking at /var/log/messages or the output of the dmesg command. It should look something like this:
usb.c: registered new driver serial usbserial.c: USB Serial support registered for Generic usbserial.c: Generic converter detected usbserial.c: Generic converter now attached to ttyUSB0 (or usb/tts/0 for devfs) usb.c: serial driver claimed interface c55f9a20 usbserial.c: Generic converter detected usbserial.c: Generic converter now attached to ttyUSB1 (or usb/tts/1 for devfs) usb.c: serial driver claimed interface c55f9a38 usbserial.c: USB Serial Driver core v1.4If you are running devfs, the device file system, the character special devices /dev/usb/tts/0 and /dev/usb/tts/1 should now exist. Otherwise you should make the appropriate nodes if they don't already exist:
# mknod /dev/ttyUSB0 c 188 0 # mknod /dev/ttyUSB1 c 188 1
-detach ttyUSB0 115200 debug noauth defaultroute usepeerdns user email@example.com show-password crtscts lock connect '/usr/sbin/chat -v -t3 -f /etc/ppp/peers/1xevdo_chat'Replace your_telephone_number with your 10-digit Verizon-assigned telephone number that you received with your 5220 card.
Create /etc/ppp/peers/1xevdo_chat with these contents:
'' 'AT' 'OK' 'ATE0V1&F&D2&C1&C2S0=0' 'OK' 'ATE0V1' 'OK' 'ATS7=60' 'OK' 'ATDT#777'
Finally, append this line to /etc/ppp/pap-secrets:
firstname.lastname@example.org * vzwagain replacing your_telephone_number with the 10-digit telephone number of your 5220 card. (Why an Internet device that cannot make voice calls should require a telephone number is beyond me.)
Just in case it wasn't obvious, we created a PPP dialup account that can be reached by dialing #777 (#PPP) over /dev/ttyUSB0. Your PPP login name is your 10-digit phone number followed by @vzw3g.com and your password is simply vzw.
sudo pppd call 1xevdoIf you succeed in setting up the link, you will see something like this:
$ sudo pppd call 1xevdo Perms of /dev/ttyUSB0 are ok, no 'mesg n' neccesary. Serial connection established. using channel 1 Using interface ppp0 Connect: ppp0 <--> /dev/ttyUSB0 sent [LCP ConfReq id=0x1Because of the -detach flag in /etc/ppp/peers/1xevdo, debug messages will continue to appear in this window. I find this useful to see link status at a glance. Do not hit control-C unless you want to bring down the link. Test it from another shell window:
] sent [LCP ConfReq id=0x1 ] rcvd [LCP ConfReq id=0x0 ] sent [LCP ConfAck id=0x0 ] rcvd [LCP ConfReq id=0x1 ] sent [LCP ConfAck id=0x1 ] sent [LCP ConfReq id=0x1 ] rcvd [LCP ConfAck id=0x1 ] sent [LCP EchoReq id=0x0 magic=0xc57d039a] sent [CCP ConfReq id=0x1 ] sent [IPCP ConfReq id=0x1 ] rcvd [LCP DiscReq id=0x2 magic=0x32250cdb] rcvd [LCP EchoRep id=0x0 magic=0x32250cdb c5 7d 03 9a] rcvd [LCP ProtRej id=0x4 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f] rcvd [IPCP ConfReq id=0x3 ] sent [IPCP ConfAck id=0x3 ] rcvd [IPCP ConfRej id=0x1 ] sent [IPCP ConfReq id=0x2 ] rcvd [IPCP ConfNak id=0x2 ] sent [IPCP ConfReq id=0x3 ] rcvd [IPCP ConfAck id=0x3 ] not replacing default route to eth0 [126.96.36.199] Cannot determine ethernet address for proxy ARP local IP address 188.8.131.52 remote IP address 184.108.40.206 primary DNS address 220.127.116.11 secondary DNS address 18.104.22.168 Script /etc/ppp/ip-up started (pid 3416) Script /etc/ppp/ip-up finished (pid 3416), status = 0x0
$ ping 22.214.171.124 PING 126.96.36.199 (188.8.131.52) 56(84) bytes of data. 64 bytes from 184.108.40.206: icmp_seq=1 ttl=64 time=608 ms 64 bytes from 220.127.116.11: icmp_seq=2 ttl=64 time=180 ms 64 bytes from 18.104.22.168: icmp_seq=3 ttl=64 time=400 ms 64 bytes from 22.214.171.124: icmp_seq=4 ttl=64 time=190 ms --- 126.96.36.199 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3038ms rtt min/avg/max/mdev = 180.092/344.649/608.135/175.670 ms $Success! You should now be on the Internet!
Last modified: 17 Sep 2004, Phil Karn