#
# Arcnet configuration
#

menuconfig ARCNET
	depends on NETDEVICES && (ISA || PCI || PCMCIA)
	tristate "ARCnet support"
	---help---
	  If you have a network card of this type, say Y and check out the
	  (arguably) beautiful poetry in
	  <file:Documentation/networking/arcnet.txt>.

	  You need both this driver, and the driver for the particular ARCnet
	  chipset of your card. If you don't know, then it's probably a
	  COM90xx type card, so say Y (or M) to "ARCnet COM90xx chipset
	  support" below.

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

if ARCNET

config ARCNET_1201
	tristate "Enable standard ARCNet packet format (RFC 1201)"
	help
	  This allows you to use RFC1201 with your ARCnet card via the virtual
	  arc0 device.  You need to say Y here to communicate with
	  industry-standard RFC1201 implementations, like the arcether.com
	  packet driver or most DOS/Windows ODI drivers.  Please read the
	  ARCnet documentation in <file:Documentation/networking/arcnet.txt>
	  for more information about using arc0.

config ARCNET_1051
	tristate "Enable old ARCNet packet format (RFC 1051)"
	---help---
	  This allows you to use RFC1051 with your ARCnet card via the virtual
	  arc0s device. You only need arc0s if you want to talk to ARCnet
	  software complying with the "old" standard, specifically, the DOS
	  arcnet.com packet driver, Amigas running AmiTCP, and some variants
	  of NetBSD. You do not need to say Y here to communicate with
	  industry-standard RFC1201 implementations, like the arcether.com
	  packet driver or most DOS/Windows ODI drivers. RFC1201 is included
	  automatically as the arc0 device. Please read the ARCnet
	  documentation in <file:Documentation/networking/arcnet.txt> for more
	  information about using arc0e and arc0s.

config ARCNET_RAW
	tristate "Enable raw mode packet interface"
	help
	  ARCnet "raw mode" packet encapsulation, no soft headers.  Unlikely
	  to work unless talking to a copy of the same Linux arcnet driver,
	  but perhaps marginally faster in that case.

config ARCNET_CAP
	tristate "Enable CAP mode packet interface"
	help
	  ARCnet "cap mode" packet encapsulation. Used to get the hardware
          acknowledge back to userspace. After the initial protocol byte every
          packet is stuffed with an extra 4 byte "cookie" which doesn't
          actually appear on the network. After transmit the driver will send
          back a packet with protocol byte 0 containing the status of the
          transmission:
             0=no hardware acknowledge
             1=excessive nak
             2=transmission accepted by the receiver hardware

          Received packets are also stuffed with the extra 4 bytes but it will
          be random data.

          Cap only listens to protocol 1-8.

config ARCNET_COM90xx
	tristate "ARCnet COM90xx (normal) chipset driver"
	help
	  This is the chipset driver for the standard COM90xx cards. If you
	  have always used the old ARCnet driver without knowing what type of
	  card you had, this is probably the one for you.

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

config ARCNET_COM90xxIO
	tristate "ARCnet COM90xx (IO mapped) chipset driver"
	---help---
	  This is the chipset driver for the COM90xx cards, using them in
	  IO-mapped mode instead of memory-mapped mode. This is slower than
	  the normal driver. Only use it if your card doesn't support shared
	  memory.

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

config ARCNET_RIM_I
	tristate "ARCnet COM90xx (RIM I) chipset driver"
	---help---
	  This is yet another chipset driver for the COM90xx cards, but this
	  time only using memory-mapped mode, and no IO ports at all. This
	  driver is completely untested, so if you have one of these cards,
	  please mail <dwmw2@infradead.org>, especially if it works!

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

config ARCNET_COM20020
	tristate "ARCnet COM20020 chipset driver"
	depends on LEDS_CLASS
	help
	  This is the driver for the new COM20020 chipset. It supports such
	  things as promiscuous mode, so packet sniffing is possible, and
	  extra diagnostic information.

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

config ARCNET_COM20020_ISA
	tristate "Support for COM20020 on ISA"
	depends on ARCNET_COM20020 && ISA

config ARCNET_COM20020_PCI
	tristate "Support for COM20020 on PCI"
	depends on ARCNET_COM20020 && PCI

config ARCNET_COM20020_CS
	tristate "COM20020 ARCnet PCMCIA support"
	depends on ARCNET_COM20020 && PCMCIA
	help
	  Say Y here if you intend to attach this type of ARCnet PCMCIA card
	  to your computer.

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

endif # ARCNET
