This is the ALPHA version of the ltpc driver.

In order to use it, you will need at least version 1.3.3 of the
netatalk package, and the Apple or Farallon LocalTalk PC card.
There are a number of different LocalTalk cards for the PC; this
driver applies only to the one with the 65c02 processor chip on it.

To include it in the kernel, select the CONFIG_LTPC switch in the
configuration dialog.  You can also compile it as a module.

While the driver will attempt to autoprobe the I/O port address, IRQ
line, and DMA channel of the card, this does not always work.  For
this reason, you should be prepared to supply these parameters
yourself.  (see "Card Configuration" below for how to determine or
change the settings on your card)

When the driver is compiled into the kernel, you can add a line such
as the following to your /etc/lilo.conf:

 append="ltpc=0x240,9,1"

where the parameters (in order) are the port address, IRQ, and DMA
channel.  The second and third values can be omitted, in which case
the driver will try to determine them itself.

If you load the driver as a module, you can pass the parameters "io=",
"irq=", and "dma=" on the command line with insmod or modprobe, or add
them as options in a configuration file in /etc/modprobe.d/ directory:

 alias lt0 ltpc # autoload the module when the interface is configured
 options ltpc io=0x240 irq=9 dma=1

Before starting up the netatalk demons (perhaps in rc.local), you
need to add a line such as:

 /sbin/ifconfig lt0 127.0.0.42

The address is unimportant - however, the card needs to be configured
with ifconfig so that Netatalk can find it.

The appropriate netatalk configuration depends on whether you are
attached to a network that includes AppleTalk routers or not.  If,
like me, you are simply connecting to your home Macintoshes and
printers, you need to set up netatalk to "seed".  The way I do this
is to have the lines

 dummy -seed -phase 2 -net 2000 -addr 2000.26 -zone "1033"
 lt0 -seed -phase 1 -net 1033 -addr 1033.27 -zone "1033"

in my atalkd.conf.  What is going on here is that I need to fool
netatalk into thinking that there are two AppleTalk interfaces
present; otherwise, it refuses to seed.  This is a hack, and a more
permanent solution would be to alter the netatalk code.  Also, make
sure you have the correct name for the dummy interface - If it's
compiled as a module, you will need to refer to it as "dummy0" or some
such.

If you are attached to an extended AppleTalk network, with routers on
it, then you don't need to fool around with this -- the appropriate
line in atalkd.conf is

 lt0 -phase 1

--------------------------------------

Card Configuration:

The interrupts and so forth are configured via the dipswitch on the
board.  Set the switches so as not to conflict with other hardware.

       Interrupts -- set at most one.  If none are set, the driver uses
       polled mode.  Because the card was developed in the XT era, the
       original documentation refers to IRQ2.  Since you'll be running
       this on an AT (or later) class machine, that really means IRQ9.

       SW1     IRQ 4
       SW2     IRQ 3
       SW3     IRQ 9 (2 in original card documentation only applies to XT)


       DMA -- choose DMA 1 or 3, and set both corresponding switches.

       SW4     DMA 3
       SW5     DMA 1
       SW6     DMA 3
       SW7     DMA 1


       I/O address -- choose one.

       SW8     220 / 240

--------------------------------------

IP:

Yes, it is possible to do IP over LocalTalk.  However, you can't just
treat the LocalTalk device like an ordinary Ethernet device, even if
that's what it looks like to Netatalk.

Instead, you follow the same procedure as for doing IP in EtherTalk.
See Documentation/networking/ipddp.txt for more information about the
kernel driver and userspace tools needed.

--------------------------------------

BUGS:

IRQ autoprobing often doesn't work on a cold boot.  To get around
this, either compile the driver as a module, or pass the parameters
for the card to the kernel as described above.

Also, as usual, autoprobing is not recommended when you use the driver
as a module. (though it usually works at boot time, at least)

Polled mode is *really* slow sometimes, but this seems to depend on
the configuration of the network.

It may theoretically be possible to use two LTPC cards in the same
machine, but this is unsupported, so if you really want to do this,
you'll probably have to hack the initialization code a bit.

______________________________________

THANKS:
	Thanks to Alan Cox for helpful discussions early on in this
work, and to Denis Hainsworth for doing the bleeding-edge testing.

-- Bradford Johnson <bradford@math.umn.edu>

-- Updated 11/09/1998 by David Huggins-Daines <dhd@debian.org>
