bk://bart.bkbits.net/ide-dev-2.6
bzolnier@trik.(none)[bzolnier]|ChangeSet|20050121192556|03008 bzolnier

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2005/01/21 23:17:40-08:00 akpm@bix.(none) 
#   Merge bk://bart.bkbits.net/ide-dev-2.6
#   into bix.(none):/usr/src/bk-ide-dev
# 
# include/linux/ide.h
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/setup-pci.c
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -1
#   Auto merged
# 
# drivers/ide/pci/pdc202xx_old.h
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/pdc202xx_new.h
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide.c
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-taskfile.c
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-probe.c
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-disk.c
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/Kconfig
#   2005/01/21 23:17:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/21 23:15:34-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# drivers/ide/ide.c
#   2005/01/21 23:15:29-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/21 20:25:56+01:00 bzolnier@trik.(none) 
#   [ide] kill ide_driver_t->pre_reset
#   
#   Add ide_drive_t->post_reset flag and use it to signal post reset
#   condition to the ide-tape driver (the only user of ->pre_reset).
# 
# include/linux/ide.h
#   2005/01/21 20:13:35+01:00 bzolnier@trik.(none) +1 -1
#   [ide] kill ide_driver_t->pre_reset
# 
# drivers/ide/ide.c
#   2005/01/21 20:13:35+01:00 bzolnier@trik.(none) +0 -5
#   [ide] kill ide_driver_t->pre_reset
# 
# drivers/ide/ide-tape.c
#   2005/01/21 20:13:35+01:00 bzolnier@trik.(none) +5 -11
#   [ide] kill ide_driver_t->pre_reset
# 
# drivers/ide/ide-iops.c
#   2005/01/21 20:13:35+01:00 bzolnier@trik.(none) +1 -1
#   [ide] kill ide_driver_t->pre_reset
# 
# ChangeSet
#   2005/01/21 20:24:38+01:00 bzolnier@trik.(none) 
#   [ide] fix some rare ide-default vs ide-disk races
#   
#   Some rare races between ide-default and ide-disk are possible, i.e.:
#   * ide-default is used, I/O request is triggered (ie. /proc/ide/hd?/identify),
#     drive->special is cleared silently (so CHS is not initialized properly),
#     ide-disk is loaded and fails if drive uses CHS
#   * ide-disk is used, drive is resetted, ide-disk is unloaded, ide-default
#     takes control over drive and on the first I/O request silently clears
#    drive->special without restoring settings
#   
#   Fix them by moving idedisk_{special,pre_reset}() and company to IDE core.
# 
# include/linux/ide.h
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +0 -1
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +0 -10
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide-taskfile.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +0 -6
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide-probe.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +58 -2
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide-iops.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +19 -1
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide-io.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +66 -2
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/ide-disk.c
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +0 -108
#   [ide] fix some rare ide-default vs ide-disk races
# 
# drivers/ide/Kconfig
#   2005/01/21 20:13:47+01:00 bzolnier@trik.(none) +0 -1
#   [ide] fix some rare ide-default vs ide-disk races
# 
# ChangeSet
#   2005/01/21 20:23:26+01:00 bzolnier@trik.(none) 
#   [ide] generic Power Management for IDE devices
#   
#   Move PM code from ide-cd.c and ide-disk.c to IDE core so:
#   * PM is supported for other ATAPI devices (floppy, tape)
#   * PM is supported even if specific driver is not loaded
# 
# include/linux/ide.h
#   2005/01/21 20:14:00+01:00 bzolnier@trik.(none) +0 -2
#   [ide] generic Power Management for IDE devices
# 
# drivers/ide/ide.c
#   2005/01/21 20:14:00+01:00 bzolnier@trik.(none) +0 -9
#   [ide] generic Power Management for IDE devices
# 
# drivers/ide/ide-io.c
#   2005/01/21 20:14:00+01:00 bzolnier@trik.(none) +89 -2
#   [ide] generic Power Management for IDE devices
# 
# drivers/ide/ide-disk.c
#   2005/01/21 20:14:00+01:00 bzolnier@trik.(none) +0 -86
#   [ide] generic Power Management for IDE devices
# 
# drivers/ide/ide-cd.c
#   2005/01/21 20:14:00+01:00 bzolnier@trik.(none) +0 -41
#   [ide] generic Power Management for IDE devices
# 
# ChangeSet
#   2005/01/21 20:21:54+01:00 bzolnier@trik.(none) 
#   [ide] fix drive->ready_stat for ATAPI
#   
#   ATAPI devices ignore DRDY bit so drive->ready_stat must be set to zero.
#   It is currently done by device drivers (including ide-default fake driver)
#   but for PMAC driver it is too late as wait_for_ready() may be called during
#   probe: probe_hwif()->pmac_ide_dma_check()->pmac_ide_{mdma,udma}_enable()->
#   ->pmac_ide_do_setfeature()->wait_for_ready().
#   
#   Fixup drive->ready_stat just after detecting ATAPI device.
# 
# drivers/scsi/ide-scsi.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +0 -1
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +2 -0
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide-tape.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +0 -2
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide-probe.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +2 -0
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide-floppy.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +0 -1
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide-default.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +0 -7
#   [ide] fix drive->ready_stat for ATAPI
# 
# drivers/ide/ide-cd.c
#   2005/01/21 20:14:18+01:00 bzolnier@trik.(none) +0 -1
#   [ide] fix drive->ready_stat for ATAPI
# 
# ChangeSet
#   2005/01/21 20:20:25+01:00 bzolnier@trik.(none) 
#   [ide] ignore BIOS enable bits for Promise controllers
#   
#   Since there are no Promise binary drivers for 2.6.x kernels:
#   * ignore BIOS enable bits completely
#   * remove CONFIG_PDC202XX_FORCE
#   * kill IDEPCI_FLAG_FORCE_PDC hack
# 
# include/linux/ide.h
#   2005/01/21 20:14:29+01:00 bzolnier@trik.(none) +0 -1
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/setup-pci.c
#   2005/01/21 20:14:29+01:00 bzolnier@trik.(none) +1 -14
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/pci/pdc202xx_old.h
#   2005/01/21 20:14:29+01:00 bzolnier@trik.(none) +0 -17
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/pci/pdc202xx_new.h
#   2005/01/21 20:14:29+01:00 bzolnier@trik.(none) +0 -6
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/Kconfig
#   2005/01/21 20:14:29+01:00 bzolnier@trik.(none) +0 -7
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# ChangeSet
#   2005/01/15 20:51:12-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# include/linux/ide.h
#   2005/01/15 20:51:07-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/atiixp.c
#   2005/01/15 20:51:07-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide.c
#   2005/01/15 20:51:07-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-probe.c
#   2005/01/15 20:51:07-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/arm/icside.c
#   2005/01/15 20:51:07-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/11 12:10:05-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# drivers/ide/ide.c
#   2005/01/11 12:10:00-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/07 14:56:14-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# include/linux/ide.h
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/setup-pci.c
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide.c
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-taskfile.c
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-disk.c
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/arm/icside.c
#   2005/01/07 14:56:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/04 00:19:41-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# drivers/ide/setup-pci.c
#   2005/01/04 00:19:36-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2005/01/02 16:19:51-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# drivers/ide/setup-pci.c
#   2005/01/02 16:19:47-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/12/30 23:23:50-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-ide-dev
# 
# include/linux/ide.h
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/setup-pci.c
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/triflex.c
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/pdc202xx_old.h
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/pdc202xx_new.h
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/pci/atiixp.c
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide.c
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-proc.c
#   2004/12/30 23:23:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/12/21 11:38:04-08:00 akpm@bix.(none) 
#   ss
# 
# drivers/ide/ide-proc.c
#   2004/12/21 11:37:57-08:00 akpm@bix.(none) +3 -3
#   ss
# 
# include/linux/ide.h
#   2004/12/21 11:34:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# include/linux/hdreg.h
#   2004/12/21 11:34:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/setup-pci.c
#   2004/12/21 11:34:44-08:00 akpm@bix.(none) +0 -5
#   Auto merged
# 
# drivers/ide/pci/atiixp.c
#   2004/12/21 11:34:44-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/arm/icside.c
#   2004/12/21 11:34:44-08:00 akpm@bix.(none) +0 -5
#   Auto merged
# 
# drivers/ide/ide.c
#   2004/12/21 11:34:43-08:00 akpm@bix.(none) +0 -9
#   Auto merged
# 
# drivers/ide/ide-taskfile.c
#   2004/12/21 11:34:43-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-probe.c
#   2004/12/21 11:34:43-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/ide/ide-disk.c
#   2004/12/21 11:34:43-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/11/02 14:18:55+01:00 bzolnier@trik.(none) 
#   hch noticed that some "/ SECTOR_SIZE" are missing
#   
#   Cset exclude: bzolnier@trik.(none)|ChangeSet|20041029193506|44339
# 
# include/linux/ide.h
#   2004/11/02 14:18:45+01:00 bzolnier@trik.(none) +0 -0
#   Exclude
# 
# drivers/ide/ide-taskfile.c
#   2004/11/02 14:18:44+01:00 bzolnier@trik.(none) +0 -0
#   Exclude
# 
# drivers/ide/ide-disk.c
#   2004/11/02 14:18:44+01:00 bzolnier@trik.(none) +0 -0
#   Exclude
# 
# ChangeSet
#   2004/10/29 21:24:49+02:00 bzolnier@trik.(none) 
#   [ide] obsolete "enable DMA by default" config options
#   
#   CONFIG_IDEDMA_PCI_AUTO and CONFIG_IDEDMA_ICS_AUTO
#   
#   Host drivers should deal with broken hardware themselves.
#   Warn if DMA support is enabled but "enable DMA by default" is not.
# 
# drivers/ide/setup-pci.c
#   2004/10/29 21:24:27+02:00 bzolnier@trik.(none) +5 -0
#   [ide] obsolete "enable DMA by default" config options
# 
# drivers/ide/arm/icside.c
#   2004/10/29 21:24:27+02:00 bzolnier@trik.(none) +5 -0
#   [ide] obsolete "enable DMA by default" config options
# 
# ChangeSet
#   2004/10/29 21:14:36+02:00 bzolnier@trik.(none) 
#   [ide] obsolete some command line parameters
#   
#   "hdx=autotune", "hdx=noautotune":
#   * should be handled by host drivers needing them
#   
#   "idex=autotune", "idex=noautotune":
#   * should die
#   
#   "idex=ata66":
#   * should be handled by host drivers needing it
#   
#   "idex=dma":
#   * works only for: cs5220.c, generic.c, hpt366.c, triflex.c
#   * DMA should be used by default
#   
#   "idex=reset", "idex=serialize":
#   * host drivers should set these settings when needed
#   
#   "idex=base[,ctl[,irq]]":
#   * host drivers should auto-detect correct settings
#   * ordering should be controlled by user-space
#   
#   "ide0=four":
#   * should be handled by ide-generic driver
# 
# drivers/ide/ide.c
#   2004/10/29 21:14:15+02:00 bzolnier@trik.(none) +12 -9
#   [ide] obsolete some command line parameters
# 
# ChangeSet
#   2004/10/29 20:59:23+02:00 bzolnier@trik.(none) 
#   [ide] ignore BIOS enable bits for Promise controllers
#   
#   There are no Promise binary drivers for 2.6.x kernels so:
#   * ignore BIOS enable bits completely
#   * remove CONFIG_PDC202XX_FORCE
#   * kill IDEPCI_FLAG_FORCE_PDC hack
# 
# include/linux/ide.h
#   2004/10/29 20:15:33+02:00 bzolnier@trik.(none) +0 -1
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/setup-pci.c
#   2004/10/29 20:15:33+02:00 bzolnier@trik.(none) +1 -14
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/pci/pdc202xx_old.h
#   2004/10/29 20:15:33+02:00 bzolnier@trik.(none) +0 -17
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/pci/pdc202xx_new.h
#   2004/10/29 20:15:33+02:00 bzolnier@trik.(none) +0 -6
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# drivers/ide/Kconfig
#   2004/10/29 20:15:33+02:00 bzolnier@trik.(none) +0 -7
#   [ide] ignore BIOS enable bits for Promise controllers
# 
# ChangeSet
#   2004/10/29 20:58:09+02:00 bzolnier@trik.(none) 
#   [ide] obsolete /proc/ide/hd?/settings
#   
#   Majority of these settings is also available through ioctls.
#   We will deal with the rest during deprecation period.
# 
# drivers/ide/ide-proc.c
#   2004/10/29 20:57:48+02:00 bzolnier@trik.(none) +6 -0
#   [ide] obsolete /proc/ide/hd?/settings
# 
# ChangeSet
#   2004/10/29 20:54:32+02:00 bzolnier@trik.(none) 
#   [ide] kill /proc/ide/hd?/settings:number
#   
#   drive->dn is used mainly for programming timings and shouldn't be touched.
# 
# drivers/ide/ide.c
#   2004/10/29 20:54:13+02:00 bzolnier@trik.(none) +0 -1
#   [ide] kill /proc/ide/hd?/settings:number
# 
# ChangeSet
#   2004/10/29 20:52:26+02:00 bzolnier@trik.(none) 
#   [ide] kill /proc/ide/hd?/settings:lun
#   
#   drive->lun is always zero in init_gendisk().
# 
# include/linux/ide.h
#   2004/10/29 20:52:03+02:00 bzolnier@trik.(none) +0 -1
#   [ide] kill /proc/ide/hd?/settings:lun
# 
# drivers/ide/ide-probe.c
#   2004/10/29 20:52:03+02:00 bzolnier@trik.(none) +2 -2
#   [ide] kill /proc/ide/hd?/settings:lun
# 
# drivers/ide/ide-disk.c
#   2004/10/29 20:52:03+02:00 bzolnier@trik.(none) +0 -1
#   [ide] kill /proc/ide/hd?/settings:lun
# 
# ChangeSet
#   2004/10/29 20:47:43+02:00 bzolnier@trik.(none) 
#   [ide] kill /proc/ide/hd?/settings:address & HDIO_[GET,SET]_ADDRESS ioctls
#   
#   ide-disk driver always uses LBA48 when available so
#   messing with drive->addressing should be prohibited.
# 
# include/linux/hdreg.h
#   2004/10/29 20:47:24+02:00 bzolnier@trik.(none) +4 -2
#   [ide] kill /proc/ide/hd?/settings:address & HDIO_[GET,SET]_ADDRESS ioctls
# 
# drivers/ide/ide-disk.c
#   2004/10/29 20:47:24+02:00 bzolnier@trik.(none) +0 -1
#   [ide] kill /proc/ide/hd?/settings:address & HDIO_[GET,SET]_ADDRESS ioctls
# 
# ChangeSet
#   2004/10/29 20:43:49+02:00 bzolnier@trik.(none) 
#   [ide] triflex: simplify triflex_config_drive_for_dma()
# 
# drivers/ide/pci/triflex.c
#   2004/10/29 20:43:28+02:00 bzolnier@trik.(none) +3 -5
#   [ide] triflex: simplify triflex_config_drive_for_dma()
# 
# ChangeSet
#   2004/10/29 20:41:24+02:00 bzolnier@trik.(none) 
#   [ide] atiixp: simplify atiixp_config_drive_for_dma()
# 
# drivers/ide/pci/atiixp.c
#   2004/10/29 20:40:59+02:00 bzolnier@trik.(none) +2 -4
#   [ide] atiixp: simplify atiixp_config_drive_for_dma()
# 
diff -Nru a/drivers/ide/Kconfig b/drivers/ide/Kconfig
--- a/drivers/ide/Kconfig	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/Kconfig	2005-01-23 22:37:29 -08:00
@@ -150,7 +150,6 @@
 
 config IDEDISK_MULTI_MODE
 	bool "Use multi-mode by default"
