diff options
Diffstat (limited to 'drivers')
42 files changed, 510 insertions, 953 deletions
diff --git a/drivers/ide/alim15x3.c b/drivers/ide/alim15x3.c index 537da1cde16d..e59b6dee9ae2 100644 --- a/drivers/ide/alim15x3.c +++ b/drivers/ide/alim15x3.c | |||
@@ -402,27 +402,23 @@ static u8 ali_cable_detect(ide_hwif_t *hwif) | |||
402 | return cbl; | 402 | return cbl; |
403 | } | 403 | } |
404 | 404 | ||
405 | #if !defined(CONFIG_SPARC64) && !defined(CONFIG_PPC) | 405 | #ifndef CONFIG_SPARC64 |
406 | /** | 406 | /** |
407 | * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff | 407 | * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff |
408 | * @hwif: interface to configure | 408 | * @hwif: interface to configure |
409 | * | 409 | * |
410 | * Obtain the IRQ tables for an ALi based IDE solution on the PC | 410 | * Obtain the IRQ tables for an ALi based IDE solution on the PC |
411 | * class platforms. This part of the code isn't applicable to the | 411 | * class platforms. This part of the code isn't applicable to the |
412 | * Sparc and PowerPC systems. | 412 | * Sparc systems. |
413 | */ | 413 | */ |
414 | 414 | ||
415 | static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) | 415 | static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) |
416 | { | 416 | { |
417 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
418 | u8 ideic, inmir; | 417 | u8 ideic, inmir; |
419 | s8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6, | 418 | s8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6, |
420 | 1, 11, 0, 12, 0, 14, 0, 15 }; | 419 | 1, 11, 0, 12, 0, 14, 0, 15 }; |
421 | int irq = -1; | 420 | int irq = -1; |
422 | 421 | ||
423 | if (dev->device == PCI_DEVICE_ID_AL_M5229) | ||
424 | hwif->irq = hwif->channel ? 15 : 14; | ||
425 | |||
426 | if (isa_dev) { | 422 | if (isa_dev) { |
427 | /* | 423 | /* |
428 | * read IDE interface control | 424 | * read IDE interface control |
@@ -455,7 +451,7 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) | |||
455 | } | 451 | } |
456 | #else | 452 | #else |
457 | #define init_hwif_ali15x3 NULL | 453 | #define init_hwif_ali15x3 NULL |
458 | #endif /* !defined(CONFIG_SPARC64) && !defined(CONFIG_PPC) */ | 454 | #endif /* CONFIG_SPARC64 */ |
459 | 455 | ||
460 | /** | 456 | /** |
461 | * init_dma_ali15x3 - set up DMA on ALi15x3 | 457 | * init_dma_ali15x3 - set up DMA on ALi15x3 |
diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index 403d0e4265db..fc0949a8cfde 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c | |||
@@ -216,6 +216,7 @@ static const struct ide_port_info at91_ide_port_info __initdata = { | |||
216 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | | 216 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | |
217 | IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, | 217 | IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, |
218 | .pio_mask = ATA_PIO6, | 218 | .pio_mask = ATA_PIO6, |
219 | .chipset = ide_generic, | ||
219 | }; | 220 | }; |
220 | 221 | ||
221 | /* | 222 | /* |
@@ -246,8 +247,7 @@ irqreturn_t at91_irq_handler(int irq, void *dev_id) | |||
246 | static int __init at91_ide_probe(struct platform_device *pdev) | 247 | static int __init at91_ide_probe(struct platform_device *pdev) |
247 | { | 248 | { |
248 | int ret; | 249 | int ret; |
249 | hw_regs_t hw; | 250 | struct ide_hw hw, *hws[] = { &hw }; |
250 | hw_regs_t *hws[] = { &hw, NULL, NULL, NULL }; | ||
251 | struct ide_host *host; | 251 | struct ide_host *host; |
252 | struct resource *res; | 252 | struct resource *res; |
253 | unsigned long tf_base = 0, ctl_base = 0; | 253 | unsigned long tf_base = 0, ctl_base = 0; |
@@ -304,10 +304,9 @@ static int __init at91_ide_probe(struct platform_device *pdev) | |||
304 | ide_std_init_ports(&hw, tf_base, ctl_base + 6); | 304 | ide_std_init_ports(&hw, tf_base, ctl_base + 6); |
305 | 305 | ||
306 | hw.irq = board->irq_pin; | 306 | hw.irq = board->irq_pin; |
307 | hw.chipset = ide_generic; | ||
308 | hw.dev = &pdev->dev; | 307 | hw.dev = &pdev->dev; |
309 | 308 | ||
310 | host = ide_host_alloc(&at91_ide_port_info, hws); | 309 | host = ide_host_alloc(&at91_ide_port_info, hws, 1); |
311 | if (!host) { | 310 | if (!host) { |
312 | perr("failed to allocate ide host\n"); | 311 | perr("failed to allocate ide host\n"); |
313 | return -ENOMEM; | 312 | return -ENOMEM; |
diff --git a/drivers/ide/au1xxx-ide.c b/drivers/ide/au1xxx-ide.c index 46013644c965..58121bd6c115 100644 --- a/drivers/ide/au1xxx-ide.c +++ b/drivers/ide/au1xxx-ide.c | |||
@@ -449,7 +449,7 @@ static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
449 | } | 449 | } |
450 | #endif | 450 | #endif |
451 | 451 | ||
452 | static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif) | 452 | static void auide_setup_ports(struct ide_hw *hw, _auide_hwif *ahwif) |
453 | { | 453 | { |
454 | int i; | 454 | int i; |
455 | unsigned long *ata_regs = hw->io_ports_array; | 455 | unsigned long *ata_regs = hw->io_ports_array; |
@@ -499,6 +499,7 @@ static const struct ide_port_info au1xxx_port_info = { | |||
499 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA | 499 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA |
500 | .mwdma_mask = ATA_MWDMA2, | 500 | .mwdma_mask = ATA_MWDMA2, |
501 | #endif | 501 | #endif |
502 | .chipset = ide_au1xxx, | ||
502 | }; | 503 | }; |
503 | 504 | ||
504 | static int au_ide_probe(struct platform_device *dev) | 505 | static int au_ide_probe(struct platform_device *dev) |
@@ -507,7 +508,7 @@ static int au_ide_probe(struct platform_device *dev) | |||
507 | struct resource *res; | 508 | struct resource *res; |
508 | struct ide_host *host; | 509 | struct ide_host *host; |
509 | int ret = 0; | 510 | int ret = 0; |
510 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 511 | struct ide_hw hw, *hws[] = { &hw }; |
511 | 512 | ||
512 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) | 513 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) |
513 | char *mode = "MWDMA2"; | 514 | char *mode = "MWDMA2"; |
@@ -548,9 +549,8 @@ static int au_ide_probe(struct platform_device *dev) | |||
548 | auide_setup_ports(&hw, ahwif); | 549 | auide_setup_ports(&hw, ahwif); |
549 | hw.irq = ahwif->irq; | 550 | hw.irq = ahwif->irq; |
550 | hw.dev = &dev->dev; | 551 | hw.dev = &dev->dev; |
551 | hw.chipset = ide_au1xxx; | ||
552 | 552 | ||
553 | ret = ide_host_add(&au1xxx_port_info, hws, &host); | 553 | ret = ide_host_add(&au1xxx_port_info, hws, 1, &host); |
554 | if (ret) | 554 | if (ret) |
555 | goto out; | 555 | goto out; |
556 | 556 | ||
diff --git a/drivers/ide/buddha.c b/drivers/ide/buddha.c index d028f8864bc1..e3c6a5913305 100644 --- a/drivers/ide/buddha.c +++ b/drivers/ide/buddha.c | |||
@@ -121,7 +121,7 @@ static int xsurf_ack_intr(ide_hwif_t *hwif) | |||
121 | return 1; | 121 | return 1; |
122 | } | 122 | } |
123 | 123 | ||
124 | static void __init buddha_setup_ports(hw_regs_t *hw, unsigned long base, | 124 | static void __init buddha_setup_ports(struct ide_hw *hw, unsigned long base, |
125 | unsigned long ctl, unsigned long irq_port, | 125 | unsigned long ctl, unsigned long irq_port, |
126 | ide_ack_intr_t *ack_intr) | 126 | ide_ack_intr_t *ack_intr) |
127 | { | 127 | { |
@@ -139,13 +139,12 @@ static void __init buddha_setup_ports(hw_regs_t *hw, unsigned long base, | |||
139 | 139 | ||
140 | hw->irq = IRQ_AMIGA_PORTS; | 140 | hw->irq = IRQ_AMIGA_PORTS; |
141 | hw->ack_intr = ack_intr; | 141 | hw->ack_intr = ack_intr; |
142 | |||
143 | hw->chipset = ide_generic; | ||
144 | } | 142 | } |
145 | 143 | ||
146 | static const struct ide_port_info buddha_port_info = { | 144 | static const struct ide_port_info buddha_port_info = { |
147 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 145 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
148 | .irq_flags = IRQF_SHARED, | 146 | .irq_flags = IRQF_SHARED, |
147 | .chipset = ide_generic, | ||
149 | }; | 148 | }; |
150 | 149 | ||
151 | /* | 150 | /* |
@@ -161,7 +160,7 @@ static int __init buddha_init(void) | |||
161 | 160 | ||
162 | while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { | 161 | while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { |
163 | unsigned long board; | 162 | unsigned long board; |
164 | hw_regs_t hw[MAX_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; | 163 | struct ide_hw hw[MAX_NUM_HWIFS], *hws[MAX_NUM_HWIFS]; |
165 | 164 | ||
166 | if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { | 165 | if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { |
167 | buddha_num_hwifs = BUDDHA_NUM_HWIFS; | 166 | buddha_num_hwifs = BUDDHA_NUM_HWIFS; |
@@ -225,7 +224,7 @@ fail_base2: | |||
225 | hws[i] = &hw[i]; | 224 | hws[i] = &hw[i]; |
226 | } | 225 | } |
227 | 226 | ||
228 | ide_host_add(&buddha_port_info, hws, NULL); | 227 | ide_host_add(&buddha_port_info, hws, i, NULL); |
229 | } | 228 | } |
230 | 229 | ||
231 | return 0; | 230 | return 0; |
diff --git a/drivers/ide/cmd640.c b/drivers/ide/cmd640.c index 8890276fef7f..1683ed5c7329 100644 --- a/drivers/ide/cmd640.c +++ b/drivers/ide/cmd640.c | |||
@@ -708,7 +708,7 @@ static int __init cmd640x_init(void) | |||
708 | int second_port_cmd640 = 0, rc; | 708 | int second_port_cmd640 = 0, rc; |
709 | const char *bus_type, *port2; | 709 | const char *bus_type, *port2; |
710 | u8 b, cfr; | 710 | u8 b, cfr; |
711 | hw_regs_t hw[2], *hws[] = { NULL, NULL, NULL, NULL }; | 711 | struct ide_hw hw[2], *hws[2]; |
712 | 712 | ||
713 | if (cmd640_vlb && probe_for_cmd640_vlb()) { | 713 | if (cmd640_vlb && probe_for_cmd640_vlb()) { |
714 | bus_type = "VLB"; | 714 | bus_type = "VLB"; |
@@ -762,11 +762,9 @@ static int __init cmd640x_init(void) | |||
762 | 762 | ||
763 | ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); | 763 | ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); |
764 | hw[0].irq = 14; | 764 | hw[0].irq = 14; |
765 | hw[0].chipset = ide_cmd640; | ||
766 | 765 | ||
767 | ide_std_init_ports(&hw[1], 0x170, 0x376); | 766 | ide_std_init_ports(&hw[1], 0x170, 0x376); |
768 | hw[1].irq = 15; | 767 | hw[1].irq = 15; |
769 | hw[1].chipset = ide_cmd640; | ||
770 | 768 | ||
771 | printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x" | 769 | printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x" |
772 | "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr); | 770 | "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr); |
@@ -824,7 +822,8 @@ static int __init cmd640x_init(void) | |||
824 | cmd640_dump_regs(); | 822 | cmd640_dump_regs(); |
825 | #endif | 823 | #endif |
826 | 824 | ||
827 | return ide_host_add(&cmd640_port_info, hws, NULL); | 825 | return ide_host_add(&cmd640_port_info, hws, second_port_cmd640 ? 2 : 1, |
826 | NULL); | ||
828 | } | 827 | } |
829 | 828 | ||
830 | module_param_named(probe_vlb, cmd640_vlb, bool, 0); | 829 | module_param_named(probe_vlb, cmd640_vlb, bool, 0); |
diff --git a/drivers/ide/cs5520.c b/drivers/ide/cs5520.c index 87987a7d36c9..bd066bb9d611 100644 --- a/drivers/ide/cs5520.c +++ b/drivers/ide/cs5520.c | |||
@@ -110,7 +110,7 @@ static const struct ide_port_info cyrix_chipset __devinitdata = { | |||
110 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 110 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
111 | { | 111 | { |
112 | const struct ide_port_info *d = &cyrix_chipset; | 112 | const struct ide_port_info *d = &cyrix_chipset; |
113 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; | 113 | struct ide_hw hw[2], *hws[] = { NULL, NULL }; |
114 | 114 | ||
115 | ide_setup_pci_noise(dev, d); | 115 | ide_setup_pci_noise(dev, d); |
116 | 116 | ||
@@ -136,7 +136,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic | |||
136 | ide_pci_setup_ports(dev, d, &hw[0], &hws[0]); | 136 | ide_pci_setup_ports(dev, d, &hw[0], &hws[0]); |
137 | hw[0].irq = 14; | 137 | hw[0].irq = 14; |
138 | 138 | ||
139 | return ide_host_add(d, hws, NULL); | 139 | return ide_host_add(d, hws, 2, NULL); |
140 | } | 140 | } |
141 | 141 | ||
142 | static const struct pci_device_id cs5520_pci_tbl[] = { | 142 | static const struct pci_device_id cs5520_pci_tbl[] = { |
diff --git a/drivers/ide/delkin_cb.c b/drivers/ide/delkin_cb.c index f153b95619bb..1e10eba62ceb 100644 --- a/drivers/ide/delkin_cb.c +++ b/drivers/ide/delkin_cb.c | |||
@@ -68,6 +68,7 @@ static const struct ide_port_info delkin_cb_port_info = { | |||
68 | IDE_HFLAG_NO_DMA, | 68 | IDE_HFLAG_NO_DMA, |
69 | .irq_flags = IRQF_SHARED, | 69 | .irq_flags = IRQF_SHARED, |
70 | .init_chipset = delkin_cb_init_chipset, | 70 | .init_chipset = delkin_cb_init_chipset, |
71 | .chipset = ide_pci, | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | static int __devinit | 74 | static int __devinit |
@@ -76,7 +77,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
76 | struct ide_host *host; | 77 | struct ide_host *host; |
77 | unsigned long base; | 78 | unsigned long base; |
78 | int rc; | 79 | int rc; |
79 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 80 | struct ide_hw hw, *hws[] = { &hw }; |
80 | 81 | ||
81 | rc = pci_enable_device(dev); | 82 | rc = pci_enable_device(dev); |
82 | if (rc) { | 83 | if (rc) { |
@@ -97,9 +98,8 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
97 | ide_std_init_ports(&hw, base + 0x10, base + 0x1e); | 98 | ide_std_init_ports(&hw, base + 0x10, base + 0x1e); |
98 | hw.irq = dev->irq; | 99 | hw.irq = dev->irq; |
99 | hw.dev = &dev->dev; | 100 | hw.dev = &dev->dev; |
100 | hw.chipset = ide_pci; /* this enables IRQ sharing */ | ||
101 | 101 | ||
102 | rc = ide_host_add(&delkin_cb_port_info, hws, &host); | 102 | rc = ide_host_add(&delkin_cb_port_info, hws, 1, &host); |
103 | if (rc) | 103 | if (rc) |
104 | goto out_disable; | 104 | goto out_disable; |
105 | 105 | ||
diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c index 0e2df6755ec9..22fa27389c3b 100644 --- a/drivers/ide/falconide.c +++ b/drivers/ide/falconide.c | |||
@@ -111,9 +111,10 @@ static const struct ide_port_info falconide_port_info = { | |||
111 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | | 111 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | |
112 | IDE_HFLAG_NO_DMA, | 112 | IDE_HFLAG_NO_DMA, |
113 | .irq_flags = IRQF_SHARED, | 113 | .irq_flags = IRQF_SHARED, |
114 | .chipset = ide_generic, | ||
114 | }; | 115 | }; |
115 | 116 | ||
116 | static void __init falconide_setup_ports(hw_regs_t *hw) | 117 | static void __init falconide_setup_ports(struct ide_hw *hw) |
117 | { | 118 | { |
118 | int i; | 119 | int i; |
119 | 120 | ||
@@ -128,8 +129,6 @@ static void __init falconide_setup_ports(hw_regs_t *hw) | |||
128 | 129 | ||
129 | hw->irq = IRQ_MFP_IDE; | 130 | hw->irq = IRQ_MFP_IDE; |
130 | hw->ack_intr = NULL; | 131 | hw->ack_intr = NULL; |
131 | |||
132 | hw->chipset = ide_generic; | ||
133 | } | 132 | } |
134 | 133 | ||
135 | /* | 134 | /* |
@@ -139,7 +138,7 @@ static void __init falconide_setup_ports(hw_regs_t *hw) | |||
139 | static int __init falconide_init(void) | 138 | static int __init falconide_init(void) |
140 | { | 139 | { |
141 | struct ide_host *host; | 140 | struct ide_host *host; |
142 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 141 | struct ide_hw hw, *hws[] = { &hw }; |
143 | int rc; | 142 | int rc; |
144 | 143 | ||
145 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE)) | 144 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE)) |
@@ -154,7 +153,7 @@ static int __init falconide_init(void) | |||
154 | 153 | ||
155 | falconide_setup_ports(&hw); | 154 | falconide_setup_ports(&hw); |
156 | 155 | ||
157 | host = ide_host_alloc(&falconide_port_info, hws); | 156 | host = ide_host_alloc(&falconide_port_info, hws, 1); |
158 | if (host == NULL) { | 157 | if (host == NULL) { |
159 | rc = -ENOMEM; | 158 | rc = -ENOMEM; |
160 | goto err; | 159 | goto err; |
diff --git a/drivers/ide/gayle.c b/drivers/ide/gayle.c index c7119516c5a7..4451a6a5dfe0 100644 --- a/drivers/ide/gayle.c +++ b/drivers/ide/gayle.c | |||
@@ -88,7 +88,7 @@ static int gayle_ack_intr_a1200(ide_hwif_t *hwif) | |||
88 | return 1; | 88 | return 1; |
89 | } | 89 | } |
90 | 90 | ||
91 | static void __init gayle_setup_ports(hw_regs_t *hw, unsigned long base, | 91 | static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base, |
92 | unsigned long ctl, unsigned long irq_port, | 92 | unsigned long ctl, unsigned long irq_port, |
93 | ide_ack_intr_t *ack_intr) | 93 | ide_ack_intr_t *ack_intr) |
94 | { | 94 | { |
@@ -106,14 +106,13 @@ static void __init gayle_setup_ports(hw_regs_t *hw, unsigned long base, | |||
106 | 106 | ||
107 | hw->irq = IRQ_AMIGA_PORTS; | 107 | hw->irq = IRQ_AMIGA_PORTS; |
108 | hw->ack_intr = ack_intr; | 108 | hw->ack_intr = ack_intr; |
109 | |||
110 | hw->chipset = ide_generic; | ||
111 | } | 109 | } |
112 | 110 | ||
113 | static const struct ide_port_info gayle_port_info = { | 111 | static const struct ide_port_info gayle_port_info = { |
114 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | | 112 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | |
115 | IDE_HFLAG_NO_DMA, | 113 | IDE_HFLAG_NO_DMA, |
116 | .irq_flags = IRQF_SHARED, | 114 | .irq_flags = IRQF_SHARED, |
115 | .chipset = ide_generic, | ||
117 | }; | 116 | }; |
118 | 117 | ||
119 | /* | 118 | /* |
@@ -126,7 +125,7 @@ static int __init gayle_init(void) | |||
126 | unsigned long base, ctrlport, irqport; | 125 | unsigned long base, ctrlport, irqport; |
127 | ide_ack_intr_t *ack_intr; | 126 | ide_ack_intr_t *ack_intr; |
128 | int a4000, i, rc; | 127 | int a4000, i, rc; |
129 | hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; | 128 | struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS]; |
130 | 129 | ||
131 | if (!MACH_IS_AMIGA) | 130 | if (!MACH_IS_AMIGA) |
132 | return -ENODEV; | 131 | return -ENODEV; |
@@ -171,7 +170,7 @@ found: | |||
171 | hws[i] = &hw[i]; | 170 | hws[i] = &hw[i]; |
172 | } | 171 | } |
173 | 172 | ||
174 | rc = ide_host_add(&gayle_port_info, hws, NULL); | 173 | rc = ide_host_add(&gayle_port_info, hws, i, NULL); |
175 | if (rc) | 174 | if (rc) |
176 | release_mem_region(res_start, res_n); | 175 | release_mem_region(res_start, res_n); |
177 | 176 | ||
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index 36da913cc553..c5269fa1f733 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c | |||
@@ -381,7 +381,7 @@ static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
381 | return -EOPNOTSUPP; | 381 | return -EOPNOTSUPP; |
382 | } | 382 | } |
383 | 383 | ||
384 | static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, | 384 | static void icside_setup_ports(struct ide_hw *hw, void __iomem *base, |
385 | struct cardinfo *info, struct expansion_card *ec) | 385 | struct cardinfo *info, struct expansion_card *ec) |
386 | { | 386 | { |
387 | unsigned long port = (unsigned long)base + info->dataoffset; | 387 | unsigned long port = (unsigned long)base + info->dataoffset; |
@@ -398,11 +398,11 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, | |||
398 | 398 | ||
399 | hw->irq = ec->irq; | 399 | hw->irq = ec->irq; |
400 | hw->dev = &ec->dev; | 400 | hw->dev = &ec->dev; |
401 | hw->chipset = ide_acorn; | ||
402 | } | 401 | } |
403 | 402 | ||
404 | static const struct ide_port_info icside_v5_port_info = { | 403 | static const struct ide_port_info icside_v5_port_info = { |
405 | .host_flags = IDE_HFLAG_NO_DMA, | 404 | .host_flags = IDE_HFLAG_NO_DMA, |
405 | .chipset = ide_acorn, | ||
406 | }; | 406 | }; |
407 | 407 | ||
408 | static int __devinit | 408 | static int __devinit |
@@ -410,7 +410,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) | |||
410 | { | 410 | { |
411 | void __iomem *base; | 411 | void __iomem *base; |
412 | struct ide_host *host; | 412 | struct ide_host *host; |
413 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 413 | struct ide_hw hw, *hws[] = { &hw }; |
414 | int ret; | 414 | int ret; |
415 | 415 | ||
416 | base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); | 416 | base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); |
@@ -431,7 +431,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) | |||
431 | 431 | ||
432 | icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec); | 432 | icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec); |
433 | 433 | ||
434 | host = ide_host_alloc(&icside_v5_port_info, hws); | 434 | host = ide_host_alloc(&icside_v5_port_info, hws, 1); |
435 | if (host == NULL) | 435 | if (host == NULL) |
436 | return -ENODEV; | 436 | return -ENODEV; |
437 | 437 | ||
@@ -457,6 +457,7 @@ static const struct ide_port_info icside_v6_port_info __initdata = { | |||
457 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_MMIO, | 457 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_MMIO, |
458 | .mwdma_mask = ATA_MWDMA2, | 458 | .mwdma_mask = ATA_MWDMA2, |
459 | .swdma_mask = ATA_SWDMA2, | 459 | .swdma_mask = ATA_SWDMA2, |
460 | .chipset = ide_acorn, | ||
460 | }; | 461 | }; |
461 | 462 | ||
462 | static int __devinit | 463 | static int __devinit |
@@ -466,7 +467,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) | |||
466 | struct ide_host *host; | 467 | struct ide_host *host; |
467 | unsigned int sel = 0; | 468 | unsigned int sel = 0; |
468 | int ret; | 469 | int ret; |
469 | hw_regs_t hw[2], *hws[] = { &hw[0], &hw[1], NULL, NULL }; | 470 | struct ide_hw hw[2], *hws[] = { &hw[0], &hw[1] }; |
470 | struct ide_port_info d = icside_v6_port_info; | 471 | struct ide_port_info d = icside_v6_port_info; |
471 | 472 | ||
472 | ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); | 473 | ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); |
@@ -506,7 +507,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) | |||
506 | icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec); | 507 | icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec); |
507 | icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec); | 508 | icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec); |
508 | 509 | ||
509 | host = ide_host_alloc(&d, hws); | 510 | host = ide_host_alloc(&d, hws, 2); |
510 | if (host == NULL) | 511 | if (host == NULL) |
511 | return -ENODEV; | 512 | return -ENODEV; |
512 | 513 | ||
diff --git a/drivers/ide/ide-4drives.c b/drivers/ide/ide-4drives.c index 78aca75a2c48..979d342c338a 100644 --- a/drivers/ide/ide-4drives.c +++ b/drivers/ide/ide-4drives.c | |||
@@ -25,12 +25,13 @@ static const struct ide_port_info ide_4drives_port_info = { | |||
25 | .port_ops = &ide_4drives_port_ops, | 25 | .port_ops = &ide_4drives_port_ops, |
26 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA | | 26 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA | |
27 | IDE_HFLAG_4DRIVES, | 27 | IDE_HFLAG_4DRIVES, |
28 | .chipset = ide_4drives, | ||
28 | }; | 29 | }; |
29 | 30 | ||
30 | static int __init ide_4drives_init(void) | 31 | static int __init ide_4drives_init(void) |
31 | { | 32 | { |
32 | unsigned long base = 0x1f0, ctl = 0x3f6; | 33 | unsigned long base = 0x1f0, ctl = 0x3f6; |
33 | hw_regs_t hw, *hws[] = { &hw, &hw, NULL, NULL }; | 34 | struct ide_hw hw, *hws[] = { &hw, &hw }; |
34 | 35 | ||
35 | if (probe_4drives == 0) | 36 | if (probe_4drives == 0) |
36 | return -ENODEV; | 37 | return -ENODEV; |
@@ -52,9 +53,8 @@ static int __init ide_4drives_init(void) | |||
52 | 53 | ||
53 | ide_std_init_ports(&hw, base, ctl); | 54 | ide_std_init_ports(&hw, base, ctl); |
54 | hw.irq = 14; | 55 | hw.irq = 14; |
55 | hw.chipset = ide_4drives; | ||
56 | 56 | ||
57 | return ide_host_add(&ide_4drives_port_info, hws, NULL); | 57 | return ide_host_add(&ide_4drives_port_info, hws, 2, NULL); |
58 | } | 58 | } |
59 | 59 | ||
60 | module_init(ide_4drives_init); | 60 | module_init(ide_4drives_init); |
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 7201b176d75b..afe5a4323879 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -80,34 +80,6 @@ void ide_init_pc(struct ide_atapi_pc *pc) | |||
80 | EXPORT_SYMBOL_GPL(ide_init_pc); | 80 | EXPORT_SYMBOL_GPL(ide_init_pc); |
81 | 81 | ||
82 | /* | 82 | /* |
83 | * Generate a new packet command request in front of the request queue, before | ||
84 | * the current request, so that it will be processed immediately, on the next | ||
85 | * pass through the driver. | ||
86 | */ | ||
87 | static void ide_queue_pc_head(ide_drive_t *drive, struct gendisk *disk, | ||
88 | struct ide_atapi_pc *pc, struct request *rq) | ||
89 | { | ||
90 | blk_rq_init(NULL, rq); | ||
91 | rq->cmd_type = REQ_TYPE_SPECIAL; | ||
92 | rq->cmd_flags |= REQ_PREEMPT; | ||
93 | rq->buffer = (char *)pc; | ||
94 | rq->rq_disk = disk; | ||
95 | |||
96 | if (pc->req_xfer) { | ||
97 | rq->data = pc->buf; | ||
98 | rq->data_len = pc->req_xfer; | ||
99 | } | ||
100 | |||
101 | memcpy(rq->cmd, pc->c, 12); | ||
102 | if (drive->media == ide_tape) | ||
103 | rq->cmd[13] = REQ_IDETAPE_PC1; | ||
104 | |||
105 | drive->hwif->rq = NULL; | ||
106 | |||
107 | elv_add_request(drive->queue, rq, ELEVATOR_INSERT_FRONT, 0); | ||
108 | } | ||
109 | |||
110 | /* | ||
111 | * Add a special packet command request to the tail of the request queue, | 83 | * Add a special packet command request to the tail of the request queue, |
112 | * and wait for it to be serviced. | 84 | * and wait for it to be serviced. |
113 | */ | 85 | */ |
@@ -119,19 +91,21 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, | |||
119 | 91 | ||
120 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 92 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
121 | rq->cmd_type = REQ_TYPE_SPECIAL; | 93 | rq->cmd_type = REQ_TYPE_SPECIAL; |
122 | rq->buffer = (char *)pc; | 94 | rq->special = (char *)pc; |
123 | 95 | ||
124 | if (pc->req_xfer) { | 96 | if (pc->req_xfer) { |
125 | rq->data = pc->buf; | 97 | error = blk_rq_map_kern(drive->queue, rq, pc->buf, pc->req_xfer, |
126 | rq->data_len = pc->req_xfer; | 98 | GFP_NOIO); |
99 | if (error) | ||
100 | goto put_req; | ||
127 | } | 101 | } |
128 | 102 | ||
129 | memcpy(rq->cmd, pc->c, 12); | 103 | memcpy(rq->cmd, pc->c, 12); |
130 | if (drive->media == ide_tape) | 104 | if (drive->media == ide_tape) |
131 | rq->cmd[13] = REQ_IDETAPE_PC1; | 105 | rq->cmd[13] = REQ_IDETAPE_PC1; |
132 | error = blk_execute_rq(drive->queue, disk, rq, 0); | 106 | error = blk_execute_rq(drive->queue, disk, rq, 0); |
107 | put_req: | ||
133 | blk_put_request(rq); | 108 | blk_put_request(rq); |
134 | |||
135 | return error; | 109 | return error; |
136 | } | 110 | } |
137 | EXPORT_SYMBOL_GPL(ide_queue_pc_tail); | 111 | EXPORT_SYMBOL_GPL(ide_queue_pc_tail); |
@@ -191,20 +165,103 @@ void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc) | |||
191 | } | 165 | } |
192 | EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd); | 166 | EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd); |
193 | 167 | ||
168 | void ide_prep_sense(ide_drive_t *drive, struct request *rq) | ||
169 | { | ||
170 | struct request_sense *sense = &drive->sense_data; | ||
171 | struct request *sense_rq = &drive->sense_rq; | ||
172 | unsigned int cmd_len, sense_len; | ||
173 | int err; | ||
174 | |||
175 | debug_log("%s: enter\n", __func__); | ||
176 | |||
177 | switch (drive->media) { | ||
178 | case ide_floppy: | ||
179 | cmd_len = 255; | ||
180 | sense_len = 18; | ||
181 | break; | ||
182 | case ide_tape: | ||
183 | cmd_len = 20; | ||
184 | sense_len = 20; | ||
185 | break; | ||
186 | default: | ||
187 | cmd_len = 18; | ||
188 | sense_len = 18; | ||
189 | } | ||
190 | |||
191 | BUG_ON(sense_len > sizeof(*sense)); | ||
192 | |||
193 | if (blk_sense_request(rq) || drive->sense_rq_armed) | ||
194 | return; | ||
195 | |||
196 | memset(sense, 0, sizeof(*sense)); | ||
197 | |||
198 | blk_rq_init(rq->q, sense_rq); | ||
199 | |||
200 | err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, | ||
201 | GFP_NOIO); | ||
202 | if (unlikely(err)) { | ||
203 | if (printk_ratelimit()) | ||
204 | printk(KERN_WARNING "%s: failed to map sense buffer\n", | ||
205 | drive->name); | ||
206 | return; | ||
207 | } | ||
208 | |||
209 | sense_rq->rq_disk = rq->rq_disk; | ||
210 | sense_rq->cmd[0] = GPCMD_REQUEST_SENSE; | ||
211 | sense_rq->cmd[4] = cmd_len; | ||
212 | sense_rq->cmd_type = REQ_TYPE_SENSE; | ||
213 | sense_rq->cmd_flags |= REQ_PREEMPT; | ||
214 | |||
215 | if (drive->media == ide_tape) | ||
216 | sense_rq->cmd[13] = REQ_IDETAPE_PC1; | ||
217 | |||
218 | drive->sense_rq_armed = true; | ||
219 | } | ||
220 | EXPORT_SYMBOL_GPL(ide_prep_sense); | ||
221 | |||
222 | int ide_queue_sense_rq(ide_drive_t *drive, void *special) | ||
223 | { | ||
224 | /* deferred failure from ide_prep_sense() */ | ||
225 | if (!drive->sense_rq_armed) { | ||
226 | printk(KERN_WARNING "%s: failed queue sense request\n", | ||
227 | drive->name); | ||
228 | return -ENOMEM; | ||
229 | } | ||
230 | |||
231 | drive->sense_rq.special = special; | ||
232 | drive->sense_rq_armed = false; | ||
233 | |||
234 | drive->hwif->rq = NULL; | ||
235 | |||
236 | elv_add_request(drive->queue, &drive->sense_rq, | ||
237 | ELEVATOR_INSERT_FRONT, 0); | ||
238 | return 0; | ||
239 | } | ||
240 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | ||
241 | |||
194 | /* | 242 | /* |
195 | * Called when an error was detected during the last packet command. | 243 | * Called when an error was detected during the last packet command. |
196 | * We queue a request sense packet command in the head of the request list. | 244 | * We queue a request sense packet command at the head of the request |
245 | * queue. | ||
197 | */ | 246 | */ |
198 | void ide_retry_pc(ide_drive_t *drive, struct gendisk *disk) | 247 | void ide_retry_pc(ide_drive_t *drive) |
199 | { | 248 | { |
200 | struct request *rq = &drive->request_sense_rq; | 249 | struct request *sense_rq = &drive->sense_rq; |
201 | struct ide_atapi_pc *pc = &drive->request_sense_pc; | 250 | struct ide_atapi_pc *pc = &drive->request_sense_pc; |
202 | 251 | ||
203 | (void)ide_read_error(drive); | 252 | (void)ide_read_error(drive); |
204 | ide_create_request_sense_cmd(drive, pc); | 253 | |
254 | /* init pc from sense_rq */ | ||
255 | ide_init_pc(pc); | ||
256 | memcpy(pc->c, sense_rq->cmd, 12); | ||
257 | pc->buf = bio_data(sense_rq->bio); /* pointer to mapped address */ | ||
258 | pc->req_xfer = sense_rq->data_len; | ||
259 | |||
205 | if (drive->media == ide_tape) | 260 | if (drive->media == ide_tape) |
206 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 261 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); |
207 | ide_queue_pc_head(drive, disk, pc, rq); | 262 | |
263 | if (ide_queue_sense_rq(drive, pc)) | ||
264 | ide_complete_rq(drive, -EIO, blk_rq_bytes(drive->hwif->rq)); | ||
208 | } | 265 | } |
209 | EXPORT_SYMBOL_GPL(ide_retry_pc); | 266 | EXPORT_SYMBOL_GPL(ide_retry_pc); |
210 | 267 | ||
@@ -276,7 +333,6 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
276 | struct ide_cmd *cmd = &hwif->cmd; | 333 | struct ide_cmd *cmd = &hwif->cmd; |
277 | struct request *rq = hwif->rq; | 334 | struct request *rq = hwif->rq; |
278 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; | 335 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; |
279 | xfer_func_t *xferfunc; | ||
280 | unsigned int timeout, done; | 336 | unsigned int timeout, done; |
281 | u16 bcount; | 337 | u16 bcount; |
282 | u8 stat, ireason, dsc = 0; | 338 | u8 stat, ireason, dsc = 0; |
@@ -303,11 +359,8 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
303 | drive->name, rq_data_dir(pc->rq) | 359 | drive->name, rq_data_dir(pc->rq) |
304 | ? "write" : "read"); | 360 | ? "write" : "read"); |
305 | pc->flags |= PC_FLAG_DMA_ERROR; | 361 | pc->flags |= PC_FLAG_DMA_ERROR; |
306 | } else { | 362 | } else |
307 | pc->xferred = pc->req_xfer; | 363 | pc->xferred = pc->req_xfer; |
308 | if (drive->pc_update_buffers) | ||
309 | drive->pc_update_buffers(drive, pc); | ||
310 | } | ||
311 | debug_log("%s: DMA finished\n", drive->name); | 364 | debug_log("%s: DMA finished\n", drive->name); |
312 | } | 365 | } |
313 | 366 | ||
@@ -343,7 +396,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
343 | debug_log("[cmd %x]: check condition\n", rq->cmd[0]); | 396 | debug_log("[cmd %x]: check condition\n", rq->cmd[0]); |
344 | 397 | ||
345 | /* Retry operation */ | 398 | /* Retry operation */ |
346 | ide_retry_pc(drive, rq->rq_disk); | 399 | ide_retry_pc(drive); |
347 | 400 | ||
348 | /* queued, but not started */ | 401 | /* queued, but not started */ |
349 | return ide_stopped; | 402 | return ide_stopped; |
@@ -353,6 +406,12 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
353 | if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0) | 406 | if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0) |
354 | dsc = 1; | 407 | dsc = 1; |
355 | 408 | ||
409 | /* | ||
410 | * ->pc_callback() might change rq->data_len for | ||
411 | * residual count, cache total length. | ||
412 | */ | ||
413 | done = blk_rq_bytes(rq); | ||
414 | |||
356 | /* Command finished - Call the callback function */ | 415 | /* Command finished - Call the callback function */ |
357 | uptodate = drive->pc_callback(drive, dsc); | 416 | uptodate = drive->pc_callback(drive, dsc); |
358 | 417 | ||
@@ -361,7 +420,6 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
361 | 420 | ||
362 | if (blk_special_request(rq)) { | 421 | if (blk_special_request(rq)) { |
363 | rq->errors = 0; | 422 | rq->errors = 0; |
364 | done = blk_rq_bytes(rq); | ||
365 | error = 0; | 423 | error = 0; |
366 | } else { | 424 | } else { |
367 | 425 | ||
@@ -370,11 +428,6 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
370 | rq->errors = -EIO; | 428 | rq->errors = -EIO; |
371 | } | 429 | } |
372 | 430 | ||
373 | if (drive->media == ide_tape) | ||
374 | done = ide_rq_bytes(rq); /* FIXME */ | ||
375 | else | ||
376 | done = blk_rq_bytes(rq); | ||
377 | |||
378 | error = uptodate ? 0 : -EIO; | 431 | error = uptodate ? 0 : -EIO; |
379 | } | 432 | } |
380 | 433 | ||
@@ -407,21 +460,11 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
407 | return ide_do_reset(drive); | 460 | return ide_do_reset(drive); |
408 | } | 461 | } |
409 | 462 | ||
410 | xferfunc = write ? tp_ops->output_data : tp_ops->input_data; | 463 | done = min_t(unsigned int, bcount, cmd->nleft); |
411 | 464 | ide_pio_bytes(drive, cmd, write, done); | |
412 | if (drive->media == ide_floppy && pc->buf == NULL) { | ||
413 | done = min_t(unsigned int, bcount, cmd->nleft); | ||
414 | ide_pio_bytes(drive, cmd, write, done); | ||
415 | } else if (drive->media == ide_tape && pc->bh) { | ||
416 | done = drive->pc_io_buffers(drive, pc, bcount, write); | ||
417 | } else { | ||
418 | done = min_t(unsigned int, bcount, pc->req_xfer - pc->xferred); | ||
419 | xferfunc(drive, NULL, pc->cur_pos, done); | ||
420 | } | ||
421 | 465 | ||
422 | /* Update the current position */ | 466 | /* Update transferred byte count */ |
423 | pc->xferred += done; | 467 | pc->xferred += done; |
424 | pc->cur_pos += done; | ||
425 | 468 | ||
426 | bcount -= done; | 469 | bcount -= done; |
427 | 470 | ||
@@ -599,7 +642,6 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) | |||
599 | 642 | ||
600 | /* We haven't transferred any data yet */ | 643 | /* We haven't transferred any data yet */ |
601 | pc->xferred = 0; | 644 | pc->xferred = 0; |
602 | pc->cur_pos = pc->buf; | ||
603 | 645 | ||
604 | valid_tf = IDE_VALID_DEVICE; | 646 | valid_tf = IDE_VALID_DEVICE; |
605 | bcount = ((drive->media == ide_tape) ? | 647 | bcount = ((drive->media == ide_tape) ? |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 925eb9e245d1..a75e4ee1cd17 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -206,54 +206,25 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, | |||
206 | ide_cd_log_error(drive->name, failed_command, sense); | 206 | ide_cd_log_error(drive->name, failed_command, sense); |
207 | } | 207 | } |
208 | 208 | ||
209 | static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense, | ||
210 | struct request *failed_command) | ||
211 | { | ||
212 | struct cdrom_info *info = drive->driver_data; | ||
213 | struct request *rq = &drive->request_sense_rq; | ||
214 | |||
215 | ide_debug_log(IDE_DBG_SENSE, "enter"); | ||
216 | |||
217 | if (sense == NULL) | ||
218 | sense = &info->sense_data; | ||
219 | |||
220 | /* stuff the sense request in front of our current request */ | ||
221 | blk_rq_init(NULL, rq); | ||
222 | rq->cmd_type = REQ_TYPE_ATA_PC; | ||
223 | rq->rq_disk = info->disk; | ||
224 | |||
225 | rq->data = sense; | ||
226 | rq->cmd[0] = GPCMD_REQUEST_SENSE; | ||
227 | rq->cmd[4] = 18; | ||
228 | rq->data_len = 18; | ||
229 | |||
230 | rq->cmd_type = REQ_TYPE_SENSE; | ||
231 | rq->cmd_flags |= REQ_PREEMPT; | ||
232 | |||
233 | /* NOTE! Save the failed command in "rq->buffer" */ | ||
234 | rq->buffer = (void *) failed_command; | ||
235 | |||
236 | if (failed_command) | ||
237 | ide_debug_log(IDE_DBG_SENSE, "failed_cmd: 0x%x", | ||
238 | failed_command->cmd[0]); | ||
239 | |||
240 | drive->hwif->rq = NULL; | ||
241 | |||
242 | elv_add_request(drive->queue, rq, ELEVATOR_INSERT_FRONT, 0); | ||
243 | } | ||
244 | |||
245 | static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) | 209 | static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) |
246 | { | 210 | { |
247 | /* | 211 | /* |
248 | * For REQ_TYPE_SENSE, "rq->buffer" points to the original | 212 | * For REQ_TYPE_SENSE, "rq->special" points to the original |
249 | * failed request | 213 | * failed request. Also, the sense data should be read |
214 | * directly from rq which might be different from the original | ||
215 | * sense buffer if it got copied during mapping. | ||
250 | */ | 216 | */ |
251 | struct request *failed = (struct request *)rq->buffer; | 217 | struct request *failed = (struct request *)rq->special; |
252 | struct cdrom_info *info = drive->driver_data; | 218 | void *sense = bio_data(rq->bio); |
253 | void *sense = &info->sense_data; | ||
254 | 219 | ||
255 | if (failed) { | 220 | if (failed) { |
256 | if (failed->sense) { | 221 | if (failed->sense) { |
222 | /* | ||
223 | * Sense is always read into drive->sense_data. | ||
224 | * Copy back if the failed request has its | ||
225 | * sense pointer set. | ||
226 | */ | ||
227 | memcpy(failed->sense, sense, 18); | ||
257 | sense = failed->sense; | 228 | sense = failed->sense; |
258 | failed->sense_len = rq->sense_len; | 229 | failed->sense_len = rq->sense_len; |
259 | } | 230 | } |
@@ -428,7 +399,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
428 | 399 | ||
429 | /* if we got a CHECK_CONDITION status, queue a request sense command */ | 400 | /* if we got a CHECK_CONDITION status, queue a request sense command */ |
430 | if (stat & ATA_ERR) | 401 | if (stat & ATA_ERR) |
431 | cdrom_queue_request_sense(drive, NULL, NULL); | 402 | return ide_queue_sense_rq(drive, NULL) ? 2 : 1; |
432 | return 1; | 403 | return 1; |
433 | 404 | ||
434 | end_request: | 405 | end_request: |
@@ -442,8 +413,7 @@ end_request: | |||
442 | 413 | ||
443 | hwif->rq = NULL; | 414 | hwif->rq = NULL; |
444 | 415 | ||
445 | cdrom_queue_request_sense(drive, rq->sense, rq); | 416 | return ide_queue_sense_rq(drive, rq) ? 2 : 1; |
446 | return 1; | ||
447 | } else | 417 | } else |
448 | return 2; | 418 | return 2; |
449 | } | 419 | } |
@@ -503,14 +473,8 @@ static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct ide_cmd *cmd) | |||
503 | * and some drives don't send them. Sigh. | 473 | * and some drives don't send them. Sigh. |
504 | */ | 474 | */ |
505 | if (rq->cmd[0] == GPCMD_REQUEST_SENSE && | 475 | if (rq->cmd[0] == GPCMD_REQUEST_SENSE && |
506 | cmd->nleft > 0 && cmd->nleft <= 5) { | 476 | cmd->nleft > 0 && cmd->nleft <= 5) |
507 | unsigned int ofs = cmd->nbytes - cmd->nleft; | 477 | cmd->nleft = 0; |
508 | |||
509 | while (cmd->nleft > 0) { | ||
510 | *((u8 *)rq->data + ofs++) = 0; | ||
511 | cmd->nleft--; | ||
512 | } | ||
513 | } | ||
514 | } | 478 | } |
515 | 479 | ||
516 | int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | 480 | int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, |
@@ -543,8 +507,12 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
543 | rq->cmd_flags |= cmd_flags; | 507 | rq->cmd_flags |= cmd_flags; |
544 | rq->timeout = timeout; | 508 | rq->timeout = timeout; |
545 | if (buffer) { | 509 | if (buffer) { |
546 | rq->data = buffer; | 510 | error = blk_rq_map_kern(drive->queue, rq, buffer, |
547 | rq->data_len = *bufflen; | 511 | *bufflen, GFP_NOIO); |
512 | if (error) { | ||
513 | blk_put_request(rq); | ||
514 | return error; | ||
515 | } | ||
548 | } | 516 | } |
549 | 517 | ||
550 | error = blk_execute_rq(drive->queue, info->disk, rq, 0); | 518 | error = blk_execute_rq(drive->queue, info->disk, rq, 0); |
@@ -838,15 +806,10 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
838 | drive->dma = 0; | 806 | drive->dma = 0; |
839 | 807 | ||
840 | /* sg request */ | 808 | /* sg request */ |
841 | if (rq->bio || ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) { | 809 | if (rq->bio) { |
842 | struct request_queue *q = drive->queue; | 810 | struct request_queue *q = drive->queue; |
811 | char *buf = bio_data(rq->bio); | ||
843 | unsigned int alignment; | 812 | unsigned int alignment; |
844 | char *buf; | ||
845 | |||
846 | if (rq->bio) | ||
847 | buf = bio_data(rq->bio); | ||
848 | else | ||
849 | buf = rq->data; | ||
850 | 813 | ||
851 | drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA); | 814 | drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA); |
852 | 815 | ||
@@ -896,6 +859,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
896 | goto out_end; | 859 | goto out_end; |
897 | } | 860 | } |
898 | 861 | ||
862 | /* prepare sense request for this command */ | ||
863 | ide_prep_sense(drive, rq); | ||
864 | |||
899 | memset(&cmd, 0, sizeof(cmd)); | 865 | memset(&cmd, 0, sizeof(cmd)); |
900 | 866 | ||
901 | if (rq_data_dir(rq)) | 867 | if (rq_data_dir(rq)) |
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h index 1d97101099ce..93a3cf1b0f3f 100644 --- a/drivers/ide/ide-cd.h +++ b/drivers/ide/ide-cd.h | |||
@@ -87,10 +87,6 @@ struct cdrom_info { | |||
87 | 87 | ||
88 | struct atapi_toc *toc; | 88 | struct atapi_toc *toc; |
89 | 89 | ||
90 | /* The result of the last successful request sense command | ||
91 | on this device. */ | ||
92 | struct request_sense sense_data; | ||
93 | |||
94 | u8 max_speed; /* Max speed of the drive. */ | 90 | u8 max_speed; /* Max speed of the drive. */ |
95 | u8 current_speed; /* Current speed of the drive. */ | 91 | u8 current_speed; /* Current speed of the drive. */ |
96 | 92 | ||
diff --git a/drivers/ide/ide-cs.c b/drivers/ide/ide-cs.c index 9e47f3529d55..527908ff298c 100644 --- a/drivers/ide/ide-cs.c +++ b/drivers/ide/ide-cs.c | |||
@@ -155,6 +155,7 @@ static const struct ide_port_info idecs_port_info = { | |||
155 | .port_ops = &idecs_port_ops, | 155 | .port_ops = &idecs_port_ops, |
156 | .host_flags = IDE_HFLAG_NO_DMA, | 156 | .host_flags = IDE_HFLAG_NO_DMA, |
157 | .irq_flags = IRQF_SHARED, | 157 | .irq_flags = IRQF_SHARED, |
158 | .chipset = ide_pci, | ||
158 | }; | 159 | }; |
159 | 160 | ||
160 | static struct ide_host *idecs_register(unsigned long io, unsigned long ctl, | 161 | static struct ide_host *idecs_register(unsigned long io, unsigned long ctl, |
@@ -163,7 +164,7 @@ static struct ide_host *idecs_register(unsigned long io, unsigned long ctl, | |||
163 | struct ide_host *host; | 164 | struct ide_host *host; |
164 | ide_hwif_t *hwif; | 165 | ide_hwif_t *hwif; |
165 | int i, rc; | 166 | int i, rc; |
166 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 167 | struct ide_hw hw, *hws[] = { &hw }; |
167 | 168 | ||
168 | if (!request_region(io, 8, DRV_NAME)) { | 169 | if (!request_region(io, 8, DRV_NAME)) { |
169 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", | 170 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", |
@@ -181,10 +182,9 @@ static struct ide_host *idecs_register(unsigned long io, unsigned long ctl, | |||
181 | memset(&hw, 0, sizeof(hw)); | 182 | memset(&hw, 0, sizeof(hw)); |
182 | ide_std_init_ports(&hw, io, ctl); | 183 | ide_std_init_ports(&hw, io, ctl); |
183 | hw.irq = irq; | 184 | hw.irq = irq; |
184 | hw.chipset = ide_pci; | ||
185 | hw.dev = &handle->dev; | 185 | hw.dev = &handle->dev; |
186 | 186 | ||
187 | rc = ide_host_add(&idecs_port_info, hws, &host); | 187 | rc = ide_host_add(&idecs_port_info, hws, 1, &host); |
188 | if (rc) | 188 | if (rc) |
189 | goto out_release; | 189 | goto out_release; |
190 | 190 | ||
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 3d92c9d54d47..b5f25387cc01 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -461,7 +461,6 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) | |||
461 | cmd->protocol = ATA_PROT_NODATA; | 461 | cmd->protocol = ATA_PROT_NODATA; |
462 | 462 | ||
463 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 463 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
464 | rq->cmd_flags |= REQ_SOFTBARRIER; | ||
465 | rq->special = cmd; | 464 | rq->special = cmd; |
466 | } | 465 | } |
467 | 466 | ||
@@ -479,14 +478,14 @@ static int set_multcount(ide_drive_t *drive, int arg) | |||
479 | if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff)) | 478 | if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff)) |
480 | return -EINVAL; | 479 | return -EINVAL; |
481 | 480 | ||
482 | if (drive->special.b.set_multmode) | 481 | if (drive->special_flags & IDE_SFLAG_SET_MULTMODE) |
483 | return -EBUSY; | 482 | return -EBUSY; |
484 | 483 | ||
485 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 484 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
486 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 485 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
487 | 486 | ||
488 | drive->mult_req = arg; | 487 | drive->mult_req = arg; |
489 | drive->special.b.set_multmode = 1; | 488 | drive->special_flags |= IDE_SFLAG_SET_MULTMODE; |
490 | error = blk_execute_rq(drive->queue, NULL, rq, 0); | 489 | error = blk_execute_rq(drive->queue, NULL, rq, 0); |
491 | blk_put_request(rq); | 490 | blk_put_request(rq); |
492 | 491 | ||
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index a0b8cab1d9a6..d9123ecae4a9 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -510,23 +510,11 @@ ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error) | |||
510 | /* | 510 | /* |
511 | * un-busy drive etc and make sure request is sane | 511 | * un-busy drive etc and make sure request is sane |
512 | */ | 512 | */ |
513 | |||
514 | rq = hwif->rq; | 513 | rq = hwif->rq; |
515 | if (!rq) | 514 | if (rq) { |
516 | goto out; | 515 | hwif->rq = NULL; |
517 | 516 | rq->errors = 0; | |
518 | hwif->rq = NULL; | 517 | } |
519 | |||
520 | rq->errors = 0; | ||
521 | |||
522 | if (!rq->bio) | ||
523 | goto out; | ||
524 | |||
525 | rq->sector = rq->bio->bi_sector; | ||
526 | rq->current_nr_sectors = bio_iovec(rq->bio)->bv_len >> 9; | ||
527 | rq->hard_cur_sectors = rq->current_nr_sectors; | ||
528 | rq->buffer = bio_data(rq->bio); | ||
529 | out: | ||
530 | return ret; | 518 | return ret; |
531 | } | 519 | } |
532 | 520 | ||
diff --git a/drivers/ide/ide-eh.c b/drivers/ide/ide-eh.c index 5d5fb961b5ce..39d589254d41 100644 --- a/drivers/ide/ide-eh.c +++ b/drivers/ide/ide-eh.c | |||
@@ -52,7 +52,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, | |||
52 | } | 52 | } |
53 | 53 | ||
54 | if ((rq->errors & ERROR_RECAL) == ERROR_RECAL) | 54 | if ((rq->errors & ERROR_RECAL) == ERROR_RECAL) |
55 | drive->special.b.recalibrate = 1; | 55 | drive->special_flags |= IDE_SFLAG_RECALIBRATE; |
56 | 56 | ||
57 | ++rq->errors; | 57 | ++rq->errors; |
58 | 58 | ||
@@ -268,9 +268,8 @@ static void ide_disk_pre_reset(ide_drive_t *drive) | |||
268 | { | 268 | { |
269 | int legacy = (drive->id[ATA_ID_CFS_ENABLE_2] & 0x0400) ? 0 : 1; | 269 | int legacy = (drive->id[ATA_ID_CFS_ENABLE_2] & 0x0400) ? 0 : 1; |
270 | 270 | ||
271 | drive->special.all = 0; | 271 | drive->special_flags = |
272 | drive->special.b.set_geometry = legacy; | 272 | legacy ? (IDE_SFLAG_SET_GEOMETRY | IDE_SFLAG_RECALIBRATE) : 0; |
273 | drive->special.b.recalibrate = legacy; | ||
274 | 273 | ||
275 | drive->mult_count = 0; | 274 | drive->mult_count = 0; |
276 | drive->dev_flags &= ~IDE_DFLAG_PARKED; | 275 | drive->dev_flags &= ~IDE_DFLAG_PARKED; |
@@ -280,7 +279,7 @@ static void ide_disk_pre_reset(ide_drive_t *drive) | |||
280 | drive->mult_req = 0; | 279 | drive->mult_req = 0; |
281 | 280 | ||
282 | if (drive->mult_req != drive->mult_count) | 281 | if (drive->mult_req != drive->mult_count) |
283 | drive->special.b.set_multmode = 1; | 282 | drive->special_flags |= IDE_SFLAG_SET_MULTMODE; |
284 | } | 283 | } |
285 | 284 | ||
286 | static void pre_reset(ide_drive_t *drive) | 285 | static void pre_reset(ide_drive_t *drive) |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2b4868d95f8b..537b7c558033 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -134,13 +134,17 @@ static ide_startstop_t ide_floppy_issue_pc(ide_drive_t *drive, | |||
134 | drive->pc = pc; | 134 | drive->pc = pc; |
135 | 135 | ||
136 | if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) { | 136 | if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) { |
137 | unsigned int done = blk_rq_bytes(drive->hwif->rq); | ||
138 | |||
137 | if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) | 139 | if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) |
138 | ide_floppy_report_error(floppy, pc); | 140 | ide_floppy_report_error(floppy, pc); |
141 | |||
139 | /* Giving up */ | 142 | /* Giving up */ |
140 | pc->error = IDE_DRV_ERROR_GENERAL; | 143 | pc->error = IDE_DRV_ERROR_GENERAL; |
141 | 144 | ||
142 | drive->failed_pc = NULL; | 145 | drive->failed_pc = NULL; |
143 | drive->pc_callback(drive, 0); | 146 | drive->pc_callback(drive, 0); |
147 | ide_complete_rq(drive, -EIO, done); | ||
144 | return ide_stopped; | 148 | return ide_stopped; |
145 | } | 149 | } |
146 | 150 | ||
@@ -216,15 +220,13 @@ static void idefloppy_blockpc_cmd(struct ide_disk_obj *floppy, | |||
216 | ide_init_pc(pc); | 220 | ide_init_pc(pc); |
217 | memcpy(pc->c, rq->cmd, sizeof(pc->c)); | 221 | memcpy(pc->c, rq->cmd, sizeof(pc->c)); |
218 | pc->rq = rq; | 222 | pc->rq = rq; |
219 | if (rq->data_len && rq_data_dir(rq) == WRITE) | 223 | if (rq->data_len) { |
220 | pc->flags |= PC_FLAG_WRITING; | ||
221 | pc->buf = rq->data; | ||
222 | if (rq->bio) | ||
223 | pc->flags |= PC_FLAG_DMA_OK; | 224 | pc->flags |= PC_FLAG_DMA_OK; |
224 | /* | 225 | if (rq_data_dir(rq) == WRITE) |
225 | * possibly problematic, doesn't look like ide-floppy correctly | 226 | pc->flags |= PC_FLAG_WRITING; |
226 | * handled scattered requests if dma fails... | 227 | } |
227 | */ | 228 | /* pio will be performed by ide_pio_bytes() which handles sg fine */ |
229 | pc->buf = NULL; | ||
228 | pc->req_xfer = pc->buf_size = rq->data_len; | 230 | pc->req_xfer = pc->buf_size = rq->data_len; |
229 | } | 231 | } |
230 | 232 | ||
@@ -265,8 +267,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, | |||
265 | } | 267 | } |
266 | pc = &floppy->queued_pc; | 268 | pc = &floppy->queued_pc; |
267 | idefloppy_create_rw_cmd(drive, pc, rq, (unsigned long)block); | 269 | idefloppy_create_rw_cmd(drive, pc, rq, (unsigned long)block); |
268 | } else if (blk_special_request(rq)) { | 270 | } else if (blk_special_request(rq) || blk_sense_request(rq)) { |
269 | pc = (struct ide_atapi_pc *) rq->buffer; | 271 | pc = (struct ide_atapi_pc *)rq->special; |
270 | } else if (blk_pc_request(rq)) { | 272 | } else if (blk_pc_request(rq)) { |
271 | pc = &floppy->queued_pc; | 273 | pc = &floppy->queued_pc; |
272 | idefloppy_blockpc_cmd(floppy, pc, rq); | 274 | idefloppy_blockpc_cmd(floppy, pc, rq); |
@@ -275,6 +277,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, | |||
275 | goto out_end; | 277 | goto out_end; |
276 | } | 278 | } |
277 | 279 | ||
280 | ide_prep_sense(drive, rq); | ||
281 | |||
278 | memset(&cmd, 0, sizeof(cmd)); | 282 | memset(&cmd, 0, sizeof(cmd)); |
279 | 283 | ||
280 | if (rq_data_dir(rq)) | 284 | if (rq_data_dir(rq)) |
diff --git a/drivers/ide/ide-generic.c b/drivers/ide/ide-generic.c index 7812ca0be13b..54d7c4685d23 100644 --- a/drivers/ide/ide-generic.c +++ b/drivers/ide/ide-generic.c | |||
@@ -29,6 +29,7 @@ MODULE_PARM_DESC(probe_mask, "probe mask for legacy ISA IDE ports"); | |||
29 | 29 | ||
30 | static const struct ide_port_info ide_generic_port_info = { | 30 | static const struct ide_port_info ide_generic_port_info = { |
31 | .host_flags = IDE_HFLAG_NO_DMA, | 31 | .host_flags = IDE_HFLAG_NO_DMA, |
32 | .chipset = ide_generic, | ||
32 | }; | 33 | }; |
33 | 34 | ||
34 | #ifdef CONFIG_ARM | 35 | #ifdef CONFIG_ARM |
@@ -85,7 +86,7 @@ static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary) | |||
85 | 86 | ||
86 | static int __init ide_generic_init(void) | 87 | static int __init ide_generic_init(void) |
87 | { | 88 | { |
88 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 89 | struct ide_hw hw, *hws[] = { &hw }; |
89 | unsigned long io_addr; | 90 | unsigned long io_addr; |
90 | int i, rc = 0, primary = 0, secondary = 0; | 91 | int i, rc = 0, primary = 0, secondary = 0; |
91 | 92 | ||
@@ -132,9 +133,7 @@ static int __init ide_generic_init(void) | |||
132 | #else | 133 | #else |
133 | hw.irq = legacy_irqs[i]; | 134 | hw.irq = legacy_irqs[i]; |
134 | #endif | 135 | #endif |
135 | hw.chipset = ide_generic; | 136 | rc = ide_host_add(&ide_generic_port_info, hws, 1, NULL); |
136 | |||
137 | rc = ide_host_add(&ide_generic_port_info, hws, NULL); | ||
138 | if (rc) { | 137 | if (rc) { |
139 | release_region(io_addr + 0x206, 1); | 138 | release_region(io_addr + 0x206, 1); |
140 | release_region(io_addr, 8); | 139 | release_region(io_addr, 8); |
diff --git a/drivers/ide/ide-h8300.c b/drivers/ide/ide-h8300.c index c06ebdc4a130..520f42c5445a 100644 --- a/drivers/ide/ide-h8300.c +++ b/drivers/ide/ide-h8300.c | |||
@@ -64,26 +64,26 @@ static const struct ide_tp_ops h8300_tp_ops = { | |||
64 | 64 | ||
65 | #define H8300_IDE_GAP (2) | 65 | #define H8300_IDE_GAP (2) |
66 | 66 | ||
67 | static inline void hw_setup(hw_regs_t *hw) | 67 | static inline void hw_setup(struct ide_hw *hw) |
68 | { | 68 | { |
69 | int i; | 69 | int i; |
70 | 70 | ||
71 | memset(hw, 0, sizeof(hw_regs_t)); | 71 | memset(hw, 0, sizeof(*hw)); |
72 | for (i = 0; i <= 7; i++) | 72 | for (i = 0; i <= 7; i++) |
73 | hw->io_ports_array[i] = CONFIG_H8300_IDE_BASE + H8300_IDE_GAP*i; | 73 | hw->io_ports_array[i] = CONFIG_H8300_IDE_BASE + H8300_IDE_GAP*i; |
74 | hw->io_ports.ctl_addr = CONFIG_H8300_IDE_ALT; | 74 | hw->io_ports.ctl_addr = CONFIG_H8300_IDE_ALT; |
75 | hw->irq = EXT_IRQ0 + CONFIG_H8300_IDE_IRQ; | 75 | hw->irq = EXT_IRQ0 + CONFIG_H8300_IDE_IRQ; |
76 | hw->chipset = ide_generic; | ||
77 | } | 76 | } |
78 | 77 | ||
79 | static const struct ide_port_info h8300_port_info = { | 78 | static const struct ide_port_info h8300_port_info = { |
80 | .tp_ops = &h8300_tp_ops, | 79 | .tp_ops = &h8300_tp_ops, |
81 | .host_flags = IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_NO_DMA, | 80 | .host_flags = IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_NO_DMA, |
81 | .chipset = ide_generic, | ||
82 | }; | 82 | }; |
83 | 83 | ||
84 | static int __init h8300_ide_init(void) | 84 | static int __init h8300_ide_init(void) |
85 | { | 85 | { |
86 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 86 | struct ide_hw hw, *hws[] = { &hw }; |
87 | 87 | ||
88 | printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n"); | 88 | printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n"); |
89 | 89 | ||
@@ -96,7 +96,7 @@ static int __init h8300_ide_init(void) | |||
96 | 96 | ||
97 | hw_setup(&hw); | 97 | hw_setup(&hw); |
98 | 98 | ||
99 | return ide_host_add(&h8300_port_info, hws, NULL); | 99 | return ide_host_add(&h8300_port_info, hws, 1, NULL); |
100 | 100 | ||
101 | out_busy: | 101 | out_busy: |
102 | printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n"); | 102 | printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n"); |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 6415a2e2ba87..9654bd34cf52 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -184,29 +184,42 @@ static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf) | |||
184 | tf->command = ATA_CMD_SET_MULTI; | 184 | tf->command = ATA_CMD_SET_MULTI; |
185 | } | 185 | } |
186 | 186 | ||
187 | static ide_startstop_t ide_disk_special(ide_drive_t *drive) | 187 | /** |
188 | * do_special - issue some special commands | ||
189 | * @drive: drive the command is for | ||
190 | * | ||
191 | * do_special() is used to issue ATA_CMD_INIT_DEV_PARAMS, | ||
192 | * ATA_CMD_RESTORE and ATA_CMD_SET_MULTI commands to a drive. | ||
193 | */ | ||
194 | |||
195 | static ide_startstop_t do_special(ide_drive_t *drive) | ||
188 | { | 196 | { |
189 | special_t *s = &drive->special; | ||
190 | struct ide_cmd cmd; | 197 | struct ide_cmd cmd; |
191 | 198 | ||
199 | #ifdef DEBUG | ||
200 | printk(KERN_DEBUG "%s: %s: 0x%02x\n", drive->name, __func__, | ||
201 | drive->special_flags); | ||
202 | #endif | ||
203 | if (drive->media != ide_disk) { | ||
204 | drive->special_flags = 0; | ||
205 | drive->mult_req = 0; | ||
206 | return ide_stopped; | ||
207 | } | ||
208 | |||
192 | memset(&cmd, 0, sizeof(cmd)); | 209 | memset(&cmd, 0, sizeof(cmd)); |
193 | cmd.protocol = ATA_PROT_NODATA; | 210 | cmd.protocol = ATA_PROT_NODATA; |
194 | 211 | ||
195 | if (s->b.set_geometry) { | 212 | if (drive->special_flags & IDE_SFLAG_SET_GEOMETRY) { |
196 | s->b.set_geometry = 0; | 213 | drive->special_flags &= ~IDE_SFLAG_SET_GEOMETRY; |
197 | ide_tf_set_specify_cmd(drive, &cmd.tf); | 214 | ide_tf_set_specify_cmd(drive, &cmd.tf); |
198 | } else if (s->b.recalibrate) { | 215 | } else if (drive->special_flags & IDE_SFLAG_RECALIBRATE) { |
199 | s->b.recalibrate = 0; | 216 | drive->special_flags &= ~IDE_SFLAG_RECALIBRATE; |
200 | ide_tf_set_restore_cmd(drive, &cmd.tf); | 217 | ide_tf_set_restore_cmd(drive, &cmd.tf); |
201 | } else if (s->b.set_multmode) { | 218 | } else if (drive->special_flags & IDE_SFLAG_SET_MULTMODE) { |
202 | s->b.set_multmode = 0; | 219 | drive->special_flags &= ~IDE_SFLAG_SET_MULTMODE; |
203 | ide_tf_set_setmult_cmd(drive, &cmd.tf); | 220 | ide_tf_set_setmult_cmd(drive, &cmd.tf); |
204 | } else if (s->all) { | 221 | } else |
205 | int special = s->all; | 222 | BUG(); |
206 | s->all = 0; | ||
207 | printk(KERN_ERR "%s: bad special flag: 0x%02x\n", drive->name, special); | ||
208 | return ide_stopped; | ||
209 | } | ||
210 | 223 | ||
211 | cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; | 224 | cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; |
212 | cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; | 225 | cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; |
@@ -217,45 +230,13 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive) | |||
217 | return ide_started; | 230 | return ide_started; |
218 | } | 231 | } |
219 | 232 | ||
220 | /** | ||
221 | * do_special - issue some special commands | ||
222 | * @drive: drive the command is for | ||
223 | * | ||
224 | * do_special() is used to issue ATA_CMD_INIT_DEV_PARAMS, | ||
225 | * ATA_CMD_RESTORE and ATA_CMD_SET_MULTI commands to a drive. | ||
226 | * | ||
227 | * It used to do much more, but has been scaled back. | ||
228 | */ | ||
229 | |||
230 | static ide_startstop_t do_special (ide_drive_t *drive) | ||
231 | { | ||
232 | special_t *s = &drive->special; | ||
233 | |||
234 | #ifdef DEBUG | ||
235 | printk("%s: do_special: 0x%02x\n", drive->name, s->all); | ||
236 | #endif | ||
237 | if (drive->media == ide_disk) | ||
238 | return ide_disk_special(drive); | ||
239 | |||
240 | s->all = 0; | ||
241 | drive->mult_req = 0; | ||
242 | return ide_stopped; | ||
243 | } | ||
244 | |||
245 | void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd) | 233 | void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd) |
246 | { | 234 | { |
247 | ide_hwif_t *hwif = drive->hwif; | 235 | ide_hwif_t *hwif = drive->hwif; |
248 | struct scatterlist *sg = hwif->sg_table; | 236 | struct scatterlist *sg = hwif->sg_table; |
249 | struct request *rq = cmd->rq; | 237 | struct request *rq = cmd->rq; |
250 | 238 | ||
251 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { | 239 | cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg); |
252 | sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE); | ||
253 | cmd->sg_nents = 1; | ||
254 | } else if (!rq->bio) { | ||
255 | sg_init_one(sg, rq->data, rq->data_len); | ||
256 | cmd->sg_nents = 1; | ||
257 | } else | ||
258 | cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg); | ||
259 | } | 240 | } |
260 | EXPORT_SYMBOL_GPL(ide_map_sg); | 241 | EXPORT_SYMBOL_GPL(ide_map_sg); |
261 | 242 | ||
@@ -358,7 +339,8 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) | |||
358 | printk(KERN_ERR "%s: drive not ready for command\n", drive->name); | 339 | printk(KERN_ERR "%s: drive not ready for command\n", drive->name); |
359 | return startstop; | 340 | return startstop; |
360 | } | 341 | } |
361 | if (!drive->special.all) { | 342 | |
343 | if (drive->special_flags == 0) { | ||
362 | struct ide_driver *drv; | 344 | struct ide_driver *drv; |
363 | 345 | ||
364 | /* | 346 | /* |
@@ -371,7 +353,7 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) | |||
371 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) | 353 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) |
372 | return execute_drive_cmd(drive, rq); | 354 | return execute_drive_cmd(drive, rq); |
373 | else if (blk_pm_request(rq)) { | 355 | else if (blk_pm_request(rq)) { |
374 | struct request_pm_state *pm = rq->data; | 356 | struct request_pm_state *pm = rq->special; |
375 | #ifdef DEBUG_PM | 357 | #ifdef DEBUG_PM |
376 | printk("%s: start_power_step(step: %d)\n", | 358 | printk("%s: start_power_step(step: %d)\n", |
377 | drive->name, pm->pm_step); | 359 | drive->name, pm->pm_step); |
@@ -484,6 +466,9 @@ void do_ide_request(struct request_queue *q) | |||
484 | 466 | ||
485 | spin_unlock_irq(q->queue_lock); | 467 | spin_unlock_irq(q->queue_lock); |
486 | 468 | ||
469 | /* HLD do_request() callback might sleep, make sure it's okay */ | ||
470 | might_sleep(); | ||
471 | |||
487 | if (ide_lock_host(host, hwif)) | 472 | if (ide_lock_host(host, hwif)) |
488 | goto plug_device_2; | 473 | goto plug_device_2; |
489 | 474 | ||
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index c1c25ebbaa1f..5991b23793f2 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c | |||
@@ -231,7 +231,6 @@ static int generic_drive_reset(ide_drive_t *drive) | |||
231 | rq->cmd_type = REQ_TYPE_SPECIAL; | 231 | rq->cmd_type = REQ_TYPE_SPECIAL; |
232 | rq->cmd_len = 1; | 232 | rq->cmd_len = 1; |
233 | rq->cmd[0] = REQ_DRIVE_RESET; | 233 | rq->cmd[0] = REQ_DRIVE_RESET; |
234 | rq->cmd_flags |= REQ_SOFTBARRIER; | ||
235 | if (blk_execute_rq(drive->queue, NULL, rq, 1)) | 234 | if (blk_execute_rq(drive->queue, NULL, rq, 1)) |
236 | ret = rq->errors; | 235 | ret = rq->errors; |
237 | blk_put_request(rq); | 236 | blk_put_request(rq); |
diff --git a/drivers/ide/ide-legacy.c b/drivers/ide/ide-legacy.c index 8c5dcbf22547..b9654a7bb7be 100644 --- a/drivers/ide/ide-legacy.c +++ b/drivers/ide/ide-legacy.c | |||
@@ -1,7 +1,7 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/ide.h> | 2 | #include <linux/ide.h> |
3 | 3 | ||
4 | static void ide_legacy_init_one(hw_regs_t **hws, hw_regs_t *hw, | 4 | static void ide_legacy_init_one(struct ide_hw **hws, struct ide_hw *hw, |
5 | u8 port_no, const struct ide_port_info *d, | 5 | u8 port_no, const struct ide_port_info *d, |
6 | unsigned long config) | 6 | unsigned long config) |
7 | { | 7 | { |
@@ -33,7 +33,6 @@ static void ide_legacy_init_one(hw_regs_t **hws, hw_regs_t *hw, | |||
33 | 33 | ||
34 | ide_std_init_ports(hw, base, ctl); | 34 | ide_std_init_ports(hw, base, ctl); |
35 | hw->irq = irq; | 35 | hw->irq = irq; |
36 | hw->chipset = d->chipset; | ||
37 | hw->config = config; | 36 | hw->config = config; |
38 | 37 | ||
39 | hws[port_no] = hw; | 38 | hws[port_no] = hw; |
@@ -41,7 +40,7 @@ static void ide_legacy_init_one(hw_regs_t **hws, hw_regs_t *hw, | |||
41 | 40 | ||
42 | int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config) | 41 | int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config) |
43 | { | 42 | { |
44 | hw_regs_t hw[2], *hws[] = { NULL, NULL, NULL, NULL }; | 43 | struct ide_hw hw[2], *hws[] = { NULL, NULL }; |
45 | 44 | ||
46 | memset(&hw, 0, sizeof(hw)); | 45 | memset(&hw, 0, sizeof(hw)); |
47 | 46 | ||
@@ -53,6 +52,6 @@ int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config) | |||
53 | (d->host_flags & IDE_HFLAG_SINGLE)) | 52 | (d->host_flags & IDE_HFLAG_SINGLE)) |
54 | return -ENOENT; | 53 | return -ENOENT; |
55 | 54 | ||
56 | return ide_host_add(d, hws, NULL); | 55 | return ide_host_add(d, hws, 2, NULL); |
57 | } | 56 | } |
58 | EXPORT_SYMBOL_GPL(ide_legacy_device_add); | 57 | EXPORT_SYMBOL_GPL(ide_legacy_device_add); |
diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index 310d03f2b5b7..a914023d6d03 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c | |||
@@ -24,11 +24,8 @@ static void issue_park_cmd(ide_drive_t *drive, unsigned long timeout) | |||
24 | start_queue = 1; | 24 | start_queue = 1; |
25 | spin_unlock_irq(&hwif->lock); | 25 | spin_unlock_irq(&hwif->lock); |
26 | 26 | ||
27 | if (start_queue) { | 27 | if (start_queue) |
28 | spin_lock_irq(q->queue_lock); | 28 | blk_run_queue(q); |
29 | blk_start_queueing(q); | ||
30 | spin_unlock_irq(q->queue_lock); | ||
31 | } | ||
32 | return; | 29 | return; |
33 | } | 30 | } |
34 | spin_unlock_irq(&hwif->lock); | 31 | spin_unlock_irq(&hwif->lock); |
diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c index 0d8a151c0a01..ba1488bd8430 100644 --- a/drivers/ide/ide-pm.c +++ b/drivers/ide/ide-pm.c | |||
@@ -7,7 +7,6 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) | |||
7 | ide_hwif_t *hwif = drive->hwif; | 7 | ide_hwif_t *hwif = drive->hwif; |
8 | struct request *rq; | 8 | struct request *rq; |
9 | struct request_pm_state rqpm; | 9 | struct request_pm_state rqpm; |
10 | struct ide_cmd cmd; | ||
11 | int ret; | 10 | int ret; |
12 | 11 | ||
13 | /* call ACPI _GTM only once */ | 12 | /* call ACPI _GTM only once */ |
@@ -15,11 +14,9 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) | |||
15 | ide_acpi_get_timing(hwif); | 14 | ide_acpi_get_timing(hwif); |
16 | 15 | ||
17 | memset(&rqpm, 0, sizeof(rqpm)); | 16 | memset(&rqpm, 0, sizeof(rqpm)); |
18 | memset(&cmd, 0, sizeof(cmd)); | ||
19 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 17 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
20 | rq->cmd_type = REQ_TYPE_PM_SUSPEND; | 18 | rq->cmd_type = REQ_TYPE_PM_SUSPEND; |
21 | rq->special = &cmd; | 19 | rq->special = &rqpm; |
22 | rq->data = &rqpm; | ||
23 | rqpm.pm_step = IDE_PM_START_SUSPEND; | 20 | rqpm.pm_step = IDE_PM_START_SUSPEND; |
24 | if (mesg.event == PM_EVENT_PRETHAW) | 21 | if (mesg.event == PM_EVENT_PRETHAW) |
25 | mesg.event = PM_EVENT_FREEZE; | 22 | mesg.event = PM_EVENT_FREEZE; |
@@ -41,7 +38,6 @@ int generic_ide_resume(struct device *dev) | |||
41 | ide_hwif_t *hwif = drive->hwif; | 38 | ide_hwif_t *hwif = drive->hwif; |
42 | struct request *rq; | 39 | struct request *rq; |
43 | struct request_pm_state rqpm; | 40 | struct request_pm_state rqpm; |
44 | struct ide_cmd cmd; | ||
45 | int err; | 41 | int err; |
46 | 42 | ||
47 | /* call ACPI _PS0 / _STM only once */ | 43 | /* call ACPI _PS0 / _STM only once */ |
@@ -53,12 +49,10 @@ int generic_ide_resume(struct device *dev) | |||
53 | ide_acpi_exec_tfs(drive); | 49 | ide_acpi_exec_tfs(drive); |
54 | 50 | ||
55 | memset(&rqpm, 0, sizeof(rqpm)); | 51 | memset(&rqpm, 0, sizeof(rqpm)); |
56 | memset(&cmd, 0, sizeof(cmd)); | ||
57 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 52 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
58 | rq->cmd_type = REQ_TYPE_PM_RESUME; | 53 | rq->cmd_type = REQ_TYPE_PM_RESUME; |
59 | rq->cmd_flags |= REQ_PREEMPT; | 54 | rq->cmd_flags |= REQ_PREEMPT; |
60 | rq->special = &cmd; | 55 | rq->special = &rqpm; |
61 | rq->data = &rqpm; | ||
62 | rqpm.pm_step = IDE_PM_START_RESUME; | 56 | rqpm.pm_step = IDE_PM_START_RESUME; |
63 | rqpm.pm_state = PM_EVENT_ON; | 57 | rqpm.pm_state = PM_EVENT_ON; |
64 | 58 | ||
@@ -77,7 +71,7 @@ int generic_ide_resume(struct device *dev) | |||
77 | 71 | ||
78 | void ide_complete_power_step(ide_drive_t *drive, struct request *rq) | 72 | void ide_complete_power_step(ide_drive_t *drive, struct request *rq) |
79 | { | 73 | { |
80 | struct request_pm_state *pm = rq->data; | 74 | struct request_pm_state *pm = rq->special; |
81 | 75 | ||
82 | #ifdef DEBUG_PM | 76 | #ifdef DEBUG_PM |
83 | printk(KERN_INFO "%s: complete_power_step(step: %d)\n", | 77 | printk(KERN_INFO "%s: complete_power_step(step: %d)\n", |
@@ -107,10 +101,8 @@ void ide_complete_power_step(ide_drive_t *drive, struct request *rq) | |||
107 | 101 | ||
108 | ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) | 102 | ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) |
109 | { | 103 | { |
110 | struct request_pm_state *pm = rq->data; | 104 | struct request_pm_state *pm = rq->special; |
111 | struct ide_cmd *cmd = rq->special; | 105 | struct ide_cmd cmd = { }; |
112 | |||
113 | memset(cmd, 0, sizeof(*cmd)); | ||
114 | 106 | ||
115 | switch (pm->pm_step) { | 107 | switch (pm->pm_step) { |
116 | case IDE_PM_FLUSH_CACHE: /* Suspend step 1 (flush cache) */ | 108 | case IDE_PM_FLUSH_CACHE: /* Suspend step 1 (flush cache) */ |
@@ -123,12 +115,12 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) | |||
123 | return ide_stopped; | 115 | return ide_stopped; |
124 | } | 116 | } |
125 | if (ata_id_flush_ext_enabled(drive->id)) | 117 | if (ata_id_flush_ext_enabled(drive->id)) |
126 | cmd->tf.command = ATA_CMD_FLUSH_EXT; | 118 | cmd.tf.command = ATA_CMD_FLUSH_EXT; |
127 | else | 119 | else |
128 | cmd->tf.command = ATA_CMD_FLUSH; | 120 | cmd.tf.command = ATA_CMD_FLUSH; |
129 | goto out_do_tf; | 121 | goto out_do_tf; |
130 | case IDE_PM_STANDBY: /* Suspend step 2 (standby) */ | 122 | case IDE_PM_STANDBY: /* Suspend step 2 (standby) */ |
131 | cmd->tf.command = ATA_CMD_STANDBYNOW1; | 123 | cmd.tf.command = ATA_CMD_STANDBYNOW1; |
132 | goto out_do_tf; | 124 | goto out_do_tf; |
133 | case IDE_PM_RESTORE_PIO: /* Resume step 1 (restore PIO) */ | 125 | case IDE_PM_RESTORE_PIO: /* Resume step 1 (restore PIO) */ |
134 | ide_set_max_pio(drive); | 126 | ide_set_max_pio(drive); |
@@ -141,7 +133,7 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) | |||
141 | ide_complete_power_step(drive, rq); | 133 | ide_complete_power_step(drive, rq); |
142 | return ide_stopped; | 134 | return ide_stopped; |
143 | case IDE_PM_IDLE: /* Resume step 2 (idle) */ | 135 | case IDE_PM_IDLE: /* Resume step 2 (idle) */ |
144 | cmd->tf.command = ATA_CMD_IDLEIMMEDIATE; | 136 | cmd.tf.command = ATA_CMD_IDLEIMMEDIATE; |
145 | goto out_do_tf; | 137 | goto out_do_tf; |
146 | case IDE_PM_RESTORE_DMA: /* Resume step 3 (restore DMA) */ | 138 | case IDE_PM_RESTORE_DMA: /* Resume step 3 (restore DMA) */ |
147 | /* | 139 | /* |
@@ -163,11 +155,11 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) | |||
163 | return ide_stopped; | 155 | return ide_stopped; |
164 | 156 | ||
165 | out_do_tf: | 157 | out_do_tf: |
166 | cmd->valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; | 158 | cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; |
167 | cmd->valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; | 159 | cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; |
168 | cmd->protocol = ATA_PROT_NODATA; | 160 | cmd.protocol = ATA_PROT_NODATA; |
169 | 161 | ||
170 | return do_rw_taskfile(drive, cmd); | 162 | return do_rw_taskfile(drive, &cmd); |
171 | } | 163 | } |
172 | 164 | ||
173 | /** | 165 | /** |
@@ -181,7 +173,7 @@ out_do_tf: | |||
181 | void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq) | 173 | void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq) |
182 | { | 174 | { |
183 | struct request_queue *q = drive->queue; | 175 | struct request_queue *q = drive->queue; |
184 | struct request_pm_state *pm = rq->data; | 176 | struct request_pm_state *pm = rq->special; |
185 | unsigned long flags; | 177 | unsigned long flags; |
186 | 178 | ||
187 | ide_complete_power_step(drive, rq); | 179 | ide_complete_power_step(drive, rq); |
@@ -207,7 +199,7 @@ void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq) | |||
207 | 199 | ||
208 | void ide_check_pm_state(ide_drive_t *drive, struct request *rq) | 200 | void ide_check_pm_state(ide_drive_t *drive, struct request *rq) |
209 | { | 201 | { |
210 | struct request_pm_state *pm = rq->data; | 202 | struct request_pm_state *pm = rq->special; |
211 | 203 | ||
212 | if (blk_pm_suspend_request(rq) && | 204 | if (blk_pm_suspend_request(rq) && |
213 | pm->pm_step == IDE_PM_START_SUSPEND) | 205 | pm->pm_step == IDE_PM_START_SUSPEND) |
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c index 6e80b774e88a..017b1df3b805 100644 --- a/drivers/ide/ide-pnp.c +++ b/drivers/ide/ide-pnp.c | |||
@@ -29,6 +29,7 @@ static struct pnp_device_id idepnp_devices[] = { | |||
29 | 29 | ||
30 | static const struct ide_port_info ide_pnp_port_info = { | 30 | static const struct ide_port_info ide_pnp_port_info = { |
31 | .host_flags = IDE_HFLAG_NO_DMA, | 31 | .host_flags = IDE_HFLAG_NO_DMA, |
32 | .chipset = ide_generic, | ||
32 | }; | 33 | }; |
33 | 34 | ||
34 | static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | 35 | static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
@@ -36,7 +37,7 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
36 | struct ide_host *host; | 37 | struct ide_host *host; |
37 | unsigned long base, ctl; | 38 | unsigned long base, ctl; |
38 | int rc; | 39 | int rc; |
39 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 40 | struct ide_hw hw, *hws[] = { &hw }; |
40 | 41 | ||
41 | printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n"); | 42 | printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n"); |
42 | 43 | ||
@@ -62,9 +63,8 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
62 | memset(&hw, 0, sizeof(hw)); | 63 | memset(&hw, 0, sizeof(hw)); |
63 | ide_std_init_ports(&hw, base, ctl); | 64 | ide_std_init_ports(&hw, base, ctl); |
64 | hw.irq = pnp_irq(dev, 0); | 65 | hw.irq = pnp_irq(dev, 0); |
65 | hw.chipset = ide_generic; | ||
66 | 66 | ||
67 | rc = ide_host_add(&ide_pnp_port_info, hws, &host); | 67 | rc = ide_host_add(&ide_pnp_port_info, hws, 1, &host); |
68 | if (rc) | 68 | if (rc) |
69 | goto out; | 69 | goto out; |
70 | 70 | ||
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index c895ed52b2e8..89574b0bd56d 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -97,7 +97,7 @@ static void ide_disk_init_mult_count(ide_drive_t *drive) | |||
97 | drive->mult_req = id[ATA_ID_MULTSECT] & 0xff; | 97 | drive->mult_req = id[ATA_ID_MULTSECT] & 0xff; |
98 | 98 | ||
99 | if (drive->mult_req) | 99 | if (drive->mult_req) |
100 | drive->special.b.set_multmode = 1; | 100 | drive->special_flags |= IDE_SFLAG_SET_MULTMODE; |
101 | } | 101 | } |
102 | } | 102 | } |
103 | 103 | ||
@@ -1035,6 +1035,15 @@ static void ide_port_init_devices(ide_hwif_t *hwif) | |||
1035 | if (port_ops && port_ops->init_dev) | 1035 | if (port_ops && port_ops->init_dev) |
1036 | port_ops->init_dev(drive); | 1036 | port_ops->init_dev(drive); |
1037 | } | 1037 | } |
1038 | |||
1039 | ide_port_for_each_dev(i, drive, hwif) { | ||
1040 | /* | ||
1041 | * default to PIO Mode 0 before we figure out | ||
1042 | * the most suited mode for the attached device | ||
1043 | */ | ||
1044 | if (port_ops && port_ops->set_pio_mode) | ||
1045 | port_ops->set_pio_mode(drive, 0); | ||
1046 | } | ||
1038 | } | 1047 | } |
1039 | 1048 | ||
1040 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | 1049 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, |
@@ -1042,8 +1051,7 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | |||
1042 | { | 1051 | { |
1043 | hwif->channel = port; | 1052 | hwif->channel = port; |
1044 | 1053 | ||
1045 | if (d->chipset) | 1054 | hwif->chipset = d->chipset ? d->chipset : ide_pci; |
1046 | hwif->chipset = d->chipset; | ||
1047 | 1055 | ||
1048 | if (d->init_iops) | 1056 | if (d->init_iops) |
1049 | d->init_iops(hwif); | 1057 | d->init_iops(hwif); |
@@ -1132,8 +1140,8 @@ static void ide_port_init_devices_data(ide_hwif_t *hwif) | |||
1132 | drive->hwif = hwif; | 1140 | drive->hwif = hwif; |
1133 | drive->ready_stat = ATA_DRDY; | 1141 | drive->ready_stat = ATA_DRDY; |
1134 | drive->bad_wstat = BAD_W_STAT; | 1142 | drive->bad_wstat = BAD_W_STAT; |
1135 | drive->special.b.recalibrate = 1; | 1143 | drive->special_flags = IDE_SFLAG_RECALIBRATE | |
1136 | drive->special.b.set_geometry = 1; | 1144 | IDE_SFLAG_SET_GEOMETRY; |
1137 | drive->name[0] = 'h'; | 1145 | drive->name[0] = 'h'; |
1138 | drive->name[1] = 'd'; | 1146 | drive->name[1] = 'd'; |
1139 | drive->name[2] = 'a' + j; | 1147 | drive->name[2] = 'a' + j; |
@@ -1168,11 +1176,10 @@ static void ide_init_port_data(ide_hwif_t *hwif, unsigned int index) | |||
1168 | ide_port_init_devices_data(hwif); | 1176 | ide_port_init_devices_data(hwif); |
1169 | } | 1177 | } |
1170 | 1178 | ||
1171 | static void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw) | 1179 | static void ide_init_port_hw(ide_hwif_t *hwif, struct ide_hw *hw) |
1172 | { | 1180 | { |
1173 | memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); | 1181 | memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); |
1174 | hwif->irq = hw->irq; | 1182 | hwif->irq = hw->irq; |
1175 | hwif->chipset = hw->chipset; | ||
1176 | hwif->dev = hw->dev; | 1183 | hwif->dev = hw->dev; |
1177 | hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; | 1184 | hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; |
1178 | hwif->ack_intr = hw->ack_intr; | 1185 | hwif->ack_intr = hw->ack_intr; |
@@ -1257,7 +1264,8 @@ out_nomem: | |||
1257 | return -ENOMEM; | 1264 | return -ENOMEM; |
1258 | } | 1265 | } |
1259 | 1266 | ||
1260 | struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws) | 1267 | struct ide_host *ide_host_alloc(const struct ide_port_info *d, |
1268 | struct ide_hw **hws, unsigned int n_ports) | ||
1261 | { | 1269 | { |
1262 | struct ide_host *host; | 1270 | struct ide_host *host; |
1263 | struct device *dev = hws[0] ? hws[0]->dev : NULL; | 1271 | struct device *dev = hws[0] ? hws[0]->dev : NULL; |
@@ -1268,7 +1276,7 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws) | |||
1268 | if (host == NULL) | 1276 | if (host == NULL) |
1269 | return NULL; | 1277 | return NULL; |
1270 | 1278 | ||
1271 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1279 | for (i = 0; i < n_ports; i++) { |
1272 | ide_hwif_t *hwif; | 1280 | ide_hwif_t *hwif; |
1273 | int idx; | 1281 | int idx; |
1274 | 1282 | ||
@@ -1344,7 +1352,7 @@ static void ide_disable_port(ide_hwif_t *hwif) | |||
1344 | } | 1352 | } |
1345 | 1353 | ||
1346 | int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | 1354 | int ide_host_register(struct ide_host *host, const struct ide_port_info *d, |
1347 | hw_regs_t **hws) | 1355 | struct ide_hw **hws) |
1348 | { | 1356 | { |
1349 | ide_hwif_t *hwif, *mate = NULL; | 1357 | ide_hwif_t *hwif, *mate = NULL; |
1350 | int i, j = 0; | 1358 | int i, j = 0; |
@@ -1438,13 +1446,13 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1438 | } | 1446 | } |
1439 | EXPORT_SYMBOL_GPL(ide_host_register); | 1447 | EXPORT_SYMBOL_GPL(ide_host_register); |
1440 | 1448 | ||
1441 | int ide_host_add(const struct ide_port_info *d, hw_regs_t **hws, | 1449 | int ide_host_add(const struct ide_port_info *d, struct ide_hw **hws, |
1442 | struct ide_host **hostp) | 1450 | unsigned int n_ports, struct ide_host **hostp) |
1443 | { | 1451 | { |
1444 | struct ide_host *host; | 1452 | struct ide_host *host; |
1445 | int rc; | 1453 | int rc; |
1446 | 1454 | ||
1447 | host = ide_host_alloc(d, hws); | 1455 | host = ide_host_alloc(d, hws, n_ports); |
1448 | if (host == NULL) | 1456 | if (host == NULL) |
1449 | return -ENOMEM; | 1457 | return -ENOMEM; |
1450 | 1458 | ||
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 3a53e0834cf7..203bbeac182f 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -131,13 +131,6 @@ enum { | |||
131 | IDETAPE_DIR_WRITE = (1 << 2), | 131 | IDETAPE_DIR_WRITE = (1 << 2), |
132 | }; | 132 | }; |
133 | 133 | ||
134 | struct idetape_bh { | ||
135 | u32 b_size; | ||
136 | atomic_t b_count; | ||
137 | struct idetape_bh *b_reqnext; | ||
138 | char *b_data; | ||
139 | }; | ||
140 | |||
141 | /* Tape door status */ | 134 | /* Tape door status */ |
142 | #define DOOR_UNLOCKED 0 | 135 | #define DOOR_UNLOCKED 0 |
143 | #define DOOR_LOCKED 1 | 136 | #define DOOR_LOCKED 1 |
@@ -219,18 +212,12 @@ typedef struct ide_tape_obj { | |||
219 | 212 | ||
220 | /* Data buffer size chosen based on the tape's recommendation */ | 213 | /* Data buffer size chosen based on the tape's recommendation */ |
221 | int buffer_size; | 214 | int buffer_size; |
222 | /* merge buffer */ | 215 | /* Staging buffer of buffer_size bytes */ |
223 | struct idetape_bh *merge_bh; | 216 | void *buf; |
224 | /* size of the merge buffer */ | 217 | /* The read/write cursor */ |
225 | int merge_bh_size; | 218 | void *cur; |
226 | /* pointer to current buffer head within the merge buffer */ | 219 | /* The number of valid bytes in buf */ |
227 | struct idetape_bh *bh; | 220 | size_t valid; |
228 | char *b_data; | ||
229 | int b_count; | ||
230 | |||
231 | int pages_per_buffer; | ||
232 | /* Wasted space in each stage */ | ||
233 | int excess_bh_size; | ||
234 | 221 | ||
235 | /* Measures average tape speed */ | 222 | /* Measures average tape speed */ |
236 | unsigned long avg_time; | 223 | unsigned long avg_time; |
@@ -297,84 +284,6 @@ static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i) | |||
297 | return tape; | 284 | return tape; |
298 | } | 285 | } |
299 | 286 | ||
300 | static int idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, | ||
301 | unsigned int bcount) | ||
302 | { | ||
303 | struct idetape_bh *bh = pc->bh; | ||
304 | int count; | ||
305 | |||
306 | while (bcount) { | ||
307 | if (bh == NULL) | ||
308 | break; | ||
309 | count = min( | ||
310 | (unsigned int)(bh->b_size - atomic_read(&bh->b_count)), | ||
311 | bcount); | ||
312 | drive->hwif->tp_ops->input_data(drive, NULL, bh->b_data + | ||
313 | atomic_read(&bh->b_count), count); | ||
314 | bcount -= count; | ||
315 | atomic_add(count, &bh->b_count); | ||
316 | if (atomic_read(&bh->b_count) == bh->b_size) { | ||
317 | bh = bh->b_reqnext; | ||
318 | if (bh) | ||
319 | atomic_set(&bh->b_count, 0); | ||
320 | } | ||
321 | } | ||
322 | |||
323 | pc->bh = bh; | ||
324 | |||
325 | return bcount; | ||
326 | } | ||
327 | |||
328 | static int idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, | ||
329 | unsigned int bcount) | ||
330 | { | ||
331 | struct idetape_bh *bh = pc->bh; | ||
332 | int count; | ||
333 | |||
334 | while (bcount) { | ||
335 | if (bh == NULL) | ||
336 | break; | ||
337 | count = min((unsigned int)pc->b_count, (unsigned int)bcount); | ||
338 | drive->hwif->tp_ops->output_data(drive, NULL, pc->b_data, count); | ||
339 | bcount -= count; | ||
340 | pc->b_data += count; | ||
341 | pc->b_count -= count; | ||
342 | if (!pc->b_count) { | ||
343 | bh = bh->b_reqnext; | ||
344 | pc->bh = bh; | ||
345 | if (bh) { | ||
346 | pc->b_data = bh->b_data; | ||
347 | pc->b_count = atomic_read(&bh->b_count); | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | |||
352 | return bcount; | ||
353 | } | ||
354 | |||
355 | static void idetape_update_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc) | ||
356 | { | ||
357 | struct idetape_bh *bh = pc->bh; | ||
358 | int count; | ||
359 | unsigned int bcount = pc->xferred; | ||
360 | |||
361 | if (pc->flags & PC_FLAG_WRITING) | ||
362 | return; | ||
363 | while (bcount) { | ||
364 | if (bh == NULL) { | ||
365 | printk(KERN_ERR "ide-tape: bh == NULL in %s\n", | ||
366 | __func__); | ||
367 | return; | ||
368 | } | ||
369 | count = min((unsigned int)bh->b_size, (unsigned int)bcount); | ||
370 | atomic_set(&bh->b_count, count); | ||
371 | if (atomic_read(&bh->b_count) == bh->b_size) | ||
372 | bh = bh->b_reqnext; | ||
373 | bcount -= count; | ||
374 | } | ||
375 | pc->bh = bh; | ||
376 | } | ||
377 | |||
378 | /* | 287 | /* |
379 | * called on each failed packet command retry to analyze the request sense. We | 288 | * called on each failed packet command retry to analyze the request sense. We |
380 | * currently do not utilize this information. | 289 | * currently do not utilize this information. |
@@ -392,12 +301,10 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
392 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); | 301 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); |
393 | 302 | ||
394 | /* Correct pc->xferred by asking the tape. */ | 303 | /* Correct pc->xferred by asking the tape. */ |
395 | if (pc->flags & PC_FLAG_DMA_ERROR) { | 304 | if (pc->flags & PC_FLAG_DMA_ERROR) |
396 | pc->xferred = pc->req_xfer - | 305 | pc->xferred = pc->req_xfer - |
397 | tape->blk_size * | 306 | tape->blk_size * |
398 | get_unaligned_be32(&sense[3]); | 307 | get_unaligned_be32(&sense[3]); |
399 | idetape_update_buffers(drive, pc); | ||
400 | } | ||
401 | 308 | ||
402 | /* | 309 | /* |
403 | * If error was the result of a zero-length read or write command, | 310 | * If error was the result of a zero-length read or write command, |
@@ -436,29 +343,6 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
436 | } | 343 | } |
437 | } | 344 | } |
438 | 345 | ||
439 | /* Free data buffers completely. */ | ||
440 | static void ide_tape_kfree_buffer(idetape_tape_t *tape) | ||
441 | { | ||
442 | struct idetape_bh *prev_bh, *bh = tape->merge_bh; | ||
443 | |||
444 | while (bh) { | ||
445 | u32 size = bh->b_size; | ||
446 | |||
447 | while (size) { | ||
448 | unsigned int order = fls(size >> PAGE_SHIFT)-1; | ||
449 | |||
450 | if (bh->b_data) | ||
451 | free_pages((unsigned long)bh->b_data, order); | ||
452 | |||
453 | size &= (order-1); | ||
454 | bh->b_data += (1 << order) * PAGE_SIZE; | ||
455 | } | ||
456 | prev_bh = bh; | ||
457 | bh = bh->b_reqnext; | ||
458 | kfree(prev_bh); | ||
459 | } | ||
460 | } | ||
461 | |||
462 | static void ide_tape_handle_dsc(ide_drive_t *); | 346 | static void ide_tape_handle_dsc(ide_drive_t *); |
463 | 347 | ||
464 | static int ide_tape_callback(ide_drive_t *drive, int dsc) | 348 | static int ide_tape_callback(ide_drive_t *drive, int dsc) |
@@ -496,7 +380,7 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
496 | } | 380 | } |
497 | 381 | ||
498 | tape->first_frame += blocks; | 382 | tape->first_frame += blocks; |
499 | rq->current_nr_sectors -= blocks; | 383 | rq->data_len -= blocks * tape->blk_size; |
500 | 384 | ||
501 | if (pc->error) { | 385 | if (pc->error) { |
502 | uptodate = 0; | 386 | uptodate = 0; |
@@ -558,19 +442,6 @@ static void ide_tape_handle_dsc(ide_drive_t *drive) | |||
558 | idetape_postpone_request(drive); | 442 | idetape_postpone_request(drive); |
559 | } | 443 | } |
560 | 444 | ||
561 | static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, | ||
562 | unsigned int bcount, int write) | ||
563 | { | ||
564 | unsigned int bleft; | ||
565 | |||
566 | if (write) | ||
567 | bleft = idetape_output_buffers(drive, pc, bcount); | ||
568 | else | ||
569 | bleft = idetape_input_buffers(drive, pc, bcount); | ||
570 | |||
571 | return bcount - bleft; | ||
572 | } | ||
573 | |||
574 | /* | 445 | /* |
575 | * Packet Command Interface | 446 | * Packet Command Interface |
576 | * | 447 | * |
@@ -622,6 +493,8 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, | |||
622 | 493 | ||
623 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || | 494 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || |
624 | (pc->flags & PC_FLAG_ABORT)) { | 495 | (pc->flags & PC_FLAG_ABORT)) { |
496 | unsigned int done = blk_rq_bytes(drive->hwif->rq); | ||
497 | |||
625 | /* | 498 | /* |
626 | * We will "abort" retrying a packet command in case legitimate | 499 | * We will "abort" retrying a packet command in case legitimate |
627 | * error code was received (crossing a filemark, or end of the | 500 | * error code was received (crossing a filemark, or end of the |
@@ -641,8 +514,10 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, | |||
641 | /* Giving up */ | 514 | /* Giving up */ |
642 | pc->error = IDE_DRV_ERROR_GENERAL; | 515 | pc->error = IDE_DRV_ERROR_GENERAL; |
643 | } | 516 | } |
517 | |||
644 | drive->failed_pc = NULL; | 518 | drive->failed_pc = NULL; |
645 | drive->pc_callback(drive, 0); | 519 | drive->pc_callback(drive, 0); |
520 | ide_complete_rq(drive, -EIO, done); | ||
646 | return ide_stopped; | 521 | return ide_stopped; |
647 | } | 522 | } |
648 | debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); | 523 | debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); |
@@ -695,7 +570,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) | |||
695 | printk(KERN_ERR "ide-tape: %s: I/O error, ", | 570 | printk(KERN_ERR "ide-tape: %s: I/O error, ", |
696 | tape->name); | 571 | tape->name); |
697 | /* Retry operation */ | 572 | /* Retry operation */ |
698 | ide_retry_pc(drive, tape->disk); | 573 | ide_retry_pc(drive); |
699 | return ide_stopped; | 574 | return ide_stopped; |
700 | } | 575 | } |
701 | pc->error = 0; | 576 | pc->error = 0; |
@@ -711,27 +586,22 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape, | |||
711 | struct ide_atapi_pc *pc, struct request *rq, | 586 | struct ide_atapi_pc *pc, struct request *rq, |
712 | u8 opcode) | 587 | u8 opcode) |
713 | { | 588 | { |
714 | struct idetape_bh *bh = (struct idetape_bh *)rq->special; | 589 | unsigned int length = rq->nr_sectors; |
715 | unsigned int length = rq->current_nr_sectors; | ||
716 | 590 | ||
717 | ide_init_pc(pc); | 591 | ide_init_pc(pc); |
718 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); | 592 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); |
719 | pc->c[1] = 1; | 593 | pc->c[1] = 1; |
720 | pc->bh = bh; | ||
721 | pc->buf = NULL; | 594 | pc->buf = NULL; |
722 | pc->buf_size = length * tape->blk_size; | 595 | pc->buf_size = length * tape->blk_size; |
723 | pc->req_xfer = pc->buf_size; | 596 | pc->req_xfer = pc->buf_size; |
724 | if (pc->req_xfer == tape->buffer_size) | 597 | if (pc->req_xfer == tape->buffer_size) |
725 | pc->flags |= PC_FLAG_DMA_OK; | 598 | pc->flags |= PC_FLAG_DMA_OK; |
726 | 599 | ||
727 | if (opcode == READ_6) { | 600 | if (opcode == READ_6) |
728 | pc->c[0] = READ_6; | 601 | pc->c[0] = READ_6; |
729 | atomic_set(&bh->b_count, 0); | 602 | else if (opcode == WRITE_6) { |
730 | } else if (opcode == WRITE_6) { | ||
731 | pc->c[0] = WRITE_6; | 603 | pc->c[0] = WRITE_6; |
732 | pc->flags |= PC_FLAG_WRITING; | 604 | pc->flags |= PC_FLAG_WRITING; |
733 | pc->b_data = bh->b_data; | ||
734 | pc->b_count = atomic_read(&bh->b_count); | ||
735 | } | 605 | } |
736 | 606 | ||
737 | memcpy(rq->cmd, pc->c, 12); | 607 | memcpy(rq->cmd, pc->c, 12); |
@@ -747,12 +617,10 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
747 | struct ide_cmd cmd; | 617 | struct ide_cmd cmd; |
748 | u8 stat; | 618 | u8 stat; |
749 | 619 | ||
750 | debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %lu," | 620 | debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %lu\n", |
751 | " current_nr_sectors: %u\n", | 621 | (unsigned long long)rq->sector, rq->nr_sectors); |
752 | (unsigned long long)rq->sector, rq->nr_sectors, | ||
753 | rq->current_nr_sectors); | ||
754 | 622 | ||
755 | if (!blk_special_request(rq)) { | 623 | if (!(blk_special_request(rq) || blk_sense_request(rq))) { |
756 | /* We do not support buffer cache originated requests. */ | 624 | /* We do not support buffer cache originated requests. */ |
757 | printk(KERN_NOTICE "ide-tape: %s: Unsupported request in " | 625 | printk(KERN_NOTICE "ide-tape: %s: Unsupported request in " |
758 | "request queue (%d)\n", drive->name, rq->cmd_type); | 626 | "request queue (%d)\n", drive->name, rq->cmd_type); |
@@ -828,7 +696,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
828 | goto out; | 696 | goto out; |
829 | } | 697 | } |
830 | if (rq->cmd[13] & REQ_IDETAPE_PC1) { | 698 | if (rq->cmd[13] & REQ_IDETAPE_PC1) { |
831 | pc = (struct ide_atapi_pc *) rq->buffer; | 699 | pc = (struct ide_atapi_pc *)rq->special; |
832 | rq->cmd[13] &= ~(REQ_IDETAPE_PC1); | 700 | rq->cmd[13] &= ~(REQ_IDETAPE_PC1); |
833 | rq->cmd[13] |= REQ_IDETAPE_PC2; | 701 | rq->cmd[13] |= REQ_IDETAPE_PC2; |
834 | goto out; | 702 | goto out; |
@@ -840,6 +708,9 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
840 | BUG(); | 708 | BUG(); |
841 | 709 | ||
842 | out: | 710 | out: |
711 | /* prepare sense request for this command */ | ||
712 | ide_prep_sense(drive, rq); | ||
713 | |||
843 | memset(&cmd, 0, sizeof(cmd)); | 714 | memset(&cmd, 0, sizeof(cmd)); |
844 | 715 | ||
845 | if (rq_data_dir(rq)) | 716 | if (rq_data_dir(rq)) |
@@ -847,167 +718,10 @@ out: | |||
847 | 718 | ||
848 | cmd.rq = rq; | 719 | cmd.rq = rq; |
849 | 720 | ||
850 | return ide_tape_issue_pc(drive, &cmd, pc); | 721 | ide_init_sg_cmd(&cmd, pc->req_xfer); |
851 | } | 722 | ide_map_sg(drive, &cmd); |
852 | |||
853 | /* | ||
854 | * The function below uses __get_free_pages to allocate a data buffer of size | ||
855 | * tape->buffer_size (or a bit more). We attempt to combine sequential pages as | ||
856 | * much as possible. | ||
857 | * | ||
858 | * It returns a pointer to the newly allocated buffer, or NULL in case of | ||
859 | * failure. | ||
860 | */ | ||
861 | static struct idetape_bh *ide_tape_kmalloc_buffer(idetape_tape_t *tape, | ||
862 | int full, int clear) | ||
863 | { | ||
864 | struct idetape_bh *prev_bh, *bh, *merge_bh; | ||
865 | int pages = tape->pages_per_buffer; | ||
866 | unsigned int order, b_allocd; | ||
867 | char *b_data = NULL; | ||
868 | |||
869 | merge_bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL); | ||
870 | bh = merge_bh; | ||
871 | if (bh == NULL) | ||
872 | goto abort; | ||
873 | |||
874 | order = fls(pages) - 1; | ||
875 | bh->b_data = (char *) __get_free_pages(GFP_KERNEL, order); | ||
876 | if (!bh->b_data) | ||
877 | goto abort; | ||
878 | b_allocd = (1 << order) * PAGE_SIZE; | ||
879 | pages &= (order-1); | ||
880 | |||
881 | if (clear) | ||
882 | memset(bh->b_data, 0, b_allocd); | ||
883 | bh->b_reqnext = NULL; | ||
884 | bh->b_size = b_allocd; | ||
885 | atomic_set(&bh->b_count, full ? bh->b_size : 0); | ||
886 | |||
887 | while (pages) { | ||
888 | order = fls(pages) - 1; | ||
889 | b_data = (char *) __get_free_pages(GFP_KERNEL, order); | ||
890 | if (!b_data) | ||
891 | goto abort; | ||
892 | b_allocd = (1 << order) * PAGE_SIZE; | ||
893 | |||
894 | if (clear) | ||
895 | memset(b_data, 0, b_allocd); | ||
896 | |||
897 | /* newly allocated page frames below buffer header or ...*/ | ||
898 | if (bh->b_data == b_data + b_allocd) { | ||
899 | bh->b_size += b_allocd; | ||
900 | bh->b_data -= b_allocd; | ||
901 | if (full) | ||
902 | atomic_add(b_allocd, &bh->b_count); | ||
903 | continue; | ||
904 | } | ||
905 | /* they are above the header */ | ||
906 | if (b_data == bh->b_data + bh->b_size) { | ||
907 | bh->b_size += b_allocd; | ||
908 | if (full) | ||
909 | atomic_add(b_allocd, &bh->b_count); | ||
910 | continue; | ||
911 | } | ||
912 | prev_bh = bh; | ||
913 | bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL); | ||
914 | if (!bh) { | ||
915 | free_pages((unsigned long) b_data, order); | ||
916 | goto abort; | ||
917 | } | ||
918 | bh->b_reqnext = NULL; | ||
919 | bh->b_data = b_data; | ||
920 | bh->b_size = b_allocd; | ||
921 | atomic_set(&bh->b_count, full ? bh->b_size : 0); | ||
922 | prev_bh->b_reqnext = bh; | ||
923 | |||
924 | pages &= (order-1); | ||
925 | } | ||
926 | |||
927 | bh->b_size -= tape->excess_bh_size; | ||
928 | if (full) | ||
929 | atomic_sub(tape->excess_bh_size, &bh->b_count); | ||
930 | return merge_bh; | ||
931 | abort: | ||
932 | ide_tape_kfree_buffer(tape); | ||
933 | return NULL; | ||
934 | } | ||
935 | 723 | ||
936 | static int idetape_copy_stage_from_user(idetape_tape_t *tape, | 724 | return ide_tape_issue_pc(drive, &cmd, pc); |
937 | const char __user *buf, int n) | ||
938 | { | ||
939 | struct idetape_bh *bh = tape->bh; | ||
940 | int count; | ||
941 | int ret = 0; | ||
942 | |||
943 | while (n) { | ||
944 | if (bh == NULL) { | ||
945 | printk(KERN_ERR "ide-tape: bh == NULL in %s\n", | ||
946 | __func__); | ||
947 | return 1; | ||
948 | } | ||
949 | count = min((unsigned int) | ||
950 | (bh->b_size - atomic_read(&bh->b_count)), | ||
951 | (unsigned int)n); | ||
952 | if (copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf, | ||
953 | count)) | ||
954 | ret = 1; | ||
955 | n -= count; | ||
956 | atomic_add(count, &bh->b_count); | ||
957 | buf += count; | ||
958 | if (atomic_read(&bh->b_count) == bh->b_size) { | ||
959 | bh = bh->b_reqnext; | ||
960 | if (bh) | ||
961 | atomic_set(&bh->b_count, 0); | ||
962 | } | ||
963 | } | ||
964 | tape->bh = bh; | ||
965 | return ret; | ||
966 | } | ||
967 | |||
968 | static int idetape_copy_stage_to_user(idetape_tape_t *tape, char __user *buf, | ||
969 | int n) | ||
970 | { | ||
971 | struct idetape_bh *bh = tape->bh; | ||
972 | int count; | ||
973 | int ret = 0; | ||
974 | |||
975 | while (n) { | ||
976 | if (bh == NULL) { | ||
977 | printk(KERN_ERR "ide-tape: bh == NULL in %s\n", | ||
978 | __func__); | ||
979 | return 1; | ||
980 | } | ||
981 | count = min(tape->b_count, n); | ||
982 | if (copy_to_user(buf, tape->b_data, count)) | ||
983 | ret = 1; | ||
984 | n -= count; | ||
985 | tape->b_data += count; | ||
986 | tape->b_count -= count; | ||
987 | buf += count; | ||
988 | if (!tape->b_count) { | ||
989 | bh = bh->b_reqnext; | ||
990 | tape->bh = bh; | ||
991 | if (bh) { | ||
992 | tape->b_data = bh->b_data; | ||
993 | tape->b_count = atomic_read(&bh->b_count); | ||
994 | } | ||
995 | } | ||
996 | } | ||
997 | return ret; | ||
998 | } | ||
999 | |||
1000 | static void idetape_init_merge_buffer(idetape_tape_t *tape) | ||
1001 | { | ||
1002 | struct idetape_bh *bh = tape->merge_bh; | ||
1003 | tape->bh = tape->merge_bh; | ||
1004 | |||
1005 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) | ||
1006 | atomic_set(&bh->b_count, 0); | ||
1007 | else { | ||
1008 | tape->b_data = bh->b_data; | ||
1009 | tape->b_count = atomic_read(&bh->b_count); | ||
1010 | } | ||
1011 | } | 725 | } |
1012 | 726 | ||
1013 | /* | 727 | /* |
@@ -1107,10 +821,10 @@ static void __ide_tape_discard_merge_buffer(ide_drive_t *drive) | |||
1107 | return; | 821 | return; |
1108 | 822 | ||
1109 | clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags); | 823 | clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags); |
1110 | tape->merge_bh_size = 0; | 824 | tape->valid = 0; |
1111 | if (tape->merge_bh != NULL) { | 825 | if (tape->buf != NULL) { |
1112 | ide_tape_kfree_buffer(tape); | 826 | kfree(tape->buf); |
1113 | tape->merge_bh = NULL; | 827 | tape->buf = NULL; |
1114 | } | 828 | } |
1115 | 829 | ||
1116 | tape->chrdev_dir = IDETAPE_DIR_NONE; | 830 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
@@ -1164,36 +878,44 @@ static void ide_tape_discard_merge_buffer(ide_drive_t *drive, | |||
1164 | * Generate a read/write request for the block device interface and wait for it | 878 | * Generate a read/write request for the block device interface and wait for it |
1165 | * to be serviced. | 879 | * to be serviced. |
1166 | */ | 880 | */ |
1167 | static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks, | 881 | static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int size) |
1168 | struct idetape_bh *bh) | ||
1169 | { | 882 | { |
1170 | idetape_tape_t *tape = drive->driver_data; | 883 | idetape_tape_t *tape = drive->driver_data; |
1171 | struct request *rq; | 884 | struct request *rq; |
1172 | int ret, errors; | 885 | int ret; |
1173 | 886 | ||
1174 | debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd); | 887 | debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd); |
888 | BUG_ON(cmd != REQ_IDETAPE_READ && cmd != REQ_IDETAPE_WRITE); | ||
889 | BUG_ON(size < 0 || size % tape->blk_size); | ||
1175 | 890 | ||
1176 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 891 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
1177 | rq->cmd_type = REQ_TYPE_SPECIAL; | 892 | rq->cmd_type = REQ_TYPE_SPECIAL; |
1178 | rq->cmd[13] = cmd; | 893 | rq->cmd[13] = cmd; |
1179 | rq->rq_disk = tape->disk; | 894 | rq->rq_disk = tape->disk; |
1180 | rq->special = (void *)bh; | ||
1181 | rq->sector = tape->first_frame; | 895 | rq->sector = tape->first_frame; |
1182 | rq->nr_sectors = blocks; | ||
1183 | rq->current_nr_sectors = blocks; | ||
1184 | blk_execute_rq(drive->queue, tape->disk, rq, 0); | ||
1185 | 896 | ||
1186 | errors = rq->errors; | 897 | if (size) { |
1187 | ret = tape->blk_size * (blocks - rq->current_nr_sectors); | 898 | ret = blk_rq_map_kern(drive->queue, rq, tape->buf, size, |
1188 | blk_put_request(rq); | 899 | __GFP_WAIT); |
900 | if (ret) | ||
901 | goto out_put; | ||
902 | } | ||
1189 | 903 | ||
1190 | if ((cmd & (REQ_IDETAPE_READ | REQ_IDETAPE_WRITE)) == 0) | 904 | blk_execute_rq(drive->queue, tape->disk, rq, 0); |
1191 | return 0; | ||
1192 | 905 | ||
1193 | if (tape->merge_bh) | 906 | /* calculate the number of transferred bytes and update buffer state */ |
1194 | idetape_init_merge_buffer(tape); | 907 | size -= rq->data_len; |
1195 | if (errors == IDE_DRV_ERROR_GENERAL) | 908 | tape->cur = tape->buf; |
1196 | return -EIO; | 909 | if (cmd == REQ_IDETAPE_READ) |
910 | tape->valid = size; | ||
911 | else | ||
912 | tape->valid = 0; | ||
913 | |||
914 | ret = size; | ||
915 | if (rq->errors == IDE_DRV_ERROR_GENERAL) | ||
916 | ret = -EIO; | ||
917 | out_put: | ||
918 | blk_put_request(rq); | ||
1197 | return ret; | 919 | return ret; |
1198 | } | 920 | } |
1199 | 921 | ||
@@ -1230,153 +952,87 @@ static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd) | |||
1230 | pc->flags |= PC_FLAG_WAIT_FOR_DSC; | 952 | pc->flags |= PC_FLAG_WAIT_FOR_DSC; |
1231 | } | 953 | } |
1232 | 954 | ||
1233 | /* Queue up a character device originated write request. */ | ||
1234 | static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks) | ||
1235 | { | ||
1236 | idetape_tape_t *tape = drive->driver_data; | ||
1237 | |||
1238 | debug_log(DBG_CHRDEV, "Enter %s\n", __func__); | ||
1239 | |||
1240 | return idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, | ||
1241 | blocks, tape->merge_bh); | ||
1242 | } | ||
1243 | |||
1244 | static void ide_tape_flush_merge_buffer(ide_drive_t *drive) | 955 | static void ide_tape_flush_merge_buffer(ide_drive_t *drive) |
1245 | { | 956 | { |
1246 | idetape_tape_t *tape = drive->driver_data; | 957 | idetape_tape_t *tape = drive->driver_data; |
1247 | int blocks, min; | ||
1248 | struct idetape_bh *bh; | ||
1249 | 958 | ||
1250 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { | 959 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { |
1251 | printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer" | 960 | printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer" |
1252 | " but we are not writing.\n"); | 961 | " but we are not writing.\n"); |
1253 | return; | 962 | return; |
1254 | } | 963 | } |
1255 | if (tape->merge_bh_size > tape->buffer_size) { | 964 | if (tape->buf) { |
1256 | printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n"); | 965 | size_t aligned = roundup(tape->valid, tape->blk_size); |
1257 | tape->merge_bh_size = tape->buffer_size; | 966 | |
1258 | } | 967 | memset(tape->cur, 0, aligned - tape->valid); |
1259 | if (tape->merge_bh_size) { | 968 | idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, aligned); |
1260 | blocks = tape->merge_bh_size / tape->blk_size; | 969 | kfree(tape->buf); |
1261 | if (tape->merge_bh_size % tape->blk_size) { | 970 | tape->buf = NULL; |
1262 | unsigned int i; | ||
1263 | |||
1264 | blocks++; | ||
1265 | i = tape->blk_size - tape->merge_bh_size % | ||
1266 | tape->blk_size; | ||
1267 | bh = tape->bh->b_reqnext; | ||
1268 | while (bh) { | ||
1269 | atomic_set(&bh->b_count, 0); | ||
1270 | bh = bh->b_reqnext; | ||
1271 | } | ||
1272 | bh = tape->bh; | ||
1273 | while (i) { | ||
1274 | if (bh == NULL) { | ||
1275 | printk(KERN_INFO "ide-tape: bug," | ||
1276 | " bh NULL\n"); | ||
1277 | break; | ||
1278 | } | ||
1279 | min = min(i, (unsigned int)(bh->b_size - | ||
1280 | atomic_read(&bh->b_count))); | ||
1281 | memset(bh->b_data + atomic_read(&bh->b_count), | ||
1282 | 0, min); | ||
1283 | atomic_add(min, &bh->b_count); | ||
1284 | i -= min; | ||
1285 | bh = bh->b_reqnext; | ||
1286 | } | ||
1287 | } | ||
1288 | (void) idetape_add_chrdev_write_request(drive, blocks); | ||
1289 | tape->merge_bh_size = 0; | ||
1290 | } | ||
1291 | if (tape->merge_bh != NULL) { | ||
1292 | ide_tape_kfree_buffer(tape); | ||
1293 | tape->merge_bh = NULL; | ||
1294 | } | 971 | } |
1295 | tape->chrdev_dir = IDETAPE_DIR_NONE; | 972 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
1296 | } | 973 | } |
1297 | 974 | ||
1298 | static int idetape_init_read(ide_drive_t *drive) | 975 | static int idetape_init_rw(ide_drive_t *drive, int dir) |
1299 | { | 976 | { |
1300 | idetape_tape_t *tape = drive->driver_data; | 977 | idetape_tape_t *tape = drive->driver_data; |
1301 | int bytes_read; | 978 | int rc; |
1302 | 979 | ||
1303 | /* Initialize read operation */ | 980 | BUG_ON(dir != IDETAPE_DIR_READ && dir != IDETAPE_DIR_WRITE); |
1304 | if (tape->chrdev_dir != IDETAPE_DIR_READ) { | ||
1305 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { | ||
1306 | ide_tape_flush_merge_buffer(drive); | ||
1307 | idetape_flush_tape_buffers(drive); | ||
1308 | } | ||
1309 | if (tape->merge_bh || tape->merge_bh_size) { | ||
1310 | printk(KERN_ERR "ide-tape: merge_bh_size should be" | ||
1311 | " 0 now\n"); | ||
1312 | tape->merge_bh_size = 0; | ||
1313 | } | ||
1314 | tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0); | ||
1315 | if (!tape->merge_bh) | ||
1316 | return -ENOMEM; | ||
1317 | tape->chrdev_dir = IDETAPE_DIR_READ; | ||
1318 | 981 | ||
1319 | /* | 982 | if (tape->chrdev_dir == dir) |
1320 | * Issue a read 0 command to ensure that DSC handshake is | 983 | return 0; |
1321 | * switched from completion mode to buffer available mode. | ||
1322 | * No point in issuing this if DSC overlap isn't supported, some | ||
1323 | * drives (Seagate STT3401A) will return an error. | ||
1324 | */ | ||
1325 | if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) { | ||
1326 | bytes_read = idetape_queue_rw_tail(drive, | ||
1327 | REQ_IDETAPE_READ, 0, | ||
1328 | tape->merge_bh); | ||
1329 | if (bytes_read < 0) { | ||
1330 | ide_tape_kfree_buffer(tape); | ||
1331 | tape->merge_bh = NULL; | ||
1332 | tape->chrdev_dir = IDETAPE_DIR_NONE; | ||
1333 | return bytes_read; | ||
1334 | } | ||
1335 | } | ||
1336 | } | ||
1337 | 984 | ||
1338 | return 0; | 985 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
1339 | } | 986 | ide_tape_discard_merge_buffer(drive, 1); |
987 | else if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { | ||
988 | ide_tape_flush_merge_buffer(drive); | ||
989 | idetape_flush_tape_buffers(drive); | ||
990 | } | ||
1340 | 991 | ||
1341 | /* called from idetape_chrdev_read() to service a chrdev read request. */ | 992 | if (tape->buf || tape->valid) { |
1342 | static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks) | 993 | printk(KERN_ERR "ide-tape: valid should be 0 now\n"); |
1343 | { | 994 | tape->valid = 0; |
1344 | idetape_tape_t *tape = drive->driver_data; | 995 | } |
1345 | 996 | ||
1346 | debug_log(DBG_PROCS, "Enter %s, %d blocks\n", __func__, blocks); | 997 | tape->buf = kmalloc(tape->buffer_size, GFP_KERNEL); |
998 | if (!tape->buf) | ||
999 | return -ENOMEM; | ||
1000 | tape->chrdev_dir = dir; | ||
1001 | tape->cur = tape->buf; | ||
1347 | 1002 | ||
1348 | /* If we are at a filemark, return a read length of 0 */ | 1003 | /* |
1349 | if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) | 1004 | * Issue a 0 rw command to ensure that DSC handshake is |
1350 | return 0; | 1005 | * switched from completion mode to buffer available mode. No |
1351 | 1006 | * point in issuing this if DSC overlap isn't supported, some | |
1352 | idetape_init_read(drive); | 1007 | * drives (Seagate STT3401A) will return an error. |
1008 | */ | ||
1009 | if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) { | ||
1010 | int cmd = dir == IDETAPE_DIR_READ ? REQ_IDETAPE_READ | ||
1011 | : REQ_IDETAPE_WRITE; | ||
1012 | |||
1013 | rc = idetape_queue_rw_tail(drive, cmd, 0); | ||
1014 | if (rc < 0) { | ||
1015 | kfree(tape->buf); | ||
1016 | tape->buf = NULL; | ||
1017 | tape->chrdev_dir = IDETAPE_DIR_NONE; | ||
1018 | return rc; | ||
1019 | } | ||
1020 | } | ||
1353 | 1021 | ||
1354 | return idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, blocks, | 1022 | return 0; |
1355 | tape->merge_bh); | ||
1356 | } | 1023 | } |
1357 | 1024 | ||
1358 | static void idetape_pad_zeros(ide_drive_t *drive, int bcount) | 1025 | static void idetape_pad_zeros(ide_drive_t *drive, int bcount) |
1359 | { | 1026 | { |
1360 | idetape_tape_t *tape = drive->driver_data; | 1027 | idetape_tape_t *tape = drive->driver_data; |
1361 | struct idetape_bh *bh; | 1028 | |
1362 | int blocks; | 1029 | memset(tape->buf, 0, tape->buffer_size); |
1363 | 1030 | ||
1364 | while (bcount) { | 1031 | while (bcount) { |
1365 | unsigned int count; | 1032 | unsigned int count = min(tape->buffer_size, bcount); |
1366 | 1033 | ||
1367 | bh = tape->merge_bh; | 1034 | idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, count); |
1368 | count = min(tape->buffer_size, bcount); | ||
1369 | bcount -= count; | 1035 | bcount -= count; |
1370 | blocks = count / tape->blk_size; | ||
1371 | while (count) { | ||
1372 | atomic_set(&bh->b_count, | ||
1373 | min(count, (unsigned int)bh->b_size)); | ||
1374 | memset(bh->b_data, 0, atomic_read(&bh->b_count)); | ||
1375 | count -= atomic_read(&bh->b_count); | ||
1376 | bh = bh->b_reqnext; | ||
1377 | } | ||
1378 | idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, blocks, | ||
1379 | tape->merge_bh); | ||
1380 | } | 1036 | } |
1381 | } | 1037 | } |
1382 | 1038 | ||
@@ -1456,7 +1112,7 @@ static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op, | |||
1456 | } | 1112 | } |
1457 | 1113 | ||
1458 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { | 1114 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { |
1459 | tape->merge_bh_size = 0; | 1115 | tape->valid = 0; |
1460 | if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) | 1116 | if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) |
1461 | ++count; | 1117 | ++count; |
1462 | ide_tape_discard_merge_buffer(drive, 0); | 1118 | ide_tape_discard_merge_buffer(drive, 0); |
@@ -1505,9 +1161,9 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf, | |||
1505 | { | 1161 | { |
1506 | struct ide_tape_obj *tape = file->private_data; | 1162 | struct ide_tape_obj *tape = file->private_data; |
1507 | ide_drive_t *drive = tape->drive; | 1163 | ide_drive_t *drive = tape->drive; |
1508 | ssize_t bytes_read, temp, actually_read = 0, rc; | 1164 | size_t done = 0; |
1509 | ssize_t ret = 0; | 1165 | ssize_t ret = 0; |
1510 | u16 ctl = *(u16 *)&tape->caps[12]; | 1166 | int rc; |
1511 | 1167 | ||
1512 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 1168 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
1513 | 1169 | ||
@@ -1517,49 +1173,43 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf, | |||
1517 | (count % tape->blk_size) == 0) | 1173 | (count % tape->blk_size) == 0) |
1518 | tape->user_bs_factor = count / tape->blk_size; | 1174 | tape->user_bs_factor = count / tape->blk_size; |
1519 | } | 1175 | } |
1520 | rc = idetape_init_read(drive); | 1176 | |
1177 | rc = idetape_init_rw(drive, IDETAPE_DIR_READ); | ||
1521 | if (rc < 0) | 1178 | if (rc < 0) |
1522 | return rc; | 1179 | return rc; |
1523 | if (count == 0) | 1180 | |
1524 | return (0); | 1181 | while (done < count) { |
1525 | if (tape->merge_bh_size) { | 1182 | size_t todo; |
1526 | actually_read = min((unsigned int)(tape->merge_bh_size), | 1183 | |
1527 | (unsigned int)count); | 1184 | /* refill if staging buffer is empty */ |
1528 | if (idetape_copy_stage_to_user(tape, buf, actually_read)) | 1185 | if (!tape->valid) { |
1529 | ret = -EFAULT; | 1186 | /* If we are at a filemark, nothing more to read */ |
1530 | buf += actually_read; | 1187 | if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) |
1531 | tape->merge_bh_size -= actually_read; | 1188 | break; |
1532 | count -= actually_read; | 1189 | /* read */ |
1533 | } | 1190 | if (idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, |
1534 | while (count >= tape->buffer_size) { | 1191 | tape->buffer_size) <= 0) |
1535 | bytes_read = idetape_add_chrdev_read_request(drive, ctl); | 1192 | break; |
1536 | if (bytes_read <= 0) | 1193 | } |
1537 | goto finish; | 1194 | |
1538 | if (idetape_copy_stage_to_user(tape, buf, bytes_read)) | 1195 | /* copy out */ |
1539 | ret = -EFAULT; | 1196 | todo = min_t(size_t, count - done, tape->valid); |
1540 | buf += bytes_read; | 1197 | if (copy_to_user(buf + done, tape->cur, todo)) |
1541 | count -= bytes_read; | ||
1542 | actually_read += bytes_read; | ||
1543 | } | ||
1544 | if (count) { | ||
1545 | bytes_read = idetape_add_chrdev_read_request(drive, ctl); | ||
1546 | if (bytes_read <= 0) | ||
1547 | goto finish; | ||
1548 | temp = min((unsigned long)count, (unsigned long)bytes_read); | ||
1549 | if (idetape_copy_stage_to_user(tape, buf, temp)) | ||
1550 | ret = -EFAULT; | 1198 | ret = -EFAULT; |
1551 | actually_read += temp; | 1199 | |
1552 | tape->merge_bh_size = bytes_read-temp; | 1200 | tape->cur += todo; |
1201 | tape->valid -= todo; | ||
1202 | done += todo; | ||
1553 | } | 1203 | } |
1554 | finish: | 1204 | |
1555 | if (!actually_read && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) { | 1205 | if (!done && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) { |
1556 | debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name); | 1206 | debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name); |
1557 | 1207 | ||
1558 | idetape_space_over_filemarks(drive, MTFSF, 1); | 1208 | idetape_space_over_filemarks(drive, MTFSF, 1); |
1559 | return 0; | 1209 | return 0; |
1560 | } | 1210 | } |
1561 | 1211 | ||
1562 | return ret ? ret : actually_read; | 1212 | return ret ? ret : done; |
1563 | } | 1213 | } |
1564 | 1214 | ||
1565 | static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf, | 1215 | static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf, |
@@ -1567,9 +1217,9 @@ static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf, | |||
1567 | { | 1217 | { |
1568 | struct ide_tape_obj *tape = file->private_data; | 1218 | struct ide_tape_obj *tape = file->private_data; |
1569 | ide_drive_t *drive = tape->drive; | 1219 | ide_drive_t *drive = tape->drive; |
1570 | ssize_t actually_written = 0; | 1220 | size_t done = 0; |
1571 | ssize_t ret = 0; | 1221 | ssize_t ret = 0; |
1572 | u16 ctl = *(u16 *)&tape->caps[12]; | 1222 | int rc; |
1573 | 1223 | ||
1574 | /* The drive is write protected. */ | 1224 | /* The drive is write protected. */ |
1575 | if (tape->write_prot) | 1225 | if (tape->write_prot) |
@@ -1578,80 +1228,31 @@ static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf, | |||
1578 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 1228 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
1579 | 1229 | ||
1580 | /* Initialize write operation */ | 1230 | /* Initialize write operation */ |
1581 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { | 1231 | rc = idetape_init_rw(drive, IDETAPE_DIR_WRITE); |
1582 | if (tape->chrdev_dir == IDETAPE_DIR_READ) | 1232 | if (rc < 0) |
1583 | ide_tape_discard_merge_buffer(drive, 1); | 1233 | return rc; |
1584 | if (tape->merge_bh || tape->merge_bh_size) { | ||
1585 | printk(KERN_ERR "ide-tape: merge_bh_size " | ||
1586 | "should be 0 now\n"); | ||
1587 | tape->merge_bh_size = 0; | ||
1588 | } | ||
1589 | tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0); | ||
1590 | if (!tape->merge_bh) | ||
1591 | return -ENOMEM; | ||
1592 | tape->chrdev_dir = IDETAPE_DIR_WRITE; | ||
1593 | idetape_init_merge_buffer(tape); | ||
1594 | 1234 | ||
1595 | /* | 1235 | while (done < count) { |
1596 | * Issue a write 0 command to ensure that DSC handshake is | 1236 | size_t todo; |
1597 | * switched from completion mode to buffer available mode. No | 1237 | |
1598 | * point in issuing this if DSC overlap isn't supported, some | 1238 | /* flush if staging buffer is full */ |
1599 | * drives (Seagate STT3401A) will return an error. | 1239 | if (tape->valid == tape->buffer_size && |
1600 | */ | 1240 | idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, |
1601 | if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) { | 1241 | tape->buffer_size) <= 0) |
1602 | ssize_t retval = idetape_queue_rw_tail(drive, | 1242 | return rc; |
1603 | REQ_IDETAPE_WRITE, 0, | 1243 | |
1604 | tape->merge_bh); | 1244 | /* copy in */ |
1605 | if (retval < 0) { | 1245 | todo = min_t(size_t, count - done, |
1606 | ide_tape_kfree_buffer(tape); | 1246 | tape->buffer_size - tape->valid); |
1607 | tape->merge_bh = NULL; | 1247 | if (copy_from_user(tape->cur, buf + done, todo)) |
1608 | tape->chrdev_dir = IDETAPE_DIR_NONE; | ||
1609 | return retval; | ||
1610 | } | ||
1611 | } | ||
1612 | } | ||
1613 | if (count == 0) | ||
1614 | return (0); | ||
1615 | if (tape->merge_bh_size) { | ||
1616 | if (tape->merge_bh_size >= tape->buffer_size) { | ||
1617 | printk(KERN_ERR "ide-tape: bug: merge buf too big\n"); | ||
1618 | tape->merge_bh_size = 0; | ||
1619 | } | ||
1620 | actually_written = min((unsigned int) | ||
1621 | (tape->buffer_size - tape->merge_bh_size), | ||
1622 | (unsigned int)count); | ||
1623 | if (idetape_copy_stage_from_user(tape, buf, actually_written)) | ||
1624 | ret = -EFAULT; | ||
1625 | buf += actually_written; | ||
1626 | tape->merge_bh_size += actually_written; | ||
1627 | count -= actually_written; | ||
1628 | |||
1629 | if (tape->merge_bh_size == tape->buffer_size) { | ||
1630 | ssize_t retval; | ||
1631 | tape->merge_bh_size = 0; | ||
1632 | retval = idetape_add_chrdev_write_request(drive, ctl); | ||
1633 | if (retval <= 0) | ||
1634 | return (retval); | ||
1635 | } | ||
1636 | } | ||
1637 | while (count >= tape->buffer_size) { | ||
1638 | ssize_t retval; | ||
1639 | if (idetape_copy_stage_from_user(tape, buf, tape->buffer_size)) | ||
1640 | ret = -EFAULT; | ||
1641 | buf += tape->buffer_size; | ||
1642 | count -= tape->buffer_size; | ||
1643 | retval = idetape_add_chrdev_write_request(drive, ctl); | ||
1644 | actually_written += tape->buffer_size; | ||
1645 | if (retval <= 0) | ||
1646 | return (retval); | ||
1647 | } | ||
1648 | if (count) { | ||
1649 | actually_written += count; | ||
1650 | if (idetape_copy_stage_from_user(tape, buf, count)) | ||
1651 | ret = -EFAULT; | 1248 | ret = -EFAULT; |
1652 | tape->merge_bh_size += count; | 1249 | |
1250 | tape->cur += todo; | ||
1251 | tape->valid += todo; | ||
1252 | done += todo; | ||
1653 | } | 1253 | } |
1654 | return ret ? ret : actually_written; | 1254 | |
1255 | return ret ? ret : done; | ||
1655 | } | 1256 | } |
1656 | 1257 | ||
1657 | static int idetape_write_filemark(ide_drive_t *drive) | 1258 | static int idetape_write_filemark(ide_drive_t *drive) |
@@ -1812,7 +1413,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
1812 | idetape_flush_tape_buffers(drive); | 1413 | idetape_flush_tape_buffers(drive); |
1813 | } | 1414 | } |
1814 | if (cmd == MTIOCGET || cmd == MTIOCPOS) { | 1415 | if (cmd == MTIOCGET || cmd == MTIOCPOS) { |
1815 | block_offset = tape->merge_bh_size / | 1416 | block_offset = tape->valid / |
1816 | (tape->blk_size * tape->user_bs_factor); | 1417 | (tape->blk_size * tape->user_bs_factor); |
1817 | position = idetape_read_position(drive); | 1418 | position = idetape_read_position(drive); |
1818 | if (position < 0) | 1419 | if (position < 0) |
@@ -1960,12 +1561,12 @@ static void idetape_write_release(ide_drive_t *drive, unsigned int minor) | |||
1960 | idetape_tape_t *tape = drive->driver_data; | 1561 | idetape_tape_t *tape = drive->driver_data; |
1961 | 1562 | ||
1962 | ide_tape_flush_merge_buffer(drive); | 1563 | ide_tape_flush_merge_buffer(drive); |
1963 | tape->merge_bh = ide_tape_kmalloc_buffer(tape, 1, 0); | 1564 | tape->buf = kmalloc(tape->buffer_size, GFP_KERNEL); |
1964 | if (tape->merge_bh != NULL) { | 1565 | if (tape->buf != NULL) { |
1965 | idetape_pad_zeros(drive, tape->blk_size * | 1566 | idetape_pad_zeros(drive, tape->blk_size * |
1966 | (tape->user_bs_factor - 1)); | 1567 | (tape->user_bs_factor - 1)); |
1967 | ide_tape_kfree_buffer(tape); | 1568 | kfree(tape->buf); |
1968 | tape->merge_bh = NULL; | 1569 | tape->buf = NULL; |
1969 | } | 1570 | } |
1970 | idetape_write_filemark(drive); | 1571 | idetape_write_filemark(drive); |
1971 | idetape_flush_tape_buffers(drive); | 1572 | idetape_flush_tape_buffers(drive); |
@@ -2159,8 +1760,6 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
2159 | u16 *ctl = (u16 *)&tape->caps[12]; | 1760 | u16 *ctl = (u16 *)&tape->caps[12]; |
2160 | 1761 | ||
2161 | drive->pc_callback = ide_tape_callback; | 1762 | drive->pc_callback = ide_tape_callback; |
2162 | drive->pc_update_buffers = idetape_update_buffers; | ||
2163 | drive->pc_io_buffers = ide_tape_io_buffers; | ||
2164 | 1763 | ||
2165 | drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP; | 1764 | drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP; |
2166 | 1765 | ||
@@ -2191,11 +1790,6 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
2191 | tape->buffer_size = *ctl * tape->blk_size; | 1790 | tape->buffer_size = *ctl * tape->blk_size; |
2192 | } | 1791 | } |
2193 | buffer_size = tape->buffer_size; | 1792 | buffer_size = tape->buffer_size; |
2194 | tape->pages_per_buffer = buffer_size / PAGE_SIZE; | ||
2195 | if (buffer_size % PAGE_SIZE) { | ||
2196 | tape->pages_per_buffer++; | ||
2197 | tape->excess_bh_size = PAGE_SIZE - buffer_size % PAGE_SIZE; | ||
2198 | } | ||
2199 | 1793 | ||
2200 | /* select the "best" DSC read/write polling freq */ | 1794 | /* select the "best" DSC read/write polling freq */ |
2201 | speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]); | 1795 | speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]); |
@@ -2238,7 +1832,7 @@ static void ide_tape_release(struct device *dev) | |||
2238 | ide_drive_t *drive = tape->drive; | 1832 | ide_drive_t *drive = tape->drive; |
2239 | struct gendisk *g = tape->disk; | 1833 | struct gendisk *g = tape->disk; |
2240 | 1834 | ||
2241 | BUG_ON(tape->merge_bh_size); | 1835 | BUG_ON(tape->valid); |
2242 | 1836 | ||
2243 | drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; | 1837 | drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; |
2244 | drive->driver_data = NULL; | 1838 | drive->driver_data = NULL; |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 4aa6223c11be..8cab3c26acda 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -166,7 +166,7 @@ static ide_startstop_t task_no_data_intr(ide_drive_t *drive) | |||
166 | if (!OK_STAT(stat, ATA_DRDY, BAD_STAT)) { | 166 | if (!OK_STAT(stat, ATA_DRDY, BAD_STAT)) { |
167 | if (custom && tf->command == ATA_CMD_SET_MULTI) { | 167 | if (custom && tf->command == ATA_CMD_SET_MULTI) { |
168 | drive->mult_req = drive->mult_count = 0; | 168 | drive->mult_req = drive->mult_count = 0; |
169 | drive->special.b.recalibrate = 1; | 169 | drive->special_flags |= IDE_SFLAG_RECALIBRATE; |
170 | (void)ide_dump_status(drive, __func__, stat); | 170 | (void)ide_dump_status(drive, __func__, stat); |
171 | return ide_stopped; | 171 | return ide_stopped; |
172 | } else if (custom && tf->command == ATA_CMD_INIT_DEV_PARAMS) { | 172 | } else if (custom && tf->command == ATA_CMD_INIT_DEV_PARAMS) { |
@@ -424,7 +424,9 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, | |||
424 | 424 | ||
425 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | 425 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); |
426 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 426 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
427 | rq->buffer = buf; | 427 | |
428 | if (cmd->tf_flags & IDE_TFLAG_WRITE) | ||
429 | rq->cmd_flags |= REQ_RW; | ||
428 | 430 | ||
429 | /* | 431 | /* |
430 | * (ks) We transfer currently only whole sectors. | 432 | * (ks) We transfer currently only whole sectors. |
@@ -432,18 +434,20 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, | |||
432 | * if we would find a solution to transfer any size. | 434 | * if we would find a solution to transfer any size. |
433 | * To support special commands like READ LONG. | 435 | * To support special commands like READ LONG. |
434 | */ | 436 | */ |
435 | rq->hard_nr_sectors = rq->nr_sectors = nsect; | 437 | if (nsect) { |
436 | rq->hard_cur_sectors = rq->current_nr_sectors = nsect; | 438 | error = blk_rq_map_kern(drive->queue, rq, buf, |
437 | 439 | nsect * SECTOR_SIZE, __GFP_WAIT); | |
438 | if (cmd->tf_flags & IDE_TFLAG_WRITE) | 440 | if (error) |
439 | rq->cmd_flags |= REQ_RW; | 441 | goto put_req; |
442 | } | ||
440 | 443 | ||
441 | rq->special = cmd; | 444 | rq->special = cmd; |
442 | cmd->rq = rq; | 445 | cmd->rq = rq; |
443 | 446 | ||
444 | error = blk_execute_rq(drive->queue, NULL, rq, 0); | 447 | error = blk_execute_rq(drive->queue, NULL, rq, 0); |
445 | blk_put_request(rq); | ||
446 | 448 | ||
449 | put_req: | ||
450 | blk_put_request(rq); | ||
447 | return error; | 451 | return error; |
448 | } | 452 | } |
449 | 453 | ||
diff --git a/drivers/ide/ide_platform.c b/drivers/ide/ide_platform.c index 051b4ab0f359..ee9b55ecc62b 100644 --- a/drivers/ide/ide_platform.c +++ b/drivers/ide/ide_platform.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | 23 | ||
24 | static void __devinit plat_ide_setup_ports(hw_regs_t *hw, | 24 | static void __devinit plat_ide_setup_ports(struct ide_hw *hw, |
25 | void __iomem *base, | 25 | void __iomem *base, |
26 | void __iomem *ctrl, | 26 | void __iomem *ctrl, |
27 | struct pata_platform_info *pdata, | 27 | struct pata_platform_info *pdata, |
@@ -40,12 +40,11 @@ static void __devinit plat_ide_setup_ports(hw_regs_t *hw, | |||
40 | hw->io_ports.ctl_addr = (unsigned long)ctrl; | 40 | hw->io_ports.ctl_addr = (unsigned long)ctrl; |
41 | 41 | ||
42 | hw->irq = irq; | 42 | hw->irq = irq; |
43 | |||
44 | hw->chipset = ide_generic; | ||
45 | } | 43 | } |
46 | 44 | ||
47 | static const struct ide_port_info platform_ide_port_info = { | 45 | static const struct ide_port_info platform_ide_port_info = { |
48 | .host_flags = IDE_HFLAG_NO_DMA, | 46 | .host_flags = IDE_HFLAG_NO_DMA, |
47 | .chipset = ide_generic, | ||
49 | }; | 48 | }; |
50 | 49 | ||
51 | static int __devinit plat_ide_probe(struct platform_device *pdev) | 50 | static int __devinit plat_ide_probe(struct platform_device *pdev) |
@@ -55,7 +54,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) | |||
55 | struct pata_platform_info *pdata; | 54 | struct pata_platform_info *pdata; |
56 | struct ide_host *host; | 55 | struct ide_host *host; |
57 | int ret = 0, mmio = 0; | 56 | int ret = 0, mmio = 0; |
58 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 57 | struct ide_hw hw, *hws[] = { &hw }; |
59 | struct ide_port_info d = platform_ide_port_info; | 58 | struct ide_port_info d = platform_ide_port_info; |
60 | 59 | ||
61 | pdata = pdev->dev.platform_data; | 60 | pdata = pdev->dev.platform_data; |
@@ -99,7 +98,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) | |||
99 | if (mmio) | 98 | if (mmio) |
100 | d.host_flags |= IDE_HFLAG_MMIO; | 99 | d.host_flags |= IDE_HFLAG_MMIO; |
101 | 100 | ||
102 | ret = ide_host_add(&d, hws, &host); | 101 | ret = ide_host_add(&d, hws, 1, &host); |
103 | if (ret) | 102 | if (ret) |
104 | goto out; | 103 | goto out; |
105 | 104 | ||
diff --git a/drivers/ide/macide.c b/drivers/ide/macide.c index 4b1718e83283..1447c8c90565 100644 --- a/drivers/ide/macide.c +++ b/drivers/ide/macide.c | |||
@@ -62,7 +62,7 @@ int macide_ack_intr(ide_hwif_t* hwif) | |||
62 | return 0; | 62 | return 0; |
63 | } | 63 | } |
64 | 64 | ||
65 | static void __init macide_setup_ports(hw_regs_t *hw, unsigned long base, | 65 | static void __init macide_setup_ports(struct ide_hw *hw, unsigned long base, |
66 | int irq, ide_ack_intr_t *ack_intr) | 66 | int irq, ide_ack_intr_t *ack_intr) |
67 | { | 67 | { |
68 | int i; | 68 | int i; |
@@ -76,13 +76,12 @@ static void __init macide_setup_ports(hw_regs_t *hw, unsigned long base, | |||
76 | 76 | ||
77 | hw->irq = irq; | 77 | hw->irq = irq; |
78 | hw->ack_intr = ack_intr; | 78 | hw->ack_intr = ack_intr; |
79 | |||
80 | hw->chipset = ide_generic; | ||
81 | } | 79 | } |
82 | 80 | ||
83 | static const struct ide_port_info macide_port_info = { | 81 | static const struct ide_port_info macide_port_info = { |
84 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 82 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
85 | .irq_flags = IRQF_SHARED, | 83 | .irq_flags = IRQF_SHARED, |
84 | .chipset = ide_generic, | ||
86 | }; | 85 | }; |
87 | 86 | ||
88 | static const char *mac_ide_name[] = | 87 | static const char *mac_ide_name[] = |
@@ -97,7 +96,7 @@ static int __init macide_init(void) | |||
97 | ide_ack_intr_t *ack_intr; | 96 | ide_ack_intr_t *ack_intr; |
98 | unsigned long base; | 97 | unsigned long base; |
99 | int irq; | 98 | int irq; |
100 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 99 | struct ide_hw hw, *hws[] = { &hw }; |
101 | 100 | ||
102 | if (!MACH_IS_MAC) | 101 | if (!MACH_IS_MAC) |
103 | return -ENODEV; | 102 | return -ENODEV; |
@@ -127,7 +126,7 @@ static int __init macide_init(void) | |||
127 | 126 | ||
128 | macide_setup_ports(&hw, base, irq, ack_intr); | 127 | macide_setup_ports(&hw, base, irq, ack_intr); |
129 | 128 | ||
130 | return ide_host_add(&macide_port_info, hws, NULL); | 129 | return ide_host_add(&macide_port_info, hws, 1, NULL); |
131 | } | 130 | } |
132 | 131 | ||
133 | module_init(macide_init); | 132 | module_init(macide_init); |
diff --git a/drivers/ide/palm_bk3710.c b/drivers/ide/palm_bk3710.c index 09d813d313f4..3c1dc0152153 100644 --- a/drivers/ide/palm_bk3710.c +++ b/drivers/ide/palm_bk3710.c | |||
@@ -306,6 +306,7 @@ static struct ide_port_info __devinitdata palm_bk3710_port_info = { | |||
306 | .host_flags = IDE_HFLAG_MMIO, | 306 | .host_flags = IDE_HFLAG_MMIO, |
307 | .pio_mask = ATA_PIO4, | 307 | .pio_mask = ATA_PIO4, |
308 | .mwdma_mask = ATA_MWDMA2, | 308 | .mwdma_mask = ATA_MWDMA2, |
309 | .chipset = ide_palm3710, | ||
309 | }; | 310 | }; |
310 | 311 | ||
311 | static int __init palm_bk3710_probe(struct platform_device *pdev) | 312 | static int __init palm_bk3710_probe(struct platform_device *pdev) |
@@ -315,7 +316,7 @@ static int __init palm_bk3710_probe(struct platform_device *pdev) | |||
315 | void __iomem *base; | 316 | void __iomem *base; |
316 | unsigned long rate, mem_size; | 317 | unsigned long rate, mem_size; |
317 | int i, rc; | 318 | int i, rc; |
318 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 319 | struct ide_hw hw, *hws[] = { &hw }; |
319 | 320 | ||
320 | clk = clk_get(&pdev->dev, "IDECLK"); | 321 | clk = clk_get(&pdev->dev, "IDECLK"); |
321 | if (IS_ERR(clk)) | 322 | if (IS_ERR(clk)) |
@@ -363,13 +364,12 @@ static int __init palm_bk3710_probe(struct platform_device *pdev) | |||
363 | (base + IDE_PALM_ATA_PRI_CTL_OFFSET); | 364 | (base + IDE_PALM_ATA_PRI_CTL_OFFSET); |
364 | hw.irq = irq->start; | 365 | hw.irq = irq->start; |
365 | hw.dev = &pdev->dev; | 366 | hw.dev = &pdev->dev; |
366 | hw.chipset = ide_palm3710; | ||
367 | 367 | ||
368 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : | 368 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : |
369 | ATA_UDMA5; | 369 | ATA_UDMA5; |
370 | 370 | ||
371 | /* Register the IDE interface with Linux */ | 371 | /* Register the IDE interface with Linux */ |
372 | rc = ide_host_add(&palm_bk3710_port_info, hws, NULL); | 372 | rc = ide_host_add(&palm_bk3710_port_info, hws, 1, NULL); |
373 | if (rc) | 373 | if (rc) |
374 | goto out; | 374 | goto out; |
375 | 375 | ||
diff --git a/drivers/ide/pmac.c b/drivers/ide/pmac.c index f76e4e6b408f..97642a7a79c4 100644 --- a/drivers/ide/pmac.c +++ b/drivers/ide/pmac.c | |||
@@ -1023,13 +1023,14 @@ static const struct ide_port_info pmac_port_info = { | |||
1023 | * Setup, register & probe an IDE channel driven by this driver, this is | 1023 | * Setup, register & probe an IDE channel driven by this driver, this is |
1024 | * called by one of the 2 probe functions (macio or PCI). | 1024 | * called by one of the 2 probe functions (macio or PCI). |
1025 | */ | 1025 | */ |
1026 | static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw) | 1026 | static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, |
1027 | struct ide_hw *hw) | ||
1027 | { | 1028 | { |
1028 | struct device_node *np = pmif->node; | 1029 | struct device_node *np = pmif->node; |
1029 | const int *bidp; | 1030 | const int *bidp; |
1030 | struct ide_host *host; | 1031 | struct ide_host *host; |
1031 | ide_hwif_t *hwif; | 1032 | ide_hwif_t *hwif; |
1032 | hw_regs_t *hws[] = { hw, NULL, NULL, NULL }; | 1033 | struct ide_hw *hws[] = { hw }; |
1033 | struct ide_port_info d = pmac_port_info; | 1034 | struct ide_port_info d = pmac_port_info; |
1034 | int rc; | 1035 | int rc; |
1035 | 1036 | ||
@@ -1077,7 +1078,7 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw) | |||
1077 | /* Make sure we have sane timings */ | 1078 | /* Make sure we have sane timings */ |
1078 | sanitize_timings(pmif); | 1079 | sanitize_timings(pmif); |
1079 | 1080 | ||
1080 | host = ide_host_alloc(&d, hws); | 1081 | host = ide_host_alloc(&d, hws, 1); |
1081 | if (host == NULL) | 1082 | if (host == NULL) |
1082 | return -ENOMEM; | 1083 | return -ENOMEM; |
1083 | hwif = host->ports[0]; | 1084 | hwif = host->ports[0]; |
@@ -1124,7 +1125,7 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw) | |||
1124 | return 0; | 1125 | return 0; |
1125 | } | 1126 | } |
1126 | 1127 | ||
1127 | static void __devinit pmac_ide_init_ports(hw_regs_t *hw, unsigned long base) | 1128 | static void __devinit pmac_ide_init_ports(struct ide_hw *hw, unsigned long base) |
1128 | { | 1129 | { |
1129 | int i; | 1130 | int i; |
1130 | 1131 | ||
@@ -1144,7 +1145,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1144 | unsigned long regbase; | 1145 | unsigned long regbase; |
1145 | pmac_ide_hwif_t *pmif; | 1146 | pmac_ide_hwif_t *pmif; |
1146 | int irq, rc; | 1147 | int irq, rc; |
1147 | hw_regs_t hw; | 1148 | struct ide_hw hw; |
1148 | 1149 | ||
1149 | pmif = kzalloc(sizeof(*pmif), GFP_KERNEL); | 1150 | pmif = kzalloc(sizeof(*pmif), GFP_KERNEL); |
1150 | if (pmif == NULL) | 1151 | if (pmif == NULL) |
@@ -1268,7 +1269,7 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1268 | void __iomem *base; | 1269 | void __iomem *base; |
1269 | unsigned long rbase, rlen; | 1270 | unsigned long rbase, rlen; |
1270 | int rc; | 1271 | int rc; |
1271 | hw_regs_t hw; | 1272 | struct ide_hw hw; |
1272 | 1273 | ||
1273 | np = pci_device_to_OF_node(pdev); | 1274 | np = pci_device_to_OF_node(pdev); |
1274 | if (np == NULL) { | 1275 | if (np == NULL) { |
diff --git a/drivers/ide/q40ide.c b/drivers/ide/q40ide.c index c79346679244..ab49a97023d9 100644 --- a/drivers/ide/q40ide.c +++ b/drivers/ide/q40ide.c | |||
@@ -51,11 +51,11 @@ static int q40ide_default_irq(unsigned long base) | |||
51 | /* | 51 | /* |
52 | * Addresses are pretranslated for Q40 ISA access. | 52 | * Addresses are pretranslated for Q40 ISA access. |
53 | */ | 53 | */ |
54 | static void q40_ide_setup_ports(hw_regs_t *hw, unsigned long base, | 54 | static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, |
55 | ide_ack_intr_t *ack_intr, | 55 | ide_ack_intr_t *ack_intr, |
56 | int irq) | 56 | int irq) |
57 | { | 57 | { |
58 | memset(hw, 0, sizeof(hw_regs_t)); | 58 | memset(hw, 0, sizeof(*hw)); |
59 | /* BIG FAT WARNING: | 59 | /* BIG FAT WARNING: |
60 | assumption: only DATA port is ever used in 16 bit mode */ | 60 | assumption: only DATA port is ever used in 16 bit mode */ |
61 | hw->io_ports.data_addr = Q40_ISA_IO_W(base); | 61 | hw->io_ports.data_addr = Q40_ISA_IO_W(base); |
@@ -70,8 +70,6 @@ static void q40_ide_setup_ports(hw_regs_t *hw, unsigned long base, | |||
70 | 70 | ||
71 | hw->irq = irq; | 71 | hw->irq = irq; |
72 | hw->ack_intr = ack_intr; | 72 | hw->ack_intr = ack_intr; |
73 | |||
74 | hw->chipset = ide_generic; | ||
75 | } | 73 | } |
76 | 74 | ||
77 | static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, | 75 | static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, |
@@ -119,6 +117,7 @@ static const struct ide_port_info q40ide_port_info = { | |||
119 | .tp_ops = &q40ide_tp_ops, | 117 | .tp_ops = &q40ide_tp_ops, |
120 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 118 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
121 | .irq_flags = IRQF_SHARED, | 119 | .irq_flags = IRQF_SHARED, |
120 | .chipset = ide_generic, | ||
122 | }; | 121 | }; |
123 | 122 | ||
124 | /* | 123 | /* |
@@ -136,7 +135,7 @@ static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={ | |||
136 | static int __init q40ide_init(void) | 135 | static int __init q40ide_init(void) |
137 | { | 136 | { |
138 | int i; | 137 | int i; |
139 | hw_regs_t hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; | 138 | struct ide_hw hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL }; |
140 | 139 | ||
141 | if (!MACH_IS_Q40) | 140 | if (!MACH_IS_Q40) |
142 | return -ENODEV; | 141 | return -ENODEV; |
@@ -163,7 +162,7 @@ static int __init q40ide_init(void) | |||
163 | hws[i] = &hw[i]; | 162 | hws[i] = &hw[i]; |
164 | } | 163 | } |
165 | 164 | ||
166 | return ide_host_add(&q40ide_port_info, hws, NULL); | 165 | return ide_host_add(&q40ide_port_info, hws, Q40IDE_NUM_HWIFS, NULL); |
167 | } | 166 | } |
168 | 167 | ||
169 | module_init(q40ide_init); | 168 | module_init(q40ide_init); |
diff --git a/drivers/ide/rapide.c b/drivers/ide/rapide.c index d5003ca69801..00f54248f41f 100644 --- a/drivers/ide/rapide.c +++ b/drivers/ide/rapide.c | |||
@@ -13,9 +13,10 @@ | |||
13 | 13 | ||
14 | static const struct ide_port_info rapide_port_info = { | 14 | static const struct ide_port_info rapide_port_info = { |
15 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | 15 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, |
16 | .chipset = ide_generic, | ||
16 | }; | 17 | }; |
17 | 18 | ||
18 | static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base, | 19 | static void rapide_setup_ports(struct ide_hw *hw, void __iomem *base, |
19 | void __iomem *ctrl, unsigned int sz, int irq) | 20 | void __iomem *ctrl, unsigned int sz, int irq) |
20 | { | 21 | { |
21 | unsigned long port = (unsigned long)base; | 22 | unsigned long port = (unsigned long)base; |
@@ -35,7 +36,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
35 | void __iomem *base; | 36 | void __iomem *base; |
36 | struct ide_host *host; | 37 | struct ide_host *host; |
37 | int ret; | 38 | int ret; |
38 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 39 | struct ide_hw hw, *hws[] = { &hw }; |
39 | 40 | ||
40 | ret = ecard_request_resources(ec); | 41 | ret = ecard_request_resources(ec); |
41 | if (ret) | 42 | if (ret) |
@@ -49,10 +50,9 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
49 | 50 | ||
50 | memset(&hw, 0, sizeof(hw)); | 51 | memset(&hw, 0, sizeof(hw)); |
51 | rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); | 52 | rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); |
52 | hw.chipset = ide_generic; | ||
53 | hw.dev = &ec->dev; | 53 | hw.dev = &ec->dev; |
54 | 54 | ||
55 | ret = ide_host_add(&rapide_port_info, hws, &host); | 55 | ret = ide_host_add(&rapide_port_info, hws, 1, &host); |
56 | if (ret) | 56 | if (ret) |
57 | goto release; | 57 | goto release; |
58 | 58 | ||
diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 5be41f25204f..1104bb301eb9 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c | |||
@@ -559,7 +559,7 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev, | |||
559 | { | 559 | { |
560 | struct scc_ports *ports = pci_get_drvdata(dev); | 560 | struct scc_ports *ports = pci_get_drvdata(dev); |
561 | struct ide_host *host; | 561 | struct ide_host *host; |
562 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 562 | struct ide_hw hw, *hws[] = { &hw }; |
563 | int i, rc; | 563 | int i, rc; |
564 | 564 | ||
565 | memset(&hw, 0, sizeof(hw)); | 565 | memset(&hw, 0, sizeof(hw)); |
@@ -567,9 +567,8 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev, | |||
567 | hw.io_ports_array[i] = ports->dma + 0x20 + i * 4; | 567 | hw.io_ports_array[i] = ports->dma + 0x20 + i * 4; |
568 | hw.irq = dev->irq; | 568 | hw.irq = dev->irq; |
569 | hw.dev = &dev->dev; | 569 | hw.dev = &dev->dev; |
570 | hw.chipset = ide_pci; | ||
571 | 570 | ||
572 | rc = ide_host_add(d, hws, &host); | 571 | rc = ide_host_add(d, hws, 1, &host); |
573 | if (rc) | 572 | if (rc) |
574 | return rc; | 573 | return rc; |
575 | 574 | ||
@@ -823,6 +822,7 @@ static const struct ide_port_info scc_chipset __devinitdata = { | |||
823 | .host_flags = IDE_HFLAG_SINGLE, | 822 | .host_flags = IDE_HFLAG_SINGLE, |
824 | .irq_flags = IRQF_SHARED, | 823 | .irq_flags = IRQF_SHARED, |
825 | .pio_mask = ATA_PIO4, | 824 | .pio_mask = ATA_PIO4, |
825 | .chipset = ide_pci, | ||
826 | }; | 826 | }; |
827 | 827 | ||
828 | /** | 828 | /** |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 7a3a12d6e638..5314edffc303 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -301,11 +301,11 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info * | |||
301 | } | 301 | } |
302 | 302 | ||
303 | /** | 303 | /** |
304 | * ide_hw_configure - configure a hw_regs_t instance | 304 | * ide_hw_configure - configure a struct ide_hw instance |
305 | * @dev: PCI device holding interface | 305 | * @dev: PCI device holding interface |
306 | * @d: IDE port info | 306 | * @d: IDE port info |
307 | * @port: port number | 307 | * @port: port number |
308 | * @hw: hw_regs_t instance corresponding to this port | 308 | * @hw: struct ide_hw instance corresponding to this port |
309 | * | 309 | * |
310 | * Perform the initial set up for the hardware interface structure. This | 310 | * Perform the initial set up for the hardware interface structure. This |
311 | * is done per interface port rather than per PCI device. There may be | 311 | * is done per interface port rather than per PCI device. There may be |
@@ -315,7 +315,7 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info * | |||
315 | */ | 315 | */ |
316 | 316 | ||
317 | static int ide_hw_configure(struct pci_dev *dev, const struct ide_port_info *d, | 317 | static int ide_hw_configure(struct pci_dev *dev, const struct ide_port_info *d, |
318 | unsigned int port, hw_regs_t *hw) | 318 | unsigned int port, struct ide_hw *hw) |
319 | { | 319 | { |
320 | unsigned long ctl = 0, base = 0; | 320 | unsigned long ctl = 0, base = 0; |
321 | 321 | ||
@@ -344,7 +344,6 @@ static int ide_hw_configure(struct pci_dev *dev, const struct ide_port_info *d, | |||
344 | 344 | ||
345 | memset(hw, 0, sizeof(*hw)); | 345 | memset(hw, 0, sizeof(*hw)); |
346 | hw->dev = &dev->dev; | 346 | hw->dev = &dev->dev; |
347 | hw->chipset = d->chipset ? d->chipset : ide_pci; | ||
348 | ide_std_init_ports(hw, base, ctl | 2); | 347 | ide_std_init_ports(hw, base, ctl | 2); |
349 | 348 | ||
350 | return 0; | 349 | return 0; |
@@ -446,8 +445,8 @@ out: | |||
446 | * ide_pci_setup_ports - configure ports/devices on PCI IDE | 445 | * ide_pci_setup_ports - configure ports/devices on PCI IDE |
447 | * @dev: PCI device | 446 | * @dev: PCI device |
448 | * @d: IDE port info | 447 | * @d: IDE port info |
449 | * @hw: hw_regs_t instances corresponding to this PCI IDE device | 448 | * @hw: struct ide_hw instances corresponding to this PCI IDE device |
450 | * @hws: hw_regs_t pointers table to update | 449 | * @hws: struct ide_hw pointers table to update |
451 | * | 450 | * |
452 | * Scan the interfaces attached to this device and do any | 451 | * Scan the interfaces attached to this device and do any |
453 | * necessary per port setup. Attach the devices and ask the | 452 | * necessary per port setup. Attach the devices and ask the |
@@ -459,7 +458,7 @@ out: | |||
459 | */ | 458 | */ |
460 | 459 | ||
461 | void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, | 460 | void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, |
462 | hw_regs_t *hw, hw_regs_t **hws) | 461 | struct ide_hw *hw, struct ide_hw **hws) |
463 | { | 462 | { |
464 | int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port; | 463 | int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port; |
465 | u8 tmp; | 464 | u8 tmp; |
@@ -539,7 +538,7 @@ int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d, | |||
539 | void *priv) | 538 | void *priv) |
540 | { | 539 | { |
541 | struct ide_host *host; | 540 | struct ide_host *host; |
542 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; | 541 | struct ide_hw hw[2], *hws[] = { NULL, NULL }; |
543 | int ret; | 542 | int ret; |
544 | 543 | ||
545 | ret = ide_setup_pci_controller(dev, d, 1); | 544 | ret = ide_setup_pci_controller(dev, d, 1); |
@@ -548,7 +547,7 @@ int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d, | |||
548 | 547 | ||
549 | ide_pci_setup_ports(dev, d, &hw[0], &hws[0]); | 548 | ide_pci_setup_ports(dev, d, &hw[0], &hws[0]); |
550 | 549 | ||
551 | host = ide_host_alloc(d, hws); | 550 | host = ide_host_alloc(d, hws, 2); |
552 | if (host == NULL) { | 551 | if (host == NULL) { |
553 | ret = -ENOMEM; | 552 | ret = -ENOMEM; |
554 | goto out; | 553 | goto out; |
@@ -587,7 +586,7 @@ int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2, | |||
587 | struct pci_dev *pdev[] = { dev1, dev2 }; | 586 | struct pci_dev *pdev[] = { dev1, dev2 }; |
588 | struct ide_host *host; | 587 | struct ide_host *host; |
589 | int ret, i; | 588 | int ret, i; |
590 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; | 589 | struct ide_hw hw[4], *hws[] = { NULL, NULL, NULL, NULL }; |
591 | 590 | ||
592 | for (i = 0; i < 2; i++) { | 591 | for (i = 0; i < 2; i++) { |
593 | ret = ide_setup_pci_controller(pdev[i], d, !i); | 592 | ret = ide_setup_pci_controller(pdev[i], d, !i); |
@@ -597,7 +596,7 @@ int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2, | |||
597 | ide_pci_setup_ports(pdev[i], d, &hw[i*2], &hws[i*2]); | 596 | ide_pci_setup_ports(pdev[i], d, &hw[i*2], &hws[i*2]); |
598 | } | 597 | } |
599 | 598 | ||
600 | host = ide_host_alloc(d, hws); | 599 | host = ide_host_alloc(d, hws, 4); |
601 | if (host == NULL) { | 600 | if (host == NULL) { |
602 | ret = -ENOMEM; | 601 | ret = -ENOMEM; |
603 | goto out; | 602 | goto out; |
diff --git a/drivers/ide/sgiioc4.c b/drivers/ide/sgiioc4.c index e5d2a48a84de..5f37f168f944 100644 --- a/drivers/ide/sgiioc4.c +++ b/drivers/ide/sgiioc4.c | |||
@@ -91,7 +91,7 @@ typedef struct { | |||
91 | 91 | ||
92 | 92 | ||
93 | static void | 93 | static void |
94 | sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port, | 94 | sgiioc4_init_hwif_ports(struct ide_hw *hw, unsigned long data_port, |
95 | unsigned long ctrl_port, unsigned long irq_port) | 95 | unsigned long ctrl_port, unsigned long irq_port) |
96 | { | 96 | { |
97 | unsigned long reg = data_port; | 97 | unsigned long reg = data_port; |
@@ -546,7 +546,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
546 | unsigned long cmd_base, irqport; | 546 | unsigned long cmd_base, irqport; |
547 | unsigned long bar0, cmd_phys_base, ctl; | 547 | unsigned long bar0, cmd_phys_base, ctl; |
548 | void __iomem *virt_base; | 548 | void __iomem *virt_base; |
549 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 549 | struct ide_hw hw, *hws[] = { &hw }; |
550 | int rc; | 550 | int rc; |
551 | 551 | ||
552 | /* Get the CmdBlk and CtrlBlk Base Registers */ | 552 | /* Get the CmdBlk and CtrlBlk Base Registers */ |
@@ -575,13 +575,12 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
575 | memset(&hw, 0, sizeof(hw)); | 575 | memset(&hw, 0, sizeof(hw)); |
576 | sgiioc4_init_hwif_ports(&hw, cmd_base, ctl, irqport); | 576 | sgiioc4_init_hwif_ports(&hw, cmd_base, ctl, irqport); |
577 | hw.irq = dev->irq; | 577 | hw.irq = dev->irq; |
578 | hw.chipset = ide_pci; | ||
579 | hw.dev = &dev->dev; | 578 | hw.dev = &dev->dev; |
580 | 579 | ||
581 | /* Initializing chipset IRQ Registers */ | 580 | /* Initializing chipset IRQ Registers */ |
582 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); | 581 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); |
583 | 582 | ||
584 | rc = ide_host_add(&sgiioc4_port_info, hws, NULL); | 583 | rc = ide_host_add(&sgiioc4_port_info, hws, 1, NULL); |
585 | if (!rc) | 584 | if (!rc) |
586 | return 0; | 585 | return 0; |
587 | 586 | ||
diff --git a/drivers/ide/siimage.c b/drivers/ide/siimage.c index e4973cd1fba9..bd82d228608c 100644 --- a/drivers/ide/siimage.c +++ b/drivers/ide/siimage.c | |||
@@ -451,8 +451,8 @@ static int sil_sata_reset_poll(ide_drive_t *drive) | |||
451 | static void sil_sata_pre_reset(ide_drive_t *drive) | 451 | static void sil_sata_pre_reset(ide_drive_t *drive) |
452 | { | 452 | { |
453 | if (drive->media == ide_disk) { | 453 | if (drive->media == ide_disk) { |
454 | drive->special.b.set_geometry = 0; | 454 | drive->special_flags &= |
455 | drive->special.b.recalibrate = 0; | 455 | ~(IDE_SFLAG_SET_GEOMETRY | IDE_SFLAG_RECALIBRATE); |
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||
diff --git a/drivers/ide/tx4938ide.c b/drivers/ide/tx4938ide.c index e33d764e2945..ea89fddeed91 100644 --- a/drivers/ide/tx4938ide.c +++ b/drivers/ide/tx4938ide.c | |||
@@ -130,8 +130,7 @@ static const struct ide_port_info tx4938ide_port_info __initdata = { | |||
130 | 130 | ||
131 | static int __init tx4938ide_probe(struct platform_device *pdev) | 131 | static int __init tx4938ide_probe(struct platform_device *pdev) |
132 | { | 132 | { |
133 | hw_regs_t hw; | 133 | struct ide_hw hw, *hws[] = { &hw }; |
134 | hw_regs_t *hws[] = { &hw, NULL, NULL, NULL }; | ||
135 | struct ide_host *host; | 134 | struct ide_host *host; |
136 | struct resource *res; | 135 | struct resource *res; |
137 | struct tx4938ide_platform_info *pdata = pdev->dev.platform_data; | 136 | struct tx4938ide_platform_info *pdata = pdev->dev.platform_data; |
@@ -183,7 +182,7 @@ static int __init tx4938ide_probe(struct platform_device *pdev) | |||
183 | tx4938ide_tune_ebusc(pdata->ebus_ch, pdata->gbus_clock, 0); | 182 | tx4938ide_tune_ebusc(pdata->ebus_ch, pdata->gbus_clock, 0); |
184 | else | 183 | else |
185 | d.port_ops = NULL; | 184 | d.port_ops = NULL; |
186 | ret = ide_host_add(&d, hws, &host); | 185 | ret = ide_host_add(&d, hws, 1, &host); |
187 | if (!ret) | 186 | if (!ret) |
188 | platform_set_drvdata(pdev, host); | 187 | platform_set_drvdata(pdev, host); |
189 | return ret; | 188 | return ret; |
diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index 564422d23976..9f73fd43d1f4 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c | |||
@@ -537,8 +537,7 @@ static const struct ide_port_info tx4939ide_port_info __initdata = { | |||
537 | 537 | ||
538 | static int __init tx4939ide_probe(struct platform_device *pdev) | 538 | static int __init tx4939ide_probe(struct platform_device *pdev) |
539 | { | 539 | { |
540 | hw_regs_t hw; | 540 | struct ide_hw hw, *hws[] = { &hw }; |
541 | hw_regs_t *hws[] = { &hw, NULL, NULL, NULL }; | ||
542 | struct ide_host *host; | 541 | struct ide_host *host; |
543 | struct resource *res; | 542 | struct resource *res; |
544 | int irq, ret; | 543 | int irq, ret; |
@@ -581,7 +580,7 @@ static int __init tx4939ide_probe(struct platform_device *pdev) | |||
581 | hw.dev = &pdev->dev; | 580 | hw.dev = &pdev->dev; |
582 | 581 | ||
583 | pr_info("TX4939 IDE interface (base %#lx, irq %d)\n", mapbase, irq); | 582 | pr_info("TX4939 IDE interface (base %#lx, irq %d)\n", mapbase, irq); |
584 | host = ide_host_alloc(&tx4939ide_port_info, hws); | 583 | host = ide_host_alloc(&tx4939ide_port_info, hws, 1); |
585 | if (!host) | 584 | if (!host) |
586 | return -ENOMEM; | 585 | return -ENOMEM; |
587 | /* use extra_base for base address of the all registers */ | 586 | /* use extra_base for base address of the all registers */ |