
#
# Network device configuration
#

menu "Network device support"
	depends on NET

config NETDEVICES
	default y if UML
	bool "Network device support"
	---help---
	  You can say N here if you don't intend to connect your Linux box to
	  any other computer at all.

	  You'll have to say Y if your computer contains a network card that
	  you want to use under Linux. If you are going to run SLIP or PPP over
	  telephone line or null modem cable you need say Y here. Connecting
	  two machines with parallel ports using PLIP needs this, as well as
	  AX.25/KISS for sending Internet traffic over amateur radio links.

	  See also "The Linux Network Administrator's Guide" by Olaf Kirch and
	  Terry Dawson. Available at <http://www.tldp.org/guides.html>.

	  If unsure, say Y.

# All the following symbols are dependent on NETDEVICES - do not repeat
# that for each of the symbols.
if NETDEVICES

config IFB
	tristate "Intermediate Functional Block support"
	depends on NET_CLS_ACT
	---help---
	  This is an intermediate driver that allows sharing of
	  resources.
	  To compile this driver as a module, choose M here: the module
	  will be called ifb.  If you want to use more than one ifb
	  device at a time, you need to compile this driver as a module.
	  Instead of 'ifb', the devices will then be called 'ifb0',
	  'ifb1' etc.
	  Look at the iproute2 documentation directory for usage etc

config DUMMY
	tristate "Dummy net driver support"
	---help---
	  This is essentially a bit-bucket device (i.e. traffic you send to
	  this device is consigned into oblivion) with a configurable IP
	  address. It is most commonly used in order to make your currently
	  inactive SLIP address seem like a real address for local programs.
	  If you use SLIP or PPP, you might want to say Y here. Since this
	  thing often comes in handy, the default is Y. It won't enlarge your
	  kernel either. What a deal. Read about it in the Network
	  Administrator's Guide, available from
	  <http://www.tldp.org/docs.html#guide>.

	  To compile this driver as a module, choose M here: the module
	  will be called dummy.  If you want to use more than one dummy
	  device at a time, you need to compile this driver as a module.
	  Instead of 'dummy', the devices will then be called 'dummy0',
	  'dummy1' etc.

config BONDING
	tristate "Bonding driver support"
	depends on INET
	---help---
	  Say 'Y' or 'M' if you wish to be able to 'bond' multiple Ethernet
	  Channels together. This is called 'Etherchannel' by Cisco,
	  'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux.

	  The driver supports multiple bonding modes to allow for both high
	  performance and high availability operation.

	  Refer to <file:Documentation/networking/bonding.txt> for more
	  information.

	  To compile this driver as a module, choose M here: the module
	  will be called bonding.

config EQUALIZER
	tristate "EQL (serial line load balancing) support"
	---help---
	  If you have two serial connections to some other computer (this
	  usually requires two modems and two telephone lines) and you use
	  SLIP (the protocol for sending Internet traffic over telephone
	  lines) or PPP (a better SLIP) on them, you can make them behave like
	  one double speed connection using this driver.  Naturally, this has
	  to be supported at the other end as well, either with a similar EQL
	  Linux driver or with a Livingston Portmaster 2e.

	  Say Y if you want this and read
	  <file:Documentation/networking/eql.txt>.  You may also want to read
	  section 6.2 of the NET-3-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here: the module
	  will be called eql.  If unsure, say N.

config TUN
	tristate "Universal TUN/TAP device driver support"
	select CRC32
	---help---
	  TUN/TAP provides packet reception and transmission for user space
	  programs.  It can be viewed as a simple Point-to-Point or Ethernet
	  device, which instead of receiving packets from a physical media,
	  receives them from user space program and instead of sending packets
	  via physical media writes them to the user space program.

	  When a program opens /dev/net/tun, driver creates and registers
	  corresponding net device tunX or tapX.  After a program closed above
	  devices, driver will automatically delete tunXX or tapXX device and
	  all routes corresponding to it.

	  Please read <file:Documentation/networking/tuntap.txt> for more
	  information.

	  To compile this driver as a module, choose M here: the module
	  will be called tun.

	  If you don't know what to use this for, you don't need it.

config NET_SB1000
	tristate "General Instruments Surfboard 1000"
	depends on PNP
	---help---
	  This is a driver for the General Instrument (also known as
	  NextLevel) SURFboard 1000 internal
	  cable modem. This is an ISA card which is used by a number of cable
	  TV companies to provide cable modem access. It's a one-way
	  downstream-only cable modem, meaning that your upstream net link is
	  provided by your regular phone modem.

	  At present this driver only compiles as a module, so say M here if
	  you have this card. The module will be called sb1000. Then read
	  <file:Documentation/networking/README.sb1000> for information on how
	  to use this module, as it needs special ppp scripts for establishing
	  a connection. Further documentation and the necessary scripts can be
	  found at:

	  <http://www.jacksonville.net/~fventuri/>
	  <http://home.adelphia.net/~siglercm/sb1000.html>
	  <http://linuxpower.cx/~cable/>

	  If you don't have this card, of course say N.

source "drivers/net/arcnet/Kconfig"

source "drivers/net/phy/Kconfig"

#
#	Ethernet
#

menu "Ethernet (10 or 100Mbit)"
	depends on !UML

config NET_ETHERNET
	bool "Ethernet (10 or 100Mbit)"
	---help---
	  Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
	  type of Local Area Network (LAN) in universities and companies.

	  Common varieties of Ethernet are: 10BASE-2 or Thinnet (10 Mbps over
	  coaxial cable, linking computers in a chain), 10BASE-T or twisted
	  pair (10 Mbps over twisted pair cable, linking computers to central
	  hubs), 10BASE-F (10 Mbps over optical fiber links, using hubs),
	  100BASE-TX (100 Mbps over two twisted pair cables, using hubs),
	  100BASE-T4 (100 Mbps over 4 standard voice-grade twisted pair
	  cables, using hubs), 100BASE-FX (100 Mbps over optical fiber links)
	  [the 100BASE varieties are also known as Fast Ethernet], and Gigabit
	  Ethernet (1 Gbps over optical fiber or short copper links).

	  If your Linux machine will be connected to an Ethernet and you have
	  an Ethernet network interface card (NIC) installed in your computer,
	  say Y here and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>. You will then also have
	  to say Y to the driver for your particular NIC.

	  Note that the answer to this question won't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about Ethernet network cards. If unsure, say N.

config MII
	tristate "Generic Media Independent Interface device support"
	depends on NET_ETHERNET
	help
	  Most ethernet controllers have MII transceiver either as an external
	  or internal device.  It is safe to say Y or M here even if your
	  ethernet card lack MII.

config MACB
	tristate "Atmel MACB support"
	depends on NET_ETHERNET && (AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263)
	select MII
	help
	  The Atmel MACB ethernet interface is found on many AT32 and AT91
	  parts. Say Y to include support for the MACB chip.

	  To compile this driver as a module, choose M here: the module
	  will be called macb.

source "drivers/net/arm/Kconfig"

config MACE
	tristate "MACE (Power Mac ethernet) support"
	depends on NET_ETHERNET && PPC_PMAC && PPC32
	select CRC32
	help
	  Power Macintoshes and clones with Ethernet built-in on the
	  motherboard will usually use a MACE (Medium Access Control for
	  Ethernet) interface. Say Y to include support for the MACE chip.

	  To compile this driver as a module, choose M here: the module
	  will be called mace.

config MACE_AAUI_PORT
	bool "Use AAUI port instead of TP by default"
	depends on MACE
	help
	  Some Apple machines (notably the Apple Network Server) which use the
	  MACE ethernet chip have an Apple AUI port (small 15-pin connector),
	  instead of an 8-pin RJ45 connector for twisted-pair ethernet.  Say
	  Y here if you have such a machine.  If unsure, say N.
	  The driver will default to AAUI on ANS anyway, and if you use it as
	  a module, you can provide the port_aaui=0|1 to force the driver.

config BMAC
	tristate "BMAC (G3 ethernet) support"
	depends on NET_ETHERNET && PPC_PMAC && PPC32
	select CRC32
	help
	  Say Y for support of BMAC Ethernet interfaces. These are used on G3
	  computers.

	  To compile this driver as a module, choose M here: the module
	  will be called bmac.

config ARIADNE
	tristate "Ariadne support"
	depends on NET_ETHERNET && ZORRO
	help
	  If you have a Village Tronic Ariadne Ethernet adapter, say Y.
	  Otherwise, say N.

	  To compile this driver as a module, choose M here: the module
	  will be called ariadne.

config A2065
	tristate "A2065 support"
	depends on NET_ETHERNET && ZORRO
	select CRC32
	help
	  If you have a Commodore A2065 Ethernet adapter, say Y. Otherwise,
	  say N.

	  To compile this driver as a module, choose M here: the module
	  will be called a2065.

config HYDRA
	tristate "Hydra support"
	depends on NET_ETHERNET && ZORRO
	select CRC32
	help
	  If you have a Hydra Ethernet adapter, say Y. Otherwise, say N.

	  To compile this driver as a module, choose M here: the module
	  will be called hydra.

config ZORRO8390
	tristate "Zorro NS8390-based Ethernet support"
	depends on NET_ETHERNET && ZORRO
	select CRC32
	help
	  This driver is for Zorro Ethernet cards using an NS8390-compatible
	  chipset, like the Village Tronic Ariadne II and the Individual
	  Computers X-Surf Ethernet cards. If you have such a card, say Y.
	  Otherwise, say N.

	  To compile this driver as a module, choose M here: the module
	  will be called zorro8390.

config APNE
	tristate "PCMCIA NE2000 support"
	depends on NET_ETHERNET && AMIGA_PCMCIA
	select CRC32
	help
	  If you have a PCMCIA NE2000 compatible adapter, say Y.  Otherwise,
	  say N.

	  To compile this driver as a module, choose M here: the module
	  will be called apne.

config APOLLO_ELPLUS
	tristate "Apollo 3c505 support"
	depends on NET_ETHERNET && APOLLO
	help
	  Say Y or M here if your Apollo has a 3Com 3c505 ISA Ethernet card.
	  If you don't have one made for Apollos, you can use one from a PC,
	  except that your Apollo won't be able to boot from it (because the
	  code in the ROM will be for a PC).

config MAC8390
	bool "Macintosh NS 8390 based ethernet cards"
	depends on NET_ETHERNET && MAC
	select CRC32
	help
	  If you want to include a driver to support Nubus or LC-PDS
	  Ethernet cards using an NS8390 chipset or its equivalent, say Y
	  and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

config MAC89x0
	tristate "Macintosh CS89x0 based ethernet cards"
	depends on NET_ETHERNET && MAC
	---help---
	  Support for CS89x0 chipset based Ethernet cards.  If you have a
	  Nubus or LC-PDS network (Ethernet) card of this type, say Y and
	  read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  This module will
	  be called mac89x0.