-	depends on BLK_DEV_IDEDISK
 	help
 	  If you get this error, try to say Y here:
 
@@ -658,13 +657,6 @@
 
 config BLK_DEV_PDC202XX_NEW
 	tristate "PROMISE PDC202{68|69|70|71|75|76|77} support"
-
-# FIXME - probably wants to be one for old and for new
-config PDC202XX_FORCE
-	bool "Enable controller even if disabled by BIOS"
-	depends on BLK_DEV_PDC202XX_NEW
-	help
-	  Enable the PDC202xx controller even if it has been disabled in the BIOS setup.
 
 config BLK_DEV_SVWKS
 	tristate "ServerWorks OSB4/CSB5/CSB6 chipsets support"
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide-cd.c	2005-01-23 22:37:29 -08:00
@@ -3088,7 +3088,6 @@
 		drive->queue->unplug_delay = 1;
 
 	drive->special.all	= 0;
-	drive->ready_stat	= 0;
 
 	CDROM_STATE_FLAGS(drive)->media_changed = 1;
 	CDROM_STATE_FLAGS(drive)->toc_valid     = 0;
@@ -3252,45 +3251,6 @@
 
 static int ide_cdrom_attach (ide_drive_t *drive);
 
-/*
- * Power Management state machine.
- *
- * We don't do much for CDs right now.
- */
-
-static void ide_cdrom_complete_power_step (ide_drive_t *drive, struct request *rq, u8 stat, u8 error)
-{
-}
-
-static ide_startstop_t ide_cdrom_start_power_step (ide_drive_t *drive, struct request *rq)
-{
-	ide_task_t *args = rq->special;
-
-	memset(args, 0, sizeof(*args));
-
-	switch (rq->pm->pm_step) {
-	case ide_pm_state_start_suspend:
-		break;
-
-	case ide_pm_state_start_resume:	/* Resume step 1 (restore DMA) */
-		/*
-		 * Right now, all we do is call hwif->ide_dma_check(drive),
-		 * we could be smarter and check for current xfer_speed
-		 * in struct drive etc...
-		 * Also, this step could be implemented as a generic helper
-		 * as most subdrivers will use it.
-		 */
-		if ((drive->id->capability & 1) == 0)
-			break;
-		if (HWIF(drive)->ide_dma_check == NULL)
-			break;
-		HWIF(drive)->ide_dma_check(drive);
-		break;
-	}
-	rq->pm->pm_step = ide_pm_state_completed;
-	return ide_stopped;
-}
-
 static ide_driver_t ide_cdrom_driver = {
 	.owner			= THIS_MODULE,
 	.name			= "ide-cdrom",
@@ -3303,8 +3263,6 @@
 	.capacity		= ide_cdrom_capacity,
 	.attach			= ide_cdrom_attach,
 	.drives			= LIST_HEAD_INIT(ide_cdrom_driver.drives),
-	.start_power_step	= ide_cdrom_start_power_step,
-	.complete_power_step	= ide_cdrom_complete_power_step,
 };
 
 static int idecd_open(struct inode * inode, struct file * file)
