#
# Ftape configuration
#
config ZFTAPE
	tristate "Zftape, the VFS interface"
	depends on FTAPE
	---help---
	  Normally, you want to say Y or M. DON'T say N here or you
	  WON'T BE ABLE TO USE YOUR FLOPPY TAPE DRIVE.

	  The ftape module itself no longer contains the routines necessary
	  to interface with the kernel VFS layer (i.e. to actually write data
	  to and read data from the tape drive).  Instead the file system
	  interface (i.e. the hardware independent part of the driver) has
	  been moved to a separate module.

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

	  Regardless of whether you say Y or M here, an additional runtime
	  loadable module called `zft-compressor' which contains code to
	  support user transparent on-the-fly compression based on Ross
	  William's lzrw3 algorithm will be produced.  If you have enabled the
	  kernel module loader (i.e. have said Y to "Kernel module loader
	  support", above) then `zft-compressor' will be loaded
	  automatically by zftape when needed.

	  Despite its name, zftape does NOT use compression by default.  The
	  file <file:Documentation/ftape.txt> contains a short description of
	  the most important changes in the file system interface compared to
	  previous versions of ftape.  The ftape home page
	  <http://www.instmath.rwth-aachen.de/~heine/ftape/> contains
	  further information.

	  IMPORTANT NOTE: zftape can read archives created by previous
	  versions of ftape and provide file mark support (i.e. fast skipping
	  between tape archives) but previous version of ftape will lack file
	  mark support when reading archives produced by zftape.

config ZFT_DFLT_BLK_SZ
	int "Default block size"
	depends on ZFTAPE
	default "10240"
	---help---
	  If unsure leave this at its default value, i.e. 10240. Note that
	  you specify only the default block size here. The block size can be
	  changed at run time using the MTSETBLK tape operation with the
	  MTIOCTOP ioctl (i.e. with "mt -f /dev/qft0 setblk #BLKSZ" from the
	  shell command line).

	  The probably most striking difference between zftape and previous
	  versions of ftape is the fact that all data must be written or read
	  in multiples of a fixed block size. The block size defaults to
	  10240 which is what GNU tar uses. The values for the block size
	  should be either 1 or multiples of 1024 up to a maximum value of
	  63488 (i.e. 62 K). If you specify `1' then zftape's builtin
	  compression will be disabled.

	  Reasonable values are `10240' (GNU tar's default block size),
	  `5120' (afio's default block size), `32768' (default block size some
	  backup programs assume for SCSI tape drives) or `1' (no restriction
	  on block size, but disables builtin compression).

comment "The compressor will be built as a module only!"
	depends on FTAPE && ZFTAPE

config ZFT_COMPRESSOR
	tristate
	depends on FTAPE!=n && ZFTAPE!=n
	default m

config FT_NR_BUFFERS
	int "Number of ftape buffers (EXPERIMENTAL)"
	depends on FTAPE && EXPERIMENTAL
	default "3"
	help
	  Please leave this at `3' unless you REALLY know what you are doing.
	  It is not necessary to change this value. Values below 3 make the
	  proper use of ftape impossible, values greater than 3 are a waste of
	  memory. You can change the amount of DMA memory used by ftape at
	  runtime with "mt -f /dev/qft0 setdrvbuffer #NUMBUFFERS". Each buffer
	  wastes 32 KB of memory. Please note that this memory cannot be
	  swapped out.

config FT_PROC_FS
	bool "Enable procfs status report (+2kb)"
	depends on FTAPE && PROC_FS
	---help---
	  Optional. Saying Y will result in creation of a directory
	  `/proc/ftape' under the /proc file system. The files can be viewed
	  with your favorite pager (i.e. use "more /proc/ftape/history" or
	  "less /proc/ftape/history" or simply "cat /proc/ftape/history"). The
	  file will contain some status information about the inserted
	  cartridge, the kernel driver, your tape drive, the floppy disk
	  controller and the error history for the most recent use of the
	  kernel driver. Saying Y will enlarge the size of the ftape driver
	  by approximately 2 KB.

	  WARNING: When compiling ftape as a module (i.e. saying M to "Floppy
	  tape drive") it is dangerous to use ftape's /proc file system
	  interface. Accessing `/proc/ftape' while the module is unloaded will
	  result in a kernel Oops. This cannot be fixed from inside ftape.

