#
# Intel Centrino wireless drivers
#

config IPW2100
	tristate "Intel PRO/Wireless 2100 Network Connection"
	depends on m
	depends on PCI && CFG80211
	depends on WIRELESS_EXT
	depends on WEXT_SPY
	depends on WEXT_PRIV
	select BACKPORT_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 m
	depends on PCI && CFG80211 && CFG80211_WEXT
	depends on WIRELESS_EXT
	depends on WEXT_SPY
	depends on WEXT_PRIV
	select BACKPORT_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

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 m
	depends on PCI && CFG80211
	depends on WIRELESS_EXT
	depends on WEXT_SPY
	depends on CRYPTO
	depends on CRYPTO_ARC4
	depends on CRYPTO_ECB
	depends on CRYPTO_AES
	depends on CRYPTO_MICHAEL_MIC
	depends on CRYPTO_ECB
	depends on 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.
