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 <bzolnier@gmail.com>
This commit is contained in:
@@ -800,7 +800,20 @@ static ide_startstop_t do_special (ide_drive_t *drive)
|
|||||||
s->b.set_tune = 0;
|
s->b.set_tune = 0;
|
||||||
|
|
||||||
if (set_pio_mode_abuse(drive->hwif, req_pio)) {
|
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);
|
hwif->set_pio_mode(drive, req_pio);
|
||||||
} else {
|
} else {
|
||||||
int keep_dma = drive->using_dma;
|
int keep_dma = drive->using_dma;
|
||||||
|
@@ -286,12 +286,7 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||||||
switch (pio) {
|
switch (pio) {
|
||||||
case 8: /* set prefetch off */
|
case 8: /* set prefetch off */
|
||||||
case 9: /* set prefetch on */
|
case 9: /* set prefetch on */
|
||||||
/*
|
|
||||||
* take ide_lock for drive->[no_]unmask
|
|
||||||
*/
|
|
||||||
spin_lock_irqsave(&ide_lock, flags);
|
|
||||||
ht_set_prefetch(drive, pio & 1);
|
ht_set_prefetch(drive, pio & 1);
|
||||||
spin_unlock_irqrestore(&ide_lock, flags);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -632,7 +632,6 @@ static void cmd640_set_mode (unsigned int index, u8 pio_mode, unsigned int cycle
|
|||||||
|
|
||||||
static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
unsigned int index = 0, cycle_time;
|
unsigned int index = 0, cycle_time;
|
||||||
u8 b;
|
u8 b;
|
||||||
|
|
||||||
@@ -655,12 +654,7 @@ static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||||||
|
|
||||||
case 8: /* set prefetch off */
|
case 8: /* set prefetch off */
|
||||||
case 9: /* set prefetch on */
|
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);
|
set_prefetch_mode(index, pio & 1);
|
||||||
spin_unlock_irqrestore(&ide_lock, flags);
|
|
||||||
printk("%s: %sabled cmd640 prefetch\n", drive->name, (pio & 1) ? "en" : "dis");
|
printk("%s: %sabled cmd640 prefetch\n", drive->name, (pio & 1) ? "en" : "dis");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user