aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-04-26 16:44:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-26 16:44:19 -0400
commita52b0d25a722e84da999005b75f972aa4824253c (patch)
tree4a3a48305f744e6bde2e3fd663a4473dd712049c /drivers
parent539a5fe22620a1665cce504167953a71a43232ad (diff)
parentf37afdaca711838b50ecd89b9c15fc745270d77c (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (46 commits) ide: constify struct ide_dma_ops ide: add struct ide_dma_ops (take 3) ide: add IDE_HFLAG_SERIALIZE_DMA host flag sl82c105: check bridge revision in sl82c105_init_one() au1xxx-ide: use ->init_dma method palm_bk3710: use ->init_dma method sgiioc4: use ->init_dma method icside: use ->init_dma method ide-pmac: use ->init_dma method ide: do complete DMA setup in ->init_dma method (take 2) au1xxx-ide: fix MWDMA support ide: cleanup ide_setup_dma() ide: factor out setting PCI bus-mastering from ide_hwif_setup_dma() ide: export ide_allocate_dma_engine() ide: move ide_setup_dma() call out from ->init_dma method alim15x3: skip DMA initialization completely on revs < 0x20 pdc202xx_old: remove init_dma_pdc202xx() ide: don't display "BIOS" settings in ide_setup_dma() ide: remove ->cds field from ide_hwif_t (take 2) ide: remove ide_dma_iobase() ...
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ide/arm/bast-ide.c3
-rw-r--r--drivers/ide/arm/icside.c56
-rw-r--r--drivers/ide/arm/ide_arm.c18
-rw-r--r--drivers/ide/arm/palm_bk3710.c28
-rw-r--r--drivers/ide/arm/rapide.c1
-rw-r--r--drivers/ide/cris/ide-cris.c33
-rw-r--r--drivers/ide/h8300/ide-h8300.c1
-rw-r--r--drivers/ide/ide-acpi.c12
-rw-r--r--drivers/ide/ide-cd.c585
-rw-r--r--drivers/ide/ide-dma.c140
-rw-r--r--drivers/ide/ide-floppy.c6
-rw-r--r--drivers/ide/ide-generic.c20
-rw-r--r--drivers/ide/ide-io.c13
-rw-r--r--drivers/ide/ide-iops.c38
-rw-r--r--drivers/ide/ide-lib.c26
-rw-r--r--drivers/ide/ide-pnp.c28
-rw-r--r--drivers/ide/ide-probe.c164
-rw-r--r--drivers/ide/ide-proc.c6
-rw-r--r--drivers/ide/ide-scan-pci.c2
-rw-r--r--drivers/ide/ide-tape.c35
-rw-r--r--drivers/ide/ide-taskfile.c19
-rw-r--r--drivers/ide/ide.c86
-rw-r--r--drivers/ide/legacy/ali14xx.c38
-rw-r--r--drivers/ide/legacy/buddha.c2
-rw-r--r--drivers/ide/legacy/dtc2278.c36
-rw-r--r--drivers/ide/legacy/falconide.c1
-rw-r--r--drivers/ide/legacy/gayle.c2
-rw-r--r--drivers/ide/legacy/ht6560b.c46
-rw-r--r--drivers/ide/legacy/ide-4drives.c18
-rw-r--r--drivers/ide/legacy/ide-cs.c76
-rw-r--r--drivers/ide/legacy/ide_platform.c1
-rw-r--r--drivers/ide/legacy/macide.c2
-rw-r--r--drivers/ide/legacy/q40ide.c1
-rw-r--r--drivers/ide/legacy/qd65xx.c130
-rw-r--r--drivers/ide/legacy/umc8672.c37
-rw-r--r--drivers/ide/mips/au1xxx-ide.c115
-rw-r--r--drivers/ide/mips/swarm.c4
-rw-r--r--drivers/ide/pci/aec62xx.c34
-rw-r--r--drivers/ide/pci/alim15x3.c89
-rw-r--r--drivers/ide/pci/amd74xx.c13
-rw-r--r--drivers/ide/pci/atiixp.c24
-rw-r--r--drivers/ide/pci/cmd640.c45
-rw-r--r--drivers/ide/pci/cmd64x.c138
-rw-r--r--drivers/ide/pci/cs5520.c26
-rw-r--r--drivers/ide/pci/cs5530.c15
-rw-r--r--drivers/ide/pci/cs5535.c22
-rw-r--r--drivers/ide/pci/cy82c693.c16
-rw-r--r--drivers/ide/pci/delkin_cb.c7
-rw-r--r--drivers/ide/pci/hpt34x.c15
-rw-r--r--drivers/ide/pci/hpt366.c128
-rw-r--r--drivers/ide/pci/it8213.c22
-rw-r--r--drivers/ide/pci/it821x.c27
-rw-r--r--drivers/ide/pci/jmicron.c25
-rw-r--r--drivers/ide/pci/ns87415.c25
-rw-r--r--drivers/ide/pci/opti621.c16
-rw-r--r--drivers/ide/pci/pdc202xx_new.c23
-rw-r--r--drivers/ide/pci/pdc202xx_old.c126
-rw-r--r--drivers/ide/pci/piix.c13
-rw-r--r--drivers/ide/pci/sc1200.c36
-rw-r--r--drivers/ide/pci/scc_pata.c67
-rw-r--r--drivers/ide/pci/serverworks.c33
-rw-r--r--drivers/ide/pci/sgiioc4.c103
-rw-r--r--drivers/ide/pci/siimage.c114
-rw-r--r--drivers/ide/pci/sis5513.c30
-rw-r--r--drivers/ide/pci/sl82c105.c80
-rw-r--r--drivers/ide/pci/slc90e66.c14
-rw-r--r--drivers/ide/pci/tc86c001.c26
-rw-r--r--drivers/ide/pci/triflex.c11
-rw-r--r--drivers/ide/pci/trm290.c44
-rw-r--r--drivers/ide/pci/via82cxxx.c14
-rw-r--r--drivers/ide/ppc/mpc8xx.c12
-rw-r--r--drivers/ide/ppc/pmac.c86
-rw-r--r--drivers/ide/setup-pci.c101
-rw-r--r--drivers/scsi/ide-scsi.c6
74 files changed, 1715 insertions, 1740 deletions
diff --git a/drivers/ide/arm/bast-ide.c b/drivers/ide/arm/bast-ide.c
index a80b9574865e..d158f579bde2 100644
--- a/drivers/ide/arm/bast-ide.c
+++ b/drivers/ide/arm/bast-ide.c
@@ -55,8 +55,7 @@ static int __init bastide_register(unsigned int base, unsigned int aux, int irq)
55 ide_init_port_data(hwif, i); 55 ide_init_port_data(hwif, i);
56 56
57 ide_init_port_hw(hwif, &hw); 57 ide_init_port_hw(hwif, &hw);
58 hwif->mmio = 1; 58 hwif->port_ops = NULL;
59 hwif->quirkproc = NULL;
60 59
61 idx[0] = i; 60 idx[0] = i;
62 61
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c
index fd12bbe93f11..7d642f44e35b 100644
--- a/drivers/ide/arm/icside.c
+++ b/drivers/ide/arm/icside.c
@@ -191,6 +191,10 @@ static void icside_maskproc(ide_drive_t *drive, int mask)
191 local_irq_restore(flags); 191 local_irq_restore(flags);
192} 192}
193 193
194static const struct ide_port_ops icside_v6_no_dma_port_ops = {
195 .maskproc = icside_maskproc,
196};
197
194#ifdef CONFIG_BLK_DEV_IDEDMA_ICS 198#ifdef CONFIG_BLK_DEV_IDEDMA_ICS
195/* 199/*
196 * SG-DMA support. 200 * SG-DMA support.
@@ -266,6 +270,11 @@ static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode)
266 ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data); 270 ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data);
267} 271}
268 272
273static const struct ide_port_ops icside_v6_port_ops = {
274 .set_dma_mode = icside_set_dma_mode,
275 .maskproc = icside_maskproc,
276};
277
269static void icside_dma_host_set(ide_drive_t *drive, int on) 278static void icside_dma_host_set(ide_drive_t *drive, int on)
270{ 279{
271} 280}
@@ -375,25 +384,33 @@ static void icside_dma_lost_irq(ide_drive_t *drive)
375 printk(KERN_ERR "%s: IRQ lost\n", drive->name); 384 printk(KERN_ERR "%s: IRQ lost\n", drive->name);
376} 385}
377 386
378static void icside_dma_init(ide_hwif_t *hwif) 387static int icside_dma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
379{ 388{
380 hwif->dmatable_cpu = NULL; 389 hwif->dmatable_cpu = NULL;
381 hwif->dmatable_dma = 0; 390 hwif->dmatable_dma = 0;
382 hwif->set_dma_mode = icside_set_dma_mode; 391
383 392 return 0;
384 hwif->dma_host_set = icside_dma_host_set;
385 hwif->dma_setup = icside_dma_setup;
386 hwif->dma_exec_cmd = icside_dma_exec_cmd;
387 hwif->dma_start = icside_dma_start;
388 hwif->ide_dma_end = icside_dma_end;
389 hwif->ide_dma_test_irq = icside_dma_test_irq;
390 hwif->dma_timeout = icside_dma_timeout;
391 hwif->dma_lost_irq = icside_dma_lost_irq;
392} 393}
394
395static const struct ide_dma_ops icside_v6_dma_ops = {
396 .dma_host_set = icside_dma_host_set,
397 .dma_setup = icside_dma_setup,
398 .dma_exec_cmd = icside_dma_exec_cmd,
399 .dma_start = icside_dma_start,
400 .dma_end = icside_dma_end,
401 .dma_test_irq = icside_dma_test_irq,
402 .dma_timeout = icside_dma_timeout,
403 .dma_lost_irq = icside_dma_lost_irq,
404};
393#else 405#else
394#define icside_dma_init(hwif) (0) 406#define icside_v6_dma_ops NULL
395#endif 407#endif
396 408
409static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d)
410{
411 return -EOPNOTSUPP;
412}
413
397static ide_hwif_t * 414static ide_hwif_t *
398icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *ec) 415icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *ec)
399{ 416{
@@ -408,7 +425,6 @@ icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *e
408 * Ensure we're using MMIO 425 * Ensure we're using MMIO
409 */ 426 */
410 default_hwif_mmiops(hwif); 427 default_hwif_mmiops(hwif);
411 hwif->mmio = 1;
412 428
413 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { 429 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
414 hwif->io_ports[i] = port; 430 hwif->io_ports[i] = port;
@@ -416,7 +432,6 @@ icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *e
416 } 432 }
417 hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)base + info->ctrloffset; 433 hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)base + info->ctrloffset;
418 hwif->irq = ec->irq; 434 hwif->irq = ec->irq;
419 hwif->noprobe = 0;
420 hwif->chipset = ide_acorn; 435 hwif->chipset = ide_acorn;
421 hwif->gendev.parent = &ec->dev; 436 hwif->gendev.parent = &ec->dev;
422 hwif->dev = &ec->dev; 437 hwif->dev = &ec->dev;
@@ -462,8 +477,10 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
462} 477}
463 478
464static const struct ide_port_info icside_v6_port_info __initdata = { 479static const struct ide_port_info icside_v6_port_info __initdata = {
480 .init_dma = icside_dma_off_init,
481 .port_ops = &icside_v6_no_dma_port_ops,
482 .dma_ops = &icside_v6_dma_ops,
465 .host_flags = IDE_HFLAG_SERIALIZE | 483 .host_flags = IDE_HFLAG_SERIALIZE |
466 IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
467 IDE_HFLAG_NO_AUTOTUNE, 484 IDE_HFLAG_NO_AUTOTUNE,
468 .mwdma_mask = ATA_MWDMA2, 485 .mwdma_mask = ATA_MWDMA2,
469 .swdma_mask = ATA_SWDMA2, 486 .swdma_mask = ATA_SWDMA2,
@@ -526,7 +543,6 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
526 state->hwif[0] = hwif; 543 state->hwif[0] = hwif;
527 state->hwif[1] = mate; 544 state->hwif[1] = mate;
528 545
529 hwif->maskproc = icside_maskproc;
530 hwif->hwif_data = state; 546 hwif->hwif_data = state;
531 hwif->config_data = (unsigned long)ioc_base; 547 hwif->config_data = (unsigned long)ioc_base;
532 hwif->select_data = sel; 548 hwif->select_data = sel;
@@ -537,10 +553,10 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
537 mate->select_data = sel | 1; 553 mate->select_data = sel | 1;
538 554
539 if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { 555 if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
540 icside_dma_init(hwif); 556 d.init_dma = icside_dma_init;
541 icside_dma_init(mate); 557 d.port_ops = &icside_v6_dma_port_ops;
542 } else 558 d.dma_ops = NULL;
543 d.mwdma_mask = d.swdma_mask = 0; 559 }
544 560
545 idx[0] = hwif->index; 561 idx[0] = hwif->index;
546 idx[1] = mate->index; 562 idx[1] = mate->index;
diff --git a/drivers/ide/arm/ide_arm.c b/drivers/ide/arm/ide_arm.c
index 82643df7c49a..4263ffd4ab20 100644
--- a/drivers/ide/arm/ide_arm.c
+++ b/drivers/ide/arm/ide_arm.c
@@ -14,6 +14,8 @@
14#include <asm/mach-types.h> 14#include <asm/mach-types.h>
15#include <asm/irq.h> 15#include <asm/irq.h>
16 16
17#define DRV_NAME "ide_arm"
18
17#ifdef CONFIG_ARCH_CLPS7500 19#ifdef CONFIG_ARCH_CLPS7500
18# include <asm/arch/hardware.h> 20# include <asm/arch/hardware.h>
19# 21#
@@ -28,10 +30,24 @@ static int __init ide_arm_init(void)
28{ 30{
29 ide_hwif_t *hwif; 31 ide_hwif_t *hwif;
30 hw_regs_t hw; 32 hw_regs_t hw;
33 unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206;
31 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 34 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
32 35
36 if (!request_region(base, 8, DRV_NAME)) {
37 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
38 DRV_NAME, base, base + 7);
39 return -EBUSY;
40 }
41
42 if (!request_region(ctl, 1, DRV_NAME)) {
43 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
44 DRV_NAME, ctl);
45 release_region(base, 8);
46 return -EBUSY;
47 }
48
33 memset(&hw, 0, sizeof(hw)); 49 memset(&hw, 0, sizeof(hw));
34 ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206); 50 ide_std_init_ports(&hw, base, ctl);
35 hw.irq = IDE_ARM_IRQ; 51 hw.irq = IDE_ARM_IRQ;
36 52
37 hwif = ide_find_port(); 53 hwif = ide_find_port();
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c
index 666df779a5f4..8fa34e26443a 100644
--- a/drivers/ide/arm/palm_bk3710.c
+++ b/drivers/ide/arm/palm_bk3710.c
@@ -317,17 +317,31 @@ static u8 __devinit palm_bk3710_cable_detect(ide_hwif_t *hwif)
317 return ATA_CBL_PATA80; 317 return ATA_CBL_PATA80;
318} 318}
319 319
320static void __devinit palm_bk3710_init_hwif(ide_hwif_t *hwif) 320static int __devinit palm_bk3710_init_dma(ide_hwif_t *hwif,
321 const struct ide_port_info *d)
321{ 322{
322 hwif->set_pio_mode = palm_bk3710_set_pio_mode; 323 unsigned long base =
323 hwif->set_dma_mode = palm_bk3710_set_dma_mode; 324 hwif->io_ports[IDE_DATA_OFFSET] - IDE_PALM_ATA_PRI_REG_OFFSET;
324 325
325 hwif->cable_detect = palm_bk3710_cable_detect; 326 printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name);
327
328 if (ide_allocate_dma_engine(hwif))
329 return -1;
330
331 ide_setup_dma(hwif, base);
332
333 return 0;
326} 334}
327 335
336static const struct ide_port_ops palm_bk3710_ports_ops = {
337 .set_pio_mode = palm_bk3710_set_pio_mode,
338 .set_dma_mode = palm_bk3710_set_dma_mode,
339 .cable_detect = palm_bk3710_cable_detect,
340};
341
328static const struct ide_port_info __devinitdata palm_bk3710_port_info = { 342static const struct ide_port_info __devinitdata palm_bk3710_port_info = {
329 .init_hwif = palm_bk3710_init_hwif, 343 .init_dma = palm_bk3710_init_dma,
330 .host_flags = IDE_HFLAG_NO_DMA, /* hack (no PCI) */ 344 .port_ops = &palm_bk3710_ports_ops,
331 .pio_mask = ATA_PIO4, 345 .pio_mask = ATA_PIO4,
332 .udma_mask = ATA_UDMA4, /* (input clk 99MHz) */ 346 .udma_mask = ATA_UDMA4, /* (input clk 99MHz) */
333 .mwdma_mask = ATA_MWDMA2, 347 .mwdma_mask = ATA_MWDMA2,
@@ -394,8 +408,6 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
394 hwif->mmio = 1; 408 hwif->mmio = 1;
395 default_hwif_mmiops(hwif); 409 default_hwif_mmiops(hwif);
396 410
397 ide_setup_dma(hwif, mem->start);
398
399 idx[0] = i; 411 idx[0] = i;
400 412
401 ide_device_add(idx, &palm_bk3710_port_info); 413 ide_device_add(idx, &palm_bk3710_port_info);
diff --git a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c
index 2c3d0ec91dc3..c0581bd98d0d 100644
--- a/drivers/ide/arm/rapide.c
+++ b/drivers/ide/arm/rapide.c
@@ -53,7 +53,6 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
53 53
54 ide_init_port_hw(hwif, &hw); 54 ide_init_port_hw(hwif, &hw);
55 55
56 hwif->mmio = 1;
57 default_hwif_mmiops(hwif); 56 default_hwif_mmiops(hwif);
58 57
59 idx[0] = hwif->index; 58 idx[0] = hwif->index;
diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c
index 790a7759d455..a62ca75c7e28 100644
--- a/drivers/ide/cris/ide-cris.c
+++ b/drivers/ide/cris/ide-cris.c
@@ -673,11 +673,6 @@ cris_ide_inb(unsigned long reg)
673 return (unsigned char)cris_ide_inw(reg); 673 return (unsigned char)cris_ide_inw(reg);
674} 674}
675 675
676static int cris_dma_end (ide_drive_t *drive);
677static int cris_dma_setup (ide_drive_t *drive);
678static void cris_dma_exec_cmd (ide_drive_t *drive, u8 command);
679static int cris_dma_test_irq(ide_drive_t *drive);
680static void cris_dma_start(ide_drive_t *drive);
681static void cris_ide_input_data (ide_drive_t *drive, void *, unsigned int); 676static void cris_ide_input_data (ide_drive_t *drive, void *, unsigned int);
682static void cris_ide_output_data (ide_drive_t *drive, void *, unsigned int); 677static void cris_ide_output_data (ide_drive_t *drive, void *, unsigned int);
683static void cris_atapi_input_bytes(ide_drive_t *drive, void *, unsigned int); 678static void cris_atapi_input_bytes(ide_drive_t *drive, void *, unsigned int);
@@ -782,8 +777,17 @@ static void __init cris_setup_ports(hw_regs_t *hw, unsigned long base)
782 hw->ack_intr = cris_ide_ack_intr; 777 hw->ack_intr = cris_ide_ack_intr;
783} 778}
784 779
780static const struct ide_port_ops cris_port_ops = {
781 .set_pio_mode = cris_set_pio_mode,
782 .set_dma_mode = cris_set_dma_mode,
783};
784
785static const struct ide_dma_ops cris_dma_ops;
786
785static const struct ide_port_info cris_port_info __initdata = { 787static const struct ide_port_info cris_port_info __initdata = {
786 .chipset = ide_etrax100, 788 .chipset = ide_etrax100,
789 .port_ops = &cris_port_ops,
790 .dma_ops = &cris_dma_ops,
787 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 791 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
788 IDE_HFLAG_NO_DMA, /* no SFF-style DMA */ 792 IDE_HFLAG_NO_DMA, /* no SFF-style DMA */
789 .pio_mask = ATA_PIO4, 793 .pio_mask = ATA_PIO4,
@@ -809,19 +813,11 @@ static int __init init_e100_ide(void)
809 continue; 813 continue;
810 ide_init_port_data(hwif, hwif->index); 814 ide_init_port_data(hwif, hwif->index);
811 ide_init_port_hw(hwif, &hw); 815 ide_init_port_hw(hwif, &hw);
812 hwif->mmio = 1; 816
813 hwif->set_pio_mode = &cris_set_pio_mode;
814 hwif->set_dma_mode = &cris_set_dma_mode;
815 hwif->ata_input_data = &cris_ide_input_data; 817 hwif->ata_input_data = &cris_ide_input_data;
816 hwif->ata_output_data = &cris_ide_output_data; 818 hwif->ata_output_data = &cris_ide_output_data;
817 hwif->atapi_input_bytes = &cris_atapi_input_bytes; 819 hwif->atapi_input_bytes = &cris_atapi_input_bytes;
818 hwif->atapi_output_bytes = &cris_atapi_output_bytes; 820 hwif->atapi_output_bytes = &cris_atapi_output_bytes;
819 hwif->dma_host_set = &cris_dma_host_set;
820 hwif->ide_dma_end = &cris_dma_end;
821 hwif->dma_setup = &cris_dma_setup;
822 hwif->dma_exec_cmd = &cris_dma_exec_cmd;
823 hwif->ide_dma_test_irq = &cris_dma_test_irq;
824 hwif->dma_start = &cris_dma_start;
825 hwif->OUTB = &cris_ide_outb; 821 hwif->OUTB = &cris_ide_outb;
826 hwif->OUTW = &cris_ide_outw; 822 hwif->OUTW = &cris_ide_outw;
827 hwif->OUTBSYNC = &cris_ide_outbsync; 823 hwif->OUTBSYNC = &cris_ide_outbsync;
@@ -1076,6 +1072,15 @@ static void cris_dma_start(ide_drive_t *drive)
1076 } 1072 }
1077} 1073}
1078 1074
1075static const struct ide_dma_ops cris_dma_ops = {
1076 .dma_host_set = cris_dma_host_set,
1077 .dma_setup = cris_dma_setup,
1078 .dma_exec_cmd = cris_dma_exec_cmd,
1079 .dma_start = cris_dma_start,
1080 .dma_end = cris_dma_end,
1081 .dma_test_irq = cris_dma_test_irq,
1082};
1083
1079module_init(init_e100_ide); 1084module_init(init_e100_ide);
1080 1085
1081MODULE_LICENSE("GPL"); 1086MODULE_LICENSE("GPL");
diff --git a/drivers/ide/h8300/ide-h8300.c b/drivers/ide/h8300/ide-h8300.c
index 92b02b96d7db..0708b29cdb17 100644
--- a/drivers/ide/h8300/ide-h8300.c
+++ b/drivers/ide/h8300/ide-h8300.c
@@ -74,7 +74,6 @@ static inline void hwif_setup(ide_hwif_t *hwif)
74{ 74{
75 default_hwif_iops(hwif); 75 default_hwif_iops(hwif);
76 76
77 hwif->mmio = 1;
78 hwif->OUTW = mm_outw; 77 hwif->OUTW = mm_outw;
79 hwif->OUTSW = mm_outsw; 78 hwif->OUTSW = mm_outsw;
80 hwif->INW = mm_inw; 79 hwif->INW = mm_inw;
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
index 0f6fb6b72dd9..e4ad26e4fce7 100644
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -55,7 +55,7 @@ struct ide_acpi_hwif_link {
55/* note: adds function name and KERN_DEBUG */ 55/* note: adds function name and KERN_DEBUG */
56#ifdef DEBUGGING 56#ifdef DEBUGGING
57#define DEBPRINT(fmt, args...) \ 57#define DEBPRINT(fmt, args...) \
58 printk(KERN_DEBUG "%s: " fmt, __FUNCTION__, ## args) 58 printk(KERN_DEBUG "%s: " fmt, __func__, ## args)
59#else 59#else
60#define DEBPRINT(fmt, args...) do {} while (0) 60#define DEBPRINT(fmt, args...) do {} while (0)
61#endif /* DEBUGGING */ 61#endif /* DEBUGGING */
@@ -309,7 +309,7 @@ static int do_drive_get_GTF(ide_drive_t *drive,
309 if (ACPI_FAILURE(status)) { 309 if (ACPI_FAILURE(status)) {
310 printk(KERN_DEBUG 310 printk(KERN_DEBUG
311 "%s: Run _GTF error: status = 0x%x\n", 311 "%s: Run _GTF error: status = 0x%x\n",
312 __FUNCTION__, status); 312 __func__, status);
313 goto out; 313 goto out;
314 } 314 }
315 315
@@ -335,7 +335,7 @@ static int do_drive_get_GTF(ide_drive_t *drive,
335 out_obj->buffer.length % REGS_PER_GTF) { 335 out_obj->buffer.length % REGS_PER_GTF) {
336 printk(KERN_ERR 336 printk(KERN_ERR
337 "%s: unexpected GTF length (%d) or addr (0x%p)\n", 337 "%s: unexpected GTF length (%d) or addr (0x%p)\n",
338 __FUNCTION__, out_obj->buffer.length, 338 __func__, out_obj->buffer.length,
339 out_obj->buffer.pointer); 339 out_obj->buffer.pointer);
340 err = -ENOENT; 340 err = -ENOENT;
341 kfree(output.pointer); 341 kfree(output.pointer);
@@ -384,7 +384,7 @@ static int taskfile_load_raw(ide_drive_t *drive,
384 err = ide_no_data_taskfile(drive, &args); 384 err = ide_no_data_taskfile(drive, &args);
385 if (err) 385 if (err)
386 printk(KERN_ERR "%s: ide_no_data_taskfile failed: %u\n", 386 printk(KERN_ERR "%s: ide_no_data_taskfile failed: %u\n",
387 __FUNCTION__, err); 387 __func__, err);
388 388
389 return err; 389 return err;
390} 390}
@@ -422,7 +422,7 @@ static int do_drive_set_taskfiles(ide_drive_t *drive,
422 422
423 if (gtf_length % REGS_PER_GTF) { 423 if (gtf_length % REGS_PER_GTF) {
424 printk(KERN_ERR "%s: unexpected GTF length (%d)\n", 424 printk(KERN_ERR "%s: unexpected GTF length (%d)\n",
425 __FUNCTION__, gtf_length); 425 __func__, gtf_length);
426 goto out; 426 goto out;
427 } 427 }
428 428
@@ -547,7 +547,7 @@ void ide_acpi_get_timing(ide_hwif_t *hwif)
547 printk(KERN_ERR 547 printk(KERN_ERR
548 "%s: unexpected _GTM length (0x%x)[should be 0x%zx] or " 548 "%s: unexpected _GTM length (0x%x)[should be 0x%zx] or "
549 "addr (0x%p)\n", 549 "addr (0x%p)\n",
550 __FUNCTION__, out_obj->buffer.length, 550 __func__, out_obj->buffer.length,
551 sizeof(struct GTM_buffer), out_obj->buffer.pointer); 551 sizeof(struct GTM_buffer), out_obj->buffer.pointer);
552 return; 552 return;
553 } 553 }
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 1afd95ad4653..ad984322da94 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -39,12 +39,13 @@
39#include <linux/mutex.h> 39#include <linux/mutex.h>
40#include <linux/bcd.h> 40#include <linux/bcd.h>
41 41
42#include <scsi/scsi.h> /* For SCSI -> ATAPI command conversion */ 42/* For SCSI -> ATAPI command conversion */
43#include <scsi/scsi.h>
43 44
44#include <asm/irq.h> 45#include <linux/irq.h>
45#include <asm/io.h> 46#include <linux/io.h>
46#include <asm/byteorder.h> 47#include <asm/byteorder.h>
47#include <asm/uaccess.h> 48#include <linux/uaccess.h>
48#include <asm/unaligned.h> 49#include <asm/unaligned.h>
49 50
50#include "ide-cd.h" 51#include "ide-cd.h"
@@ -77,12 +78,11 @@ static void ide_cd_put(struct cdrom_info *cd)
77 mutex_unlock(&idecd_ref_mutex); 78 mutex_unlock(&idecd_ref_mutex);
78} 79}
79 80
80/**************************************************************************** 81/*
81 * Generic packet command support and error handling routines. 82 * Generic packet command support and error handling routines.
82 */ 83 */
83 84
84/* Mark that we've seen a media change, and invalidate our internal 85/* Mark that we've seen a media change and invalidate our internal buffers. */
85 buffers. */
86static void cdrom_saw_media_change(ide_drive_t *drive) 86static void cdrom_saw_media_change(ide_drive_t *drive)
87{ 87{
88 struct cdrom_info *cd = drive->driver_data; 88 struct cdrom_info *cd = drive->driver_data;
@@ -105,9 +105,8 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
105 break; 105 break;
106 case NOT_READY: 106 case NOT_READY:
107 /* 107 /*
108 * don't care about tray state messages for 108 * don't care about tray state messages for e.g. capacity
109 * e.g. capacity commands or in-progress or 109 * commands or in-progress or becoming ready
110 * becoming ready
111 */ 110 */
112 if (sense->asc == 0x3a || sense->asc == 0x04) 111 if (sense->asc == 0x3a || sense->asc == 0x04)
113 break; 112 break;
@@ -115,8 +114,8 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
115 break; 114 break;
116 case ILLEGAL_REQUEST: 115 case ILLEGAL_REQUEST:
117 /* 116 /*
118 * don't log START_STOP unit with LoEj set, since 117 * don't log START_STOP unit with LoEj set, since we cannot
119 * we cannot reliably check if drive can auto-close 118 * reliably check if drive can auto-close
120 */ 119 */
121 if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24) 120 if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24)
122 break; 121 break;
@@ -124,9 +123,9 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
124 break; 123 break;
125 case UNIT_ATTENTION: 124 case UNIT_ATTENTION:
126 /* 125 /*
127 * Make good and sure we've seen this potential media 126 * Make good and sure we've seen this potential media change.
128 * change. Some drives (i.e. Creative) fail to present 127 * Some drives (i.e. Creative) fail to present the correct sense
129 * the correct sense key in the error register. 128 * key in the error register.
130 */ 129 */
131 cdrom_saw_media_change(drive); 130 cdrom_saw_media_change(drive);
132 break; 131 break;
@@ -137,8 +136,7 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
137 return log; 136 return log;
138} 137}
139 138
140static 139static void cdrom_analyze_sense_data(ide_drive_t *drive,
141void cdrom_analyze_sense_data(ide_drive_t *drive,
142 struct request *failed_command, 140 struct request *failed_command,
143 struct request_sense *sense) 141 struct request_sense *sense)
144{ 142{
@@ -151,15 +149,16 @@ void cdrom_analyze_sense_data(ide_drive_t *drive,
151 return; 149 return;
152 150
153 /* 151 /*
154 * If a read toc is executed for a CD-R or CD-RW medium where 152 * If a read toc is executed for a CD-R or CD-RW medium where the first
155 * the first toc has not been recorded yet, it will fail with 153 * toc has not been recorded yet, it will fail with 05/24/00 (which is a
156 * 05/24/00 (which is a confusing error) 154 * confusing error)
157 */ 155 */
158 if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP) 156 if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP)
159 if (sense->sense_key == 0x05 && sense->asc == 0x24) 157 if (sense->sense_key == 0x05 && sense->asc == 0x24)
160 return; 158 return;
161 159
162 if (sense->error_code == 0x70) { /* Current Error */ 160 /* current error */
161 if (sense->error_code == 0x70) {
163 switch (sense->sense_key) { 162 switch (sense->sense_key) {
164 case MEDIUM_ERROR: 163 case MEDIUM_ERROR:
165 case VOLUME_OVERFLOW: 164 case VOLUME_OVERFLOW:
@@ -178,25 +177,23 @@ void cdrom_analyze_sense_data(ide_drive_t *drive,
178 if (bio_sectors < 4) 177 if (bio_sectors < 4)
179 bio_sectors = 4; 178 bio_sectors = 4;
180 if (drive->queue->hardsect_size == 2048) 179 if (drive->queue->hardsect_size == 2048)
181 sector <<= 2; /* Device sector size is 2K */ 180 /* device sector size is 2K */
181 sector <<= 2;
182 sector &= ~(bio_sectors - 1); 182 sector &= ~(bio_sectors - 1);
183 valid = (sector - failed_command->sector) << 9; 183 valid = (sector - failed_command->sector) << 9;
184 184
185 if (valid < 0) 185 if (valid < 0)
186 valid = 0; 186 valid = 0;
187 if (sector < get_capacity(info->disk) && 187 if (sector < get_capacity(info->disk) &&
188 drive->probed_capacity - sector < 4 * 75) { 188 drive->probed_capacity - sector < 4 * 75)
189 set_capacity(info->disk, sector); 189 set_capacity(info->disk, sector);
190 }
191 } 190 }
192 } 191 }
193 192
194 ide_cd_log_error(drive->name, failed_command, sense); 193 ide_cd_log_error(drive->name, failed_command, sense);
195} 194}
196 195
197/* 196/* Initialize a ide-cd packet command request */
198 * Initialize a ide-cd packet command request
199 */
200void ide_cd_init_rq(ide_drive_t *drive, struct request *rq) 197void ide_cd_init_rq(ide_drive_t *drive, struct request *rq)
201{ 198{
202 struct cdrom_info *cd = drive->driver_data; 199 struct cdrom_info *cd = drive->driver_data;
@@ -220,7 +217,8 @@ static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
220 217
221 rq->data = sense; 218 rq->data = sense;
222 rq->cmd[0] = GPCMD_REQUEST_SENSE; 219 rq->cmd[0] = GPCMD_REQUEST_SENSE;
223 rq->cmd[4] = rq->data_len = 18; 220 rq->cmd[4] = 18;
221 rq->data_len = 18;
224 222
225 rq->cmd_type = REQ_TYPE_SENSE; 223 rq->cmd_type = REQ_TYPE_SENSE;
226 224
@@ -252,7 +250,7 @@ static void cdrom_end_request(ide_drive_t *drive, int uptodate)
252 } 250 }
253 cdrom_analyze_sense_data(drive, failed, sense); 251 cdrom_analyze_sense_data(drive, failed, sense);
254 /* 252 /*
255 * now end failed request 253 * now end the failed request
256 */ 254 */
257 if (blk_fs_request(failed)) { 255 if (blk_fs_request(failed)) {
258 if (ide_end_dequeued_request(drive, failed, 0, 256 if (ide_end_dequeued_request(drive, failed, 0,
@@ -280,21 +278,24 @@ static void cdrom_end_request(ide_drive_t *drive, int uptodate)
280 ide_end_request(drive, uptodate, nsectors); 278 ide_end_request(drive, uptodate, nsectors);
281} 279}
282 280
283static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 stat) 281static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 st)
284{ 282{
285 if (stat & 0x80) 283 if (st & 0x80)
286 return; 284 return;
287 ide_dump_status(drive, msg, stat); 285 ide_dump_status(drive, msg, st);
288} 286}
289 287
290/* Returns 0 if the request should be continued. 288/*
291 Returns 1 if the request was ended. */ 289 * Returns:
290 * 0: if the request should be continued.
291 * 1: if the request was ended.
292 */
292static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) 293static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
293{ 294{
294 struct request *rq = HWGROUP(drive)->rq; 295 struct request *rq = HWGROUP(drive)->rq;
295 int stat, err, sense_key; 296 int stat, err, sense_key;
296 297
297 /* Check for errors. */ 298 /* check for errors */
298 stat = ide_read_status(drive); 299 stat = ide_read_status(drive);
299 300
300 if (stat_ret) 301 if (stat_ret)
@@ -303,20 +304,22 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
303 if (OK_STAT(stat, good_stat, BAD_R_STAT)) 304 if (OK_STAT(stat, good_stat, BAD_R_STAT))
304 return 0; 305 return 0;
305 306
306 /* Get the IDE error register. */ 307 /* get the IDE error register */
307 err = ide_read_error(drive); 308 err = ide_read_error(drive);
308 sense_key = err >> 4; 309 sense_key = err >> 4;
309 310
310 if (rq == NULL) { 311 if (rq == NULL) {
311 printk("%s: missing rq in cdrom_decode_status\n", drive->name); 312 printk(KERN_ERR "%s: missing rq in %s\n",
313 drive->name, __func__);
312 return 1; 314 return 1;
313 } 315 }
314 316
315 if (blk_sense_request(rq)) { 317 if (blk_sense_request(rq)) {
316 /* We got an error trying to get sense info 318 /*
317 from the drive (probably while trying 319 * We got an error trying to get sense info from the drive
318 to recover from a former error). Just give up. */ 320 * (probably while trying to recover from a former error).
319 321 * Just give up.
322 */
320 rq->cmd_flags |= REQ_FAILED; 323 rq->cmd_flags |= REQ_FAILED;
321 cdrom_end_request(drive, 0); 324 cdrom_end_request(drive, 0);
322 ide_error(drive, "request sense failure", stat); 325 ide_error(drive, "request sense failure", stat);
@@ -332,13 +335,12 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
332 if (blk_pc_request(rq) && !rq->errors) 335 if (blk_pc_request(rq) && !rq->errors)
333 rq->errors = SAM_STAT_CHECK_CONDITION; 336 rq->errors = SAM_STAT_CHECK_CONDITION;
334 337
335 /* Check for tray open. */ 338 /* check for tray open */
336 if (sense_key == NOT_READY) { 339 if (sense_key == NOT_READY) {
337 cdrom_saw_media_change(drive); 340 cdrom_saw_media_change(drive);
338 } else if (sense_key == UNIT_ATTENTION) { 341 } else if (sense_key == UNIT_ATTENTION) {
339 /* Check for media change. */ 342 /* check for media change */
340 cdrom_saw_media_change(drive); 343 cdrom_saw_media_change(drive);
341 /*printk("%s: media changed\n",drive->name);*/
342 return 0; 344 return 0;
343 } else if (sense_key == ILLEGAL_REQUEST && 345 } else if (sense_key == ILLEGAL_REQUEST &&
344 rq->cmd[0] == GPCMD_START_STOP_UNIT) { 346 rq->cmd[0] == GPCMD_START_STOP_UNIT) {
@@ -350,7 +352,7 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
350 * cdrom_log_sense() knows this! 352 * cdrom_log_sense() knows this!
351 */ 353 */
352 } else if (!(rq->cmd_flags & REQ_QUIET)) { 354 } else if (!(rq->cmd_flags & REQ_QUIET)) {
353 /* Otherwise, print an error. */ 355 /* otherwise, print an error */
354 ide_dump_status(drive, "packet command error", stat); 356 ide_dump_status(drive, "packet command error", stat);
355 } 357 }
356 358
@@ -366,27 +368,30 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
366 } else if (blk_fs_request(rq)) { 368 } else if (blk_fs_request(rq)) {
367 int do_end_request = 0; 369 int do_end_request = 0;
368 370
369 /* Handle errors from READ and WRITE requests. */ 371 /* handle errors from READ and WRITE requests */
370 372
371 if (blk_noretry_request(rq)) 373 if (blk_noretry_request(rq))
372 do_end_request = 1; 374 do_end_request = 1;
373 375
374 if (sense_key == NOT_READY) { 376 if (sense_key == NOT_READY) {
375 /* Tray open. */ 377 /* tray open */
376 if (rq_data_dir(rq) == READ) { 378 if (rq_data_dir(rq) == READ) {
377 cdrom_saw_media_change(drive); 379 cdrom_saw_media_change(drive);
378 380
379 /* Fail the request. */ 381 /* fail the request */
380 printk("%s: tray open\n", drive->name); 382 printk(KERN_ERR "%s: tray open\n", drive->name);
381 do_end_request = 1; 383 do_end_request = 1;
382 } else { 384 } else {
383 struct cdrom_info *info = drive->driver_data; 385 struct cdrom_info *info = drive->driver_data;
384 386
385 /* allow the drive 5 seconds to recover, some 387 /*
388 * Allow the drive 5 seconds to recover, some
386 * devices will return this error while flushing 389 * devices will return this error while flushing
387 * data from cache */ 390 * data from cache.
391 */
388 if (!rq->errors) 392 if (!rq->errors)
389 info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY; 393 info->write_timeout = jiffies +
394 ATAPI_WAIT_WRITE_BUSY;
390 rq->errors = 1; 395 rq->errors = 1;
391 if (time_after(jiffies, info->write_timeout)) 396 if (time_after(jiffies, info->write_timeout))
392 do_end_request = 1; 397 do_end_request = 1;
@@ -394,65 +399,68 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
394 unsigned long flags; 399 unsigned long flags;
395 400
396 /* 401 /*
397 * take a breather relying on the 402 * take a breather relying on the unplug
398 * unplug timer to kick us again 403 * timer to kick us again
399 */ 404 */
400 spin_lock_irqsave(&ide_lock, flags); 405 spin_lock_irqsave(&ide_lock, flags);
401 blk_plug_device(drive->queue); 406 blk_plug_device(drive->queue);
402 spin_unlock_irqrestore(&ide_lock, flags); 407 spin_unlock_irqrestore(&ide_lock,
408 flags);
403 return 1; 409 return 1;
404 } 410 }
405 } 411 }
406 } else if (sense_key == UNIT_ATTENTION) { 412 } else if (sense_key == UNIT_ATTENTION) {
407 /* Media change. */ 413 /* media change */
408 cdrom_saw_media_change (drive); 414 cdrom_saw_media_change(drive);
409 415
410 /* 416 /*
411 * Arrange to retry the request. 417 * Arrange to retry the request but be sure to give up
412 * But be sure to give up if we've retried 418 * if we've retried too many times.
413 * too many times.
414 */ 419 */
415 if (++rq->errors > ERROR_MAX) 420 if (++rq->errors > ERROR_MAX)
416 do_end_request = 1; 421 do_end_request = 1;
417 } else if (sense_key == ILLEGAL_REQUEST || 422 } else if (sense_key == ILLEGAL_REQUEST ||
418 sense_key == DATA_PROTECT) { 423 sense_key == DATA_PROTECT) {
419 /* 424 /*
420 * No point in retrying after an illegal 425 * No point in retrying after an illegal request or data
421 * request or data protect error. 426 * protect error.
422 */ 427 */
423 ide_dump_status_no_sense(drive, "command error", stat); 428 ide_dump_status_no_sense(drive, "command error", stat);
424 do_end_request = 1; 429 do_end_request = 1;
425 } else if (sense_key == MEDIUM_ERROR) { 430 } else if (sense_key == MEDIUM_ERROR) {
426 /* 431 /*
427 * No point in re-trying a zillion times on a bad 432 * No point in re-trying a zillion times on a bad
428 * sector... If we got here the error is not correctable 433 * sector. If we got here the error is not correctable.
429 */ 434 */
430 ide_dump_status_no_sense(drive, "media error (bad sector)", stat); 435 ide_dump_status_no_sense(drive,
436 "media error (bad sector)",
437 stat);
431 do_end_request = 1; 438 do_end_request = 1;
432 } else if (sense_key == BLANK_CHECK) { 439 } else if (sense_key == BLANK_CHECK) {
433 /* Disk appears blank ?? */ 440 /* disk appears blank ?? */
434 ide_dump_status_no_sense(drive, "media error (blank)", stat); 441 ide_dump_status_no_sense(drive, "media error (blank)",
442 stat);
435 do_end_request = 1; 443 do_end_request = 1;
436 } else if ((err & ~ABRT_ERR) != 0) { 444 } else if ((err & ~ABRT_ERR) != 0) {
437 /* Go to the default handler 445 /* go to the default handler for other errors */
438 for other errors. */
439 ide_error(drive, "cdrom_decode_status", stat); 446 ide_error(drive, "cdrom_decode_status", stat);
440 return 1; 447 return 1;
441 } else if ((++rq->errors > ERROR_MAX)) { 448 } else if ((++rq->errors > ERROR_MAX)) {
442 /* We've racked up too many retries. Abort. */ 449 /* we've racked up too many retries, abort */
443 do_end_request = 1; 450 do_end_request = 1;
444 } 451 }
445 452
446 /* End a request through request sense analysis when we have 453 /*
447 sense data. We need this in order to perform end of media 454 * End a request through request sense analysis when we have
448 processing */ 455 * sense data. We need this in order to perform end of media
449 456 * processing.
457 */
450 if (do_end_request) 458 if (do_end_request)
451 goto end_request; 459 goto end_request;
452 460
453 /* 461 /*
454 * If we got a CHECK_CONDITION status, 462 * If we got a CHECK_CONDITION status, queue
455 * queue a request sense command. 463 * a request sense command.
456 */ 464 */
457 if (stat & ERR_STAT) 465 if (stat & ERR_STAT)
458 cdrom_queue_request_sense(drive, NULL, NULL); 466 cdrom_queue_request_sense(drive, NULL, NULL);
@@ -461,7 +469,7 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
461 cdrom_end_request(drive, 0); 469 cdrom_end_request(drive, 0);
462 } 470 }
463 471
464 /* Retry, or handle the next request. */ 472 /* retry, or handle the next request */
465 return 1; 473 return 1;
466 474
467end_request: 475end_request:
@@ -486,10 +494,10 @@ static int cdrom_timer_expiry(ide_drive_t *drive)
486 unsigned long wait = 0; 494 unsigned long wait = 0;
487 495
488 /* 496 /*
489 * Some commands are *slow* and normally take a long time to 497 * Some commands are *slow* and normally take a long time to complete.
490 * complete. Usually we can use the ATAPI "disconnect" to bypass 498 * Usually we can use the ATAPI "disconnect" to bypass this, but not all
491 * this, but not all commands/drives support that. Let 499 * commands/drives support that. Let ide_timer_expiry keep polling us
492 * ide_timer_expiry keep polling us for these. 500 * for these.
493 */ 501 */
494 switch (rq->cmd[0]) { 502 switch (rq->cmd[0]) {
495 case GPCMD_BLANK: 503 case GPCMD_BLANK:
@@ -501,20 +509,22 @@ static int cdrom_timer_expiry(ide_drive_t *drive)
501 break; 509 break;
502 default: 510 default:
503 if (!(rq->cmd_flags & REQ_QUIET)) 511 if (!(rq->cmd_flags & REQ_QUIET))
504 printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", rq->cmd[0]); 512 printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n",
513 rq->cmd[0]);
505 wait = 0; 514 wait = 0;
506 break; 515 break;
507 } 516 }
508 return wait; 517 return wait;
509} 518}
510 519
511/* Set up the device registers for transferring a packet command on DEV, 520/*
512 expecting to later transfer XFERLEN bytes. HANDLER is the routine 521 * Set up the device registers for transferring a packet command on DEV,
513 which actually transfers the command to the drive. If this is a 522 * expecting to later transfer XFERLEN bytes. HANDLER is the routine
514 drq_interrupt device, this routine will arrange for HANDLER to be 523 * which actually transfers the command to the drive. If this is a
515 called when the interrupt from the drive arrives. Otherwise, HANDLER 524 * drq_interrupt device, this routine will arrange for HANDLER to be
516 will be called immediately after the drive is prepared for the transfer. */ 525 * called when the interrupt from the drive arrives. Otherwise, HANDLER
517 526 * will be called immediately after the drive is prepared for the transfer.
527 */
518static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, 528static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
519 int xferlen, 529 int xferlen,
520 ide_handler_t *handler) 530 ide_handler_t *handler)
@@ -523,15 +533,15 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
523 struct cdrom_info *info = drive->driver_data; 533 struct cdrom_info *info = drive->driver_data;
524 ide_hwif_t *hwif = drive->hwif; 534 ide_hwif_t *hwif = drive->hwif;
525 535
526 /* Wait for the controller to be idle. */ 536 /* wait for the controller to be idle */
527 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY)) 537 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
528 return startstop; 538 return startstop;
529 539
530 /* FIXME: for Virtual DMA we must check harder */ 540 /* FIXME: for Virtual DMA we must check harder */
531 if (info->dma) 541 if (info->dma)
532 info->dma = !hwif->dma_setup(drive); 542 info->dma = !hwif->dma_ops->dma_setup(drive);
533 543
534 /* Set up the controller registers. */ 544 /* set up the controller registers */
535 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL | 545 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL |
536 IDE_TFLAG_NO_SELECT_MASK, xferlen, info->dma); 546 IDE_TFLAG_NO_SELECT_MASK, xferlen, info->dma);
537 547
@@ -541,7 +551,8 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
541 drive->waiting_for_dma = 0; 551 drive->waiting_for_dma = 0;
542 552
543 /* packet command */ 553 /* packet command */
544 ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry); 554 ide_execute_command(drive, WIN_PACKETCMD, handler,
555 ATAPI_WAIT_PC, cdrom_timer_expiry);
545 return ide_started; 556 return ide_started;
546 } else { 557 } else {
547 unsigned long flags; 558 unsigned long flags;
@@ -557,11 +568,12 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
557 } 568 }
558} 569}
559 570
560/* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. 571/*
561 The device registers must have already been prepared 572 * Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. The device
562 by cdrom_start_packet_command. 573 * registers must have already been prepared by cdrom_start_packet_command.
563 HANDLER is the interrupt handler to call when the command completes 574 * HANDLER is the interrupt handler to call when the command completes or
564 or there's data ready. */ 575 * there's data ready.
576 */
565#define ATAPI_MIN_CDB_BYTES 12 577#define ATAPI_MIN_CDB_BYTES 12
566static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, 578static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
567 struct request *rq, 579 struct request *rq,
@@ -573,24 +585,26 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
573 ide_startstop_t startstop; 585 ide_startstop_t startstop;
574 586
575 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) { 587 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) {
576 /* Here we should have been called after receiving an interrupt 588 /*
577 from the device. DRQ should how be set. */ 589 * Here we should have been called after receiving an interrupt
590 * from the device. DRQ should how be set.
591 */
578 592
579 /* Check for errors. */ 593 /* check for errors */
580 if (cdrom_decode_status(drive, DRQ_STAT, NULL)) 594 if (cdrom_decode_status(drive, DRQ_STAT, NULL))
581 return ide_stopped; 595 return ide_stopped;
582 596
583 /* Ok, next interrupt will be DMA interrupt. */ 597 /* ok, next interrupt will be DMA interrupt */
584 if (info->dma) 598 if (info->dma)
585 drive->waiting_for_dma = 1; 599 drive->waiting_for_dma = 1;
586 } else { 600 } else {
587 /* Otherwise, we must wait for DRQ to get set. */ 601 /* otherwise, we must wait for DRQ to get set */
588 if (ide_wait_stat(&startstop, drive, DRQ_STAT, 602 if (ide_wait_stat(&startstop, drive, DRQ_STAT,
589 BUSY_STAT, WAIT_READY)) 603 BUSY_STAT, WAIT_READY))
590 return startstop; 604 return startstop;
591 } 605 }
592 606
593 /* Arm the interrupt handler. */ 607 /* arm the interrupt handler */
594 ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry); 608 ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry);
595 609
596 /* ATAPI commands get padded out to 12 bytes minimum */ 610 /* ATAPI commands get padded out to 12 bytes minimum */
@@ -598,20 +612,19 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
598 if (cmd_len < ATAPI_MIN_CDB_BYTES) 612 if (cmd_len < ATAPI_MIN_CDB_BYTES)
599 cmd_len = ATAPI_MIN_CDB_BYTES; 613 cmd_len = ATAPI_MIN_CDB_BYTES;
600 614
601 /* Send the command to the device. */ 615 /* send the command to the device */
602 HWIF(drive)->atapi_output_bytes(drive, rq->cmd, cmd_len); 616 HWIF(drive)->atapi_output_bytes(drive, rq->cmd, cmd_len);
603 617
604 /* Start the DMA if need be */ 618 /* start the DMA if need be */
605 if (info->dma) 619 if (info->dma)
606 hwif->dma_start(drive); 620 hwif->dma_ops->dma_start(drive);
607 621
608 return ide_started; 622 return ide_started;
609} 623}
610 624
611/**************************************************************************** 625/*
612 * Block read functions. 626 * Block read functions.
613 */ 627 */
614
615static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len) 628static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
616{ 629{
617 while (len > 0) { 630 while (len > 0) {
@@ -649,20 +662,21 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
649 ide_hwif_t *hwif = drive->hwif; 662 ide_hwif_t *hwif = drive->hwif;
650 xfer_func_t *xf; 663 xfer_func_t *xf;
651 664
652 /* Whoops... */ 665 /* whoops... */
653 printk(KERN_ERR "%s: %s: wrong transfer direction!\n", 666 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
654 drive->name, __func__); 667 drive->name, __func__);
655 668
656 xf = rw ? hwif->atapi_output_bytes : hwif->atapi_input_bytes; 669 xf = rw ? hwif->atapi_output_bytes : hwif->atapi_input_bytes;
657 ide_cd_pad_transfer(drive, xf, len); 670 ide_cd_pad_transfer(drive, xf, len);
658 } else if (rw == 0 && ireason == 1) { 671 } else if (rw == 0 && ireason == 1) {
659 /* Some drives (ASUS) seem to tell us that status 672 /*
660 * info is available. just get it and ignore. 673 * Some drives (ASUS) seem to tell us that status info is
674 * available. Just get it and ignore.
661 */ 675 */
662 (void)ide_read_status(drive); 676 (void)ide_read_status(drive);
663 return 0; 677 return 0;
664 } else { 678 } else {
665 /* Drive wants a command packet, or invalid ireason... */ 679 /* drive wants a command packet, or invalid ireason... */
666 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n", 680 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
667 drive->name, __func__, ireason); 681 drive->name, __func__, ireason);
668 } 682 }
@@ -702,10 +716,10 @@ static int ide_cd_check_transfer_size(ide_drive_t *drive, int len)
702static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); 716static ide_startstop_t cdrom_newpc_intr(ide_drive_t *);
703 717
704/* 718/*
705 * Routine to send a read/write packet command to the drive. 719 * Routine to send a read/write packet command to the drive. This is usually
706 * This is usually called directly from cdrom_start_{read,write}(). 720 * called directly from cdrom_start_{read,write}(). However, for drq_interrupt
707 * However, for drq_interrupt devices, it is called from an interrupt 721 * devices, it is called from an interrupt when the drive is ready to accept
708 * when the drive is ready to accept the command. 722 * the command.
709 */ 723 */
710static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) 724static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive)
711{ 725{
@@ -727,7 +741,7 @@ static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive)
727 * is larger than the buffer size. 741 * is larger than the buffer size.
728 */ 742 */
729 if (nskip > 0) { 743 if (nskip > 0) {
730 /* Sanity check... */ 744 /* sanity check... */
731 if (rq->current_nr_sectors != 745 if (rq->current_nr_sectors !=
732 bio_cur_sectors(rq->bio)) { 746 bio_cur_sectors(rq->bio)) {
733 printk(KERN_ERR "%s: %s: buffer botch (%u)\n", 747 printk(KERN_ERR "%s: %s: buffer botch (%u)\n",
@@ -744,10 +758,10 @@ static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive)
744 /* the immediate bit */ 758 /* the immediate bit */
745 rq->cmd[1] = 1 << 3; 759 rq->cmd[1] = 1 << 3;
746#endif 760#endif
747 /* Set up the command */ 761 /* set up the command */
748 rq->timeout = ATAPI_WAIT_PC; 762 rq->timeout = ATAPI_WAIT_PC;
749 763
750 /* Send the command to the drive and return. */ 764 /* send the command to the drive and return */
751 return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); 765 return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
752} 766}
753 767
@@ -767,14 +781,8 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive)
767 info->cd_flags |= IDE_CD_FLAG_SEEKING; 781 info->cd_flags |= IDE_CD_FLAG_SEEKING;
768 782
769 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) { 783 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
770 if (--retry == 0) { 784 if (--retry == 0)
771 /*
772 * this condition is far too common, to bother
773 * users about it
774 */
775 /* printk("%s: disabled DSC seek overlap\n", drive->name);*/
776 drive->dsc_overlap = 0; 785 drive->dsc_overlap = 0;
777 }
778 } 786 }
779 return ide_stopped; 787 return ide_stopped;
780} 788}
@@ -800,32 +808,34 @@ static ide_startstop_t cdrom_start_seek(ide_drive_t *drive, unsigned int block)
800 808
801 info->dma = 0; 809 info->dma = 0;
802 info->start_seek = jiffies; 810 info->start_seek = jiffies;
803 return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation); 811 return cdrom_start_packet_command(drive, 0,
812 cdrom_start_seek_continuation);
804} 813}
805 814
806/* 815/*
807 * Fix up a possibly partially-processed request so that we can 816 * Fix up a possibly partially-processed request so that we can start it over
808 * start it over entirely, or even put it back on the request queue. 817 * entirely, or even put it back on the request queue.
809 */ 818 */
810static void restore_request(struct request *rq) 819static void restore_request(struct request *rq)
811{ 820{
812 if (rq->buffer != bio_data(rq->bio)) { 821 if (rq->buffer != bio_data(rq->bio)) {
813 sector_t n = (rq->buffer - (char *) bio_data(rq->bio)) / SECTOR_SIZE; 822 sector_t n =
823 (rq->buffer - (char *)bio_data(rq->bio)) / SECTOR_SIZE;
814 824
815 rq->buffer = bio_data(rq->bio); 825 rq->buffer = bio_data(rq->bio);
816 rq->nr_sectors += n; 826 rq->nr_sectors += n;
817 rq->sector -= n; 827 rq->sector -= n;
818 } 828 }
819 rq->hard_cur_sectors = rq->current_nr_sectors = bio_cur_sectors(rq->bio); 829 rq->current_nr_sectors = bio_cur_sectors(rq->bio);
830 rq->hard_cur_sectors = rq->current_nr_sectors;
820 rq->hard_nr_sectors = rq->nr_sectors; 831 rq->hard_nr_sectors = rq->nr_sectors;
821 rq->hard_sector = rq->sector; 832 rq->hard_sector = rq->sector;
822 rq->q->prep_rq_fn(rq->q, rq); 833 rq->q->prep_rq_fn(rq->q, rq);
823} 834}
824 835
825/**************************************************************************** 836/*
826 * Execute all other packet commands. 837 * All other packet commands.
827 */ 838 */
828
829static void ide_cd_request_sense_fixup(struct request *rq) 839static void ide_cd_request_sense_fixup(struct request *rq)
830{ 840{
831 /* 841 /*
@@ -849,7 +859,7 @@ int ide_cd_queue_pc(ide_drive_t *drive, struct request *rq)
849 if (rq->sense == NULL) 859 if (rq->sense == NULL)
850 rq->sense = &sense; 860 rq->sense = &sense;
851 861
852 /* Start of retry loop. */ 862 /* start of retry loop */
853 do { 863 do {
854 int error; 864 int error;
855 unsigned long time = jiffies; 865 unsigned long time = jiffies;
@@ -858,41 +868,45 @@ int ide_cd_queue_pc(ide_drive_t *drive, struct request *rq)
858 error = ide_do_drive_cmd(drive, rq, ide_wait); 868 error = ide_do_drive_cmd(drive, rq, ide_wait);
859 time = jiffies - time; 869 time = jiffies - time;
860 870
861 /* FIXME: we should probably abort/retry or something 871 /*
862 * in case of failure */ 872 * FIXME: we should probably abort/retry or something in case of
873 * failure.
874 */
863 if (rq->cmd_flags & REQ_FAILED) { 875 if (rq->cmd_flags & REQ_FAILED) {
864 /* The request failed. Retry if it was due to a unit 876 /*
865 attention status 877 * The request failed. Retry if it was due to a unit
866 (usually means media was changed). */ 878 * attention status (usually means media was changed).
879 */
867 struct request_sense *reqbuf = rq->sense; 880 struct request_sense *reqbuf = rq->sense;
868 881
869 if (reqbuf->sense_key == UNIT_ATTENTION) 882 if (reqbuf->sense_key == UNIT_ATTENTION)
870 cdrom_saw_media_change(drive); 883 cdrom_saw_media_change(drive);
871 else if (reqbuf->sense_key == NOT_READY && 884 else if (reqbuf->sense_key == NOT_READY &&
872 reqbuf->asc == 4 && reqbuf->ascq != 4) { 885 reqbuf->asc == 4 && reqbuf->ascq != 4) {
873 /* The drive is in the process of loading 886 /*
874 a disk. Retry, but wait a little to give 887 * The drive is in the process of loading
875 the drive time to complete the load. */ 888 * a disk. Retry, but wait a little to give
889 * the drive time to complete the load.
890 */
876 ssleep(2); 891 ssleep(2);
877 } else { 892 } else {
878 /* Otherwise, don't retry. */ 893 /* otherwise, don't retry */
879 retries = 0; 894 retries = 0;
880 } 895 }
881 --retries; 896 --retries;
882 } 897 }
883 898
884 /* End of retry loop. */ 899 /* end of retry loop */
885 } while ((rq->cmd_flags & REQ_FAILED) && retries >= 0); 900 } while ((rq->cmd_flags & REQ_FAILED) && retries >= 0);
886 901
887 /* Return an error if the command failed. */ 902 /* return an error if the command failed */
888 return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0; 903 return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0;
889} 904}
890 905
891/* 906/*
892 * Called from blk_end_request_callback() after the data of the request 907 * Called from blk_end_request_callback() after the data of the request is
893 * is completed and before the request is completed. 908 * completed and before the request itself is completed. By returning value '1',
894 * By returning value '1', blk_end_request_callback() returns immediately 909 * blk_end_request_callback() returns immediately without completing it.
895 * without completing the request.
896 */ 910 */
897static int cdrom_newpc_intr_dummy_cb(struct request *rq) 911static int cdrom_newpc_intr_dummy_cb(struct request *rq)
898{ 912{
@@ -911,11 +925,11 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
911 unsigned int timeout; 925 unsigned int timeout;
912 u8 lowcyl, highcyl; 926 u8 lowcyl, highcyl;
913 927
914 /* Check for errors. */ 928 /* check for errors */
915 dma = info->dma; 929 dma = info->dma;
916 if (dma) { 930 if (dma) {
917 info->dma = 0; 931 info->dma = 0;
918 dma_error = HWIF(drive)->ide_dma_end(drive); 932 dma_error = hwif->dma_ops->dma_end(drive);
919 if (dma_error) { 933 if (dma_error) {
920 printk(KERN_ERR "%s: DMA %s error\n", drive->name, 934 printk(KERN_ERR "%s: DMA %s error\n", drive->name,
921 write ? "write" : "read"); 935 write ? "write" : "read");
@@ -926,9 +940,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
926 if (cdrom_decode_status(drive, 0, &stat)) 940 if (cdrom_decode_status(drive, 0, &stat))
927 return ide_stopped; 941 return ide_stopped;
928 942
929 /* 943 /* using dma, transfer is complete now */
930 * using dma, transfer is complete now
931 */
932 if (dma) { 944 if (dma) {
933 if (dma_error) 945 if (dma_error)
934 return ide_error(drive, "dma error", stat); 946 return ide_error(drive, "dma error", stat);
@@ -939,9 +951,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
939 goto end_request; 951 goto end_request;
940 } 952 }
941 953
942 /* 954 /* ok we fall to pio :/ */
943 * ok we fall to pio :/
944 */
945 ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]) & 0x3; 955 ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]) & 0x3;
946 lowcyl = hwif->INB(hwif->io_ports[IDE_BCOUNTL_OFFSET]); 956 lowcyl = hwif->INB(hwif->io_ports[IDE_BCOUNTL_OFFSET]);
947 highcyl = hwif->INB(hwif->io_ports[IDE_BCOUNTH_OFFSET]); 957 highcyl = hwif->INB(hwif->io_ports[IDE_BCOUNTH_OFFSET]);
@@ -952,9 +962,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
952 if (thislen > len) 962 if (thislen > len)
953 thislen = len; 963 thislen = len;
954 964
955 /* 965 /* If DRQ is clear, the command has completed. */
956 * If DRQ is clear, the command has completed.
957 */
958 if ((stat & DRQ_STAT) == 0) { 966 if ((stat & DRQ_STAT) == 0) {
959 if (blk_fs_request(rq)) { 967 if (blk_fs_request(rq)) {
960 /* 968 /*
@@ -975,15 +983,13 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
975 return ide_stopped; 983 return ide_stopped;
976 } else if (!blk_pc_request(rq)) { 984 } else if (!blk_pc_request(rq)) {
977 ide_cd_request_sense_fixup(rq); 985 ide_cd_request_sense_fixup(rq);
978 /* Complain if we still have data left to transfer. */ 986 /* complain if we still have data left to transfer */
979 uptodate = rq->data_len ? 0 : 1; 987 uptodate = rq->data_len ? 0 : 1;
980 } 988 }
981 goto end_request; 989 goto end_request;
982 } 990 }
983 991
984 /* 992 /* check which way to transfer data */
985 * check which way to transfer data
986 */
987 if (ide_cd_check_ireason(drive, rq, len, ireason, write)) 993 if (ide_cd_check_ireason(drive, rq, len, ireason, write))
988 return ide_stopped; 994 return ide_stopped;
989 995
@@ -1019,16 +1025,12 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1019 xferfunc = HWIF(drive)->atapi_input_bytes; 1025 xferfunc = HWIF(drive)->atapi_input_bytes;
1020 } 1026 }
1021 1027
1022 /* 1028 /* transfer data */
1023 * transfer data
1024 */
1025 while (thislen > 0) { 1029 while (thislen > 0) {
1026 u8 *ptr = blk_fs_request(rq) ? NULL : rq->data; 1030 u8 *ptr = blk_fs_request(rq) ? NULL : rq->data;
1027 int blen = rq->data_len; 1031 int blen = rq->data_len;
1028 1032
1029 /* 1033 /* bio backed? */
1030 * bio backed?
1031 */
1032 if (rq->bio) { 1034 if (rq->bio) {
1033 if (blk_fs_request(rq)) { 1035 if (blk_fs_request(rq)) {
1034 ptr = rq->buffer; 1036 ptr = rq->buffer;
@@ -1043,7 +1045,8 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1043 if (blk_fs_request(rq) && !write) 1045 if (blk_fs_request(rq) && !write)
1044 /* 1046 /*
1045 * If the buffers are full, pipe the rest into 1047 * If the buffers are full, pipe the rest into
1046 * oblivion. */ 1048 * oblivion.
1049 */
1047 ide_cd_drain_data(drive, thislen >> 9); 1050 ide_cd_drain_data(drive, thislen >> 9);
1048 else { 1051 else {
1049 printk(KERN_ERR "%s: confused, missing data\n", 1052 printk(KERN_ERR "%s: confused, missing data\n",
@@ -1090,9 +1093,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1090 rq->sense_len += blen; 1093 rq->sense_len += blen;
1091 } 1094 }
1092 1095
1093 /* 1096 /* pad, if necessary */
1094 * pad, if necessary
1095 */
1096 if (!blk_fs_request(rq) && len > 0) 1097 if (!blk_fs_request(rq) && len > 0)
1097 ide_cd_pad_transfer(drive, xferfunc, len); 1098 ide_cd_pad_transfer(drive, xferfunc, len);
1098 1099
@@ -1136,9 +1137,7 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)
1136 queue_hardsect_size(drive->queue) >> SECTOR_BITS; 1137 queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1137 1138
1138 if (write) { 1139 if (write) {
1139 /* 1140 /* disk has become write protected */
1140 * disk has become write protected
1141 */
1142 if (cd->disk->policy) { 1141 if (cd->disk->policy) {
1143 cdrom_end_request(drive, 0); 1142 cdrom_end_request(drive, 0);
1144 return ide_stopped; 1143 return ide_stopped;
@@ -1151,9 +1150,7 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)
1151 restore_request(rq); 1150 restore_request(rq);
1152 } 1151 }
1153 1152
1154 /* 1153 /* use DMA, if possible / writes *must* be hardware frame aligned */
1155 * use DMA, if possible / writes *must* be hardware frame aligned
1156 */
1157 if ((rq->nr_sectors & (sectors_per_frame - 1)) || 1154 if ((rq->nr_sectors & (sectors_per_frame - 1)) ||
1158 (rq->sector & (sectors_per_frame - 1))) { 1155 (rq->sector & (sectors_per_frame - 1))) {
1159 if (write) { 1156 if (write) {
@@ -1167,7 +1164,7 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)
1167 if (write) 1164 if (write)
1168 cd->devinfo.media_written = 1; 1165 cd->devinfo.media_written = 1;
1169 1166
1170 /* Start sending the read/write request to the drive. */ 1167 /* start sending the read/write request to the drive */
1171 return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont); 1168 return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont);
1172} 1169}
1173 1170
@@ -1192,12 +1189,11 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1192 1189
1193 info->dma = 0; 1190 info->dma = 0;
1194 1191
1195 /* 1192 /* sg request */
1196 * sg request
1197 */
1198 if (rq->bio) { 1193 if (rq->bio) {
1199 int mask = drive->queue->dma_alignment; 1194 int mask = drive->queue->dma_alignment;
1200 unsigned long addr = (unsigned long) page_address(bio_page(rq->bio)); 1195 unsigned long addr =
1196 (unsigned long)page_address(bio_page(rq->bio));
1201 1197
1202 info->dma = drive->using_dma; 1198 info->dma = drive->using_dma;
1203 1199
@@ -1211,15 +1207,16 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1211 info->dma = 0; 1207 info->dma = 0;
1212 } 1208 }
1213 1209
1214 /* Start sending the command to the drive. */ 1210 /* start sending the command to the drive */
1215 return cdrom_start_packet_command(drive, rq->data_len, cdrom_do_newpc_cont); 1211 return cdrom_start_packet_command(drive, rq->data_len,
1212 cdrom_do_newpc_cont);
1216} 1213}
1217 1214
1218/**************************************************************************** 1215/*
1219 * cdrom driver request routine. 1216 * cdrom driver request routine.
1220 */ 1217 */
1221static ide_startstop_t 1218static ide_startstop_t ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq,
1222ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, sector_t block) 1219 sector_t block)
1223{ 1220{
1224 ide_startstop_t action; 1221 ide_startstop_t action;
1225 struct cdrom_info *info = drive->driver_data; 1222 struct cdrom_info *info = drive->driver_data;
@@ -1231,14 +1228,19 @@ ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, sector_t block)
1231 1228
1232 if ((stat & SEEK_STAT) != SEEK_STAT) { 1229 if ((stat & SEEK_STAT) != SEEK_STAT) {
1233 if (elapsed < IDECD_SEEK_TIMEOUT) { 1230 if (elapsed < IDECD_SEEK_TIMEOUT) {
1234 ide_stall_queue(drive, IDECD_SEEK_TIMER); 1231 ide_stall_queue(drive,
1232 IDECD_SEEK_TIMER);
1235 return ide_stopped; 1233 return ide_stopped;
1236 } 1234 }
1237 printk(KERN_ERR "%s: DSC timeout\n", drive->name); 1235 printk(KERN_ERR "%s: DSC timeout\n",
1236 drive->name);
1238 } 1237 }
1239 info->cd_flags &= ~IDE_CD_FLAG_SEEKING; 1238 info->cd_flags &= ~IDE_CD_FLAG_SEEKING;
1240 } 1239 }
1241 if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) 1240 if (rq_data_dir(rq) == READ &&
1241 IDE_LARGE_SEEK(info->last_block, block,
1242 IDECD_SEEK_THRESHOLD) &&
1243 drive->dsc_overlap)
1242 action = cdrom_start_seek(drive, block); 1244 action = cdrom_start_seek(drive, block);
1243 else 1245 else
1244 action = cdrom_start_rw(drive, rq); 1246 action = cdrom_start_rw(drive, rq);
@@ -1248,9 +1250,7 @@ ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, sector_t block)
1248 rq->cmd_type == REQ_TYPE_ATA_PC) { 1250 rq->cmd_type == REQ_TYPE_ATA_PC) {
1249 return cdrom_do_block_pc(drive, rq); 1251 return cdrom_do_block_pc(drive, rq);
1250 } else if (blk_special_request(rq)) { 1252 } else if (blk_special_request(rq)) {
1251 /* 1253 /* right now this can only be a reset... */
1252 * right now this can only be a reset...
1253 */
1254 cdrom_end_request(drive, 1); 1254 cdrom_end_request(drive, 1);
1255 return ide_stopped; 1255 return ide_stopped;
1256 } 1256 }
@@ -1262,18 +1262,16 @@ ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, sector_t block)
1262 1262
1263 1263
1264 1264
1265/**************************************************************************** 1265/*
1266 * Ioctl handling. 1266 * Ioctl handling.
1267 * 1267 *
1268 * Routines which queue packet commands take as a final argument a pointer 1268 * Routines which queue packet commands take as a final argument a pointer to a
1269 * to a request_sense struct. If execution of the command results 1269 * request_sense struct. If execution of the command results in an error with a
1270 * in an error with a CHECK CONDITION status, this structure will be filled 1270 * CHECK CONDITION status, this structure will be filled with the results of the
1271 * with the results of the subsequent request sense command. The pointer 1271 * subsequent request sense command. The pointer can also be NULL, in which case
1272 * can also be NULL, in which case no sense information is returned. 1272 * no sense information is returned.
1273 */ 1273 */
1274 1274static void msf_from_bcd(struct atapi_msf *msf)
1275static
1276void msf_from_bcd(struct atapi_msf *msf)
1277{ 1275{
1278 msf->minute = BCD2BIN(msf->minute); 1276 msf->minute = BCD2BIN(msf->minute);
1279 msf->second = BCD2BIN(msf->second); 1277 msf->second = BCD2BIN(msf->second);
@@ -1293,8 +1291,8 @@ int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1293 req.cmd_flags |= REQ_QUIET; 1291 req.cmd_flags |= REQ_QUIET;
1294 1292
1295 /* 1293 /*
1296 * Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to 1294 * Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to switch CDs
1297 * switch CDs instead of supporting the LOAD_UNLOAD opcode. 1295 * instead of supporting the LOAD_UNLOAD opcode.
1298 */ 1296 */
1299 req.cmd[7] = cdi->sanyo_slot % 3; 1297 req.cmd[7] = cdi->sanyo_slot % 3;
1300 1298
@@ -1370,36 +1368,39 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1370 unsigned long sectors_per_frame = SECTORS_PER_FRAME; 1368 unsigned long sectors_per_frame = SECTORS_PER_FRAME;
1371 1369
1372 if (toc == NULL) { 1370 if (toc == NULL) {
1373 /* Try to allocate space. */ 1371 /* try to allocate space */
1374 toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL); 1372 toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
1375 if (toc == NULL) { 1373 if (toc == NULL) {
1376 printk(KERN_ERR "%s: No cdrom TOC buffer!\n", drive->name); 1374 printk(KERN_ERR "%s: No cdrom TOC buffer!\n",
1375 drive->name);
1377 return -ENOMEM; 1376 return -ENOMEM;
1378 } 1377 }
1379 info->toc = toc; 1378 info->toc = toc;
1380 } 1379 }
1381 1380
1382 /* Check to see if the existing data is still valid. 1381 /*
1383 If it is, just return. */ 1382 * Check to see if the existing data is still valid. If it is,
1383 * just return.
1384 */
1384 (void) cdrom_check_status(drive, sense); 1385 (void) cdrom_check_status(drive, sense);
1385 1386
1386 if (info->cd_flags & IDE_CD_FLAG_TOC_VALID) 1387 if (info->cd_flags & IDE_CD_FLAG_TOC_VALID)
1387 return 0; 1388 return 0;
1388 1389
1389 /* Try to get the total cdrom capacity and sector size. */ 1390 /* try to get the total cdrom capacity and sector size */
1390 stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame, 1391 stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
1391 sense); 1392 sense);
1392 if (stat) 1393 if (stat)
1393 toc->capacity = 0x1fffff; 1394 toc->capacity = 0x1fffff;
1394 1395
1395 set_capacity(info->disk, toc->capacity * sectors_per_frame); 1396 set_capacity(info->disk, toc->capacity * sectors_per_frame);
1396 /* Save a private copy of te TOC capacity for error handling */ 1397 /* save a private copy of the TOC capacity for error handling */
1397 drive->probed_capacity = toc->capacity * sectors_per_frame; 1398 drive->probed_capacity = toc->capacity * sectors_per_frame;
1398 1399
1399 blk_queue_hardsect_size(drive->queue, 1400 blk_queue_hardsect_size(drive->queue,
1400 sectors_per_frame << SECTOR_BITS); 1401 sectors_per_frame << SECTOR_BITS);
1401 1402
1402 /* First read just the header, so we know how long the TOC is. */ 1403 /* first read just the header, so we know how long the TOC is */
1403 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr, 1404 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
1404 sizeof(struct atapi_toc_header), sense); 1405 sizeof(struct atapi_toc_header), sense);
1405 if (stat) 1406 if (stat)
@@ -1416,7 +1417,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1416 if (ntracks > MAX_TRACKS) 1417 if (ntracks > MAX_TRACKS)
1417 ntracks = MAX_TRACKS; 1418 ntracks = MAX_TRACKS;
1418 1419
1419 /* Now read the whole schmeer. */ 1420 /* now read the whole schmeer */
1420 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0, 1421 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
1421 (char *)&toc->hdr, 1422 (char *)&toc->hdr,
1422 sizeof(struct atapi_toc_header) + 1423 sizeof(struct atapi_toc_header) +
@@ -1424,15 +1425,18 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1424 sizeof(struct atapi_toc_entry), sense); 1425 sizeof(struct atapi_toc_entry), sense);
1425 1426
1426 if (stat && toc->hdr.first_track > 1) { 1427 if (stat && toc->hdr.first_track > 1) {
1427 /* Cds with CDI tracks only don't have any TOC entries, 1428 /*
1428 despite of this the returned values are 1429 * Cds with CDI tracks only don't have any TOC entries, despite
1429 first_track == last_track = number of CDI tracks + 1, 1430 * of this the returned values are
1430 so that this case is indistinguishable from the same 1431 * first_track == last_track = number of CDI tracks + 1,
1431 layout plus an additional audio track. 1432 * so that this case is indistinguishable from the same layout
1432 If we get an error for the regular case, we assume 1433 * plus an additional audio track. If we get an error for the
1433 a CDI without additional audio tracks. In this case 1434 * regular case, we assume a CDI without additional audio
1434 the readable TOC is empty (CDI tracks are not included) 1435 * tracks. In this case the readable TOC is empty (CDI tracks
1435 and only holds the Leadout entry. Heiko Eißfeldt */ 1436 * are not included) and only holds the Leadout entry.
1437 *
1438 * Heiko Eißfeldt.
1439 */
1436 ntracks = 0; 1440 ntracks = 0;
1437 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0, 1441 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
1438 (char *)&toc->hdr, 1442 (char *)&toc->hdr,
@@ -1473,9 +1477,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1473 toc->ent[i].addr.msf.frame); 1477 toc->ent[i].addr.msf.frame);
1474 } 1478 }
1475 1479
1476 /* Read the multisession information. */
1477 if (toc->hdr.first_track != CDROM_LEADOUT) { 1480 if (toc->hdr.first_track != CDROM_LEADOUT) {
1478 /* Read the multisession information. */ 1481 /* read the multisession information */
1479 stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp, 1482 stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
1480 sizeof(ms_tmp), sense); 1483 sizeof(ms_tmp), sense);
1481 if (stat) 1484 if (stat)
@@ -1483,12 +1486,13 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1483 1486
1484 toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba); 1487 toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
1485 } else { 1488 } else {
1486 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT; 1489 ms_tmp.hdr.last_track = CDROM_LEADOUT;
1490 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track;
1487 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */ 1491 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
1488 } 1492 }
1489 1493
1490 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) { 1494 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) {
1491 /* Re-read multisession information using MSF format */ 1495 /* re-read multisession information using MSF format */
1492 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp, 1496 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
1493 sizeof(ms_tmp), sense); 1497 sizeof(ms_tmp), sense);
1494 if (stat) 1498 if (stat)
@@ -1502,7 +1506,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1502 1506
1503 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track); 1507 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
1504 1508
1505 /* Now try to get the total cdrom capacity. */ 1509 /* now try to get the total cdrom capacity */
1506 stat = cdrom_get_last_written(cdi, &last_written); 1510 stat = cdrom_get_last_written(cdi, &last_written);
1507 if (!stat && (last_written > toc->capacity)) { 1511 if (!stat && (last_written > toc->capacity)) {
1508 toc->capacity = last_written; 1512 toc->capacity = last_written;
@@ -1527,7 +1531,8 @@ int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)
1527 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE; 1531 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE;
1528 1532
1529 init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN); 1533 init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN);
1530 do { /* we seem to get stat=0x01,err=0x00 the first time (??) */ 1534 do {
1535 /* we seem to get stat=0x01,err=0x00 the first time (??) */
1531 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0); 1536 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
1532 if (!stat) 1537 if (!stat)
1533 break; 1538 break;
@@ -1596,8 +1601,7 @@ static int ide_cdrom_register(ide_drive_t *drive, int nslots)
1596 return register_cdrom(devinfo); 1601 return register_cdrom(devinfo);
1597} 1602}
1598 1603
1599static 1604static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1600int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1601{ 1605{
1602 struct cdrom_info *cd = drive->driver_data; 1606 struct cdrom_info *cd = drive->driver_data;
1603 struct cdrom_device_info *cdi = &cd->devinfo; 1607 struct cdrom_device_info *cdi = &cd->devinfo;
@@ -1611,7 +1615,8 @@ int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1611 1615
1612 if (drive->media == ide_optical) { 1616 if (drive->media == ide_optical) {
1613 cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM); 1617 cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM);
1614 printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", drive->name); 1618 printk(KERN_ERR "%s: ATAPI magneto-optical drive\n",
1619 drive->name);
1615 return nslots; 1620 return nslots;
1616 } 1621 }
1617 1622
@@ -1622,11 +1627,10 @@ int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1622 } 1627 }
1623 1628
1624 /* 1629 /*
1625 * we have to cheat a little here. the packet will eventually 1630 * We have to cheat a little here. the packet will eventually be queued
1626 * be queued with ide_cdrom_packet(), which extracts the 1631 * with ide_cdrom_packet(), which extracts the drive from cdi->handle.
1627 * drive from cdi->handle. Since this device hasn't been 1632 * Since this device hasn't been registered with the Uniform layer yet,
1628 * registered with the Uniform layer yet, it can't do this. 1633 * it can't do this. Same goes for cdi->ops.
1629 * Same goes for cdi->ops.
1630 */ 1634 */
1631 cdi->handle = drive; 1635 cdi->handle = drive;
1632 cdi->ops = &ide_cdrom_dops; 1636 cdi->ops = &ide_cdrom_dops;
@@ -1695,18 +1699,7 @@ int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1695 return nslots; 1699 return nslots;
1696} 1700}
1697 1701
1698#ifdef CONFIG_IDE_PROC_FS 1702/* standard prep_rq_fn that builds 10 byte cmds */
1699static void ide_cdrom_add_settings(ide_drive_t *drive)
1700{
1701 ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
1702}
1703#else
1704static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
1705#endif
1706
1707/*
1708 * standard prep_rq_fn that builds 10 byte cmds
1709 */
1710static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq) 1703static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
1711{ 1704{
1712 int hard_sect = queue_hardsect_size(q); 1705 int hard_sect = queue_hardsect_size(q);
@@ -1745,9 +1738,7 @@ static int ide_cdrom_prep_pc(struct request *rq)
1745{ 1738{
1746 u8 *c = rq->cmd; 1739 u8 *c = rq->cmd;
1747 1740
1748 /* 1741 /* transform 6-byte read/write commands to the 10-byte version */
1749 * Transform 6-byte read/write commands to the 10-byte version
1750 */
1751 if (c[0] == READ_6 || c[0] == WRITE_6) { 1742 if (c[0] == READ_6 || c[0] == WRITE_6) {
1752 c[8] = c[4]; 1743 c[8] = c[4];
1753 c[5] = c[3]; 1744 c[5] = c[3];
@@ -1789,6 +1780,41 @@ struct cd_list_entry {
1789 unsigned int cd_flags; 1780 unsigned int cd_flags;
1790}; 1781};
1791 1782
1783#ifdef CONFIG_IDE_PROC_FS
1784static sector_t ide_cdrom_capacity(ide_drive_t *drive)
1785{
1786 unsigned long capacity, sectors_per_frame;
1787
1788 if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
1789 return 0;
1790
1791 return capacity * sectors_per_frame;
1792}
1793
1794static int proc_idecd_read_capacity(char *page, char **start, off_t off,
1795 int count, int *eof, void *data)
1796{
1797 ide_drive_t *drive = data;
1798 int len;
1799
1800 len = sprintf(page, "%llu\n", (long long)ide_cdrom_capacity(drive));
1801 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
1802}
1803
1804static ide_proc_entry_t idecd_proc[] = {
1805 { "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
1806 { NULL, 0, NULL, NULL }
1807};
1808
1809static void ide_cdrom_add_settings(ide_drive_t *drive)
1810{
1811 ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1,
1812 &drive->dsc_overlap, NULL);
1813}
1814#else
1815static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
1816#endif
1817
1792static const struct cd_list_entry ide_cd_quirks_list[] = { 1818static const struct cd_list_entry ide_cd_quirks_list[] = {
1793 /* Limit transfer size per interrupt. */ 1819 /* Limit transfer size per interrupt. */
1794 { "SAMSUNG CD-ROM SCR-2430", NULL, IDE_CD_FLAG_LIMIT_NFRAMES }, 1820 { "SAMSUNG CD-ROM SCR-2430", NULL, IDE_CD_FLAG_LIMIT_NFRAMES },
@@ -1846,8 +1872,7 @@ static unsigned int ide_cd_flags(struct hd_driveid *id)
1846 return 0; 1872 return 0;
1847} 1873}
1848 1874
1849static 1875static int ide_cdrom_setup(ide_drive_t *drive)
1850int ide_cdrom_setup(ide_drive_t *drive)
1851{ 1876{
1852 struct cdrom_info *cd = drive->driver_data; 1877 struct cdrom_info *cd = drive->driver_data;
1853 struct cdrom_device_info *cdi = &cd->devinfo; 1878 struct cdrom_device_info *cdi = &cd->devinfo;
@@ -1876,13 +1901,12 @@ int ide_cdrom_setup(ide_drive_t *drive)
1876 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2') 1901 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2')
1877 cd->cd_flags |= IDE_CD_FLAG_TOCTRACKS_AS_BCD; 1902 cd->cd_flags |= IDE_CD_FLAG_TOCTRACKS_AS_BCD;
1878 else if (cd->cd_flags & IDE_CD_FLAG_SANYO_3CD) 1903 else if (cd->cd_flags & IDE_CD_FLAG_SANYO_3CD)
1879 cdi->sanyo_slot = 3; /* 3 => use CD in slot 0 */ 1904 /* 3 => use CD in slot 0 */
1905 cdi->sanyo_slot = 3;
1880 1906
1881 nslots = ide_cdrom_probe_capabilities(drive); 1907 nslots = ide_cdrom_probe_capabilities(drive);
1882 1908
1883 /* 1909 /* set correct block size */
1884 * set correct block size
1885 */
1886 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE); 1910 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
1887 1911
1888 if (drive->autotune == IDE_TUNE_DEFAULT || 1912 if (drive->autotune == IDE_TUNE_DEFAULT ||
@@ -1890,7 +1914,8 @@ int ide_cdrom_setup(ide_drive_t *drive)
1890 drive->dsc_overlap = (drive->next != drive); 1914 drive->dsc_overlap = (drive->next != drive);
1891 1915
1892 if (ide_cdrom_register(drive, nslots)) { 1916 if (ide_cdrom_register(drive, nslots)) {
1893 printk(KERN_ERR "%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name); 1917 printk(KERN_ERR "%s: %s failed to register device with the"
1918 " cdrom driver.\n", drive->name, __func__);
1894 cd->devinfo.handle = NULL; 1919 cd->devinfo.handle = NULL;
1895 return 1; 1920 return 1;
1896 } 1921 }
@@ -1929,33 +1954,6 @@ static void ide_cd_release(struct kref *kref)
1929 1954
1930static int ide_cd_probe(ide_drive_t *); 1955static int ide_cd_probe(ide_drive_t *);
1931 1956
1932#ifdef CONFIG_IDE_PROC_FS
1933static sector_t ide_cdrom_capacity(ide_drive_t *drive)
1934{
1935 unsigned long capacity, sectors_per_frame;
1936
1937 if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
1938 return 0;
1939
1940 return capacity * sectors_per_frame;
1941}
1942
1943static int proc_idecd_read_capacity
1944 (char *page, char **start, off_t off, int count, int *eof, void *data)
1945{
1946 ide_drive_t *drive = data;
1947 int len;
1948
1949 len = sprintf(page, "%llu\n", (long long)ide_cdrom_capacity(drive));
1950 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
1951}
1952
1953static ide_proc_entry_t idecd_proc[] = {
1954 { "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
1955 { NULL, 0, NULL, NULL }
1956};
1957#endif
1958
1959static ide_driver_t ide_cdrom_driver = { 1957static ide_driver_t ide_cdrom_driver = {
1960 .gen_driver = { 1958 .gen_driver = {
1961 .owner = THIS_MODULE, 1959 .owner = THIS_MODULE,
@@ -2093,7 +2091,7 @@ static struct block_device_operations idecd_ops = {
2093 .revalidate_disk = idecd_revalidate_disk 2091 .revalidate_disk = idecd_revalidate_disk
2094}; 2092};
2095 2093
2096/* options */ 2094/* module options */
2097static char *ignore; 2095static char *ignore;
2098 2096
2099module_param(ignore, charp, 0400); 2097module_param(ignore, charp, 0400);
@@ -2114,17 +2112,20 @@ static int ide_cd_probe(ide_drive_t *drive)
2114 /* skip drives that we were told to ignore */ 2112 /* skip drives that we were told to ignore */
2115 if (ignore != NULL) { 2113 if (ignore != NULL) {
2116 if (strstr(ignore, drive->name)) { 2114 if (strstr(ignore, drive->name)) {
2117 printk(KERN_INFO "ide-cd: ignoring drive %s\n", drive->name); 2115 printk(KERN_INFO "ide-cd: ignoring drive %s\n",
2116 drive->name);
2118 goto failed; 2117 goto failed;
2119 } 2118 }
2120 } 2119 }
2121 if (drive->scsi) { 2120 if (drive->scsi) {
2122 printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name); 2121 printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi "
2122 "emulation.\n", drive->name);
2123 goto failed; 2123 goto failed;
2124 } 2124 }
2125 info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL); 2125 info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
2126 if (info == NULL) { 2126 if (info == NULL) {
2127 printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name); 2127 printk(KERN_ERR "%s: Can't allocate a cdrom structure\n",
2128 drive->name);
2128 goto failed; 2129 goto failed;
2129 } 2130 }
2130 2131
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index 8757e5ef6c95..c352cf27b6e7 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -102,7 +102,7 @@ ide_startstop_t ide_dma_intr (ide_drive_t *drive)
102{ 102{
103 u8 stat = 0, dma_stat = 0; 103 u8 stat = 0, dma_stat = 0;
104 104
105 dma_stat = HWIF(drive)->ide_dma_end(drive); 105 dma_stat = drive->hwif->dma_ops->dma_end(drive);
106 stat = ide_read_status(drive); 106 stat = ide_read_status(drive);
107 107
108 if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { 108 if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
@@ -394,7 +394,7 @@ void ide_dma_off_quietly(ide_drive_t *drive)
394 drive->using_dma = 0; 394 drive->using_dma = 0;
395 ide_toggle_bounce(drive, 0); 395 ide_toggle_bounce(drive, 0);
396 396
397 drive->hwif->dma_host_set(drive, 0); 397 drive->hwif->dma_ops->dma_host_set(drive, 0);
398} 398}
399 399
400EXPORT_SYMBOL(ide_dma_off_quietly); 400EXPORT_SYMBOL(ide_dma_off_quietly);
@@ -427,7 +427,7 @@ void ide_dma_on(ide_drive_t *drive)
427 drive->using_dma = 1; 427 drive->using_dma = 1;
428 ide_toggle_bounce(drive, 1); 428 ide_toggle_bounce(drive, 1);
429 429
430 drive->hwif->dma_host_set(drive, 1); 430 drive->hwif->dma_ops->dma_host_set(drive, 1);
431} 431}
432 432
433#ifdef CONFIG_BLK_DEV_IDEDMA_SFF 433#ifdef CONFIG_BLK_DEV_IDEDMA_SFF
@@ -482,11 +482,12 @@ int ide_dma_setup(ide_drive_t *drive)
482 482
483EXPORT_SYMBOL_GPL(ide_dma_setup); 483EXPORT_SYMBOL_GPL(ide_dma_setup);
484 484
485static void ide_dma_exec_cmd(ide_drive_t *drive, u8 command) 485void ide_dma_exec_cmd(ide_drive_t *drive, u8 command)
486{ 486{
487 /* issue cmd to drive */ 487 /* issue cmd to drive */
488 ide_execute_command(drive, command, &ide_dma_intr, 2*WAIT_CMD, dma_timer_expiry); 488 ide_execute_command(drive, command, &ide_dma_intr, 2*WAIT_CMD, dma_timer_expiry);
489} 489}
490EXPORT_SYMBOL_GPL(ide_dma_exec_cmd);
490 491
491void ide_dma_start(ide_drive_t *drive) 492void ide_dma_start(ide_drive_t *drive)
492{ 493{
@@ -532,7 +533,7 @@ int __ide_dma_end (ide_drive_t *drive)
532EXPORT_SYMBOL(__ide_dma_end); 533EXPORT_SYMBOL(__ide_dma_end);
533 534
534/* returns 1 if dma irq issued, 0 otherwise */ 535/* returns 1 if dma irq issued, 0 otherwise */
535static int __ide_dma_test_irq(ide_drive_t *drive) 536int ide_dma_test_irq(ide_drive_t *drive)
536{ 537{
537 ide_hwif_t *hwif = HWIF(drive); 538 ide_hwif_t *hwif = HWIF(drive);
538 u8 dma_stat = hwif->INB(hwif->dma_status); 539 u8 dma_stat = hwif->INB(hwif->dma_status);
@@ -542,9 +543,10 @@ static int __ide_dma_test_irq(ide_drive_t *drive)
542 return 1; 543 return 1;
543 if (!drive->waiting_for_dma) 544 if (!drive->waiting_for_dma)
544 printk(KERN_WARNING "%s: (%s) called while not waiting\n", 545 printk(KERN_WARNING "%s: (%s) called while not waiting\n",
545 drive->name, __FUNCTION__); 546 drive->name, __func__);
546 return 0; 547 return 0;
547} 548}
549EXPORT_SYMBOL_GPL(ide_dma_test_irq);
548#else 550#else
549static inline int config_drive_for_dma(ide_drive_t *drive) { return 0; } 551static inline int config_drive_for_dma(ide_drive_t *drive) { return 0; }
550#endif /* CONFIG_BLK_DEV_IDEDMA_SFF */ 552#endif /* CONFIG_BLK_DEV_IDEDMA_SFF */
@@ -574,6 +576,7 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base, u8 req_mode)
574{ 576{
575 struct hd_driveid *id = drive->id; 577 struct hd_driveid *id = drive->id;
576 ide_hwif_t *hwif = drive->hwif; 578 ide_hwif_t *hwif = drive->hwif;
579 const struct ide_port_ops *port_ops = hwif->port_ops;
577 unsigned int mask = 0; 580 unsigned int mask = 0;
578 581
579 switch(base) { 582 switch(base) {
@@ -581,8 +584,8 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base, u8 req_mode)
581 if ((id->field_valid & 4) == 0) 584 if ((id->field_valid & 4) == 0)
582 break; 585 break;
583 586
584 if (hwif->udma_filter) 587 if (port_ops && port_ops->udma_filter)
585 mask = hwif->udma_filter(drive); 588 mask = port_ops->udma_filter(drive);
586 else 589 else
587 mask = hwif->ultra_mask; 590 mask = hwif->ultra_mask;
588 mask &= id->dma_ultra; 591 mask &= id->dma_ultra;
@@ -598,8 +601,8 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base, u8 req_mode)
598 case XFER_MW_DMA_0: 601 case XFER_MW_DMA_0:
599 if ((id->field_valid & 2) == 0) 602 if ((id->field_valid & 2) == 0)
600 break; 603 break;
601 if (hwif->mdma_filter) 604 if (port_ops && port_ops->mdma_filter)
602 mask = hwif->mdma_filter(drive); 605 mask = port_ops->mdma_filter(drive);
603 else 606 else
604 mask = hwif->mwdma_mask; 607 mask = hwif->mwdma_mask;
605 mask &= id->dma_mword; 608 mask &= id->dma_mword;
@@ -801,15 +804,15 @@ void ide_dma_timeout (ide_drive_t *drive)
801 804
802 printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name); 805 printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name);
803 806
804 if (hwif->ide_dma_test_irq(drive)) 807 if (hwif->dma_ops->dma_test_irq(drive))
805 return; 808 return;
806 809
807 hwif->ide_dma_end(drive); 810 hwif->dma_ops->dma_end(drive);
808} 811}
809 812
810EXPORT_SYMBOL(ide_dma_timeout); 813EXPORT_SYMBOL(ide_dma_timeout);
811 814
812static void ide_release_dma_engine(ide_hwif_t *hwif) 815void ide_release_dma_engine(ide_hwif_t *hwif)
813{ 816{
814 if (hwif->dmatable_cpu) { 817 if (hwif->dmatable_cpu) {
815 struct pci_dev *pdev = to_pci_dev(hwif->dev); 818 struct pci_dev *pdev = to_pci_dev(hwif->dev);
@@ -820,28 +823,7 @@ static void ide_release_dma_engine(ide_hwif_t *hwif)
820 } 823 }
821} 824}
822 825
823static int ide_release_iomio_dma(ide_hwif_t *hwif) 826int ide_allocate_dma_engine(ide_hwif_t *hwif)
824{
825 release_region(hwif->dma_base, 8);
826 if (hwif->extra_ports)
827 release_region(hwif->extra_base, hwif->extra_ports);
828 return 1;
829}
830
831/*
832 * Needed for allowing full modular support of ide-driver
833 */
834int ide_release_dma(ide_hwif_t *hwif)
835{
836 ide_release_dma_engine(hwif);
837
838 if (hwif->mmio)
839 return 1;
840 else
841 return ide_release_iomio_dma(hwif);
842}
843
844static int ide_allocate_dma_engine(ide_hwif_t *hwif)
845{ 827{
846 struct pci_dev *pdev = to_pci_dev(hwif->dev); 828 struct pci_dev *pdev = to_pci_dev(hwif->dev);
847 829
@@ -853,65 +835,25 @@ static int ide_allocate_dma_engine(ide_hwif_t *hwif)
853 return 0; 835 return 0;
854 836
855 printk(KERN_ERR "%s: -- Error, unable to allocate DMA table.\n", 837 printk(KERN_ERR "%s: -- Error, unable to allocate DMA table.\n",
856 hwif->cds->name); 838 hwif->name);
857 839
858 return 1; 840 return 1;
859} 841}
860 842EXPORT_SYMBOL_GPL(ide_allocate_dma_engine);
861static int ide_mapped_mmio_dma(ide_hwif_t *hwif, unsigned long base) 843
862{ 844static const struct ide_dma_ops sff_dma_ops = {
863 printk(KERN_INFO " %s: MMIO-DMA ", hwif->name); 845 .dma_host_set = ide_dma_host_set,
864 846 .dma_setup = ide_dma_setup,
865 return 0; 847 .dma_exec_cmd = ide_dma_exec_cmd,
866} 848 .dma_start = ide_dma_start,
867 849 .dma_end = __ide_dma_end,
868static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base) 850 .dma_test_irq = ide_dma_test_irq,
869{ 851 .dma_timeout = ide_dma_timeout,
870 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx", 852 .dma_lost_irq = ide_dma_lost_irq,
871 hwif->name, base, base + 7); 853};
872
873 if (!request_region(base, 8, hwif->name)) {
874 printk(" -- Error, ports in use.\n");
875 return 1;
876 }
877
878 if (hwif->cds->extra) {
879 hwif->extra_base = base + (hwif->channel ? 8 : 16);
880
881 if (!hwif->mate || !hwif->mate->extra_ports) {
882 if (!request_region(hwif->extra_base,
883 hwif->cds->extra, hwif->cds->name)) {
884 printk(" -- Error, extra ports in use.\n");
885 release_region(base, 8);
886 return 1;
887 }
888 hwif->extra_ports = hwif->cds->extra;
889 }
890 }
891
892 return 0;
893}
894
895static int ide_dma_iobase(ide_hwif_t *hwif, unsigned long base)
896{
897 if (hwif->mmio)
898 return ide_mapped_mmio_dma(hwif, base);
899
900 return ide_iomio_dma(hwif, base);
901}
902 854
903void ide_setup_dma(ide_hwif_t *hwif, unsigned long base) 855void ide_setup_dma(ide_hwif_t *hwif, unsigned long base)
904{ 856{
905 u8 dma_stat;
906
907 if (ide_dma_iobase(hwif, base))
908 return;
909
910 if (ide_allocate_dma_engine(hwif)) {
911 ide_release_dma(hwif);
912 return;
913 }
914
915 hwif->dma_base = base; 857 hwif->dma_base = base;
916 858
917 if (!hwif->dma_command) 859 if (!hwif->dma_command)
@@ -925,27 +867,7 @@ void ide_setup_dma(ide_hwif_t *hwif, unsigned long base)
925 if (!hwif->dma_prdtable) 867 if (!hwif->dma_prdtable)
926 hwif->dma_prdtable = hwif->dma_base + 4; 868 hwif->dma_prdtable = hwif->dma_base + 4;
927 869
928 if (!hwif->dma_host_set) 870 hwif->dma_ops = &sff_dma_ops;
929 hwif->dma_host_set = &ide_dma_host_set;
930 if (!hwif->dma_setup)
931 hwif->dma_setup = &ide_dma_setup;
932 if (!hwif->dma_exec_cmd)
933 hwif->dma_exec_cmd = &ide_dma_exec_cmd;
934 if (!hwif->dma_start)
935 hwif->dma_start = &ide_dma_start;
936 if (!hwif->ide_dma_end)
937 hwif->ide_dma_end = &__ide_dma_end;
938 if (!hwif->ide_dma_test_irq)
939 hwif->ide_dma_test_irq = &__ide_dma_test_irq;
940 if (!hwif->dma_timeout)
941 hwif->dma_timeout = &ide_dma_timeout;
942 if (!hwif->dma_lost_irq)
943 hwif->dma_lost_irq = &ide_dma_lost_irq;
944
945 dma_stat = hwif->INB(hwif->dma_status);
946 printk(KERN_CONT ", BIOS settings: %s:%s, %s:%s\n",
947 hwif->drives[0].name, (dma_stat & 0x20) ? "DMA" : "PIO",
948 hwif->drives[1].name, (dma_stat & 0x40) ? "DMA" : "PIO");
949} 871}
950 872
951EXPORT_SYMBOL_GPL(ide_setup_dma); 873EXPORT_SYMBOL_GPL(ide_setup_dma);
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index ed19a8bbd2d2..6e891bccd052 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -411,7 +411,7 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
411 debug_log("Reached %s interrupt handler\n", __func__); 411 debug_log("Reached %s interrupt handler\n", __func__);
412 412
413 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { 413 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
414 dma_error = hwif->ide_dma_end(drive); 414 dma_error = hwif->dma_ops->dma_end(drive);
415 if (dma_error) { 415 if (dma_error) {
416 printk(KERN_ERR "%s: DMA %s error\n", drive->name, 416 printk(KERN_ERR "%s: DMA %s error\n", drive->name,
417 rq_data_dir(rq) ? "write" : "read"); 417 rq_data_dir(rq) ? "write" : "read");
@@ -663,7 +663,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
663 dma = 0; 663 dma = 0;
664 664
665 if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) 665 if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma)
666 dma = !hwif->dma_setup(drive); 666 dma = !hwif->dma_ops->dma_setup(drive);
667 667
668 ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | 668 ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK |
669 IDE_TFLAG_OUT_DEVICE, bcount, dma); 669 IDE_TFLAG_OUT_DEVICE, bcount, dma);
@@ -671,7 +671,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
671 if (dma) { 671 if (dma) {
672 /* Begin DMA, if necessary */ 672 /* Begin DMA, if necessary */
673 pc->flags |= PC_FLAG_DMA_IN_PROGRESS; 673 pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
674 hwif->dma_start(drive); 674 hwif->dma_ops->dma_start(drive);
675 } 675 }
676 676
677 /* Can we transfer the packet when we get the interrupt or wait? */ 677 /* Can we transfer the packet when we get the interrupt or wait? */
diff --git a/drivers/ide/ide-generic.c b/drivers/ide/ide-generic.c
index 19f63e393d18..a6073e248f45 100644
--- a/drivers/ide/ide-generic.c
+++ b/drivers/ide/ide-generic.c
@@ -94,7 +94,24 @@ static int __init ide_generic_init(void)
94 unsigned long io_addr = ide_default_io_base(i); 94 unsigned long io_addr = ide_default_io_base(i);
95 hw_regs_t hw; 95 hw_regs_t hw;
96 96
97 idx[i] = 0xff;
98
97 if (io_addr) { 99 if (io_addr) {
100 if (!request_region(io_addr, 8, DRV_NAME)) {
101 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX "
102 "not free.\n",
103 DRV_NAME, io_addr, io_addr + 7);
104 continue;
105 }
106
107 if (!request_region(io_addr + 0x206, 1, DRV_NAME)) {
108 printk(KERN_ERR "%s: I/O resource 0x%lX "
109 "not free.\n",
110 DRV_NAME, io_addr + 0x206);
111 release_region(io_addr, 8);
112 continue;
113 }
114
98 /* 115 /*
99 * Skip probing if the corresponding 116 * Skip probing if the corresponding
100 * slot is already occupied. 117 * slot is already occupied.
@@ -111,8 +128,7 @@ static int __init ide_generic_init(void)
111 ide_init_port_hw(hwif, &hw); 128 ide_init_port_hw(hwif, &hw);
112 129
113 idx[i] = i; 130 idx[i] = i;
114 } else 131 }
115 idx[i] = 0xff;
116 } 132 }
117 133
118 ide_device_add_all(idx, NULL); 134 ide_device_add_all(idx, NULL);
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 51d181ee9cf7..0fe89a599275 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -218,7 +218,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
218 * we could be smarter and check for current xfer_speed 218 * we could be smarter and check for current xfer_speed
219 * in struct drive etc... 219 * in struct drive etc...
220 */ 220 */
221 if (drive->hwif->dma_host_set == NULL) 221 if (drive->hwif->dma_ops == NULL)
222 break; 222 break;
223 /* 223 /*
224 * TODO: respect ->using_dma setting 224 * TODO: respect ->using_dma setting
@@ -721,6 +721,7 @@ static ide_startstop_t do_special (ide_drive_t *drive)
721#endif 721#endif
722 if (s->b.set_tune) { 722 if (s->b.set_tune) {
723 ide_hwif_t *hwif = drive->hwif; 723 ide_hwif_t *hwif = drive->hwif;
724 const struct ide_port_ops *port_ops = hwif->port_ops;
724 u8 req_pio = drive->tune_req; 725 u8 req_pio = drive->tune_req;
725 726
726 s->b.set_tune = 0; 727 s->b.set_tune = 0;
@@ -733,10 +734,10 @@ static ide_startstop_t do_special (ide_drive_t *drive)
733 unsigned long flags; 734 unsigned long flags;
734 735
735 spin_lock_irqsave(&ide_lock, flags); 736 spin_lock_irqsave(&ide_lock, flags);
736 hwif->set_pio_mode(drive, req_pio); 737 port_ops->set_pio_mode(drive, req_pio);
737 spin_unlock_irqrestore(&ide_lock, flags); 738 spin_unlock_irqrestore(&ide_lock, flags);
738 } else 739 } else
739 hwif->set_pio_mode(drive, req_pio); 740 port_ops->set_pio_mode(drive, req_pio);
740 } else { 741 } else {
741 int keep_dma = drive->using_dma; 742 int keep_dma = drive->using_dma;
742 743
@@ -1237,12 +1238,12 @@ static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)
1237 1238
1238 if (error < 0) { 1239 if (error < 0) {
1239 printk(KERN_WARNING "%s: DMA timeout error\n", drive->name); 1240 printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
1240 (void)HWIF(drive)->ide_dma_end(drive); 1241 (void)hwif->dma_ops->dma_end(drive);
1241 ret = ide_error(drive, "dma timeout error", 1242 ret = ide_error(drive, "dma timeout error",
1242 ide_read_status(drive)); 1243 ide_read_status(drive));
1243 } else { 1244 } else {
1244 printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name); 1245 printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
1245 hwif->dma_timeout(drive); 1246 hwif->dma_ops->dma_timeout(drive);
1246 } 1247 }
1247 1248
1248 /* 1249 /*
@@ -1354,7 +1355,7 @@ void ide_timer_expiry (unsigned long data)
1354 startstop = handler(drive); 1355 startstop = handler(drive);
1355 } else if (drive_is_ready(drive)) { 1356 } else if (drive_is_ready(drive)) {
1356 if (drive->waiting_for_dma) 1357 if (drive->waiting_for_dma)
1357 hwgroup->hwif->dma_lost_irq(drive); 1358 hwif->dma_ops->dma_lost_irq(drive);
1358 (void)ide_ack_intr(hwif); 1359 (void)ide_ack_intr(hwif);
1359 printk(KERN_WARNING "%s: lost interrupt\n", drive->name); 1360 printk(KERN_WARNING "%s: lost interrupt\n", drive->name);
1360 startstop = handler(drive); 1361 startstop = handler(drive);
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index 45944219eea0..9c646bd63549 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -159,17 +159,20 @@ EXPORT_SYMBOL(default_hwif_mmiops);
159void SELECT_DRIVE (ide_drive_t *drive) 159void SELECT_DRIVE (ide_drive_t *drive)
160{ 160{
161 ide_hwif_t *hwif = drive->hwif; 161 ide_hwif_t *hwif = drive->hwif;
162 const struct ide_port_ops *port_ops = hwif->port_ops;
162 163
163 if (hwif->selectproc) 164 if (port_ops && port_ops->selectproc)
164 hwif->selectproc(drive); 165 port_ops->selectproc(drive);
165 166
166 hwif->OUTB(drive->select.all, hwif->io_ports[IDE_SELECT_OFFSET]); 167 hwif->OUTB(drive->select.all, hwif->io_ports[IDE_SELECT_OFFSET]);
167} 168}
168 169
169void SELECT_MASK (ide_drive_t *drive, int mask) 170void SELECT_MASK (ide_drive_t *drive, int mask)
170{ 171{
171 if (HWIF(drive)->maskproc) 172 const struct ide_port_ops *port_ops = drive->hwif->port_ops;
172 HWIF(drive)->maskproc(drive, mask); 173
174 if (port_ops && port_ops->maskproc)
175 port_ops->maskproc(drive, mask);
173} 176}
174 177
175/* 178/*
@@ -429,7 +432,7 @@ int drive_is_ready (ide_drive_t *drive)
429 u8 stat = 0; 432 u8 stat = 0;
430 433
431 if (drive->waiting_for_dma) 434 if (drive->waiting_for_dma)
432 return hwif->ide_dma_test_irq(drive); 435 return hwif->dma_ops->dma_test_irq(drive);
433 436
434#if 0 437#if 0
435 /* need to guarantee 400ns since last command was issued */ 438 /* need to guarantee 400ns since last command was issued */
@@ -700,8 +703,8 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
700// msleep(50); 703// msleep(50);
701 704
702#ifdef CONFIG_BLK_DEV_IDEDMA 705#ifdef CONFIG_BLK_DEV_IDEDMA
703 if (hwif->dma_host_set) /* check if host supports DMA */ 706 if (hwif->dma_ops) /* check if host supports DMA */
704 hwif->dma_host_set(drive, 0); 707 hwif->dma_ops->dma_host_set(drive, 0);
705#endif 708#endif
706 709
707 /* Skip setting PIO flow-control modes on pre-EIDE drives */ 710 /* Skip setting PIO flow-control modes on pre-EIDE drives */
@@ -759,8 +762,8 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
759#ifdef CONFIG_BLK_DEV_IDEDMA 762#ifdef CONFIG_BLK_DEV_IDEDMA
760 if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) && 763 if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) &&
761 drive->using_dma) 764 drive->using_dma)
762 hwif->dma_host_set(drive, 1); 765 hwif->dma_ops->dma_host_set(drive, 1);
763 else if (hwif->dma_host_set) /* check if host supports DMA */ 766 else if (hwif->dma_ops) /* check if host supports DMA */
764 ide_dma_off_quietly(drive); 767 ide_dma_off_quietly(drive);
765#endif 768#endif
766 769
@@ -905,10 +908,11 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
905{ 908{
906 ide_hwgroup_t *hwgroup = HWGROUP(drive); 909 ide_hwgroup_t *hwgroup = HWGROUP(drive);
907 ide_hwif_t *hwif = HWIF(drive); 910 ide_hwif_t *hwif = HWIF(drive);
911 const struct ide_port_ops *port_ops = hwif->port_ops;
908 u8 tmp; 912 u8 tmp;
909 913
910 if (hwif->reset_poll != NULL) { 914 if (port_ops && port_ops->reset_poll) {
911 if (hwif->reset_poll(drive)) { 915 if (port_ops->reset_poll(drive)) {
912 printk(KERN_ERR "%s: host reset_poll failure for %s.\n", 916 printk(KERN_ERR "%s: host reset_poll failure for %s.\n",
913 hwif->name, drive->name); 917 hwif->name, drive->name);
914 return ide_stopped; 918 return ide_stopped;
@@ -974,6 +978,8 @@ static void ide_disk_pre_reset(ide_drive_t *drive)
974 978
975static void pre_reset(ide_drive_t *drive) 979static void pre_reset(ide_drive_t *drive)
976{ 980{
981 const struct ide_port_ops *port_ops = drive->hwif->port_ops;
982
977 if (drive->media == ide_disk) 983 if (drive->media == ide_disk)
978 ide_disk_pre_reset(drive); 984 ide_disk_pre_reset(drive);
979 else 985 else
@@ -994,8 +1000,8 @@ static void pre_reset(ide_drive_t *drive)
994 return; 1000 return;
995 } 1001 }
996 1002
997 if (HWIF(drive)->pre_reset != NULL) 1003 if (port_ops && port_ops->pre_reset)
998 HWIF(drive)->pre_reset(drive); 1004 port_ops->pre_reset(drive);
999 1005
1000 if (drive->current_speed != 0xff) 1006 if (drive->current_speed != 0xff)
1001 drive->desired_speed = drive->current_speed; 1007 drive->desired_speed = drive->current_speed;
@@ -1023,6 +1029,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1023 unsigned long flags; 1029 unsigned long flags;
1024 ide_hwif_t *hwif; 1030 ide_hwif_t *hwif;
1025 ide_hwgroup_t *hwgroup; 1031 ide_hwgroup_t *hwgroup;
1032 const struct ide_port_ops *port_ops;
1026 u8 ctl; 1033 u8 ctl;
1027 1034
1028 spin_lock_irqsave(&ide_lock, flags); 1035 spin_lock_irqsave(&ide_lock, flags);
@@ -1089,8 +1096,9 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1089 * state when the disks are reset this way. At least, the Winbond 1096 * state when the disks are reset this way. At least, the Winbond
1090 * 553 documentation says that 1097 * 553 documentation says that
1091 */ 1098 */
1092 if (hwif->resetproc) 1099 port_ops = hwif->port_ops;
1093 hwif->resetproc(drive); 1100 if (port_ops && port_ops->resetproc)
1101 port_ops->resetproc(drive);
1094 1102
1095 spin_unlock_irqrestore(&ide_lock, flags); 1103 spin_unlock_irqrestore(&ide_lock, flags);
1096 return ide_started; 1104 return ide_started;
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c
index c859de77aa8f..6f04ea3e93a8 100644
--- a/drivers/ide/ide-lib.c
+++ b/drivers/ide/ide-lib.c
@@ -85,7 +85,7 @@ static u8 ide_rate_filter(ide_drive_t *drive, u8 speed)
85 mode = XFER_PIO_4; 85 mode = XFER_PIO_4;
86 } 86 }
87 87
88// printk("%s: mode 0x%02x, speed 0x%02x\n", __FUNCTION__, mode, speed); 88/* printk("%s: mode 0x%02x, speed 0x%02x\n", __func__, mode, speed); */
89 89
90 return min(speed, mode); 90 return min(speed, mode);
91} 91}
@@ -288,9 +288,10 @@ EXPORT_SYMBOL_GPL(ide_get_best_pio_mode);
288void ide_set_pio(ide_drive_t *drive, u8 req_pio) 288void ide_set_pio(ide_drive_t *drive, u8 req_pio)
289{ 289{
290 ide_hwif_t *hwif = drive->hwif; 290 ide_hwif_t *hwif = drive->hwif;
291 const struct ide_port_ops *port_ops = hwif->port_ops;
291 u8 host_pio, pio; 292 u8 host_pio, pio;
292 293
293 if (hwif->set_pio_mode == NULL || 294 if (port_ops == NULL || port_ops->set_pio_mode == NULL ||
294 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)) 295 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
295 return; 296 return;
296 297
@@ -343,29 +344,30 @@ void ide_toggle_bounce(ide_drive_t *drive, int on)
343int ide_set_pio_mode(ide_drive_t *drive, const u8 mode) 344int ide_set_pio_mode(ide_drive_t *drive, const u8 mode)
344{ 345{
345 ide_hwif_t *hwif = drive->hwif; 346 ide_hwif_t *hwif = drive->hwif;
347 const struct ide_port_ops *port_ops = hwif->port_ops;
346 348
347 if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE) 349 if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
348 return 0; 350 return 0;
349 351
350 if (hwif->set_pio_mode == NULL) 352 if (port_ops == NULL || port_ops->set_pio_mode == NULL)
351 return -1; 353 return -1;
352 354
353 /* 355 /*
354 * TODO: temporary hack for some legacy host drivers that didn't 356 * TODO: temporary hack for some legacy host drivers that didn't
355 * set transfer mode on the device in ->set_pio_mode method... 357 * set transfer mode on the device in ->set_pio_mode method...
356 */ 358 */
357 if (hwif->set_dma_mode == NULL) { 359 if (port_ops->set_dma_mode == NULL) {
358 hwif->set_pio_mode(drive, mode - XFER_PIO_0); 360 port_ops->set_pio_mode(drive, mode - XFER_PIO_0);
359 return 0; 361 return 0;
360 } 362 }
361 363
362 if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) { 364 if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) {
363 if (ide_config_drive_speed(drive, mode)) 365 if (ide_config_drive_speed(drive, mode))
364 return -1; 366 return -1;
365 hwif->set_pio_mode(drive, mode - XFER_PIO_0); 367 port_ops->set_pio_mode(drive, mode - XFER_PIO_0);
366 return 0; 368 return 0;
367 } else { 369 } else {
368 hwif->set_pio_mode(drive, mode - XFER_PIO_0); 370 port_ops->set_pio_mode(drive, mode - XFER_PIO_0);
369 return ide_config_drive_speed(drive, mode); 371 return ide_config_drive_speed(drive, mode);
370 } 372 }
371} 373}
@@ -373,20 +375,21 @@ int ide_set_pio_mode(ide_drive_t *drive, const u8 mode)
373int ide_set_dma_mode(ide_drive_t *drive, const u8 mode) 375int ide_set_dma_mode(ide_drive_t *drive, const u8 mode)
374{ 376{
375 ide_hwif_t *hwif = drive->hwif; 377 ide_hwif_t *hwif = drive->hwif;
378 const struct ide_port_ops *port_ops = hwif->port_ops;
376 379
377 if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE) 380 if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
378 return 0; 381 return 0;
379 382
380 if (hwif->set_dma_mode == NULL) 383 if (port_ops == NULL || port_ops->set_dma_mode == NULL)
381 return -1; 384 return -1;
382 385
383 if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) { 386 if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) {
384 if (ide_config_drive_speed(drive, mode)) 387 if (ide_config_drive_speed(drive, mode))
385 return -1; 388 return -1;
386 hwif->set_dma_mode(drive, mode); 389 port_ops->set_dma_mode(drive, mode);
387 return 0; 390 return 0;
388 } else { 391 } else {
389 hwif->set_dma_mode(drive, mode); 392 port_ops->set_dma_mode(drive, mode);
390 return ide_config_drive_speed(drive, mode); 393 return ide_config_drive_speed(drive, mode);
391 } 394 }
392} 395}
@@ -406,8 +409,9 @@ EXPORT_SYMBOL_GPL(ide_set_dma_mode);
406int ide_set_xfer_rate(ide_drive_t *drive, u8 rate) 409int ide_set_xfer_rate(ide_drive_t *drive, u8 rate)
407{ 410{
408 ide_hwif_t *hwif = drive->hwif; 411 ide_hwif_t *hwif = drive->hwif;
412 const struct ide_port_ops *port_ops = hwif->port_ops;
409 413
410 if (hwif->set_dma_mode == NULL || 414 if (port_ops == NULL || port_ops->set_dma_mode == NULL ||
411 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)) 415 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
412 return -1; 416 return -1;
413 417
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c
index 8a178a55a027..10c20e9a5785 100644
--- a/drivers/ide/ide-pnp.c
+++ b/drivers/ide/ide-pnp.c
@@ -18,6 +18,8 @@
18#include <linux/pnp.h> 18#include <linux/pnp.h>
19#include <linux/ide.h> 19#include <linux/ide.h>
20 20
21#define DRV_NAME "ide-pnp"
22
21/* Add your devices here :)) */ 23/* Add your devices here :)) */
22static struct pnp_device_id idepnp_devices[] = { 24static struct pnp_device_id idepnp_devices[] = {
23 /* Generic ESDI/IDE/ATA compatible hard disk controller */ 25 /* Generic ESDI/IDE/ATA compatible hard disk controller */
@@ -29,13 +31,29 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
29{ 31{
30 hw_regs_t hw; 32 hw_regs_t hw;
31 ide_hwif_t *hwif; 33 ide_hwif_t *hwif;
34 unsigned long base, ctl;
32 35
33 if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) 36 if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0)))
34 return -1; 37 return -1;
35 38
39 base = pnp_port_start(dev, 0);
40 ctl = pnp_port_start(dev, 1);
41
42 if (!request_region(base, 8, DRV_NAME)) {
43 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
44 DRV_NAME, base, base + 7);
45 return -EBUSY;
46 }
47
48 if (!request_region(ctl, 1, DRV_NAME)) {
49 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
50 DRV_NAME, ctl);
51 release_region(base, 8);
52 return -EBUSY;
53 }
54
36 memset(&hw, 0, sizeof(hw)); 55 memset(&hw, 0, sizeof(hw));
37 ide_std_init_ports(&hw, pnp_port_start(dev, 0), 56 ide_std_init_ports(&hw, base, ctl);
38 pnp_port_start(dev, 1));
39 hw.irq = pnp_irq(dev, 0); 57 hw.irq = pnp_irq(dev, 0);
40 58
41 hwif = ide_find_port(); 59 hwif = ide_find_port();
@@ -54,6 +72,9 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
54 return 0; 72 return 0;
55 } 73 }
56 74
75 release_region(ctl, 1);
76 release_region(base, 8);
77
57 return -1; 78 return -1;
58} 79}
59 80
@@ -65,6 +86,9 @@ static void idepnp_remove(struct pnp_dev *dev)
65 ide_unregister(hwif->index); 86 ide_unregister(hwif->index);
66 else 87 else
67 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); 88 printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
89
90 release_region(pnp_port_start(dev, 1), 1);
91 release_region(pnp_port_start(dev, 0), 8);
68} 92}
69 93
70static struct pnp_driver idepnp_driver = { 94static struct pnp_driver idepnp_driver = {
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 875429728021..a4b65b321f51 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -644,7 +644,7 @@ static int ide_register_port(ide_hwif_t *hwif)
644 ret = device_register(&hwif->gendev); 644 ret = device_register(&hwif->gendev);
645 if (ret < 0) { 645 if (ret < 0) {
646 printk(KERN_WARNING "IDE: %s: device_register error: %d\n", 646 printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
647 __FUNCTION__, ret); 647 __func__, ret);
648 goto out; 648 goto out;
649 } 649 }
650 650
@@ -773,8 +773,7 @@ static int ide_probe_port(ide_hwif_t *hwif)
773 773
774 BUG_ON(hwif->present); 774 BUG_ON(hwif->present);
775 775
776 if (hwif->noprobe || 776 if (hwif->drives[0].noprobe && hwif->drives[1].noprobe)
777 (hwif->drives[0].noprobe && hwif->drives[1].noprobe))
778 return -EACCES; 777 return -EACCES;
779 778
780 /* 779 /*
@@ -821,13 +820,14 @@ static int ide_probe_port(ide_hwif_t *hwif)
821 820
822static void ide_port_tune_devices(ide_hwif_t *hwif) 821static void ide_port_tune_devices(ide_hwif_t *hwif)
823{ 822{
823 const struct ide_port_ops *port_ops = hwif->port_ops;
824 int unit; 824 int unit;
825 825
826 for (unit = 0; unit < MAX_DRIVES; unit++) { 826 for (unit = 0; unit < MAX_DRIVES; unit++) {
827 ide_drive_t *drive = &hwif->drives[unit]; 827 ide_drive_t *drive = &hwif->drives[unit];
828 828
829 if (drive->present && hwif->quirkproc) 829 if (drive->present && port_ops && port_ops->quirkproc)
830 hwif->quirkproc(drive); 830 port_ops->quirkproc(drive);
831 } 831 }
832 832
833 for (unit = 0; unit < MAX_DRIVES; ++unit) { 833 for (unit = 0; unit < MAX_DRIVES; ++unit) {
@@ -843,7 +843,7 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
843 843
844 drive->nice1 = 1; 844 drive->nice1 = 1;
845 845
846 if (hwif->dma_host_set) 846 if (hwif->dma_ops)
847 ide_set_dma(drive); 847 ide_set_dma(drive);
848 } 848 }
849 } 849 }
@@ -1324,6 +1324,7 @@ static void hwif_register_devices(ide_hwif_t *hwif)
1324 1324
1325static void ide_port_init_devices(ide_hwif_t *hwif) 1325static void ide_port_init_devices(ide_hwif_t *hwif)
1326{ 1326{
1327 const struct ide_port_ops *port_ops = hwif->port_ops;
1327 int i; 1328 int i;
1328 1329
1329 for (i = 0; i < MAX_DRIVES; i++) { 1330 for (i = 0; i < MAX_DRIVES; i++) {
@@ -1339,8 +1340,8 @@ static void ide_port_init_devices(ide_hwif_t *hwif)
1339 drive->autotune = 1; 1340 drive->autotune = 1;
1340 } 1341 }
1341 1342
1342 if (hwif->port_init_devs) 1343 if (port_ops && port_ops->port_init_devs)
1343 hwif->port_init_devs(hwif); 1344 port_ops->port_init_devs(hwif);
1344} 1345}
1345 1346
1346static void ide_init_port(ide_hwif_t *hwif, unsigned int port, 1347static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
@@ -1355,9 +1356,6 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1355 if (d->init_iops) 1356 if (d->init_iops)
1356 d->init_iops(hwif); 1357 d->init_iops(hwif);
1357 1358
1358 if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0)
1359 ide_hwif_setup_dma(hwif, d);
1360
1361 if ((!hwif->irq && (d->host_flags & IDE_HFLAG_LEGACY_IRQS)) || 1359 if ((!hwif->irq && (d->host_flags & IDE_HFLAG_LEGACY_IRQS)) ||
1362 (d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS)) 1360 (d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS))
1363 hwif->irq = port ? 15 : 14; 1361 hwif->irq = port ? 15 : 14;
@@ -1365,16 +1363,36 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1365 hwif->host_flags = d->host_flags; 1363 hwif->host_flags = d->host_flags;
1366 hwif->pio_mask = d->pio_mask; 1364 hwif->pio_mask = d->pio_mask;
1367 1365
1368 if ((d->host_flags & IDE_HFLAG_SERIALIZE) && hwif->mate) 1366 /* ->set_pio_mode for DTC2278 is currently limited to port 0 */
1369 hwif->mate->serialized = hwif->serialized = 1; 1367 if (hwif->chipset != ide_dtc2278 || hwif->channel == 0)
1368 hwif->port_ops = d->port_ops;
1369
1370 if ((d->host_flags & IDE_HFLAG_SERIALIZE) ||
1371 ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base)) {
1372 if (hwif->mate)
1373 hwif->mate->serialized = hwif->serialized = 1;
1374 }
1370 1375
1371 hwif->swdma_mask = d->swdma_mask; 1376 hwif->swdma_mask = d->swdma_mask;
1372 hwif->mwdma_mask = d->mwdma_mask; 1377 hwif->mwdma_mask = d->mwdma_mask;
1373 hwif->ultra_mask = d->udma_mask; 1378 hwif->ultra_mask = d->udma_mask;
1374 1379
1375 /* reset DMA masks only for SFF-style DMA controllers */ 1380 if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0) {
1376 if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) 1381 int rc;
1377 hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; 1382
1383 if (d->init_dma)
1384 rc = d->init_dma(hwif, d);
1385 else
1386 rc = ide_hwif_setup_dma(hwif, d);
1387
1388 if (rc < 0) {
1389 printk(KERN_INFO "%s: DMA disabled\n", hwif->name);
1390 hwif->swdma_mask = 0;
1391 hwif->mwdma_mask = 0;
1392 hwif->ultra_mask = 0;
1393 } else if (d->dma_ops)
1394 hwif->dma_ops = d->dma_ops;
1395 }
1378 1396
1379 if (d->host_flags & IDE_HFLAG_RQSIZE_256) 1397 if (d->host_flags & IDE_HFLAG_RQSIZE_256)
1380 hwif->rqsize = 256; 1398 hwif->rqsize = 256;
@@ -1386,9 +1404,11 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1386 1404
1387static void ide_port_cable_detect(ide_hwif_t *hwif) 1405static void ide_port_cable_detect(ide_hwif_t *hwif)
1388{ 1406{
1389 if (hwif->cable_detect && (hwif->ultra_mask & 0x78)) { 1407 const struct ide_port_ops *port_ops = hwif->port_ops;
1408
1409 if (port_ops && port_ops->cable_detect && (hwif->ultra_mask & 0x78)) {
1390 if (hwif->cbl != ATA_CBL_PATA40_SHORT) 1410 if (hwif->cbl != ATA_CBL_PATA40_SHORT)
1391 hwif->cbl = hwif->cable_detect(hwif); 1411 hwif->cbl = port_ops->cable_detect(hwif);
1392 } 1412 }
1393} 1413}
1394 1414
@@ -1523,25 +1543,15 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1523 1543
1524 hwif = &ide_hwifs[idx[i]]; 1544 hwif = &ide_hwifs[idx[i]];
1525 1545
1526 if ((hwif->chipset != ide_4drives || !hwif->mate || 1546 if (ide_probe_port(hwif) == 0)
1527 !hwif->mate->present) && ide_hwif_request_regions(hwif)) { 1547 hwif->present = 1;
1528 printk(KERN_ERR "%s: ports already in use, "
1529 "skipping probe\n", hwif->name);
1530 continue;
1531 }
1532
1533 if (ide_probe_port(hwif) < 0) {
1534 ide_hwif_release_regions(hwif);
1535 continue;
1536 }
1537
1538 hwif->present = 1;
1539 1548
1540 if (hwif->chipset != ide_4drives || !hwif->mate || 1549 if (hwif->chipset != ide_4drives || !hwif->mate ||
1541 !hwif->mate->present) 1550 !hwif->mate->present)
1542 ide_register_port(hwif); 1551 ide_register_port(hwif);
1543 1552
1544 ide_port_tune_devices(hwif); 1553 if (hwif->present)
1554 ide_port_tune_devices(hwif);
1545 } 1555 }
1546 1556
1547 for (i = 0; i < MAX_HWIFS; i++) { 1557 for (i = 0; i < MAX_HWIFS; i++) {
@@ -1550,9 +1560,6 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1550 1560
1551 hwif = &ide_hwifs[idx[i]]; 1561 hwif = &ide_hwifs[idx[i]];
1552 1562
1553 if (!hwif->present)
1554 continue;
1555
1556 if (hwif_init(hwif) == 0) { 1563 if (hwif_init(hwif) == 0) {
1557 printk(KERN_INFO "%s: failed to initialize IDE " 1564 printk(KERN_INFO "%s: failed to initialize IDE "
1558 "interface\n", hwif->name); 1565 "interface\n", hwif->name);
@@ -1561,10 +1568,13 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1561 continue; 1568 continue;
1562 } 1569 }
1563 1570
1564 ide_port_setup_devices(hwif); 1571 if (hwif->present)
1572 ide_port_setup_devices(hwif);
1565 1573
1566 ide_acpi_init(hwif); 1574 ide_acpi_init(hwif);
1567 ide_acpi_port_init_devices(hwif); 1575
1576 if (hwif->present)
1577 ide_acpi_port_init_devices(hwif);
1568 } 1578 }
1569 1579
1570 for (i = 0; i < MAX_HWIFS; i++) { 1580 for (i = 0; i < MAX_HWIFS; i++) {
@@ -1573,11 +1583,11 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1573 1583
1574 hwif = &ide_hwifs[idx[i]]; 1584 hwif = &ide_hwifs[idx[i]];
1575 1585
1576 if (hwif->present) { 1586 if (hwif->chipset == ide_unknown)
1577 if (hwif->chipset == ide_unknown) 1587 hwif->chipset = ide_generic;
1578 hwif->chipset = ide_generic; 1588
1589 if (hwif->present)
1579 hwif_register_devices(hwif); 1590 hwif_register_devices(hwif);
1580 }
1581 } 1591 }
1582 1592
1583 for (i = 0; i < MAX_HWIFS; i++) { 1593 for (i = 0; i < MAX_HWIFS; i++) {
@@ -1586,11 +1596,11 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1586 1596
1587 hwif = &ide_hwifs[idx[i]]; 1597 hwif = &ide_hwifs[idx[i]];
1588 1598
1589 if (hwif->present) { 1599 ide_sysfs_register_port(hwif);
1590 ide_sysfs_register_port(hwif); 1600 ide_proc_register_port(hwif);
1591 ide_proc_register_port(hwif); 1601
1602 if (hwif->present)
1592 ide_proc_port_register_devices(hwif); 1603 ide_proc_port_register_devices(hwif);
1593 }
1594 } 1604 }
1595 1605
1596 return rc; 1606 return rc;
@@ -1626,3 +1636,67 @@ void ide_port_scan(ide_hwif_t *hwif)
1626 ide_proc_port_register_devices(hwif); 1636 ide_proc_port_register_devices(hwif);
1627} 1637}
1628EXPORT_SYMBOL_GPL(ide_port_scan); 1638EXPORT_SYMBOL_GPL(ide_port_scan);
1639
1640static void ide_legacy_init_one(u8 *idx, hw_regs_t *hw, u8 port_no,
1641 const struct ide_port_info *d,
1642 unsigned long config)
1643{
1644 ide_hwif_t *hwif;
1645 unsigned long base, ctl;
1646 int irq;
1647
1648 if (port_no == 0) {
1649 base = 0x1f0;
1650 ctl = 0x3f6;
1651 irq = 14;
1652 } else {
1653 base = 0x170;
1654 ctl = 0x376;
1655 irq = 15;
1656 }
1657
1658 if (!request_region(base, 8, d->name)) {
1659 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
1660 d->name, base, base + 7);
1661 return;
1662 }
1663
1664 if (!request_region(ctl, 1, d->name)) {
1665 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
1666 d->name, ctl);
1667 release_region(base, 8);
1668 return;
1669 }
1670
1671 ide_std_init_ports(hw, base, ctl);
1672 hw->irq = irq;
1673
1674 hwif = ide_find_port_slot(d);
1675 if (hwif) {
1676 ide_init_port_hw(hwif, hw);
1677 if (config)
1678 hwif->config_data = config;
1679 idx[port_no] = hwif->index;
1680 }
1681}
1682
1683int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config)
1684{
1685 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
1686 hw_regs_t hw[2];
1687
1688 memset(&hw, 0, sizeof(hw));
1689
1690 if ((d->host_flags & IDE_HFLAG_QD_2ND_PORT) == 0)
1691 ide_legacy_init_one(idx, &hw[0], 0, d, config);
1692 ide_legacy_init_one(idx, &hw[1], 1, d, config);
1693
1694 if (idx[0] == 0xff && idx[1] == 0xff &&
1695 (d->host_flags & IDE_HFLAG_SINGLE))
1696 return -ENOENT;
1697
1698 ide_device_add(idx, d);
1699
1700 return 0;
1701}
1702EXPORT_SYMBOL_GPL(ide_legacy_device_add);
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
index 5d3562b45039..d9d98ac85b29 100644
--- a/drivers/ide/ide-proc.c
+++ b/drivers/ide/ide-proc.c
@@ -599,14 +599,14 @@ static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
599 err = device_attach(dev); 599 err = device_attach(dev);
600 if (err < 0) 600 if (err < 0)
601 printk(KERN_WARNING "IDE: %s: device_attach error: %d\n", 601 printk(KERN_WARNING "IDE: %s: device_attach error: %d\n",
602 __FUNCTION__, err); 602 __func__, err);
603 drive->driver_req[0] = 0; 603 drive->driver_req[0] = 0;
604 if (dev->driver == NULL) { 604 if (dev->driver == NULL) {
605 err = device_attach(dev); 605 err = device_attach(dev);
606 if (err < 0) 606 if (err < 0)
607 printk(KERN_WARNING 607 printk(KERN_WARNING
608 "IDE: %s: device_attach(2) error: %d\n", 608 "IDE: %s: device_attach(2) error: %d\n",
609 __FUNCTION__, err); 609 __func__, err);
610 } 610 }
611 if (dev->driver && !strcmp(dev->driver->name, driver)) 611 if (dev->driver && !strcmp(dev->driver->name, driver))
612 ret = 0; 612 ret = 0;
@@ -820,7 +820,7 @@ static int ide_drivers_show(struct seq_file *s, void *p)
820 err = bus_for_each_drv(&ide_bus_type, NULL, s, proc_print_driver); 820 err = bus_for_each_drv(&ide_bus_type, NULL, s, proc_print_driver);
821 if (err < 0) 821 if (err < 0)
822 printk(KERN_WARNING "IDE: %s: bus_for_each_drv error: %d\n", 822 printk(KERN_WARNING "IDE: %s: bus_for_each_drv error: %d\n",
823 __FUNCTION__, err); 823 __func__, err);
824 return 0; 824 return 0;
825} 825}
826 826
diff --git a/drivers/ide/ide-scan-pci.c b/drivers/ide/ide-scan-pci.c
index 98888da1b600..0e79efff1deb 100644
--- a/drivers/ide/ide-scan-pci.c
+++ b/drivers/ide/ide-scan-pci.c
@@ -102,7 +102,7 @@ static int __init ide_scan_pcibus(void)
102 if (__pci_register_driver(d, d->driver.owner, 102 if (__pci_register_driver(d, d->driver.owner,
103 d->driver.mod_name)) 103 d->driver.mod_name))
104 printk(KERN_ERR "%s: failed to register %s driver\n", 104 printk(KERN_ERR "%s: failed to register %s driver\n",
105 __FUNCTION__, d->driver.mod_name); 105 __func__, d->driver.mod_name);
106 } 106 }
107 107
108 return 0; 108 return 0;
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index f43fd070f1b6..d3d8b8d5157c 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -993,7 +993,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
993 stat = ide_read_status(drive); 993 stat = ide_read_status(drive);
994 994
995 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { 995 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
996 if (hwif->ide_dma_end(drive) || (stat & ERR_STAT)) { 996 if (hwif->dma_ops->dma_end(drive) || (stat & ERR_STAT)) {
997 /* 997 /*
998 * A DMA error is sometimes expected. For example, 998 * A DMA error is sometimes expected. For example,
999 * if the tape is crossing a filemark during a 999 * if the tape is crossing a filemark during a
@@ -1213,7 +1213,7 @@ static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
1213#ifdef CONFIG_BLK_DEV_IDEDMA 1213#ifdef CONFIG_BLK_DEV_IDEDMA
1214 /* Begin DMA, if necessary */ 1214 /* Begin DMA, if necessary */
1215 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) 1215 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS)
1216 hwif->dma_start(drive); 1216 hwif->dma_ops->dma_start(drive);
1217#endif 1217#endif
1218 /* Send the actual packet */ 1218 /* Send the actual packet */
1219 HWIF(drive)->atapi_output_bytes(drive, pc->c, 12); 1219 HWIF(drive)->atapi_output_bytes(drive, pc->c, 12);
@@ -1279,7 +1279,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
1279 ide_dma_off(drive); 1279 ide_dma_off(drive);
1280 } 1280 }
1281 if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) 1281 if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma)
1282 dma_ok = !hwif->dma_setup(drive); 1282 dma_ok = !hwif->dma_ops->dma_setup(drive);
1283 1283
1284 ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | 1284 ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK |
1285 IDE_TFLAG_OUT_DEVICE, bcount, dma_ok); 1285 IDE_TFLAG_OUT_DEVICE, bcount, dma_ok);
@@ -1605,14 +1605,6 @@ out:
1605} 1605}
1606 1606
1607/* Pipeline related functions */ 1607/* Pipeline related functions */
1608static inline int idetape_pipeline_active(idetape_tape_t *tape)
1609{
1610 int rc1, rc2;
1611
1612 rc1 = test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
1613 rc2 = (tape->active_data_rq != NULL);
1614 return rc1;
1615}
1616 1608
1617/* 1609/*
1618 * The function below uses __get_free_page to allocate a pipeline stage, along 1610 * The function below uses __get_free_page to allocate a pipeline stage, along
@@ -2058,7 +2050,7 @@ static int __idetape_discard_read_pipeline(ide_drive_t *drive)
2058 2050
2059 spin_lock_irqsave(&tape->lock, flags); 2051 spin_lock_irqsave(&tape->lock, flags);
2060 tape->next_stage = NULL; 2052 tape->next_stage = NULL;
2061 if (idetape_pipeline_active(tape)) 2053 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags))
2062 idetape_wait_for_request(drive, tape->active_data_rq); 2054 idetape_wait_for_request(drive, tape->active_data_rq);
2063 spin_unlock_irqrestore(&tape->lock, flags); 2055 spin_unlock_irqrestore(&tape->lock, flags);
2064 2056
@@ -2131,7 +2123,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
2131 2123
2132 debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd); 2124 debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd);
2133 2125
2134 if (idetape_pipeline_active(tape)) { 2126 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2135 printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n", 2127 printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n",
2136 __func__); 2128 __func__);
2137 return (0); 2129 return (0);
@@ -2162,8 +2154,7 @@ static void idetape_plug_pipeline(ide_drive_t *drive)
2162 2154
2163 if (tape->next_stage == NULL) 2155 if (tape->next_stage == NULL)
2164 return; 2156 return;
2165 if (!idetape_pipeline_active(tape)) { 2157 if (!test_and_set_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2166 set_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
2167 idetape_activate_next_stage(drive); 2158 idetape_activate_next_stage(drive);
2168 (void) ide_do_drive_cmd(drive, tape->active_data_rq, ide_end); 2159 (void) ide_do_drive_cmd(drive, tape->active_data_rq, ide_end);
2169 } 2160 }
@@ -2242,13 +2233,14 @@ static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
2242 /* Attempt to allocate a new stage. Beware possible race conditions. */ 2233 /* Attempt to allocate a new stage. Beware possible race conditions. */
2243 while ((new_stage = idetape_kmalloc_stage(tape)) == NULL) { 2234 while ((new_stage = idetape_kmalloc_stage(tape)) == NULL) {
2244 spin_lock_irqsave(&tape->lock, flags); 2235 spin_lock_irqsave(&tape->lock, flags);
2245 if (idetape_pipeline_active(tape)) { 2236 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2246 idetape_wait_for_request(drive, tape->active_data_rq); 2237 idetape_wait_for_request(drive, tape->active_data_rq);
2247 spin_unlock_irqrestore(&tape->lock, flags); 2238 spin_unlock_irqrestore(&tape->lock, flags);
2248 } else { 2239 } else {
2249 spin_unlock_irqrestore(&tape->lock, flags); 2240 spin_unlock_irqrestore(&tape->lock, flags);
2250 idetape_plug_pipeline(drive); 2241 idetape_plug_pipeline(drive);
2251 if (idetape_pipeline_active(tape)) 2242 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE,
2243 &tape->flags))
2252 continue; 2244 continue;
2253 /* 2245 /*
2254 * The machine is short on memory. Fallback to non- 2246 * The machine is short on memory. Fallback to non-
@@ -2277,7 +2269,7 @@ static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
2277 * starting to service requests, so that we will be able to keep up with 2269 * starting to service requests, so that we will be able to keep up with
2278 * the higher speeds of the tape. 2270 * the higher speeds of the tape.
2279 */ 2271 */
2280 if (!idetape_pipeline_active(tape)) { 2272 if (!test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2281 if (tape->nr_stages >= tape->max_stages * 9 / 10 || 2273 if (tape->nr_stages >= tape->max_stages * 9 / 10 ||
2282 tape->nr_stages >= tape->max_stages - 2274 tape->nr_stages >= tape->max_stages -
2283 tape->uncontrolled_pipeline_head_speed * 3 * 1024 / 2275 tape->uncontrolled_pipeline_head_speed * 3 * 1024 /
@@ -2304,10 +2296,11 @@ static void idetape_wait_for_pipeline(ide_drive_t *drive)
2304 idetape_tape_t *tape = drive->driver_data; 2296 idetape_tape_t *tape = drive->driver_data;
2305 unsigned long flags; 2297 unsigned long flags;
2306 2298
2307 while (tape->next_stage || idetape_pipeline_active(tape)) { 2299 while (tape->next_stage || test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE,
2300 &tape->flags)) {
2308 idetape_plug_pipeline(drive); 2301 idetape_plug_pipeline(drive);
2309 spin_lock_irqsave(&tape->lock, flags); 2302 spin_lock_irqsave(&tape->lock, flags);
2310 if (idetape_pipeline_active(tape)) 2303 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags))
2311 idetape_wait_for_request(drive, tape->active_data_rq); 2304 idetape_wait_for_request(drive, tape->active_data_rq);
2312 spin_unlock_irqrestore(&tape->lock, flags); 2305 spin_unlock_irqrestore(&tape->lock, flags);
2313 } 2306 }
@@ -2464,7 +2457,7 @@ static int idetape_init_read(ide_drive_t *drive, int max_stages)
2464 new_stage = idetape_kmalloc_stage(tape); 2457 new_stage = idetape_kmalloc_stage(tape);
2465 } 2458 }
2466 } 2459 }
2467 if (!idetape_pipeline_active(tape)) { 2460 if (!test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2468 if (tape->nr_pending_stages >= 3 * max_stages / 4) { 2461 if (tape->nr_pending_stages >= 3 * max_stages / 4) {
2469 tape->measure_insert_time = 1; 2462 tape->measure_insert_time = 1;
2470 tape->insert_time = jiffies; 2463 tape->insert_time = jiffies;
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 155cc904f4eb..a317ca9c46e5 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -135,6 +135,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
135 ide_hwif_t *hwif = HWIF(drive); 135 ide_hwif_t *hwif = HWIF(drive);
136 struct ide_taskfile *tf = &task->tf; 136 struct ide_taskfile *tf = &task->tf;
137 ide_handler_t *handler = NULL; 137 ide_handler_t *handler = NULL;
138 const struct ide_dma_ops *dma_ops = hwif->dma_ops;
138 139
139 if (task->data_phase == TASKFILE_MULTI_IN || 140 if (task->data_phase == TASKFILE_MULTI_IN ||
140 task->data_phase == TASKFILE_MULTI_OUT) { 141 task->data_phase == TASKFILE_MULTI_OUT) {
@@ -178,10 +179,10 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
178 return ide_started; 179 return ide_started;
179 default: 180 default:
180 if (task_dma_ok(task) == 0 || drive->using_dma == 0 || 181 if (task_dma_ok(task) == 0 || drive->using_dma == 0 ||
181 hwif->dma_setup(drive)) 182 dma_ops->dma_setup(drive))
182 return ide_stopped; 183 return ide_stopped;
183 hwif->dma_exec_cmd(drive, tf->command); 184 dma_ops->dma_exec_cmd(drive, tf->command);
184 hwif->dma_start(drive); 185 dma_ops->dma_start(drive);
185 return ide_started; 186 return ide_started;
186 } 187 }
187} 188}
@@ -455,7 +456,7 @@ static ide_startstop_t task_in_intr(ide_drive_t *drive)
455 456
456 /* Error? */ 457 /* Error? */
457 if (stat & ERR_STAT) 458 if (stat & ERR_STAT)
458 return task_error(drive, rq, __FUNCTION__, stat); 459 return task_error(drive, rq, __func__, stat);
459 460
460 /* Didn't want any data? Odd. */ 461 /* Didn't want any data? Odd. */
461 if (!(stat & DRQ_STAT)) 462 if (!(stat & DRQ_STAT))
@@ -467,7 +468,7 @@ static ide_startstop_t task_in_intr(ide_drive_t *drive)
467 if (!hwif->nleft) { 468 if (!hwif->nleft) {
468 stat = wait_drive_not_busy(drive); 469 stat = wait_drive_not_busy(drive);
469 if (!OK_STAT(stat, 0, BAD_STAT)) 470 if (!OK_STAT(stat, 0, BAD_STAT))
470 return task_error(drive, rq, __FUNCTION__, stat); 471 return task_error(drive, rq, __func__, stat);
471 task_end_request(drive, rq, stat); 472 task_end_request(drive, rq, stat);
472 return ide_stopped; 473 return ide_stopped;
473 } 474 }
@@ -488,11 +489,11 @@ static ide_startstop_t task_out_intr (ide_drive_t *drive)
488 u8 stat = ide_read_status(drive); 489 u8 stat = ide_read_status(drive);
489 490
490 if (!OK_STAT(stat, DRIVE_READY, drive->bad_wstat)) 491 if (!OK_STAT(stat, DRIVE_READY, drive->bad_wstat))
491 return task_error(drive, rq, __FUNCTION__, stat); 492 return task_error(drive, rq, __func__, stat);
492 493
493 /* Deal with unexpected ATA data phase. */ 494 /* Deal with unexpected ATA data phase. */
494 if (((stat & DRQ_STAT) == 0) ^ !hwif->nleft) 495 if (((stat & DRQ_STAT) == 0) ^ !hwif->nleft)
495 return task_error(drive, rq, __FUNCTION__, stat); 496 return task_error(drive, rq, __func__, stat);
496 497
497 if (!hwif->nleft) { 498 if (!hwif->nleft) {
498 task_end_request(drive, rq, stat); 499 task_end_request(drive, rq, stat);
@@ -675,7 +676,7 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
675 /* (hs): give up if multcount is not set */ 676 /* (hs): give up if multcount is not set */
676 printk(KERN_ERR "%s: %s Multimode Write " \ 677 printk(KERN_ERR "%s: %s Multimode Write " \
677 "multcount is not set\n", 678 "multcount is not set\n",
678 drive->name, __FUNCTION__); 679 drive->name, __func__);
679 err = -EPERM; 680 err = -EPERM;
680 goto abort; 681 goto abort;
681 } 682 }
@@ -692,7 +693,7 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
692 /* (hs): give up if multcount is not set */ 693 /* (hs): give up if multcount is not set */
693 printk(KERN_ERR "%s: %s Multimode Read failure " \ 694 printk(KERN_ERR "%s: %s Multimode Read failure " \
694 "multcount is not set\n", 695 "multcount is not set\n",
695 drive->name, __FUNCTION__); 696 drive->name, __func__);
696 err = -EPERM; 697 err = -EPERM;
697 goto abort; 698 goto abort;
698 } 699 }
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index d868ca44d033..bced02f9f2c3 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -227,79 +227,6 @@ static int ide_system_bus_speed(void)
227 return pci_dev_present(pci_default) ? 33 : 50; 227 return pci_dev_present(pci_default) ? 33 : 50;
228} 228}
229 229
230static struct resource* hwif_request_region(ide_hwif_t *hwif,
231 unsigned long addr, int num)
232{
233 struct resource *res = request_region(addr, num, hwif->name);
234
235 if (!res)
236 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
237 hwif->name, addr, addr+num-1);
238 return res;
239}
240
241/**
242 * ide_hwif_request_regions - request resources for IDE
243 * @hwif: interface to use
244 *
245 * Requests all the needed resources for an interface.
246 * Right now core IDE code does this work which is deeply wrong.
247 * MMIO leaves it to the controller driver,
248 * PIO will migrate this way over time.
249 */
250
251int ide_hwif_request_regions(ide_hwif_t *hwif)
252{
253 unsigned long addr;
254
255 if (hwif->mmio)
256 return 0;
257
258 addr = hwif->io_ports[IDE_CONTROL_OFFSET];
259
260 if (addr && !hwif_request_region(hwif, addr, 1))
261 goto control_region_busy;
262
263 addr = hwif->io_ports[IDE_DATA_OFFSET];
264 BUG_ON((addr | 7) != hwif->io_ports[IDE_STATUS_OFFSET]);
265
266 if (!hwif_request_region(hwif, addr, 8))
267 goto data_region_busy;
268
269 return 0;
270
271data_region_busy:
272 addr = hwif->io_ports[IDE_CONTROL_OFFSET];
273 if (addr)
274 release_region(addr, 1);
275control_region_busy:
276 /* If any errors are return, we drop the hwif interface. */
277 return -EBUSY;
278}
279
280/**
281 * ide_hwif_release_regions - free IDE resources
282 *
283 * Note that we only release the standard ports,
284 * and do not even try to handle any extra ports
285 * allocated for weird IDE interface chipsets.
286 *
287 * Note also that we don't yet handle mmio resources here. More
288 * importantly our caller should be doing this so we need to
289 * restructure this as a helper function for drivers.
290 */
291
292void ide_hwif_release_regions(ide_hwif_t *hwif)
293{
294 if (hwif->mmio)
295 return;
296
297 if (hwif->io_ports[IDE_CONTROL_OFFSET])
298 release_region(hwif->io_ports[IDE_CONTROL_OFFSET], 1);
299
300 release_region(hwif->io_ports[IDE_DATA_OFFSET], 8);
301}
302
303void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) 230void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
304{ 231{
305 ide_hwgroup_t *hwgroup = hwif->hwgroup; 232 ide_hwgroup_t *hwgroup = hwif->hwgroup;
@@ -436,9 +363,7 @@ void ide_unregister(unsigned int index)
436 spin_lock_irq(&ide_lock); 363 spin_lock_irq(&ide_lock);
437 364
438 if (hwif->dma_base) 365 if (hwif->dma_base)
439 (void)ide_release_dma(hwif); 366 ide_release_dma_engine(hwif);
440
441 ide_hwif_release_regions(hwif);
442 367
443 /* restore hwif data to pristine status */ 368 /* restore hwif data to pristine status */
444 ide_init_port_data(hwif, index); 369 ide_init_port_data(hwif, index);
@@ -454,7 +379,6 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
454{ 379{
455 memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports)); 380 memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
456 hwif->irq = hw->irq; 381 hwif->irq = hw->irq;
457 hwif->noprobe = 0;
458 hwif->chipset = hw->chipset; 382 hwif->chipset = hw->chipset;
459 hwif->gendev.parent = hw->dev; 383 hwif->gendev.parent = hw->dev;
460 hwif->ack_intr = hw->ack_intr; 384 hwif->ack_intr = hw->ack_intr;
@@ -545,7 +469,7 @@ int set_using_dma(ide_drive_t *drive, int arg)
545 if (!drive->id || !(drive->id->capability & 1)) 469 if (!drive->id || !(drive->id->capability & 1))
546 goto out; 470 goto out;
547 471
548 if (hwif->dma_host_set == NULL) 472 if (hwif->dma_ops == NULL)
549 goto out; 473 goto out;
550 474
551 err = -EBUSY; 475 err = -EBUSY;
@@ -585,11 +509,12 @@ int set_pio_mode(ide_drive_t *drive, int arg)
585{ 509{
586 struct request rq; 510 struct request rq;
587 ide_hwif_t *hwif = drive->hwif; 511 ide_hwif_t *hwif = drive->hwif;
512 const struct ide_port_ops *port_ops = hwif->port_ops;
588 513
589 if (arg < 0 || arg > 255) 514 if (arg < 0 || arg > 255)
590 return -EINVAL; 515 return -EINVAL;
591 516
592 if (hwif->set_pio_mode == NULL || 517 if (port_ops == NULL || port_ops->set_pio_mode == NULL ||
593 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)) 518 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
594 return -ENOSYS; 519 return -ENOSYS;
595 520
@@ -1005,14 +930,12 @@ static int __init ide_setup(char *s)
1005 goto done; 930 goto done;
1006 case -3: /* "nowerr" */ 931 case -3: /* "nowerr" */
1007 drive->bad_wstat = BAD_R_STAT; 932 drive->bad_wstat = BAD_R_STAT;
1008 hwif->noprobe = 0;
1009 goto done; 933 goto done;
1010 case -4: /* "cdrom" */ 934 case -4: /* "cdrom" */
1011 drive->present = 1; 935 drive->present = 1;
1012 drive->media = ide_cdrom; 936 drive->media = ide_cdrom;
1013 /* an ATAPI device ignores DRDY */ 937 /* an ATAPI device ignores DRDY */
1014 drive->ready_stat = 0; 938 drive->ready_stat = 0;
1015 hwif->noprobe = 0;
1016 goto done; 939 goto done;
1017 case -5: /* nodma */ 940 case -5: /* nodma */
1018 drive->nodma = 1; 941 drive->nodma = 1;
@@ -1043,7 +966,6 @@ static int __init ide_setup(char *s)
1043 drive->sect = drive->bios_sect = vals[2]; 966 drive->sect = drive->bios_sect = vals[2];
1044 drive->present = 1; 967 drive->present = 1;
1045 drive->forced_geom = 1; 968 drive->forced_geom = 1;
1046 hwif->noprobe = 0;
1047 goto done; 969 goto done;
1048 default: 970 default:
1049 goto bad_option; 971 goto bad_option;
diff --git a/drivers/ide/legacy/ali14xx.c b/drivers/ide/legacy/ali14xx.c
index 33bb7b87be5d..6efbf947c6db 100644
--- a/drivers/ide/legacy/ali14xx.c
+++ b/drivers/ide/legacy/ali14xx.c
@@ -49,6 +49,8 @@
49 49
50#include <asm/io.h> 50#include <asm/io.h>
51 51
52#define DRV_NAME "ali14xx"
53
52/* port addresses for auto-detection */ 54/* port addresses for auto-detection */
53#define ALI_NUM_PORTS 4 55#define ALI_NUM_PORTS 4
54static const int ports[ALI_NUM_PORTS] __initdata = 56static const int ports[ALI_NUM_PORTS] __initdata =
@@ -192,18 +194,20 @@ static int __init initRegisters(void)
192 return t; 194 return t;
193} 195}
194 196
197static const struct ide_port_ops ali14xx_port_ops = {
198 .set_pio_mode = ali14xx_set_pio_mode,
199};
200
195static const struct ide_port_info ali14xx_port_info = { 201static const struct ide_port_info ali14xx_port_info = {
202 .name = DRV_NAME,
196 .chipset = ide_ali14xx, 203 .chipset = ide_ali14xx,
204 .port_ops = &ali14xx_port_ops,
197 .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE, 205 .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
198 .pio_mask = ATA_PIO4, 206 .pio_mask = ATA_PIO4,
199}; 207};
200 208
201static int __init ali14xx_probe(void) 209static int __init ali14xx_probe(void)
202{ 210{
203 ide_hwif_t *hwif, *mate;
204 static u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
205 hw_regs_t hw[2];
206
207 printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n", 211 printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n",
208 basePort, regOn); 212 basePort, regOn);
209 213
@@ -213,31 +217,7 @@ static int __init ali14xx_probe(void)
213 return 1; 217 return 1;
214 } 218 }
215 219
216 memset(&hw, 0, sizeof(hw)); 220 return ide_legacy_device_add(&ali14xx_port_info, 0);
217
218 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
219 hw[0].irq = 14;
220
221 ide_std_init_ports(&hw[1], 0x170, 0x376);
222 hw[1].irq = 15;
223
224 hwif = ide_find_port();
225 if (hwif) {
226 ide_init_port_hw(hwif, &hw[0]);
227 hwif->set_pio_mode = &ali14xx_set_pio_mode;
228 idx[0] = hwif->index;
229 }
230
231 mate = ide_find_port();
232 if (mate) {
233 ide_init_port_hw(mate, &hw[1]);
234 mate->set_pio_mode = &ali14xx_set_pio_mode;
235 idx[1] = mate->index;
236 }
237
238 ide_device_add(idx, &ali14xx_port_info);
239
240 return 0;
241} 221}
242 222
243int probe_ali14xx; 223int probe_ali14xx;
diff --git a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c
index 6956eb8f2d5f..f51433bce8e4 100644
--- a/drivers/ide/legacy/buddha.c
+++ b/drivers/ide/legacy/buddha.c
@@ -228,8 +228,6 @@ fail_base2:
228 ide_init_port_data(hwif, index); 228 ide_init_port_data(hwif, index);
229 ide_init_port_hw(hwif, &hw); 229 ide_init_port_hw(hwif, &hw);
230 230
231 hwif->mmio = 1;
232
233 idx[i] = index; 231 idx[i] = index;
234 } 232 }
235 } 233 }
diff --git a/drivers/ide/legacy/dtc2278.c b/drivers/ide/legacy/dtc2278.c
index 9c6b3249a004..f7c4ad1c57c0 100644
--- a/drivers/ide/legacy/dtc2278.c
+++ b/drivers/ide/legacy/dtc2278.c
@@ -16,6 +16,8 @@
16 16
17#include <asm/io.h> 17#include <asm/io.h>
18 18
19#define DRV_NAME "dtc2278"
20
19/* 21/*
20 * Changing this #undef to #define may solve start up problems in some systems. 22 * Changing this #undef to #define may solve start up problems in some systems.
21 */ 23 */
@@ -86,8 +88,14 @@ static void dtc2278_set_pio_mode(ide_drive_t *drive, const u8 pio)
86 } 88 }
87} 89}
88 90
91static const struct ide_port_ops dtc2278_port_ops = {
92 .set_pio_mode = dtc2278_set_pio_mode,
93};
94
89static const struct ide_port_info dtc2278_port_info __initdata = { 95static const struct ide_port_info dtc2278_port_info __initdata = {
96 .name = DRV_NAME,
90 .chipset = ide_dtc2278, 97 .chipset = ide_dtc2278,
98 .port_ops = &dtc2278_port_ops,
91 .host_flags = IDE_HFLAG_SERIALIZE | 99 .host_flags = IDE_HFLAG_SERIALIZE |
92 IDE_HFLAG_NO_UNMASK_IRQS | 100 IDE_HFLAG_NO_UNMASK_IRQS |
93 IDE_HFLAG_IO_32BIT | 101 IDE_HFLAG_IO_32BIT |
@@ -101,9 +109,6 @@ static const struct ide_port_info dtc2278_port_info __initdata = {
101static int __init dtc2278_probe(void) 109static int __init dtc2278_probe(void)
102{ 110{
103 unsigned long flags; 111 unsigned long flags;
104 ide_hwif_t *hwif, *mate;
105 static u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
106 hw_regs_t hw[2];
107 112
108 local_irq_save(flags); 113 local_irq_save(flags);
109 /* 114 /*
@@ -123,30 +128,7 @@ static int __init dtc2278_probe(void)
123#endif 128#endif
124 local_irq_restore(flags); 129 local_irq_restore(flags);
125 130
126 memset(&hw, 0, sizeof(hw)); 131 return ide_legacy_device_add(&dtc2278_port_info, 0);
127
128 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
129 hw[0].irq = 14;
130
131 ide_std_init_ports(&hw[1], 0x170, 0x376);
132 hw[1].irq = 15;
133
134 hwif = ide_find_port();
135 if (hwif) {
136 ide_init_port_hw(hwif, &hw[0]);
137 hwif->set_pio_mode = dtc2278_set_pio_mode;
138 idx[0] = hwif->index;
139 }
140
141 mate = ide_find_port();
142 if (mate) {
143 ide_init_port_hw(mate, &hw[1]);
144 idx[1] = mate->index;
145 }
146
147 ide_device_add(idx, &dtc2278_port_info);
148
149 return 0;
150} 132}
151 133
152int probe_dtc2278 = 0; 134int probe_dtc2278 = 0;
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c
index 8c9c9f7f54ca..5c19c422c5cc 100644
--- a/drivers/ide/legacy/falconide.c
+++ b/drivers/ide/legacy/falconide.c
@@ -89,7 +89,6 @@ static int __init falconide_init(void)
89 89
90 ide_init_port_data(hwif, index); 90 ide_init_port_data(hwif, index);
91 ide_init_port_hw(hwif, &hw); 91 ide_init_port_hw(hwif, &hw);
92 hwif->mmio = 1;
93 92
94 ide_get_lock(NULL, NULL); 93 ide_get_lock(NULL, NULL);
95 ide_device_add(idx, NULL); 94 ide_device_add(idx, NULL);
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c
index fcc8d52bf2a1..a0c9601bdaf0 100644
--- a/drivers/ide/legacy/gayle.c
+++ b/drivers/ide/legacy/gayle.c
@@ -182,8 +182,6 @@ found:
182 ide_init_port_data(hwif, index); 182 ide_init_port_data(hwif, index);
183 ide_init_port_hw(hwif, &hw); 183 ide_init_port_hw(hwif, &hw);
184 184
185 hwif->mmio = 1;
186
187 idx[i] = index; 185 idx[i] = index;
188 } else 186 } else
189 release_mem_region(res_start, res_n); 187 release_mem_region(res_start, res_n);
diff --git a/drivers/ide/legacy/ht6560b.c b/drivers/ide/legacy/ht6560b.c
index 60f52f5158c9..702d8deb5780 100644
--- a/drivers/ide/legacy/ht6560b.c
+++ b/drivers/ide/legacy/ht6560b.c
@@ -328,8 +328,16 @@ int probe_ht6560b = 0;
328module_param_named(probe, probe_ht6560b, bool, 0); 328module_param_named(probe, probe_ht6560b, bool, 0);
329MODULE_PARM_DESC(probe, "probe for HT6560B chipset"); 329MODULE_PARM_DESC(probe, "probe for HT6560B chipset");
330 330
331static const struct ide_port_ops ht6560b_port_ops = {
332 .port_init_devs = ht6560b_port_init_devs,
333 .set_pio_mode = ht6560b_set_pio_mode,
334 .selectproc = ht6560b_selectproc,
335};
336
331static const struct ide_port_info ht6560b_port_info __initdata = { 337static const struct ide_port_info ht6560b_port_info __initdata = {
338 .name = DRV_NAME,
332 .chipset = ide_ht6560b, 339 .chipset = ide_ht6560b,
340 .port_ops = &ht6560b_port_ops,
333 .host_flags = IDE_HFLAG_SERIALIZE | /* is this needed? */ 341 .host_flags = IDE_HFLAG_SERIALIZE | /* is this needed? */
334 IDE_HFLAG_NO_DMA | 342 IDE_HFLAG_NO_DMA |
335 IDE_HFLAG_NO_AUTOTUNE | 343 IDE_HFLAG_NO_AUTOTUNE |
@@ -339,53 +347,21 @@ static const struct ide_port_info ht6560b_port_info __initdata = {
339 347
340static int __init ht6560b_init(void) 348static int __init ht6560b_init(void)
341{ 349{
342 ide_hwif_t *hwif, *mate;
343 static u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
344 hw_regs_t hw[2];
345
346 if (probe_ht6560b == 0) 350 if (probe_ht6560b == 0)
347 return -ENODEV; 351 return -ENODEV;
348 352
349 if (!request_region(HT_CONFIG_PORT, 1, DRV_NAME)) { 353 if (!request_region(HT_CONFIG_PORT, 1, DRV_NAME)) {
350 printk(KERN_NOTICE "%s: HT_CONFIG_PORT not found\n", 354 printk(KERN_NOTICE "%s: HT_CONFIG_PORT not found\n",
351 __FUNCTION__); 355 __func__);
352 return -ENODEV; 356 return -ENODEV;
353 } 357 }
354 358
355 if (!try_to_init_ht6560b()) { 359 if (!try_to_init_ht6560b()) {
356 printk(KERN_NOTICE "%s: HBA not found\n", __FUNCTION__); 360 printk(KERN_NOTICE "%s: HBA not found\n", __func__);
357 goto release_region; 361 goto release_region;
358 } 362 }
359 363
360 memset(&hw, 0, sizeof(hw)); 364 return ide_legacy_device_add(&ht6560b_port_info, 0);
361
362 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
363 hw[0].irq = 14;
364
365 ide_std_init_ports(&hw[1], 0x170, 0x376);
366 hw[1].irq = 15;
367
368 hwif = ide_find_port();
369 if (hwif) {
370 ide_init_port_hw(hwif, &hw[0]);
371 hwif->selectproc = ht6560b_selectproc;
372 hwif->set_pio_mode = ht6560b_set_pio_mode;
373 hwif->port_init_devs = ht6560b_port_init_devs;
374 idx[0] = hwif->index;
375 }
376
377 mate = ide_find_port();
378 if (mate) {
379 ide_init_port_hw(mate, &hw[1]);
380 mate->selectproc = ht6560b_selectproc;
381 mate->set_pio_mode = ht6560b_set_pio_mode;
382 mate->port_init_devs = ht6560b_port_init_devs;
383 idx[1] = mate->index;
384 }
385
386 ide_device_add(idx, &ht6560b_port_info);
387
388 return 0;
389 365
390release_region: 366release_region:
391 release_region(HT_CONFIG_PORT, 1); 367 release_region(HT_CONFIG_PORT, 1);
diff --git a/drivers/ide/legacy/ide-4drives.c b/drivers/ide/legacy/ide-4drives.c
index c352f12348af..17f94d0cb539 100644
--- a/drivers/ide/legacy/ide-4drives.c
+++ b/drivers/ide/legacy/ide-4drives.c
@@ -4,6 +4,8 @@
4#include <linux/module.h> 4#include <linux/module.h>
5#include <linux/ide.h> 5#include <linux/ide.h>
6 6
7#define DRV_NAME "ide-4drives"
8
7int probe_4drives; 9int probe_4drives;
8 10
9module_param_named(probe, probe_4drives, bool, 0); 11module_param_named(probe, probe_4drives, bool, 0);
@@ -12,15 +14,29 @@ MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port");
12static int __init ide_4drives_init(void) 14static int __init ide_4drives_init(void)
13{ 15{
14 ide_hwif_t *hwif, *mate; 16 ide_hwif_t *hwif, *mate;
17 unsigned long base = 0x1f0, ctl = 0x3f6;
15 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 18 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
16 hw_regs_t hw; 19 hw_regs_t hw;
17 20
18 if (probe_4drives == 0) 21 if (probe_4drives == 0)
19 return -ENODEV; 22 return -ENODEV;
20 23
24 if (!request_region(base, 8, DRV_NAME)) {
25 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
26 DRV_NAME, base, base + 7);
27 return -EBUSY;
28 }
29
30 if (!request_region(ctl, 1, DRV_NAME)) {
31 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
32 DRV_NAME, ctl);
33 release_region(base, 8);
34 return -EBUSY;
35 }
36
21 memset(&hw, 0, sizeof(hw)); 37 memset(&hw, 0, sizeof(hw));
22 38
23 ide_std_init_ports(&hw, 0x1f0, 0x3f6); 39 ide_std_init_ports(&hw, base, ctl);
24 hw.irq = 14; 40 hw.irq = 14;
25 hw.chipset = ide_4drives; 41 hw.chipset = ide_4drives;
26 42
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index b97b8d51b3eb..855e157b18d3 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -51,6 +51,8 @@
51#include <pcmcia/cisreg.h> 51#include <pcmcia/cisreg.h>
52#include <pcmcia/ciscode.h> 52#include <pcmcia/ciscode.h>
53 53
54#define DRV_NAME "ide-cs"
55
54/*====================================================================*/ 56/*====================================================================*/
55 57
56/* Module parameters */ 58/* Module parameters */
@@ -72,16 +74,11 @@ static char *version =
72 74
73/*====================================================================*/ 75/*====================================================================*/
74 76
75static const char ide_major[] = {
76 IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR,
77 IDE4_MAJOR, IDE5_MAJOR
78};
79
80typedef struct ide_info_t { 77typedef struct ide_info_t {
81 struct pcmcia_device *p_dev; 78 struct pcmcia_device *p_dev;
79 ide_hwif_t *hwif;
82 int ndev; 80 int ndev;
83 dev_node_t node; 81 dev_node_t node;
84 int hd;
85} ide_info_t; 82} ide_info_t;
86 83
87static void ide_release(struct pcmcia_device *); 84static void ide_release(struct pcmcia_device *);
@@ -136,20 +133,44 @@ static int ide_probe(struct pcmcia_device *link)
136 133
137static void ide_detach(struct pcmcia_device *link) 134static void ide_detach(struct pcmcia_device *link)
138{ 135{
136 ide_info_t *info = link->priv;
137 ide_hwif_t *hwif = info->hwif;
138
139 DEBUG(0, "ide_detach(0x%p)\n", link); 139 DEBUG(0, "ide_detach(0x%p)\n", link);
140 140
141 ide_release(link); 141 ide_release(link);
142 142
143 kfree(link->priv); 143 release_region(hwif->io_ports[IDE_CONTROL_OFFSET], 1);
144 release_region(hwif->io_ports[IDE_DATA_OFFSET], 8);
145
146 kfree(info);
144} /* ide_detach */ 147} /* ide_detach */
145 148
146static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) 149static const struct ide_port_ops idecs_port_ops = {
150 .quirkproc = ide_undecoded_slave,
151};
152
153static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl,
154 unsigned long irq, struct pcmcia_device *handle)
147{ 155{
148 ide_hwif_t *hwif; 156 ide_hwif_t *hwif;
149 hw_regs_t hw; 157 hw_regs_t hw;
150 int i; 158 int i;
151 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 159 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
152 160
161 if (!request_region(io, 8, DRV_NAME)) {
162 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
163 DRV_NAME, io, io + 7);
164 return NULL;
165 }
166
167 if (!request_region(ctl, 1, DRV_NAME)) {
168 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
169 DRV_NAME, ctl);
170 release_region(io, 8);
171 return NULL;
172 }
173
153 memset(&hw, 0, sizeof(hw)); 174 memset(&hw, 0, sizeof(hw));
154 ide_std_init_ports(&hw, io, ctl); 175 ide_std_init_ports(&hw, io, ctl);
155 hw.irq = irq; 176 hw.irq = irq;
@@ -158,7 +179,7 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq
158 179
159 hwif = ide_find_port(); 180 hwif = ide_find_port();
160 if (hwif == NULL) 181 if (hwif == NULL)
161 return -1; 182 goto out_release;
162 183
163 i = hwif->index; 184 i = hwif->index;
164 185
@@ -168,13 +189,19 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq
168 ide_init_port_data(hwif, i); 189 ide_init_port_data(hwif, i);
169 190
170 ide_init_port_hw(hwif, &hw); 191 ide_init_port_hw(hwif, &hw);
171 hwif->quirkproc = &ide_undecoded_slave; 192 hwif->port_ops = &idecs_port_ops;
172 193
173 idx[0] = i; 194 idx[0] = i;
174 195
175 ide_device_add(idx, NULL); 196 ide_device_add(idx, NULL);
176 197
177 return hwif->present ? i : -1; 198 if (hwif->present)
199 return hwif;
200
201out_release:
202 release_region(ctl, 1);
203 release_region(io, 8);
204 return NULL;
178} 205}
179 206
180/*====================================================================== 207/*======================================================================
@@ -199,8 +226,9 @@ static int ide_config(struct pcmcia_device *link)
199 cistpl_cftable_entry_t dflt; 226 cistpl_cftable_entry_t dflt;
200 } *stk = NULL; 227 } *stk = NULL;
201 cistpl_cftable_entry_t *cfg; 228 cistpl_cftable_entry_t *cfg;
202 int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0; 229 int i, pass, last_ret = 0, last_fn = 0, is_kme = 0;
203 unsigned long io_base, ctl_base; 230 unsigned long io_base, ctl_base;
231 ide_hwif_t *hwif;
204 232
205 DEBUG(0, "ide_config(0x%p)\n", link); 233 DEBUG(0, "ide_config(0x%p)\n", link);
206 234
@@ -296,14 +324,15 @@ static int ide_config(struct pcmcia_device *link)
296 outb(0x81, ctl_base+1); 324 outb(0x81, ctl_base+1);
297 325
298 /* retry registration in case device is still spinning up */ 326 /* retry registration in case device is still spinning up */
299 for (hd = -1, i = 0; i < 10; i++) { 327 for (i = 0; i < 10; i++) {
300 hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); 328 hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link);
301 if (hd >= 0) break; 329 if (hwif)
330 break;
302 if (link->io.NumPorts1 == 0x20) { 331 if (link->io.NumPorts1 == 0x20) {
303 outb(0x02, ctl_base + 0x10); 332 outb(0x02, ctl_base + 0x10);
304 hd = idecs_register(io_base + 0x10, ctl_base + 0x10, 333 hwif = idecs_register(io_base + 0x10, ctl_base + 0x10,
305 link->irq.AssignedIRQ, link); 334 link->irq.AssignedIRQ, link);
306 if (hd >= 0) { 335 if (hwif) {
307 io_base += 0x10; 336 io_base += 0x10;
308 ctl_base += 0x10; 337 ctl_base += 0x10;
309 break; 338 break;
@@ -312,7 +341,7 @@ static int ide_config(struct pcmcia_device *link)
312 msleep(100); 341 msleep(100);
313 } 342 }
314 343
315 if (hd < 0) { 344 if (hwif == NULL) {
316 printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx" 345 printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx"
317 ", irq %u failed\n", io_base, ctl_base, 346 ", irq %u failed\n", io_base, ctl_base,
318 link->irq.AssignedIRQ); 347 link->irq.AssignedIRQ);
@@ -320,10 +349,10 @@ static int ide_config(struct pcmcia_device *link)
320 } 349 }
321 350
322 info->ndev = 1; 351 info->ndev = 1;
323 sprintf(info->node.dev_name, "hd%c", 'a' + (hd * 2)); 352 sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2);
324 info->node.major = ide_major[hd]; 353 info->node.major = hwif->major;
325 info->node.minor = 0; 354 info->node.minor = 0;
326 info->hd = hd; 355 info->hwif = hwif;
327 link->dev_node = &info->node; 356 link->dev_node = &info->node;
328 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n", 357 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n",
329 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10); 358 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10);
@@ -354,13 +383,14 @@ failed:
354void ide_release(struct pcmcia_device *link) 383void ide_release(struct pcmcia_device *link)
355{ 384{
356 ide_info_t *info = link->priv; 385 ide_info_t *info = link->priv;
386 ide_hwif_t *hwif = info->hwif;
357 387
358 DEBUG(0, "ide_release(0x%p)\n", link); 388 DEBUG(0, "ide_release(0x%p)\n", link);
359 389
360 if (info->ndev) { 390 if (info->ndev) {
361 /* FIXME: if this fails we need to queue the cleanup somehow 391 /* FIXME: if this fails we need to queue the cleanup somehow
362 -- need to investigate the required PCMCIA magic */ 392 -- need to investigate the required PCMCIA magic */
363 ide_unregister(info->hd); 393 ide_unregister(hwif->index);
364 } 394 }
365 info->ndev = 0; 395 info->ndev = 0;
366 396
diff --git a/drivers/ide/legacy/ide_platform.c b/drivers/ide/legacy/ide_platform.c
index bf240775531e..822f48b05c70 100644
--- a/drivers/ide/legacy/ide_platform.c
+++ b/drivers/ide/legacy/ide_platform.c
@@ -100,7 +100,6 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
100 hw.dev = &pdev->dev; 100 hw.dev = &pdev->dev;
101 101
102 ide_init_port_hw(hwif, &hw); 102 ide_init_port_hw(hwif, &hw);
103 hwif->mmio = 1;
104 103
105 if (mmio) 104 if (mmio)
106 default_hwif_mmiops(hwif); 105 default_hwif_mmiops(hwif);
diff --git a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c
index 7429b80cb089..26546d0afc7f 100644
--- a/drivers/ide/legacy/macide.c
+++ b/drivers/ide/legacy/macide.c
@@ -128,8 +128,6 @@ static int __init macide_init(void)
128 ide_init_port_data(hwif, index); 128 ide_init_port_data(hwif, index);
129 ide_init_port_hw(hwif, &hw); 129 ide_init_port_hw(hwif, &hw);
130 130
131 hwif->mmio = 1;
132
133 ide_device_add(idx, NULL); 131 ide_device_add(idx, NULL);
134 } 132 }
135 133
diff --git a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c
index fcbff0eced1b..f23999dd3d46 100644
--- a/drivers/ide/legacy/q40ide.c
+++ b/drivers/ide/legacy/q40ide.c
@@ -141,7 +141,6 @@ static int __init q40ide_init(void)
141 if (hwif) { 141 if (hwif) {
142 ide_init_port_data(hwif, hwif->index); 142 ide_init_port_data(hwif, hwif->index);
143 ide_init_port_hw(hwif, &hw); 143 ide_init_port_hw(hwif, &hw);
144 hwif->mmio = 1;
145 144
146 idx[i] = hwif->index; 145 idx[i] = hwif->index;
147 } 146 }
diff --git a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c
index 6e820c7c5c6b..15a99aae0cf9 100644
--- a/drivers/ide/legacy/qd65xx.c
+++ b/drivers/ide/legacy/qd65xx.c
@@ -37,6 +37,8 @@
37#include <asm/system.h> 37#include <asm/system.h>
38#include <asm/io.h> 38#include <asm/io.h>
39 39
40#define DRV_NAME "qd65xx"
41
40#include "qd65xx.h" 42#include "qd65xx.h"
41 43
42/* 44/*
@@ -304,7 +306,20 @@ static void __init qd6580_port_init_devs(ide_hwif_t *hwif)
304 hwif->drives[1].drive_data = t2; 306 hwif->drives[1].drive_data = t2;
305} 307}
306 308
309static const struct ide_port_ops qd6500_port_ops = {
310 .port_init_devs = qd6500_port_init_devs,
311 .set_pio_mode = qd6500_set_pio_mode,
312 .selectproc = qd65xx_select,
313};
314
315static const struct ide_port_ops qd6580_port_ops = {
316 .port_init_devs = qd6580_port_init_devs,
317 .set_pio_mode = qd6580_set_pio_mode,
318 .selectproc = qd65xx_select,
319};
320
307static const struct ide_port_info qd65xx_port_info __initdata = { 321static const struct ide_port_info qd65xx_port_info __initdata = {
322 .name = DRV_NAME,
308 .chipset = ide_qd65xx, 323 .chipset = ide_qd65xx,
309 .host_flags = IDE_HFLAG_IO_32BIT | 324 .host_flags = IDE_HFLAG_IO_32BIT |
310 IDE_HFLAG_NO_DMA | 325 IDE_HFLAG_NO_DMA |
@@ -321,10 +336,8 @@ static const struct ide_port_info qd65xx_port_info __initdata = {
321 336
322static int __init qd_probe(int base) 337static int __init qd_probe(int base)
323{ 338{
324 ide_hwif_t *hwif; 339 int rc;
325 u8 config, unit; 340 u8 config, unit, control;
326 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
327 hw_regs_t hw[2];
328 struct ide_port_info d = qd65xx_port_info; 341 struct ide_port_info d = qd65xx_port_info;
329 342
330 config = inb(QD_CONFIG_PORT); 343 config = inb(QD_CONFIG_PORT);
@@ -337,21 +350,11 @@ static int __init qd_probe(int base)
337 if (unit) 350 if (unit)
338 d.host_flags |= IDE_HFLAG_QD_2ND_PORT; 351 d.host_flags |= IDE_HFLAG_QD_2ND_PORT;
339 352
340 memset(&hw, 0, sizeof(hw)); 353 switch (config & 0xf0) {
341 354 case QD_CONFIG_QD6500:
342 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
343 hw[0].irq = 14;
344
345 ide_std_init_ports(&hw[1], 0x170, 0x376);
346 hw[1].irq = 15;
347
348 if ((config & 0xf0) == QD_CONFIG_QD6500) {
349
350 if (qd_testreg(base)) 355 if (qd_testreg(base))
351 return -ENODEV; /* bad register */ 356 return -ENODEV; /* bad register */
352 357
353 /* qd6500 found */
354
355 if (config & QD_CONFIG_DISABLED) { 358 if (config & QD_CONFIG_DISABLED) {
356 printk(KERN_WARNING "qd6500 is disabled !\n"); 359 printk(KERN_WARNING "qd6500 is disabled !\n");
357 return -ENODEV; 360 return -ENODEV;
@@ -361,37 +364,14 @@ static int __init qd_probe(int base)
361 printk(KERN_DEBUG "qd6500: config=%#x, ID3=%u\n", 364 printk(KERN_DEBUG "qd6500: config=%#x, ID3=%u\n",
362 config, QD_ID3); 365 config, QD_ID3);
363 366
367 d.port_ops = &qd6500_port_ops;
364 d.host_flags |= IDE_HFLAG_SINGLE; 368 d.host_flags |= IDE_HFLAG_SINGLE;
365 369 break;
366 hwif = ide_find_port_slot(&d); 370 case QD_CONFIG_QD6580_A:
367 if (hwif == NULL) 371 case QD_CONFIG_QD6580_B:
368 return -ENOENT;
369
370 ide_init_port_hw(hwif, &hw[unit]);
371
372 hwif->config_data = (base << 8) | config;
373
374 hwif->port_init_devs = qd6500_port_init_devs;
375 hwif->set_pio_mode = qd6500_set_pio_mode;
376 hwif->selectproc = qd65xx_select;
377
378 idx[unit] = hwif->index;
379
380 ide_device_add(idx, &d);
381
382 return 1;
383 }
384
385 if (((config & 0xf0) == QD_CONFIG_QD6580_A) ||
386 ((config & 0xf0) == QD_CONFIG_QD6580_B)) {
387
388 u8 control;
389
390 if (qd_testreg(base) || qd_testreg(base + 0x02)) 372 if (qd_testreg(base) || qd_testreg(base + 0x02))
391 return -ENODEV; /* bad registers */ 373 return -ENODEV; /* bad registers */
392 374
393 /* qd6580 found */
394
395 control = inb(QD_CONTROL_PORT); 375 control = inb(QD_CONTROL_PORT);
396 376
397 printk(KERN_NOTICE "qd6580 at %#x\n", base); 377 printk(KERN_NOTICE "qd6580 at %#x\n", base);
@@ -400,63 +380,23 @@ static int __init qd_probe(int base)
400 380
401 outb(QD_DEF_CONTR, QD_CONTROL_PORT); 381 outb(QD_DEF_CONTR, QD_CONTROL_PORT);
402 382
403 if (control & QD_CONTR_SEC_DISABLED) { 383 d.port_ops = &qd6580_port_ops;
404 /* secondary disabled */ 384 if (control & QD_CONTR_SEC_DISABLED)
405
406 printk(KERN_INFO "qd6580: single IDE board\n");
407
408 d.host_flags |= IDE_HFLAG_SINGLE; 385 d.host_flags |= IDE_HFLAG_SINGLE;
409 386
410 hwif = ide_find_port_slot(&d); 387 printk(KERN_INFO "qd6580: %s IDE board\n",
411 if (hwif == NULL) 388 (control & QD_CONTR_SEC_DISABLED) ? "single" : "dual");
412 return -ENOENT; 389 break;
413 390 default:
414 ide_init_port_hw(hwif, &hw[unit]); 391 return -ENODEV;
415 392 }
416 hwif->config_data = (base << 8) | config;
417
418 hwif->port_init_devs = qd6580_port_init_devs;
419 hwif->set_pio_mode = qd6580_set_pio_mode;
420 hwif->selectproc = qd65xx_select;
421 393
422 idx[unit] = hwif->index; 394 rc = ide_legacy_device_add(&d, (base << 8) | config);
423 395
424 ide_device_add(idx, &d); 396 if (d.host_flags & IDE_HFLAG_SINGLE)
397 return (rc == 0) ? 1 : rc;
425 398
426 return 1; 399 return rc;
427 } else {
428 ide_hwif_t *mate;
429
430 /* secondary enabled */
431 printk(KERN_INFO "qd6580: dual IDE board\n");
432
433 hwif = ide_find_port();
434 if (hwif) {
435 ide_init_port_hw(hwif, &hw[0]);
436 hwif->config_data = (base << 8) | config;
437 hwif->port_init_devs = qd6580_port_init_devs;
438 hwif->set_pio_mode = qd6580_set_pio_mode;
439 hwif->selectproc = qd65xx_select;
440 idx[0] = hwif->index;
441 }
442
443 mate = ide_find_port();
444 if (mate) {
445 ide_init_port_hw(mate, &hw[1]);
446 mate->config_data = (base << 8) | config;
447 mate->port_init_devs = qd6580_port_init_devs;
448 mate->set_pio_mode = qd6580_set_pio_mode;
449 mate->selectproc = qd65xx_select;
450 idx[1] = mate->index;
451 }
452
453 ide_device_add(idx, &qd65xx_port_info);
454
455 return 0; /* no other qd65xx possible */
456 }
457 }
458 /* no qd65xx found */
459 return -ENODEV;
460} 400}
461 401
462int probe_qd65xx = 0; 402int probe_qd65xx = 0;
diff --git a/drivers/ide/legacy/umc8672.c b/drivers/ide/legacy/umc8672.c
index 4d90badd2bda..17d515329fe0 100644
--- a/drivers/ide/legacy/umc8672.c
+++ b/drivers/ide/legacy/umc8672.c
@@ -51,6 +51,8 @@
51 51
52#include <asm/io.h> 52#include <asm/io.h>
53 53
54#define DRV_NAME "umc8672"
55
54/* 56/*
55 * Default speeds. These can be changed with "auto-tune" and/or hdparm. 57 * Default speeds. These can be changed with "auto-tune" and/or hdparm.
56 */ 58 */
@@ -120,18 +122,21 @@ static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio)
120 spin_unlock_irqrestore(&ide_lock, flags); 122 spin_unlock_irqrestore(&ide_lock, flags);
121} 123}
122 124
125static const struct ide_port_ops umc8672_port_ops = {
126 .set_pio_mode = umc_set_pio_mode,
127};
128
123static const struct ide_port_info umc8672_port_info __initdata = { 129static const struct ide_port_info umc8672_port_info __initdata = {
130 .name = DRV_NAME,
124 .chipset = ide_umc8672, 131 .chipset = ide_umc8672,
132 .port_ops = &umc8672_port_ops,
125 .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE, 133 .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
126 .pio_mask = ATA_PIO4, 134 .pio_mask = ATA_PIO4,
127}; 135};
128 136
129static int __init umc8672_probe(void) 137static int __init umc8672_probe(void)
130{ 138{
131 ide_hwif_t *hwif, *mate;
132 unsigned long flags; 139 unsigned long flags;
133 static u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
134 hw_regs_t hw[2];
135 140
136 if (!request_region(0x108, 2, "umc8672")) { 141 if (!request_region(0x108, 2, "umc8672")) {
137 printk(KERN_ERR "umc8672: ports 0x108-0x109 already in use.\n"); 142 printk(KERN_ERR "umc8672: ports 0x108-0x109 already in use.\n");
@@ -150,31 +155,7 @@ static int __init umc8672_probe(void)
150 umc_set_speeds(current_speeds); 155 umc_set_speeds(current_speeds);
151 local_irq_restore(flags); 156 local_irq_restore(flags);
152 157
153 memset(&hw, 0, sizeof(hw)); 158 return ide_legacy_device_add(&umc8672_port_info, 0);
154
155 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
156 hw[0].irq = 14;
157
158 ide_std_init_ports(&hw[1], 0x170, 0x376);
159 hw[1].irq = 15;
160
161 hwif = ide_find_port();
162 if (hwif) {
163 ide_init_port_hw(hwif, &hw[0]);
164 hwif->set_pio_mode = umc_set_pio_mode;
165 idx[0] = hwif->index;
166 }
167
168 mate = ide_find_port();
169 if (mate) {
170 ide_init_port_hw(mate, &hw[1]);
171 mate->set_pio_mode = umc_set_pio_mode;
172 idx[1] = mate->index;
173 }
174
175 ide_device_add(idx, &umc8672_port_info);
176
177 return 0;
178} 159}
179 160
180int probe_umc8672; 161int probe_umc8672;
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c
index a8cd0035936d..3485a310c95b 100644
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -47,7 +47,6 @@
47#define IDE_AU1XXX_BURSTMODE 1 47#define IDE_AU1XXX_BURSTMODE 1
48 48
49static _auide_hwif auide_hwif; 49static _auide_hwif auide_hwif;
50static int dbdma_init_done;
51 50
52static int auide_ddma_init(_auide_hwif *auide); 51static int auide_ddma_init(_auide_hwif *auide);
53 52
@@ -61,7 +60,7 @@ void auide_insw(unsigned long port, void *addr, u32 count)
61 60
62 if(!put_dest_flags(ahwif->rx_chan, (void*)addr, count << 1, 61 if(!put_dest_flags(ahwif->rx_chan, (void*)addr, count << 1,
63 DDMA_FLAGS_NOIE)) { 62 DDMA_FLAGS_NOIE)) {
64 printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__); 63 printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
65 return; 64 return;
66 } 65 }
67 ctp = *((chan_tab_t **)ahwif->rx_chan); 66 ctp = *((chan_tab_t **)ahwif->rx_chan);
@@ -79,7 +78,7 @@ void auide_outsw(unsigned long port, void *addr, u32 count)
79 78
80 if(!put_source_flags(ahwif->tx_chan, (void*)addr, 79 if(!put_source_flags(ahwif->tx_chan, (void*)addr,
81 count << 1, DDMA_FLAGS_NOIE)) { 80 count << 1, DDMA_FLAGS_NOIE)) {
82 printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__); 81 printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
83 return; 82 return;
84 } 83 }
85 ctp = *((chan_tab_t **)ahwif->tx_chan); 84 ctp = *((chan_tab_t **)ahwif->tx_chan);
@@ -250,7 +249,7 @@ static int auide_build_dmatable(ide_drive_t *drive)
250 (void*) sg_virt(sg), 249 (void*) sg_virt(sg),
251 tc, flags)) { 250 tc, flags)) {
252 printk(KERN_ERR "%s failed %d\n", 251 printk(KERN_ERR "%s failed %d\n",
253 __FUNCTION__, __LINE__); 252 __func__, __LINE__);
254 } 253 }
255 } else 254 } else
256 { 255 {
@@ -258,7 +257,7 @@ static int auide_build_dmatable(ide_drive_t *drive)
258 (void*) sg_virt(sg), 257 (void*) sg_virt(sg),
259 tc, flags)) { 258 tc, flags)) {
260 printk(KERN_ERR "%s failed %d\n", 259 printk(KERN_ERR "%s failed %d\n",
261 __FUNCTION__, __LINE__); 260 __func__, __LINE__);
262 } 261 }
263 } 262 }
264 263
@@ -315,35 +314,6 @@ static int auide_dma_setup(ide_drive_t *drive)
315 return 0; 314 return 0;
316} 315}
317 316
318static u8 auide_mdma_filter(ide_drive_t *drive)
319{
320 /*
321 * FIXME: ->white_list and ->black_list are based on completely bogus
322 * ->ide_dma_check implementation which didn't set neither the host
323 * controller timings nor the device for the desired transfer mode.
324 *
325 * They should be either removed or 0x00 MWDMA mask should be
326 * returned for devices on the ->black_list.
327 */
328
329 if (dbdma_init_done == 0) {
330 auide_hwif.white_list = ide_in_drive_list(drive->id,
331 dma_white_list);
332 auide_hwif.black_list = ide_in_drive_list(drive->id,
333 dma_black_list);
334 auide_hwif.drive = drive;
335 auide_ddma_init(&auide_hwif);
336 dbdma_init_done = 1;
337 }
338
339 /* Is the drive in our DMA black list? */
340 if (auide_hwif.black_list)
341 printk(KERN_WARNING "%s: Disabling DMA for %s (blacklisted)\n",
342 drive->name, drive->id->model);
343
344 return drive->hwif->mwdma_mask;
345}
346
347static int auide_dma_test_irq(ide_drive_t *drive) 317static int auide_dma_test_irq(ide_drive_t *drive)
348{ 318{
349 if (drive->waiting_for_dma == 0) 319 if (drive->waiting_for_dma == 0)
@@ -396,41 +366,41 @@ static void auide_init_dbdma_dev(dbdev_tab_t *dev, u32 dev_id, u32 tsize, u32 de
396 dev->dev_devwidth = devwidth; 366 dev->dev_devwidth = devwidth;
397 dev->dev_flags = flags; 367 dev->dev_flags = flags;
398} 368}
399
400#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
401 369
370#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
402static void auide_dma_timeout(ide_drive_t *drive) 371static void auide_dma_timeout(ide_drive_t *drive)
403{ 372{
404 ide_hwif_t *hwif = HWIF(drive); 373 ide_hwif_t *hwif = HWIF(drive);
405 374
406 printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name); 375 printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);
407 376
408 if (hwif->ide_dma_test_irq(drive)) 377 if (auide_dma_test_irq(drive))
409 return; 378 return;
410 379
411 hwif->ide_dma_end(drive); 380 auide_dma_end(drive);
412} 381}
413
414 382
415static int auide_ddma_init(_auide_hwif *auide) { 383static const struct ide_dma_ops au1xxx_dma_ops = {
416 384 .dma_host_set = auide_dma_host_set,
385 .dma_setup = auide_dma_setup,
386 .dma_exec_cmd = auide_dma_exec_cmd,
387 .dma_start = auide_dma_start,
388 .dma_end = auide_dma_end,
389 .dma_test_irq = auide_dma_test_irq,
390 .dma_lost_irq = auide_dma_lost_irq,
391 .dma_timeout = auide_dma_timeout,
392};
393
394static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
395{
396 _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data;
417 dbdev_tab_t source_dev_tab, target_dev_tab; 397 dbdev_tab_t source_dev_tab, target_dev_tab;
418 u32 dev_id, tsize, devwidth, flags; 398 u32 dev_id, tsize, devwidth, flags;
419 ide_hwif_t *hwif = auide->hwif;
420 399
421 dev_id = AU1XXX_ATA_DDMA_REQ; 400 dev_id = AU1XXX_ATA_DDMA_REQ;
422 401
423 if (auide->white_list || auide->black_list) { 402 tsize = 8; /* 1 */
424 tsize = 8; 403 devwidth = 32; /* 16 */
425 devwidth = 32;
426 }
427 else {
428 tsize = 1;
429 devwidth = 16;
430
431 printk(KERN_ERR "au1xxx-ide: %s is not on ide driver whitelist.\n",auide_hwif.drive->id->model);
432 printk(KERN_ERR " please read 'Documentation/mips/AU1xxx_IDE.README'");
433 }
434 404
435#ifdef IDE_AU1XXX_BURSTMODE 405#ifdef IDE_AU1XXX_BURSTMODE
436 flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE; 406 flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
@@ -482,9 +452,9 @@ static int auide_ddma_init(_auide_hwif *auide) {
482 return 0; 452 return 0;
483} 453}
484#else 454#else
485 455static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
486static int auide_ddma_init( _auide_hwif *auide )
487{ 456{
457 _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data;
488 dbdev_tab_t source_dev_tab; 458 dbdev_tab_t source_dev_tab;
489 int flags; 459 int flags;
490 460
@@ -543,9 +513,18 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
543 *ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET); 513 *ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET);
544} 514}
545 515
516static const struct ide_port_ops au1xxx_port_ops = {
517 .set_pio_mode = au1xxx_set_pio_mode,
518 .set_dma_mode = auide_set_dma_mode,
519};
520
546static const struct ide_port_info au1xxx_port_info = { 521static const struct ide_port_info au1xxx_port_info = {
522 .init_dma = auide_ddma_init,
523 .port_ops = &au1xxx_port_ops,
524#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
525 .dma_ops = &au1xxx_dma_ops,
526#endif
547 .host_flags = IDE_HFLAG_POST_SET_MODE | 527 .host_flags = IDE_HFLAG_POST_SET_MODE |
548 IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
549 IDE_HFLAG_NO_IO_32BIT | 528 IDE_HFLAG_NO_IO_32BIT |
550 IDE_HFLAG_UNMASK_IRQS, 529 IDE_HFLAG_UNMASK_IRQS,
551 .pio_mask = ATA_PIO4, 530 .pio_mask = ATA_PIO4,
@@ -615,8 +594,6 @@ static int au_ide_probe(struct device *dev)
615 594
616 hwif->dev = dev; 595 hwif->dev = dev;
617 596
618 hwif->mmio = 1;
619
620 /* If the user has selected DDMA assisted copies, 597 /* If the user has selected DDMA assisted copies,
621 then set up a few local I/O function entry points 598 then set up a few local I/O function entry points
622 */ 599 */
@@ -625,34 +602,12 @@ static int au_ide_probe(struct device *dev)
625 hwif->INSW = auide_insw; 602 hwif->INSW = auide_insw;
626 hwif->OUTSW = auide_outsw; 603 hwif->OUTSW = auide_outsw;
627#endif 604#endif
628
629 hwif->set_pio_mode = &au1xxx_set_pio_mode;
630 hwif->set_dma_mode = &auide_set_dma_mode;
631
632#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
633 hwif->dma_timeout = &auide_dma_timeout;
634
635 hwif->mdma_filter = &auide_mdma_filter;
636
637 hwif->dma_host_set = &auide_dma_host_set;
638 hwif->dma_exec_cmd = &auide_dma_exec_cmd;
639 hwif->dma_start = &auide_dma_start;
640 hwif->ide_dma_end = &auide_dma_end;
641 hwif->dma_setup = &auide_dma_setup;
642 hwif->ide_dma_test_irq = &auide_dma_test_irq;
643 hwif->dma_lost_irq = &auide_dma_lost_irq;
644#endif
645 hwif->select_data = 0; /* no chipset-specific code */ 605 hwif->select_data = 0; /* no chipset-specific code */
646 hwif->config_data = 0; /* no chipset-specific code */ 606 hwif->config_data = 0; /* no chipset-specific code */
647 607
648 auide_hwif.hwif = hwif; 608 auide_hwif.hwif = hwif;
649 hwif->hwif_data = &auide_hwif; 609 hwif->hwif_data = &auide_hwif;
650 610
651#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
652 auide_ddma_init(&auide_hwif);
653 dbdma_init_done = 1;
654#endif
655
656 idx[0] = hwif->index; 611 idx[0] = hwif->index;
657 612
658 ide_device_add(idx, &au1xxx_port_info); 613 ide_device_add(idx, &au1xxx_port_info);
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c
index bbe8d5853348..112fe566bb93 100644
--- a/drivers/ide/mips/swarm.c
+++ b/drivers/ide/mips/swarm.c
@@ -110,10 +110,8 @@ static int __devinit swarm_ide_probe(struct device *dev)
110 110
111 /* Setup MMIO ops. */ 111 /* Setup MMIO ops. */
112 default_hwif_mmiops(hwif); 112 default_hwif_mmiops(hwif);
113 /* Prevent resource map manipulation. */ 113
114 hwif->mmio = 1;
115 hwif->chipset = ide_generic; 114 hwif->chipset = ide_generic;
116 hwif->noprobe = 0;
117 115
118 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) 116 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
119 hwif->io_ports[i] = 117 hwif->io_ports[i] =
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c
index c9ba15afe97d..ca16f37f9486 100644
--- a/drivers/ide/pci/aec62xx.c
+++ b/drivers/ide/pci/aec62xx.c
@@ -135,7 +135,7 @@ static void aec6260_set_mode(ide_drive_t *drive, const u8 speed)
135 135
136static void aec_set_pio_mode(ide_drive_t *drive, const u8 pio) 136static void aec_set_pio_mode(ide_drive_t *drive, const u8 pio)
137{ 137{
138 drive->hwif->set_dma_mode(drive, pio + XFER_PIO_0); 138 drive->hwif->port_ops->set_dma_mode(drive, pio + XFER_PIO_0);
139} 139}
140 140
141static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const char *name) 141static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const char *name)
@@ -175,27 +175,23 @@ static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
175 return (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; 175 return (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
176} 176}
177 177
178static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) 178static const struct ide_port_ops atp850_port_ops = {
179{ 179 .set_pio_mode = aec_set_pio_mode,
180 struct pci_dev *dev = to_pci_dev(hwif->dev); 180 .set_dma_mode = aec6210_set_mode,
181 181};
182 hwif->set_pio_mode = &aec_set_pio_mode;
183
184 if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
185 hwif->set_dma_mode = &aec6210_set_mode;
186 else {
187 hwif->set_dma_mode = &aec6260_set_mode;
188 182
189 hwif->cable_detect = atp86x_cable_detect; 183static const struct ide_port_ops atp86x_port_ops = {
190 } 184 .set_pio_mode = aec_set_pio_mode,
191} 185 .set_dma_mode = aec6260_set_mode,
186 .cable_detect = atp86x_cable_detect,
187};
192 188
193static const struct ide_port_info aec62xx_chipsets[] __devinitdata = { 189static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
194 { /* 0 */ 190 { /* 0 */
195 .name = "AEC6210", 191 .name = "AEC6210",
196 .init_chipset = init_chipset_aec62xx, 192 .init_chipset = init_chipset_aec62xx,
197 .init_hwif = init_hwif_aec62xx,
198 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, 193 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
194 .port_ops = &atp850_port_ops,
199 .host_flags = IDE_HFLAG_SERIALIZE | 195 .host_flags = IDE_HFLAG_SERIALIZE |
200 IDE_HFLAG_NO_ATAPI_DMA | 196 IDE_HFLAG_NO_ATAPI_DMA |
201 IDE_HFLAG_NO_DSC | 197 IDE_HFLAG_NO_DSC |
@@ -207,7 +203,7 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
207 },{ /* 1 */ 203 },{ /* 1 */
208 .name = "AEC6260", 204 .name = "AEC6260",
209 .init_chipset = init_chipset_aec62xx, 205 .init_chipset = init_chipset_aec62xx,
210 .init_hwif = init_hwif_aec62xx, 206 .port_ops = &atp86x_port_ops,
211 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_NO_AUTODMA | 207 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_NO_AUTODMA |
212 IDE_HFLAG_ABUSE_SET_DMA_MODE | 208 IDE_HFLAG_ABUSE_SET_DMA_MODE |
213 IDE_HFLAG_OFF_BOARD, 209 IDE_HFLAG_OFF_BOARD,
@@ -217,8 +213,8 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
217 },{ /* 2 */ 213 },{ /* 2 */
218 .name = "AEC6260R", 214 .name = "AEC6260R",
219 .init_chipset = init_chipset_aec62xx, 215 .init_chipset = init_chipset_aec62xx,
220 .init_hwif = init_hwif_aec62xx,
221 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, 216 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
217 .port_ops = &atp86x_port_ops,
222 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 218 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
223 IDE_HFLAG_ABUSE_SET_DMA_MODE | 219 IDE_HFLAG_ABUSE_SET_DMA_MODE |
224 IDE_HFLAG_NON_BOOTABLE, 220 IDE_HFLAG_NON_BOOTABLE,
@@ -228,7 +224,7 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
228 },{ /* 3 */ 224 },{ /* 3 */
229 .name = "AEC6280", 225 .name = "AEC6280",
230 .init_chipset = init_chipset_aec62xx, 226 .init_chipset = init_chipset_aec62xx,
231 .init_hwif = init_hwif_aec62xx, 227 .port_ops = &atp86x_port_ops,
232 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 228 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
233 IDE_HFLAG_ABUSE_SET_DMA_MODE | 229 IDE_HFLAG_ABUSE_SET_DMA_MODE |
234 IDE_HFLAG_OFF_BOARD, 230 IDE_HFLAG_OFF_BOARD,
@@ -238,8 +234,8 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
238 },{ /* 4 */ 234 },{ /* 4 */
239 .name = "AEC6280R", 235 .name = "AEC6280R",
240 .init_chipset = init_chipset_aec62xx, 236 .init_chipset = init_chipset_aec62xx,
241 .init_hwif = init_hwif_aec62xx,
242 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, 237 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
238 .port_ops = &atp86x_port_ops,
243 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 239 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
244 IDE_HFLAG_ABUSE_SET_DMA_MODE | 240 IDE_HFLAG_ABUSE_SET_DMA_MODE |
245 IDE_HFLAG_OFF_BOARD, 241 IDE_HFLAG_OFF_BOARD,
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c
index 3fa2d9f7b1b2..b5a3bc33e167 100644
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -610,7 +610,7 @@ static int ali_cable_override(struct pci_dev *pdev)
610} 610}
611 611
612/** 612/**
613 * ata66_ali15x3 - check for UDMA 66 support 613 * ali_cable_detect - cable detection
614 * @hwif: IDE interface 614 * @hwif: IDE interface
615 * 615 *
616 * This checks if the controller and the cable are capable 616 * This checks if the controller and the cable are capable
@@ -620,7 +620,7 @@ static int ali_cable_override(struct pci_dev *pdev)
620 * FIXME: frobs bits that are not defined on newer ALi devicea 620 * FIXME: frobs bits that are not defined on newer ALi devicea
621 */ 621 */
622 622
623static u8 __devinit ata66_ali15x3(ide_hwif_t *hwif) 623static u8 __devinit ali_cable_detect(ide_hwif_t *hwif)
624{ 624{
625 struct pci_dev *dev = to_pci_dev(hwif->dev); 625 struct pci_dev *dev = to_pci_dev(hwif->dev);
626 unsigned long flags; 626 unsigned long flags;
@@ -652,27 +652,7 @@ static u8 __devinit ata66_ali15x3(ide_hwif_t *hwif)
652 return cbl; 652 return cbl;
653} 653}
654 654
655/** 655#ifndef CONFIG_SPARC64
656 * init_hwif_common_ali15x3 - Set up ALI IDE hardware
657 * @hwif: IDE interface
658 *
659 * Initialize the IDE structure side of the ALi 15x3 driver.
660 */
661
662static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)
663{
664 hwif->set_pio_mode = &ali_set_pio_mode;
665 hwif->set_dma_mode = &ali_set_dma_mode;
666 hwif->udma_filter = &ali_udma_filter;
667
668 hwif->cable_detect = ata66_ali15x3;
669
670 if (hwif->dma_base == 0)
671 return;
672
673 hwif->dma_setup = &ali15x3_dma_setup;
674}
675
676/** 656/**
677 * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff 657 * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff
678 * @hwif: interface to configure 658 * @hwif: interface to configure
@@ -722,34 +702,66 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
722 if(irq >= 0) 702 if(irq >= 0)
723 hwif->irq = irq; 703 hwif->irq = irq;
724 } 704 }
725
726 init_hwif_common_ali15x3(hwif);
727} 705}
706#endif
728 707
729/** 708/**
730 * init_dma_ali15x3 - set up DMA on ALi15x3 709 * init_dma_ali15x3 - set up DMA on ALi15x3
731 * @hwif: IDE interface 710 * @hwif: IDE interface
732 * @dmabase: DMA interface base PCI address 711 * @d: IDE port info
733 * 712 *
734 * Set up the DMA functionality on the ALi 15x3. For the ALi 713 * Set up the DMA functionality on the ALi 15x3.
735 * controllers this is generic so we can let the generic code do
736 * the actual work.
737 */ 714 */
738 715
739static void __devinit init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase) 716static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
717 const struct ide_port_info *d)
740{ 718{
741 if (m5229_revision < 0x20) 719 struct pci_dev *dev = to_pci_dev(hwif->dev);
742 return; 720 unsigned long base = ide_pci_dma_base(hwif, d);
721
722 if (base == 0 || ide_pci_set_master(dev, d->name) < 0)
723 return -1;
724
743 if (!hwif->channel) 725 if (!hwif->channel)
744 outb(inb(dmabase + 2) & 0x60, dmabase + 2); 726 outb(inb(base + 2) & 0x60, base + 2);
745 ide_setup_dma(hwif, dmabase); 727
728 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
729 hwif->name, base, base + 7);
730
731 if (ide_allocate_dma_engine(hwif))
732 return -1;
733
734 ide_setup_dma(hwif, base);
735
736 return 0;
746} 737}
747 738
739static const struct ide_port_ops ali_port_ops = {
740 .set_pio_mode = ali_set_pio_mode,
741 .set_dma_mode = ali_set_dma_mode,
742 .udma_filter = ali_udma_filter,
743 .cable_detect = ali_cable_detect,
744};
745
746static const struct ide_dma_ops ali_dma_ops = {
747 .dma_host_set = ide_dma_host_set,
748 .dma_setup = ali15x3_dma_setup,
749 .dma_exec_cmd = ide_dma_exec_cmd,
750 .dma_start = ide_dma_start,
751 .dma_end = __ide_dma_end,
752 .dma_test_irq = ide_dma_test_irq,
753 .dma_lost_irq = ide_dma_lost_irq,
754 .dma_timeout = ide_dma_timeout,
755};
756
748static const struct ide_port_info ali15x3_chipset __devinitdata = { 757static const struct ide_port_info ali15x3_chipset __devinitdata = {
749 .name = "ALI15X3", 758 .name = "ALI15X3",
750 .init_chipset = init_chipset_ali15x3, 759 .init_chipset = init_chipset_ali15x3,
760#ifndef CONFIG_SPARC64
751 .init_hwif = init_hwif_ali15x3, 761 .init_hwif = init_hwif_ali15x3,
762#endif
752 .init_dma = init_dma_ali15x3, 763 .init_dma = init_dma_ali15x3,
764 .port_ops = &ali_port_ops,
753 .pio_mask = ATA_PIO5, 765 .pio_mask = ATA_PIO5,
754 .swdma_mask = ATA_SWDMA2, 766 .swdma_mask = ATA_SWDMA2,
755 .mwdma_mask = ATA_MWDMA2, 767 .mwdma_mask = ATA_MWDMA2,
@@ -792,14 +804,17 @@ static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_dev
792 d.udma_mask = ATA_UDMA5; 804 d.udma_mask = ATA_UDMA5;
793 else 805 else
794 d.udma_mask = ATA_UDMA6; 806 d.udma_mask = ATA_UDMA6;
807
808 d.dma_ops = &ali_dma_ops;
809 } else {
810 d.host_flags |= IDE_HFLAG_NO_DMA;
811
812 d.mwdma_mask = d.swdma_mask = 0;
795 } 813 }
796 814
797 if (idx == 0) 815 if (idx == 0)
798 d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX; 816 d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX;
799 817
800#if defined(CONFIG_SPARC64)
801 d.init_hwif = init_hwif_common_ali15x3;
802#endif /* CONFIG_SPARC64 */
803 return ide_setup_pci_device(dev, &d); 818 return ide_setup_pci_device(dev, &d);
804} 819}
805 820
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
index ff684d312378..f7c883808b02 100644
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -210,13 +210,14 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
210 210
211 if (hwif->irq == 0) /* 0 is bogus but will do for now */ 211 if (hwif->irq == 0) /* 0 is bogus but will do for now */
212 hwif->irq = pci_get_legacy_ide_irq(dev, hwif->channel); 212 hwif->irq = pci_get_legacy_ide_irq(dev, hwif->channel);
213
214 hwif->set_pio_mode = &amd_set_pio_mode;
215 hwif->set_dma_mode = &amd_set_drive;
216
217 hwif->cable_detect = amd_cable_detect;
218} 213}
219 214
215static const struct ide_port_ops amd_port_ops = {
216 .set_pio_mode = amd_set_pio_mode,
217 .set_dma_mode = amd_set_drive,
218 .cable_detect = amd_cable_detect,
219};
220
220#define IDE_HFLAGS_AMD \ 221#define IDE_HFLAGS_AMD \
221 (IDE_HFLAG_PIO_NO_BLACKLIST | \ 222 (IDE_HFLAG_PIO_NO_BLACKLIST | \
222 IDE_HFLAG_ABUSE_SET_DMA_MODE | \ 223 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
@@ -230,6 +231,7 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
230 .init_chipset = init_chipset_amd74xx, \ 231 .init_chipset = init_chipset_amd74xx, \
231 .init_hwif = init_hwif_amd74xx, \ 232 .init_hwif = init_hwif_amd74xx, \
232 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \ 233 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \
234 .port_ops = &amd_port_ops, \
233 .host_flags = IDE_HFLAGS_AMD, \ 235 .host_flags = IDE_HFLAGS_AMD, \
234 .pio_mask = ATA_PIO5, \ 236 .pio_mask = ATA_PIO5, \
235 .swdma_mask = swdma, \ 237 .swdma_mask = swdma, \
@@ -243,6 +245,7 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
243 .init_chipset = init_chipset_amd74xx, \ 245 .init_chipset = init_chipset_amd74xx, \
244 .init_hwif = init_hwif_amd74xx, \ 246 .init_hwif = init_hwif_amd74xx, \
245 .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \ 247 .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \
248 .port_ops = &amd_port_ops, \
246 .host_flags = IDE_HFLAGS_AMD, \ 249 .host_flags = IDE_HFLAGS_AMD, \
247 .pio_mask = ATA_PIO5, \ 250 .pio_mask = ATA_PIO5, \
248 .swdma_mask = ATA_SWDMA2, \ 251 .swdma_mask = ATA_SWDMA2, \
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c
index 91722f88b7bd..8b637181681a 100644
--- a/drivers/ide/pci/atiixp.c
+++ b/drivers/ide/pci/atiixp.c
@@ -130,35 +130,25 @@ static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif)
130 return ATA_CBL_PATA40; 130 return ATA_CBL_PATA40;
131} 131}
132 132
133/** 133static const struct ide_port_ops atiixp_port_ops = {
134 * init_hwif_atiixp - fill in the hwif for the ATIIXP 134 .set_pio_mode = atiixp_set_pio_mode,
135 * @hwif: IDE interface 135 .set_dma_mode = atiixp_set_dma_mode,
136 * 136 .cable_detect = atiixp_cable_detect,
137 * Set up the ide_hwif_t for the ATIIXP interface according to the 137};
138 * capabilities of the hardware.
139 */
140
141static void __devinit init_hwif_atiixp(ide_hwif_t *hwif)
142{
143 hwif->set_pio_mode = &atiixp_set_pio_mode;
144 hwif->set_dma_mode = &atiixp_set_dma_mode;
145
146 hwif->cable_detect = atiixp_cable_detect;
147}
148 138
149static const struct ide_port_info atiixp_pci_info[] __devinitdata = { 139static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
150 { /* 0 */ 140 { /* 0 */
151 .name = "ATIIXP", 141 .name = "ATIIXP",
152 .init_hwif = init_hwif_atiixp,
153 .enablebits = {{0x48,0x01,0x00}, {0x48,0x08,0x00}}, 142 .enablebits = {{0x48,0x01,0x00}, {0x48,0x08,0x00}},
143 .port_ops = &atiixp_port_ops,
154 .host_flags = IDE_HFLAG_LEGACY_IRQS, 144 .host_flags = IDE_HFLAG_LEGACY_IRQS,
155 .pio_mask = ATA_PIO4, 145 .pio_mask = ATA_PIO4,
156 .mwdma_mask = ATA_MWDMA2, 146 .mwdma_mask = ATA_MWDMA2,
157 .udma_mask = ATA_UDMA5, 147 .udma_mask = ATA_UDMA5,
158 },{ /* 1 */ 148 },{ /* 1 */
159 .name = "SB600_PATA", 149 .name = "SB600_PATA",
160 .init_hwif = init_hwif_atiixp,
161 .enablebits = {{0x48,0x01,0x00}, {0x00,0x00,0x00}}, 150 .enablebits = {{0x48,0x01,0x00}, {0x00,0x00,0x00}},
151 .port_ops = &atiixp_port_ops,
162 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_LEGACY_IRQS, 152 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_LEGACY_IRQS,
163 .pio_mask = ATA_PIO4, 153 .pio_mask = ATA_PIO4,
164 .mwdma_mask = ATA_MWDMA2, 154 .mwdma_mask = ATA_MWDMA2,
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c
index b076dbfc43a7..25c2f1bd175f 100644
--- a/drivers/ide/pci/cmd640.c
+++ b/drivers/ide/pci/cmd640.c
@@ -109,6 +109,8 @@
109 109
110#include <asm/io.h> 110#include <asm/io.h>
111 111
112#define DRV_NAME "cmd640"
113
112/* 114/*
113 * This flag is set in ide.c by the parameter: ide0=cmd640_vlb 115 * This flag is set in ide.c by the parameter: ide0=cmd640_vlb
114 */ 116 */
@@ -633,6 +635,9 @@ static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio)
633 display_clocks(index); 635 display_clocks(index);
634} 636}
635 637
638static const struct ide_port_ops cmd640_port_ops = {
639 .set_pio_mode = cmd640_set_pio_mode,
640};
636#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ 641#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
637 642
638static int pci_conf1(void) 643static int pci_conf1(void)
@@ -678,10 +683,29 @@ static const struct ide_port_info cmd640_port_info __initdata = {
678 IDE_HFLAG_ABUSE_PREFETCH | 683 IDE_HFLAG_ABUSE_PREFETCH |
679 IDE_HFLAG_ABUSE_FAST_DEVSEL, 684 IDE_HFLAG_ABUSE_FAST_DEVSEL,
680#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED 685#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
686 .port_ops = &cmd640_port_ops,
681 .pio_mask = ATA_PIO5, 687 .pio_mask = ATA_PIO5,
682#endif 688#endif
683}; 689};
684 690
691static int cmd640x_init_one(unsigned long base, unsigned long ctl)
692{
693 if (!request_region(base, 8, DRV_NAME)) {
694 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
695 DRV_NAME, base, base + 7);
696 return -EBUSY;
697 }
698
699 if (!request_region(ctl, 1, DRV_NAME)) {
700 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
701 DRV_NAME, ctl);
702 release_region(base, 8);
703 return -EBUSY;
704 }
705
706 return 0;
707}
708
685/* 709/*
686 * Probe for a cmd640 chipset, and initialize it if found. 710 * Probe for a cmd640 chipset, and initialize it if found.
687 */ 711 */
@@ -690,7 +714,7 @@ static int __init cmd640x_init(void)
690#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED 714#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
691 int second_port_toggled = 0; 715 int second_port_toggled = 0;
692#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ 716#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
693 int second_port_cmd640 = 0; 717 int second_port_cmd640 = 0, rc;
694 const char *bus_type, *port2; 718 const char *bus_type, *port2;
695 unsigned int index; 719 unsigned int index;
696 u8 b, cfr; 720 u8 b, cfr;
@@ -734,6 +758,17 @@ static int __init cmd640x_init(void)
734 return 0; 758 return 0;
735 } 759 }
736 760
761 rc = cmd640x_init_one(0x1f0, 0x3f6);
762 if (rc)
763 return rc;
764
765 rc = cmd640x_init_one(0x170, 0x376);
766 if (rc) {
767 release_region(0x3f6, 1);
768 release_region(0x1f0, 8);
769 return rc;
770 }
771
737 memset(&hw, 0, sizeof(hw)); 772 memset(&hw, 0, sizeof(hw));
738 773
739 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); 774 ide_std_init_ports(&hw[0], 0x1f0, 0x3f6);
@@ -752,10 +787,6 @@ static int __init cmd640x_init(void)
752 */ 787 */
753 if (cmd_hwif0) { 788 if (cmd_hwif0) {
754 ide_init_port_hw(cmd_hwif0, &hw[0]); 789 ide_init_port_hw(cmd_hwif0, &hw[0]);
755#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
756 cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
757#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
758
759 idx[0] = cmd_hwif0->index; 790 idx[0] = cmd_hwif0->index;
760 } 791 }
761 792
@@ -808,10 +839,6 @@ static int __init cmd640x_init(void)
808 */ 839 */
809 if (second_port_cmd640 && cmd_hwif1) { 840 if (second_port_cmd640 && cmd_hwif1) {
810 ide_init_port_hw(cmd_hwif1, &hw[1]); 841 ide_init_port_hw(cmd_hwif1, &hw[1]);
811#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
812 cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
813#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
814
815 idx[1] = cmd_hwif1->index; 842 idx[1] = cmd_hwif1->index;
816 } 843 }
817 printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n", 844 printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n",
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c
index 8baccfef237f..006fb62656bc 100644
--- a/drivers/ide/pci/cmd64x.c
+++ b/drivers/ide/pci/cmd64x.c
@@ -223,7 +223,7 @@ static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed)
223 (void) pci_write_config_byte(dev, pciU, regU); 223 (void) pci_write_config_byte(dev, pciU, regU);
224} 224}
225 225
226static int cmd648_ide_dma_end (ide_drive_t *drive) 226static int cmd648_dma_end(ide_drive_t *drive)
227{ 227{
228 ide_hwif_t *hwif = HWIF(drive); 228 ide_hwif_t *hwif = HWIF(drive);
229 unsigned long base = hwif->dma_base - (hwif->channel * 8); 229 unsigned long base = hwif->dma_base - (hwif->channel * 8);
@@ -239,7 +239,7 @@ static int cmd648_ide_dma_end (ide_drive_t *drive)
239 return err; 239 return err;
240} 240}
241 241
242static int cmd64x_ide_dma_end (ide_drive_t *drive) 242static int cmd64x_dma_end(ide_drive_t *drive)
243{ 243{
244 ide_hwif_t *hwif = HWIF(drive); 244 ide_hwif_t *hwif = HWIF(drive);
245 struct pci_dev *dev = to_pci_dev(hwif->dev); 245 struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -256,7 +256,7 @@ static int cmd64x_ide_dma_end (ide_drive_t *drive)
256 return err; 256 return err;
257} 257}
258 258
259static int cmd648_ide_dma_test_irq (ide_drive_t *drive) 259static int cmd648_dma_test_irq(ide_drive_t *drive)
260{ 260{
261 ide_hwif_t *hwif = HWIF(drive); 261 ide_hwif_t *hwif = HWIF(drive);
262 unsigned long base = hwif->dma_base - (hwif->channel * 8); 262 unsigned long base = hwif->dma_base - (hwif->channel * 8);
@@ -279,7 +279,7 @@ static int cmd648_ide_dma_test_irq (ide_drive_t *drive)
279 return 0; 279 return 0;
280} 280}
281 281
282static int cmd64x_ide_dma_test_irq (ide_drive_t *drive) 282static int cmd64x_dma_test_irq(ide_drive_t *drive)
283{ 283{
284 ide_hwif_t *hwif = HWIF(drive); 284 ide_hwif_t *hwif = HWIF(drive);
285 struct pci_dev *dev = to_pci_dev(hwif->dev); 285 struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -310,7 +310,7 @@ static int cmd64x_ide_dma_test_irq (ide_drive_t *drive)
310 * event order for DMA transfers. 310 * event order for DMA transfers.
311 */ 311 */
312 312
313static int cmd646_1_ide_dma_end (ide_drive_t *drive) 313static int cmd646_1_dma_end(ide_drive_t *drive)
314{ 314{
315 ide_hwif_t *hwif = HWIF(drive); 315 ide_hwif_t *hwif = HWIF(drive);
316 u8 dma_stat = 0, dma_cmd = 0; 316 u8 dma_stat = 0, dma_cmd = 0;
@@ -370,7 +370,7 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha
370 return 0; 370 return 0;
371} 371}
372 372
373static u8 __devinit ata66_cmd64x(ide_hwif_t *hwif) 373static u8 __devinit cmd64x_cable_detect(ide_hwif_t *hwif)
374{ 374{
375 struct pci_dev *dev = to_pci_dev(hwif->dev); 375 struct pci_dev *dev = to_pci_dev(hwif->dev);
376 u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; 376 u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01;
@@ -385,60 +385,52 @@ static u8 __devinit ata66_cmd64x(ide_hwif_t *hwif)
385 } 385 }
386} 386}
387 387
388static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) 388static const struct ide_port_ops cmd64x_port_ops = {
389{ 389 .set_pio_mode = cmd64x_set_pio_mode,
390 struct pci_dev *dev = to_pci_dev(hwif->dev); 390 .set_dma_mode = cmd64x_set_dma_mode,
391 391 .cable_detect = cmd64x_cable_detect,
392 hwif->set_pio_mode = &cmd64x_set_pio_mode; 392};
393 hwif->set_dma_mode = &cmd64x_set_dma_mode;
394
395 hwif->cable_detect = ata66_cmd64x;
396 393
397 if (!hwif->dma_base) 394static const struct ide_dma_ops cmd64x_dma_ops = {
398 return; 395 .dma_host_set = ide_dma_host_set,
396 .dma_setup = ide_dma_setup,
397 .dma_exec_cmd = ide_dma_exec_cmd,
398 .dma_start = ide_dma_start,
399 .dma_end = cmd64x_dma_end,
400 .dma_test_irq = cmd64x_dma_test_irq,
401 .dma_lost_irq = ide_dma_lost_irq,
402 .dma_timeout = ide_dma_timeout,
403};
399 404
400 /* 405static const struct ide_dma_ops cmd646_rev1_dma_ops = {
401 * UltraDMA only supported on PCI646U and PCI646U2, which 406 .dma_host_set = ide_dma_host_set,
402 * correspond to revisions 0x03, 0x05 and 0x07 respectively. 407 .dma_setup = ide_dma_setup,
403 * Actually, although the CMD tech support people won't 408 .dma_exec_cmd = ide_dma_exec_cmd,
404 * tell me the details, the 0x03 revision cannot support 409 .dma_start = ide_dma_start,
405 * UDMA correctly without hardware modifications, and even 410 .dma_end = cmd646_1_dma_end,
406 * then it only works with Quantum disks due to some 411 .dma_test_irq = ide_dma_test_irq,
407 * hold time assumptions in the 646U part which are fixed 412 .dma_lost_irq = ide_dma_lost_irq,
408 * in the 646U2. 413 .dma_timeout = ide_dma_timeout,
409 * 414};
410 * So we only do UltraDMA on revision 0x05 and 0x07 chipsets.
411 */
412 if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5)
413 hwif->ultra_mask = 0x00;
414 415
415 switch (dev->device) { 416static const struct ide_dma_ops cmd648_dma_ops = {
416 case PCI_DEVICE_ID_CMD_648: 417 .dma_host_set = ide_dma_host_set,
417 case PCI_DEVICE_ID_CMD_649: 418 .dma_setup = ide_dma_setup,
418 alt_irq_bits: 419 .dma_exec_cmd = ide_dma_exec_cmd,
419 hwif->ide_dma_end = &cmd648_ide_dma_end; 420 .dma_start = ide_dma_start,
420 hwif->ide_dma_test_irq = &cmd648_ide_dma_test_irq; 421 .dma_end = cmd648_dma_end,
421 break; 422 .dma_test_irq = cmd648_dma_test_irq,
422 case PCI_DEVICE_ID_CMD_646: 423 .dma_lost_irq = ide_dma_lost_irq,
423 if (dev->revision == 0x01) { 424 .dma_timeout = ide_dma_timeout,
424 hwif->ide_dma_end = &cmd646_1_ide_dma_end; 425};
425 break;
426 } else if (dev->revision >= 0x03)
427 goto alt_irq_bits;
428 /* fall thru */
429 default:
430 hwif->ide_dma_end = &cmd64x_ide_dma_end;
431 hwif->ide_dma_test_irq = &cmd64x_ide_dma_test_irq;
432 break;
433 }
434}
435 426
436static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { 427static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
437 { /* 0 */ 428 { /* 0 */
438 .name = "CMD643", 429 .name = "CMD643",
439 .init_chipset = init_chipset_cmd64x, 430 .init_chipset = init_chipset_cmd64x,
440 .init_hwif = init_hwif_cmd64x,
441 .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, 431 .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}},
432 .port_ops = &cmd64x_port_ops,
433 .dma_ops = &cmd64x_dma_ops,
442 .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | 434 .host_flags = IDE_HFLAG_CLEAR_SIMPLEX |
443 IDE_HFLAG_ABUSE_PREFETCH, 435 IDE_HFLAG_ABUSE_PREFETCH,
444 .pio_mask = ATA_PIO5, 436 .pio_mask = ATA_PIO5,
@@ -447,9 +439,10 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
447 },{ /* 1 */ 439 },{ /* 1 */
448 .name = "CMD646", 440 .name = "CMD646",
449 .init_chipset = init_chipset_cmd64x, 441 .init_chipset = init_chipset_cmd64x,
450 .init_hwif = init_hwif_cmd64x,
451 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 442 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
452 .chipset = ide_cmd646, 443 .chipset = ide_cmd646,
444 .port_ops = &cmd64x_port_ops,
445 .dma_ops = &cmd648_dma_ops,
453 .host_flags = IDE_HFLAG_ABUSE_PREFETCH, 446 .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
454 .pio_mask = ATA_PIO5, 447 .pio_mask = ATA_PIO5,
455 .mwdma_mask = ATA_MWDMA2, 448 .mwdma_mask = ATA_MWDMA2,
@@ -457,8 +450,9 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
457 },{ /* 2 */ 450 },{ /* 2 */
458 .name = "CMD648", 451 .name = "CMD648",
459 .init_chipset = init_chipset_cmd64x, 452 .init_chipset = init_chipset_cmd64x,
460 .init_hwif = init_hwif_cmd64x,
461 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 453 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
454 .port_ops = &cmd64x_port_ops,
455 .dma_ops = &cmd648_dma_ops,
462 .host_flags = IDE_HFLAG_ABUSE_PREFETCH, 456 .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
463 .pio_mask = ATA_PIO5, 457 .pio_mask = ATA_PIO5,
464 .mwdma_mask = ATA_MWDMA2, 458 .mwdma_mask = ATA_MWDMA2,
@@ -466,8 +460,9 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
466 },{ /* 3 */ 460 },{ /* 3 */
467 .name = "CMD649", 461 .name = "CMD649",
468 .init_chipset = init_chipset_cmd64x, 462 .init_chipset = init_chipset_cmd64x,
469 .init_hwif = init_hwif_cmd64x,
470 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 463 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
464 .port_ops = &cmd64x_port_ops,
465 .dma_ops = &cmd648_dma_ops,
471 .host_flags = IDE_HFLAG_ABUSE_PREFETCH, 466 .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
472 .pio_mask = ATA_PIO5, 467 .pio_mask = ATA_PIO5,
473 .mwdma_mask = ATA_MWDMA2, 468 .mwdma_mask = ATA_MWDMA2,
@@ -482,12 +477,35 @@ static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_devic
482 477
483 d = cmd64x_chipsets[idx]; 478 d = cmd64x_chipsets[idx];
484 479
485 /* 480 if (idx == 1) {
486 * The original PCI0646 didn't have the primary channel enable bit, 481 /*
487 * it appeared starting with PCI0646U (i.e. revision ID 3). 482 * UltraDMA only supported on PCI646U and PCI646U2, which
488 */ 483 * correspond to revisions 0x03, 0x05 and 0x07 respectively.
489 if (idx == 1 && dev->revision < 3) 484 * Actually, although the CMD tech support people won't
490 d.enablebits[0].reg = 0; 485 * tell me the details, the 0x03 revision cannot support
486 * UDMA correctly without hardware modifications, and even
487 * then it only works with Quantum disks due to some
488 * hold time assumptions in the 646U part which are fixed
489 * in the 646U2.
490 *
491 * So we only do UltraDMA on revision 0x05 and 0x07 chipsets.
492 */
493 if (dev->revision < 5) {
494 d.udma_mask = 0x00;
495 /*
496 * The original PCI0646 didn't have the primary
497 * channel enable bit, it appeared starting with
498 * PCI0646U (i.e. revision ID 3).
499 */
500 if (dev->revision < 3) {
501 d.enablebits[0].reg = 0;
502 if (dev->revision == 1)
503 d.dma_ops = &cmd646_rev1_dma_ops;
504 else
505 d.dma_ops = &cmd64x_dma_ops;
506 }
507 }
508 }
491 509
492 return ide_setup_pci_device(dev, &d); 510 return ide_setup_pci_device(dev, &d);
493} 511}
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c
index 01b37ecb5a5a..17669a434438 100644
--- a/drivers/ide/pci/cs5520.c
+++ b/drivers/ide/pci/cs5520.c
@@ -103,21 +103,27 @@ static void cs5520_dma_host_set(ide_drive_t *drive, int on)
103 ide_dma_host_set(drive, on); 103 ide_dma_host_set(drive, on);
104} 104}
105 105
106static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) 106static const struct ide_port_ops cs5520_port_ops = {
107{ 107 .set_pio_mode = cs5520_set_pio_mode,
108 hwif->set_pio_mode = &cs5520_set_pio_mode; 108 .set_dma_mode = cs5520_set_dma_mode,
109 hwif->set_dma_mode = &cs5520_set_dma_mode; 109};
110
111 if (hwif->dma_base == 0)
112 return;
113 110
114 hwif->dma_host_set = &cs5520_dma_host_set; 111static const struct ide_dma_ops cs5520_dma_ops = {
115} 112 .dma_host_set = cs5520_dma_host_set,
113 .dma_setup = ide_dma_setup,
114 .dma_exec_cmd = ide_dma_exec_cmd,
115 .dma_start = ide_dma_start,
116 .dma_end = __ide_dma_end,
117 .dma_test_irq = ide_dma_test_irq,
118 .dma_lost_irq = ide_dma_lost_irq,
119 .dma_timeout = ide_dma_timeout,
120};
116 121
117#define DECLARE_CS_DEV(name_str) \ 122#define DECLARE_CS_DEV(name_str) \
118 { \ 123 { \
119 .name = name_str, \ 124 .name = name_str, \
120 .init_hwif = init_hwif_cs5520, \ 125 .port_ops = &cs5520_port_ops, \
126 .dma_ops = &cs5520_dma_ops, \
121 .host_flags = IDE_HFLAG_ISA_PORTS | \ 127 .host_flags = IDE_HFLAG_ISA_PORTS | \
122 IDE_HFLAG_CS5520 | \ 128 IDE_HFLAG_CS5520 | \
123 IDE_HFLAG_VDMA | \ 129 IDE_HFLAG_VDMA | \
diff --git a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c
index 56a369c2a78a..f5534c1ff349 100644
--- a/drivers/ide/pci/cs5530.c
+++ b/drivers/ide/pci/cs5530.c
@@ -228,26 +228,25 @@ static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif)
228 unsigned long basereg; 228 unsigned long basereg;
229 u32 d0_timings; 229 u32 d0_timings;
230 230
231 hwif->set_pio_mode = &cs5530_set_pio_mode;
232 hwif->set_dma_mode = &cs5530_set_dma_mode;
233
234 basereg = CS5530_BASEREG(hwif); 231 basereg = CS5530_BASEREG(hwif);
235 d0_timings = inl(basereg + 0); 232 d0_timings = inl(basereg + 0);
236 if (CS5530_BAD_PIO(d0_timings)) 233 if (CS5530_BAD_PIO(d0_timings))
237 outl(cs5530_pio_timings[(d0_timings >> 31) & 1][0], basereg + 0); 234 outl(cs5530_pio_timings[(d0_timings >> 31) & 1][0], basereg + 0);
238 if (CS5530_BAD_PIO(inl(basereg + 8))) 235 if (CS5530_BAD_PIO(inl(basereg + 8)))
239 outl(cs5530_pio_timings[(d0_timings >> 31) & 1][0], basereg + 8); 236 outl(cs5530_pio_timings[(d0_timings >> 31) & 1][0], basereg + 8);
240
241 if (hwif->dma_base == 0)
242 return;
243
244 hwif->udma_filter = cs5530_udma_filter;
245} 237}
246 238
239static const struct ide_port_ops cs5530_port_ops = {
240 .set_pio_mode = cs5530_set_pio_mode,
241 .set_dma_mode = cs5530_set_dma_mode,
242 .udma_filter = cs5530_udma_filter,
243};
244
247static const struct ide_port_info cs5530_chipset __devinitdata = { 245static const struct ide_port_info cs5530_chipset __devinitdata = {
248 .name = "CS5530", 246 .name = "CS5530",
249 .init_chipset = init_chipset_cs5530, 247 .init_chipset = init_chipset_cs5530,
250 .init_hwif = init_hwif_cs5530, 248 .init_hwif = init_hwif_cs5530,
249 .port_ops = &cs5530_port_ops,
251 .host_flags = IDE_HFLAG_SERIALIZE | 250 .host_flags = IDE_HFLAG_SERIALIZE |
252 IDE_HFLAG_POST_SET_MODE, 251 IDE_HFLAG_POST_SET_MODE,
253 .pio_mask = ATA_PIO4, 252 .pio_mask = ATA_PIO4,
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c
index c9685f239c65..99fe91a191b8 100644
--- a/drivers/ide/pci/cs5535.c
+++ b/drivers/ide/pci/cs5535.c
@@ -166,25 +166,15 @@ static u8 __devinit cs5535_cable_detect(ide_hwif_t *hwif)
166 return (bit & 1) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; 166 return (bit & 1) ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
167} 167}
168 168
169/**** 169static const struct ide_port_ops cs5535_port_ops = {
170 * init_hwif_cs5535 - Initialize one ide cannel 170 .set_pio_mode = cs5535_set_pio_mode,
171 * @hwif: Channel descriptor 171 .set_dma_mode = cs5535_set_dma_mode,
172 * 172 .cable_detect = cs5535_cable_detect,
173 * This gets invoked by the IDE driver once for each channel. It 173};
174 * performs channel-specific pre-initialization before drive probing.
175 *
176 */
177static void __devinit init_hwif_cs5535(ide_hwif_t *hwif)
178{
179 hwif->set_pio_mode = &cs5535_set_pio_mode;
180 hwif->set_dma_mode = &cs5535_set_dma_mode;
181
182 hwif->cable_detect = cs5535_cable_detect;
183}
184 174
185static const struct ide_port_info cs5535_chipset __devinitdata = { 175static const struct ide_port_info cs5535_chipset __devinitdata = {
186 .name = "CS5535", 176 .name = "CS5535",
187 .init_hwif = init_hwif_cs5535, 177 .port_ops = &cs5535_port_ops,
188 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_POST_SET_MODE | 178 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_POST_SET_MODE |
189 IDE_HFLAG_ABUSE_SET_DMA_MODE, 179 IDE_HFLAG_ABUSE_SET_DMA_MODE,
190 .pio_mask = ATA_PIO4, 180 .pio_mask = ATA_PIO4,
diff --git a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c
index 08eab7e7f051..e30eae5a01b6 100644
--- a/drivers/ide/pci/cy82c693.c
+++ b/drivers/ide/pci/cy82c693.c
@@ -382,15 +382,6 @@ static unsigned int __devinit init_chipset_cy82c693(struct pci_dev *dev, const c
382 return 0; 382 return 0;
383} 383}
384 384
385/*
386 * the init function - called for each ide channel once
387 */
388static void __devinit init_hwif_cy82c693(ide_hwif_t *hwif)
389{
390 hwif->set_pio_mode = &cy82c693_set_pio_mode;
391 hwif->set_dma_mode = &cy82c693_set_dma_mode;
392}
393
394static void __devinit init_iops_cy82c693(ide_hwif_t *hwif) 385static void __devinit init_iops_cy82c693(ide_hwif_t *hwif)
395{ 386{
396 static ide_hwif_t *primary; 387 static ide_hwif_t *primary;
@@ -404,11 +395,16 @@ static void __devinit init_iops_cy82c693(ide_hwif_t *hwif)
404 } 395 }
405} 396}
406 397
398static const struct ide_port_ops cy82c693_port_ops = {
399 .set_pio_mode = cy82c693_set_pio_mode,
400 .set_dma_mode = cy82c693_set_dma_mode,
401};
402
407static const struct ide_port_info cy82c693_chipset __devinitdata = { 403static const struct ide_port_info cy82c693_chipset __devinitdata = {
408 .name = "CY82C693", 404 .name = "CY82C693",
409 .init_chipset = init_chipset_cy82c693, 405 .init_chipset = init_chipset_cy82c693,
410 .init_iops = init_iops_cy82c693, 406 .init_iops = init_iops_cy82c693,
411 .init_hwif = init_hwif_cy82c693, 407 .port_ops = &cy82c693_port_ops,
412 .chipset = ide_cy82c693, 408 .chipset = ide_cy82c693,
413 .host_flags = IDE_HFLAG_SINGLE, 409 .host_flags = IDE_HFLAG_SINGLE,
414 .pio_mask = ATA_PIO4, 410 .pio_mask = ATA_PIO4,
diff --git a/drivers/ide/pci/delkin_cb.c b/drivers/ide/pci/delkin_cb.c
index 753b86fc6637..c7b7e0483287 100644
--- a/drivers/ide/pci/delkin_cb.c
+++ b/drivers/ide/pci/delkin_cb.c
@@ -43,6 +43,10 @@ static const u8 setup[] = {
43 0x00, 0x00, 0x00, 0x00, 0xa4, 0x83, 0x02, 0x13, 43 0x00, 0x00, 0x00, 0x00, 0xa4, 0x83, 0x02, 0x13,
44}; 44};
45 45
46static const struct ide_port_ops delkin_cb_port_ops = {
47 .quirkproc = ide_undecoded_slave,
48};
49
46static int __devinit 50static int __devinit
47delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) 51delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
48{ 52{
@@ -89,8 +93,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
89 ide_init_port_data(hwif, i); 93 ide_init_port_data(hwif, i);
90 94
91 ide_init_port_hw(hwif, &hw); 95 ide_init_port_hw(hwif, &hw);
92 hwif->mmio = 1; 96 hwif->port_ops = &delkin_cb_port_ops;
93 hwif->quirkproc = &ide_undecoded_slave;
94 97
95 idx[0] = i; 98 idx[0] = i;
96 99
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c
index 9f2fc3094000..84c36c117194 100644
--- a/drivers/ide/pci/hpt34x.c
+++ b/drivers/ide/pci/hpt34x.c
@@ -115,11 +115,10 @@ static unsigned int __devinit init_chipset_hpt34x(struct pci_dev *dev, const cha
115 return dev->irq; 115 return dev->irq;
116} 116}
117 117
118static void __devinit init_hwif_hpt34x(ide_hwif_t *hwif) 118static const struct ide_port_ops hpt34x_port_ops = {
119{ 119 .set_pio_mode = hpt34x_set_pio_mode,
120 hwif->set_pio_mode = &hpt34x_set_pio_mode; 120 .set_dma_mode = hpt34x_set_mode,
121 hwif->set_dma_mode = &hpt34x_set_mode; 121};
122}
123 122
124#define IDE_HFLAGS_HPT34X \ 123#define IDE_HFLAGS_HPT34X \
125 (IDE_HFLAG_NO_ATAPI_DMA | \ 124 (IDE_HFLAG_NO_ATAPI_DMA | \
@@ -131,16 +130,14 @@ static const struct ide_port_info hpt34x_chipsets[] __devinitdata = {
131 { /* 0 */ 130 { /* 0 */
132 .name = "HPT343", 131 .name = "HPT343",
133 .init_chipset = init_chipset_hpt34x, 132 .init_chipset = init_chipset_hpt34x,
134 .init_hwif = init_hwif_hpt34x, 133 .port_ops = &hpt34x_port_ops,
135 .extra = 16,
136 .host_flags = IDE_HFLAGS_HPT34X | IDE_HFLAG_NON_BOOTABLE, 134 .host_flags = IDE_HFLAGS_HPT34X | IDE_HFLAG_NON_BOOTABLE,
137 .pio_mask = ATA_PIO5, 135 .pio_mask = ATA_PIO5,
138 }, 136 },
139 { /* 1 */ 137 { /* 1 */
140 .name = "HPT345", 138 .name = "HPT345",
141 .init_chipset = init_chipset_hpt34x, 139 .init_chipset = init_chipset_hpt34x,
142 .init_hwif = init_hwif_hpt34x, 140 .port_ops = &hpt34x_port_ops,
143 .extra = 16,
144 .host_flags = IDE_HFLAGS_HPT34X | IDE_HFLAG_OFF_BOARD, 141 .host_flags = IDE_HFLAGS_HPT34X | IDE_HFLAG_OFF_BOARD,
145 .pio_mask = ATA_PIO5, 142 .pio_mask = ATA_PIO5,
146#ifdef CONFIG_HPT34X_AUTODMA 143#ifdef CONFIG_HPT34X_AUTODMA
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
index a49090672145..8c02961d0188 100644
--- a/drivers/ide/pci/hpt366.c
+++ b/drivers/ide/pci/hpt366.c
@@ -776,7 +776,7 @@ static void hpt366_dma_lost_irq(ide_drive_t *drive)
776 pci_read_config_byte(dev, 0x52, &mcr3); 776 pci_read_config_byte(dev, 0x52, &mcr3);
777 pci_read_config_byte(dev, 0x5a, &scr1); 777 pci_read_config_byte(dev, 0x5a, &scr1);
778 printk("%s: (%s) mcr1=0x%02x, mcr3=0x%02x, scr1=0x%02x\n", 778 printk("%s: (%s) mcr1=0x%02x, mcr3=0x%02x, scr1=0x%02x\n",
779 drive->name, __FUNCTION__, mcr1, mcr3, scr1); 779 drive->name, __func__, mcr1, mcr3, scr1);
780 if (scr1 & 0x10) 780 if (scr1 & 0x10)
781 pci_write_config_byte(dev, 0x5a, scr1 & ~0x10); 781 pci_write_config_byte(dev, 0x5a, scr1 & ~0x10);
782 ide_dma_lost_irq(drive); 782 ide_dma_lost_irq(drive);
@@ -808,7 +808,7 @@ static void hpt370_irq_timeout(ide_drive_t *drive)
808 hpt370_clear_engine(drive); 808 hpt370_clear_engine(drive);
809} 809}
810 810
811static void hpt370_ide_dma_start(ide_drive_t *drive) 811static void hpt370_dma_start(ide_drive_t *drive)
812{ 812{
813#ifdef HPT_RESET_STATE_ENGINE 813#ifdef HPT_RESET_STATE_ENGINE
814 hpt370_clear_engine(drive); 814 hpt370_clear_engine(drive);
@@ -816,7 +816,7 @@ static void hpt370_ide_dma_start(ide_drive_t *drive)
816 ide_dma_start(drive); 816 ide_dma_start(drive);
817} 817}
818 818
819static int hpt370_ide_dma_end(ide_drive_t *drive) 819static int hpt370_dma_end(ide_drive_t *drive)
820{ 820{
821 ide_hwif_t *hwif = HWIF(drive); 821 ide_hwif_t *hwif = HWIF(drive);
822 u8 dma_stat = inb(hwif->dma_status); 822 u8 dma_stat = inb(hwif->dma_status);
@@ -838,7 +838,7 @@ static void hpt370_dma_timeout(ide_drive_t *drive)
838} 838}
839 839
840/* returns 1 if DMA IRQ issued, 0 otherwise */ 840/* returns 1 if DMA IRQ issued, 0 otherwise */
841static int hpt374_ide_dma_test_irq(ide_drive_t *drive) 841static int hpt374_dma_test_irq(ide_drive_t *drive)
842{ 842{
843 ide_hwif_t *hwif = HWIF(drive); 843 ide_hwif_t *hwif = HWIF(drive);
844 struct pci_dev *dev = to_pci_dev(hwif->dev); 844 struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -858,11 +858,11 @@ static int hpt374_ide_dma_test_irq(ide_drive_t *drive)
858 858
859 if (!drive->waiting_for_dma) 859 if (!drive->waiting_for_dma)
860 printk(KERN_WARNING "%s: (%s) called while not waiting\n", 860 printk(KERN_WARNING "%s: (%s) called while not waiting\n",
861 drive->name, __FUNCTION__); 861 drive->name, __func__);
862 return 0; 862 return 0;
863} 863}
864 864
865static int hpt374_ide_dma_end(ide_drive_t *drive) 865static int hpt374_dma_end(ide_drive_t *drive)
866{ 866{
867 ide_hwif_t *hwif = HWIF(drive); 867 ide_hwif_t *hwif = HWIF(drive);
868 struct pci_dev *dev = to_pci_dev(hwif->dev); 868 struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -1271,17 +1271,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
1271 /* Cache the channel's MISC. control registers' offset */ 1271 /* Cache the channel's MISC. control registers' offset */
1272 hwif->select_data = hwif->channel ? 0x54 : 0x50; 1272 hwif->select_data = hwif->channel ? 0x54 : 0x50;
1273 1273
1274 hwif->set_pio_mode = &hpt3xx_set_pio_mode;
1275 hwif->set_dma_mode = &hpt3xx_set_mode;
1276
1277 hwif->quirkproc = &hpt3xx_quirkproc;
1278 hwif->maskproc = &hpt3xx_maskproc;
1279
1280 hwif->udma_filter = &hpt3xx_udma_filter;
1281 hwif->mdma_filter = &hpt3xx_mdma_filter;
1282
1283 hwif->cable_detect = hpt3xx_cable_detect;
1284
1285 /* 1274 /*
1286 * HPT3xxN chips have some complications: 1275 * HPT3xxN chips have some complications:
1287 * 1276 *
@@ -1323,29 +1312,19 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
1323 1312
1324 if (new_mcr != old_mcr) 1313 if (new_mcr != old_mcr)
1325 pci_write_config_byte(dev, hwif->select_data + 1, new_mcr); 1314 pci_write_config_byte(dev, hwif->select_data + 1, new_mcr);
1326
1327 if (hwif->dma_base == 0)
1328 return;
1329
1330 if (chip_type >= HPT374) {
1331 hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq;
1332 hwif->ide_dma_end = &hpt374_ide_dma_end;
1333 } else if (chip_type >= HPT370) {
1334 hwif->dma_start = &hpt370_ide_dma_start;
1335 hwif->ide_dma_end = &hpt370_ide_dma_end;
1336 hwif->dma_timeout = &hpt370_dma_timeout;
1337 } else
1338 hwif->dma_lost_irq = &hpt366_dma_lost_irq;
1339} 1315}
1340 1316
1341static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase) 1317static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
1318 const struct ide_port_info *d)
1342{ 1319{
1343 struct pci_dev *dev = to_pci_dev(hwif->dev); 1320 struct pci_dev *dev = to_pci_dev(hwif->dev);
1344 u8 masterdma = 0, slavedma = 0; 1321 unsigned long flags, base = ide_pci_dma_base(hwif, d);
1345 u8 dma_new = 0, dma_old = 0; 1322 u8 dma_old, dma_new, masterdma = 0, slavedma = 0;
1346 unsigned long flags;
1347 1323
1348 dma_old = inb(dmabase + 2); 1324 if (base == 0 || ide_pci_set_master(dev, d->name) < 0)
1325 return -1;
1326
1327 dma_old = inb(base + 2);
1349 1328
1350 local_irq_save(flags); 1329 local_irq_save(flags);
1351 1330
@@ -1356,11 +1335,21 @@ static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase)
1356 if (masterdma & 0x30) dma_new |= 0x20; 1335 if (masterdma & 0x30) dma_new |= 0x20;
1357 if ( slavedma & 0x30) dma_new |= 0x40; 1336 if ( slavedma & 0x30) dma_new |= 0x40;
1358 if (dma_new != dma_old) 1337 if (dma_new != dma_old)
1359 outb(dma_new, dmabase + 2); 1338 outb(dma_new, base + 2);
1360 1339
1361 local_irq_restore(flags); 1340 local_irq_restore(flags);
1362 1341
1363 ide_setup_dma(hwif, dmabase); 1342 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
1343 hwif->name, base, base + 7);
1344
1345 hwif->extra_base = base + (hwif->channel ? 8 : 16);
1346
1347 if (ide_allocate_dma_engine(hwif))
1348 return -1;
1349
1350 ide_setup_dma(hwif, base);
1351
1352 return 0;
1364} 1353}
1365 1354
1366static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2) 1355static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2)
@@ -1416,6 +1405,49 @@ static int __devinit hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2)
1416 IDE_HFLAG_ABUSE_SET_DMA_MODE | \ 1405 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
1417 IDE_HFLAG_OFF_BOARD) 1406 IDE_HFLAG_OFF_BOARD)
1418 1407
1408static const struct ide_port_ops hpt3xx_port_ops = {
1409 .set_pio_mode = hpt3xx_set_pio_mode,
1410 .set_dma_mode = hpt3xx_set_mode,
1411 .quirkproc = hpt3xx_quirkproc,
1412 .maskproc = hpt3xx_maskproc,
1413 .mdma_filter = hpt3xx_mdma_filter,
1414 .udma_filter = hpt3xx_udma_filter,
1415 .cable_detect = hpt3xx_cable_detect,
1416};
1417
1418static const struct ide_dma_ops hpt37x_dma_ops = {
1419 .dma_host_set = ide_dma_host_set,
1420 .dma_setup = ide_dma_setup,
1421 .dma_exec_cmd = ide_dma_exec_cmd,
1422 .dma_start = ide_dma_start,
1423 .dma_end = hpt374_dma_end,
1424 .dma_test_irq = hpt374_dma_test_irq,
1425 .dma_lost_irq = ide_dma_lost_irq,
1426 .dma_timeout = ide_dma_timeout,
1427};
1428
1429static const struct ide_dma_ops hpt370_dma_ops = {
1430 .dma_host_set = ide_dma_host_set,
1431 .dma_setup = ide_dma_setup,
1432 .dma_exec_cmd = ide_dma_exec_cmd,
1433 .dma_start = hpt370_dma_start,
1434 .dma_end = hpt370_dma_end,
1435 .dma_test_irq = ide_dma_test_irq,
1436 .dma_lost_irq = ide_dma_lost_irq,
1437 .dma_timeout = hpt370_dma_timeout,
1438};
1439
1440static const struct ide_dma_ops hpt36x_dma_ops = {
1441 .dma_host_set = ide_dma_host_set,
1442 .dma_setup = ide_dma_setup,
1443 .dma_exec_cmd = ide_dma_exec_cmd,
1444 .dma_start = ide_dma_start,
1445 .dma_end = __ide_dma_end,
1446 .dma_test_irq = ide_dma_test_irq,
1447 .dma_lost_irq = hpt366_dma_lost_irq,
1448 .dma_timeout = ide_dma_timeout,
1449};
1450
1419static const struct ide_port_info hpt366_chipsets[] __devinitdata = { 1451static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1420 { /* 0 */ 1452 { /* 0 */
1421 .name = "HPT36x", 1453 .name = "HPT36x",
@@ -1429,7 +1461,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1429 * Bit 4 is for the primary channel, bit 5 for the secondary. 1461 * Bit 4 is for the primary channel, bit 5 for the secondary.
1430 */ 1462 */
1431 .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}}, 1463 .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}},
1432 .extra = 240, 1464 .port_ops = &hpt3xx_port_ops,
1465 .dma_ops = &hpt36x_dma_ops,
1433 .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE, 1466 .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE,
1434 .pio_mask = ATA_PIO4, 1467 .pio_mask = ATA_PIO4,
1435 .mwdma_mask = ATA_MWDMA2, 1468 .mwdma_mask = ATA_MWDMA2,
@@ -1439,7 +1472,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1439 .init_hwif = init_hwif_hpt366, 1472 .init_hwif = init_hwif_hpt366,
1440 .init_dma = init_dma_hpt366, 1473 .init_dma = init_dma_hpt366,
1441 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, 1474 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1442 .extra = 240, 1475 .port_ops = &hpt3xx_port_ops,
1476 .dma_ops = &hpt37x_dma_ops,
1443 .host_flags = IDE_HFLAGS_HPT3XX, 1477 .host_flags = IDE_HFLAGS_HPT3XX,
1444 .pio_mask = ATA_PIO4, 1478 .pio_mask = ATA_PIO4,
1445 .mwdma_mask = ATA_MWDMA2, 1479 .mwdma_mask = ATA_MWDMA2,
@@ -1449,7 +1483,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1449 .init_hwif = init_hwif_hpt366, 1483 .init_hwif = init_hwif_hpt366,
1450 .init_dma = init_dma_hpt366, 1484 .init_dma = init_dma_hpt366,
1451 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, 1485 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1452 .extra = 240, 1486 .port_ops = &hpt3xx_port_ops,
1487 .dma_ops = &hpt37x_dma_ops,
1453 .host_flags = IDE_HFLAGS_HPT3XX, 1488 .host_flags = IDE_HFLAGS_HPT3XX,
1454 .pio_mask = ATA_PIO4, 1489 .pio_mask = ATA_PIO4,
1455 .mwdma_mask = ATA_MWDMA2, 1490 .mwdma_mask = ATA_MWDMA2,
@@ -1459,7 +1494,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1459 .init_hwif = init_hwif_hpt366, 1494 .init_hwif = init_hwif_hpt366,
1460 .init_dma = init_dma_hpt366, 1495 .init_dma = init_dma_hpt366,
1461 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, 1496 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1462 .extra = 240, 1497 .port_ops = &hpt3xx_port_ops,
1498 .dma_ops = &hpt37x_dma_ops,
1463 .host_flags = IDE_HFLAGS_HPT3XX, 1499 .host_flags = IDE_HFLAGS_HPT3XX,
1464 .pio_mask = ATA_PIO4, 1500 .pio_mask = ATA_PIO4,
1465 .mwdma_mask = ATA_MWDMA2, 1501 .mwdma_mask = ATA_MWDMA2,
@@ -1470,7 +1506,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1470 .init_dma = init_dma_hpt366, 1506 .init_dma = init_dma_hpt366,
1471 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, 1507 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1472 .udma_mask = ATA_UDMA5, 1508 .udma_mask = ATA_UDMA5,
1473 .extra = 240, 1509 .port_ops = &hpt3xx_port_ops,
1510 .dma_ops = &hpt37x_dma_ops,
1474 .host_flags = IDE_HFLAGS_HPT3XX, 1511 .host_flags = IDE_HFLAGS_HPT3XX,
1475 .pio_mask = ATA_PIO4, 1512 .pio_mask = ATA_PIO4,
1476 .mwdma_mask = ATA_MWDMA2, 1513 .mwdma_mask = ATA_MWDMA2,
@@ -1480,7 +1517,8 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = {
1480 .init_hwif = init_hwif_hpt366, 1517 .init_hwif = init_hwif_hpt366,
1481 .init_dma = init_dma_hpt366, 1518 .init_dma = init_dma_hpt366,
1482 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, 1519 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1483 .extra = 240, 1520 .port_ops = &hpt3xx_port_ops,
1521 .dma_ops = &hpt37x_dma_ops,
1484 .host_flags = IDE_HFLAGS_HPT3XX, 1522 .host_flags = IDE_HFLAGS_HPT3XX,
1485 .pio_mask = ATA_PIO4, 1523 .pio_mask = ATA_PIO4,
1486 .mwdma_mask = ATA_MWDMA2, 1524 .mwdma_mask = ATA_MWDMA2,
@@ -1543,6 +1581,10 @@ static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_devic
1543 d.name = info->chip_name; 1581 d.name = info->chip_name;
1544 d.udma_mask = info->udma_mask; 1582 d.udma_mask = info->udma_mask;
1545 1583
1584 /* fixup ->dma_ops for HPT370/HPT370A */
1585 if (info == &hpt370 || info == &hpt370a)
1586 d.dma_ops = &hpt370_dma_ops;
1587
1546 pci_set_drvdata(dev, (void *)info); 1588 pci_set_drvdata(dev, (void *)info);
1547 1589
1548 if (info == &hpt36x || info == &hpt374) 1590 if (info == &hpt36x || info == &hpt374)
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c
index 5b5b0cc4b76a..9053c8771e6e 100644
--- a/drivers/ide/pci/it8213.c
+++ b/drivers/ide/pci/it8213.c
@@ -149,27 +149,17 @@ static u8 __devinit it8213_cable_detect(ide_hwif_t *hwif)
149 return (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; 149 return (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
150} 150}
151 151
152/** 152static const struct ide_port_ops it8213_port_ops = {
153 * init_hwif_it8213 - set up hwif structs 153 .set_pio_mode = it8213_set_pio_mode,
154 * @hwif: interface to set up 154 .set_dma_mode = it8213_set_dma_mode,
155 * 155 .cable_detect = it8213_cable_detect,
156 * We do the basic set up of the interface structure. 156};
157 */
158
159static void __devinit init_hwif_it8213(ide_hwif_t *hwif)
160{
161 hwif->set_dma_mode = &it8213_set_dma_mode;
162 hwif->set_pio_mode = &it8213_set_pio_mode;
163
164 hwif->cable_detect = it8213_cable_detect;
165}
166
167 157
168#define DECLARE_ITE_DEV(name_str) \ 158#define DECLARE_ITE_DEV(name_str) \
169 { \ 159 { \
170 .name = name_str, \ 160 .name = name_str, \
171 .init_hwif = init_hwif_it8213, \
172 .enablebits = { {0x41, 0x80, 0x80} }, \ 161 .enablebits = { {0x41, 0x80, 0x80} }, \
162 .port_ops = &it8213_port_ops, \
173 .host_flags = IDE_HFLAG_SINGLE, \ 163 .host_flags = IDE_HFLAG_SINGLE, \
174 .pio_mask = ATA_PIO4, \ 164 .pio_mask = ATA_PIO4, \
175 .swdma_mask = ATA_SWDMA2_ONLY, \ 165 .swdma_mask = ATA_SWDMA2_ONLY, \
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
index a38ec47423a0..6ab04115286b 100644
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -418,7 +418,7 @@ static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed)
418} 418}
419 419
420/** 420/**
421 * ata66_it821x - check for 80 pin cable 421 * it821x_cable_detect - cable detection
422 * @hwif: interface to check 422 * @hwif: interface to check
423 * 423 *
424 * Check for the presence of an ATA66 capable cable on the 424 * Check for the presence of an ATA66 capable cable on the
@@ -426,7 +426,7 @@ static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed)
426 * the needed logic onboard. 426 * the needed logic onboard.
427 */ 427 */
428 428
429static u8 __devinit ata66_it821x(ide_hwif_t *hwif) 429static u8 __devinit it821x_cable_detect(ide_hwif_t *hwif)
430{ 430{
431 /* The reference driver also only does disk side */ 431 /* The reference driver also only does disk side */
432 return ATA_CBL_PATA80; 432 return ATA_CBL_PATA80;
@@ -511,6 +511,11 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive)
511 511
512} 512}
513 513
514static struct ide_dma_ops it821x_pass_through_dma_ops = {
515 .dma_start = it821x_dma_start,
516 .dma_end = it821x_dma_end,
517};
518
514/** 519/**
515 * init_hwif_it821x - set up hwif structs 520 * init_hwif_it821x - set up hwif structs
516 * @hwif: interface to set up 521 * @hwif: interface to set up
@@ -527,8 +532,6 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
527 struct it821x_dev *idev = itdevs[hwif->channel]; 532 struct it821x_dev *idev = itdevs[hwif->channel];
528 u8 conf; 533 u8 conf;
529 534
530 hwif->quirkproc = &it821x_quirkproc;
531
532 ide_set_hwifdata(hwif, idev); 535 ide_set_hwifdata(hwif, idev);
533 536
534 pci_read_config_byte(dev, 0x50, &conf); 537 pci_read_config_byte(dev, 0x50, &conf);
@@ -563,17 +566,11 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
563 } 566 }
564 567
565 if (idev->smart == 0) { 568 if (idev->smart == 0) {
566 hwif->set_pio_mode = &it821x_set_pio_mode;
567 hwif->set_dma_mode = &it821x_set_dma_mode;
568
569 /* MWDMA/PIO clock switching for pass through mode */ 569 /* MWDMA/PIO clock switching for pass through mode */
570 hwif->dma_start = &it821x_dma_start; 570 hwif->dma_ops = &it821x_pass_through_dma_ops;
571 hwif->ide_dma_end = &it821x_dma_end;
572 } else 571 } else
573 hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; 572 hwif->host_flags |= IDE_HFLAG_NO_SET_MODE;
574 573
575 hwif->cable_detect = ata66_it821x;
576
577 if (hwif->dma_base == 0) 574 if (hwif->dma_base == 0)
578 return; 575 return;
579 576
@@ -613,12 +610,20 @@ static unsigned int __devinit init_chipset_it821x(struct pci_dev *dev, const cha
613 return 0; 610 return 0;
614} 611}
615 612
613static const struct ide_port_ops it821x_port_ops = {
614 /* it821x_set_{pio,dma}_mode() are only used in pass-through mode */
615 .set_pio_mode = it821x_set_pio_mode,
616 .set_dma_mode = it821x_set_dma_mode,
617 .quirkproc = it821x_quirkproc,
618 .cable_detect = it821x_cable_detect,
619};
616 620
617#define DECLARE_ITE_DEV(name_str) \ 621#define DECLARE_ITE_DEV(name_str) \
618 { \ 622 { \
619 .name = name_str, \ 623 .name = name_str, \
620 .init_chipset = init_chipset_it821x, \ 624 .init_chipset = init_chipset_it821x, \
621 .init_hwif = init_hwif_it821x, \ 625 .init_hwif = init_hwif_it821x, \
626 .port_ops = &it821x_port_ops, \
622 .pio_mask = ATA_PIO4, \ 627 .pio_mask = ATA_PIO4, \
623 } 628 }
624 629
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c
index 673f7dc8ba65..96ef7394f283 100644
--- a/drivers/ide/pci/jmicron.c
+++ b/drivers/ide/pci/jmicron.c
@@ -19,13 +19,13 @@ typedef enum {
19} port_type; 19} port_type;
20 20
21/** 21/**
22 * ata66_jmicron - Cable check 22 * jmicron_cable_detect - cable detection
23 * @hwif: IDE port 23 * @hwif: IDE port
24 * 24 *
25 * Returns the cable type. 25 * Returns the cable type.
26 */ 26 */
27 27
28static u8 __devinit ata66_jmicron(ide_hwif_t *hwif) 28static u8 __devinit jmicron_cable_detect(ide_hwif_t *hwif)
29{ 29{
30 struct pci_dev *pdev = to_pci_dev(hwif->dev); 30 struct pci_dev *pdev = to_pci_dev(hwif->dev);
31 31
@@ -95,25 +95,16 @@ static void jmicron_set_dma_mode(ide_drive_t *drive, const u8 mode)
95{ 95{
96} 96}
97 97
98/** 98static const struct ide_port_ops jmicron_port_ops = {
99 * init_hwif_jmicron - set up hwif structs 99 .set_pio_mode = jmicron_set_pio_mode,
100 * @hwif: interface to set up 100 .set_dma_mode = jmicron_set_dma_mode,
101 * 101 .cable_detect = jmicron_cable_detect,
102 * Minimal set up is required for the Jmicron hardware. 102};
103 */
104
105static void __devinit init_hwif_jmicron(ide_hwif_t *hwif)
106{
107 hwif->set_pio_mode = &jmicron_set_pio_mode;
108 hwif->set_dma_mode = &jmicron_set_dma_mode;
109
110 hwif->cable_detect = ata66_jmicron;
111}
112 103
113static const struct ide_port_info jmicron_chipset __devinitdata = { 104static const struct ide_port_info jmicron_chipset __devinitdata = {
114 .name = "JMB", 105 .name = "JMB",
115 .init_hwif = init_hwif_jmicron,
116 .enablebits = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } }, 106 .enablebits = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } },
107 .port_ops = &jmicron_port_ops,
117 .pio_mask = ATA_PIO5, 108 .pio_mask = ATA_PIO5,
118 .mwdma_mask = ATA_MWDMA2, 109 .mwdma_mask = ATA_MWDMA2,
119 .udma_mask = ATA_UDMA6, 110 .udma_mask = ATA_UDMA6,
diff --git a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c
index 3015d6916d4c..e1b0c9a9ab9c 100644
--- a/drivers/ide/pci/ns87415.c
+++ b/drivers/ide/pci/ns87415.c
@@ -150,7 +150,7 @@ static void ns87415_selectproc (ide_drive_t *drive)
150 ns87415_prepare_drive (drive, drive->using_dma); 150 ns87415_prepare_drive (drive, drive->using_dma);
151} 151}
152 152
153static int ns87415_ide_dma_end (ide_drive_t *drive) 153static int ns87415_dma_end(ide_drive_t *drive)
154{ 154{
155 ide_hwif_t *hwif = HWIF(drive); 155 ide_hwif_t *hwif = HWIF(drive);
156 u8 dma_stat = 0, dma_cmd = 0; 156 u8 dma_stat = 0, dma_cmd = 0;
@@ -170,7 +170,7 @@ static int ns87415_ide_dma_end (ide_drive_t *drive)
170 return (dma_stat & 7) != 4; 170 return (dma_stat & 7) != 4;
171} 171}
172 172
173static int ns87415_ide_dma_setup(ide_drive_t *drive) 173static int ns87415_dma_setup(ide_drive_t *drive)
174{ 174{
175 /* select DMA xfer */ 175 /* select DMA xfer */
176 ns87415_prepare_drive(drive, 1); 176 ns87415_prepare_drive(drive, 1);
@@ -195,8 +195,6 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
195 u8 stat; 195 u8 stat;
196#endif 196#endif
197 197
198 hwif->selectproc = &ns87415_selectproc;
199
200 /* 198 /*
201 * We cannot probe for IRQ: both ports share common IRQ on INTA. 199 * We cannot probe for IRQ: both ports share common IRQ on INTA.
202 * Also, leave IRQ masked during drive probing, to prevent infinite 200 * Also, leave IRQ masked during drive probing, to prevent infinite
@@ -254,16 +252,31 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
254 return; 252 return;
255 253
256 outb(0x60, hwif->dma_status); 254 outb(0x60, hwif->dma_status);
257 hwif->dma_setup = &ns87415_ide_dma_setup;
258 hwif->ide_dma_end = &ns87415_ide_dma_end;
259} 255}
260 256
257static const struct ide_port_ops ns87415_port_ops = {
258 .selectproc = ns87415_selectproc,
259};
260
261static const struct ide_dma_ops ns87415_dma_ops = {
262 .dma_host_set = ide_dma_host_set,
263 .dma_setup = ns87415_dma_setup,
264 .dma_exec_cmd = ide_dma_exec_cmd,
265 .dma_start = ide_dma_start,
266 .dma_end = ns87415_dma_end,
267 .dma_test_irq = ide_dma_test_irq,
268 .dma_lost_irq = ide_dma_lost_irq,
269 .dma_timeout = ide_dma_timeout,
270};
271
261static const struct ide_port_info ns87415_chipset __devinitdata = { 272static const struct ide_port_info ns87415_chipset __devinitdata = {
262 .name = "NS87415", 273 .name = "NS87415",
263#ifdef CONFIG_SUPERIO 274#ifdef CONFIG_SUPERIO
264 .init_iops = init_iops_ns87415, 275 .init_iops = init_iops_ns87415,
265#endif 276#endif
266 .init_hwif = init_hwif_ns87415, 277 .init_hwif = init_hwif_ns87415,
278 .port_ops = &ns87415_port_ops,
279 .dma_ops = &ns87415_dma_ops,
267 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | 280 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA |
268 IDE_HFLAG_NO_ATAPI_DMA, 281 IDE_HFLAG_NO_ATAPI_DMA,
269}; 282};
diff --git a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c
index 88a4dd94eeea..9edacba20ffb 100644
--- a/drivers/ide/pci/opti621.c
+++ b/drivers/ide/pci/opti621.c
@@ -326,28 +326,24 @@ static void __devinit opti621_port_init_devs(ide_hwif_t *hwif)
326 hwif->drives[1].drive_data = PIO_DONT_KNOW; 326 hwif->drives[1].drive_data = PIO_DONT_KNOW;
327} 327}
328 328
329/* 329static const struct ide_port_ops opti621_port_ops = {
330 * init_hwif_opti621() is called once for each hwif found at boot. 330 .port_init_devs = opti621_port_init_devs,
331 */ 331 .set_pio_mode = opti621_set_pio_mode,
332static void __devinit init_hwif_opti621(ide_hwif_t *hwif) 332};
333{
334 hwif->port_init_devs = opti621_port_init_devs;
335 hwif->set_pio_mode = &opti621_set_pio_mode;
336}
337 333
338static const struct ide_port_info opti621_chipsets[] __devinitdata = { 334static const struct ide_port_info opti621_chipsets[] __devinitdata = {
339 { /* 0 */ 335 { /* 0 */
340 .name = "OPTI621", 336 .name = "OPTI621",
341 .init_hwif = init_hwif_opti621,
342 .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} }, 337 .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} },
338 .port_ops = &opti621_port_ops,
343 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA, 339 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA,
344 .pio_mask = ATA_PIO3, 340 .pio_mask = ATA_PIO3,
345 .swdma_mask = ATA_SWDMA2, 341 .swdma_mask = ATA_SWDMA2,
346 .mwdma_mask = ATA_MWDMA2, 342 .mwdma_mask = ATA_MWDMA2,
347 }, { /* 1 */ 343 }, { /* 1 */
348 .name = "OPTI621X", 344 .name = "OPTI621X",
349 .init_hwif = init_hwif_opti621,
350 .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} }, 345 .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} },
346 .port_ops = &opti621_port_ops,
351 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA, 347 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA,
352 .pio_mask = ATA_PIO3, 348 .pio_mask = ATA_PIO3,
353 .swdma_mask = ATA_SWDMA2, 349 .swdma_mask = ATA_SWDMA2,
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c
index 1c8cb7797a4a..ec9bd7b352fc 100644
--- a/drivers/ide/pci/pdc202xx_new.c
+++ b/drivers/ide/pci/pdc202xx_new.c
@@ -34,7 +34,7 @@
34#undef DEBUG 34#undef DEBUG
35 35
36#ifdef DEBUG 36#ifdef DEBUG
37#define DBG(fmt, args...) printk("%s: " fmt, __FUNCTION__, ## args) 37#define DBG(fmt, args...) printk("%s: " fmt, __func__, ## args)
38#else 38#else
39#define DBG(fmt, args...) 39#define DBG(fmt, args...)
40#endif 40#endif
@@ -442,17 +442,6 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha
442 return dev->irq; 442 return dev->irq;
443} 443}
444 444
445static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
446{
447 hwif->set_pio_mode = &pdcnew_set_pio_mode;
448 hwif->set_dma_mode = &pdcnew_set_dma_mode;
449
450 hwif->quirkproc = &pdcnew_quirkproc;
451 hwif->resetproc = &pdcnew_reset;
452
453 hwif->cable_detect = pdcnew_cable_detect;
454}
455
456static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev) 445static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev)
457{ 446{
458 struct pci_dev *dev2; 447 struct pci_dev *dev2;
@@ -476,11 +465,19 @@ static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev)
476 return NULL; 465 return NULL;
477} 466}
478 467
468static const struct ide_port_ops pdcnew_port_ops = {
469 .set_pio_mode = pdcnew_set_pio_mode,
470 .set_dma_mode = pdcnew_set_dma_mode,
471 .quirkproc = pdcnew_quirkproc,
472 .resetproc = pdcnew_reset,
473 .cable_detect = pdcnew_cable_detect,
474};
475
479#define DECLARE_PDCNEW_DEV(name_str, udma) \ 476#define DECLARE_PDCNEW_DEV(name_str, udma) \
480 { \ 477 { \
481 .name = name_str, \ 478 .name = name_str, \
482 .init_chipset = init_chipset_pdcnew, \ 479 .init_chipset = init_chipset_pdcnew, \
483 .init_hwif = init_hwif_pdc202new, \ 480 .port_ops = &pdcnew_port_ops, \
484 .host_flags = IDE_HFLAG_POST_SET_MODE | \ 481 .host_flags = IDE_HFLAG_POST_SET_MODE | \
485 IDE_HFLAG_ERROR_STOPS_FIFO | \ 482 IDE_HFLAG_ERROR_STOPS_FIFO | \
486 IDE_HFLAG_OFF_BOARD, \ 483 IDE_HFLAG_OFF_BOARD, \
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c
index 150422ec3cfa..fca89eda5c02 100644
--- a/drivers/ide/pci/pdc202xx_old.c
+++ b/drivers/ide/pci/pdc202xx_old.c
@@ -115,7 +115,7 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
115 pdc202xx_set_mode(drive, XFER_PIO_0 + pio); 115 pdc202xx_set_mode(drive, XFER_PIO_0 + pio);
116} 116}
117 117
118static u8 __devinit pdc2026x_old_cable_detect(ide_hwif_t *hwif) 118static u8 __devinit pdc2026x_cable_detect(ide_hwif_t *hwif)
119{ 119{
120 struct pci_dev *dev = to_pci_dev(hwif->dev); 120 struct pci_dev *dev = to_pci_dev(hwif->dev);
121 u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10); 121 u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10);
@@ -163,7 +163,7 @@ static void pdc202xx_quirkproc(ide_drive_t *drive)
163 drive->quirk_list = 0; 163 drive->quirk_list = 0;
164} 164}
165 165
166static void pdc202xx_old_ide_dma_start(ide_drive_t *drive) 166static void pdc202xx_dma_start(ide_drive_t *drive)
167{ 167{
168 if (drive->current_speed > XFER_UDMA_2) 168 if (drive->current_speed > XFER_UDMA_2)
169 pdc_old_enable_66MHz_clock(drive->hwif); 169 pdc_old_enable_66MHz_clock(drive->hwif);
@@ -185,7 +185,7 @@ static void pdc202xx_old_ide_dma_start(ide_drive_t *drive)
185 ide_dma_start(drive); 185 ide_dma_start(drive);
186} 186}
187 187
188static int pdc202xx_old_ide_dma_end(ide_drive_t *drive) 188static int pdc202xx_dma_end(ide_drive_t *drive)
189{ 189{
190 if (drive->media != ide_disk || drive->addressing == 1) { 190 if (drive->media != ide_disk || drive->addressing == 1) {
191 ide_hwif_t *hwif = HWIF(drive); 191 ide_hwif_t *hwif = HWIF(drive);
@@ -202,7 +202,7 @@ static int pdc202xx_old_ide_dma_end(ide_drive_t *drive)
202 return __ide_dma_end(drive); 202 return __ide_dma_end(drive);
203} 203}
204 204
205static int pdc202xx_old_ide_dma_test_irq(ide_drive_t *drive) 205static int pdc202xx_dma_test_irq(ide_drive_t *drive)
206{ 206{
207 ide_hwif_t *hwif = HWIF(drive); 207 ide_hwif_t *hwif = HWIF(drive);
208 unsigned long high_16 = hwif->extra_base - 16; 208 unsigned long high_16 = hwif->extra_base - 16;
@@ -226,26 +226,6 @@ somebody_else:
226 return (dma_stat & 4) == 4; /* return 1 if INTR asserted */ 226 return (dma_stat & 4) == 4; /* return 1 if INTR asserted */
227} 227}
228 228
229static void pdc202xx_dma_lost_irq(ide_drive_t *drive)
230{
231 ide_hwif_t *hwif = HWIF(drive);
232
233 if (hwif->resetproc != NULL)
234 hwif->resetproc(drive);
235
236 ide_dma_lost_irq(drive);
237}
238
239static void pdc202xx_dma_timeout(ide_drive_t *drive)
240{
241 ide_hwif_t *hwif = HWIF(drive);
242
243 if (hwif->resetproc != NULL)
244 hwif->resetproc(drive);
245
246 ide_dma_timeout(drive);
247}
248
249static void pdc202xx_reset_host (ide_hwif_t *hwif) 229static void pdc202xx_reset_host (ide_hwif_t *hwif)
250{ 230{
251 unsigned long high_16 = hwif->extra_base - 16; 231 unsigned long high_16 = hwif->extra_base - 16;
@@ -271,68 +251,46 @@ static void pdc202xx_reset (ide_drive_t *drive)
271 ide_set_max_pio(drive); 251 ide_set_max_pio(drive);
272} 252}
273 253
274static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, 254static void pdc202xx_dma_lost_irq(ide_drive_t *drive)
275 const char *name)
276{ 255{
277 return dev->irq; 256 pdc202xx_reset(drive);
257 ide_dma_lost_irq(drive);
278} 258}
279 259
280static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) 260static void pdc202xx_dma_timeout(ide_drive_t *drive)
281{ 261{
282 struct pci_dev *dev = to_pci_dev(hwif->dev); 262 pdc202xx_reset(drive);
283 263 ide_dma_timeout(drive);
284 hwif->set_pio_mode = &pdc202xx_set_pio_mode;
285 hwif->set_dma_mode = &pdc202xx_set_mode;
286
287 hwif->quirkproc = &pdc202xx_quirkproc;
288
289 if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
290 hwif->resetproc = &pdc202xx_reset;
291
292 hwif->cable_detect = pdc2026x_old_cable_detect;
293 }
294
295 if (hwif->dma_base == 0)
296 return;
297
298 hwif->dma_lost_irq = &pdc202xx_dma_lost_irq;
299 hwif->dma_timeout = &pdc202xx_dma_timeout;
300
301 if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
302 hwif->dma_start = &pdc202xx_old_ide_dma_start;
303 hwif->ide_dma_end = &pdc202xx_old_ide_dma_end;
304 }
305 hwif->ide_dma_test_irq = &pdc202xx_old_ide_dma_test_irq;
306} 264}
307 265
308static void __devinit init_dma_pdc202xx(ide_hwif_t *hwif, unsigned long dmabase) 266static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev,
267 const char *name)
309{ 268{
269 unsigned long dmabase = pci_resource_start(dev, 4);
310 u8 udma_speed_flag = 0, primary_mode = 0, secondary_mode = 0; 270 u8 udma_speed_flag = 0, primary_mode = 0, secondary_mode = 0;
311 271
312 if (hwif->channel) { 272 if (dmabase == 0)
313 ide_setup_dma(hwif, dmabase); 273 goto out;
314 return;
315 }
316 274
317 udma_speed_flag = inb(dmabase | 0x1f); 275 udma_speed_flag = inb(dmabase | 0x1f);
318 primary_mode = inb(dmabase | 0x1a); 276 primary_mode = inb(dmabase | 0x1a);
319 secondary_mode = inb(dmabase | 0x1b); 277 secondary_mode = inb(dmabase | 0x1b);
320 printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \ 278 printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \
321 "Primary %s Mode " \ 279 "Primary %s Mode " \
322 "Secondary %s Mode.\n", hwif->cds->name, 280 "Secondary %s Mode.\n", pci_name(dev),
323 (udma_speed_flag & 1) ? "EN" : "DIS", 281 (udma_speed_flag & 1) ? "EN" : "DIS",
324 (primary_mode & 1) ? "MASTER" : "PCI", 282 (primary_mode & 1) ? "MASTER" : "PCI",
325 (secondary_mode & 1) ? "MASTER" : "PCI" ); 283 (secondary_mode & 1) ? "MASTER" : "PCI" );
326 284
327 if (!(udma_speed_flag & 1)) { 285 if (!(udma_speed_flag & 1)) {
328 printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ", 286 printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ",
329 hwif->cds->name, udma_speed_flag, 287 pci_name(dev), udma_speed_flag,
330 (udma_speed_flag|1)); 288 (udma_speed_flag|1));
331 outb(udma_speed_flag | 1, dmabase | 0x1f); 289 outb(udma_speed_flag | 1, dmabase | 0x1f);
332 printk("%sACTIVE\n", (inb(dmabase | 0x1f) & 1) ? "" : "IN"); 290 printk("%sACTIVE\n", (inb(dmabase | 0x1f) & 1) ? "" : "IN");
333 } 291 }
334 292out:
335 ide_setup_dma(hwif, dmabase); 293 return dev->irq;
336} 294}
337 295
338static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, 296static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
@@ -357,13 +315,48 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
357 IDE_HFLAG_ABUSE_SET_DMA_MODE | \ 315 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
358 IDE_HFLAG_OFF_BOARD) 316 IDE_HFLAG_OFF_BOARD)
359 317
318static const struct ide_port_ops pdc20246_port_ops = {
319 .set_pio_mode = pdc202xx_set_pio_mode,
320 .set_dma_mode = pdc202xx_set_mode,
321 .quirkproc = pdc202xx_quirkproc,
322};
323
324static const struct ide_port_ops pdc2026x_port_ops = {
325 .set_pio_mode = pdc202xx_set_pio_mode,
326 .set_dma_mode = pdc202xx_set_mode,
327 .quirkproc = pdc202xx_quirkproc,
328 .resetproc = pdc202xx_reset,
329 .cable_detect = pdc2026x_cable_detect,
330};
331
332static const struct ide_dma_ops pdc20246_dma_ops = {
333 .dma_host_set = ide_dma_host_set,
334 .dma_setup = ide_dma_setup,
335 .dma_exec_cmd = ide_dma_exec_cmd,
336 .dma_start = ide_dma_start,
337 .dma_end = __ide_dma_end,
338 .dma_test_irq = pdc202xx_dma_test_irq,
339 .dma_lost_irq = pdc202xx_dma_lost_irq,
340 .dma_timeout = pdc202xx_dma_timeout,
341};
342
343static const struct ide_dma_ops pdc2026x_dma_ops = {
344 .dma_host_set = ide_dma_host_set,
345 .dma_setup = ide_dma_setup,
346 .dma_exec_cmd = ide_dma_exec_cmd,
347 .dma_start = pdc202xx_dma_start,
348 .dma_end = pdc202xx_dma_end,
349 .dma_test_irq = pdc202xx_dma_test_irq,
350 .dma_lost_irq = pdc202xx_dma_lost_irq,
351 .dma_timeout = pdc202xx_dma_timeout,
352};
353
360#define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \ 354#define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \
361 { \ 355 { \
362 .name = name_str, \ 356 .name = name_str, \
363 .init_chipset = init_chipset_pdc202xx, \ 357 .init_chipset = init_chipset_pdc202xx, \
364 .init_hwif = init_hwif_pdc202xx, \ 358 .port_ops = &pdc2026x_port_ops, \
365 .init_dma = init_dma_pdc202xx, \ 359 .dma_ops = &pdc2026x_dma_ops, \
366 .extra = 48, \
367 .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ 360 .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \
368 .pio_mask = ATA_PIO4, \ 361 .pio_mask = ATA_PIO4, \
369 .mwdma_mask = ATA_MWDMA2, \ 362 .mwdma_mask = ATA_MWDMA2, \
@@ -374,9 +367,8 @@ static const struct ide_port_info pdc202xx_chipsets[] __devinitdata = {
374 { /* 0 */ 367 { /* 0 */
375 .name = "PDC20246", 368 .name = "PDC20246",
376 .init_chipset = init_chipset_pdc202xx, 369 .init_chipset = init_chipset_pdc202xx,
377 .init_hwif = init_hwif_pdc202xx, 370 .port_ops = &pdc20246_port_ops,
378 .init_dma = init_dma_pdc202xx, 371 .dma_ops = &pdc20246_dma_ops,
379 .extra = 16,
380 .host_flags = IDE_HFLAGS_PDC202XX, 372 .host_flags = IDE_HFLAGS_PDC202XX,
381 .pio_mask = ATA_PIO4, 373 .pio_mask = ATA_PIO4,
382 .mwdma_mask = ATA_MWDMA2, 374 .mwdma_mask = ATA_MWDMA2,
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c
index 89d74ffdb207..21c5dd23f928 100644
--- a/drivers/ide/pci/piix.c
+++ b/drivers/ide/pci/piix.c
@@ -285,11 +285,6 @@ static u8 __devinit piix_cable_detect(ide_hwif_t *hwif)
285 285
286static void __devinit init_hwif_piix(ide_hwif_t *hwif) 286static void __devinit init_hwif_piix(ide_hwif_t *hwif)
287{ 287{
288 hwif->set_pio_mode = &piix_set_pio_mode;
289 hwif->set_dma_mode = &piix_set_dma_mode;
290
291 hwif->cable_detect = piix_cable_detect;
292
293 if (!hwif->dma_base) 288 if (!hwif->dma_base)
294 return; 289 return;
295 290
@@ -306,6 +301,12 @@ static void __devinit init_hwif_ich(ide_hwif_t *hwif)
306 hwif->ide_dma_clear_irq = &piix_dma_clear_irq; 301 hwif->ide_dma_clear_irq = &piix_dma_clear_irq;
307} 302}
308 303
304static const struct ide_port_ops piix_port_ops = {
305 .set_pio_mode = piix_set_pio_mode,
306 .set_dma_mode = piix_set_dma_mode,
307 .cable_detect = piix_cable_detect,
308};
309
309#ifndef CONFIG_IA64 310#ifndef CONFIG_IA64
310 #define IDE_HFLAGS_PIIX IDE_HFLAG_LEGACY_IRQS 311 #define IDE_HFLAGS_PIIX IDE_HFLAG_LEGACY_IRQS
311#else 312#else
@@ -317,6 +318,7 @@ static void __devinit init_hwif_ich(ide_hwif_t *hwif)
317 .name = name_str, \ 318 .name = name_str, \
318 .init_hwif = init_hwif_piix, \ 319 .init_hwif = init_hwif_piix, \
319 .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \ 320 .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \
321 .port_ops = &piix_port_ops, \
320 .host_flags = IDE_HFLAGS_PIIX, \ 322 .host_flags = IDE_HFLAGS_PIIX, \
321 .pio_mask = ATA_PIO4, \ 323 .pio_mask = ATA_PIO4, \
322 .swdma_mask = ATA_SWDMA2_ONLY, \ 324 .swdma_mask = ATA_SWDMA2_ONLY, \
@@ -330,6 +332,7 @@ static void __devinit init_hwif_ich(ide_hwif_t *hwif)
330 .init_chipset = init_chipset_ich, \ 332 .init_chipset = init_chipset_ich, \
331 .init_hwif = init_hwif_ich, \ 333 .init_hwif = init_hwif_ich, \
332 .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \ 334 .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \
335 .port_ops = &piix_port_ops, \
333 .host_flags = IDE_HFLAGS_PIIX, \ 336 .host_flags = IDE_HFLAGS_PIIX, \
334 .pio_mask = ATA_PIO4, \ 337 .pio_mask = ATA_PIO4, \
335 .swdma_mask = ATA_SWDMA2_ONLY, \ 338 .swdma_mask = ATA_SWDMA2_ONLY, \
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c
index 44985c8f36e7..14c787b5d95f 100644
--- a/drivers/ide/pci/sc1200.c
+++ b/drivers/ide/pci/sc1200.c
@@ -165,7 +165,7 @@ static void sc1200_set_dma_mode(ide_drive_t *drive, const u8 mode)
165 * 165 *
166 * returns 1 on error, 0 otherwise 166 * returns 1 on error, 0 otherwise
167 */ 167 */
168static int sc1200_ide_dma_end (ide_drive_t *drive) 168static int sc1200_dma_end(ide_drive_t *drive)
169{ 169{
170 ide_hwif_t *hwif = HWIF(drive); 170 ide_hwif_t *hwif = HWIF(drive);
171 unsigned long dma_base = hwif->dma_base; 171 unsigned long dma_base = hwif->dma_base;
@@ -214,7 +214,7 @@ static void sc1200_set_pio_mode(ide_drive_t *drive, const u8 pio)
214 printk("SC1200: %s: changing (U)DMA mode\n", drive->name); 214 printk("SC1200: %s: changing (U)DMA mode\n", drive->name);
215 ide_dma_off_quietly(drive); 215 ide_dma_off_quietly(drive);
216 if (ide_set_dma_mode(drive, mode) == 0 && drive->using_dma) 216 if (ide_set_dma_mode(drive, mode) == 0 && drive->using_dma)
217 hwif->dma_host_set(drive, 1); 217 hwif->dma_ops->dma_host_set(drive, 1);
218 return; 218 return;
219 } 219 }
220 220
@@ -286,25 +286,27 @@ static int sc1200_resume (struct pci_dev *dev)
286} 286}
287#endif 287#endif
288 288
289/* 289static const struct ide_port_ops sc1200_port_ops = {
290 * This gets invoked by the IDE driver once for each channel, 290 .set_pio_mode = sc1200_set_pio_mode,
291 * and performs channel-specific pre-initialization before drive probing. 291 .set_dma_mode = sc1200_set_dma_mode,
292 */ 292 .udma_filter = sc1200_udma_filter,
293static void __devinit init_hwif_sc1200 (ide_hwif_t *hwif) 293};
294{
295 hwif->set_pio_mode = &sc1200_set_pio_mode;
296 hwif->set_dma_mode = &sc1200_set_dma_mode;
297
298 if (hwif->dma_base == 0)
299 return;
300 294
301 hwif->udma_filter = sc1200_udma_filter; 295static const struct ide_dma_ops sc1200_dma_ops = {
302 hwif->ide_dma_end = &sc1200_ide_dma_end; 296 .dma_host_set = ide_dma_host_set,
303} 297 .dma_setup = ide_dma_setup,
298 .dma_exec_cmd = ide_dma_exec_cmd,
299 .dma_start = ide_dma_start,
300 .dma_end = sc1200_dma_end,
301 .dma_test_irq = ide_dma_test_irq,
302 .dma_lost_irq = ide_dma_lost_irq,
303 .dma_timeout = ide_dma_timeout,
304};
304 305
305static const struct ide_port_info sc1200_chipset __devinitdata = { 306static const struct ide_port_info sc1200_chipset __devinitdata = {
306 .name = "SC1200", 307 .name = "SC1200",
307 .init_hwif = init_hwif_sc1200, 308 .port_ops = &sc1200_port_ops,
309 .dma_ops = &sc1200_dma_ops,
308 .host_flags = IDE_HFLAG_SERIALIZE | 310 .host_flags = IDE_HFLAG_SERIALIZE |
309 IDE_HFLAG_POST_SET_MODE | 311 IDE_HFLAG_POST_SET_MODE |
310 IDE_HFLAG_ABUSE_DMA_MODES, 312 IDE_HFLAG_ABUSE_DMA_MODES,
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c
index 52145796f12f..17cf86490d59 100644
--- a/drivers/ide/pci/scc_pata.c
+++ b/drivers/ide/pci/scc_pata.c
@@ -317,14 +317,14 @@ static int scc_dma_setup(ide_drive_t *drive)
317 317
318 318
319/** 319/**
320 * scc_ide_dma_end - Stop DMA 320 * scc_dma_end - Stop DMA
321 * @drive: IDE drive 321 * @drive: IDE drive
322 * 322 *
323 * Check and clear INT Status register. 323 * Check and clear INT Status register.
324 * Then call __ide_dma_end(). 324 * Then call __ide_dma_end().
325 */ 325 */
326 326
327static int scc_ide_dma_end(ide_drive_t * drive) 327static int scc_dma_end(ide_drive_t *drive)
328{ 328{
329 ide_hwif_t *hwif = HWIF(drive); 329 ide_hwif_t *hwif = HWIF(drive);
330 unsigned long intsts_port = hwif->dma_base + 0x014; 330 unsigned long intsts_port = hwif->dma_base + 0x014;
@@ -449,7 +449,7 @@ static int scc_dma_test_irq(ide_drive_t *drive)
449 449
450 if (!drive->waiting_for_dma) 450 if (!drive->waiting_for_dma)
451 printk(KERN_WARNING "%s: (%s) called while not waiting\n", 451 printk(KERN_WARNING "%s: (%s) called while not waiting\n",
452 drive->name, __FUNCTION__); 452 drive->name, __func__);
453 return 0; 453 return 0;
454} 454}
455 455
@@ -483,7 +483,7 @@ static int setup_mmio_scc (struct pci_dev *dev, const char *name)
483 unsigned long dma_size = pci_resource_len(dev, 1); 483 unsigned long dma_size = pci_resource_len(dev, 1);
484 void __iomem *ctl_addr; 484 void __iomem *ctl_addr;
485 void __iomem *dma_addr; 485 void __iomem *dma_addr;
486 int i; 486 int i, ret;
487 487
488 for (i = 0; i < MAX_HWIFS; i++) { 488 for (i = 0; i < MAX_HWIFS; i++) {
489 if (scc_ports[i].ctl == 0) 489 if (scc_ports[i].ctl == 0)
@@ -492,21 +492,17 @@ static int setup_mmio_scc (struct pci_dev *dev, const char *name)
492 if (i >= MAX_HWIFS) 492 if (i >= MAX_HWIFS)
493 return -ENOMEM; 493 return -ENOMEM;
494 494
495 if (!request_mem_region(ctl_base, ctl_size, name)) { 495 ret = pci_request_selected_regions(dev, (1 << 2) - 1, name);
496 printk(KERN_WARNING "%s: IDE controller MMIO ports not available.\n", SCC_PATA_NAME); 496 if (ret < 0) {
497 goto fail_0; 497 printk(KERN_ERR "%s: can't reserve resources\n", name);
498 } 498 return ret;
499
500 if (!request_mem_region(dma_base, dma_size, name)) {
501 printk(KERN_WARNING "%s: IDE controller MMIO ports not available.\n", SCC_PATA_NAME);
502 goto fail_1;
503 } 499 }
504 500
505 if ((ctl_addr = ioremap(ctl_base, ctl_size)) == NULL) 501 if ((ctl_addr = ioremap(ctl_base, ctl_size)) == NULL)
506 goto fail_2; 502 goto fail_0;
507 503
508 if ((dma_addr = ioremap(dma_base, dma_size)) == NULL) 504 if ((dma_addr = ioremap(dma_base, dma_size)) == NULL)
509 goto fail_3; 505 goto fail_1;
510 506
511 pci_set_master(dev); 507 pci_set_master(dev);
512 scc_ports[i].ctl = (unsigned long)ctl_addr; 508 scc_ports[i].ctl = (unsigned long)ctl_addr;
@@ -515,12 +511,8 @@ static int setup_mmio_scc (struct pci_dev *dev, const char *name)
515 511
516 return 1; 512 return 1;
517 513
518 fail_3:
519 iounmap(ctl_addr);
520 fail_2:
521 release_mem_region(dma_base, dma_size);
522 fail_1: 514 fail_1:
523 release_mem_region(ctl_base, ctl_size); 515 iounmap(ctl_addr);
524 fail_0: 516 fail_0:
525 return -ENOMEM; 517 return -ENOMEM;
526} 518}
@@ -549,7 +541,6 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev,
549 hw.chipset = ide_pci; 541 hw.chipset = ide_pci;
550 ide_init_port_hw(hwif, &hw); 542 ide_init_port_hw(hwif, &hw);
551 hwif->dev = &dev->dev; 543 hwif->dev = &dev->dev;
552 hwif->cds = d;
553 544
554 idx[0] = hwif->index; 545 idx[0] = hwif->index;
555 546
@@ -701,26 +692,37 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
701 /* PTERADD */ 692 /* PTERADD */
702 out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma); 693 out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma);
703 694
704 hwif->dma_setup = scc_dma_setup;
705 hwif->ide_dma_end = scc_ide_dma_end;
706 hwif->set_pio_mode = scc_set_pio_mode;
707 hwif->set_dma_mode = scc_set_dma_mode;
708 hwif->ide_dma_test_irq = scc_dma_test_irq;
709 hwif->udma_filter = scc_udma_filter;
710
711 if (in_be32((void __iomem *)(hwif->config_data + 0xff0)) & CCKCTRL_ATACLKOEN) 695 if (in_be32((void __iomem *)(hwif->config_data + 0xff0)) & CCKCTRL_ATACLKOEN)
712 hwif->ultra_mask = ATA_UDMA6; /* 133MHz */ 696 hwif->ultra_mask = ATA_UDMA6; /* 133MHz */
713 else 697 else
714 hwif->ultra_mask = ATA_UDMA5; /* 100MHz */ 698 hwif->ultra_mask = ATA_UDMA5; /* 100MHz */
715
716 hwif->cable_detect = scc_cable_detect;
717} 699}
718 700
701static const struct ide_port_ops scc_port_ops = {
702 .set_pio_mode = scc_set_pio_mode,
703 .set_dma_mode = scc_set_dma_mode,
704 .udma_filter = scc_udma_filter,
705 .cable_detect = scc_cable_detect,
706};
707
708static const struct ide_dma_ops scc_dma_ops = {
709 .dma_host_set = ide_dma_host_set,
710 .dma_setup = scc_dma_setup,
711 .dma_exec_cmd = ide_dma_exec_cmd,
712 .dma_start = ide_dma_start,
713 .dma_end = scc_dma_end,
714 .dma_test_irq = scc_dma_test_irq,
715 .dma_lost_irq = ide_dma_lost_irq,
716 .dma_timeout = ide_dma_timeout,
717};
718
719#define DECLARE_SCC_DEV(name_str) \ 719#define DECLARE_SCC_DEV(name_str) \
720 { \ 720 { \
721 .name = name_str, \ 721 .name = name_str, \
722 .init_iops = init_iops_scc, \ 722 .init_iops = init_iops_scc, \
723 .init_hwif = init_hwif_scc, \ 723 .init_hwif = init_hwif_scc, \
724 .port_ops = &scc_port_ops, \
725 .dma_ops = &scc_dma_ops, \
724 .host_flags = IDE_HFLAG_SINGLE, \ 726 .host_flags = IDE_HFLAG_SINGLE, \
725 .pio_mask = ATA_PIO4, \ 727 .pio_mask = ATA_PIO4, \
726 } 728 }
@@ -754,10 +756,6 @@ static void __devexit scc_remove(struct pci_dev *dev)
754{ 756{
755 struct scc_ports *ports = pci_get_drvdata(dev); 757 struct scc_ports *ports = pci_get_drvdata(dev);
756 ide_hwif_t *hwif = ports->hwif; 758 ide_hwif_t *hwif = ports->hwif;
757 unsigned long ctl_base = pci_resource_start(dev, 0);
758 unsigned long dma_base = pci_resource_start(dev, 1);
759 unsigned long ctl_size = pci_resource_len(dev, 0);
760 unsigned long dma_size = pci_resource_len(dev, 1);
761 759
762 if (hwif->dmatable_cpu) { 760 if (hwif->dmatable_cpu) {
763 pci_free_consistent(dev, PRD_ENTRIES * PRD_BYTES, 761 pci_free_consistent(dev, PRD_ENTRIES * PRD_BYTES,
@@ -770,8 +768,7 @@ static void __devexit scc_remove(struct pci_dev *dev)
770 hwif->chipset = ide_unknown; 768 hwif->chipset = ide_unknown;
771 iounmap((void*)ports->dma); 769 iounmap((void*)ports->dma);
772 iounmap((void*)ports->ctl); 770 iounmap((void*)ports->ctl);
773 release_mem_region(dma_base, dma_size); 771 pci_release_selected_regions(dev, (1 << 2) - 1);
774 release_mem_region(ctl_base, ctl_size);
775 memset(ports, 0, sizeof(*ports)); 772 memset(ports, 0, sizeof(*ports));
776} 773}
777 774
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c
index cfe927469793..a1fb20826a5b 100644
--- a/drivers/ide/pci/serverworks.c
+++ b/drivers/ide/pci/serverworks.c
@@ -312,7 +312,7 @@ static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif)
312 return ATA_CBL_PATA40; 312 return ATA_CBL_PATA40;
313} 313}
314 314
315static u8 __devinit ata66_svwks(ide_hwif_t *hwif) 315static u8 __devinit svwks_cable_detect(ide_hwif_t *hwif)
316{ 316{
317 struct pci_dev *dev = to_pci_dev(hwif->dev); 317 struct pci_dev *dev = to_pci_dev(hwif->dev);
318 318
@@ -336,17 +336,18 @@ static u8 __devinit ata66_svwks(ide_hwif_t *hwif)
336 return ATA_CBL_PATA40; 336 return ATA_CBL_PATA40;
337} 337}
338 338
339static void __devinit init_hwif_svwks (ide_hwif_t *hwif) 339static const struct ide_port_ops osb4_port_ops = {
340{ 340 .set_pio_mode = svwks_set_pio_mode,
341 struct pci_dev *dev = to_pci_dev(hwif->dev); 341 .set_dma_mode = svwks_set_dma_mode,
342 342 .udma_filter = svwks_udma_filter,
343 hwif->set_pio_mode = &svwks_set_pio_mode; 343};
344 hwif->set_dma_mode = &svwks_set_dma_mode;
345 hwif->udma_filter = &svwks_udma_filter;
346 344
347 if (dev->device != PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) 345static const struct ide_port_ops svwks_port_ops = {
348 hwif->cable_detect = ata66_svwks; 346 .set_pio_mode = svwks_set_pio_mode,
349} 347 .set_dma_mode = svwks_set_dma_mode,
348 .udma_filter = svwks_udma_filter,
349 .cable_detect = svwks_cable_detect,
350};
350 351
351#define IDE_HFLAGS_SVWKS \ 352#define IDE_HFLAGS_SVWKS \
352 (IDE_HFLAG_LEGACY_IRQS | \ 353 (IDE_HFLAG_LEGACY_IRQS | \
@@ -356,7 +357,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
356 { /* 0 */ 357 { /* 0 */
357 .name = "SvrWks OSB4", 358 .name = "SvrWks OSB4",
358 .init_chipset = init_chipset_svwks, 359 .init_chipset = init_chipset_svwks,
359 .init_hwif = init_hwif_svwks, 360 .port_ops = &osb4_port_ops,
360 .host_flags = IDE_HFLAGS_SVWKS, 361 .host_flags = IDE_HFLAGS_SVWKS,
361 .pio_mask = ATA_PIO4, 362 .pio_mask = ATA_PIO4,
362 .mwdma_mask = ATA_MWDMA2, 363 .mwdma_mask = ATA_MWDMA2,
@@ -364,7 +365,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
364 },{ /* 1 */ 365 },{ /* 1 */
365 .name = "SvrWks CSB5", 366 .name = "SvrWks CSB5",
366 .init_chipset = init_chipset_svwks, 367 .init_chipset = init_chipset_svwks,
367 .init_hwif = init_hwif_svwks, 368 .port_ops = &svwks_port_ops,
368 .host_flags = IDE_HFLAGS_SVWKS, 369 .host_flags = IDE_HFLAGS_SVWKS,
369 .pio_mask = ATA_PIO4, 370 .pio_mask = ATA_PIO4,
370 .mwdma_mask = ATA_MWDMA2, 371 .mwdma_mask = ATA_MWDMA2,
@@ -372,7 +373,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
372 },{ /* 2 */ 373 },{ /* 2 */
373 .name = "SvrWks CSB6", 374 .name = "SvrWks CSB6",
374 .init_chipset = init_chipset_svwks, 375 .init_chipset = init_chipset_svwks,
375 .init_hwif = init_hwif_svwks, 376 .port_ops = &svwks_port_ops,
376 .host_flags = IDE_HFLAGS_SVWKS, 377 .host_flags = IDE_HFLAGS_SVWKS,
377 .pio_mask = ATA_PIO4, 378 .pio_mask = ATA_PIO4,
378 .mwdma_mask = ATA_MWDMA2, 379 .mwdma_mask = ATA_MWDMA2,
@@ -380,7 +381,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
380 },{ /* 3 */ 381 },{ /* 3 */
381 .name = "SvrWks CSB6", 382 .name = "SvrWks CSB6",
382 .init_chipset = init_chipset_svwks, 383 .init_chipset = init_chipset_svwks,
383 .init_hwif = init_hwif_svwks, 384 .port_ops = &svwks_port_ops,
384 .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE, 385 .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE,
385 .pio_mask = ATA_PIO4, 386 .pio_mask = ATA_PIO4,
386 .mwdma_mask = ATA_MWDMA2, 387 .mwdma_mask = ATA_MWDMA2,
@@ -388,7 +389,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
388 },{ /* 4 */ 389 },{ /* 4 */
389 .name = "SvrWks HT1000", 390 .name = "SvrWks HT1000",
390 .init_chipset = init_chipset_svwks, 391 .init_chipset = init_chipset_svwks,
391 .init_hwif = init_hwif_svwks, 392 .port_ops = &svwks_port_ops,
392 .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE, 393 .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE,
393 .pio_mask = ATA_PIO4, 394 .pio_mask = ATA_PIO4,
394 .mwdma_mask = ATA_MWDMA2, 395 .mwdma_mask = ATA_MWDMA2,
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index 6bd9523cf642..321a4e28ac19 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -170,10 +170,10 @@ sgiioc4_clearirq(ide_drive_t * drive)
170 printk(KERN_ERR 170 printk(KERN_ERR
171 "%s(%s) : PCI Bus Error when doing DMA:" 171 "%s(%s) : PCI Bus Error when doing DMA:"
172 " status-cmd reg is 0x%x\n", 172 " status-cmd reg is 0x%x\n",
173 __FUNCTION__, drive->name, pci_stat_cmd_reg); 173 __func__, drive->name, pci_stat_cmd_reg);
174 printk(KERN_ERR 174 printk(KERN_ERR
175 "%s(%s) : PCI Error Address is 0x%x%x\n", 175 "%s(%s) : PCI Error Address is 0x%x%x\n",
176 __FUNCTION__, drive->name, 176 __func__, drive->name,
177 pci_err_addr_high, pci_err_addr_low); 177 pci_err_addr_high, pci_err_addr_low);
178 /* Clear the PCI Error indicator */ 178 /* Clear the PCI Error indicator */
179 pci_write_config_dword(dev, PCI_COMMAND, 0x00000146); 179 pci_write_config_dword(dev, PCI_COMMAND, 0x00000146);
@@ -188,7 +188,7 @@ sgiioc4_clearirq(ide_drive_t * drive)
188 return intr_reg & 3; 188 return intr_reg & 3;
189} 189}
190 190
191static void sgiioc4_ide_dma_start(ide_drive_t * drive) 191static void sgiioc4_dma_start(ide_drive_t *drive)
192{ 192{
193 ide_hwif_t *hwif = HWIF(drive); 193 ide_hwif_t *hwif = HWIF(drive);
194 unsigned long ioc4_dma_addr = hwif->dma_base + IOC4_DMA_CTRL * 4; 194 unsigned long ioc4_dma_addr = hwif->dma_base + IOC4_DMA_CTRL * 4;
@@ -215,8 +215,7 @@ sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base)
215} 215}
216 216
217/* Stops the IOC4 DMA Engine */ 217/* Stops the IOC4 DMA Engine */
218static int 218static int sgiioc4_dma_end(ide_drive_t *drive)
219sgiioc4_ide_dma_end(ide_drive_t * drive)
220{ 219{
221 u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; 220 u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0;
222 ide_hwif_t *hwif = HWIF(drive); 221 ide_hwif_t *hwif = HWIF(drive);
@@ -232,7 +231,7 @@ sgiioc4_ide_dma_end(ide_drive_t * drive)
232 printk(KERN_ERR 231 printk(KERN_ERR
233 "%s(%s): IOC4 DMA STOP bit is still 1 :" 232 "%s(%s): IOC4 DMA STOP bit is still 1 :"
234 "ioc4_dma_reg 0x%x\n", 233 "ioc4_dma_reg 0x%x\n",
235 __FUNCTION__, drive->name, ioc4_dma); 234 __func__, drive->name, ioc4_dma);
236 dma_stat = 1; 235 dma_stat = 1;
237 } 236 }
238 237
@@ -251,7 +250,7 @@ sgiioc4_ide_dma_end(ide_drive_t * drive)
251 udelay(1); 250 udelay(1);
252 } 251 }
253 if (!valid) { 252 if (!valid) {
254 printk(KERN_ERR "%s(%s) : DMA incomplete\n", __FUNCTION__, 253 printk(KERN_ERR "%s(%s) : DMA incomplete\n", __func__,
255 drive->name); 254 drive->name);
256 dma_stat = 1; 255 dma_stat = 1;
257 } 256 }
@@ -264,7 +263,7 @@ sgiioc4_ide_dma_end(ide_drive_t * drive)
264 printk(KERN_ERR 263 printk(KERN_ERR
265 "%s(%s): WARNING!! byte_count_dev %d " 264 "%s(%s): WARNING!! byte_count_dev %d "
266 "!= byte_count_mem %d\n", 265 "!= byte_count_mem %d\n",
267 __FUNCTION__, drive->name, bc_dev, bc_mem); 266 __func__, drive->name, bc_dev, bc_mem);
268 } 267 }
269 } 268 }
270 269
@@ -279,8 +278,7 @@ static void sgiioc4_set_dma_mode(ide_drive_t *drive, const u8 speed)
279} 278}
280 279
281/* returns 1 if dma irq issued, 0 otherwise */ 280/* returns 1 if dma irq issued, 0 otherwise */
282static int 281static int sgiioc4_dma_test_irq(ide_drive_t *drive)
283sgiioc4_ide_dma_test_irq(ide_drive_t * drive)
284{ 282{
285 return sgiioc4_checkirq(HWIF(drive)); 283 return sgiioc4_checkirq(HWIF(drive));
286} 284}
@@ -294,7 +292,7 @@ static void sgiioc4_dma_host_set(ide_drive_t *drive, int on)
294static void 292static void
295sgiioc4_resetproc(ide_drive_t * drive) 293sgiioc4_resetproc(ide_drive_t * drive)
296{ 294{
297 sgiioc4_ide_dma_end(drive); 295 sgiioc4_dma_end(drive);
298 sgiioc4_clearirq(drive); 296 sgiioc4_clearirq(drive);
299} 297}
300 298
@@ -329,13 +327,17 @@ sgiioc4_INB(unsigned long port)
329 327
330/* Creates a dma map for the scatter-gather list entries */ 328/* Creates a dma map for the scatter-gather list entries */
331static int __devinit 329static int __devinit
332ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) 330ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d)
333{ 331{
334 struct pci_dev *dev = to_pci_dev(hwif->dev); 332 struct pci_dev *dev = to_pci_dev(hwif->dev);
333 unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
335 void __iomem *virt_dma_base; 334 void __iomem *virt_dma_base;
336 int num_ports = sizeof (ioc4_dma_regs_t); 335 int num_ports = sizeof (ioc4_dma_regs_t);
337 void *pad; 336 void *pad;
338 337
338 if (dma_base == 0)
339 return -1;
340
339 printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, 341 printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name,
340 dma_base, dma_base + num_ports - 1); 342 dma_base, dma_base + num_ports - 1);
341 343
@@ -343,7 +345,7 @@ ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
343 printk(KERN_ERR 345 printk(KERN_ERR
344 "%s(%s) -- ERROR, Addresses 0x%p to 0x%p " 346 "%s(%s) -- ERROR, Addresses 0x%p to 0x%p "
345 "ALREADY in use\n", 347 "ALREADY in use\n",
346 __FUNCTION__, hwif->name, (void *) dma_base, 348 __func__, hwif->name, (void *) dma_base,
347 (void *) dma_base + num_ports - 1); 349 (void *) dma_base + num_ports - 1);
348 return -1; 350 return -1;
349 } 351 }
@@ -352,7 +354,7 @@ ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
352 if (virt_dma_base == NULL) { 354 if (virt_dma_base == NULL) {
353 printk(KERN_ERR 355 printk(KERN_ERR
354 "%s(%s) -- ERROR, Unable to map addresses 0x%lx to 0x%lx\n", 356 "%s(%s) -- ERROR, Unable to map addresses 0x%lx to 0x%lx\n",
355 __FUNCTION__, hwif->name, dma_base, dma_base + num_ports - 1); 357 __func__, hwif->name, dma_base, dma_base + num_ports - 1);
356 goto dma_remap_failure; 358 goto dma_remap_failure;
357 } 359 }
358 hwif->dma_base = (unsigned long) virt_dma_base; 360 hwif->dma_base = (unsigned long) virt_dma_base;
@@ -378,7 +380,7 @@ ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
378 hwif->dmatable_cpu, hwif->dmatable_dma); 380 hwif->dmatable_cpu, hwif->dmatable_dma);
379 printk(KERN_INFO 381 printk(KERN_INFO
380 "%s() -- Error! Unable to allocate DMA Maps for drive %s\n", 382 "%s() -- Error! Unable to allocate DMA Maps for drive %s\n",
381 __FUNCTION__, hwif->name); 383 __func__, hwif->name);
382 printk(KERN_INFO 384 printk(KERN_INFO
383 "Changing from DMA to PIO mode for Drive %s\n", hwif->name); 385 "Changing from DMA to PIO mode for Drive %s\n", hwif->name);
384 386
@@ -406,14 +408,14 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive)
406 if (ioc4_dma & IOC4_S_DMA_ACTIVE) { 408 if (ioc4_dma & IOC4_S_DMA_ACTIVE) {
407 printk(KERN_WARNING 409 printk(KERN_WARNING
408 "%s(%s):Warning!! DMA from previous transfer was still active\n", 410 "%s(%s):Warning!! DMA from previous transfer was still active\n",
409 __FUNCTION__, drive->name); 411 __func__, drive->name);
410 writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); 412 writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr);
411 ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); 413 ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
412 414
413 if (ioc4_dma & IOC4_S_DMA_STOP) 415 if (ioc4_dma & IOC4_S_DMA_STOP)
414 printk(KERN_ERR 416 printk(KERN_ERR
415 "%s(%s) : IOC4 Dma STOP bit is still 1\n", 417 "%s(%s) : IOC4 Dma STOP bit is still 1\n",
416 __FUNCTION__, drive->name); 418 __func__, drive->name);
417 } 419 }
418 420
419 ioc4_dma = readl((void __iomem *)ioc4_dma_addr); 421 ioc4_dma = readl((void __iomem *)ioc4_dma_addr);
@@ -421,14 +423,14 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive)
421 printk(KERN_WARNING 423 printk(KERN_WARNING
422 "%s(%s) : Warning!! - DMA Error during Previous" 424 "%s(%s) : Warning!! - DMA Error during Previous"
423 " transfer | status 0x%x\n", 425 " transfer | status 0x%x\n",
424 __FUNCTION__, drive->name, ioc4_dma); 426 __func__, drive->name, ioc4_dma);
425 writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); 427 writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr);
426 ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); 428 ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
427 429
428 if (ioc4_dma & IOC4_S_DMA_STOP) 430 if (ioc4_dma & IOC4_S_DMA_STOP)
429 printk(KERN_ERR 431 printk(KERN_ERR
430 "%s(%s) : IOC4 DMA STOP bit is still 1\n", 432 "%s(%s) : IOC4 DMA STOP bit is still 1\n",
431 __FUNCTION__, drive->name); 433 __func__, drive->name);
432 } 434 }
433 435
434 /* Address of the Scatter Gather List */ 436 /* Address of the Scatter Gather List */
@@ -519,7 +521,7 @@ use_pio_instead:
519 return 0; /* revert to PIO for this request */ 521 return 0; /* revert to PIO for this request */
520} 522}
521 523
522static int sgiioc4_ide_dma_setup(ide_drive_t *drive) 524static int sgiioc4_dma_setup(ide_drive_t *drive)
523{ 525{
524 struct request *rq = HWGROUP(drive)->rq; 526 struct request *rq = HWGROUP(drive)->rq;
525 unsigned int count = 0; 527 unsigned int count = 0;
@@ -548,45 +550,37 @@ static int sgiioc4_ide_dma_setup(ide_drive_t *drive)
548 return 0; 550 return 0;
549} 551}
550 552
551static void __devinit 553static const struct ide_port_ops sgiioc4_port_ops = {
552ide_init_sgiioc4(ide_hwif_t * hwif) 554 .set_dma_mode = sgiioc4_set_dma_mode,
553{ 555 /* reset DMA engine, clear IRQs */
554 hwif->mmio = 1; 556 .resetproc = sgiioc4_resetproc,
555 hwif->set_pio_mode = NULL; /* Sets timing for PIO mode */ 557 /* mask on/off NIEN register */
556 hwif->set_dma_mode = &sgiioc4_set_dma_mode; 558 .maskproc = sgiioc4_maskproc,
557 hwif->selectproc = NULL;/* Use the default routine to select drive */ 559};
558 hwif->reset_poll = NULL;/* No HBA specific reset_poll needed */
559 hwif->pre_reset = NULL; /* No HBA specific pre_set needed */
560 hwif->resetproc = &sgiioc4_resetproc;/* Reset DMA engine,
561 clear interrupts */
562 hwif->maskproc = &sgiioc4_maskproc; /* Mask on/off NIEN register */
563 hwif->quirkproc = NULL;
564
565 hwif->INB = &sgiioc4_INB;
566
567 if (hwif->dma_base == 0)
568 return;
569 560
570 hwif->dma_host_set = &sgiioc4_dma_host_set; 561static const struct ide_dma_ops sgiioc4_dma_ops = {
571 hwif->dma_setup = &sgiioc4_ide_dma_setup; 562 .dma_host_set = sgiioc4_dma_host_set,
572 hwif->dma_start = &sgiioc4_ide_dma_start; 563 .dma_setup = sgiioc4_dma_setup,
573 hwif->ide_dma_end = &sgiioc4_ide_dma_end; 564 .dma_start = sgiioc4_dma_start,
574 hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq; 565 .dma_end = sgiioc4_dma_end,
575 hwif->dma_lost_irq = &sgiioc4_dma_lost_irq; 566 .dma_test_irq = sgiioc4_dma_test_irq,
576 hwif->dma_timeout = &ide_dma_timeout; 567 .dma_lost_irq = sgiioc4_dma_lost_irq,
577} 568 .dma_timeout = ide_dma_timeout,
569};
578 570
579static const struct ide_port_info sgiioc4_port_info __devinitdata = { 571static const struct ide_port_info sgiioc4_port_info __devinitdata = {
580 .chipset = ide_pci, 572 .chipset = ide_pci,
581 .host_flags = IDE_HFLAG_NO_DMA | /* no SFF-style DMA */ 573 .init_dma = ide_dma_sgiioc4,
582 IDE_HFLAG_NO_AUTOTUNE, 574 .port_ops = &sgiioc4_port_ops,
575 .dma_ops = &sgiioc4_dma_ops,
576 .host_flags = IDE_HFLAG_NO_AUTOTUNE,
583 .mwdma_mask = ATA_MWDMA2_ONLY, 577 .mwdma_mask = ATA_MWDMA2_ONLY,
584}; 578};
585 579
586static int __devinit 580static int __devinit
587sgiioc4_ide_setup_pci_device(struct pci_dev *dev) 581sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
588{ 582{
589 unsigned long cmd_base, dma_base, irqport; 583 unsigned long cmd_base, irqport;
590 unsigned long bar0, cmd_phys_base, ctl; 584 unsigned long bar0, cmd_phys_base, ctl;
591 void __iomem *virt_base; 585 void __iomem *virt_base;
592 ide_hwif_t *hwif; 586 ide_hwif_t *hwif;
@@ -612,7 +606,6 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
612 cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET; 606 cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET;
613 ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET; 607 ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET;
614 irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET; 608 irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET;
615 dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
616 609
617 cmd_phys_base = bar0 + IOC4_CMD_OFFSET; 610 cmd_phys_base = bar0 + IOC4_CMD_OFFSET;
618 if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, 611 if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE,
@@ -620,7 +613,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
620 printk(KERN_ERR 613 printk(KERN_ERR
621 "%s : %s -- ERROR, Addresses " 614 "%s : %s -- ERROR, Addresses "
622 "0x%p to 0x%p ALREADY in use\n", 615 "0x%p to 0x%p ALREADY in use\n",
623 __FUNCTION__, hwif->name, (void *) cmd_phys_base, 616 __func__, hwif->name, (void *) cmd_phys_base,
624 (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); 617 (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE);
625 return -ENOMEM; 618 return -ENOMEM;
626 } 619 }
@@ -641,13 +634,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
641 /* Initializing chipset IRQ Registers */ 634 /* Initializing chipset IRQ Registers */
642 writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); 635 writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4));
643 636
644 if (dma_base == 0 || ide_dma_sgiioc4(hwif, dma_base)) { 637 hwif->INB = &sgiioc4_INB;
645 printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
646 hwif->name, DRV_NAME);
647 d.mwdma_mask = 0;
648 }
649
650 ide_init_sgiioc4(hwif);
651 638
652 idx[0] = hwif->index; 639 idx[0] = hwif->index;
653 640
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c
index c9ecab8aeb61..1fffea3211bd 100644
--- a/drivers/ide/pci/siimage.c
+++ b/drivers/ide/pci/siimage.c
@@ -301,7 +301,7 @@ static void sil_set_dma_mode(ide_drive_t *drive, const u8 speed)
301} 301}
302 302
303/* returns 1 if dma irq issued, 0 otherwise */ 303/* returns 1 if dma irq issued, 0 otherwise */
304static int siimage_io_ide_dma_test_irq (ide_drive_t *drive) 304static int siimage_io_dma_test_irq(ide_drive_t *drive)
305{ 305{
306 ide_hwif_t *hwif = HWIF(drive); 306 ide_hwif_t *hwif = HWIF(drive);
307 struct pci_dev *dev = to_pci_dev(hwif->dev); 307 struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -320,14 +320,14 @@ static int siimage_io_ide_dma_test_irq (ide_drive_t *drive)
320} 320}
321 321
322/** 322/**
323 * siimage_mmio_ide_dma_test_irq - check we caused an IRQ 323 * siimage_mmio_dma_test_irq - check we caused an IRQ
324 * @drive: drive we are testing 324 * @drive: drive we are testing
325 * 325 *
326 * Check if we caused an IDE DMA interrupt. We may also have caused 326 * Check if we caused an IDE DMA interrupt. We may also have caused
327 * SATA status interrupts, if so we clean them up and continue. 327 * SATA status interrupts, if so we clean them up and continue.
328 */ 328 */
329 329
330static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive) 330static int siimage_mmio_dma_test_irq(ide_drive_t *drive)
331{ 331{
332 ide_hwif_t *hwif = HWIF(drive); 332 ide_hwif_t *hwif = HWIF(drive);
333 unsigned long addr = siimage_selreg(hwif, 0x1); 333 unsigned long addr = siimage_selreg(hwif, 0x1);
@@ -347,7 +347,7 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
347 printk(KERN_WARNING "%s: sata_error = 0x%08x, " 347 printk(KERN_WARNING "%s: sata_error = 0x%08x, "
348 "watchdog = %d, %s\n", 348 "watchdog = %d, %s\n",
349 drive->name, sata_error, watchdog, 349 drive->name, sata_error, watchdog,
350 __FUNCTION__); 350 __func__);
351 351
352 } else { 352 } else {
353 watchdog = (ext_stat & 0x8000) ? 1 : 0; 353 watchdog = (ext_stat & 0x8000) ? 1 : 0;
@@ -369,6 +369,14 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
369 return 0; 369 return 0;
370} 370}
371 371
372static int siimage_dma_test_irq(ide_drive_t *drive)
373{
374 if (drive->hwif->mmio)
375 return siimage_mmio_dma_test_irq(drive);
376 else
377 return siimage_io_dma_test_irq(drive);
378}
379
372/** 380/**
373 * sil_sata_reset_poll - wait for SATA reset 381 * sil_sata_reset_poll - wait for SATA reset
374 * @drive: drive we are resetting 382 * @drive: drive we are resetting
@@ -735,14 +743,14 @@ static void __devinit init_iops_siimage(ide_hwif_t *hwif)
735} 743}
736 744
737/** 745/**
738 * ata66_siimage - check for 80 pin cable 746 * sil_cable_detect - cable detection
739 * @hwif: interface to check 747 * @hwif: interface to check
740 * 748 *
741 * Check for the presence of an ATA66 capable cable on the 749 * Check for the presence of an ATA66 capable cable on the
742 * interface. 750 * interface.
743 */ 751 */
744 752
745static u8 __devinit ata66_siimage(ide_hwif_t *hwif) 753static u8 __devinit sil_cable_detect(ide_hwif_t *hwif)
746{ 754{
747 struct pci_dev *dev = to_pci_dev(hwif->dev); 755 struct pci_dev *dev = to_pci_dev(hwif->dev);
748 unsigned long addr = siimage_selreg(hwif, 0); 756 unsigned long addr = siimage_selreg(hwif, 0);
@@ -756,67 +764,44 @@ static u8 __devinit ata66_siimage(ide_hwif_t *hwif)
756 return (ata66 & 0x01) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; 764 return (ata66 & 0x01) ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
757} 765}
758 766
759/** 767static const struct ide_port_ops sil_pata_port_ops = {
760 * init_hwif_siimage - set up hwif structs 768 .set_pio_mode = sil_set_pio_mode,
761 * @hwif: interface to set up 769 .set_dma_mode = sil_set_dma_mode,
762 * 770 .quirkproc = sil_quirkproc,
763 * We do the basic set up of the interface structure. The SIIMAGE 771 .udma_filter = sil_pata_udma_filter,
764 * requires several custom handlers so we override the default 772 .cable_detect = sil_cable_detect,
765 * ide DMA handlers appropriately 773};
766 */
767
768static void __devinit init_hwif_siimage(ide_hwif_t *hwif)
769{
770 u8 sata = is_sata(hwif);
771
772 hwif->set_pio_mode = &sil_set_pio_mode;
773 hwif->set_dma_mode = &sil_set_dma_mode;
774 hwif->quirkproc = &sil_quirkproc;
775
776 if (sata) {
777 static int first = 1;
778
779 hwif->reset_poll = &sil_sata_reset_poll;
780 hwif->pre_reset = &sil_sata_pre_reset;
781 hwif->udma_filter = &sil_sata_udma_filter;
782
783 if (first) {
784 printk(KERN_INFO "siimage: For full SATA support you should use the libata sata_sil module.\n");
785 first = 0;
786 }
787 } else
788 hwif->udma_filter = &sil_pata_udma_filter;
789
790 hwif->cable_detect = ata66_siimage;
791
792 if (hwif->dma_base == 0)
793 return;
794 774
795 if (sata) 775static const struct ide_port_ops sil_sata_port_ops = {
796 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; 776 .set_pio_mode = sil_set_pio_mode,
777 .set_dma_mode = sil_set_dma_mode,
778 .reset_poll = sil_sata_reset_poll,
779 .pre_reset = sil_sata_pre_reset,
780 .quirkproc = sil_quirkproc,
781 .udma_filter = sil_sata_udma_filter,
782 .cable_detect = sil_cable_detect,
783};
797 784
798 if (hwif->mmio) { 785static struct ide_dma_ops sil_dma_ops = {
799 hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq; 786 .dma_test_irq = siimage_dma_test_irq,
800 } else { 787};
801 hwif->ide_dma_test_irq = & siimage_io_ide_dma_test_irq;
802 }
803}
804 788
805#define DECLARE_SII_DEV(name_str) \ 789#define DECLARE_SII_DEV(name_str, p_ops) \
806 { \ 790 { \
807 .name = name_str, \ 791 .name = name_str, \
808 .init_chipset = init_chipset_siimage, \ 792 .init_chipset = init_chipset_siimage, \
809 .init_iops = init_iops_siimage, \ 793 .init_iops = init_iops_siimage, \
810 .init_hwif = init_hwif_siimage, \ 794 .port_ops = p_ops, \
795 .dma_ops = &sil_dma_ops, \
811 .pio_mask = ATA_PIO4, \ 796 .pio_mask = ATA_PIO4, \
812 .mwdma_mask = ATA_MWDMA2, \ 797 .mwdma_mask = ATA_MWDMA2, \
813 .udma_mask = ATA_UDMA6, \ 798 .udma_mask = ATA_UDMA6, \
814 } 799 }
815 800
816static const struct ide_port_info siimage_chipsets[] __devinitdata = { 801static const struct ide_port_info siimage_chipsets[] __devinitdata = {
817 /* 0 */ DECLARE_SII_DEV("SiI680"), 802 /* 0 */ DECLARE_SII_DEV("SiI680", &sil_pata_port_ops),
818 /* 1 */ DECLARE_SII_DEV("SiI3112 Serial ATA"), 803 /* 1 */ DECLARE_SII_DEV("SiI3112 Serial ATA", &sil_sata_port_ops),
819 /* 2 */ DECLARE_SII_DEV("Adaptec AAR-1210SA") 804 /* 2 */ DECLARE_SII_DEV("Adaptec AAR-1210SA", &sil_sata_port_ops)
820}; 805};
821 806
822/** 807/**
@@ -830,7 +815,24 @@ static const struct ide_port_info siimage_chipsets[] __devinitdata = {
830 815
831static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_device_id *id) 816static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_device_id *id)
832{ 817{
833 return ide_setup_pci_device(dev, &siimage_chipsets[id->driver_data]); 818 struct ide_port_info d;
819 u8 idx = id->driver_data;
820
821 d = siimage_chipsets[idx];
822
823 if (idx) {
824 static int first = 1;
825
826 if (first) {
827 printk(KERN_INFO "siimage: For full SATA support you "
828 "should use the libata sata_sil module.\n");
829 first = 0;
830 }
831
832 d.host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
833 }
834
835 return ide_setup_pci_device(dev, &d);
834} 836}
835 837
836static const struct pci_device_id siimage_pci_tbl[] = { 838static const struct pci_device_id siimage_pci_tbl[] = {
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c
index 181b647e5ca9..4b0b85d8faf5 100644
--- a/drivers/ide/pci/sis5513.c
+++ b/drivers/ide/pci/sis5513.c
@@ -347,7 +347,7 @@ static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed)
347 sis_program_timings(drive, speed); 347 sis_program_timings(drive, speed);
348} 348}
349 349
350static u8 sis5513_ata133_udma_filter(ide_drive_t *drive) 350static u8 sis_ata133_udma_filter(ide_drive_t *drive)
351{ 351{
352 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); 352 struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
353 u32 regdw = 0; 353 u32 regdw = 0;
@@ -514,7 +514,7 @@ static const struct sis_laptop sis_laptop[] = {
514 { 0, } 514 { 0, }
515}; 515};
516 516
517static u8 __devinit ata66_sis5513(ide_hwif_t *hwif) 517static u8 __devinit sis_cable_detect(ide_hwif_t *hwif)
518{ 518{
519 struct pci_dev *pdev = to_pci_dev(hwif->dev); 519 struct pci_dev *pdev = to_pci_dev(hwif->dev);
520 const struct sis_laptop *lap = &sis_laptop[0]; 520 const struct sis_laptop *lap = &sis_laptop[0];
@@ -543,21 +543,22 @@ static u8 __devinit ata66_sis5513(ide_hwif_t *hwif)
543 return ata66 ? ATA_CBL_PATA80 : ATA_CBL_PATA40; 543 return ata66 ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
544} 544}
545 545
546static void __devinit init_hwif_sis5513(ide_hwif_t *hwif) 546static const struct ide_port_ops sis_port_ops = {
547{ 547 .set_pio_mode = sis_set_pio_mode,
548 hwif->set_pio_mode = &sis_set_pio_mode; 548 .set_dma_mode = sis_set_dma_mode,
549 hwif->set_dma_mode = &sis_set_dma_mode; 549 .cable_detect = sis_cable_detect,
550 550};
551 if (chipset_family >= ATA_133)
552 hwif->udma_filter = sis5513_ata133_udma_filter;
553 551
554 hwif->cable_detect = ata66_sis5513; 552static const struct ide_port_ops sis_ata133_port_ops = {
555} 553 .set_pio_mode = sis_set_pio_mode,
554 .set_dma_mode = sis_set_dma_mode,
555 .udma_filter = sis_ata133_udma_filter,
556 .cable_detect = sis_cable_detect,
557};
556 558
557static const struct ide_port_info sis5513_chipset __devinitdata = { 559static const struct ide_port_info sis5513_chipset __devinitdata = {
558 .name = "SIS5513", 560 .name = "SIS5513",
559 .init_chipset = init_chipset_sis5513, 561 .init_chipset = init_chipset_sis5513,
560 .init_hwif = init_hwif_sis5513,
561 .enablebits = { {0x4a, 0x02, 0x02}, {0x4a, 0x04, 0x04} }, 562 .enablebits = { {0x4a, 0x02, 0x02}, {0x4a, 0x04, 0x04} },
562 .host_flags = IDE_HFLAG_LEGACY_IRQS | IDE_HFLAG_NO_AUTODMA, 563 .host_flags = IDE_HFLAG_LEGACY_IRQS | IDE_HFLAG_NO_AUTODMA,
563 .pio_mask = ATA_PIO4, 564 .pio_mask = ATA_PIO4,
@@ -572,6 +573,11 @@ static int __devinit sis5513_init_one(struct pci_dev *dev, const struct pci_devi
572 if (sis_find_family(dev) == 0) 573 if (sis_find_family(dev) == 0)
573 return -ENOTSUPP; 574 return -ENOTSUPP;
574 575
576 if (chipset_family >= ATA_133)
577 d.port_ops = &sis_ata133_port_ops;
578 else
579 d.port_ops = &sis_port_ops;
580
575 d.udma_mask = udma_rates[chipset_family]; 581 d.udma_mask = udma_rates[chipset_family];
576 582
577 return ide_setup_pci_device(dev, &d); 583 return ide_setup_pci_device(dev, &d);
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c
index 40b3eeb2d847..ce84fa045d39 100644
--- a/drivers/ide/pci/sl82c105.c
+++ b/drivers/ide/pci/sl82c105.c
@@ -179,7 +179,7 @@ static void sl82c105_dma_start(ide_drive_t *drive)
179 struct pci_dev *dev = to_pci_dev(hwif->dev); 179 struct pci_dev *dev = to_pci_dev(hwif->dev);
180 int reg = 0x44 + drive->dn * 4; 180 int reg = 0x44 + drive->dn * 4;
181 181
182 DBG(("%s(drive:%s)\n", __FUNCTION__, drive->name)); 182 DBG(("%s(drive:%s)\n", __func__, drive->name));
183 183
184 pci_write_config_word(dev, reg, drive->drive_data >> 16); 184 pci_write_config_word(dev, reg, drive->drive_data >> 16);
185 185
@@ -203,7 +203,7 @@ static int sl82c105_dma_end(ide_drive_t *drive)
203 int reg = 0x44 + drive->dn * 4; 203 int reg = 0x44 + drive->dn * 4;
204 int ret; 204 int ret;
205 205
206 DBG(("%s(drive:%s)\n", __FUNCTION__, drive->name)); 206 DBG(("%s(drive:%s)\n", __func__, drive->name));
207 207
208 ret = __ide_dma_end(drive); 208 ret = __ide_dma_end(drive);
209 209
@@ -232,7 +232,7 @@ static void sl82c105_resetproc(ide_drive_t *drive)
232 * Return the revision of the Winbond bridge 232 * Return the revision of the Winbond bridge
233 * which this function is part of. 233 * which this function is part of.
234 */ 234 */
235static unsigned int sl82c105_bridge_revision(struct pci_dev *dev) 235static u8 sl82c105_bridge_revision(struct pci_dev *dev)
236{ 236{
237 struct pci_dev *bridge; 237 struct pci_dev *bridge;
238 238
@@ -282,63 +282,59 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c
282 return dev->irq; 282 return dev->irq;
283} 283}
284 284
285/* 285static const struct ide_port_ops sl82c105_port_ops = {
286 * Initialise IDE channel 286 .set_pio_mode = sl82c105_set_pio_mode,
287 */ 287 .set_dma_mode = sl82c105_set_dma_mode,
288static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) 288 .resetproc = sl82c105_resetproc,
289{ 289};
290 struct pci_dev *dev = to_pci_dev(hwif->dev);
291 unsigned int rev;
292
293 DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
294
295 hwif->set_pio_mode = &sl82c105_set_pio_mode;
296 hwif->set_dma_mode = &sl82c105_set_dma_mode;
297 hwif->resetproc = &sl82c105_resetproc;
298
299 if (!hwif->dma_base)
300 return;
301
302 rev = sl82c105_bridge_revision(dev);
303 if (rev <= 5) {
304 /*
305 * Never ever EVER under any circumstances enable
306 * DMA when the bridge is this old.
307 */
308 printk(" %s: Winbond W83C553 bridge revision %d, "
309 "BM-DMA disabled\n", hwif->name, rev);
310 return;
311 }
312
313 hwif->mwdma_mask = ATA_MWDMA2;
314
315 hwif->dma_lost_irq = &sl82c105_dma_lost_irq;
316 hwif->dma_start = &sl82c105_dma_start;
317 hwif->ide_dma_end = &sl82c105_dma_end;
318 hwif->dma_timeout = &sl82c105_dma_timeout;
319 290
320 if (hwif->mate) 291static const struct ide_dma_ops sl82c105_dma_ops = {
321 hwif->serialized = hwif->mate->serialized = 1; 292 .dma_host_set = ide_dma_host_set,
322} 293 .dma_setup = ide_dma_setup,
294 .dma_exec_cmd = ide_dma_exec_cmd,
295 .dma_start = sl82c105_dma_start,
296 .dma_end = sl82c105_dma_end,
297 .dma_test_irq = ide_dma_test_irq,
298 .dma_lost_irq = sl82c105_dma_lost_irq,
299 .dma_timeout = sl82c105_dma_timeout,
300};
323 301
324static const struct ide_port_info sl82c105_chipset __devinitdata = { 302static const struct ide_port_info sl82c105_chipset __devinitdata = {
325 .name = "W82C105", 303 .name = "W82C105",
326 .init_chipset = init_chipset_sl82c105, 304 .init_chipset = init_chipset_sl82c105,
327 .init_hwif = init_hwif_sl82c105,
328 .enablebits = {{0x40,0x01,0x01}, {0x40,0x10,0x10}}, 305 .enablebits = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
306 .port_ops = &sl82c105_port_ops,
307 .dma_ops = &sl82c105_dma_ops,
329 .host_flags = IDE_HFLAG_IO_32BIT | 308 .host_flags = IDE_HFLAG_IO_32BIT |
330 IDE_HFLAG_UNMASK_IRQS | 309 IDE_HFLAG_UNMASK_IRQS |
331/* FIXME: check for Compatibility mode in generic IDE PCI code */ 310/* FIXME: check for Compatibility mode in generic IDE PCI code */
332#if defined(CONFIG_LOPEC) || defined(CONFIG_SANDPOINT) 311#if defined(CONFIG_LOPEC) || defined(CONFIG_SANDPOINT)
333 IDE_HFLAG_FORCE_LEGACY_IRQS | 312 IDE_HFLAG_FORCE_LEGACY_IRQS |
334#endif 313#endif
314 IDE_HFLAG_SERIALIZE_DMA |
335 IDE_HFLAG_NO_AUTODMA, 315 IDE_HFLAG_NO_AUTODMA,
336 .pio_mask = ATA_PIO5, 316 .pio_mask = ATA_PIO5,
317 .mwdma_mask = ATA_MWDMA2,
337}; 318};
338 319
339static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id) 320static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
340{ 321{
341 return ide_setup_pci_device(dev, &sl82c105_chipset); 322 struct ide_port_info d = sl82c105_chipset;
323 u8 rev = sl82c105_bridge_revision(dev);
324
325 if (rev <= 5) {
326 /*
327 * Never ever EVER under any circumstances enable
328 * DMA when the bridge is this old.
329 */
330 printk(KERN_INFO "W82C105_IDE: Winbond W83C553 bridge "
331 "revision %d, BM-DMA disabled\n", rev);
332 d.dma_ops = NULL;
333 d.mwdma_mask = 0;
334 d.host_flags &= ~IDE_HFLAG_SERIALIZE_DMA;
335 }
336
337 return ide_setup_pci_device(dev, &d);
342} 338}
343 339
344static const struct pci_device_id sl82c105_pci_tbl[] = { 340static const struct pci_device_id sl82c105_pci_tbl[] = {
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c
index eab557c45d1b..dae6e2c94d86 100644
--- a/drivers/ide/pci/slc90e66.c
+++ b/drivers/ide/pci/slc90e66.c
@@ -125,18 +125,16 @@ static u8 __devinit slc90e66_cable_detect(ide_hwif_t *hwif)
125 return (reg47 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; 125 return (reg47 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
126} 126}
127 127
128static void __devinit init_hwif_slc90e66(ide_hwif_t *hwif) 128static const struct ide_port_ops slc90e66_port_ops = {
129{ 129 .set_pio_mode = slc90e66_set_pio_mode,
130 hwif->set_pio_mode = &slc90e66_set_pio_mode; 130 .set_dma_mode = slc90e66_set_dma_mode,
131 hwif->set_dma_mode = &slc90e66_set_dma_mode; 131 .cable_detect = slc90e66_cable_detect,
132 132};
133 hwif->cable_detect = slc90e66_cable_detect;
134}
135 133
136static const struct ide_port_info slc90e66_chipset __devinitdata = { 134static const struct ide_port_info slc90e66_chipset __devinitdata = {
137 .name = "SLC90E66", 135 .name = "SLC90E66",
138 .init_hwif = init_hwif_slc90e66,
139 .enablebits = { {0x41, 0x80, 0x80}, {0x43, 0x80, 0x80} }, 136 .enablebits = { {0x41, 0x80, 0x80}, {0x43, 0x80, 0x80} },
137 .port_ops = &slc90e66_port_ops,
140 .host_flags = IDE_HFLAG_LEGACY_IRQS, 138 .host_flags = IDE_HFLAG_LEGACY_IRQS,
141 .pio_mask = ATA_PIO4, 139 .pio_mask = ATA_PIO4,
142 .swdma_mask = ATA_SWDMA2_ONLY, 140 .swdma_mask = ATA_SWDMA2_ONLY,
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c
index c15435182e3c..9b4b27a4c711 100644
--- a/drivers/ide/pci/tc86c001.c
+++ b/drivers/ide/pci/tc86c001.c
@@ -157,11 +157,6 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
157 /* Store the system control register base for convenience... */ 157 /* Store the system control register base for convenience... */
158 hwif->config_data = sc_base; 158 hwif->config_data = sc_base;
159 159
160 hwif->set_pio_mode = &tc86c001_set_pio_mode;
161 hwif->set_dma_mode = &tc86c001_set_mode;
162
163 hwif->cable_detect = tc86c001_cable_detect;
164
165 if (!hwif->dma_base) 160 if (!hwif->dma_base)
166 return; 161 return;
167 162
@@ -173,8 +168,6 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
173 168
174 /* Sector Count Register limit */ 169 /* Sector Count Register limit */
175 hwif->rqsize = 0xffff; 170 hwif->rqsize = 0xffff;
176
177 hwif->dma_start = &tc86c001_dma_start;
178} 171}
179 172
180static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev, 173static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev,
@@ -187,10 +180,29 @@ static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev,
187 return err; 180 return err;
188} 181}
189 182
183static const struct ide_port_ops tc86c001_port_ops = {
184 .set_pio_mode = tc86c001_set_pio_mode,
185 .set_dma_mode = tc86c001_set_mode,
186 .cable_detect = tc86c001_cable_detect,
187};
188
189static const struct ide_dma_ops tc86c001_dma_ops = {
190 .dma_host_set = ide_dma_host_set,
191 .dma_setup = ide_dma_setup,
192 .dma_exec_cmd = ide_dma_exec_cmd,
193 .dma_start = tc86c001_dma_start,
194 .dma_end = __ide_dma_end,
195 .dma_test_irq = ide_dma_test_irq,
196 .dma_lost_irq = ide_dma_lost_irq,
197 .dma_timeout = ide_dma_timeout,
198};
199
190static const struct ide_port_info tc86c001_chipset __devinitdata = { 200static const struct ide_port_info tc86c001_chipset __devinitdata = {
191 .name = "TC86C001", 201 .name = "TC86C001",
192 .init_chipset = init_chipset_tc86c001, 202 .init_chipset = init_chipset_tc86c001,
193 .init_hwif = init_hwif_tc86c001, 203 .init_hwif = init_hwif_tc86c001,
204 .port_ops = &tc86c001_port_ops,
205 .dma_ops = &tc86c001_dma_ops,
194 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD | 206 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD |
195 IDE_HFLAG_ABUSE_SET_DMA_MODE, 207 IDE_HFLAG_ABUSE_SET_DMA_MODE,
196 .pio_mask = ATA_PIO4, 208 .pio_mask = ATA_PIO4,
diff --git a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c
index 3316b197c779..db65a558d4ec 100644
--- a/drivers/ide/pci/triflex.c
+++ b/drivers/ide/pci/triflex.c
@@ -87,16 +87,15 @@ static void triflex_set_pio_mode(ide_drive_t *drive, const u8 pio)
87 triflex_set_mode(drive, XFER_PIO_0 + pio); 87 triflex_set_mode(drive, XFER_PIO_0 + pio);
88} 88}
89 89
90static void __devinit init_hwif_triflex(ide_hwif_t *hwif) 90static const struct ide_port_ops triflex_port_ops = {
91{ 91 .set_pio_mode = triflex_set_pio_mode,
92 hwif->set_pio_mode = &triflex_set_pio_mode; 92 .set_dma_mode = triflex_set_mode,
93 hwif->set_dma_mode = &triflex_set_mode; 93};
94}
95 94
96static const struct ide_port_info triflex_device __devinitdata = { 95static const struct ide_port_info triflex_device __devinitdata = {
97 .name = "TRIFLEX", 96 .name = "TRIFLEX",
98 .init_hwif = init_hwif_triflex,
99 .enablebits = {{0x80, 0x01, 0x01}, {0x80, 0x02, 0x02}}, 97 .enablebits = {{0x80, 0x01, 0x01}, {0x80, 0x02, 0x02}},
98 .port_ops = &triflex_port_ops,
100 .pio_mask = ATA_PIO4, 99 .pio_mask = ATA_PIO4,
101 .swdma_mask = ATA_SWDMA2, 100 .swdma_mask = ATA_SWDMA2,
102 .mwdma_mask = ATA_MWDMA2, 101 .mwdma_mask = ATA_MWDMA2,
diff --git a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c
index 2b8f3a2837d7..15ee38f7ad3f 100644
--- a/drivers/ide/pci/trm290.c
+++ b/drivers/ide/pci/trm290.c
@@ -214,7 +214,7 @@ static void trm290_dma_start(ide_drive_t *drive)
214{ 214{
215} 215}
216 216
217static int trm290_ide_dma_end (ide_drive_t *drive) 217static int trm290_dma_end(ide_drive_t *drive)
218{ 218{
219 u16 status; 219 u16 status;
220 220
@@ -225,7 +225,7 @@ static int trm290_ide_dma_end (ide_drive_t *drive)
225 return status != 0x00ff; 225 return status != 0x00ff;
226} 226}
227 227
228static int trm290_ide_dma_test_irq (ide_drive_t *drive) 228static int trm290_dma_test_irq(ide_drive_t *drive)
229{ 229{
230 u16 status; 230 u16 status;
231 231
@@ -254,22 +254,11 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
254 hwif->config_data = cfg_base; 254 hwif->config_data = cfg_base;
255 hwif->dma_base = (cfg_base + 4) ^ (hwif->channel ? 0x80 : 0); 255 hwif->dma_base = (cfg_base + 4) ^ (hwif->channel ? 0x80 : 0);
256 256
257 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx", 257 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
258 hwif->name, hwif->dma_base, hwif->dma_base + 3); 258 hwif->name, hwif->dma_base, hwif->dma_base + 3);
259 259
260 if (!request_region(hwif->dma_base, 4, hwif->name)) { 260 if (ide_allocate_dma_engine(hwif))
261 printk(KERN_CONT " -- Error, ports in use.\n");
262 return; 261 return;
263 }
264
265 hwif->dmatable_cpu = pci_alloc_consistent(dev, PRD_ENTRIES * PRD_BYTES,
266 &hwif->dmatable_dma);
267 if (!hwif->dmatable_cpu) {
268 printk(KERN_CONT " -- Error, unable to allocate DMA table.\n");
269 release_region(hwif->dma_base, 4);
270 return;
271 }
272 printk(KERN_CONT "\n");
273 262
274 local_irq_save(flags); 263 local_irq_save(flags);
275 /* put config reg into first byte of hwif->select_data */ 264 /* put config reg into first byte of hwif->select_data */
@@ -291,14 +280,6 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
291 /* sharing IRQ with mate */ 280 /* sharing IRQ with mate */
292 hwif->irq = hwif->mate->irq; 281 hwif->irq = hwif->mate->irq;
293 282
294 hwif->dma_host_set = &trm290_dma_host_set;
295 hwif->dma_setup = &trm290_dma_setup;
296 hwif->dma_exec_cmd = &trm290_dma_exec_cmd;
297 hwif->dma_start = &trm290_dma_start;
298 hwif->ide_dma_end = &trm290_ide_dma_end;
299 hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq;
300
301 hwif->selectproc = &trm290_selectproc;
302#if 1 283#if 1
303 { 284 {
304 /* 285 /*
@@ -328,10 +309,27 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
328#endif 309#endif
329} 310}
330 311
312static const struct ide_port_ops trm290_port_ops = {
313 .selectproc = trm290_selectproc,
314};
315
316static struct ide_dma_ops trm290_dma_ops = {
317 .dma_host_set = trm290_dma_host_set,
318 .dma_setup = trm290_dma_setup,
319 .dma_exec_cmd = trm290_dma_exec_cmd,
320 .dma_start = trm290_dma_start,
321 .dma_end = trm290_dma_end,
322 .dma_test_irq = trm290_dma_test_irq,
323 .dma_lost_irq = ide_dma_lost_irq,
324 .dma_timeout = ide_dma_timeout,
325};
326
331static const struct ide_port_info trm290_chipset __devinitdata = { 327static const struct ide_port_info trm290_chipset __devinitdata = {
332 .name = "TRM290", 328 .name = "TRM290",
333 .init_hwif = init_hwif_trm290, 329 .init_hwif = init_hwif_trm290,
334 .chipset = ide_trm290, 330 .chipset = ide_trm290,
331 .port_ops = &trm290_port_ops,
332 .dma_ops = &trm290_dma_ops,
335 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 333 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
336#if 0 /* play it safe for now */ 334#if 0 /* play it safe for now */
337 IDE_HFLAG_TRUST_BIOS_FOR_DMA | 335 IDE_HFLAG_TRUST_BIOS_FOR_DMA |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c
index cff3cafedc47..bbd17bec6ffe 100644
--- a/drivers/ide/pci/via82cxxx.c
+++ b/drivers/ide/pci/via82cxxx.c
@@ -415,19 +415,17 @@ static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif)
415 return ATA_CBL_PATA40; 415 return ATA_CBL_PATA40;
416} 416}
417 417
418static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) 418static const struct ide_port_ops via_port_ops = {
419{ 419 .set_pio_mode = via_set_pio_mode,
420 hwif->set_pio_mode = &via_set_pio_mode; 420 .set_dma_mode = via_set_drive,
421 hwif->set_dma_mode = &via_set_drive; 421 .cable_detect = via82cxxx_cable_detect,
422 422};
423 hwif->cable_detect = via82cxxx_cable_detect;
424}
425 423
426static const struct ide_port_info via82cxxx_chipset __devinitdata = { 424static const struct ide_port_info via82cxxx_chipset __devinitdata = {
427 .name = "VP_IDE", 425 .name = "VP_IDE",
428 .init_chipset = init_chipset_via82cxxx, 426 .init_chipset = init_chipset_via82cxxx,
429 .init_hwif = init_hwif_via82cxxx,
430 .enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } }, 427 .enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } },
428 .port_ops = &via_port_ops,
431 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST | 429 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST |
432 IDE_HFLAG_ABUSE_SET_DMA_MODE | 430 IDE_HFLAG_ABUSE_SET_DMA_MODE |
433 IDE_HFLAG_POST_SET_MODE | 431 IDE_HFLAG_POST_SET_MODE |
diff --git a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c
index 467656f06ccc..a82f6efb660b 100644
--- a/drivers/ide/ppc/mpc8xx.c
+++ b/drivers/ide/ppc/mpc8xx.c
@@ -438,10 +438,14 @@ static void m8xx_ide_set_pio_mode(ide_drive_t *drive, const u8 pio)
438#elif defined(CONFIG_IDE_EXT_DIRECT) 438#elif defined(CONFIG_IDE_EXT_DIRECT)
439 439
440 printk("%s[%d] %s: not implemented yet!\n", 440 printk("%s[%d] %s: not implemented yet!\n",
441 __FILE__,__LINE__,__FUNCTION__); 441 __FILE__, __LINE__, __func__);
442#endif /* defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_PCMCIA */ 442#endif /* defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_PCMCIA */
443} 443}
444 444
445static const struct ide_port_ops m8xx_port_ops = {
446 .set_pio_mode = m8xx_ide_set_pio_mode,
447};
448
445static void 449static void
446ide_interrupt_ack (void *dev) 450ide_interrupt_ack (void *dev)
447{ 451{
@@ -810,9 +814,8 @@ static int __init mpc8xx_ide_probe(void)
810 ide_hwif_t *hwif = &ide_hwifs[0]; 814 ide_hwif_t *hwif = &ide_hwifs[0];
811 815
812 ide_init_port_hw(hwif, &hw); 816 ide_init_port_hw(hwif, &hw);
813 hwif->mmio = 1;
814 hwif->pio_mask = ATA_PIO4; 817 hwif->pio_mask = ATA_PIO4;
815 hwif->set_pio_mode = m8xx_ide_set_pio_mode; 818 hwif->port_ops = &m8xx_port_ops;
816 819
817 idx[0] = 0; 820 idx[0] = 0;
818 } 821 }
@@ -822,9 +825,8 @@ static int __init mpc8xx_ide_probe(void)
822 ide_hwif_t *mate = &ide_hwifs[1]; 825 ide_hwif_t *mate = &ide_hwifs[1];
823 826
824 ide_init_port_hw(mate, &hw); 827 ide_init_port_hw(mate, &hw);
825 mate->mmio = 1;
826 mate->pio_mask = ATA_PIO4; 828 mate->pio_mask = ATA_PIO4;
827 mate->set_pio_mode = m8xx_ide_set_pio_mode; 829 mate->port_ops = &m8xx_port_ops;
828 830
829 idx[1] = 1; 831 idx[1] = 1;
830 } 832 }
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c
index 177961edc430..185faa0dce94 100644
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -409,7 +409,7 @@ kauai_lookup_timing(struct kauai_timing* table, int cycle_time)
409 */ 409 */
410#define IDE_WAKEUP_DELAY (1*HZ) 410#define IDE_WAKEUP_DELAY (1*HZ)
411 411
412static int pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif); 412static int pmac_ide_init_dma(ide_hwif_t *, const struct ide_port_info *);
413static int pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq); 413static int pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq);
414static void pmac_ide_selectproc(ide_drive_t *drive); 414static void pmac_ide_selectproc(ide_drive_t *drive);
415static void pmac_ide_kauai_selectproc(ide_drive_t *drive); 415static void pmac_ide_kauai_selectproc(ide_drive_t *drive);
@@ -918,11 +918,29 @@ pmac_ide_do_resume(ide_hwif_t *hwif)
918 return 0; 918 return 0;
919} 919}
920 920
921static const struct ide_port_ops pmac_ide_ata6_port_ops = {
922 .set_pio_mode = pmac_ide_set_pio_mode,
923 .set_dma_mode = pmac_ide_set_dma_mode,
924 .selectproc = pmac_ide_kauai_selectproc,
925};
926
927static const struct ide_port_ops pmac_ide_port_ops = {
928 .set_pio_mode = pmac_ide_set_pio_mode,
929 .set_dma_mode = pmac_ide_set_dma_mode,
930 .selectproc = pmac_ide_selectproc,
931};
932
933static const struct ide_dma_ops pmac_dma_ops;
934
921static const struct ide_port_info pmac_port_info = { 935static const struct ide_port_info pmac_port_info = {
936 .init_dma = pmac_ide_init_dma,
922 .chipset = ide_pmac, 937 .chipset = ide_pmac,
938#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
939 .dma_ops = &pmac_dma_ops,
940#endif
941 .port_ops = &pmac_ide_port_ops,
923 .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | 942 .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
924 IDE_HFLAG_POST_SET_MODE | 943 IDE_HFLAG_POST_SET_MODE |
925 IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
926 IDE_HFLAG_UNMASK_IRQS, 944 IDE_HFLAG_UNMASK_IRQS,
927 .pio_mask = ATA_PIO4, 945 .pio_mask = ATA_PIO4,
928 .mwdma_mask = ATA_MWDMA2, 946 .mwdma_mask = ATA_MWDMA2,
@@ -947,12 +965,15 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
947 pmif->broken_dma = pmif->broken_dma_warn = 0; 965 pmif->broken_dma = pmif->broken_dma_warn = 0;
948 if (of_device_is_compatible(np, "shasta-ata")) { 966 if (of_device_is_compatible(np, "shasta-ata")) {
949 pmif->kind = controller_sh_ata6; 967 pmif->kind = controller_sh_ata6;
968 d.port_ops = &pmac_ide_ata6_port_ops;
950 d.udma_mask = ATA_UDMA6; 969 d.udma_mask = ATA_UDMA6;
951 } else if (of_device_is_compatible(np, "kauai-ata")) { 970 } else if (of_device_is_compatible(np, "kauai-ata")) {
952 pmif->kind = controller_un_ata6; 971 pmif->kind = controller_un_ata6;
972 d.port_ops = &pmac_ide_ata6_port_ops;
953 d.udma_mask = ATA_UDMA5; 973 d.udma_mask = ATA_UDMA5;
954 } else if (of_device_is_compatible(np, "K2-UATA")) { 974 } else if (of_device_is_compatible(np, "K2-UATA")) {
955 pmif->kind = controller_k2_ata6; 975 pmif->kind = controller_k2_ata6;
976 d.port_ops = &pmac_ide_ata6_port_ops;
956 d.udma_mask = ATA_UDMA5; 977 d.udma_mask = ATA_UDMA5;
957 } else if (of_device_is_compatible(np, "keylargo-ata")) { 978 } else if (of_device_is_compatible(np, "keylargo-ata")) {
958 if (strcmp(np->name, "ata-4") == 0) { 979 if (strcmp(np->name, "ata-4") == 0) {
@@ -1029,37 +1050,29 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
1029 default_hwif_mmiops(hwif); 1050 default_hwif_mmiops(hwif);
1030 hwif->OUTBSYNC = pmac_outbsync; 1051 hwif->OUTBSYNC = pmac_outbsync;
1031 1052
1032 /* Tell common code _not_ to mess with resources */
1033 hwif->mmio = 1;
1034 hwif->hwif_data = pmif; 1053 hwif->hwif_data = pmif;
1035 ide_init_port_hw(hwif, hw); 1054 ide_init_port_hw(hwif, hw);
1036 hwif->noprobe = pmif->mediabay;
1037 hwif->cbl = pmif->cable_80 ? ATA_CBL_PATA80 : ATA_CBL_PATA40; 1055 hwif->cbl = pmif->cable_80 ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
1038 hwif->set_pio_mode = pmac_ide_set_pio_mode;
1039 if (pmif->kind == controller_un_ata6
1040 || pmif->kind == controller_k2_ata6
1041 || pmif->kind == controller_sh_ata6)
1042 hwif->selectproc = pmac_ide_kauai_selectproc;
1043 else
1044 hwif->selectproc = pmac_ide_selectproc;
1045 hwif->set_dma_mode = pmac_ide_set_dma_mode;
1046 1056
1047 printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", 1057 printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n",
1048 hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, 1058 hwif->index, model_name[pmif->kind], pmif->aapl_bus_id,
1049 pmif->mediabay ? " (mediabay)" : "", hwif->irq); 1059 pmif->mediabay ? " (mediabay)" : "", hwif->irq);
1050 1060
1061 if (pmif->mediabay) {
1051#ifdef CONFIG_PMAC_MEDIABAY 1062#ifdef CONFIG_PMAC_MEDIABAY
1052 if (pmif->mediabay && check_media_bay_by_base(pmif->regbase, MB_CD) == 0) 1063 if (check_media_bay_by_base(pmif->regbase, MB_CD)) {
1053 hwif->noprobe = 0; 1064#else
1054#endif /* CONFIG_PMAC_MEDIABAY */ 1065 if (1) {
1066#endif
1067 hwif->drives[0].noprobe = 1;
1068 hwif->drives[1].noprobe = 1;
1069 }
1070 }
1055 1071
1056#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC 1072#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
1057 if (pmif->cable_80 == 0) 1073 if (pmif->cable_80 == 0)
1058 d.udma_mask &= ATA_UDMA2; 1074 d.udma_mask &= ATA_UDMA2;
1059 /* has a DBDMA controller channel */
1060 if (pmif->dma_regs == 0 || pmac_ide_setup_dma(pmif, hwif) < 0)
1061#endif 1075#endif
1062 d.udma_mask = d.mwdma_mask = 0;
1063 1076
1064 idx[0] = hwif->index; 1077 idx[0] = hwif->index;
1065 1078
@@ -1662,18 +1675,31 @@ pmac_ide_dma_lost_irq (ide_drive_t *drive)
1662 printk(KERN_ERR "ide-pmac lost interrupt, dma status: %lx\n", status); 1675 printk(KERN_ERR "ide-pmac lost interrupt, dma status: %lx\n", status);
1663} 1676}
1664 1677
1678static const struct ide_dma_ops pmac_dma_ops = {
1679 .dma_host_set = pmac_ide_dma_host_set,
1680 .dma_setup = pmac_ide_dma_setup,
1681 .dma_exec_cmd = pmac_ide_dma_exec_cmd,
1682 .dma_start = pmac_ide_dma_start,
1683 .dma_end = pmac_ide_dma_end,
1684 .dma_test_irq = pmac_ide_dma_test_irq,
1685 .dma_timeout = ide_dma_timeout,
1686 .dma_lost_irq = pmac_ide_dma_lost_irq,
1687};
1688
1665/* 1689/*
1666 * Allocate the data structures needed for using DMA with an interface 1690 * Allocate the data structures needed for using DMA with an interface
1667 * and fill the proper list of functions pointers 1691 * and fill the proper list of functions pointers
1668 */ 1692 */
1669static int __devinit pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) 1693static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif,
1694 const struct ide_port_info *d)
1670{ 1695{
1696 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data;
1671 struct pci_dev *dev = to_pci_dev(hwif->dev); 1697 struct pci_dev *dev = to_pci_dev(hwif->dev);
1672 1698
1673 /* We won't need pci_dev if we switch to generic consistent 1699 /* We won't need pci_dev if we switch to generic consistent
1674 * DMA routines ... 1700 * DMA routines ...
1675 */ 1701 */
1676 if (dev == NULL) 1702 if (dev == NULL || pmif->dma_regs == 0)
1677 return -ENODEV; 1703 return -ENODEV;
1678 /* 1704 /*
1679 * Allocate space for the DBDMA commands. 1705 * Allocate space for the DBDMA commands.
@@ -1692,18 +1718,14 @@ static int __devinit pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
1692 1718
1693 hwif->sg_max_nents = MAX_DCMDS; 1719 hwif->sg_max_nents = MAX_DCMDS;
1694 1720
1695 hwif->dma_host_set = &pmac_ide_dma_host_set;
1696 hwif->dma_setup = &pmac_ide_dma_setup;
1697 hwif->dma_exec_cmd = &pmac_ide_dma_exec_cmd;
1698 hwif->dma_start = &pmac_ide_dma_start;
1699 hwif->ide_dma_end = &pmac_ide_dma_end;
1700 hwif->ide_dma_test_irq = &pmac_ide_dma_test_irq;
1701 hwif->dma_timeout = &ide_dma_timeout;
1702 hwif->dma_lost_irq = &pmac_ide_dma_lost_irq;
1703
1704 return 0; 1721 return 0;
1705} 1722}
1706 1723#else
1724static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif,
1725 const struct ide_port_info *d)
1726{
1727 return -EOPNOTSUPP;
1728}
1707#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ 1729#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
1708 1730
1709module_init(pmac_ide_probe); 1731module_init(pmac_ide_probe);
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
index 6302010fd8e2..5171601fb255 100644
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -72,16 +72,16 @@ static void ide_pci_clear_simplex(unsigned long dma_base, const char *name)
72} 72}
73 73
74/** 74/**
75 * ide_get_or_set_dma_base - setup BMIBA 75 * ide_pci_dma_base - setup BMIBA
76 * @d: IDE port info
77 * @hwif: IDE interface 76 * @hwif: IDE interface
77 * @d: IDE port info
78 * 78 *
79 * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. 79 * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space.
80 * Where a device has a partner that is already in DMA mode we check 80 * Where a device has a partner that is already in DMA mode we check
81 * and enforce IDE simplex rules. 81 * and enforce IDE simplex rules.
82 */ 82 */
83 83
84static unsigned long ide_get_or_set_dma_base(const struct ide_port_info *d, ide_hwif_t *hwif) 84unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d)
85{ 85{
86 struct pci_dev *dev = to_pci_dev(hwif->dev); 86 struct pci_dev *dev = to_pci_dev(hwif->dev);
87 unsigned long dma_base = 0; 87 unsigned long dma_base = 0;
@@ -132,6 +132,31 @@ static unsigned long ide_get_or_set_dma_base(const struct ide_port_info *d, ide_
132out: 132out:
133 return dma_base; 133 return dma_base;
134} 134}
135EXPORT_SYMBOL_GPL(ide_pci_dma_base);
136
137/*
138 * Set up BM-DMA capability (PnP BIOS should have done this)
139 */
140int ide_pci_set_master(struct pci_dev *dev, const char *name)
141{
142 u16 pcicmd;
143
144 pci_read_config_word(dev, PCI_COMMAND, &pcicmd);
145
146 if ((pcicmd & PCI_COMMAND_MASTER) == 0) {
147 pci_set_master(dev);
148
149 if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd) ||
150 (pcicmd & PCI_COMMAND_MASTER) == 0) {
151 printk(KERN_ERR "%s: error updating PCICMD on %s\n",
152 name, pci_name(dev));
153 return -EIO;
154 }
155 }
156
157 return 0;
158}
159EXPORT_SYMBOL_GPL(ide_pci_set_master);
135#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ 160#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
136 161
137void ide_setup_pci_noise(struct pci_dev *dev, const struct ide_port_info *d) 162void ide_setup_pci_noise(struct pci_dev *dev, const struct ide_port_info *d)
@@ -158,7 +183,7 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_noise);
158 183
159static int ide_pci_enable(struct pci_dev *dev, const struct ide_port_info *d) 184static int ide_pci_enable(struct pci_dev *dev, const struct ide_port_info *d)
160{ 185{
161 int ret; 186 int ret, bars;
162 187
163 if (pci_enable_device(dev)) { 188 if (pci_enable_device(dev)) {
164 ret = pci_enable_device_io(dev); 189 ret = pci_enable_device_io(dev);
@@ -181,13 +206,21 @@ static int ide_pci_enable(struct pci_dev *dev, const struct ide_port_info *d)
181 goto out; 206 goto out;
182 } 207 }
183 208
184 /* FIXME: Temporary - until we put in the hotplug interface logic 209 if (d->host_flags & IDE_HFLAG_SINGLE)
185 Check that the bits we want are not in use by someone else. */ 210 bars = (1 << 2) - 1;
186 ret = pci_request_region(dev, 4, "ide_tmp"); 211 else
187 if (ret < 0) 212 bars = (1 << 4) - 1;
188 goto out;
189 213
190 pci_release_region(dev, 4); 214 if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0) {
215 if (d->host_flags & IDE_HFLAG_CS5520)
216 bars |= (1 << 2);
217 else
218 bars |= (1 << 4);
219 }
220
221 ret = pci_request_selected_regions(dev, bars, d->name);
222 if (ret < 0)
223 printk(KERN_ERR "%s: can't reserve resources\n", d->name);
191out: 224out:
192 return ret; 225 return ret;
193} 226}
@@ -314,7 +347,6 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
314 ide_init_port_hw(hwif, &hw); 347 ide_init_port_hw(hwif, &hw);
315 348
316 hwif->dev = &dev->dev; 349 hwif->dev = &dev->dev;
317 hwif->cds = d;
318 350
319 return hwif; 351 return hwif;
320} 352}
@@ -330,40 +362,33 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
330 * state 362 * state
331 */ 363 */
332 364
333void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) 365int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
334{ 366{
335 struct pci_dev *dev = to_pci_dev(hwif->dev); 367 struct pci_dev *dev = to_pci_dev(hwif->dev);
336 u16 pcicmd;
337
338 pci_read_config_word(dev, PCI_COMMAND, &pcicmd);
339 368
340 if ((d->host_flags & IDE_HFLAG_NO_AUTODMA) == 0 || 369 if ((d->host_flags & IDE_HFLAG_NO_AUTODMA) == 0 ||
341 ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && 370 ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE &&
342 (dev->class & 0x80))) { 371 (dev->class & 0x80))) {
343 unsigned long dma_base = ide_get_or_set_dma_base(d, hwif); 372 unsigned long base = ide_pci_dma_base(hwif, d);
344 if (dma_base && !(pcicmd & PCI_COMMAND_MASTER)) { 373
345 /* 374 if (base == 0 || ide_pci_set_master(dev, d->name) < 0)
346 * Set up BM-DMA capability 375 return -1;
347 * (PnP BIOS should have done this) 376
348 */ 377 if (hwif->mmio)
349 pci_set_master(dev); 378 printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name);
350 if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd) || !(pcicmd & PCI_COMMAND_MASTER)) { 379 else
351 printk(KERN_ERR "%s: %s error updating PCICMD\n", 380 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
352 hwif->name, d->name); 381 hwif->name, base, base + 7);
353 dma_base = 0; 382
354 } 383 hwif->extra_base = base + (hwif->channel ? 8 : 16);
355 } 384
356 if (dma_base) { 385 if (ide_allocate_dma_engine(hwif))
357 if (d->init_dma) { 386 return -1;
358 d->init_dma(hwif, dma_base); 387
359 } else { 388 ide_setup_dma(hwif, base);
360 ide_setup_dma(hwif, dma_base);
361 }
362 } else {
363 printk(KERN_INFO "%s: %s Bus-Master DMA disabled "
364 "(BIOS)\n", hwif->name, d->name);
365 }
366 } 389 }
390
391 return 0;
367} 392}
368#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ 393#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
369 394
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 93c3fc20aa59..3638fa808ded 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -393,7 +393,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
393 printk ("ide-scsi: %s: DMA complete\n", drive->name); 393 printk ("ide-scsi: %s: DMA complete\n", drive->name);
394#endif /* IDESCSI_DEBUG_LOG */ 394#endif /* IDESCSI_DEBUG_LOG */
395 pc->xferred = pc->req_xfer; 395 pc->xferred = pc->req_xfer;
396 (void) HWIF(drive)->ide_dma_end(drive); 396 (void)hwif->dma_ops->dma_end(drive);
397 } 397 }
398 398
399 /* Clear the interrupt */ 399 /* Clear the interrupt */
@@ -498,7 +498,7 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
498 drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12); 498 drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12);
499 if (pc->flags & PC_FLAG_DMA_OK) { 499 if (pc->flags & PC_FLAG_DMA_OK) {
500 pc->flags |= PC_FLAG_DMA_IN_PROGRESS; 500 pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
501 hwif->dma_start(drive); 501 hwif->dma_ops->dma_start(drive);
502 } 502 }
503 return ide_started; 503 return ide_started;
504} 504}
@@ -560,7 +560,7 @@ static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive,
560 560
561 if (drive->using_dma && !idescsi_map_sg(drive, pc)) { 561 if (drive->using_dma && !idescsi_map_sg(drive, pc)) {
562 hwif->sg_mapped = 1; 562 hwif->sg_mapped = 1;
563 dma = !hwif->dma_setup(drive); 563 dma = !hwif->dma_ops->dma_setup(drive);
564 hwif->sg_mapped = 0; 564 hwif->sg_mapped = 0;
565 } 565 }
566 566