ide: take ide_lock for prefetch disable/enable in do_special()
PATCH 8/15 ide: take ide_lock for prefetch disable/enable in do_special()
Take ide_lock for prefetch disable/enable in do_special(), then cleanup cmd640 and ht6560b host drivers.
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
--- drivers/ide/ide-io.c | 15 ++++++++++++++- drivers/ide/legacy/ht6560b.c | 5 ----- drivers/ide/pci/cmd640.c | 6 ------ 3 files changed, 14 insertions(+), 12 deletions(-)
drivers/ide/ide-io.c +14 -1
@@ -835,7 +835,20 @@ static ide_startstop_t do_special (ide_d s->b.set_tune =0 ;if (set_pio_mode_abuse (drive->hwif, req_pio)) { -if (hwif->set_pio_mode) + +if (hwif->set_pio_mode ==NULL ) +return ide_stopped; + +/* +* take ide_lock for drive->[no_]unmask/[no_]io_32bit +*/ +if (req_pio ==8 || req_pio ==9 ) { +unsigned long flags; + +spin_lock_irqsave (&ide_lock, flags); + hwif->set_pio_mode (drive, req_pio); +spin_unlock_irqrestore (&ide_lock, flags); + }else hwif->set_pio_mode (drive, req_pio); }else {int keep_dma = drive->using_dma;
drivers/ide/legacy/ht6560b.c +0 -5
@@ -286,12 +286,7 @@ static void ht6560b_set_pio_mode(ide_driswitch (pio) {case 8 :/* set prefetch off */ case 9 :/* set prefetch on */ -/* -* take ide_lock for drive->[no_]unmask -*/ -spin_lock_irqsave (&ide_lock, flags);ht_set_prefetch (drive, pio &1 ); -spin_unlock_irqrestore (&ide_lock, flags);return ; }
drivers/ide/pci/cmd640.c +0 -6
@@ -632,7 +632,6 @@ static void cmd640_set_mode (unsigned instatic void cmd640_set_pio_mode (ide_drive_t *drive,const u8 pio) { -unsigned long flags;unsigned int index =0 , cycle_time;u8 b;
@@ -655,12 +654,7 @@ static void cmd640_set_pio_mode(ide_drivcase 8 :/* set prefetch off */ case 9 :/* set prefetch on */ -/* -* take ide_lock for drive->[no_]unmask/[no_]io_32bit -*/ -spin_lock_irqsave (&ide_lock, flags);set_prefetch_mode (index, pio &1 ); -spin_unlock_irqrestore (&ide_lock, flags);printk ("%s: %sabled cmd640 prefetch\n" , drive->name, (pio &1 ) ?"en" :"dis" );return ; }