#
# Appletalk driver configuration
#
config ATALK
	tristate "Appletalk protocol support"
	depends on BKL # waiting to be removed from net/appletalk/ddp.c
	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
	  NET-3-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
	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.txt>.

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.txt>.

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.txt> 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.txt> for more information. If
	  you said Y to "AppleTalk-IP driver support" above and you say Y
	  here, then you cannot say Y to "AppleTalk-IP to IP Decapsulation
	  support", below.

config IPDDP_DECAP
	bool "Appletalk-IP to IP Decapsulation support"
	depends on IPDDP
	help
	  If you say Y here, the AppleTalk-IP code will be able to decapsulate
	  AppleTalk-IP frames to IP packets; this is useful if you want your
	  Linux box to act as an Internet gateway for an AppleTalk network.
	  Please see <file:Documentation/networking/ipddp.txt> for more
	  information.  If you said Y to "AppleTalk-IP driver support" above
	  and you say Y here, then you cannot say Y to "IP to AppleTalk-IP
	  Encapsulation support", above.