config MACSONIC
	tristate "Macintosh SONIC based ethernet (onboard, NuBus, LC, CS)"
	depends on NET_ETHERNET && MAC
	---help---
	  Support for NatSemi SONIC based Ethernet devices.  This includes
	  the onboard Ethernet in many Quadras as well as some LC-PDS,
	  a few Nubus and all known Comm Slot Ethernet cards.  If you have
	  one of these say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  This module will
	  be called macsonic.

config MACMACE
	bool "Macintosh (AV) onboard MACE ethernet"
	depends on NET_ETHERNET && MAC
	select CRC32
	help
	  Support for the onboard AMD 79C940 MACE Ethernet controller used in
	  the 660AV and 840AV Macintosh.  If you have one of these Macintoshes
	  say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

config MVME147_NET
	tristate "MVME147 (Lance) Ethernet support"
	depends on NET_ETHERNET && MVME147
	select CRC32
	help
	  Support for the on-board Ethernet interface on the Motorola MVME147
	  single-board computer.  Say Y here to include the
	  driver for this chip in your kernel.
	  To compile this driver as a module, choose M here.

config MVME16x_NET
	tristate "MVME16x Ethernet support"
	depends on NET_ETHERNET && MVME16x
	help
	  This is the driver for the Ethernet interface on the Motorola
	  MVME162, 166, 167, 172 and 177 boards.  Say Y here to include the
	  driver for this chip in your kernel.
	  To compile this driver as a module, choose M here.

config BVME6000_NET
	tristate "BVME6000 Ethernet support"
	depends on NET_ETHERNET && BVME6000
	help
	  This is the driver for the Ethernet interface on BVME4000 and
	  BVME6000 VME boards.  Say Y here to include the driver for this chip
	  in your kernel.
	  To compile this driver as a module, choose M here.

config ATARILANCE
	tristate "Atari Lance support"
	depends on NET_ETHERNET && ATARI
	help
	  Say Y to include support for several Atari Ethernet adapters based
	  on the AMD Lance chipset: RieblCard (with or without battery), or
	  PAMCard VME (also the version by Rhotron, with different addresses).

config ATARI_BIONET
	tristate "BioNet-100 support"
	depends on NET_ETHERNET && ATARI && ATARI_ACSI && BROKEN
	help
	  Say Y to include support for BioData's BioNet-100 Ethernet adapter
	  for the ACSI port. The driver works (has to work...) with a polled
	  I/O scheme, so it's rather slow :-(

config ATARI_PAMSNET
	tristate "PAMsNet support"
	depends on NET_ETHERNET && ATARI && ATARI_ACSI && BROKEN
	help
	  Say Y to include support for the PAMsNet Ethernet adapter for the
	  ACSI port ("ACSI node"). The driver works (has to work...) with a
	  polled I/O scheme, so it's rather slow :-(

config SUN3LANCE
	tristate "Sun3/Sun3x on-board LANCE support"
	depends on NET_ETHERNET && (SUN3 || SUN3X)
	help
	  Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80)
	  featured an AMD Lance 10Mbit Ethernet controller on board; say Y
	  here to compile in the Linux driver for this and enable Ethernet.
	  General Linux information on the Sun 3 and 3x series (now
	  discontinued) is at
	  <http://www.angelfire.com/ca2/tech68k/sun3.html>.

	  If you're not building a kernel for a Sun 3, say N.

config SUN3_82586
	bool "Sun3 on-board Intel 82586 support"
	depends on NET_ETHERNET && SUN3
	help
	  This driver enables support for the on-board Intel 82586 based
	  Ethernet adapter found on Sun 3/1xx and 3/2xx motherboards.  Note
	  that this driver does not support 82586-based adapters on additional
	  VME boards.

config HPLANCE
	bool "HP on-board LANCE support"
	depends on NET_ETHERNET && DIO
	select CRC32
	help
	  If you want to use the builtin "LANCE" Ethernet controller on an
	  HP300 machine, say Y here.

config LASI_82596
	tristate "Lasi ethernet"
	depends on NET_ETHERNET && GSC
	help
	  Say Y here to support the builtin Intel 82596 ethernet controller
	  found in Hewlett-Packard PA-RISC machines with 10Mbit ethernet.

config MIPS_JAZZ_SONIC
	tristate "MIPS JAZZ onboard SONIC Ethernet support"
	depends on NET_ETHERNET && MACH_JAZZ
	help
	  This is the driver for the onboard card of MIPS Magnum 4000,
	  Acer PICA, Olivetti M700-10 and a few other identical OEM systems.

config MIPS_AU1X00_ENET
	bool "MIPS AU1000 Ethernet support"
	depends on NET_ETHERNET && SOC_AU1X00
	select PHYLIB
	select CRC32
	help
	  If you have an Alchemy Semi AU1X00 based system
	  say Y.  Otherwise, say N.

config NET_SB1250_MAC
	tristate "SB1250 Ethernet support"
	depends on NET_ETHERNET && SIBYTE_SB1xxx_SOC

config SGI_IOC3_ETH
	bool "SGI IOC3 Ethernet"
	depends on NET_ETHERNET && PCI && SGI_IP27
	select CRC32
	select MII
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

config SGI_IOC3_ETH_HW_RX_CSUM
	bool "Receive hardware checksums"
	depends on SGI_IOC3_ETH && INET
	default y
	help
	  The SGI IOC3 network adapter supports TCP and UDP checksums in
	  hardware to offload processing of these checksums from the CPU.  At
	  the moment only acceleration of IPv4 is supported.  This option
	  enables offloading for checksums on receive.  If unsure, say Y.

config SGI_IOC3_ETH_HW_TX_CSUM
	bool "Transmit hardware checksums"
	depends on SGI_IOC3_ETH && INET
	default y
	help
	  The SGI IOC3 network adapter supports TCP and UDP checksums in
	  hardware to offload processing of these checksums from the CPU.  At
	  the moment only acceleration of IPv4 is supported.  This option
	  enables offloading for checksums on transmit.  If unsure, say Y.

config MIPS_SIM_NET
	tristate "MIPS simulator Network device"
	depends on NET_ETHERNET && MIPS_SIM
	help
	  The MIPSNET device is a simple Ethernet network device which is
	  emulated by the MIPS Simulator.
	  If you are not using a MIPSsim or are unsure, say N.

config SGI_O2MACE_ETH
	tristate "SGI O2 MACE Fast Ethernet support"
	depends on NET_ETHERNET && SGI_IP32=y

config STNIC
	tristate "National DP83902AV  support"
	depends on NET_ETHERNET && SUPERH
	select CRC32
	help
	  Support for cards based on the National Semiconductor DP83902AV
	  ST-NIC Serial Network Interface Controller for Twisted Pair.  This
	  is a 10Mbit/sec Ethernet controller.  Product overview and specs at
	  <http://www.national.com/pf/DP/DP83902A.html>.

	  If unsure, say N.

config SUNLANCE
	tristate "Sun LANCE support"
	depends on NET_ETHERNET && SBUS
	select CRC32
	help
	  This driver supports the "le" interface present on all 32-bit Sparc
	  systems, on some older Ultra systems and as an Sbus option.  These
	  cards are based on the AMD Lance chipset, which is better known
	  via the NE2100 cards.

	  To compile this driver as a module, choose M here: the module
	  will be called sunlance.

config HAPPYMEAL
	tristate "Sun Happy Meal 10/100baseT support"
	depends on NET_ETHERNET && (SBUS || PCI)
	select CRC32
	help
	  This driver supports the "hme" interface present on most Ultra
	  systems and as an option on older Sbus systems. This driver supports
	  both PCI and Sbus devices. This driver also supports the "qfe" quad
	  100baseT device available in both PCI and Sbus configurations.

	  To compile this driver as a module, choose M here: the module
	  will be called sunhme.

config SUNBMAC
	tristate "Sun BigMAC 10/100baseT support (EXPERIMENTAL)"
	depends on NET_ETHERNET && SBUS && EXPERIMENTAL
	select CRC32
	help
	  This driver supports the "be" interface available as an Sbus option.
	  This is Sun's older 100baseT Ethernet device.

	  To compile this driver as a module, choose M here: the module
	  will be called sunbmac.

config SUNQE
	tristate "Sun QuadEthernet support"
	depends on NET_ETHERNET && SBUS
	select CRC32
	help
	  This driver supports the "qe" 10baseT Ethernet device, available as
	  an Sbus option. Note that this is not the same as Quad FastEthernet
	  "qfe" which is supported by the Happy Meal driver instead.

	  To compile this driver as a module, choose M here: the module
	  will be called sunqe.

config SUNGEM
	tristate "Sun GEM support"
	depends on NET_ETHERNET && PCI
	select CRC32
	help
	  Support for the Sun GEM chip, aka Sun GigabitEthernet/P 2.0.  See also
	  <http://www.sun.com/products-n-solutions/hardware/docs/pdf/806-3985-10.pdf>.

config CASSINI
	tristate "Sun Cassini support"
	depends on NET_ETHERNET && PCI
	select CRC32
	help
	  Support for the Sun Cassini chip, aka Sun GigaSwift Ethernet. See also
	  <http://www.sun.com/products-n-solutions/hardware/docs/pdf/817-4341-10.pdf>

config NET_VENDOR_3COM
	bool "3COM cards"
	depends on NET_ETHERNET && (ISA || EISA || MCA || PCI)
	help
	  If you have a network (Ethernet) card belonging to this class, say Y
	  and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about 3COM cards. If you say Y, you will be asked for
	  your specific card in the following questions.

config EL1
	tristate "3c501 \"EtherLink\" support"
	depends on NET_VENDOR_3COM && ISA
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.  Also, consider buying a
	  new card, since the 3c501 is slow, broken, and obsolete: you will
	  have problems.  Some people suggest to ping ("man ping") a nearby
	  machine every minute ("man cron") when using this card.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c501.

config EL2
	tristate "3c503 \"EtherLink II\" support"
	depends on NET_VENDOR_3COM && ISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c503.

config ELPLUS
	tristate "3c505 \"EtherLink Plus\" support"
	depends on NET_VENDOR_3COM && ISA && ISA_DMA_API
	---help---
	  Information about this network (Ethernet) card can be found in
	  <file:Documentation/networking/3c505.txt>.  If you have a card of
	  this type, say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c505.

config EL16
	tristate "3c507 \"EtherLink 16\" support (EXPERIMENTAL)"
	depends on NET_VENDOR_3COM && ISA && EXPERIMENTAL
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c507.

