MADWIFI: Multimode Atheros Driver for WiFi on Linux (VAP branch)
================================================================

* Copyright (c) 2002-2005 Sam Leffler.  All rights reserved.

Read the file COPYRIGHT for the complete copyright.


Requirements
------------

- Kernel sources of the target kernel (some Linux distributions provide
  headers, makefiles and configuration data - it should suffice).
- Wireless Extensions support (14 or later, 17 preferred) - option
  CONFIG_NET_RADIO in kernel .config file.
- Sysctl support - option CONFIG_SYSCTL in kernel .config file.
- Crypto API support - option CONFIG_CRYPTO in kernel .config file (AES
  support is used if present, otherwise the AES-CCMP cipher module falls
  back to a private implementation).
- gcc of same version that was used to compile the kernel (ignoring this
  will cause "Invalid module format" errors during module load).

2.4.x kernels starting with 2.4.22 and 2.6 kernels should work without
problems.  Other kernel versions may require modifications, e.g. for
crypto support and/or updated wireless extensions.


Building the driver
-------------------

The driver is built using the Linux kernel build mechanism.  This means
you must have some part of the kernel source distribution installed on
the machine where you want to build the driver.  In particular, the
kernel include files, makefiles, build scripts and configuration must be
available.

This will be present if you built your kernel from source.  Otherwise
you may need to install an additional kernel development package from
your distribution that would match your kernel.  For example, the
development package for the default kernel is called linux-headers on
Debian and kernel-devel on Fedora Core.  Installing a package with full
kernel sources should not be generally necessary.

Note: in the following examples "trouble%" stands for your system
prompt; you're not expected to type that as part of the actual command.

Most people can just type:

  trouble% make

in the top-level MadWifi source directory to build all the modules for
the currently running system.

You MUST do a "make clean" before compiling for a different version of
Linux, e.g. building for 2.6 after building for 2.4.

If you want to compile MadWifi for a different kernel, you need to
specify the location of the kernel build tree, e.g.:

  trouble% make KERNELPATH=/usr/src/linux-2.6.3

Note that you can also specify this path by setting an environment
variable; e.g.

  trouble% export KERNELPATH=/usr/src/linux-2.6.3
  trouble% make

If the kernel was built outside the source directory, KERNELPATH should
point to the output directory where .config is located, not to the
sources.

MadWifi currently provides three different rate control algorithms,
ONOE, AMRR and SAMPLE.  SAMPLE is the most advanced one and is used by
default.  In order to make MadWifi use AMRR instead, you have to specify
that via the ATH_RATE environment variable; e.g.

  trouble% export ATH_RATE=ath_rate/amrr
  trouble% make

NOTE: Changing the rate control is only required (and recommended) for
      users who want to setup an access point using MadWifi in difficult
      (e.g. lossy) environments and who know what they are doing.

This distribution includes support for a variety of target platforms.
Because of the binary nature of the HAL not all platforms are supported
(the list grows as time permits).  The supported target platforms can be
found with:

  trouble% ls hal/pub/*.inc

A target specifies the CPU architecture, byte order, and the ABI/file
format.  For most popular platforms, the build system will find the
appropriate files.  When cross-compiling or compiling for less common
platforms, the target platform may need to be specified using the TARGET
variable, e.g:

  trouble% make TARGET=armv4-le-elf

Consult the contents of the .inc file to find out what the target
platform is and what toolchain was used to build the HAL object module. 
Beware of mixing toolchains; some target platforms require that the HAL
and driver be built with the same toolchain (i.e. compiler, assembler,
and linker) and the same compiler flags.  If you get warnings about
incompatible compiler flags, chances are that you are compiling for a
wrong target or using an incompatible compiler.

The build system is designed to support cross-building without any
modification to the distribution files.  If you cannot do what you need
by setting environment variables please send patches to show where
things failed to do the right thing.


Building the software will generate numerous loadable modules:

  ath_pci		Atheros driver for PCI/Cardbus devices
  ath_hal		Atheros HAL
  wlan			802.11 support layer
  wlan_wep		WEP cipher support
  wlan_tkip		TKIP cipher support
  wlan_ccmp		AES-CCMP cipher support
  wlan_xauth		external authenticator
  wlan_acl		MAC ACL support for AP operation
  wlan_scan_ap		AP scanning support
  wlan_scan_sta		station scanning support

and, depending on the rate control algorithm you choose (see above), one
of these:

  ath_rate_onoe		ONOE rate control
  ath_rate_amrr		AMRR rate control
  ath_rate_sample	SAMPLE rate control

The ath_pci module must be loaded either manually or by the system, e.g.
through the hotplug or card manager support.  The remaining modules are
loaded automatically as needed, so after doing a "make install" you only
need to run following:

  modprobe ath_pci

For automatic module loading you may need to modify your system's
configuration files so the necessary modules are loaded when an Atheros
device is recognized.  The exact procedure varies from system to system.

There are module parameters available to fit your needs, e.g. you can
set the countrycode manually if your card's EEPROM does not contain the
correct one for your location.  See
http://www.unicode.org/onlinedat/countries.html to find your code.

To activate German frequencies you would specify:

  modprobe ath_pci countrycode=276

To see available parameters type:

  modinfo ath_pci

Further information on how to work with the driver can be found in the
file README.  In addition, the project's wiki has a lot of valuable
information:

http://madwifi.org/