diff -Nru a/drivers/ide/ide-default.c b/drivers/ide/ide-default.c
--- a/drivers/ide/ide-default.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/ide/ide-default.c	2005-01-23 22:37:30 -08:00
@@ -57,13 +57,6 @@
 			"driver with ide.c\n", drive->name);
 		return 1;
 	}
-	
-	/* For the sake of the request layer, we must make sure we have a
-	 * correct ready_stat value, that is 0 for ATAPI devices or we will
-	 * fail any request like Power Management
-	 */
-	if (drive->media != ide_disk)
-		drive->ready_stat = 0;
 
 	return 0;
 }
diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
--- a/drivers/ide/ide-disk.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide-disk.c	2005-01-23 22:37:29 -08:00
@@ -517,75 +517,6 @@
 	return drive->capacity64 - drive->sect0;
 }
 
-#define IS_PDC4030_DRIVE	0
-
-static ide_startstop_t idedisk_special (ide_drive_t *drive)
-{
-	special_t *s = &drive->special;
-
-	if (s->b.set_geometry) {
-		s->b.set_geometry	= 0;
-		if (!IS_PDC4030_DRIVE) {
-			ide_task_t args;
-			memset(&args, 0, sizeof(ide_task_t));
-			args.tfRegister[IDE_NSECTOR_OFFSET] = drive->sect;
-			args.tfRegister[IDE_SECTOR_OFFSET]  = drive->sect;
-			args.tfRegister[IDE_LCYL_OFFSET]    = drive->cyl;
-			args.tfRegister[IDE_HCYL_OFFSET]    = drive->cyl>>8;
-			args.tfRegister[IDE_SELECT_OFFSET]  = ((drive->head-1)|drive->select.all)&0xBF;
-			args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SPECIFY;
-			args.command_type = IDE_DRIVE_TASK_NO_DATA;
-			args.handler	  = &set_geometry_intr;
-			do_rw_taskfile(drive, &args);
-		}
-	} else if (s->b.recalibrate) {
-		s->b.recalibrate = 0;
-		if (!IS_PDC4030_DRIVE) {
-			ide_task_t args;
-			memset(&args, 0, sizeof(ide_task_t));
-			args.tfRegister[IDE_NSECTOR_OFFSET] = drive->sect;
-			args.tfRegister[IDE_COMMAND_OFFSET] = WIN_RESTORE;
-			args.command_type = IDE_DRIVE_TASK_NO_DATA;
-			args.handler	  = &recal_intr;
-			do_rw_taskfile(drive, &args);
-		}
-	} else if (s->b.set_multmode) {
-		s->b.set_multmode = 0;
-		if (drive->mult_req > drive->id->max_multsect)
-			drive->mult_req = drive->id->max_multsect;
-		if (!IS_PDC4030_DRIVE) {
-			ide_task_t args;
-			memset(&args, 0, sizeof(ide_task_t));
-			args.tfRegister[IDE_NSECTOR_OFFSET] = drive->mult_req;
-			args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SETMULT;
-			args.command_type = IDE_DRIVE_TASK_NO_DATA;
-			args.handler	  = &set_multmode_intr;
-			do_rw_taskfile(drive, &args);
-		}
-	} else if (s->all) {
-		int special = s->all;
-		s->all = 0;
-		printk(KERN_ERR "%s: bad special flag: 0x%02x\n", drive->name, special);
-		return ide_stopped;
-	}
-	return IS_PDC4030_DRIVE ? ide_stopped : ide_started;
-}
-
-static void idedisk_pre_reset (ide_drive_t *drive)
-{
-	int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
-
-	drive->special.all = 0;
-	drive->special.b.set_geometry = legacy;
-	drive->special.b.recalibrate  = legacy;
-	if (OK_TO_RESET_CONTROLLER)
-		drive->mult_count = 0;
-	if (!drive->keep_settings && !drive->using_dma)
-		drive->mult_req = 0;
-	if (drive->mult_req != drive->mult_count)
-		drive->special.b.set_multmode = 1;
-}
-
 #ifdef CONFIG_PROC_FS
 
 static int smart_enable(ide_drive_t *drive)