config EL3
	tristate "3c509/3c529 (MCA)/3c579 \"EtherLink III\" support"
	depends on NET_VENDOR_3COM && (ISA || EISA || MCA)
	---help---
	  If you have a network (Ethernet) card belonging to the 3Com
	  EtherLinkIII series, say Y and read the Ethernet-HOWTO, available
	  from <http://www.tldp.org/docs.html#howto>.

	  If your card is not working you may need to use the DOS
	  setup disk to disable Plug & Play mode, and to select the default
	  media type.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c509.

config 3C515
	tristate "3c515 ISA \"Fast EtherLink\""
	depends on NET_VENDOR_3COM && (ISA || EISA) && ISA_DMA_API
	help
	  If you have a 3Com ISA EtherLink XL "Corkscrew" 3c515 Fast Ethernet
	  network card, say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c515.

config ELMC
	tristate "3c523 \"EtherLink/MC\" support"
	depends on NET_VENDOR_3COM && MCA_LEGACY
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c523.

config ELMC_II
	tristate "3c527 \"EtherLink/MC 32\" support (EXPERIMENTAL)"
	depends on NET_VENDOR_3COM && MCA && MCA_LEGACY
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called 3c527.

config VORTEX
	tristate "3c590/3c900 series (592/595/597) \"Vortex/Boomerang\" support"
	depends on NET_VENDOR_3COM && (PCI || EISA)
	select MII
	---help---
	  This option enables driver support for a large number of 10Mbps and
	  10/100Mbps EISA, PCI and PCMCIA 3Com network cards:

	  "Vortex"    (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI
	  "Boomerang" (EtherLink XL 3c900 or 3c905)            PCI
	  "Cyclone"   (3c540/3c900/3c905/3c980/3c575/3c656)    PCI and Cardbus
	  "Tornado"   (3c905)                                  PCI
	  "Hurricane" (3c555/3cSOHO)                           PCI

	  If you have such a card, say Y and read the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>. More
	  specific information is in
	  <file:Documentation/networking/vortex.txt> and in the comments at
	  the beginning of <file:drivers/net/3c59x.c>.

	  To compile this support as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.

config TYPHOON
	tristate "3cr990 series \"Typhoon\" support"
	depends on NET_VENDOR_3COM && PCI
	select CRC32
	---help---
	  This option enables driver support for the 3cr990 series of cards:

	  3C990-TX, 3CR990-TX-95, 3CR990-TX-97, 3CR990-FX-95, 3CR990-FX-97,
	  3CR990SVR, 3CR990SVR95, 3CR990SVR97, 3CR990-FX-95 Server,
	  3CR990-FX-97 Server, 3C990B-TX-M, 3C990BSVR

	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called typhoon.

config LANCE
	tristate "AMD LANCE and PCnet (AT1500 and NE2100) support"
	depends on NET_ETHERNET && ISA && ISA_DMA_API
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>. Some LinkSys cards are
	  of this type.

	  To compile this driver as a module, choose M here: the module
	  will be called lance.  This is recommended.

config NET_VENDOR_SMC
	bool "Western Digital/SMC cards"
	depends on NET_ETHERNET && (ISA || MCA || EISA || MAC)
	help
	  If you have a network (Ethernet) card belonging to this class, say Y
	  and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about Western Digital cards. If you say Y, you will be
	  asked for your specific card in the following questions.

config WD80x3
	tristate "WD80*3 support"
	depends on NET_VENDOR_SMC && ISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called wd.

config ULTRAMCA
	tristate "SMC Ultra MCA support"
	depends on NET_VENDOR_SMC && MCA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type and are running
	  an MCA based system (PS/2), say Y and read the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called smc-mca.

config ULTRA
	tristate "SMC Ultra support"
	depends on NET_VENDOR_SMC && ISA
	select CRC32
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Important: There have been many reports that, with some motherboards
	  mixing an SMC Ultra and an Adaptec AHA154x SCSI card (or compatible,
	  such as some BusLogic models) causes corruption problems with many
	  operating systems. The Linux smc-ultra driver has a work-around for
	  this but keep it in mind if you have such a SCSI card and have
	  problems.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called smc-ultra.

config ULTRA32
	tristate "SMC Ultra32 EISA support"
	depends on NET_VENDOR_SMC && EISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called smc-ultra32.

config SMC91X
	tristate "SMC 91C9x/91C1xxx support"
	select CRC32
	select MII
	depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00 || BFIN)
	help
	  This is a driver for SMC's 91x series of Ethernet chipsets,
	  including the SMC91C94 and the SMC91C111. Say Y if you want it
	  compiled into the kernel, and read the file
	  <file:Documentation/networking/smc9.txt>  and the Ethernet-HOWTO,
	  available from  <http://www.linuxdoc.org/docs.html#howto>.

	  This driver is also available as a module ( = code which can be
	  inserted in and removed from the running kernel whenever you want).
	  The module will be called smc91x.  If you want to compile it as a
	  module, say M here and read <file:Documentation/kbuild/modules.txt>
	  as well as <file:Documentation/networking/net-modules.txt>.

config SMC9194
	tristate "SMC 9194 support"
	depends on NET_VENDOR_SMC && (ISA || MAC && BROKEN)
	select CRC32
	---help---
	  This is support for the SMC9xxx based Ethernet cards. Choose this
	  option if you have a DELL laptop with the docking station, or
	  another SMC9192/9194 based chipset.  Say Y if you want it compiled
	  into the kernel, and read the file
	  <file:Documentation/networking/smc9.txt> and the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called smc9194.

config NET_NETX
	tristate "NetX Ethernet support"
	select MII
	depends on NET_ETHERNET && ARCH_NETX
	help
	  This is support for the Hilscher netX builtin Ethernet ports

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called netx-eth.

config DM9000
	tristate "DM9000 support"
	depends on (ARM || MIPS) && NET_ETHERNET
	select CRC32
	select MII
	---help---
	  Support for DM9000 chipset.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called dm9000.

config SMC911X
	tristate "SMSC LAN911[5678] support"
	select CRC32
	select MII
	depends on NET_ETHERNET && ARCH_PXA
	help
	  This is a driver for SMSC's LAN911x series of Ethernet chipsets
	  including the new LAN9115, LAN9116, LAN9117, and LAN9118.
	  Say Y if you want it compiled into the kernel, 
	  and read the Ethernet-HOWTO, available from
	  <http://www.linuxdoc.org/docs.html#howto>.

	  This driver is also available as a module. The module will be 
	  called smc911x.  If you want to compile it as a module, say M 
	  here and read <file:Documentation/kbuild/modules.txt>

config NET_VENDOR_RACAL
	bool "Racal-Interlan (Micom) NI cards"
	depends on NET_ETHERNET && ISA
	help
	  If you have a network (Ethernet) card belonging to this class, such
	  as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about NI cards. If you say Y, you will be asked for
	  your specific card in the following questions.

config NI5010
	tristate "NI5010 support (EXPERIMENTAL)"
	depends on NET_VENDOR_RACAL && ISA && EXPERIMENTAL && BROKEN_ON_SMP
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>. Note that this is still
	  experimental code.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ni5010.

config NI52
	tristate "NI5210 support"
	depends on NET_VENDOR_RACAL && ISA
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ni52.

config NI65
	tristate "NI6510 support"
	depends on NET_VENDOR_RACAL && ISA && ISA_DMA_API
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ni65.

source "drivers/net/tulip/Kconfig"

config AT1700
	tristate "AT1700/1720 support (EXPERIMENTAL)"
	depends on NET_ETHERNET && (ISA || MCA_LEGACY) && EXPERIMENTAL
	select CRC32
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called at1700.

config DEPCA
	tristate "DEPCA, DE10x, DE200, DE201, DE202, DE422 support"
	depends on NET_ETHERNET && (ISA || EISA || MCA)
	select CRC32
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto> as well as
	  <file:drivers/net/depca.c>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called depca.

config HP100
	tristate "HP 10/100VG PCLAN (ISA, EISA, PCI) support"
	depends on NET_ETHERNET && (ISA || EISA || PCI)
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called hp100.

