#
# Intel Centrino wireless drivers
#

config IPW2100
	tristate "Intel PRO/Wireless 2100 Network Connection"
	depends on PCI && CFG80211
	select WIRELESS_EXT
	select WEXT_SPY
	select WEXT_PRIV
	select FW_LOADER
	select LIB80211
	select LIBIPW
	---help---
          A driver for the Intel PRO/Wireless 2100 Network 
	  Connection 802.11b wireless network adapter.

          See <file:Documentation/networking/README.ipw2100> for information on
          the capabilities currently enabled in this driver and for tips
          for debugging issues and problems.

	  In order to use this driver, you will need a firmware image for it.
          You can obtain the firmware from
	  <http://ipw2100.sf.net/>.  Once you have the firmware image, you 
	  will need to place it in /lib/firmware.

          You will also very likely need the Wireless Tools in order to
          configure your card:

          <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.

          It is recommended that you compile this driver as a module (M)
          rather than built-in (Y). This driver requires firmware at device
          initialization time, and when built-in this typically happens
          before the filesystem is accessible (hence firmware will be
          unavailable and initialization will fail). If you do choose to build
          this driver into your kernel image, you can avoid this problem by
          including the firmware and a firmware loader in an initramfs.
 
config IPW2100_MONITOR
        bool "Enable promiscuous mode"
        depends on IPW2100
        ---help---
	  Enables promiscuous/monitor mode support for the ipw2100 driver.
	  With this feature compiled into the driver, you can switch to 
	  promiscuous mode via the Wireless Tool's Monitor mode.  While in this
	  mode, no packets can be sent.

config IPW2100_DEBUG
	bool "Enable full debugging output in IPW2100 module."
	depends on IPW2100
	---help---
	  This option will enable debug tracing output for the IPW2100.  

	  This will result in the kernel module being ~60k larger.  You can 
	  control which debug output is sent to the kernel log by setting the 
	  value in 

	  /sys/bus/pci/drivers/ipw2100/debug_level

	  This entry will only exist if this option is enabled.

	  If you are not trying to debug or develop the IPW2100 driver, you 
	  most likely want to say N here.

config IPW2200
	tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection"
	depends on PCI && CFG80211 && CFG80211_WEXT
	select WIRELESS_EXT
	select WEXT_SPY
	select WEXT_PRIV
	select FW_LOADER
	select LIB80211
	select LIBIPW
	---help---
          A driver for the Intel PRO/Wireless 2200BG and 2915ABG Network
	  Connection adapters. 

          See <file:Documentation/networking/README.ipw2200> for 
	  information on the capabilities currently enabled in this 
	  driver and for tips for debugging issues and problems.

	  In order to use this driver, you will need a firmware image for it.
          You can obtain the firmware from
	  <http://ipw2200.sf.net/>.  See the above referenced README.ipw2200 
	  for information on where to install the firmware images.

          You will also very likely need the Wireless Tools in order to
          configure your card:

          <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.

          It is recommended that you compile this driver as a module (M)
          rather than built-in (Y). This driver requires firmware at device
          initialization time, and when built-in this typically happens
          before the filesystem is accessible (hence firmware will be
          unavailable and initialization will fail). If you do choose to build
          this driver into your kernel image, you can avoid this problem by
          including the firmware and a firmware loader in an initramfs.

config IPW2200_MONITOR
        bool "Enable promiscuous mode"
        depends on IPW2200
        ---help---
	  Enables promiscuous/monitor mode support for the ipw2200 driver.
	  With this feature compiled into the driver, you can switch to 
	  promiscuous mode via the Wireless Tool's Monitor mode.  While in this
	  mode, no packets can be sent.

config IPW2200_RADIOTAP
	bool "Enable radiotap format 802.11 raw packet support"
	depends on IPW2200_MONITOR

config IPW2200_PROMISCUOUS
	bool "Enable creation of a RF radiotap promiscuous interface"
	depends on IPW2200_MONITOR
	select IPW2200_RADIOTAP
	---help---
          Enables the creation of a second interface prefixed 'rtap'. 
          This second interface will provide every received in radiotap
	  format.

          This is useful for performing wireless network analysis while
          maintaining an active association.

          Example usage:

            % modprobe ipw2200 rtap_iface=1
            % ifconfig rtap0 up
            % tethereal -i rtap0

          If you do not specify 'rtap_iface=1' as a module parameter then 
          the rtap interface will not be created and you will need to turn 
          it on via sysfs:
	
            % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface

config IPW2200_QOS
        bool "Enable QoS support"
        depends on IPW2200 && EXPERIMENTAL

config IPW2200_DEBUG
	bool "Enable full debugging output in IPW2200 module."
	depends on IPW2200
	---help---
	  This option will enable low level debug tracing output for IPW2200.

	  Note, normal debug code is already compiled in. This low level
	  debug option enables debug on hot paths (e.g Tx, Rx, ISR) and
	  will result in the kernel module being ~70 larger.  Most users
	  will typically not need this high verbosity debug information.

	  If you are not sure, say N here.

config LIBIPW
	tristate
	depends on PCI && CFG80211
	select WIRELESS_EXT
	select WEXT_SPY
	select CRYPTO
	select CRYPTO_ARC4
	select CRYPTO_ECB
	select CRYPTO_AES
	select CRYPTO_MICHAEL_MIC
	select CRYPTO_ECB
	select CRC32
	select LIB80211
	select LIB80211_CRYPT_WEP
	select LIB80211_CRYPT_TKIP
	select LIB80211_CRYPT_CCMP
	---help---
	This option enables the hardware independent IEEE 802.11
	networking stack.  This component is deprecated in favor of the
	mac80211 component.

config LIBIPW_DEBUG
	bool "Full debugging output for the LIBIPW component"
	depends on LIBIPW
	---help---
	  This option will enable debug tracing output for the
	  libipw component.

	  This will result in the kernel module being ~70k larger.  You
	  can control which debug output is sent to the kernel log by
	  setting the value in

	  /proc/net/ieee80211/debug_level

	  For example:

	  % echo 0x00000FFO > /proc/net/ieee80211/debug_level

	  For a list of values you can assign to debug_level, you
	  can look at the bit mask values in ieee80211.h

	  If you are not trying to debug or develop the libipw
	  component, you most likely want to say N here.
