This directory contains driver software for Aironet 4500 and 4800 series wireless network adapters for FreeBSD 3.x. PCMCIA, PCI and ISA devices are supported. This driver will ultimately be merged into FreeBSD-STABLE and FreeBSD-CURRENT. Support for 4.0-CURRENT is planned however I'm waiting for some of the Plug and Play support to be finalized before I complete the changes. The code here can be used to add support for Aironet devices to an existing 3.2-RELEASE or 3.3 system. The FreeBSD driver supports the following hardware: - Aironet PC4800 11Mbps PCMCIA adapter - Aironet PCI4800 11Mbps PCI adapter - Aironet ISA4800 11Mbps ISA adapter (supports ISA Plug and Play) The following devices have not been tested (I don't have any) but should work as well: - Aironet PC4500 2Mbps PCMCIA adapter - Aironet PCI4500 2Mbps PCI adapter - Aironet ISA4500 2Mbps ISA adapter (supports ISA Plug and Play) The ISA and PCI Aironet cards are actually a combination of an Aironet PCMCIA module and an ISA or PCI bridge adapter. All devices have the same programming interface and can be supported by the same driver. However I don't know for certain that I have identified all possible PCI and ISA Plug and Play IDs, therefore some devices (namely the 4500 series adapters) may not be detected properly without some small modification. If anybody has a 4500 series NIC and finds they need to add their PCI or ISA Plug and Play ID to the list in the driver, please let me know so I can update it. The source is provided in a gzipped tar archive called aironet.tar.gz, which contains the following: - if_an.c and if_anreg.h, the driver source - if_an_p.c PCI probe and attach shim source - if_aironet_ieee.h interface header - an.4, driver man page - ancontrol.c and ancontrol.8, the source and man page for the ancontrol utility (Makefile for ancontrol is included) - sample pccard.conf file with entries for the Aironet 4800 and 4500 PCMCIA cards added To add the Aironet driver to an existing system, do the following: - Download the 3.0/aironet.tar.gz archive and unpack it. - Make sure you have the kernel source code for your system unpacked under /usr/src. - Copy if_an.c and if_anreg.h to /sys/i386/isa - Copy if_an_p.c to /sys/pci - Copy if_aironet_ieee.h to /usr/include/machine - Copy if_aironet_ieee.h to /sys/i386/include - Copy an.4 to /usr/share/man/man4/man4.i386 - Copy ancontrol.8 to /usr/share/man/man8 - Compile ancontrol using the supplied Makefile and copy it to /usr/sbin. (Note: you must have if_aironet_ieee.h in place before you try to compile ancontrol.) - Copy pccard.conf.sample to /etc/pccard.conf - Edit /sys/i386/conf/files.i386 and add a line that says: i386/isa/if_an.c optional an device-driver - Edit /sys/conf/files and add a line that says: pci/if_an_p.c optional an device-driver - Edit your kernel config file and add the following lines: # Include support for PCI busses controller pci0 # Include support for PCMCIA (only required for PCMCIA Aironet cards) controller card0 device pcic0 at card? device pcic1 at card? # Include driver support for Aironet cards device an0 at isa? port? net irq? - Remove the lines for the ze0 and zp0 devices from your kernel config! These are drivers with standalone PCMCIA code used for some ethernet cards. These drivers were written before the general PCCARD support was added to FreeBSD and are not compatible with the PCCARD code. You can either have ze0/zp0 in the kernel *or* PCCARD support, but not both. The an driver is written to use the PCCARD support, therefore you can't use it with the ze0/zp0 drivers. Sorry. - *IMPORTANT* If you are using an Aironet PCMCIA adapter, then you must also perform the following small change to the pccard code in the kernel. Edit /sys/pccard/pccard.c and search for the string "vpp" which should exist in the "inserted" function as follows: static void inserted(void *arg) { struct slot *slt = arg; slt->state = filled; /* * Enable 5V to the card so that the CIS can be read. */ slt->pwr.vcc = 50; slt->pwr.vpp = 0; You must change the "vpp" line so that it says this: slt->pwr.vpp = 50; This will cause the pccard code to properly apply +5 volts to the vpp1 and vpp2 pins on the PCMCIA card: without this change, the Aironet card will not be activated in PCMCIA mode and it will not be possible to configure it correctly. Note that certain PCMCIA management software packages for Windows NT will also fail to enable the vpp voltage and will exhibit the same problem. The PCMCIA support built into Windows NT will actually work correctly, however the card must be inserted when the system is booted and if you remove the card while the OS is running, you will need to reboot in order to have the card re-probed and re-enabled. *NOTE2*: If you are using FreeBSD 3.2-RELEASE or 3.3-RELEASE and you have a laptop with an Intel 82365 PCMCIA controller, then you may need to make one other change. In the file /sys/pccard/pcic.c, there is a function called pcic_power() which applies the power settings from the inserted() function noted above. This function has a switch statement with a list of controllers that looks like this: case PCIC_PD672X: case PCIC_PD6710: case PCIC_VG365: case PCIC_VG465: case PCIC_VG468: case PCIC_VG469: case PCIC_RF5C396: case PCIC_VLSI: case PCIC_IBM_KING: To this list, you should add a line like this: case PCIC_I82365: In some cases, the I82365 may apply the correct Vpp voltages all by itself without any assistance from the OS, however there is a variant of this part called the I82365DF which does not do this. If you have the I82365DF part, then the changes to the inserted() function shown above will have no effect unless you change pcic_power() as well. This problem has been seen on certain Toshiba Libretto 100CT and 110CT models, however with some 110CT models no changes to the pccard code are necessary. You will be able to tell if the card is being activated correctly if the amber LED lights up after the kernel prints the message "Card inserted, slot X." If the amber LED never turns on, then the Vpp voltages have not been set correctly and pccardd will be unable to attach the Aironet driver to the card. - Configure your kernel and compile. To use PCMCIA devices in FreeBSD, you must enable pccardd by properly editing /etc/rc.conf or /etc/defaults/rc.conf. You should have lines like the following: pccard_enable="YES" # Set to YES if you want to configure PCCARD devices. pccard_mem="DEFAULT" # If pccard_enable=YES, this is card memory address. Setting pccard_enable to "YES" will cause pccardd to be automatically started when the system is rebooted. Note: you may beed to change the pccard_mem setting. This setting describes the base of a shared memory window used to read data (such as the CIS data for PCMCIA cards) from the PCMCIA controller. The default address is 0xd0000, and this seems to work for most laptops. In some rare cases however, you may need to specify an alternate memory window. If pccardd reports an error to /var/log/messages about an unknown device with the name ""/"" and you're sure the vpp voltages are being set properly, then you will probably need to use another address. To test an alternate address, such as 0xe0000, you can do the following: # pccardc pccardmem 0xe0000 # pccardc dumpcis If the "pccardc dumpcis" command correctly displays the CIS information for the Aironet card, then you have found the correct memory window. If not, you will need to try other addresses until you locate the correct one. Lastly, you must specify an unused IRQ in /etc/pccard.conf. Here is a sample pccard.conf entry: # Aironet PC4800 11Mbps 802.11 wireless NIC card "Aironet" "PC4800" config 0x5 "an0" 11 insert echo Aironet PC4800 inserted insert /etc/pccard_ether an0 remove echo Aironet PC4800 removed remove /sbin/ifconfig an0 delete Here, 11 means IRQ 11. This assumes that there is no other device in the system configured to use IRQ 11. If the IRQ isn't available, pccardd will complain about a resource allocation failure when it tries to configure the card. If you have a system with a PCI bus, you may want to run the BIOS configuration utility for your system and try to mark your chosen IRQ as 'reserved for ISA device' so that it doesn't try to automatically assign it to a PCI device. If you are short on IRQs, you might want to try disabling one of your serial ports or the parallel printer port. Note: by "disable" I mean turn the port off in the BIOS config utility, *NOT* removing it from the kernel configuration! Just because the kernel doesn't probe and attach a device, that doesn't mean the device isn't still there. A few additional notes: - Currently, this driver is only supported on the FreeBSD/i386 architecture however the ISA and PCI adapters will probably be supported on FreeBSD/alpha in the future. - The ISA Aironet card is supported in both hard-wired (configured via switches) or ISA Plug and Play mode. In hard-wired mode, the card can be configured for one of four I/O addresses and a handful of IRQs; if you use this mode, then you must specify the I/O address and IRQ explicitly in the kernel configuration file. This may be necessary on older machines that do not support ISA Plug and Play. If you do use ISA Plug and Play (which is the factory default switch setting) then the driver will probe the device automatically. Consult your Aironet owner's manual for more information. - PCI and ISA Plug and Play devices may be probed as an1 instead of an0 in order to avoid a possible conflict. Although this may seem a little strange, it is expected. Do not be alarmed. Breathe normally. Hopefully all of this will be handled correctly in FreeBSD 4.0 and the unit numbers will be assigned in a more sensible manner. - The driver defaults to ad-hoc mode. You can enable BSS mode with the ancontrol utility. - The FreeBSD driver encapsulates and decapsulates 802.11 frames as normal Ethernet frames, so to the system, the Aironet device looks like just another ethernet interface. However, this means that packets read from the driver using BPF will have ordinary ethernet headers instead of 802.11 packet headers. - Multicasting is supported, however the Aironet devices do not have a programmable multicast filter: instead, they receive all multicast frames and rely on the OS to perform additional filtering. Promiuscuous mode is supported however it appears to only work when the NIC is operating in infrastructure mode, not in ad-hoc mode. - Unlike the WaveLAN/IEEE devices, when the Aironet is set for ad-hoc mode, all ad-hoc stations must be on the same SSID in order to communicate. This makes it possible for several ad-hoc networks to be formed in the same area without communications overlapping. The SSID can be set with the ancontrol utility using the -n option (i.e. ancontrol -i an0 -n "MY_NETWORK"). - For those who are wondering, the actual data transfer speed with the 11Mbps cards seems to be on the order of 600KB/sec (kilobytes per second) between two stations in ad-hoc mode. I don't have an access point so I can't test infrastructure mode, however I would expect it to be similar. No, I'm not sure how they measure the 11Mbps figure. - Unlike the WaveLAN/IEEE ISA devices, the Aironet ISA and PCI cards do not require PCCARD support. That is, where the WaveLAN/IEEE cards are actually a PCMCIA bus expander and a WaveLAN/IEEE PCMCIA card slapped together, the Aironet cards actually appear to the host as ordinary ISA or PCI devices. (Aironet uses PCMCIA modules with bus adapter cards too, but their bus adapter cards are much smarter than Lucent's. :) This means you don't need to add PCCARD support to a desktop FreeBSD installation in order to use the Aironet cards like you do with the WaveLANs. It further means that you can have multiple Aironet cards in one host with fewer resource conflict problems. If you have problems with the driver, please send a detailed description of the trouble, including any possible error messages, the version of FreeBSD you're running and the version of the driver to wpaul@skynet.ctr.columbia.edu. Note: please restrict your queries to actual driver problems, not questions about how to set up PCCARD support in FreeBSD, requests for drivers for other cards, or help setting up an Aironet card on some other OS like Linux.