config NET_ISA
	bool "Other ISA cards"
	depends on NET_ETHERNET && ISA
	---help---
	  If your network (Ethernet) card hasn't been mentioned yet and its
	  bus system (that's the way the cards talks to the other components
	  of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
	  Make sure you know the name of your card. Read the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  If unsure, say Y.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the remaining ISA network card questions. If you say Y, you will be
	  asked for your specific card in the following questions.

config E2100
	tristate "Cabletron E21xx support"
	depends on NET_ISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called e2100.

config EWRK3
	tristate "EtherWORKS 3 (DE203, DE204, DE205) support"
	depends on NET_ISA
	select CRC32
	---help---
	  This driver supports the DE203, DE204 and DE205 network (Ethernet)
	  cards. If this is for you, say Y and read
	  <file:Documentation/networking/ewrk3.txt> in the kernel source as
	  well as the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ewrk3.

config EEXPRESS
	tristate "EtherExpress 16 support"
	depends on NET_ISA
	---help---
	  If you have an EtherExpress16 network (Ethernet) card, say Y and
	  read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.  Note that the Intel
	  EtherExpress16 card used to be regarded as a very poor choice
	  because the driver was very unreliable. We now have a new driver
	  that should do better.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called eexpress.

config EEXPRESS_PRO
	tristate "EtherExpressPro support/EtherExpress 10 (i82595) support"
	depends on NET_ISA
	---help---
	  If you have a network (Ethernet) card of this type, say Y. This
	  driver supports Intel i82595{FX,TX} based boards. Note however
	  that the EtherExpress PRO/100 Ethernet card has its own separate
	  driver.  Please read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called eepro.

config HPLAN_PLUS
	tristate "HP PCLAN+ (27247B and 27252A) support"
	depends on NET_ISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called hp-plus.

config HPLAN
	tristate "HP PCLAN (27245 and other 27xxx series) support"
	depends on NET_ISA
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called hp.

config LP486E
	tristate "LP486E on board Ethernet"
	depends on NET_ISA
	help
	  Say Y here to support the 82596-based on-board Ethernet controller
	  for the Panther motherboard, which is one of the two shipped in the
	  Intel Professional Workstation.

config ETH16I
	tristate "ICL EtherTeam 16i/32 support"
	depends on NET_ISA
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called eth16i.

config NE2000
	tristate "NE2000/NE1000 support"
	depends on NET_ISA || (Q40 && m) || M32R || TOSHIBA_RBTX4927 || TOSHIBA_RBTX4938
	select CRC32
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.  Many Ethernet cards
	  without a specific driver are compatible with NE2000.

	  If you have a PCI NE2000 card however, say N here and Y to "PCI
	  NE2000 and clone support" under "EISA, VLB, PCI and on board
	  controllers" below. If you have a NE2000 card and are running on
	  an MCA system (a bus system used on some IBM PS/2 computers and
	  laptops), say N here and Y to "NE/2 (ne2000 MCA version) support",
	  below.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ne.

config ZNET
	tristate "Zenith Z-Note support (EXPERIMENTAL)"
	depends on NET_ISA && EXPERIMENTAL && ISA_DMA_API
	help
	  The Zenith Z-Note notebook computer has a built-in network
	  (Ethernet) card, and this is the Linux driver for it. Note that the
	  IBM Thinkpad 300 is compatible with the Z-Note and is also supported
	  by this driver. Read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

config SEEQ8005
	tristate "SEEQ8005 support (EXPERIMENTAL)"
	depends on NET_ISA && EXPERIMENTAL
	help
	  This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
	  is for you, read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called seeq8005.

config NE2_MCA
	tristate "NE/2 (ne2000 MCA version) support"
	depends on NET_ETHERNET && MCA_LEGACY
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ne2.

config IBMLANA
	tristate "IBM LAN Adapter/A support"
	depends on NET_ETHERNET && MCA && MCA_LEGACY
	---help---
	  This is a Micro Channel Ethernet adapter.  You need to set
	  CONFIG_MCA to use this driver.  It is both available as an in-kernel
	  driver and as a module.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The only
	  currently supported card is the IBM LAN Adapter/A for Ethernet.  It
	  will both support 16K and 32K memory windows, however a 32K window
	  gives a better security against packet losses.  Usage of multiple
	  boards with this driver should be possible, but has not been tested
	  up to now due to lack of hardware.

config IBMVETH
	tristate "IBM LAN Virtual Ethernet support"
	depends on NET_ETHERNET && PPC_PSERIES
	---help---
	  This driver supports virtual ethernet adapters on newer IBM iSeries
	  and pSeries systems.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module will
	  be called ibmveth.

config IBM_EMAC
	tristate "PowerPC 4xx on-chip Ethernet support"
	depends on 4xx && !PPC_MERGE
	help
	  This driver supports the PowerPC 4xx EMAC family of on-chip
          Ethernet controllers.

config IBM_EMAC_RXB
	int "Number of receive buffers"
	depends on IBM_EMAC
	default "128"

config IBM_EMAC_TXB
	int "Number of transmit buffers"
	depends on IBM_EMAC
	default "64"

config IBM_EMAC_POLL_WEIGHT
	int "MAL NAPI polling weight"
	depends on IBM_EMAC
	default "32"

config IBM_EMAC_RX_COPY_THRESHOLD
	int "RX skb copy threshold (bytes)"
	depends on IBM_EMAC
	default "256"

config IBM_EMAC_RX_SKB_HEADROOM
	int "Additional RX skb headroom (bytes)"
	depends on IBM_EMAC
	default "0"
	help
	  Additional receive skb headroom. Note, that driver
	  will always reserve at least 2 bytes to make IP header
	  aligned, so usually there is no need to add any additional
	  headroom.
	  
	  If unsure, set to 0.

config IBM_EMAC_PHY_RX_CLK_FIX
	bool "PHY Rx clock workaround"
	depends on IBM_EMAC && (405EP || 440GX || 440EP || 440GR)
	help
	  Enable this if EMAC attached to a PHY which doesn't generate
	  RX clock if there is no link, if this is the case, you will 
	  see "TX disable timeout" or "RX disable timeout" in the system
	  log.
	  
	  If unsure, say N.

config IBM_EMAC_DEBUG
	bool "Debugging"
	depends on IBM_EMAC
	default n

config IBM_EMAC_ZMII
	bool
	depends on IBM_EMAC && (NP405H || NP405L || 44x)
	default y

config IBM_EMAC_RGMII
	bool
	depends on IBM_EMAC && 440GX
	default y
		
config IBM_EMAC_TAH
	bool
	depends on IBM_EMAC && 440GX
	default y

config NET_PCI
	bool "EISA, VLB, PCI and on board controllers"
	depends on NET_ETHERNET && (ISA || EISA || PCI)
	help
	  This is another class of network cards which attach directly to the
	  bus. If you have one of those, say Y and read the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about this class of network cards. If you say Y, you
	  will be asked for your specific card in the following questions. If
	  you are unsure, say Y.

config PCNET32
	tristate "AMD PCnet32 PCI support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  If you have a PCnet32 or PCnetPCI based network (Ethernet) card,
	  answer Y here and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called pcnet32.

config PCNET32_NAPI
	bool "Use RX polling (NAPI)"
	depends on PCNET32
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config AMD8111_ETH
	tristate "AMD 8111 (new PCI lance) support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  If you have an AMD 8111-based PCI lance ethernet card,
	  answer Y here and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called amd8111e.
config AMD8111E_NAPI
	bool "Enable NAPI support"
	depends on AMD8111_ETH
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config ADAPTEC_STARFIRE
	tristate "Adaptec Starfire/DuraLAN support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  Say Y here if you have an Adaptec Starfire (or DuraLAN) PCI network
	  adapter. The DuraLAN chip is used on the 64 bit PCI boards from
	  Adaptec e.g. the ANA-6922A. The older 32 bit boards use the tulip
	  driver.

	  To compile this driver as a module, choose M here: the module
	  will be called starfire.  This is recommended.

config ADAPTEC_STARFIRE_NAPI
	bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
	depends on ADAPTEC_STARFIRE && EXPERIMENTAL
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config AC3200
	tristate "Ansel Communications EISA 3200 support (EXPERIMENTAL)"
	depends on NET_PCI && (ISA || EISA) && EXPERIMENTAL
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called ac3200.

config APRICOT
	tristate "Apricot Xen-II on board Ethernet"
	depends on NET_PCI && ISA
	help
	  If you have a network (Ethernet) controller of this type, say Y and
	  read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called apricot.

config B44
	tristate "Broadcom 4400 ethernet support"
	depends on NET_PCI && PCI
	select MII
	help
	  If you have a network (Ethernet) controller of this type, say Y and
	  read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called b44.

config FORCEDETH
	tristate "nForce Ethernet support"
	depends on NET_PCI && PCI
	help
	  If you have a network (Ethernet) controller of this type, say Y and
	  read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called forcedeth.

config FORCEDETH_NAPI
	bool "Use Rx and Tx Polling (NAPI) (EXPERIMENTAL)"
	depends on FORCEDETH && EXPERIMENTAL
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config CS89x0
	tristate "CS89x0 support"
	depends on NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X)
	---help---
	  Support for CS89x0 chipset based Ethernet cards. If you have a
	  network (Ethernet) card of this type, say Y and read the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto> as well as
	  <file:Documentation/networking/cs89x0.txt>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called cs89x0.

config TC35815
	tristate "TOSHIBA TC35815 Ethernet support"
	depends on NET_PCI && PCI && MIPS
	select MII

config DGRS
	tristate "Digi Intl. RightSwitch SE-X support"
	depends on NET_PCI && (PCI || EISA)
	---help---
	  This is support for the Digi International RightSwitch series of
	  PCI/EISA Ethernet switch cards. These include the SE-4 and the SE-6
	  models.  If you have a network card of this type, say Y and read the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.  More specific
	  information is contained in <file:Documentation/networking/dgrs.txt>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called dgrs.

config EEPRO100
	tristate "EtherExpressPro/100 support (eepro100, original Becker driver)"
	depends on NET_PCI && PCI
	select MII
	help
	  If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
	  card, say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called eepro100.


config E100
	tristate "Intel(R) PRO/100+ support"
	depends on NET_PCI && PCI
	select MII
	---help---
	  This driver supports Intel(R) PRO/100 family of adapters.
	  To verify that your adapter is supported, find the board ID number 
	  on the adapter. Look for a label that has a barcode and a number 
	  in the format 123456-001 (six digits hyphen three digits). 

	  Use the above information and the Adapter & Driver ID Guide at:

	  <http://support.intel.com/support/network/adapter/pro100/21397.htm>

          to identify the adapter.

	  For the latest Intel PRO/100 network driver for Linux, see:

	  <http://appsr.intel.com/scripts-df/support_intel.asp>

	  More specific information on configuring the driver is in 
	  <file:Documentation/networking/e100.txt>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called e100.

config LNE390
	tristate "Mylex EISA LNE390A/B support (EXPERIMENTAL)"
	depends on NET_PCI && EISA && EXPERIMENTAL
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called lne390.

config FEALNX
	tristate "Myson MTD-8xx PCI Ethernet support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet
	  cards. Specifications and data at
	  <http://www.myson.com.hk/mtd/datasheet/>.

config NATSEMI
	tristate "National Semiconductor DP8381x series PCI Ethernet support"
	depends on NET_PCI && PCI
	select CRC32
	help
	  This driver is for the National Semiconductor DP83810 series,
	  which is used in cards from PureData, NetGear, Linksys
	  and others, including the 83815 chip.
	  More specific information and updates are available from
	  <http://www.scyld.com/network/natsemi.html>.

