#
# USB Storage driver configuration
#

comment "NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may"
comment "also be needed; see USB_STORAGE Help for more info"
	depends on USB

config USB_STORAGE
	tristate "USB Mass Storage support"
	depends on USB && SCSI
	---help---
	  Say Y here if you want to connect USB mass storage devices to your
	  computer's USB port. This is the driver you need for USB
	  floppy drives, USB hard disks, USB tape drives, USB CD-ROMs,
	  USB flash devices, and memory sticks, along with
	  similar devices. This driver may also be used for some cameras
	  and card readers.

	  This option depends on 'SCSI' support being enabled, but you
	  probably also need 'SCSI device support: SCSI disk support'
	  (BLK_DEV_SD) for most USB storage devices.

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

config USB_STORAGE_DEBUG
	bool "USB Mass Storage verbose debug"
	depends on USB_STORAGE
	help
	  Say Y here in order to have the USB Mass Storage code generate
	  verbose debugging messages.

config USB_STORAGE_DATAFAB
	tristate "Datafab Compact Flash Reader support"
	depends on USB_STORAGE
	help
	  Support for certain Datafab CompactFlash readers.
	  Datafab has a web page at <http://www.datafabusa.com/>.

	  If this driver is compiled as a module, it will be named ums-datafab.

config USB_STORAGE_FREECOM
	tristate "Freecom USB/ATAPI Bridge support"
	depends on USB_STORAGE
	help
	  Support for the Freecom USB to IDE/ATAPI adaptor.
	  Freecom has a web page at <http://www.freecom.de/>.

	  If this driver is compiled as a module, it will be named ums-freecom.

config USB_STORAGE_ISD200
	tristate "ISD-200 USB/ATA Bridge support"
	depends on USB_STORAGE
	---help---
	  Say Y here if you want to use USB Mass Store devices based
	  on the In-Systems Design ISD-200 USB/ATA bridge.

	  Some of the products that use this chip are:

	  - Archos Jukebox 6000
	  - ISD SmartCable for Storage
	  - Taiwan Skymaster CD530U/DEL-0241 IDE bridge
	  - Sony CRX10U CD-R/RW drive
	  - CyQ've CQ8060A CDRW drive
	  - Planex eXtreme Drive RX-25HU USB-IDE cable (not model RX-25U)

	  If this driver is compiled as a module, it will be named ums-isd200.

config USB_STORAGE_USBAT
	tristate "USBAT/USBAT02-based storage support"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support storage devices
	  based on the SCM/Shuttle USBAT/USBAT02 processors.

	  Devices reported to work with this driver include:
	  - CompactFlash reader included with Kodak DC3800 camera
	  - Dane-Elec Zmate CompactFlash reader
	  - Delkin Efilm reader2
	  - HP 8200e/8210e/8230e CD-Writer Plus drives
	  - I-JAM JS-50U
	  - Jessops CompactFlash JESDCFRU BLACK
	  - Kingston Technology PCREAD-USB/CF
	  - Maxell UA4 CompactFlash reader
	  - Memorex UCF-100
	  - Microtech ZiO! ICS-45 CF2
	  - RCA LYRA MP3 portable
	  - Sandisk ImageMate SDDR-05b

	  If this driver is compiled as a module, it will be named ums-usbat.

config USB_STORAGE_SDDR09
	tristate "SanDisk SDDR-09 (and other SmartMedia, including DPCM) support"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the Sandisk SDDR-09
	  SmartMedia reader in the USB Mass Storage driver.
	  Also works for the Microtech Zio! CompactFlash/SmartMedia reader.

	  If this driver is compiled as a module, it will be named ums-sddr09.

config USB_STORAGE_SDDR55
	tristate "SanDisk SDDR-55 SmartMedia support"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the Sandisk SDDR-55
	  SmartMedia reader in the USB Mass Storage driver.

	  If this driver is compiled as a module, it will be named ums-sddr55.

config USB_STORAGE_JUMPSHOT
	tristate "Lexar Jumpshot Compact Flash Reader"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the Lexar Jumpshot
	  USB CompactFlash reader.

	  If this driver is compiled as a module, it will be named ums-jumpshot.

config USB_STORAGE_ALAUDA
	bool "Olympus MAUSB-10/Fuji DPC-R1 support"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the Olympus MAUSB-10
	  and Fujifilm DPC-R1 USB Card reader/writer devices.

	  These devices are based on the Alauda chip and support both
	  XD and SmartMedia cards.

config USB_STORAGE_ONETOUCH
	bool "Support OneTouch Button on Maxtor Hard Drives"
	depends on USB_STORAGE
	depends on INPUT=y || INPUT=USB_STORAGE
	help
	  Say Y here to include additional code to support the Maxtor OneTouch
	  USB hard drive's onetouch button.

	  This code registers the button on the front of Maxtor OneTouch USB
	  hard drive's as an input device. An action can be associated with
	  this input in any keybinding software. (e.g. gnome's keyboard short-
	  cuts)

config USB_STORAGE_KARMA
	bool "Support for Rio Karma music player"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the Rio Karma
	  USB interface.

	  This code places the Rio Karma into mass storage mode, enabling
	  it to be mounted as an ordinary filesystem. Performing an eject
	  on the resulting scsi device node returns the Karma to normal
	  operation.

config USB_STORAGE_CYPRESS_ATACB
	tristate "SAT emulation on Cypress USB/ATA Bridge with ATACB"
	depends on USB_STORAGE
	---help---
	  Say Y here if you want to use SAT (ata pass through) on devices based
	  on the Cypress USB/ATA bridge supporting ATACB. This will allow you
	  to use tools to tune and monitor your drive (like hdparm or smartctl).

	  If you say no here your device will still work with the standard usb
	  mass storage class.

	  If this driver is compiled as a module, it will be named ums-cypress.

config USB_LIBUSUAL
	bool "The shared table of common (or usual) storage devices"
	depends on USB
	help
	  This module contains a table of common (or usual) devices
	  for usb-storage and ub drivers, and allows to switch binding
	  of these devices without rebuilding modules.

	  Typical syntax of /etc/modprobe.conf is:

		options libusual bias="ub"

	  If unsure, say N.
