#
# Token Ring driver configuration
#

# So far, we only have PCI, ISA, and MCA token ring devices
menuconfig TR
	tristate "Token Ring driver support"
	depends on NETDEVICES && !UML
	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.

if TR

config IBMTR
	tristate "IBM Tropic chipset based adapter support"
	depends on 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 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 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 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 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 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 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 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 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 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 (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.

endif # TR