@@ -844,101 +775,15 @@
 	ide_add_setting(drive,	"bios_cyl",		SETTING_RW,					-1,			-1,			TYPE_INT,	0,	65535,				1,	1,	&drive->bios_cyl,		NULL);
 	ide_add_setting(drive,	"bios_head",		SETTING_RW,					-1,			-1,			TYPE_BYTE,	0,	255,				1,	1,	&drive->bios_head,		NULL);
 	ide_add_setting(drive,	"bios_sect",		SETTING_RW,					-1,			-1,			TYPE_BYTE,	0,	63,				1,	1,	&drive->bios_sect,		NULL);
-	ide_add_setting(drive,	"address",		SETTING_RW,					HDIO_GET_ADDRESS,	HDIO_SET_ADDRESS,	TYPE_INTA,	0,	2,				1,	1,	&drive->addressing,	set_lba_addressing);
 	ide_add_setting(drive,	"bswap",		SETTING_READ,					-1,			-1,			TYPE_BYTE,	0,	1,				1,	1,	&drive->bswap,			NULL);
 	ide_add_setting(drive,	"multcount",		id ? SETTING_RW : SETTING_READ,			HDIO_GET_MULTCOUNT,	HDIO_SET_MULTCOUNT,	TYPE_BYTE,	0,	id ? id->max_multsect : 0,	1,	1,	&drive->mult_count,		set_multcount);
 	ide_add_setting(drive,	"nowerr",		SETTING_RW,					HDIO_GET_NOWERR,	HDIO_SET_NOWERR,	TYPE_BYTE,	0,	1,				1,	1,	&drive->nowerr,			set_nowerr);
-	ide_add_setting(drive,	"lun",			SETTING_RW,					-1,			-1,			TYPE_INT,	0,	7,				1,	1,	&drive->lun,			NULL);
 	ide_add_setting(drive,	"wcache",		SETTING_RW,					HDIO_GET_WCACHE,	HDIO_SET_WCACHE,	TYPE_BYTE,	0,	1,				1,	1,	&drive->wcache,			write_cache);
 	ide_add_setting(drive,	"acoustic",		SETTING_RW,					HDIO_GET_ACOUSTIC,	HDIO_SET_ACOUSTIC,	TYPE_BYTE,	0,	254,				1,	1,	&drive->acoustic,		set_acoustic);
  	ide_add_setting(drive,	"failures",		SETTING_RW,					-1,			-1,			TYPE_INT,	0,	65535,				1,	1,	&drive->failures,		NULL);
  	ide_add_setting(drive,	"max_failures",		SETTING_RW,					-1,			-1,			TYPE_INT,	0,	65535,				1,	1,	&drive->max_failures,		NULL);
 }
 
-/*
- * Power Management state machine. This one is rather trivial for now,
- * we should probably add more, like switching back to PIO on suspend
- * to help some BIOSes, re-do the door locking on resume, etc...
- */
-
-enum {
-	idedisk_pm_flush_cache	= ide_pm_state_start_suspend,
-	idedisk_pm_standby,
-
-	idedisk_pm_idle		= ide_pm_state_start_resume,
-	idedisk_pm_restore_dma,
-};
-
-static void idedisk_complete_power_step (ide_drive_t *drive, struct request *rq, u8 stat, u8 error)
-{
-	switch (rq->pm->pm_step) {
-	case idedisk_pm_flush_cache:	/* Suspend step 1 (flush cache) complete */
-		if (rq->pm->pm_state == 4)
-			rq->pm->pm_step = ide_pm_state_completed;
-		else
-			rq->pm->pm_step = idedisk_pm_standby;
-		break;
-	case idedisk_pm_standby:	/* Suspend step 2 (standby) complete */
-		rq->pm->pm_step = ide_pm_state_completed;
-		break;
-	case idedisk_pm_idle:		/* Resume step 1 (idle) complete */
-		rq->pm->pm_step = idedisk_pm_restore_dma;
-		break;
-	}
-}
-
-static ide_startstop_t idedisk_start_power_step (ide_drive_t *drive, struct request *rq)
-{
-	ide_task_t *args = rq->special;
-
-	memset(args, 0, sizeof(*args));
-
-	switch (rq->pm->pm_step) {
-	case idedisk_pm_flush_cache:	/* Suspend step 1 (flush cache) */
-		/* Not supported? Switch to next step now. */
-		if (!drive->wcache || !ide_id_has_flush_cache(drive->id)) {
-			idedisk_complete_power_step(drive, rq, 0, 0);
-			return ide_stopped;
-		}
-		if (ide_id_has_flush_cache_ext(drive->id))
-			args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE_EXT;
-		else
-			args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE;
-		args->command_type = IDE_DRIVE_TASK_NO_DATA;
-		args->handler	   = &task_no_data_intr;
-		return do_rw_taskfile(drive, args);
-
-	case idedisk_pm_standby:	/* Suspend step 2 (standby) */
-		args->tfRegister[IDE_COMMAND_OFFSET] = WIN_STANDBYNOW1;
-		args->command_type = IDE_DRIVE_TASK_NO_DATA;
-		args->handler	   = &task_no_data_intr;
-		return do_rw_taskfile(drive, args);
-
-	case idedisk_pm_idle:		/* Resume step 1 (idle) */
-		args->tfRegister[IDE_COMMAND_OFFSET] = WIN_IDLEIMMEDIATE;
-		args->command_type = IDE_DRIVE_TASK_NO_DATA;
-		args->handler = task_no_data_intr;
-		return do_rw_taskfile(drive, args);
-
-	case idedisk_pm_restore_dma:	/* Resume step 2 (restore DMA) */
-		/*
-		 * Right now, all we do is call hwif->ide_dma_check(drive),
-		 * we could be smarter and check for current xfer_speed
-		 * in struct drive etc...
-		 * Also, this step could be implemented as a generic helper
-		 * as most subdrivers will use it
-		 */
-		if ((drive->id->capability & 1) == 0)
-			break;
-		if (HWIF(drive)->ide_dma_check == NULL)
-			break;
-		HWIF(drive)->ide_dma_check(drive);
-		break;
-	}
-	rq->pm->pm_step = ide_pm_state_completed;
-	return ide_stopped;
-}
-
 static void idedisk_setup (ide_drive_t *drive)
 {
 	struct hd_driveid *id = drive->id;
@@ -977,28 +822,6 @@
 
 	printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name, drive->queue->max_sectors / 2);
 
-	/* Extract geometry if we did not already have one for the drive */
-	if (!drive->cyl || !drive->head || !drive->sect) {
-		drive->cyl     = drive->bios_cyl  = id->cyls;
-		drive->head    = drive->bios_head = id->heads;
-		drive->sect    = drive->bios_sect = id->sectors;
-	}
-
-	/* Handle logical geometry translation by the drive */
-	if ((id->field_valid & 1) && id->cur_cyls &&
-	    id->cur_heads && (id->cur_heads <= 16) && id->cur_sectors) {
-		drive->cyl  = id->cur_cyls;
-		drive->head = id->cur_heads;
-		drive->sect = id->cur_sectors;
-	}
-
-	/* Use physical geometry if what we have still makes no sense */
-	if (drive->head > 16 && id->heads && id->heads <= 16) {
-		drive->cyl  = id->cyls;
-		drive->head = id->heads;
-		drive->sect = id->sectors;
-	}
-
 	/* calculate drive capacity, and select LBA if possible */
 	init_idedisk_capacity (drive);
 
