#
# Token Ring driver configuration
#

menu "Token Ring devices"
	depends on NETDEVICES

# So far, we only have PCI, ISA, and MCA token ring devices
config TR
	bool "Token Ring driver support"
	depends on (PCI || ISA || MCA || CCW)
	select LLC
	help
	  Token Ring is IBM's way of communication on a local network; the
	  rest of the world uses Ethernet. To participate on a Token Ring
	  network, you need a special Token ring network card. If you are
	  connected to such a Token Ring network and want to use your Token
	  Ring card under Linux, say Y here and to the driver for your
	  particular card below and read the Token-Ring mini-HOWTO, available
	  from <http://www.tldp.org/docs.html#howto>. Most people can
	  say N here.

config IBMTR
	tristate "IBM Tropic chipset based adapter support"
	depends on TR && (ISA || MCA)
	---help---
	  This is support for all IBM Token Ring cards that don't use DMA. If
	  you have such a beast, say Y and read the Token-Ring mini-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  Warning: this driver will almost definitely fail if more than one
	  active Token Ring card is present.

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

config IBMOL
	tristate "IBM Olympic chipset PCI adapter support"
	depends on TR && PCI
	---help---
	  This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
	  Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
	  Wake On Lan, and PCI 100/16/4 adapters.

	  If you have such an adapter, say Y and read the Token-Ring
	  mini-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 olympic.

	  Also read <file:Documentation/networking/olympic.txt> or check the
	  Linux Token Ring Project site for the latest information at
	  <http://www.linuxtr.net/>.

config IBMLS
	tristate "IBM Lanstreamer chipset PCI adapter support"
	depends on TR && PCI && !64BIT
	help
	  This is support for IBM Lanstreamer PCI Token Ring Cards.

	  If you have such an adapter, say Y and read the Token-Ring
	  mini-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 lanstreamer.

config 3C359
	tristate "3Com 3C359 Token Link Velocity XL adapter support"
	depends on TR && PCI
	---help---
	  This is support for the 3Com PCI Velocity XL cards, specifically
	  the 3Com 3C359, please note this is not for the 3C339 cards, you
	  should use the tms380 driver instead.

	  If you have such an adapter, say Y and read the Token-Ring
	  mini-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 3c359.

	  Also read the file <file:Documentation/networking/3c359.txt> or check the 
	  Linux Token Ring Project site for the latest information at
	  <http://www.linuxtr.net>

config TMS380TR
	tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
	depends on TR && (PCI || ISA)
	select FW_LOADER
	---help---
	  This driver provides generic support for token ring adapters
	  based on the Texas Instruments TMS380 series chipsets.  This
	  includes the SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect
	  TR4/16(+) PCI (SK-4590), SysKonnect TR4/16 PCI (SK-4591),
	  Compaq 4/16 PCI, Thomas-Conrad TC4048 4/16 PCI, and several
	  Madge adapters.  If you say Y here, you will be asked to select
	  which cards to support below.  If you're using modules, each
	  class of card will be supported by a separate module.

	  If you have such an adapter and would like to use it, say Y and
	  read the Token-Ring mini-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  Also read the file <file:Documentation/networking/tms380tr.txt> or
	  check <http://www.auk.cx/tms380tr/>.

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

config TMSPCI
	tristate "Generic TMS380 PCI support"
	depends on TR && TMS380TR && PCI
	---help---
	  This tms380 module supports generic TMS380-based PCI cards.

	  These cards are known to work:
	  - Compaq 4/16 TR PCI
	  - SysKonnect TR4/16 PCI (SK-4590/SK-4591)
	  - Thomas-Conrad TC4048 PCI 4/16
	  - 3Com Token Link Velocity

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

config SKISA
	tristate "SysKonnect TR4/16 ISA support"
	depends on TR && TMS380TR && ISA
	help
	  This tms380 module supports SysKonnect TR4/16 ISA cards.

	  These cards are known to work:
	  - SysKonnect TR4/16 ISA (SK-4190)

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

config PROTEON
	tristate "Proteon ISA support"
	depends on TR && TMS380TR && ISA
	help
	  This tms380 module supports Proteon ISA cards.

	  These cards are known to work:
	  - Proteon 1392
	  - Proteon 1392 plus

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

config ABYSS
	tristate "Madge Smart 16/4 PCI Mk2 support"
	depends on TR && TMS380TR && PCI
	help
	  This tms380 module supports the Madge Smart 16/4 PCI Mk2
	  cards (51-02).

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

config MADGEMC
	tristate "Madge Smart 16/4 Ringnode MicroChannel"
	depends on TR && TMS380TR && MCA_LEGACY
	help
	  This tms380 module supports the Madge Smart 16/4 MC16 and MC32
	  MicroChannel adapters.

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

config SMCTR
	tristate "SMC ISA/MCA adapter support"
	depends on TR && (ISA || MCA_LEGACY) && (BROKEN || !64BIT)
	---help---
	  This is support for the ISA and MCA SMC Token Ring cards,
	  specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
	  (8115T/A) adapters.

	  If you have such an adapter and would like to use it, say Y or M and
	  read the Token-Ring mini-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto> and the file
	  <file:Documentation/networking/smctr.txt>.

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

endmenu