choice
	prompt "Debugging output"
	depends on FTAPE
	default FT_NORMAL_DEBUG

config FT_NORMAL_DEBUG
	bool "Normal"
	---help---
	  This option controls the amount of debugging output the ftape driver
	  is ABLE to produce; it does not increase or diminish the debugging
	  level itself. If unsure, leave this at its default setting,
	  i.e. choose "Normal".

	  Ftape can print lots of debugging messages to the system console
	  resp. kernel log files. Reducing the amount of possible debugging
	  output reduces the size of the kernel module by some KB, so it might
	  be a good idea to use "None" for emergency boot floppies.

	  If you want to save memory then the following strategy is
	  recommended: leave this option at its default setting "Normal" until
	  you know that the driver works as expected, afterwards reconfigure
	  the kernel, this time specifying "Reduced" or "None" and recompile
	  and install the kernel as usual. Note that choosing "Excessive"
	  debugging output does not increase the amount of debugging output
	  printed to the console but only makes it possible to produce
	  "Excessive" debugging output.

	  Please read <file:Documentation/ftape.txt> for a short description
	  how to control the amount of debugging output.

config FT_FULL_DEBUG
	bool "Excessive"
	help
	  Extremely verbose output for driver debugging purposes.

config FT_NO_TRACE
	bool "Reduced"
	help
	  Reduced tape driver debugging output.

config FT_NO_TRACE_AT_ALL
	bool "None"
	help
	  Suppress all debugging output from the tape drive.

endchoice

comment "Hardware configuration"
	depends on FTAPE

choice
	prompt "Floppy tape controllers"
	depends on FTAPE
	default FT_STD_FDC

config FT_STD_FDC
	bool "Standard"
	---help---
	  Only change this setting if you have a special controller. If you
	  didn't plug any add-on card into your computer system but just
	  plugged the floppy tape cable into the already existing floppy drive
	  controller then you don't want to change the default setting,
	  i.e. choose "Standard".

	  Choose "MACH-2" if you have a Mountain Mach-2 controller.
	  Choose "FC-10/FC-20" if you have a Colorado FC-10 or FC-20
	  controller.
	  Choose "Alt/82078" if you have another controller that is located at
	  an IO base address different from the standard floppy drive
	  controller's base address of `0x3f0', or uses an IRQ (interrupt)
	  channel different from `6', or a DMA channel different from
	  `2'. This is necessary for any controller card that is based on
	  Intel's 82078 FDC such as Seagate's, Exabyte's and Iomega's "high
	  speed" controllers.

	  If you choose something other than "Standard" then please make
	  sure that the settings for the IO base address and the IRQ and DMA
	  channel in the configuration menus below are correct. Use the manual
	  of your tape drive to determine the correct settings!

	  If you are already successfully using your tape drive with another
	  operating system then you definitely should use the same settings
	  for the IO base, the IRQ and DMA channel that have proven to work
	  with that other OS.

	  Note that this menu lets you specify only the default setting for
	  the hardware setup. The hardware configuration can be changed at
	  boot time (when ftape is compiled into the kernel, i.e. if you
	  have said Y to "Floppy tape drive") or module load time (i.e. if you
	  have said M to "Floppy tape drive").

	  Please read also the file <file:Documentation/ftape.txt> which
	  contains a short description of the parameters that can be set at
	  boot or load time. If you want to use your floppy tape drive on a
	  PCI-bus based system, please read the file
	  <file:drivers/char/ftape/README.PCI>.

config FT_MACH2
	bool "MACH-2"

config FT_PROBE_FC10
	bool "FC-10/FC-20"

config FT_ALT_FDC
	bool "Alt/82078"

endchoice

comment "Consult the manuals of your tape drive for the correct settings!"
	depends on FTAPE && !FT_STD_FDC

