# SPDX-License-Identifier: GPL-2.0-only
#
# Arcnet configuration
#

menuconfig ARCNET
	depends on NETDEVICES && (ISA || PCI || PCMCIA) && HAS_IOPORT
	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.rst>.

	  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.rst>
	  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.rst> 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
