#
# 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 && ISA_DMA_API || MCA)
	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
	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

