# SPDX-License-Identifier: GPL-2.0-only
#
# Old ISDN4Linux config
#

if ISDN_I4L

config ISDN_PPP
	bool "Support synchronous PPP"
	depends on INET
	select SLHC
	help
	  Over digital connections such as ISDN, there is no need to
	  synchronize sender and recipient's clocks with start and stop bits
	  as is done over analog telephone lines. Instead, one can use
	  "synchronous PPP". Saying Y here will include this protocol. This
	  protocol is used by Cisco and Sun for example. So you want to say Y
	  here if the other end of your ISDN connection supports it. You will
	  need a special version of pppd (called ipppd) for using this
	  feature. See <file:Documentation/isdn/README.syncppp> and
	  <file:Documentation/isdn/syncPPP.FAQ> for more information.

config ISDN_PPP_VJ
	bool "Use VJ-compression with synchronous PPP"
	depends on ISDN_PPP
	help
	  This enables Van Jacobson header compression for synchronous PPP.
	  Say Y if the other end of the connection supports it.

config ISDN_MPP
	bool "Support generic MP (RFC 1717)"
	depends on ISDN_PPP
	help
	  With synchronous PPP enabled, it is possible to increase throughput
	  by bundling several ISDN-connections, using this protocol. See
	  <file:Documentation/isdn/README.syncppp> for more information.

config IPPP_FILTER
	bool "Filtering for synchronous PPP"
	depends on ISDN_PPP
	help
	  Say Y here if you want to be able to filter the packets passing over
	  IPPP interfaces.  This allows you to control which packets count as
	  activity (i.e. which packets will reset the idle timer or bring up
	  a demand-dialled link) and which packets are to be dropped entirely.
	  You need to say Y here if you wish to use the pass-filter and
	  active-filter options to ipppd.

config ISDN_PPP_BSDCOMP
	tristate "Support BSD compression"
	depends on ISDN_PPP
	help
	  Support for the BSD-Compress compression method for PPP, which uses
	  the LZW compression method to compress each PPP packet before it is
	  sent over the wire. The machine at the other end of the PPP link
	  (usually your ISP) has to support the BSD-Compress compression
	  method as well for this to be useful. Even if they don't support it,
	  it is safe to say Y here.

config ISDN_AUDIO
	bool "Support audio via ISDN"
	help
	  If you say Y here, the modem-emulator will support a subset of the
	  EIA Class 8 Voice commands. Using a getty with voice-support
	  (mgetty+sendfax by <gert@greenie.muc.de> with an extension, available
	  with the ISDN utility package for example), you will be able to use
	  your Linux box as an ISDN-answering machine. Of course, this must be
	  supported by the lowlevel driver also. Currently, the HiSax driver
	  is the only voice-supporting driver. See
	  <file:Documentation/isdn/README.audio> for more information.

config ISDN_TTY_FAX
	bool "Support AT-Fax Class 1 and 2 commands"
	depends on ISDN_AUDIO
	help
	  If you say Y here, the modem-emulator will support a subset of the
	  Fax Class 1 and 2 commands. Using a getty with fax-support
	  (mgetty+sendfax, hylafax), you will be able to use your Linux box as
	  an ISDN-fax-machine. This must be supported by the lowlevel driver
	  also. See <file:Documentation/isdn/README.fax> for more information.

config ISDN_X25
	bool "X.25 PLP on top of ISDN"
	depends on X25
	help
	  This feature provides the X.25 protocol over ISDN connections.
	  See <file:Documentation/isdn/README.x25> for more information
	  if you are thinking about using this.


menu "ISDN feature submodules"

config ISDN_DRV_LOOP
	tristate "isdnloop support"
	depends on BROKEN_ON_SMP
	help
	  This driver provides a virtual ISDN card. Its primary purpose is
	  testing of linklevel features or configuration without getting
	  charged by your service-provider for lots of phone calls.
	  You need will need the loopctrl utility from the latest isdn4k-utils
	  package to set up this driver.

config ISDN_DIVERSION
	tristate "Support isdn diversion services"
	help
	  This option allows you to use some supplementary diversion
	  services in conjunction with the HiSax driver on an EURO/DSS1
	  line.

	  Supported options are CD (call deflection), CFU (Call forward
	  unconditional), CFB (Call forward when busy) and CFNR (call forward
	  not reachable). Additionally the actual CFU, CFB and CFNR state may
	  be interrogated.

	  The use of CFU, CFB, CFNR and interrogation may be limited to some
	  countries. The keypad protocol is still not implemented. CD should
	  work in all countries if the service has been subscribed to.

	  Please read the file <file:Documentation/isdn/README.diversion>.

endmenu

comment "ISDN4Linux hardware drivers"

source "drivers/isdn/hisax/Kconfig"

# end ISDN_I4L
endif

