diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-02 18:53:10 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-02 18:53:10 -0500 |
| commit | e2e29831cc463f4be61d4e36b8699ae7e071a685 (patch) | |
| tree | d5c40f6a328e07edb2db7186bef3a6c932c404fb | |
| parent | 9a689bc4f09f8b89f88e65b1b0a2ea780b4f28de (diff) | |
| parent | 95964018d53f479529dfdc2b46fe30c0a14a00e0 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6:
alim15x3: fix sparse warning
ide: remove dead code from drive_is_ready()
ide: fix build for DEBUG_PM
ide: respect current DMA setting during resume
ide: add SAMSUNG SP0822N with firmware WA100-10 to ivb_list[]
amd74xx: workaround unreliable AltStatus register for nVidia controllers
ide: fix the ide_release_lock imbalance
| -rw-r--r-- | drivers/ide/alim15x3.c | 2 | ||||
| -rw-r--r-- | drivers/ide/amd74xx.c | 11 | ||||
| -rw-r--r-- | drivers/ide/ide-io.c | 30 | ||||
| -rw-r--r-- | drivers/ide/ide-iops.c | 9 | ||||
| -rw-r--r-- | drivers/ide/ide-probe.c | 3 | ||||
| -rw-r--r-- | include/linux/ide.h | 8 |
6 files changed, 38 insertions, 25 deletions
diff --git a/drivers/ide/alim15x3.c b/drivers/ide/alim15x3.c index e56c7b72f9e..45d2356bb72 100644 --- a/drivers/ide/alim15x3.c +++ b/drivers/ide/alim15x3.c | |||
| @@ -591,7 +591,7 @@ static int __init ali15x3_ide_init(void) | |||
| 591 | 591 | ||
| 592 | static void __exit ali15x3_ide_exit(void) | 592 | static void __exit ali15x3_ide_exit(void) |
| 593 | { | 593 | { |
| 594 | return pci_unregister_driver(&alim15x3_pci_driver); | 594 | pci_unregister_driver(&alim15x3_pci_driver); |
| 595 | } | 595 | } |
| 596 | 596 | ||
| 597 | module_init(ali15x3_ide_init); | 597 | module_init(ali15x3_ide_init); |
diff --git a/drivers/ide/amd74xx.c b/drivers/ide/amd74xx.c index 81ec73134ed..c6bcd3014a2 100644 --- a/drivers/ide/amd74xx.c +++ b/drivers/ide/amd74xx.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * IDE driver for Linux. | 3 | * IDE driver for Linux. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2000-2002 Vojtech Pavlik | 5 | * Copyright (c) 2000-2002 Vojtech Pavlik |
| 6 | * Copyright (c) 2007 Bartlomiej Zolnierkiewicz | 6 | * Copyright (c) 2007-2008 Bartlomiej Zolnierkiewicz |
| 7 | * | 7 | * |
| 8 | * Based on the work of: | 8 | * Based on the work of: |
| 9 | * Andre Hedrick | 9 | * Andre Hedrick |
| @@ -263,6 +263,15 @@ static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_ | |||
| 263 | d.udma_mask = ATA_UDMA5; | 263 | d.udma_mask = ATA_UDMA5; |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | /* | ||
| 267 | * It seems that on some nVidia controllers using AltStatus | ||
| 268 | * register can be unreliable so default to Status register | ||
| 269 | * if the device is in Compatibility Mode. | ||
| 270 | */ | ||
| 271 | if (dev->vendor == PCI_VENDOR_ID_NVIDIA && | ||
| 272 | ide_pci_is_in_compatibility_mode(dev)) | ||
| 273 | d.host_flags |= IDE_HFLAG_BROKEN_ALTSTATUS; | ||
| 274 | |||
| 266 | printk(KERN_INFO "%s %s: UDMA%s controller\n", | 275 | printk(KERN_INFO "%s %s: UDMA%s controller\n", |
| 267 | d.name, pci_name(dev), amd_dma[fls(d.udma_mask) - 1]); | 276 | d.name, pci_name(dev), amd_dma[fls(d.udma_mask) - 1]); |
| 268 | 277 | ||
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 7162d67562a..7d275b2af3e 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
| @@ -132,10 +132,14 @@ int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors) | |||
| 132 | } | 132 | } |
| 133 | EXPORT_SYMBOL(ide_end_request); | 133 | EXPORT_SYMBOL(ide_end_request); |
| 134 | 134 | ||
| 135 | static void ide_complete_power_step(ide_drive_t *drive, struct request *rq, u8 stat, u8 error) | 135 | static void ide_complete_power_step(ide_drive_t *drive, struct request *rq) |
| 136 | { | 136 | { |
| 137 | struct request_pm_state *pm = rq->data; | 137 | struct request_pm_state *pm = rq->data; |
| 138 | 138 | ||
| 139 | #ifdef DEBUG_PM | ||
| 140 | printk(KERN_INFO "%s: complete_power_step(step: %d)\n", | ||
| 141 | drive->name, pm->pm_step); | ||
| 142 | #endif | ||
| 139 | if (drive->media != ide_disk) | 143 | if (drive->media != ide_disk) |
| 140 | return; | 144 | return; |
| 141 | 145 | ||
| @@ -172,7 +176,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * | |||
| 172 | /* Not supported? Switch to next step now. */ | 176 | /* Not supported? Switch to next step now. */ |
| 173 | if (ata_id_flush_enabled(drive->id) == 0 || | 177 | if (ata_id_flush_enabled(drive->id) == 0 || |
| 174 | (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) { | 178 | (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) { |
| 175 | ide_complete_power_step(drive, rq, 0, 0); | 179 | ide_complete_power_step(drive, rq); |
| 176 | return ide_stopped; | 180 | return ide_stopped; |
| 177 | } | 181 | } |
| 178 | if (ata_id_flush_ext_enabled(drive->id)) | 182 | if (ata_id_flush_ext_enabled(drive->id)) |
| @@ -191,7 +195,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * | |||
| 191 | if (drive->media != ide_disk) | 195 | if (drive->media != ide_disk) |
| 192 | pm->pm_step = IDE_PM_RESTORE_DMA; | 196 | pm->pm_step = IDE_PM_RESTORE_DMA; |
| 193 | else | 197 | else |
| 194 | ide_complete_power_step(drive, rq, 0, 0); | 198 | ide_complete_power_step(drive, rq); |
| 195 | return ide_stopped; | 199 | return ide_stopped; |
| 196 | case IDE_PM_IDLE: /* Resume step 2 (idle) */ | 200 | case IDE_PM_IDLE: /* Resume step 2 (idle) */ |
| 197 | args->tf.command = ATA_CMD_IDLEIMMEDIATE; | 201 | args->tf.command = ATA_CMD_IDLEIMMEDIATE; |
| @@ -204,10 +208,8 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * | |||
| 204 | */ | 208 | */ |
| 205 | if (drive->hwif->dma_ops == NULL) | 209 | if (drive->hwif->dma_ops == NULL) |
| 206 | break; | 210 | break; |
| 207 | /* | 211 | if (drive->dev_flags & IDE_DFLAG_USING_DMA) |
| 208 | * TODO: respect IDE_DFLAG_USING_DMA | 212 | ide_set_dma(drive); |
| 209 | */ | ||
| 210 | ide_set_dma(drive); | ||
| 211 | break; | 213 | break; |
| 212 | } | 214 | } |
| 213 | 215 | ||
| @@ -322,11 +324,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) | |||
| 322 | } | 324 | } |
| 323 | } else if (blk_pm_request(rq)) { | 325 | } else if (blk_pm_request(rq)) { |
| 324 | struct request_pm_state *pm = rq->data; | 326 | struct request_pm_state *pm = rq->data; |
| 325 | #ifdef DEBUG_PM | 327 | |
| 326 | printk("%s: complete_power_step(step: %d, stat: %x, err: %x)\n", | 328 | ide_complete_power_step(drive, rq); |
| 327 | drive->name, rq->pm->pm_step, stat, err); | ||
| 328 | #endif | ||
| 329 | ide_complete_power_step(drive, rq, stat, err); | ||
| 330 | if (pm->pm_step == IDE_PM_COMPLETED) | 329 | if (pm->pm_step == IDE_PM_COMPLETED) |
| 331 | ide_complete_pm_request(drive, rq); | 330 | ide_complete_pm_request(drive, rq); |
| 332 | return; | 331 | return; |
| @@ -804,7 +803,7 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) | |||
| 804 | struct request_pm_state *pm = rq->data; | 803 | struct request_pm_state *pm = rq->data; |
| 805 | #ifdef DEBUG_PM | 804 | #ifdef DEBUG_PM |
| 806 | printk("%s: start_power_step(step: %d)\n", | 805 | printk("%s: start_power_step(step: %d)\n", |
| 807 | drive->name, rq->pm->pm_step); | 806 | drive->name, pm->pm_step); |
| 808 | #endif | 807 | #endif |
| 809 | startstop = ide_start_power_step(drive, rq); | 808 | startstop = ide_start_power_step(drive, rq); |
| 810 | if (startstop == ide_stopped && | 809 | if (startstop == ide_stopped && |
| @@ -967,14 +966,13 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq) | |||
| 967 | ide_startstop_t startstop; | 966 | ide_startstop_t startstop; |
| 968 | int loops = 0; | 967 | int loops = 0; |
| 969 | 968 | ||
| 970 | /* for atari only: POSSIBLY BROKEN HERE(?) */ | ||
| 971 | ide_get_lock(ide_intr, hwgroup); | ||
| 972 | |||
| 973 | /* caller must own ide_lock */ | 969 | /* caller must own ide_lock */ |
| 974 | BUG_ON(!irqs_disabled()); | 970 | BUG_ON(!irqs_disabled()); |
| 975 | 971 | ||
| 976 | while (!hwgroup->busy) { | 972 | while (!hwgroup->busy) { |
| 977 | hwgroup->busy = 1; | 973 | hwgroup->busy = 1; |
| 974 | /* for atari only */ | ||
| 975 | ide_get_lock(ide_intr, hwgroup); | ||
| 978 | drive = choose_drive(hwgroup); | 976 | drive = choose_drive(hwgroup); |
| 979 | if (drive == NULL) { | 977 | if (drive == NULL) { |
| 980 | int sleeping = 0; | 978 | int sleeping = 0; |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 5d6ba14e211..c41c3b9b6f0 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
| @@ -457,18 +457,14 @@ int drive_is_ready (ide_drive_t *drive) | |||
| 457 | if (drive->waiting_for_dma) | 457 | if (drive->waiting_for_dma) |
| 458 | return hwif->dma_ops->dma_test_irq(drive); | 458 | return hwif->dma_ops->dma_test_irq(drive); |
| 459 | 459 | ||
| 460 | #if 0 | ||
| 461 | /* need to guarantee 400ns since last command was issued */ | ||
| 462 | udelay(1); | ||
| 463 | #endif | ||
| 464 | |||
| 465 | /* | 460 | /* |
| 466 | * We do a passive status test under shared PCI interrupts on | 461 | * We do a passive status test under shared PCI interrupts on |
| 467 | * cards that truly share the ATA side interrupt, but may also share | 462 | * cards that truly share the ATA side interrupt, but may also share |
| 468 | * an interrupt with another pci card/device. We make no assumptions | 463 | * an interrupt with another pci card/device. We make no assumptions |
| 469 | * about possible isa-pnp and pci-pnp issues yet. | 464 | * about possible isa-pnp and pci-pnp issues yet. |
| 470 | */ | 465 | */ |
| 471 | if (hwif->io_ports.ctl_addr) | 466 | if (hwif->io_ports.ctl_addr && |
| 467 | (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) | ||
| 472 | stat = hwif->tp_ops->read_altstatus(hwif); | 468 | stat = hwif->tp_ops->read_altstatus(hwif); |
| 473 | else | 469 | else |
| 474 | /* Note: this may clear a pending IRQ!! */ | 470 | /* Note: this may clear a pending IRQ!! */ |
| @@ -610,6 +606,7 @@ static const struct drive_list_entry ivb_list[] = { | |||
| 610 | { "TSSTcorp CDDVDW SH-S202N" , "SB01" }, | 606 | { "TSSTcorp CDDVDW SH-S202N" , "SB01" }, |
| 611 | { "TSSTcorp CDDVDW SH-S202H" , "SB00" }, | 607 | { "TSSTcorp CDDVDW SH-S202H" , "SB00" }, |
| 612 | { "TSSTcorp CDDVDW SH-S202H" , "SB01" }, | 608 | { "TSSTcorp CDDVDW SH-S202H" , "SB01" }, |
| 609 | { "SAMSUNG SP0822N" , "WA100-10" }, | ||
| 613 | { NULL , NULL } | 610 | { NULL , NULL } |
| 614 | }; | 611 | }; |
| 615 | 612 | ||
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 1649ea54f76..c55bdbd2231 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -266,7 +266,8 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd) | |||
| 266 | /* take a deep breath */ | 266 | /* take a deep breath */ |
| 267 | msleep(50); | 267 | msleep(50); |
| 268 | 268 | ||
| 269 | if (io_ports->ctl_addr) { | 269 | if (io_ports->ctl_addr && |
| 270 | (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) { | ||
| 270 | a = tp_ops->read_altstatus(hwif); | 271 | a = tp_ops->read_altstatus(hwif); |
| 271 | s = tp_ops->read_status(hwif); | 272 | s = tp_ops->read_status(hwif); |
| 272 | if ((a ^ s) & ~ATA_IDX) | 273 | if ((a ^ s) & ~ATA_IDX) |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 54525be4b5f..010fb26a157 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1296,6 +1296,13 @@ extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *o | |||
| 1296 | #define ide_pci_register_driver(d) pci_register_driver(d) | 1296 | #define ide_pci_register_driver(d) pci_register_driver(d) |
| 1297 | #endif | 1297 | #endif |
| 1298 | 1298 | ||
| 1299 | static inline int ide_pci_is_in_compatibility_mode(struct pci_dev *dev) | ||
| 1300 | { | ||
| 1301 | if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 5) != 5) | ||
| 1302 | return 1; | ||
| 1303 | return 0; | ||
| 1304 | } | ||
| 1305 | |||
| 1299 | void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, | 1306 | void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, |
| 1300 | hw_regs_t *, hw_regs_t **); | 1307 | hw_regs_t *, hw_regs_t **); |
| 1301 | void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *); | 1308 | void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *); |
| @@ -1375,6 +1382,7 @@ enum { | |||
| 1375 | IDE_HFLAG_IO_32BIT = (1 << 24), | 1382 | IDE_HFLAG_IO_32BIT = (1 << 24), |
| 1376 | /* unmask IRQs */ | 1383 | /* unmask IRQs */ |
| 1377 | IDE_HFLAG_UNMASK_IRQS = (1 << 25), | 1384 | IDE_HFLAG_UNMASK_IRQS = (1 << 25), |
| 1385 | IDE_HFLAG_BROKEN_ALTSTATUS = (1 << 26), | ||
| 1378 | /* serialize ports if DMA is possible (for sl82c105) */ | 1386 | /* serialize ports if DMA is possible (for sl82c105) */ |
| 1379 | IDE_HFLAG_SERIALIZE_DMA = (1 << 27), | 1387 | IDE_HFLAG_SERIALIZE_DMA = (1 << 27), |
| 1380 | /* force host out of "simplex" mode */ | 1388 | /* force host out of "simplex" mode */ |
