#
# 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"

config USB_STORAGE
	tristate "USB Mass Storage support"
	depends on 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_REALTEK
	tristate "Realtek Card Reader support"
	depends on USB_STORAGE
	help
	  Say Y here to include additional code to support the power-saving function
	  for Realtek RTS51xx USB card readers.

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

config REALTEK_AUTOPM
	bool "Realtek Card Reader autosuspend support"
	depends on USB_STORAGE_REALTEK && PM
	default y

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.datafab.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
	tristate "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.

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

config USB_STORAGE_ONETOUCH
	tristate "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)

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

config USB_STORAGE_KARMA
	tristate "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.

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

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_STORAGE_ENE_UB6250
	tristate "USB ENE card reader support"
	depends on SCSI
	depends on USB_STORAGE
	---help---
	  Say Y here if you wish to control a ENE SD/MS Card reader.
	  Note that this driver does not support SM cards.

	  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 ums-eneub6250.

config USB_UAS
	tristate "USB Attached SCSI"
	depends on SCSI && USB_STORAGE
	help
	  The USB Attached SCSI protocol is supported by some USB
	  storage devices.  It permits higher performance by supporting
	  multiple outstanding commands.

	  If you don't know whether you have a UAS device, it is safe to
	  say 'Y' or 'M' here and the kernel will use the right driver.

	  If you compile this driver as a module, it will be named uas.