config NE2K_PCI
	tristate "PCI NE2000 and clones support (see help)"
	depends on NET_PCI && PCI
	select CRC32
	---help---
	  This driver is for NE2000 compatible PCI cards. It will not work
	  with ISA NE2000 cards (they have their own driver, "NE2000/NE1000
	  support" below). If you have a PCI NE2000 network (Ethernet) card,
	  say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  This driver also works for the following NE2000 clone cards:
	  RealTek RTL-8029  Winbond 89C940  Compex RL2000  KTI ET32P2
	  NetVin NV5000SC   Via 86C926      SureCom NE34   Winbond
	  Holtek HT80232    Holtek HT80229

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called ne2k-pci.

config NE3210
	tristate "Novell/Eagle/Microdyne NE3210 EISA support (EXPERIMENTAL)"
	depends on NET_PCI && EISA && EXPERIMENTAL
	select CRC32
	---help---
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.  Note that this driver
	  will NOT WORK for NE3200 cards as they are completely different.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called ne3210.

config ES3210
	tristate "Racal-Interlan EISA ES3210 support (EXPERIMENTAL)"
	depends on NET_PCI && EISA && EXPERIMENTAL
	select CRC32
	help
	  If you have a network (Ethernet) card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called es3210.

config 8139CP
	tristate "RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)"
	depends on NET_PCI && PCI && EXPERIMENTAL
	select CRC32
	select MII
	help
	  This is a driver for the Fast Ethernet PCI network cards based on
	  the RTL8139C+ chips. If you have one of those, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here: the module
	  will be called 8139cp.  This is recommended.

config 8139TOO
	tristate "RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	---help---
	  This is a driver for the Fast Ethernet PCI network cards based on
	  the RTL 8129/8130/8139 chips. If you have one of those, say Y and
	  read the Ethernet-HOWTO <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here: the module
	  will be called 8139too.  This is recommended.

config 8139TOO_PIO
	bool "Use PIO instead of MMIO"
	default y
	depends on 8139TOO
	help
	  This instructs the driver to use programmed I/O ports (PIO) instead
	  of PCI shared memory (MMIO).  This can possibly solve some problems
	  in case your mainboard has memory consistency issues.  If unsure,
	  say N.

config 8139TOO_TUNE_TWISTER
	bool "Support for uncommon RTL-8139 rev. K (automatic channel equalization)"
	depends on 8139TOO
	help
	  This implements a function which might come in handy in case you
	  are using low quality on long cabling. It is required for RealTek
	  RTL-8139 revision K boards, and totally unused otherwise.  It tries
	  to match the transceiver to the cable characteristics. This is
	  experimental since hardly documented by the manufacturer.
	  If unsure, say Y.

config 8139TOO_8129
	bool "Support for older RTL-8129/8130 boards"
	depends on 8139TOO
	help
	  This enables support for the older and uncommon RTL-8129 and
	  RTL-8130 chips, which support MII via an external transceiver,
	  instead of an internal one.  Disabling this option will save some
	  memory by making the code size smaller.  If unsure, say Y.

config 8139_OLD_RX_RESET
	bool "Use older RX-reset method"
	depends on 8139TOO
	help
	  The 8139too driver was recently updated to contain a more rapid
	  reset sequence, in the face of severe receive errors.  This "new"
	  RX-reset method should be adequate for all boards.  But if you
	  experience problems, you can enable this option to restore the
	  old RX-reset behavior.  If unsure, say N.

config SIS900
	tristate "SiS 900/7016 PCI Fast Ethernet Adapter support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	---help---
	  This is a driver for the Fast Ethernet PCI network cards based on
	  the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
	  SiS 630 and SiS 540 chipsets.

	  This driver also supports AMD 79C901 HomePNA so that you can use
	  your phone line as a network cable.

	  To compile this driver as a module, choose M here: the module
	  will be called sis900.  This is recommended.

config EPIC100
	tristate "SMC EtherPower II"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  This driver is for the SMC EtherPower II 9432 PCI Ethernet NIC,
	  which is based on the SMC83c17x (EPIC/100).
	  More specific information and updates are available from
	  <http://www.scyld.com/network/epic100.html>.

config SUNDANCE
	tristate "Sundance Alta support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  This driver is for the Sundance "Alta" chip.
	  More specific information and updates are available from
	  <http://www.scyld.com/network/sundance.html>.

config SUNDANCE_MMIO
	bool "Use MMIO instead of PIO"
	depends on SUNDANCE
	help
	  Enable memory-mapped I/O for interaction with Sundance NIC registers.
	  Do NOT enable this by default, PIO (enabled when MMIO is disabled)
	  is known to solve bugs on certain chips.

	  If unsure, say N.

config TLAN
	tristate "TI ThunderLAN support"
	depends on NET_PCI && (PCI || EISA) && !64BIT
	---help---
	  If you have a PCI Ethernet network card based on the ThunderLAN chip
	  which is supported by this driver, say Y and read the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Devices currently supported by this driver are Compaq Netelligent,
	  Compaq NetFlex and Olicom cards.  Please read the file
	  <file:Documentation/networking/tlan.txt> for more details.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module
	  will be called tlan.

	  Please email feedback to <torben.mathiasen@compaq.com>.

config VIA_RHINE
	tristate "VIA Rhine support"
	depends on NET_PCI && PCI
	select CRC32
	select MII
	help
	  If you have a VIA "Rhine" based network card (Rhine-I (VT86C100A),
	  Rhine-II (VT6102), or Rhine-III (VT6105)), say Y here. Rhine-type
	  Ethernet functions can also be found integrated on South Bridges
	  (e.g. VT8235).

	  To compile this driver as a module, choose M here. The module
	  will be called via-rhine.

config VIA_RHINE_MMIO
	bool "Use MMIO instead of PIO"
	depends on VIA_RHINE
	help
	  This instructs the driver to use PCI shared memory (MMIO) instead of
	  programmed I/O ports (PIO). Enabling this gives an improvement in
	  processing time in parts of the driver.

	  If unsure, say Y.

config VIA_RHINE_NAPI
	bool "Use Rx Polling (NAPI)"
	depends on VIA_RHINE
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

config LAN_SAA9730
	bool "Philips SAA9730 Ethernet support"
	depends on NET_PCI && PCI && MIPS_ATLAS
	help
	  The SAA9730 is a combined multimedia and peripheral controller used
	  in thin clients, Internet access terminals, and diskless
	  workstations.
	  See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.

config SC92031
	tristate "Silan SC92031 PCI Fast Ethernet Adapter driver (EXPERIMENTAL)"
	depends on NET_PCI && PCI && EXPERIMENTAL
	select CRC32
	---help---
	  This is a driver for the Fast Ethernet PCI network cards based on
	  the Silan SC92031 chip (sometimes also called Rsltek 8139D). If you
	  have one of these, say Y here.

	  To compile this driver as a module, choose M here: the module
	  will be called sc92031.  This is recommended.

config NET_POCKET
	bool "Pocket and portable adapters"
	depends on NET_ETHERNET && PARPORT
	---help---
	  Cute little network (Ethernet) devices which attach to the parallel
	  port ("pocket adapters"), commonly used with laptops. If you have
	  one of those, say Y and read the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  If you want to plug a network (or some other) card into the PCMCIA
	  (or PC-card) slot of your laptop instead (PCMCIA is the standard for
	  credit card size extension cards used by all modern laptops), you
	  need the pcmcia-cs package (location contained in the file
	  <file:Documentation/Changes>) and you can say N here.

	  Laptop users should read the Linux Laptop home page at
	  <http://www.linux-on-laptops.com/> or
	  Tuxmobil - Linux on Mobile Computers at <http://www.tuxmobil.org/>.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about this class of network devices. If you say Y, you
	  will be asked for your specific device in the following questions.

config ATP
	tristate "AT-LAN-TEC/RealTek pocket adapter support"
	depends on NET_POCKET && PARPORT && X86
	select CRC32
	---help---
	  This is a network (Ethernet) device which attaches to your parallel
	  port. Read <file:drivers/net/atp.c> as well as the Ethernet-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>, if you
	  want to use this.  If you intend to use this driver, you should have
	  said N to the "Parallel printer support", because the two drivers
	  don't like each other.

	  To compile this driver as a module, choose M here: the module
	  will be called atp.

config DE600
	tristate "D-Link DE600 pocket adapter support"
	depends on NET_POCKET && PARPORT
	---help---
	  This is a network (Ethernet) device which attaches to your parallel
	  port. Read <file:Documentation/networking/DLINK.txt> as well as the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, if you want to use
	  this. It is possible to have several devices share a single parallel
	  port and it is safe to compile the corresponding drivers into the
	  kernel.

	  To compile this driver as a module, choose M here: the module
	  will be called de600.

config DE620
	tristate "D-Link DE620 pocket adapter support"
	depends on NET_POCKET && PARPORT
	---help---
	  This is a network (Ethernet) device which attaches to your parallel
	  port. Read <file:Documentation/networking/DLINK.txt> as well as the
	  Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, if you want to use
	  this. It is possible to have several devices share a single parallel
	  port and it is safe to compile the corresponding drivers into the
	  kernel.

	  To compile this driver as a module, choose M here: the module
	  will be called de620.

config SGISEEQ
	tristate "SGI Seeq ethernet controller support"
	depends on NET_ETHERNET && SGI_IP22
	help
	  Say Y here if you have an Seeq based Ethernet network card. This is
	  used in many Silicon Graphics machines.

config DECLANCE
	tristate "DEC LANCE ethernet controller support"
	depends on NET_ETHERNET && MACH_DECSTATION
	select CRC32
	help
	  This driver is for the series of Ethernet controllers produced by
	  DEC (now Compaq) based on the AMD Lance chipset, including the
	  DEPCA series.  (This chipset is better known via the NE2100 cards.)

config 68360_ENET
	bool "Motorola 68360 ethernet controller"
	depends on M68360
	help
	  Say Y here if you want to use the built-in ethernet controller of
	  the Motorola 68360 processor.

config FEC
	bool "FEC ethernet controller (of ColdFire CPUs)"
	depends on M523x || M527x || M5272 || M528x || M520x
	help
	  Say Y here if you want to use the built-in 10/100 Fast ethernet
	  controller on some Motorola ColdFire processors.

config FEC2
	bool "Second FEC ethernet controller (on some ColdFire CPUs)"
	depends on FEC
	help
	  Say Y here if you want to use the second built-in 10/100 Fast
	  ethernet controller on some Motorola ColdFire processors.

config NE_H8300
	tristate "NE2000 compatible support for H8/300"
	depends on H8300 && NET_ETHERNET
	help
	  Say Y here if you want to use the NE2000 compatible
	  controller on the Renesas H8/300 processor.

source "drivers/net/fec_8xx/Kconfig"
source "drivers/net/fs_enet/Kconfig"

endmenu

#
#	Gigabit Ethernet
#

menuconfig NETDEV_1000
	bool "Ethernet (1000 Mbit)"
	depends on !UML
	default y

if NETDEV_1000

config ACENIC
	tristate "Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support"
	depends on PCI
	---help---
	  Say Y here if you have an Alteon AceNIC, 3Com 3C985(B), NetGear
	  GA620, SGI Gigabit or Farallon PN9000-SX PCI Gigabit Ethernet
	  adapter. The driver allows for using the Jumbo Frame option (9000
	  bytes/frame) however it requires that your switches can handle this
	  as well. To enable Jumbo Frames, add `mtu 9000' to your ifconfig
	  line.

	  To compile this driver as a module, choose M here: the
	  module will be called acenic.

config ACENIC_OMIT_TIGON_I
	bool "Omit support for old Tigon I based AceNICs"
	depends on ACENIC
	help
	  Say Y here if you only have Tigon II based AceNICs and want to leave
	  out support for the older Tigon I based cards which are no longer
	  being sold (ie. the original Alteon AceNIC and 3Com 3C985 (non B
	  version)).  This will reduce the size of the driver object by
	  app. 100KB.  If you are not sure whether your card is a Tigon I or a
	  Tigon II, say N here.

	  The safe and default value for this is N.

config DL2K
	tristate "D-Link DL2000-based Gigabit Ethernet support"
	depends on PCI
	select CRC32
	help
	  This driver supports D-Link 2000-based gigabit ethernet cards, which
	  includes
	  D-Link DGE-550T Gigabit Ethernet Adapter.
	  D-Link DL2000-based Gigabit Ethernet Adapter.

	  To compile this driver as a module, choose M here: the
	  module will be called dl2k.

config E1000
	tristate "Intel(R) PRO/1000 Gigabit Ethernet support"
	depends on PCI
	---help---
	  This driver supports Intel(R) PRO/1000 gigabit ethernet family of
	  adapters.  For more information on how to identify your adapter, go 
	  to the Adapter & Driver ID Guide at:

	  <http://support.intel.com/support/network/adapter/pro100/21397.htm>

	  For general information and support, go to the Intel support
	  website at:

	  <http://support.intel.com>

	  More specific information on configuring the driver is in 
	  <file:Documentation/networking/e1000.txt>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called e1000.

config E1000_NAPI
	bool "Use Rx Polling (NAPI)"
	depends on E1000
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config E1000_DISABLE_PACKET_SPLIT
	bool "Disable Packet Split for PCI express adapters"
	depends on E1000
	help
	  Say Y here if you want to use the legacy receive path for PCI express
	  hardware.

	  If in doubt, say N.

source "drivers/net/ixp2000/Kconfig"

config MYRI_SBUS
	tristate "MyriCOM Gigabit Ethernet support"
	depends on SBUS
	help
	  This driver supports MyriCOM Sbus gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called myri_sbus.  This is recommended.

config NS83820
	tristate "National Semiconductor DP83820 support"
	depends on PCI
	help
	  This is a driver for the National Semiconductor DP83820 series
	  of gigabit ethernet MACs.  Cards using this chipset include
	  the D-Link DGE-500T, PureData's PDP8023Z-TG, SMC's SMC9462TX,
	  SOHO-GA2000T, SOHO-GA2500T.  The driver supports the use of
	  zero copy.

config HAMACHI
	tristate "Packet Engines Hamachi GNIC-II support"
	depends on PCI
	select MII
	help
	  If you have a Gigabit Ethernet card of this type, say Y and read
	  the Ethernet-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called hamachi.

config YELLOWFIN
	tristate "Packet Engines Yellowfin Gigabit-NIC support (EXPERIMENTAL)"
	depends on PCI && EXPERIMENTAL
	select CRC32
	---help---
	  Say Y here if you have a Packet Engines G-NIC PCI Gigabit Ethernet
	  adapter or the SYM53C885 Ethernet controller. The Gigabit adapter is
	  used by the Beowulf Linux cluster project.  See
	  <http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html> for more
	  information about this driver in particular and Beowulf in general.

	  To compile this driver as a module, choose M here: the module
	  will be called yellowfin.  This is recommended.

config R8169
	tristate "Realtek 8169 gigabit ethernet support"
	depends on PCI
	select CRC32
	---help---
	  Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter.

	  To compile this driver as a module, choose M here: the module
	  will be called r8169.  This is recommended.

config R8169_NAPI
	bool "Use Rx and Tx Polling (NAPI) (EXPERIMENTAL)"
	depends on R8169 && EXPERIMENTAL
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config R8169_VLAN
	bool "VLAN support"
	depends on R8169 && VLAN_8021Q
	---help---
	  Say Y here for the r8169 driver to support the functions required
	  by the kernel 802.1Q code.
	  
	  If in doubt, say Y.

config SIS190
	tristate "SiS190/SiS191 gigabit ethernet support"
	depends on PCI
	select CRC32
	select MII
	---help---
	  Say Y here if you have a SiS 190 PCI Fast Ethernet adapter or
	  a SiS 191 PCI Gigabit Ethernet adapter. Both are expected to
	  appear in lan on motherboard designs which are based on SiS 965
	  and SiS 966 south bridge.

	  To compile this driver as a module, choose M here: the module
	  will be called sis190.  This is recommended.

config SKGE
	tristate "New SysKonnect GigaEthernet support"
	depends on PCI
	select CRC32
	---help---
	  This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx
	  and related Gigabit Ethernet adapters. It is a new smaller driver
	  with better performance and more complete ethtool support.

	  It does not support the link failover and network management 
	  features that "portable" vendor supplied sk98lin driver does.

	  This driver supports adapters based on the original Yukon chipset:
	  Marvell 88E8001, Belkin F5D5005, CNet GigaCard, DLink DGE-530T,
	  Linksys EG1032/EG1064, 3Com 3C940/3C940B, SysKonnect SK-9871/9872.

	  It does not support the newer Yukon2 chipset: a separate driver,
	  sky2, is provided for Yukon2-based adapters.

	  To compile this driver as a module, choose M here: the module
	  will be called skge.  This is recommended.

config SKY2
	tristate "SysKonnect Yukon2 support (EXPERIMENTAL)"
	depends on PCI
	select CRC32
	---help---
	  This driver supports Gigabit Ethernet adapters based on the
	  Marvell Yukon 2 chipset:
	  Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/
	  88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21

	  There is companion driver for the older Marvell Yukon and
	  Genesis based adapters: skge.

	  To compile this driver as a module, choose M here: the module
	  will be called sky2.  This is recommended.

config SK98LIN
	tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support (DEPRECATED)"
	depends on PCI
	---help---
	  Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx
	  compliant Gigabit Ethernet Adapter.

	  This driver supports the original Yukon chipset. This driver is
	  deprecated and will be removed from the kernel in the near future,
	  it has been replaced by the skge driver. skge is cleaner and
	  seems to work better.

	  This driver does not support the newer Yukon2 chipset. A separate
	  driver, sky2, is provided to support Yukon2-based adapters.

	  The following adapters are supported by this driver:
	    - 3Com 3C940 Gigabit LOM Ethernet Adapter
	    - 3Com 3C941 Gigabit LOM Ethernet Adapter
	    - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2970SX Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2970SX/2SC Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2970TX Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2970TX/2TX Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2971SX Gigabit Ethernet Adapter
	    - Allied Telesyn AT-2971T Gigabit Ethernet Adapter
	    - Belkin Gigabit Desktop Card 10/100/1000Base-T Adapter, Copper RJ-45
	    - EG1032 v2 Instant Gigabit Network Adapter
	    - EG1064 v2 Instant Gigabit Network Adapter
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Albatron)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Foxconn)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte)
	    - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill)
	    - Marvell 88E8050 Gigabit LOM Ethernet Adapter (Intel)
	    - Marvell RDK-8001 Adapter
	    - Marvell RDK-8002 Adapter
	    - Marvell RDK-8003 Adapter
	    - Marvell RDK-8004 Adapter
	    - Marvell RDK-8006 Adapter
	    - Marvell RDK-8007 Adapter
	    - Marvell RDK-8008 Adapter
	    - Marvell RDK-8009 Adapter
	    - Marvell RDK-8010 Adapter
	    - Marvell RDK-8011 Adapter
	    - Marvell RDK-8012 Adapter
	    - Marvell RDK-8052 Adapter
	    - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (32 bit)
	    - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (64 bit)
	    - N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
	    - SK-9521 10/100/1000Base-T Adapter
	    - SK-9521 V2.0 10/100/1000Base-T Adapter
	    - SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)
	    - SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
	    - SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)
	    - SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)
	    - SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
	    - SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)
	    - SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)
	    - SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
	    - SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)
	    - SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
	    - SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)
	    - SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
	    - SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)
	    - SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
	    - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
	    - SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
	    - SMC EZ Card 1000 (SMC9452TXV.2)
	  
	  The adapters support Jumbo Frames.
	  The dual link adapters support link-failover and dual port features.
	  Both Marvell Yukon and SysKonnect SK-98xx/SK-95xx adapters support 
	  the scatter-gather functionality with sendfile(). Please refer to 
	  <file:Documentation/networking/sk98lin.txt> for more information about
	  optional driver parameters.
	  Questions concerning this driver may be addressed to:
	      <linux@syskonnect.de>
	  
	  If you want to compile this driver as a module ( = code which can be
	  inserted in and removed from the running kernel whenever you want),
	  say M here and read <file:Documentation/kbuild/modules.txt>. The module will
	  be called sk98lin. This is recommended.

config VIA_VELOCITY
	tristate "VIA Velocity support"
	depends on PCI
	select CRC32
	select CRC_CCITT
	select MII
	help
	  If you have a VIA "Velocity" based network card say Y here.

	  To compile this driver as a module, choose M here. The module
	  will be called via-velocity.

config TIGON3
	tristate "Broadcom Tigon3 support"
	depends on PCI
	help
	  This driver supports Broadcom Tigon3 based gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called tg3.  This is recommended.

config BNX2
	tristate "Broadcom NetXtremeII support"
	depends on PCI
	select CRC32
	select ZLIB_INFLATE
	help
	  This driver supports Broadcom NetXtremeII gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called bnx2.  This is recommended.

config SPIDER_NET
	tristate "Spider Gigabit Ethernet driver"
	depends on PCI && (PPC_IBM_CELL_BLADE || PPC_CELLEB)
	select FW_LOADER
	help
	  This driver supports the Gigabit Ethernet chips present on the
	  Cell Processor-Based Blades from IBM.

config TSI108_ETH
	   tristate "Tundra TSI108 gigabit Ethernet support"
	   depends on TSI108_BRIDGE
	   help
	     This driver supports Tundra TSI108 gigabit Ethernet ports.
	     To compile this driver as a module, choose M here: the module
	     will be called tsi108_eth.

config GIANFAR
	tristate "Gianfar Ethernet"
	depends on 85xx || 83xx || PPC_86xx
	select PHYLIB
	select CRC32
	help
	  This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx,
	  and MPC86xx family of chips, and the FEC on the 8540.

config GFAR_NAPI
	bool "NAPI Support"
	depends on GIANFAR

config UCC_GETH
	tristate "Freescale QE Gigabit Ethernet"
	depends on QUICC_ENGINE
	select PHYLIB
	help
	  This driver supports the Gigabit Ethernet mode of the QUICC Engine,
	  which is available on some Freescale SOCs.

config UGETH_NAPI
	bool "NAPI Support"
	depends on UCC_GETH

config UGETH_MAGIC_PACKET
	bool "Magic Packet detection support"
	depends on UCC_GETH

config UGETH_FILTERING
	bool "Mac address filtering support"
	depends on UCC_GETH

config UGETH_TX_ON_DEMAND
	bool "Transmit on Demand support"
	depends on UCC_GETH

config MV643XX_ETH
	tristate "MV-643XX Ethernet support"
	depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MV64X60 || MOMENCO_OCELOT_3 || (PPC_MULTIPLATFORM && PPC32)
	select MII
	help
	  This driver supports the gigabit Ethernet on the Marvell MV643XX
	  chipset which is used in the Momenco Ocelot C and Jaguar ATX and
	  Pegasos II, amongst other PPC and MIPS boards.

config QLA3XXX
	tristate "QLogic QLA3XXX Network Driver Support"
	depends on PCI
	help
	  This driver supports QLogic ISP3XXX gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called qla3xxx.

config ATL1
	tristate "Attansic L1 Gigabit Ethernet support (EXPERIMENTAL)"
	depends on PCI && EXPERIMENTAL
	select CRC32
	select MII
	help
	  This driver supports the Attansic L1 gigabit ethernet adapter.

	  To compile this driver as a module, choose M here.  The module
	  will be called atl1.

endif # NETDEV_1000

#
#	10 Gigabit Ethernet
#

menuconfig NETDEV_10000
	bool "Ethernet (10000 Mbit)"
	depends on !UML
	default y

if NETDEV_10000

config CHELSIO_T1
        tristate "Chelsio 10Gb Ethernet support"
        depends on PCI
	select CRC32
        help
          This driver supports Chelsio gigabit and 10-gigabit
          Ethernet cards. More information about adapter features and
	  performance tuning is in <file:Documentation/networking/cxgb.txt>.

          For general information about Chelsio and our products, visit
          our website at <http://www.chelsio.com>.

          For customer support, please visit our customer support page at
          <http://www.chelsio.com/support.htm>.

          Please send feedback to <linux-bugs@chelsio.com>.

          To compile this driver as a module, choose M here: the module
          will be called cxgb.

config CHELSIO_T1_1G
        bool "Chelsio gigabit Ethernet support"
        depends on CHELSIO_T1
        help
          Enables support for Chelsio's gigabit Ethernet PCI cards.  If you
          are using only 10G cards say 'N' here.

config CHELSIO_T1_NAPI
	bool "Use Rx Polling (NAPI)"
	depends on CHELSIO_T1
	default y
	help
	  NAPI is a driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card.

config CHELSIO_T3
	tristate "Chelsio Communications T3 10Gb Ethernet support"
	depends on PCI
	select FW_LOADER
	help
	  This driver supports Chelsio T3-based gigabit and 10Gb Ethernet
	  adapters.

	  For general information about Chelsio and our products, visit
	  our website at <http://www.chelsio.com>.

	  For customer support, please visit our customer support page at
	  <http://www.chelsio.com/support.htm>.

	  Please send feedback to <linux-bugs@chelsio.com>.

	  To compile this driver as a module, choose M here: the module
	  will be called cxgb3.

config EHEA
	tristate "eHEA Ethernet support"
	depends on IBMEBUS
	---help---
	  This driver supports the IBM pSeries eHEA ethernet adapter.

	  To compile the driver as a module, choose M here. The module
	  will be called ehea.

config IXGB
	tristate "Intel(R) PRO/10GbE support"
	depends on PCI
	---help---
	  This driver supports Intel(R) PRO/10GbE family of
	  adapters.  For more information on how to identify your adapter, go
	  to the Adapter & Driver ID Guide at:

	  <http://support.intel.com/support/network/adapter/pro100/21397.htm>

	  For general information and support, go to the Intel support
	  website at:

	  <http://support.intel.com>

	  More specific information on configuring the driver is in 
	  <file:Documentation/networking/ixgb.txt>.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called ixgb.

config IXGB_NAPI
	bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
	depends on IXGB && EXPERIMENTAL
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config S2IO
	tristate "S2IO 10Gbe XFrame NIC"
	depends on PCI
	---help---
	  This driver supports the 10Gbe XFrame NIC of S2IO. 
	  More specific information on configuring the driver is in 
	  <file:Documentation/networking/s2io.txt>.

config S2IO_NAPI
	bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
	depends on S2IO && EXPERIMENTAL
	help
	  NAPI is a new driver API designed to reduce CPU and interrupt load
	  when the driver is receiving lots of packets from the card. It is
	  still somewhat experimental and thus not yet enabled by default.

	  If your estimated Rx load is 10kpps or more, or if the card will be
	  deployed on potentially unfriendly networks (e.g. in a firewall),
	  then say Y here.

	  See <file:Documentation/networking/NAPI_HOWTO.txt> for more
	  information.

	  If in doubt, say N.

config MYRI10GE
	tristate "Myricom Myri-10G Ethernet support"
	depends on PCI
	select FW_LOADER
	select CRC32
	---help---
	  This driver supports Myricom Myri-10G Dual Protocol interface in
	  Ethernet mode. If the eeprom on your board is not recent enough,
	  you will need a newer firmware image.
	  You may get this image or more information, at:

	  <http://www.myri.com/scs/download-Myri10GE.html>

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module
	  will be called myri10ge.

config NETXEN_NIC
	tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC"
	depends on PCI
	help
	  This enables the support for NetXen's Gigabit Ethernet card.

config PASEMI_MAC
	tristate "PA Semi 1/10Gbit MAC"
	depends on PPC64 && PCI
	select PHYLIB
	help
	  This driver supports the on-chip 1/10Gbit Ethernet controller on
	  PA Semi's PWRficient line of chips.

config MLX4_CORE
	tristate
	depends on PCI
	default n

config MLX4_DEBUG
	bool "Verbose debugging output" if (MLX4_CORE && EMBEDDED)
	depends on MLX4_CORE
	default y
	---help---
	  This option causes debugging code to be compiled into the
	  mlx4_core driver.  The output can be turned on via the
	  debug_level module parameter (which can also be set after
	  the driver is loaded through sysfs).

endif # NETDEV_10000

source "drivers/net/tokenring/Kconfig"

source "drivers/net/wireless/Kconfig"

source "drivers/net/usb/Kconfig"

source "drivers/net/pcmcia/Kconfig"

source "drivers/net/wan/Kconfig"

source "drivers/atm/Kconfig"

source "drivers/s390/net/Kconfig"

config ISERIES_VETH
	tristate "iSeries Virtual Ethernet driver support"
	depends on PPC_ISERIES

config RIONET
	tristate "RapidIO Ethernet over messaging driver support"
	depends on RAPIDIO

config RIONET_TX_SIZE
	int "Number of outbound queue entries"
	depends on RIONET
	default "128"

config RIONET_RX_SIZE
	int "Number of inbound queue entries"
	depends on RIONET
	default "128"

config FDDI
	bool "FDDI driver support"
	depends on (PCI || EISA || TC)
	help
	  Fiber Distributed Data Interface is a high speed local area network
	  design; essentially a replacement for high speed Ethernet. FDDI can
	  run over copper or fiber. If you are connected to such a network and
	  want a driver for the FDDI card in your computer, say Y here (and
	  then also Y to the driver for your FDDI card, below). Most people
	  will say N.

config DEFXX
	tristate "Digital DEFTA/DEFEA/DEFPA adapter support"
	depends on FDDI && (PCI || EISA || TC)
	---help---
	  This is support for the DIGITAL series of TURBOchannel (DEFTA),
	  EISA (DEFEA) and PCI (DEFPA) controllers which can connect you
	  to a local FDDI network.

	  To compile this driver as a module, choose M here: the module
	  will be called defxx.  If unsure, say N.

config DEFXX_MMIO
	bool
	prompt "Use MMIO instead of PIO" if PCI || EISA
	depends on DEFXX
	default n if PCI || EISA
	default y
	---help---
	  This instructs the driver to use EISA or PCI memory-mapped I/O
	  (MMIO) as appropriate instead of programmed I/O ports (PIO).
	  Enabling this gives an improvement in processing time in parts
	  of the driver, but it may cause problems with EISA (DEFEA)
	  adapters.  TURBOchannel does not have the concept of I/O ports,
	  so MMIO is always used for these (DEFTA) adapters.

	  If unsure, say N.

config SKFP
	tristate "SysKonnect FDDI PCI support"
	depends on FDDI && PCI
	select BITREVERSE
	---help---
	  Say Y here if you have a SysKonnect FDDI PCI adapter.
	  The following adapters are supported by this driver:
	  - SK-5521 (SK-NET FDDI-UP)
	  - SK-5522 (SK-NET FDDI-UP DAS)
	  - SK-5541 (SK-NET FDDI-FP)
	  - SK-5543 (SK-NET FDDI-LP)
	  - SK-5544 (SK-NET FDDI-LP DAS)
	  - SK-5821 (SK-NET FDDI-UP64)
	  - SK-5822 (SK-NET FDDI-UP64 DAS)
	  - SK-5841 (SK-NET FDDI-FP64)
	  - SK-5843 (SK-NET FDDI-LP64)
	  - SK-5844 (SK-NET FDDI-LP64 DAS)
	  - Netelligent 100 FDDI DAS Fibre SC
	  - Netelligent 100 FDDI SAS Fibre SC
	  - Netelligent 100 FDDI DAS UTP
	  - Netelligent 100 FDDI SAS UTP
	  - Netelligent 100 FDDI SAS Fibre MIC

	  Read <file:Documentation/networking/skfp.txt> for information about
	  the driver.

	  Questions concerning this driver can be addressed to:
	  <linux@syskonnect.de>

	  To compile this driver as a module, choose M here: the module
	  will be called skfp.  This is recommended.

config HIPPI
	bool "HIPPI driver support (EXPERIMENTAL)"
	depends on EXPERIMENTAL && INET && PCI
	help
	  HIgh Performance Parallel Interface (HIPPI) is a 800Mbit/sec and
	  1600Mbit/sec dual-simplex switched or point-to-point network. HIPPI
	  can run over copper (25m) or fiber (300m on multi-mode or 10km on
	  single-mode). HIPPI networks are commonly used for clusters and to
	  connect to super computers. If you are connected to a HIPPI network
	  and have a HIPPI network card in your computer that you want to use
	  under Linux, say Y here (you must also remember to enable the driver
	  for your HIPPI card below). Most people will say N here.

config ROADRUNNER
	tristate "Essential RoadRunner HIPPI PCI adapter support (EXPERIMENTAL)"
	depends on HIPPI && PCI
	help
	  Say Y here if this is your PCI HIPPI network card.

	  To compile this driver as a module, choose M here: the module
	  will be called rrunner.  If unsure, say N.

config ROADRUNNER_LARGE_RINGS
	bool "Use large TX/RX rings (EXPERIMENTAL)"
	depends on ROADRUNNER
	help
	  If you say Y here, the RoadRunner driver will preallocate up to 2 MB
	  of additional memory to allow for fastest operation, both for
	  transmitting and receiving. This memory cannot be used by any other
	  kernel code or by user space programs. Say Y here only if you have
	  the memory.

config PLIP
	tristate "PLIP (parallel port) support"
	depends on PARPORT
	---help---
	  PLIP (Parallel Line Internet Protocol) is used to create a
	  reasonably fast mini network consisting of two (or, rarely, more)
	  local machines.  A PLIP link from a Linux box is a popular means to
	  install a Linux distribution on a machine which doesn't have a
	  CD-ROM drive (a minimal system has to be transferred with floppies
	  first). The kernels on both machines need to have this PLIP option
	  enabled for this to work.

	  The PLIP driver has two modes, mode 0 and mode 1.  The parallel
	  ports (the connectors at the computers with 25 holes) are connected
	  with "null printer" or "Turbo Laplink" cables which can transmit 4
	  bits at a time (mode 0) or with special PLIP cables, to be used on
	  bidirectional parallel ports only, which can transmit 8 bits at a
	  time (mode 1); you can find the wiring of these cables in
	  <file:Documentation/networking/PLIP.txt>.  The cables can be up to
	  15m long.  Mode 0 works also if one of the machines runs DOS/Windows
	  and has some PLIP software installed, e.g. the Crynwr PLIP packet
	  driver (<http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html>)
	  and winsock or NCSA's telnet.

	  If you want to use PLIP, say Y and read the PLIP mini-HOWTO as well
	  as the NET-3-HOWTO, both available from
	  <http://www.tldp.org/docs.html#howto>.  Note that the PLIP
	  protocol has been changed and this PLIP driver won't work together
	  with the PLIP support in Linux versions 1.0.x.  This option enlarges
	  your kernel by about 8 KB.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>.  The module will be
	  called plip.  If unsure, say Y or M, in case you buy a laptop
	  later.

config PPP
	tristate "PPP (point-to-point protocol) support"
	select SLHC
	---help---
	  PPP (Point to Point Protocol) is a newer and better SLIP.  It serves
	  the same purpose: sending Internet traffic over telephone (and other
	  serial) lines.  Ask your access provider if they support it, because
	  otherwise you can't use it; most Internet access providers these
	  days support PPP rather than SLIP.

	  To use PPP, you need an additional program called pppd as described
	  in the PPP-HOWTO, available at
	  <http://www.tldp.org/docs.html#howto>.  Make sure that you have
	  the version of pppd recommended in <file:Documentation/Changes>.
	  The PPP option enlarges your kernel by about 16 KB.

	  There are actually two versions of PPP: the traditional PPP for
	  asynchronous lines, such as regular analog phone lines, and
	  synchronous PPP which can be used over digital ISDN lines for
	  example.  If you want to use PPP over phone lines or other
	  asynchronous serial lines, you need to say Y (or M) here and also to
	  the next option, "PPP support for async serial ports".  For PPP over
	  synchronous lines, you should say Y (or M) here and to "Support
	  synchronous PPP", below.

	  If you said Y to "Version information on all symbols" above, then
	  you cannot compile the PPP driver into the kernel; you can then only
	  compile it as a module. To compile this driver as a module, choose M
	  here and read <file:Documentation/networking/net-modules.txt>.
	  The module will be called ppp_generic.

config PPP_MULTILINK
	bool "PPP multilink support (EXPERIMENTAL)"
	depends on PPP && EXPERIMENTAL
	help
	  PPP multilink is a protocol (defined in RFC 1990) which allows you
	  to combine several (logical or physical) lines into one logical PPP
	  connection, so that you can utilize your full bandwidth.

	  This has to be supported at the other end as well and you need a
	  version of the pppd daemon which understands the multilink protocol.

	  If unsure, say N.

config PPP_FILTER
	bool "PPP filtering"
	depends on PPP
	help
	  Say Y here if you want to be able to filter the packets passing over
	  PPP interfaces.  This allows you to control which packets count as
	  activity (i.e. which packets will reset the idle timer or bring up
	  a demand-dialed link) and which packets are to be dropped entirely.
	  You need to say Y here if you wish to use the pass-filter and
	  active-filter options to pppd.

	  If unsure, say N.

config PPP_ASYNC
	tristate "PPP support for async serial ports"
	depends on PPP
	select CRC_CCITT
	---help---
	  Say Y (or M) here if you want to be able to use PPP over standard
	  asynchronous serial ports, such as COM1 or COM2 on a PC.  If you use
	  a modem (not a synchronous or ISDN modem) to contact your ISP, you
	  need this option.

	  To compile this driver as a module, choose M here.

	  If unsure, say Y.

config PPP_SYNC_TTY
	tristate "PPP support for sync tty ports"
	depends on PPP
	help
	  Say Y (or M) here if you want to be able to use PPP over synchronous
	  (HDLC) tty devices, such as the SyncLink adapter. These devices
	  are often used for high-speed leased lines like T1/E1.

	  To compile this driver as a module, choose M here.

config PPP_DEFLATE
	tristate "PPP Deflate compression"
	depends on PPP
	select ZLIB_INFLATE
	select ZLIB_DEFLATE
	---help---
	  Support for the Deflate compression method for PPP, which uses the
	  Deflate algorithm (the same algorithm that gzip uses) to compress
	  each PPP packet before it is sent over the wire.  The machine at the
	  other end of the PPP link (usually your ISP) has to support the
	  Deflate compression method as well for this to be useful.  Even if
	  they don't support it, it is safe to say Y here.

	  To compile this driver as a module, choose M here.

config PPP_BSDCOMP
	tristate "PPP BSD-Compress compression"
	depends on PPP
	---help---
	  Support for the BSD-Compress compression method for PPP, which uses
	  the LZW compression method to compress each PPP packet before it is
	  sent over the wire. The machine at the other end of the PPP link
	  (usually your ISP) has to support the BSD-Compress compression
	  method as well for this to be useful. Even if they don't support it,
	  it is safe to say Y here.

	  The PPP Deflate compression method ("PPP Deflate compression",
	  above) is preferable to BSD-Compress, because it compresses better
	  and is patent-free.

	  Note that the BSD compression code will always be compiled as a
	  module; it is called bsd_comp and will show up in the directory
	  modules once you have said "make modules". If unsure, say N.

config PPP_MPPE
       tristate "PPP MPPE compression (encryption) (EXPERIMENTAL)"
       depends on PPP && EXPERIMENTAL
       select CRYPTO
       select CRYPTO_SHA1
       select CRYPTO_ARC4
       select CRYPTO_ECB
       ---help---
         Support for the MPPE Encryption protocol, as employed by the
	 Microsoft Point-to-Point Tunneling Protocol.

	 See http://pptpclient.sourceforge.net/ for information on
	 configuring PPTP clients and servers to utilize this method.

config PPPOE
	tristate "PPP over Ethernet (EXPERIMENTAL)"
	depends on EXPERIMENTAL && PPP
	help
	  Support for PPP over Ethernet.

	  This driver requires the latest version of pppd from the CVS
	  repository at cvs.samba.org.  Alternatively, see the 
	  RoaringPenguin package (<http://www.roaringpenguin.com/pppoe>)
	  which contains instruction on how to use this driver (under 
	  the heading "Kernel mode PPPoE").

config PPPOATM
	tristate "PPP over ATM"
	depends on ATM && PPP
	help
	  Support PPP (Point to Point Protocol) encapsulated in ATM frames.
	  This implementation does not yet comply with section 8 of RFC2364,
	  which can lead to bad results if the ATM peer loses state and
	  changes its encapsulation unilaterally.

config SLIP
	tristate "SLIP (serial line) support"
	---help---
	  Say Y if you intend to use SLIP or CSLIP (compressed SLIP) to
	  connect to your Internet service provider or to connect to some
	  other local Unix box or if you want to configure your Linux box as a
	  Slip/CSlip server for other people to dial in. SLIP (Serial Line
	  Internet Protocol) is a protocol used to send Internet traffic over
	  serial connections such as telephone lines or null modem cables;
	  nowadays, the protocol PPP is more commonly used for this same
	  purpose.

	  Normally, your access provider has to support SLIP in order for you
	  to be able to use it, but there is now a SLIP emulator called SLiRP
	  around (available from
	  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
	  allows you to use SLIP over a regular dial up shell connection. If
	  you plan to use SLiRP, make sure to say Y to CSLIP, below. The
	  NET-3-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, explains how to
	  configure SLIP. Note that you don't need this option if you just
	  want to run term (term is a program which gives you almost full
	  Internet connectivity if you have a regular dial up shell account on
	  some Internet connected Unix computer. Read
	  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>). SLIP
	  support will enlarge your kernel by about 4 KB. If unsure, say N.

	  To compile this driver as a module, choose M here and read
	  <file:Documentation/networking/net-modules.txt>. The module will be
	  called slip.

config SLIP_COMPRESSED
	bool "CSLIP compressed headers"
	depends on SLIP
	select SLHC
	---help---
	  This protocol is faster than SLIP because it uses compression on the
	  TCP/IP headers (not on the data itself), but it has to be supported
	  on both ends. Ask your access provider if you are not sure and
	  answer Y, just in case. You will still be able to use plain SLIP. If
	  you plan to use SLiRP, the SLIP emulator (available from
	  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
	  allows you to use SLIP over a regular dial up shell connection, you
	  definitely want to say Y here. The NET-3-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, explains how to configure
	  CSLIP. This won't enlarge your kernel.

config SLHC
	tristate
	help
	  This option enables Van Jacobsen serial line header compression
	  routines.

config SLIP_SMART
	bool "Keepalive and linefill"
	depends on SLIP
	help
	  Adds additional capabilities to the SLIP driver to support the
	  RELCOM line fill and keepalive monitoring. Ideal on poor quality
	  analogue lines.

config SLIP_MODE_SLIP6
	bool "Six bit SLIP encapsulation"
	depends on SLIP
	help
	  Just occasionally you may need to run IP over hostile serial
	  networks that don't pass all control characters or are only seven
	  bit. Saying Y here adds an extra mode you can use with SLIP:
	  "slip6". In this mode, SLIP will only send normal ASCII symbols over
	  the serial device. Naturally, this has to be supported at the other
	  end of the link as well. It's good enough, for example, to run IP
	  over the async ports of a Camtec JNT Pad. If unsure, say N.

config NET_FC
	bool "Fibre Channel driver support"
	depends on SCSI && PCI
	help
	  Fibre Channel is a high speed serial protocol mainly used to connect
	  large storage devices to the computer; it is compatible with and
	  intended to replace SCSI.

	  If you intend to use Fibre Channel, you need to have a Fibre channel
	  adaptor card in your computer; say Y here and to the driver for your
	  adaptor below. You also should have said Y to "SCSI support" and
	  "SCSI generic support".

config SHAPER
	tristate "Traffic Shaper (OBSOLETE)"
	depends on EXPERIMENTAL
	---help---
	  The traffic shaper is a virtual network device that allows you to
	  limit the rate of outgoing data flow over some other network device.
	  The traffic that you want to slow down can then be routed through
	  these virtual devices. See
	  <file:Documentation/networking/shaper.txt> for more information.

	  An alternative to this traffic shaper are traffic schedulers which
	  you'll get if you say Y to "QoS and/or fair queuing" in
	  "Networking options".

	  To compile this driver as a module, choose M here: the module
	  will be called shaper.  If unsure, say N.

config NETCONSOLE
	tristate "Network console logging support (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	---help---
	If you want to log kernel messages over the network, enable this.
	See <file:Documentation/networking/netconsole.txt> for details.

endif #NETDEVICES

config NETPOLL
	def_bool NETCONSOLE

config NETPOLL_TRAP
	bool "Netpoll traffic trapping"
	default n
	depends on NETPOLL

config NET_POLL_CONTROLLER
	def_bool NETPOLL

endmenu