@@ -1062,21 +885,6 @@
 		ide_dma_verbose(drive);
 	printk("\n");
 
-	drive->mult_count = 0;
-	if (id->max_multsect) {
-#ifdef CONFIG_IDEDISK_MULTI_MODE
-		id->multsect = ((id->max_multsect/2) > 1) ? id->max_multsect : 0;
-		id->multsect_valid = id->multsect ? 1 : 0;
-		drive->mult_req = id->multsect_valid ? id->max_multsect : INITIAL_MULT_COUNT;
-		drive->special.b.set_multmode = drive->mult_req ? 1 : 0;
-#else	/* original, pre IDE-NFG, per request of AC */
-		drive->mult_req = INITIAL_MULT_COUNT;
-		if (drive->mult_req > id->max_multsect)
-			drive->mult_req = id->max_multsect;
-		if (drive->mult_req || ((id->multsect_valid & 1) && id->multsect))
-			drive->special.b.set_multmode = 1;
-#endif	/* CONFIG_IDEDISK_MULTI_MODE */
-	}
 	drive->no_io_32bit = id->dword_io ? 1 : 0;
 
 	/* write cache enabled? */
@@ -1175,14 +983,10 @@
 	.supports_dsc_overlap	= 0,
 	.cleanup		= idedisk_cleanup,
 	.do_request		= ide_do_rw_disk,
-	.pre_reset		= idedisk_pre_reset,
 	.capacity		= idedisk_capacity,
-	.special		= idedisk_special,
 	.proc			= idedisk_proc,
 	.attach			= idedisk_attach,
 	.drives			= LIST_HEAD_INIT(idedisk_driver.drives),
-	.start_power_step	= idedisk_start_power_step,
-	.complete_power_step	= idedisk_complete_power_step,
 };
 
 static int idedisk_open(struct inode *inode, struct file *filp)
diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
--- a/drivers/ide/ide-floppy.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/ide/ide-floppy.c	2005-01-23 22:37:30 -08:00
@@ -1793,7 +1793,6 @@
 
 	*((u16 *) &gcw) = drive->id->config;
 	drive->driver_data = floppy;
-	drive->ready_stat = 0;
 	memset(floppy, 0, sizeof(idefloppy_floppy_t));
 	floppy->drive = drive;
 	floppy->pc = floppy->pc_stack;
diff -Nru a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
--- a/drivers/ide/ide-io.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/ide/ide-io.c	2005-01-23 22:37:30 -08:00
@@ -189,6 +189,93 @@
 }
 EXPORT_SYMBOL(ide_end_request);
 
