diff options
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r-- | drivers/ide/ide.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 0af0d1614f75..c948a5c17a5d 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -169,7 +169,7 @@ static const u8 ide_hwif_to_major[] = { IDE0_MAJOR, IDE1_MAJOR, | |||
169 | static int idebus_parameter; /* holds the "idebus=" parameter */ | 169 | static int idebus_parameter; /* holds the "idebus=" parameter */ |
170 | static int system_bus_speed; /* holds what we think is VESA/PCI bus speed */ | 170 | static int system_bus_speed; /* holds what we think is VESA/PCI bus speed */ |
171 | 171 | ||
172 | DECLARE_MUTEX(ide_cfg_sem); | 172 | DEFINE_MUTEX(ide_cfg_mtx); |
173 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); | 173 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); |
174 | 174 | ||
175 | #ifdef CONFIG_IDEPCI_PCIBUS_ORDER | 175 | #ifdef CONFIG_IDEPCI_PCIBUS_ORDER |
@@ -460,6 +460,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif) | |||
460 | hwif->mwdma_mask = tmp_hwif->mwdma_mask; | 460 | hwif->mwdma_mask = tmp_hwif->mwdma_mask; |
461 | hwif->swdma_mask = tmp_hwif->swdma_mask; | 461 | hwif->swdma_mask = tmp_hwif->swdma_mask; |
462 | 462 | ||
463 | hwif->cbl = tmp_hwif->cbl; | ||
464 | |||
463 | hwif->chipset = tmp_hwif->chipset; | 465 | hwif->chipset = tmp_hwif->chipset; |
464 | hwif->hold = tmp_hwif->hold; | 466 | hwif->hold = tmp_hwif->hold; |
465 | 467 | ||
@@ -496,8 +498,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif) | |||
496 | hwif->ide_dma_clear_irq = tmp_hwif->ide_dma_clear_irq; | 498 | hwif->ide_dma_clear_irq = tmp_hwif->ide_dma_clear_irq; |
497 | hwif->dma_host_on = tmp_hwif->dma_host_on; | 499 | hwif->dma_host_on = tmp_hwif->dma_host_on; |
498 | hwif->dma_host_off = tmp_hwif->dma_host_off; | 500 | hwif->dma_host_off = tmp_hwif->dma_host_off; |
499 | hwif->ide_dma_lostirq = tmp_hwif->ide_dma_lostirq; | 501 | hwif->dma_lost_irq = tmp_hwif->dma_lost_irq; |
500 | hwif->ide_dma_timeout = tmp_hwif->ide_dma_timeout; | 502 | hwif->dma_timeout = tmp_hwif->dma_timeout; |
501 | 503 | ||
502 | hwif->OUTB = tmp_hwif->OUTB; | 504 | hwif->OUTB = tmp_hwif->OUTB; |
503 | hwif->OUTBSYNC = tmp_hwif->OUTBSYNC; | 505 | hwif->OUTBSYNC = tmp_hwif->OUTBSYNC; |
@@ -533,7 +535,6 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif) | |||
533 | hwif->extra_base = tmp_hwif->extra_base; | 535 | hwif->extra_base = tmp_hwif->extra_base; |
534 | hwif->extra_ports = tmp_hwif->extra_ports; | 536 | hwif->extra_ports = tmp_hwif->extra_ports; |
535 | hwif->autodma = tmp_hwif->autodma; | 537 | hwif->autodma = tmp_hwif->autodma; |
536 | hwif->udma_four = tmp_hwif->udma_four; | ||
537 | 538 | ||
538 | hwif->hwif_data = tmp_hwif->hwif_data; | 539 | hwif->hwif_data = tmp_hwif->hwif_data; |
539 | } | 540 | } |
@@ -564,7 +565,7 @@ void ide_unregister(unsigned int index) | |||
564 | { | 565 | { |
565 | ide_drive_t *drive; | 566 | ide_drive_t *drive; |
566 | ide_hwif_t *hwif, *g; | 567 | ide_hwif_t *hwif, *g; |
567 | static ide_hwif_t tmp_hwif; /* protected by ide_cfg_sem */ | 568 | static ide_hwif_t tmp_hwif; /* protected by ide_cfg_mtx */ |
568 | ide_hwgroup_t *hwgroup; | 569 | ide_hwgroup_t *hwgroup; |
569 | int irq_count = 0, unit; | 570 | int irq_count = 0, unit; |
570 | 571 | ||
@@ -572,7 +573,7 @@ void ide_unregister(unsigned int index) | |||
572 | 573 | ||
573 | BUG_ON(in_interrupt()); | 574 | BUG_ON(in_interrupt()); |
574 | BUG_ON(irqs_disabled()); | 575 | BUG_ON(irqs_disabled()); |
575 | down(&ide_cfg_sem); | 576 | mutex_lock(&ide_cfg_mtx); |
576 | spin_lock_irq(&ide_lock); | 577 | spin_lock_irq(&ide_lock); |
577 | hwif = &ide_hwifs[index]; | 578 | hwif = &ide_hwifs[index]; |
578 | if (!hwif->present) | 579 | if (!hwif->present) |
@@ -679,7 +680,7 @@ void ide_unregister(unsigned int index) | |||
679 | 680 | ||
680 | abort: | 681 | abort: |
681 | spin_unlock_irq(&ide_lock); | 682 | spin_unlock_irq(&ide_lock); |
682 | up(&ide_cfg_sem); | 683 | mutex_unlock(&ide_cfg_mtx); |
683 | } | 684 | } |
684 | 685 | ||
685 | EXPORT_SYMBOL(ide_unregister); | 686 | EXPORT_SYMBOL(ide_unregister); |
@@ -817,9 +818,9 @@ EXPORT_SYMBOL(ide_register_hw); | |||
817 | * Locks for IDE setting functionality | 818 | * Locks for IDE setting functionality |
818 | */ | 819 | */ |
819 | 820 | ||
820 | DECLARE_MUTEX(ide_setting_sem); | 821 | DEFINE_MUTEX(ide_setting_mtx); |
821 | 822 | ||
822 | EXPORT_SYMBOL_GPL(ide_setting_sem); | 823 | EXPORT_SYMBOL_GPL(ide_setting_mtx); |
823 | 824 | ||
824 | /** | 825 | /** |
825 | * ide_spin_wait_hwgroup - wait for group | 826 | * ide_spin_wait_hwgroup - wait for group |
@@ -1010,7 +1011,6 @@ static int generic_ide_resume(struct device *dev) | |||
1010 | { | 1011 | { |
1011 | ide_drive_t *drive = dev->driver_data; | 1012 | ide_drive_t *drive = dev->driver_data; |
1012 | ide_hwif_t *hwif = HWIF(drive); | 1013 | ide_hwif_t *hwif = HWIF(drive); |
1013 | ide_driver_t *drv = to_ide_driver(dev->driver); | ||
1014 | struct request rq; | 1014 | struct request rq; |
1015 | struct request_pm_state rqpm; | 1015 | struct request_pm_state rqpm; |
1016 | ide_task_t args; | 1016 | ide_task_t args; |
@@ -1033,8 +1033,12 @@ static int generic_ide_resume(struct device *dev) | |||
1033 | 1033 | ||
1034 | err = ide_do_drive_cmd(drive, &rq, ide_head_wait); | 1034 | err = ide_do_drive_cmd(drive, &rq, ide_head_wait); |
1035 | 1035 | ||
1036 | if (err == 0 && drv && drv->resume) | 1036 | if (err == 0 && dev->driver) { |
1037 | drv->resume(drive); | 1037 | ide_driver_t *drv = to_ide_driver(dev->driver); |
1038 | |||
1039 | if (drv->resume) | ||
1040 | drv->resume(drive); | ||
1041 | } | ||
1038 | 1042 | ||
1039 | return err; | 1043 | return err; |
1040 | } | 1044 | } |
@@ -1189,11 +1193,11 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1189 | } | 1193 | } |
1190 | 1194 | ||
1191 | read_val: | 1195 | read_val: |
1192 | down(&ide_setting_sem); | 1196 | mutex_lock(&ide_setting_mtx); |
1193 | spin_lock_irqsave(&ide_lock, flags); | 1197 | spin_lock_irqsave(&ide_lock, flags); |
1194 | err = *val; | 1198 | err = *val; |
1195 | spin_unlock_irqrestore(&ide_lock, flags); | 1199 | spin_unlock_irqrestore(&ide_lock, flags); |
1196 | up(&ide_setting_sem); | 1200 | mutex_unlock(&ide_setting_mtx); |
1197 | return err >= 0 ? put_user(err, (long __user *)arg) : err; | 1201 | return err >= 0 ? put_user(err, (long __user *)arg) : err; |
1198 | 1202 | ||
1199 | set_val: | 1203 | set_val: |
@@ -1203,9 +1207,9 @@ set_val: | |||
1203 | if (!capable(CAP_SYS_ADMIN)) | 1207 | if (!capable(CAP_SYS_ADMIN)) |
1204 | err = -EACCES; | 1208 | err = -EACCES; |
1205 | else { | 1209 | else { |
1206 | down(&ide_setting_sem); | 1210 | mutex_lock(&ide_setting_mtx); |
1207 | err = setfunc(drive, arg); | 1211 | err = setfunc(drive, arg); |
1208 | up(&ide_setting_sem); | 1212 | mutex_unlock(&ide_setting_mtx); |
1209 | } | 1213 | } |
1210 | } | 1214 | } |
1211 | return err; | 1215 | return err; |
@@ -1545,7 +1549,11 @@ static int __init ide_setup(char *s) | |||
1545 | goto bad_option; | 1549 | goto bad_option; |
1546 | case -7: /* ata66 */ | 1550 | case -7: /* ata66 */ |
1547 | #ifdef CONFIG_BLK_DEV_IDEPCI | 1551 | #ifdef CONFIG_BLK_DEV_IDEPCI |
1548 | hwif->udma_four = 1; | 1552 | /* |
1553 | * Use ATA_CBL_PATA40_SHORT so drive side | ||
1554 | * cable detection is also overriden. | ||
1555 | */ | ||
1556 | hwif->cbl = ATA_CBL_PATA40_SHORT; | ||
1549 | goto obsolete_option; | 1557 | goto obsolete_option; |
1550 | #else | 1558 | #else |
1551 | goto bad_hwif; | 1559 | goto bad_hwif; |