# SPDX-License-Identifier: GPL-2.0-only
#
# Appletalk driver configuration
#
config ATALK
	tristate "Appletalk protocol support"
	select LLC
	help
	  AppleTalk is the protocol that Apple computers can use to communicate
	  on a network.  If your Linux box is connected to such a network and you
	  wish to connect to it, say Y.  You will need to use the netatalk package
	  so that your Linux box can act as a print and file server for Macs as
	  well as access AppleTalk printers.  Check out
	  <http://www.zettabyte.net/netatalk/> on the WWW for details.
	  EtherTalk is the name used for AppleTalk over Ethernet and the
	  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
	  network using serial links.  EtherTalk and LocalTalk are fully
	  supported by Linux.

	  General information about how to connect Linux, Windows machines and
	  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
	  NET3-4-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, contains valuable
	  information as well.

	  To compile this driver as a module, choose M here: the module will be
	  called appletalk. You almost certainly want to compile it as a
	  module so you can restart your AppleTalk stack without rebooting
	  your machine. I hear that the GNU boycott of Apple is over, so
	  even politically correct people are allowed to say Y here.

config DEV_APPLETALK
	tristate "Appletalk interfaces support"
	depends on ATALK
	help
	  AppleTalk is the protocol that Apple computers can use to communicate
	  on a network.  If your Linux box is connected to such a network, and wish
	  to do IP over it, or you have a LocalTalk card and wish to use it to
	  connect to the AppleTalk network, say Y.
	  

config LTPC
	tristate "Apple/Farallon LocalTalk PC support"
	depends on DEV_APPLETALK && (ISA || EISA) && ISA_DMA_API && VIRT_TO_BUS
	help
	  This allows you to use the AppleTalk PC card to connect to LocalTalk
	  networks. The card is also known as the Farallon PhoneNet PC card.
	  If you are in doubt, this card is the one with the 65C02 chip on it.
	  You also need version 1.3.3 or later of the netatalk package.
	  This driver is experimental, which means that it may not work.
	  See the file <file:Documentation/networking/ltpc.rst>.

config COPS
	tristate "COPS LocalTalk PC support"
	depends on DEV_APPLETALK && (ISA || EISA)
	help
	  This allows you to use COPS AppleTalk cards to connect to LocalTalk
	  networks. You also need version 1.3.3 or later of the netatalk
	  package. This driver is experimental, which means that it may not
	  work. This driver will only work if you choose "AppleTalk DDP"
	  networking support, above.
	  Please read the file <file:Documentation/networking/cops.rst>.

config COPS_DAYNA
	bool "Dayna firmware support"
	depends on COPS
	help
	  Support COPS compatible cards with Dayna style firmware (Dayna
	  DL2000/ Daynatalk/PC (half length), COPS LT-95, Farallon PhoneNET PC
	  III, Farallon PhoneNET PC II).

config COPS_TANGENT
	bool "Tangent firmware support"
	depends on COPS
	help
	  Support COPS compatible cards with Tangent style firmware (Tangent
	  ATB_II, Novell NL-1000, Daystar Digital LT-200.

config IPDDP
	tristate "Appletalk-IP driver support"
	depends on DEV_APPLETALK && ATALK
	help
	  This allows IP networking for users who only have AppleTalk
	  networking available. This feature is experimental. With this
	  driver, you can encapsulate IP inside AppleTalk (e.g. if your Linux
	  box is stuck on an AppleTalk only network) or decapsulate (e.g. if
	  you want your Linux box to act as an Internet gateway for a zoo of
	  AppleTalk connected Macs). Please see the file
	  <file:Documentation/networking/ipddp.rst> for more information.

	  If you say Y here, the AppleTalk-IP support will be compiled into
	  the kernel. In this case, you can either use encapsulation or
	  decapsulation, but not both. With the following two questions, you
	  decide which one you want.

	  To compile the AppleTalk-IP support as a module, choose M here: the
	  module will be called ipddp.
	  In this case, you will be able to use both encapsulation and
	  decapsulation simultaneously, by loading two copies of the module
	  and specifying different values for the module option ipddp_mode.

config IPDDP_ENCAP
	bool "IP to Appletalk-IP Encapsulation support"
	depends on IPDDP
	help
	  If you say Y here, the AppleTalk-IP code will be able to encapsulate
	  IP packets inside AppleTalk frames; this is useful if your Linux box
	  is stuck on an AppleTalk network (which hopefully contains a
	  decapsulator somewhere). Please see
	  <file:Documentation/networking/ipddp.rst> for more information.