+/*
+ * Power Management state machine. This one is rather trivial for now,
+ * we should probably add more, like switching back to PIO on suspend
+ * to help some BIOSes, re-do the door locking on resume, etc...
+ */
+
+enum {
+	ide_pm_flush_cache	= ide_pm_state_start_suspend,
+	idedisk_pm_standby,
+
+	idedisk_pm_idle		= ide_pm_state_start_resume,
+	ide_pm_restore_dma,
+};
+
+static void ide_complete_power_step(ide_drive_t *drive, struct request *rq, u8 stat, u8 error)
+{
+	if (drive->media != ide_disk)
+		return;
+
+	switch (rq->pm->pm_step) {
+	case ide_pm_flush_cache:	/* Suspend step 1 (flush cache) complete */
+		if (rq->pm->pm_state == 4)
+			rq->pm->pm_step = ide_pm_state_completed;
+		else
+			rq->pm->pm_step = idedisk_pm_standby;
+		break;
+	case idedisk_pm_standby:	/* Suspend step 2 (standby) complete */
+		rq->pm->pm_step = ide_pm_state_completed;
+		break;
+	case idedisk_pm_idle:		/* Resume step 1 (idle) complete */
+		rq->pm->pm_step = ide_pm_restore_dma;
+		break;
+	}
+}
+
+static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)
+{
+	ide_task_t *args = rq->special;
+
+	memset(args, 0, sizeof(*args));
+
+	switch (rq->pm->pm_step) {
+	case ide_pm_flush_cache:	/* Suspend step 1 (flush cache) */
+		if (drive->media != ide_disk)
+			break;
+		/* Not supported? Switch to next step now. */
+		if (!drive->wcache || !ide_id_has_flush_cache(drive->id)) {
+			ide_complete_power_step(drive, rq, 0, 0);
+			return ide_stopped;
+		}
+		if (ide_id_has_flush_cache_ext(drive->id))
+			args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE_EXT;
+		else
+			args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE;
+		args->command_type = IDE_DRIVE_TASK_NO_DATA;
+		args->handler	   = &task_no_data_intr;
+		return do_rw_taskfile(drive, args);
+
+	case idedisk_pm_standby:	/* Suspend step 2 (standby) */
+		args->tfRegister[IDE_COMMAND_OFFSET] = WIN_STANDBYNOW1;
+		args->command_type = IDE_DRIVE_TASK_NO_DATA;
+		args->handler	   = &task_no_data_intr;
+		return do_rw_taskfile(drive, args);
+
+	case idedisk_pm_idle:		/* Resume step 1 (idle) */
+		args->tfRegister[IDE_COMMAND_OFFSET] = WIN_IDLEIMMEDIATE;
+		args->command_type = IDE_DRIVE_TASK_NO_DATA;
+		args->handler = task_no_data_intr;
+		return do_rw_taskfile(drive, args);
+
+	case ide_pm_restore_dma:	/* Resume step 2 (restore DMA) */
+		/*
+		 * Right now, all we do is call hwif->ide_dma_check(drive),
+		 * we could be smarter and check for current xfer_speed
+		 * in struct drive etc...
+		 */
+		if ((drive->id->capability & 1) == 0)
+			break;
+		if (drive->hwif->ide_dma_check == NULL)
+			break;
+		drive->hwif->ide_dma_check(drive);
+		break;
+	}
+	rq->pm->pm_step = ide_pm_state_completed;
+	return ide_stopped;
+}
+
 /**
  *	ide_complete_pm_request - end the current Power Management request
  *	@drive: target drive
@@ -408,7 +495,7 @@
 		printk("%s: complete_power_step(step: %d, stat: %x, err: %x)\n",
 			drive->name, rq->pm->pm_step, stat, err);
 #endif
-		DRIVER(drive)->complete_power_step(drive, rq, stat, err);
+		ide_complete_power_step(drive, rq, stat, err);
 		if (rq->pm->pm_step == ide_pm_state_completed)
 			ide_complete_pm_request(drive, rq);
 		return;
@@ -667,6 +754,65 @@
 	return ide_stopped;
 }
 
+static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task)
+{
+	task->tfRegister[IDE_NSECTOR_OFFSET] = drive->sect;
+	task->tfRegister[IDE_SECTOR_OFFSET]  = drive->sect;
+	task->tfRegister[IDE_LCYL_OFFSET]    = drive->cyl;
+	task->tfRegister[IDE_HCYL_OFFSET]    = drive->cyl>>8;
+	task->tfRegister[IDE_SELECT_OFFSET]  = ((drive->head-1)|drive->select.all)&0xBF;
+	task->tfRegister[IDE_COMMAND_OFFSET] = WIN_SPECIFY;
+
+	task->handler = &set_geometry_intr;
+}
+
+static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task)
+{
+	task->tfRegister[IDE_NSECTOR_OFFSET] = drive->sect;
+	task->tfRegister[IDE_COMMAND_OFFSET] = WIN_RESTORE;
+
+	task->handler = &recal_intr;
+}
+
+static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task)
+{
+	task->tfRegister[IDE_NSECTOR_OFFSET] = drive->mult_req;
+	task->tfRegister[IDE_COMMAND_OFFSET] = WIN_SETMULT;
+
+	task->handler = &set_multmode_intr;
+}
+
+static ide_startstop_t ide_disk_special(ide_drive_t *drive)
+{
+	special_t *s = &drive->special;
+	ide_task_t args;
+
+	memset(&args, 0, sizeof(ide_task_t));
+	args.command_type = IDE_DRIVE_TASK_NO_DATA;
+
+	if (s->b.set_geometry) {
+		s->b.set_geometry = 0;
+		ide_init_specify_cmd(drive, &args);
+	} else if (s->b.recalibrate) {
+		s->b.recalibrate = 0;
+		ide_init_restore_cmd(drive, &args);
+	} else if (s->b.set_multmode) {
+		s->b.set_multmode = 0;
+		if (drive->mult_req > drive->id->max_multsect)
+			drive->mult_req = drive->id->max_multsect;
+		ide_init_setmult_cmd(drive, &args);
+	} else if (s->all) {
+		int special = s->all;
+		s->all = 0;
+		printk(KERN_ERR "%s: bad special flag: 0x%02x\n", drive->name, special);
+		return ide_stopped;
+	}
+
+	do_rw_taskfile(drive, &args);
+
+	return ide_started;
+}
+
 /**
  *	do_special		-	issue some special commands
  *	@drive: drive the command is for
@@ -688,9 +834,14 @@
 		if (HWIF(drive)->tuneproc != NULL)
 			HWIF(drive)->tuneproc(drive, drive->tune_req);
 		return ide_stopped;
+	} else {
+		if (drive->media == ide_disk)
+			return ide_disk_special(drive);
+
+		s->all = 0;
+		drive->mult_req = 0;
+		return ide_stopped;
 	}
-	else
-		return DRIVER(drive)->special(drive);
 }
 
 void ide_map_sg(ide_drive_t *drive, struct request *rq)
@@ -905,7 +1056,7 @@
 			printk("%s: start_power_step(step: %d)\n",
 				drive->name, rq->pm->pm_step);
 #endif
-			startstop = DRIVER(drive)->start_power_step(drive, rq);
+			startstop = ide_start_power_step(drive, rq);
 			if (startstop == ide_stopped &&
 			    rq->pm->pm_step == ide_pm_state_completed)
 				ide_complete_pm_request(drive, rq);
diff -Nru a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
--- a/drivers/ide/ide-iops.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide-iops.c	2005-01-23 22:37:29 -08:00
@@ -1112,9 +1112,27 @@
 #endif
 }
 
+static void ide_disk_pre_reset(ide_drive_t *drive)
+{
+	int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
+
+	drive->special.all = 0;
+	drive->special.b.set_geometry = legacy;
+	drive->special.b.recalibrate  = legacy;
+	if (OK_TO_RESET_CONTROLLER)
+		drive->mult_count = 0;
+	if (!drive->keep_settings && !drive->using_dma)
+		drive->mult_req = 0;
+	if (drive->mult_req != drive->mult_count)
+		drive->special.b.set_multmode = 1;
+}
+
 void pre_reset (ide_drive_t *drive)
 {
-	DRIVER(drive)->pre_reset(drive);
+	if (drive->media == ide_disk)
+		ide_disk_pre_reset(drive);
+	else
+		drive->post_reset = 1;
 
 	if (!drive->keep_settings) {
 		if (drive->using_dma) {
diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
--- a/drivers/ide/ide-probe.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/ide/ide-probe.c	2005-01-23 22:37:30 -08:00
@@ -74,7 +74,55 @@
 	drive->id->cur_heads = drive->head;
 	drive->id->cur_sectors = drive->sect;
 }
-		
+
+static void ide_disk_init_chs(ide_drive_t *drive)
+{
+	struct hd_driveid *id = drive->id;
+
+	/* Extract geometry if we did not already have one for the drive */
+	if (!drive->cyl || !drive->head || !drive->sect) {
+		drive->cyl  = drive->bios_cyl  = id->cyls;
+		drive->head = drive->bios_head = id->heads;
+		drive->sect = drive->bios_sect = id->sectors;
+	}
+
+	/* Handle logical geometry translation by the drive */
+	if ((id->field_valid & 1) && id->cur_cyls &&
+	    id->cur_heads && (id->cur_heads <= 16) && id->cur_sectors) {
+		drive->cyl  = id->cur_cyls;
+		drive->head = id->cur_heads;
+		drive->sect = id->cur_sectors;
+	}
+
+	/* Use physical geometry if what we have still makes no sense */
+	if (drive->head > 16 && id->heads && id->heads <= 16) {
+		drive->cyl  = id->cyls;
+		drive->head = id->heads;
+		drive->sect = id->sectors;
+	}
+}
+
+static void ide_disk_init_mult_count(ide_drive_t *drive)
+{
+	struct hd_driveid *id = drive->id;
+
+	drive->mult_count = 0;
+	if (id->max_multsect) {
+#ifdef CONFIG_IDEDISK_MULTI_MODE
+		id->multsect = ((id->max_multsect/2) > 1) ? id->max_multsect : 0;
+		id->multsect_valid = id->multsect ? 1 : 0;
+		drive->mult_req = id->multsect_valid ? id->max_multsect : INITIAL_MULT_COUNT;
+		drive->special.b.set_multmode = drive->mult_req ? 1 : 0;
+#else	/* original, pre IDE-NFG, per request of AC */
+		drive->mult_req = INITIAL_MULT_COUNT;
+		if (drive->mult_req > id->max_multsect)
+			drive->mult_req = id->max_multsect;
+		if (drive->mult_req || ((id->multsect_valid & 1) && id->multsect))
+			drive->special.b.set_multmode = 1;
+#endif
+	}
+}
+
 /**
  *	drive_is_flashcard	-	check for compact flash
  *	@drive: drive to check
@@ -221,6 +269,8 @@
 		}
 		printk (" drive\n");
 		drive->media = type;
+		/* an ATAPI device ignores DRDY */
+		drive->ready_stat = 0;
 		return;
 	}
 
@@ -588,8 +638,16 @@
 	if(!drive->present)
 		return 0;
 	/* The drive wasn't being helpful. Add generic info only */
-	if(!drive->id_read)
+	if (drive->id_read == 0) {
 		generic_id(drive);
+		return 1;
+	}
+
+	if (drive->media == ide_disk) {
+		ide_disk_init_chs(drive);
+		ide_disk_init_mult_count(drive);
+	}
+
 	return drive->present;
 }
 
@@ -1230,10 +1288,10 @@
 		drive->gendev.release = drive_release_dev;
 		if (drive->present) {
 			device_register(&drive->gendev);
-			sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
+			sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun0",
 				(hwif->channel && hwif->mate) ?
 				hwif->mate->index : hwif->index,
-				hwif->channel, unit, drive->lun);
+				hwif->channel, unit);
 		}
 	}
 	blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