config FT_FDC_BASE
	hex "IO base of the floppy disk controller"
	depends on FTAPE && !FT_STD_FDC
	default "0"
	---help---
	  You don't need to specify a value if the following default
	  settings for the base IO address are correct:
	  <<< MACH-2     : 0x1E0 >>>
	  <<< FC-10/FC-20: 0x180 >>>
	  <<< Secondary  : 0x370 >>>
	  Secondary refers to a secondary FDC controller like the "high speed"
	  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
	  Please make sure that the setting for the IO base address
	  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
	  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
	  successfully using the tape drive with another operating system then
	  you definitely should use the same settings for the IO base that has
	  proven to work with that other OS.

	  Note that this menu lets you specify only the default setting for
	  the IO base. The hardware configuration can be changed at boot time
	  (when ftape is compiled into the kernel, i.e. if you specified Y to
	  "Floppy tape drive") or module load time (i.e. if you have said M to
	  "Floppy tape drive").

	  Please read also the file <file:Documentation/ftape.txt> which
	  contains a short description of the parameters that can be set at
	  boot or load time.

config FT_FDC_IRQ
	int "IRQ channel of the floppy disk controller"
	depends on FTAPE && !FT_STD_FDC
	default "0"
	---help---
	  You don't need to specify a value if the following default
	  settings for the interrupt channel are correct:
	  <<< MACH-2     : 6 >>>
	  <<< FC-10/FC-20: 9 >>>
	  <<< Secondary  : 6 >>>
	  Secondary refers to secondary a FDC controller like the "high speed"
	  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
	  Please make sure that the setting for the IO base address
	  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
	  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
	  successfully using the tape drive with another operating system then
	  you definitely should use the same settings for the IO base that has
	  proven to work with that other OS.

	  Note that this menu lets you specify only the default setting for
	  the IRQ channel. The hardware configuration can be changed at boot
	  time (when ftape is compiled into the kernel, i.e. if you said Y to
	  "Floppy tape drive") or module load time (i.e. if you said M to
	  "Floppy tape drive").

	  Please read also the file <file:Documentation/ftape.txt> which
	  contains a short description of the parameters that can be set at
	  boot or load time.

config FT_FDC_DMA
	int "DMA channel of the floppy disk controller"
	depends on FTAPE && !FT_STD_FDC
	default "0"
	---help---
	  You don't need to specify a value if the following default
	  settings for the DMA channel are correct:
	  <<< MACH-2     : 2 >>>
	  <<< FC-10/FC-20: 3 >>>
	  <<< Secondary  : 2 >>>
	  Secondary refers to a secondary FDC controller like the "high speed"
	  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
	  Please make sure that the setting for the IO base address
	  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
	  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
	  successfully using the tape drive with another operating system then
	  you definitely should use the same settings for the IO base that has
	  proven to work with that other OS.

	  Note that this menu lets you specify only the default setting for
	  the DMA channel. The hardware configuration can be changed at boot
	  time (when ftape is compiled into the kernel, i.e. if you said Y to
	  "Floppy tape drive") or module load time (i.e. if you said M to
	  "Floppy tape drive").

	  Please read also the file <file:Documentation/ftape.txt> which
	  contains a short description of the parameters that can be set at
	  boot or load time.

config FT_FDC_THR
	int "Default FIFO threshold (EXPERIMENTAL)"
	depends on FTAPE && EXPERIMENTAL
	default "8"
	help
	  Set the FIFO threshold of the FDC. If this is higher the DMA
	  controller may serve the FDC after a higher latency time. If this is
	  lower, fewer DMA transfers occur leading to less bus contention.
	  You may try to tune this if ftape annoys you with "reduced data
	  rate because of excessive overrun errors" messages. However, this
	  doesn't seem to have too much effect.

	  If unsure, don't touch the initial value, i.e. leave it at "8".

config FT_FDC_MAX_RATE
	int "Maximal data rate to use (EXPERIMENTAL)"
	depends on FTAPE && EXPERIMENTAL
	default "2000"
	---help---
	  With some motherboard/FDC combinations ftape will not be able to
	  run your FDC/tape drive combination at the highest available
	  speed. If this is the case you'll encounter "reduced data rate
	  because of excessive overrun errors" messages and lots of retries
	  before ftape finally decides to reduce the data rate.

	  In this case it might be desirable to tell ftape beforehand that
	  it need not try to run the tape drive at the highest available
	  speed. If unsure, leave this disabled, i.e. leave it at 2000
	  bits/sec.

config FT_ALPHA_CLOCK
	int "CPU clock frequency of your DEC Alpha" if ALPHA
	depends on FTAPE
	default "0"
	help
	  On some DEC Alpha machines the CPU clock frequency cannot be
	  determined automatically, so you need to specify it here ONLY if
	  running a DEC Alpha, otherwise this setting has no effect.

