diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-12-29 14:27:31 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-12-29 14:27:31 -0500 |
commit | 2a2ca6a96194c4744a2adeefbc09ce881f3c5abe (patch) | |
tree | 50b43d823d4a589fbfb8f8751278d6101cd3ecf3 /drivers/ide/umc8672.c | |
parent | 6ea52226ca131a99bb619bd56fbeee566ea5a966 (diff) |
ide: replace the global ide_lock spinlock by per-hwgroup spinlocks (v2)
Now that (almost) all host drivers have been fixed not to abuse ide_lock
and core code usage of ide_lock has been sanitized we may safely replace
ide_lock by per-hwgroup locks.
This patch is partially based on earlier patch from Ravikiran G Thirumalai.
While at it:
- don't use deprecated HWIF() and HWGROUP() macros
- update locking documentation in ide.h
v2:
Add missing spin_lock_init(&hwgroup->lock). (Noticed by Elias Oltmanns)
Cc: Vaibhav V. Nivargi <vaibhav.nivargi@gmail.com>
Cc: Alok N. Kataria <alokk@calsoftinc.com>
Cc: Shai Fultheim <shai@scalex86.org>
Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>
Cc: Elias Oltmanns <eo@nebensachen.de>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/umc8672.c')
-rw-r--r-- | drivers/ide/umc8672.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/ide/umc8672.c b/drivers/ide/umc8672.c index 1da076e0c917..e29978cf6197 100644 --- a/drivers/ide/umc8672.c +++ b/drivers/ide/umc8672.c | |||
@@ -107,18 +107,21 @@ static void umc_set_speeds(u8 speeds[]) | |||
107 | static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio) | 107 | static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio) |
108 | { | 108 | { |
109 | ide_hwif_t *hwif = drive->hwif; | 109 | ide_hwif_t *hwif = drive->hwif; |
110 | unsigned long flags; | 110 | ide_hwgroup_t *mate_hwgroup = hwif->mate ? hwif->mate->hwgroup : NULL; |
111 | unsigned long uninitialized_var(flags); | ||
111 | 112 | ||
112 | printk("%s: setting umc8672 to PIO mode%d (speed %d)\n", | 113 | printk("%s: setting umc8672 to PIO mode%d (speed %d)\n", |
113 | drive->name, pio, pio_to_umc[pio]); | 114 | drive->name, pio, pio_to_umc[pio]); |
114 | spin_lock_irqsave(&ide_lock, flags); | 115 | if (mate_hwgroup) |
115 | if (hwif->mate && hwif->mate->hwgroup->handler) { | 116 | spin_lock_irqsave(&mate_hwgroup->lock, flags); |
117 | if (mate_hwgroup && mate_hwgroup->handler) { | ||
116 | printk(KERN_ERR "umc8672: other interface is busy: exiting tune_umc()\n"); | 118 | printk(KERN_ERR "umc8672: other interface is busy: exiting tune_umc()\n"); |
117 | } else { | 119 | } else { |
118 | current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio]; | 120 | current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio]; |
119 | umc_set_speeds(current_speeds); | 121 | umc_set_speeds(current_speeds); |
120 | } | 122 | } |
121 | spin_unlock_irqrestore(&ide_lock, flags); | 123 | if (mate_hwgroup) |
124 | spin_unlock_irqrestore(&mate_hwgroup->lock, flags); | ||
122 | } | 125 | } |
123 | 126 | ||
124 | static const struct ide_port_ops umc8672_port_ops = { | 127 | static const struct ide_port_ops umc8672_port_ops = { |