diff -Nru a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
--- a/drivers/ide/ide-proc.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/ide/ide-proc.c	2005-01-23 22:37:30 -08:00
@@ -182,6 +182,9 @@
 	ide_settings_t	*setting;
 	char *buf, *s;
 
+	printk(KERN_WARNING "Warning: /proc/ide/hd?/settings interface is "
+			    "obsolete, and will be removed soon!\n");
+
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
--- a/drivers/ide/ide-tape.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide-tape.c	2005-01-23 22:37:29 -08:00
@@ -2428,6 +2428,11 @@
 	if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2))
 		set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
 
+	if (drive->post_reset == 1) {
+		set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
+		drive->post_reset = 0;
+	}
+
 	if (tape->tape_still_time > 100 && tape->tape_still_time < 200)
 		tape->measure_insert_time = 1;
 	if (time_after(jiffies, tape->insert_time))
@@ -3558,16 +3563,6 @@
 }
 
 /*
- *	idetape_pre_reset is called before an ATAPI/ATA software reset.
- */
-static void idetape_pre_reset (ide_drive_t *drive)
-{
-	idetape_tape_t *tape = drive->driver_data;
-	if (tape != NULL)
-		set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
-}
-
-/*
  *	idetape_space_over_filemarks is now a bit more complicated than just
  *	passing the command to the tape since we may have crossed some
  *	filemarks during our pipelined read-ahead mode.
@@ -4530,8 +4525,6 @@
 	memset(tape, 0, sizeof (idetape_tape_t));
 	spin_lock_init(&tape->spinlock);
 	drive->driver_data = tape;
-	/* An ATAPI device ignores DRDY */
-	drive->ready_stat = 0;
 	drive->dsc_overlap = 1;
 #ifdef CONFIG_BLK_DEV_IDEPCI
 	if (HWIF(drive)->pci_dev != NULL) {
@@ -4692,7 +4685,6 @@
 	.cleanup		= idetape_cleanup,
 	.do_request		= idetape_do_request,
 	.end_request		= idetape_end_request,
-	.pre_reset		= idetape_pre_reset,
 	.proc			= idetape_proc,
 	.attach			= idetape_attach,
 	.drives			= LIST_HEAD_INIT(idetape_driver.drives),
diff -Nru a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
--- a/drivers/ide/ide-taskfile.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide-taskfile.c	2005-01-23 22:37:29 -08:00
@@ -181,8 +181,6 @@
 	return ide_stopped;
 }
 
-EXPORT_SYMBOL(set_multmode_intr);
-
 /*
  * set_geometry_intr() is invoked on completion of a WIN_SPECIFY cmd.
  */
@@ -207,8 +205,6 @@
 	return ide_started;
 }
 
-EXPORT_SYMBOL(set_geometry_intr);
-
 /*
  * recal_intr() is invoked on completion of a WIN_RESTORE (recalibrate) cmd.
  */
@@ -221,8 +217,6 @@
 		return ide_error(drive, "recal_intr", stat);
 	return ide_stopped;
 }
-
-EXPORT_SYMBOL(recal_intr);
 
 /*
  * Handler for commands without a data phase
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
--- a/drivers/ide/ide.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/ide.c	2005-01-23 22:37:29 -08:00
@@ -1296,7 +1296,6 @@
 	ide_add_setting(drive,	"using_dma",		SETTING_RW,					HDIO_GET_DMA,		HDIO_SET_DMA,		TYPE_BYTE,	0,	1,				1,		1,		&drive->using_dma,		set_using_dma);
 	ide_add_setting(drive,	"init_speed",		SETTING_RW,					-1,			-1,			TYPE_BYTE,	0,	70,				1,		1,		&drive->init_speed,		NULL);
 	ide_add_setting(drive,	"current_speed",	SETTING_RW,					-1,			-1,			TYPE_BYTE,	0,	70,				1,		1,		&drive->current_speed,		set_xfer_rate);
-	ide_add_setting(drive,	"number",		SETTING_RW,					-1,			-1,			TYPE_BYTE,	0,	3,				1,		1,		&drive->dn,			NULL);
 }
 
 /**
@@ -1747,6 +1746,8 @@
 			case -4: /* "cdrom" */
 				drive->present = 1;
 				drive->media = ide_cdrom;
+				/* an ATAPI device ignores DRDY */
+				drive->ready_stat = 0;
 				hwif->noprobe = 0;
 				goto done;
 			case -5: /* "serialize" */
@@ -1943,6 +1944,9 @@
 obsolete_option:
 	printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n");
 	return 1;
+obsolete_option:
+	printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n");
+	return 1;
 bad_hwif:
 	printk("-- NOT SUPPORTED ON ide%d", hw);
 done:
@@ -2035,36 +2039,16 @@
 	return __ide_error(drive, rq, stat, err);
 }
 
-static void default_pre_reset (ide_drive_t *drive)
-{
-}
-
 static sector_t default_capacity (ide_drive_t *drive)
 {
 	return 0x7fffffff;
 }
 
-static ide_startstop_t default_special (ide_drive_t *drive)
-{
-	special_t *s = &drive->special;
-
-	s->all = 0;
-	drive->mult_req = 0;
-	return ide_stopped;
-}
-
 static ide_startstop_t default_abort(ide_drive_t *drive, struct request *rq)
 {
 	return __ide_abort(drive, rq);
 }
 
-static ide_startstop_t default_start_power_step(ide_drive_t *drive,
-						struct request *rq)
-{
-	rq->pm->pm_step = ide_pm_state_completed;
-	return ide_stopped;
-}
-
 static void setup_driver_defaults (ide_driver_t *d)
 {
 	BUG_ON(d->attach == NULL || d->cleanup == NULL);
@@ -2073,11 +2057,7 @@
 	if (d->end_request == NULL)	d->end_request = default_end_request;
 	if (d->error == NULL)		d->error = default_error;
 	if (d->abort == NULL)		d->abort = default_abort;
-	if (d->pre_reset == NULL)	d->pre_reset = default_pre_reset;
 	if (d->capacity == NULL)	d->capacity = default_capacity;
-	if (d->special == NULL)		d->special = default_special;
-	if (d->start_power_step == NULL)
-		d->start_power_step = default_start_power_step;
 }
 
 int ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver)
diff -Nru a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c
--- a/drivers/ide/pci/atiixp.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/pci/atiixp.c	2005-01-23 22:37:29 -08:00
@@ -235,10 +235,8 @@
 	u8 speed = ide_dma_speed(drive, atiixp_ratemask(drive));
 
 	/* If no DMA speed was available then disable DMA and use PIO. */
-	if (!speed) {
-		u8 tspeed = ide_get_best_pio_mode(drive, 255, 5, NULL);
-		speed = atiixp_dma_2_pio(XFER_PIO_0 + tspeed) + XFER_PIO_0;
-	}
+	if (!speed)
+		return 0;
 
 	(void) atiixp_speedproc(drive, speed);
 	return ide_dma_enable(drive);
