#
# wan devices configuration
#

menu "Wan interfaces"
	depends on NETDEVICES

config WAN
	bool "Wan interfaces support"
	---help---
	  Wide Area Networks (WANs), such as X.25, Frame Relay and leased
	  lines, are used to interconnect Local Area Networks (LANs) over vast
	  distances with data transfer rates significantly higher than those
	  achievable with commonly used asynchronous modem connections.

	  Usually, a quite expensive external device called a `WAN router' is
	  needed to connect to a WAN. As an alternative, a relatively
	  inexpensive WAN interface card can allow your Linux box to directly
	  connect to a WAN.

	  If you have one of those cards and wish to use it under Linux,
	  say Y here and also to the WAN driver for your card.

	  If unsure, say N.

# There is no way to detect a comtrol sv11 - force it modular for now.
config HOSTESS_SV11
	tristate "Comtrol Hostess SV-11 support"
	depends on WAN && ISA && m
	help
	  Driver for Comtrol Hostess SV-11 network card which
	  operates on low speed synchronous serial links at up to
	  256Kbps, supporting PPP and Cisco HDLC.

	  The driver will be compiled as a module: the
	  module will be called hostess_sv11.

# The COSA/SRP driver has not been tested as non-modular yet.
config COSA
	tristate "COSA/SRP sync serial boards support"
	depends on WAN && ISA && m
	---help---
	  Driver for COSA and SRP synchronous serial boards.

	  These boards allow to connect synchronous serial devices (for example
	  base-band modems, or any other device with the X.21, V.24, V.35 or
	  V.36 interface) to your Linux box. The cards can work as the
	  character device, synchronous PPP network device, or the Cisco HDLC
	  network device.

	  You will need user-space utilities COSA or SRP boards for downloading
 	  the firmware to the cards and to set them up. Look at the
	  <http://www.fi.muni.cz/~kas/cosa/> for more information. You can also
	  read the comment at the top of the <file:drivers/net/wan/cosa.c> for
	  details about the cards and the driver itself.

	  The driver will be compiled as a module: the
	  module will be called cosa.

config DSCC4
	tristate "Etinc PCISYNC serial board support"
	depends on WAN && PCI && m
	help
	  Driver for Etinc PCISYNC boards based on the Infineon (ex. Siemens)
	  DSCC4 chipset.

	  This is supposed to work with the four port card. Take a look at
	  <http://www.cogenit.fr/dscc4/> for further information about the
	  driver.

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

config DSCC4_PCISYNC
	bool "Etinc PCISYNC features"
	depends on DSCC4
	help
	  Due to Etinc's design choice for its PCISYNC cards, some operations
	  are only allowed on specific ports of the DSCC4. This option is the
	  only way for the driver to know that it shouldn't return a success
	  code for these operations.

	  Please say Y if your card is an Etinc's PCISYNC.

config DSCC4_PCI_RST
	bool "Hard reset support"
	depends on DSCC4
	help
	  Various DSCC4 bugs forbid any reliable software reset of the ASIC.
	  As a replacement, some vendors provide a way to assert the PCI #RST
	  pin of DSCC4 through the GPIO port of the card. If you choose Y,
	  the driver will make use of this feature before module removal
	  (i.e. rmmod). The feature is known to be available on Commtech's
	  cards. Contact your manufacturer for details.

	  Say Y if your card supports this feature.

#
# Lan Media's board. Currently 1000, 1200, 5200, 5245
#
config LANMEDIA
	tristate "LanMedia Corp. SSI/V.35, T1/E1, HSSI, T3 boards"
	depends on WAN && PCI
	---help---
	  Driver for the following Lan Media family of serial boards:

	  - LMC 1000 board allows you to connect synchronous serial devices
	  (for example base-band modems, or any other device with the X.21,
	  V.24, V.35 or V.36 interface) to your Linux box.

	  - LMC 1200 with on board DSU board allows you to connect your Linux
	  box directly to a T1 or E1 circuit.

	  - LMC 5200 board provides a HSSI interface capable of running up to
	  52 Mbits per second.

	  - LMC 5245 board connects directly to a T3 circuit saving the
	  additional external hardware.

	  To change setting such as syncPPP vs Cisco HDLC or clock source you
	  will need lmcctl.  It is available at <ftp://ftp.lanmedia.com/>
	  (broken link).

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

# There is no way to detect a Sealevel board. Force it modular
config SEALEVEL_4021
	tristate "Sealevel Systems 4021 support"
	depends on WAN && ISA && m
	help
	  This is a driver for the Sealevel Systems ACB 56 serial I/O adapter.

	  The driver will be compiled as a module: the
	  module will be called sealevel.

config SYNCLINK_SYNCPPP
	tristate "SyncLink HDLC/SYNCPPP support"
	depends on WAN
	help
	  Enables HDLC/SYNCPPP support for the SyncLink WAN driver.

	  Normally the SyncLink WAN driver works with the main PPP driver
	  <file:drivers/net/ppp_generic.c> and pppd program.
	  HDLC/SYNCPPP support allows use of the Cisco HDLC/PPP driver
	  <file:drivers/net/wan/syncppp.c>. The SyncLink WAN driver (in
	  character devices) must also be enabled.

# Generic HDLC
config HDLC
	tristate "Generic HDLC layer"
	depends on WAN
	help
	  Say Y to this option if your Linux box contains a WAN (Wide Area
	  Network) card supported by this driver and you are planning to
	  connect the box to a WAN.

	  You will need supporting software from <http://hq.pm.waw.pl/hdlc/>.
	  Generic HDLC driver currently supports raw HDLC, Cisco HDLC, Frame
	  Relay, synchronous Point-to-Point Protocol (PPP) and X.25.

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

	  If unsure, say N.

config HDLC_RAW
	bool "Raw HDLC support"
	depends on HDLC
	help
	  Generic HDLC driver supporting raw HDLC over WAN connections.

	  If unsure, say N.

config HDLC_RAW_ETH
	bool "Raw HDLC Ethernet device support"
	depends on HDLC
	help
	  Generic HDLC driver supporting raw HDLC Ethernet device emulation
	  over WAN connections.

	  You will need it for Ethernet over HDLC bridges.

	  If unsure, say N.

config HDLC_CISCO
	bool "Cisco HDLC support"
	depends on HDLC
	help
	  Generic HDLC driver supporting Cisco HDLC over WAN connections.

	  If unsure, say N.

config HDLC_FR
	bool "Frame Relay support"
	depends on HDLC
	help
	  Generic HDLC driver supporting Frame Relay over WAN connections.

	  If unsure, say N.

config HDLC_PPP
	bool "Synchronous Point-to-Point Protocol (PPP) support"
	depends on HDLC
	help
	  Generic HDLC driver supporting PPP over WAN connections.

	  If unsure, say N.

config HDLC_X25
	bool "X.25 protocol support"
	depends on HDLC && (LAPB=m && HDLC=m || LAPB=y)
	help
	  Generic HDLC driver supporting X.25 over WAN connections.

	  If unsure, say N.

comment "X.25/LAPB support is disabled"
	depends on WAN && HDLC && (LAPB!=m || HDLC!=m) && LAPB!=y

config PCI200SYN
	tristate "Goramo PCI200SYN support"
	depends on HDLC && PCI
	help
	  Driver for PCI200SYN cards by Goramo sp. j.

	  If you have such a card, say Y here and see
	  <http://hq.pm.waw.pl/hdlc/>.

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

	  If unsure, say N.

config WANXL
	tristate "SBE Inc. wanXL support"
	depends on HDLC && PCI
	help
	  Driver for wanXL PCI cards by SBE Inc.

	  If you have such a card, say Y here and see
	  <http://hq.pm.waw.pl/hdlc/>.

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

	  If unsure, say N.

config WANXL_BUILD_FIRMWARE
	bool "rebuild wanXL firmware"
	depends on WANXL && !PREVENT_FIRMWARE_BUILD
	help
	  Allows you to rebuild firmware run by the QUICC processor.
	  It requires as68k, ld68k and hexdump programs.

	  You should never need this option, say N.

config PC300
	tristate "Cyclades-PC300 support (RS-232/V.35, X.21, T1/E1 boards)"
	depends on HDLC && PCI
	---help---
	  Driver for the Cyclades-PC300 synchronous communication boards.

	  These boards provide synchronous serial interfaces to your
	  Linux box (interfaces currently available are RS-232/V.35, X.21 and
	  T1/E1). If you wish to support Multilink PPP, please select the
	  option later and read the file README.mlppp provided by PC300
	  package.

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

	  If unsure, say N.

config PC300_MLPPP
	bool "Cyclades-PC300 MLPPP support"
	depends on PC300 && PPP_MULTILINK && PPP_SYNC_TTY && HDLC_PPP
	help
	  Multilink PPP over the PC300 synchronous communication boards.

comment "Cyclades-PC300 MLPPP support is disabled."
	depends on WAN && HDLC && PC300 && (PPP=n || !PPP_MULTILINK || PPP_SYNC_TTY=n || !HDLC_PPP)

comment "Refer to the file README.mlppp, provided by PC300 package."
	depends on WAN && HDLC && PC300 && (PPP=n || !PPP_MULTILINK || PPP_SYNC_TTY=n || !HDLC_PPP)

config N2
	tristate "SDL RISCom/N2 support"
	depends on HDLC && ISA
	help
	  Driver for RISCom/N2 single or dual channel ISA cards by
	  SDL Communications Inc.

	  If you have such a card, say Y here and see
	  <http://hq.pm.waw.pl/hdlc/>.

	  Note that N2csu and N2dds cards are not supported by this driver.

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

	  If unsure, say N.

config C101
	tristate "Moxa C101 support"
	depends on HDLC && ISA
	help
	  Driver for C101 SuperSync ISA cards by Moxa Technologies Co., Ltd.

	  If you have such a card, say Y here and see
	  <http://hq.pm.waw.pl/pub/hdlc/>

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

	  If unsure, say N.

config FARSYNC
	tristate "FarSync T-Series support"
	depends on HDLC && PCI
	---help---
	  Support for the FarSync T-Series X.21 (and V.35/V.24) cards by
	  FarSite Communications Ltd.

	  Synchronous communication is supported on all ports at speeds up to
	  8Mb/s (128K on V.24) using synchronous PPP, Cisco HDLC, raw HDLC,
	  Frame Relay or X.25/LAPB.

	  If you want the module to be automatically loaded when the interface
	  is referenced then you should add "alias hdlcX farsync" to
	  /etc/modprobe.conf for each interface, where X is 0, 1, 2, ..., or
	  simply use "alias hdlc* farsync" to indicate all of them.

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

config DLCI
	tristate "Frame Relay DLCI support"
	depends on WAN
	---help---
	  Support for the Frame Relay protocol.

	  Frame Relay is a fast low-cost way to connect to a remote Internet
	  access provider or to form a private wide area network. The one
	  physical line from your box to the local "switch" (i.e. the entry
	  point to the Frame Relay network, usually at the phone company) can
	  carry several logical point-to-point connections to other computers
	  connected to the Frame Relay network. For a general explanation of
	  the protocol, check out <http://www.mplsforum.org/>.

	  To use frame relay, you need supporting hardware (called FRAD) and
	  certain programs from the net-tools package as explained in
	  <file:Documentation/networking/framerelay.txt>.

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

config DLCI_COUNT
	int "Max open DLCI"
	depends on DLCI
	default "24"
	help
	  Maximal number of logical point-to-point frame relay connections
	  (the identifiers of which are called DCLIs) that the driver can
	  handle.

	  The default is probably fine.

config DLCI_MAX
	int "Max DLCI per device"
	depends on DLCI
	default "8"
	help
	  How many logical point-to-point frame relay connections (the
	  identifiers of which are called DCLIs) should be handled by each
	  of your hardware frame relay access devices.

	  Go with the default.

config SDLA
	tristate "SDLA (Sangoma S502/S508) support"
	depends on DLCI && ISA
	help
	  Driver for the Sangoma S502A, S502E, and S508 Frame Relay Access
	  Devices.

	  These are multi-protocol cards, but only Frame Relay is supported
	  by the driver at this time. Please read
	  <file:Documentation/networking/framerelay.txt>.

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

# Wan router core.
config WAN_ROUTER_DRIVERS
	bool "WAN router drivers"
	depends on WAN && WAN_ROUTER
	---help---
	  Connect LAN to WAN via Linux box.

	  Select driver your card and remember to say Y to "Wan Router."
	  You will need the wan-tools package which is available from
	  <ftp://ftp.sangoma.com/>. For more information read:
	  <file:Documentation/networking/wan-router.txt>.

	  Note that the answer to this question won't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about WAN router drivers.

	  If unsure, say N.

config VENDOR_SANGOMA
	tristate "Sangoma WANPIPE(tm) multiprotocol cards"
	depends on WAN_ROUTER_DRIVERS && WAN_ROUTER && (PCI || ISA) && BROKEN
	---help---
	  Driver for S514-PCI/ISA Synchronous Data Link Adapters (SDLA).

	  WANPIPE from Sangoma Technologies Inc. <http://www.sangoma.com/>
	  is a family of intelligent multiprotocol WAN adapters with data
	  transfer rates up to 4Mbps. Cards support:

	  - X.25, Frame Relay, PPP, Cisco HDLC protocols.

	  - API for protocols like HDLC (LAPB), HDLC Streaming, X.25,
	  Frame Relay and BiSync.

	  - Ethernet Bridging over Frame Relay protocol.

	  - MULTILINK PPP

	  - Async PPP (Modem Dialup)

	  The next questions will ask you about the protocols you want
	  the driver to support.

	  If you have one or more of these cards, say M to this option;
	  and read <file:Documentation/networking/wanpipe.txt>.

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

config WANPIPE_CHDLC
	bool "WANPIPE Cisco HDLC support"
	depends on VENDOR_SANGOMA
	---help---
	  Connect a WANPIPE card to a leased line using the Cisco HDLC.

	  - Supports Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards
	  which allows user to build applications using the HDLC streaming API.

	  - CHDLC Streaming MULTILINK PPP that can bind multiple WANPIPE T1
	  cards into a single logical channel.

	  Say Y and the Cisco HDLC support, HDLC streaming API and
	  MULTILINK PPP will be included in the driver.

config WANPIPE_FR
	bool "WANPIPE Frame Relay support"
	depends on VENDOR_SANGOMA
	help
	  Connect a WANPIPE card to a Frame Relay network, or use Frame Felay
	  API to develop custom applications.

	  Contains the Ethernet Bridging over Frame Relay feature, where
	  a WANPIPE frame relay link can be directly connected to the Linux
	  kernel bridge. The Frame Relay option is supported on S514-PCI
	  and S508-ISA cards.

	  Say Y and the Frame Relay support will be included in the driver.

config WANPIPE_X25
	bool "WANPIPE X.25 support"
	depends on VENDOR_SANGOMA
	help
	  Connect a WANPIPE card to an X.25 network.

	  Includes the X.25 API support for custom applications over the
	  X.25 protocol. The X.25 option is supported on S514-PCI and
	  S508-ISA cards.

	  Say Y and the X.25 support will be included in the driver.

config WANPIPE_PPP
	bool "WANPIPE PPP support"
	depends on VENDOR_SANGOMA
	help
	  Connect a WANPIPE card to a leased line using Point-to-Point
	  Protocol (PPP).

	  The PPP option is supported on S514-PCI/S508-ISA cards.

	  Say Y and the PPP support will be included in the driver.

config WANPIPE_MULTPPP
	bool "WANPIPE Multi-Port PPP support"
	depends on VENDOR_SANGOMA
	help
	  Connect a WANPIPE card to a leased line using Point-to-Point
	  Protocol (PPP).

	  Uses in-kernel SyncPPP protocol over the Sangoma HDLC Streaming
	  adapter. In this case each Sangoma adapter port can support an
	  independent PPP connection. For example, a single Quad-Port PCI
	  adapter can support up to four independent PPP links. The PPP
	  option is supported on S514-PCI/S508-ISA cards.

	  Say Y and the Multi-Port PPP support will be included in the driver.

config CYCLADES_SYNC
	tristate "Cyclom 2X(tm) cards (EXPERIMENTAL)"
	depends on WAN_ROUTER_DRIVERS && (PCI || ISA)
	---help---
	  Cyclom 2X from Cyclades Corporation <http://www.cyclades.com/> is an
	  intelligent multiprotocol WAN adapter with data transfer rates up to
	  512 Kbps. These cards support the X.25 and SNA related protocols.

	  While no documentation is available at this time please grab the
	  wanconfig tarball in
	  <http://www.conectiva.com.br/~acme/cycsyn-devel/> (with minor changes
	  to make it compile with the current wanrouter include files; efforts
	  are being made to use the original package available at
	  <ftp://ftp.sangoma.com/>).

	  Feel free to contact me or the cycsyn-devel mailing list at
	  <acme@conectiva.com.br> and <cycsyn-devel@bazar.conectiva.com.br> for
	  additional details, I hope to have documentation available as soon as
	  possible. (Cyclades Brazil is writing the Documentation).

	  The next questions will ask you about the protocols you want the
	  driver to support (for now only X.25 is supported).

	  If you have one or more of these cards, say Y to this option.

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

config CYCLOMX_X25
	bool "Cyclom 2X X.25 support (EXPERIMENTAL)"
	depends on CYCLADES_SYNC
	help
	  Connect a Cyclom 2X card to an X.25 network.

	  Enabling X.25 support will enlarge your kernel by about 11 kB.

# X.25 network drivers
config LAPBETHER
	tristate "LAPB over Ethernet driver (EXPERIMENTAL)"
	depends on WAN && LAPB && X25
	---help---
	  Driver for a pseudo device (typically called /dev/lapb0) which allows
	  you to open an LAPB point-to-point connection to some other computer
	  on your Ethernet network.

	  In order to do this, you need to say Y or M to the driver for your
	  Ethernet card as well as to "LAPB Data Link Driver".

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

	  If unsure, say N.

config X25_ASY
	tristate "X.25 async driver (EXPERIMENTAL)"
	depends on WAN && LAPB && X25
	---help---
	  Send and receive X.25 frames over regular asynchronous serial
	  lines such as telephone lines equipped with ordinary modems.

	  Experts should note that this driver doesn't currently comply with
	  the asynchronous HDLS framing protocols in CCITT recommendation X.25.

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

	  If unsure, say N.

config SBNI
	tristate "Granch SBNI12 Leased Line adapter support"
	depends on WAN && X86
	---help---
	  Driver for ISA SBNI12-xx cards which are low cost alternatives to
	  leased line modems.

	  You can find more information and last versions of drivers and
	  utilities at <http://www.granch.ru/>. If you have any question you
	  can send email to <sbni@granch.ru>.

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

	  If unsure, say N.

config SBNI_MULTILINE
	bool "Multiple line feature support"
	depends on SBNI
	help
	  Schedule traffic for some parallel lines, via SBNI12 adapters.

	  If you have two computers connected with two parallel lines it's
	  possible to increase transfer rate nearly twice. You should have
	  a program named 'sbniconfig' to configure adapters.

	  If unsure, say N.

endmenu