diff -Nru a/drivers/ide/pci/pdc202xx_new.h b/drivers/ide/pci/pdc202xx_new.h
--- a/drivers/ide/pci/pdc202xx_new.h	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/pci/pdc202xx_new.h	2005-01-23 22:37:29 -08:00
@@ -73,9 +73,6 @@
 		.init_hwif	= init_hwif_pdc202new,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 	},{	/* 3 */
 		.name		= "PDC20271",
@@ -100,9 +97,6 @@
 		.init_hwif	= init_hwif_pdc202new,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 	},{	/* 6 */
 		.name		= "PDC20277",
diff -Nru a/drivers/ide/pci/pdc202xx_old.h b/drivers/ide/pci/pdc202xx_old.h
--- a/drivers/ide/pci/pdc202xx_old.h	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/pci/pdc202xx_old.h	2005-01-23 22:37:29 -08:00
@@ -79,9 +79,6 @@
 		.init_dma	= init_dma_pdc202xx,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 		.extra		= 16,
 	},{	/* 1 */
@@ -92,12 +89,8 @@
 		.init_dma	= init_dma_pdc202xx,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 		.extra		= 48,
-		.flags		= IDEPCI_FLAG_FORCE_PDC,
 	},{	/* 2 */
 		.name		= "PDC20263",
 		.init_setup	= init_setup_pdc202ata4,
@@ -106,9 +99,6 @@
 		.init_dma	= init_dma_pdc202xx,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 		.extra		= 48,
 	},{	/* 3 */
@@ -119,12 +109,8 @@
 		.init_dma	= init_dma_pdc202xx,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 		.extra		= 48,
-		.flags		= IDEPCI_FLAG_FORCE_PDC,
 	},{	/* 4 */
 		.name		= "PDC20267",
 		.init_setup	= init_setup_pdc202xx,
@@ -133,9 +119,6 @@
 		.init_dma	= init_dma_pdc202xx,
 		.channels	= 2,
 		.autodma	= AUTODMA,
-#ifndef CONFIG_PDC202XX_FORCE
-		.enablebits	= {{0x50,0x02,0x02}, {0x50,0x04,0x04}},
-#endif
 		.bootable	= OFF_BOARD,
 		.extra		= 48,
 	}
diff -Nru a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c
--- a/drivers/ide/pci/triflex.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/pci/triflex.c	2005-01-23 22:37:29 -08:00
@@ -105,11 +105,9 @@
 {
 	int speed = ide_dma_speed(drive, 0); /* No ultra speeds */
 
-	if (!speed) { 
-		u8 pspeed = ide_get_best_pio_mode(drive, 255, 4, NULL);
-		speed = XFER_PIO_0 + pspeed;
-	}
-	
+	if (!speed)
+		return 0;
+
 	(void) triflex_tune_chipset(drive, speed);
 	 return ide_dma_enable(drive);
 }
diff -Nru a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
--- a/drivers/ide/setup-pci.c	2005-01-23 22:37:29 -08:00
+++ b/drivers/ide/setup-pci.c	2005-01-23 22:37:29 -08:00
@@ -579,7 +579,6 @@
 	int port;
 	int at_least_one_hwif_enabled = 0;
 	ide_hwif_t *hwif, *mate = NULL;
-	static int secondpdc = 0;
 	u8 tmp;
 
 	index->all = 0xf0f0;
@@ -590,22 +589,10 @@
 	 
 	for (port = 0; port <= 1; ++port) {
 		ide_pci_enablebit_t *e = &(d->enablebits[port]);
-	
-		/* 
-		 * If this is a Promise FakeRaid controller,
-		 * the 2nd controller will be marked as 
-		 * disabled while it is actually there and enabled
-		 * by the bios for raid purposes. 
-		 * Skip the normal "is it enabled" test for those.
-		 */
-		if ((d->flags & IDEPCI_FLAG_FORCE_PDC) &&
-		    (secondpdc++==1) && (port==1))
-			goto controller_ok;
-			
+
 		if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) ||
 		    (tmp & e->mask) != e->val))
 			continue;	/* port not enabled */
-controller_ok:
 
 		if (d->channels	<= port)
 			break;
diff -Nru a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
--- a/drivers/scsi/ide-scsi.c	2005-01-23 22:37:30 -08:00
+++ b/drivers/scsi/ide-scsi.c	2005-01-23 22:37:30 -08:00
@@ -679,7 +679,6 @@
 static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
 {
 	DRIVER(drive)->busy++;
-	drive->ready_stat = 0;
 	if (drive->id && (drive->id->config & 0x0060) == 0x20)
 		set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
 	set_bit(IDESCSI_TRANSFORM, &scsi->transform);
diff -Nru a/include/linux/hdreg.h b/include/linux/hdreg.h
--- a/include/linux/hdreg.h	2005-01-23 22:37:29 -08:00
+++ b/include/linux/hdreg.h	2005-01-23 22:37:29 -08:00
@@ -394,7 +394,8 @@
 #define HDIO_GET_IDENTITY	0x030d	/* get IDE identification info */
 #define HDIO_GET_WCACHE		0x030e	/* get write cache mode on|off */
 #define HDIO_GET_ACOUSTIC	0x030f	/* get acoustic value */
-#define	HDIO_GET_ADDRESS	0x0310	/* */
+
+/* 0x310 is reserved - used to be HDIO_GET_ADDRESS */
 
 #define HDIO_GET_BUSSTATE	0x031a	/* get the bus state of the hwif */
 #define HDIO_TRISTATE_HWIF	0x031b	/* execute a channel tristate */
@@ -419,7 +420,8 @@
 #define HDIO_SET_ACOUSTIC	0x032c	/* change acoustic behavior */
 #define HDIO_SET_BUSSTATE	0x032d	/* set the bus state of the hwif */
 #define HDIO_SET_QDMA		0x032e	/* change use-qdma flag */
-#define HDIO_SET_ADDRESS	0x032f	/* change lba addressing modes */
+
+/* 0x32f is reserved - used to be HDIO_SET_ADDRESS */
 
 /* bus states */
 enum {
diff -Nru a/include/linux/ide.h b/include/linux/ide.h
--- a/include/linux/ide.h	2005-01-23 22:37:29 -08:00
+++ b/include/linux/ide.h	2005-01-23 22:37:29 -08:00
@@ -721,6 +721,7 @@
 					 *  3=64-bit
 					 */
 	unsigned scsi		: 1;	/* 0=default, 1=ide-scsi emulation */
+	unsigned post_reset	: 1;
 
         u8	quirk_list;	/* considered quirky, set for a specific host */
         u8	init_speed;	/* transfer rate set at boot */
@@ -754,7 +755,6 @@
 
 	u64		capacity64;	/* total number of sectors */
 
-	int		lun;		/* logical unit */
 	int		crc_count;	/* crc counter to reduce drive speed */
 	struct list_head list;
 	struct device	gendev;
@@ -1099,15 +1099,11 @@
 	ide_startstop_t	(*error)(ide_drive_t *, struct request *rq, u8, u8);
 	ide_startstop_t	(*abort)(ide_drive_t *, struct request *rq);
 	int		(*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
-	void		(*pre_reset)(ide_drive_t *);
 	sector_t	(*capacity)(ide_drive_t *);
-	ide_startstop_t	(*special)(ide_drive_t *);
 	ide_proc_entry_t	*proc;
 	int		(*attach)(ide_drive_t *);
 	void		(*ata_prebuilder)(ide_drive_t *);
 	void		(*atapi_prebuilder)(ide_drive_t *);
-	ide_startstop_t	(*start_power_step)(ide_drive_t *, struct request *);
-	void		(*complete_power_step)(ide_drive_t *, struct request *, u8, u8);
 	struct device_driver	gen_driver;
 	struct list_head drives;
 	struct list_head drivers;
@@ -1405,7 +1401,6 @@
 enum {
 	/* Uses ISA control ports not PCI ones. */
 	IDEPCI_FLAG_ISA_PORTS		= (1 << 0),
-	IDEPCI_FLAG_FORCE_PDC		= (1 << 1),
 };
 
 typedef struct ide_pci_device_s {