diff options
| -rw-r--r-- | drivers/ide/pci/cmd640.c | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c index 5b756757e049..7f39cdb41410 100644 --- a/drivers/ide/pci/cmd640.c +++ b/drivers/ide/pci/cmd640.c | |||
| @@ -374,6 +374,21 @@ static void cmd640_dump_regs(void) | |||
| 374 | } | 374 | } |
| 375 | #endif | 375 | #endif |
| 376 | 376 | ||
| 377 | static void __set_prefetch_mode(ide_drive_t *drive, int mode) | ||
| 378 | { | ||
| 379 | if (mode) { /* want prefetch on? */ | ||
| 380 | #if CMD640_PREFETCH_MASKS | ||
| 381 | drive->no_unmask = 1; | ||
| 382 | drive->unmask = 0; | ||
| 383 | #endif | ||
| 384 | drive->no_io_32bit = 0; | ||
| 385 | } else { | ||
| 386 | drive->no_unmask = 0; | ||
| 387 | drive->no_io_32bit = 1; | ||
| 388 | drive->io_32bit = 0; | ||
| 389 | } | ||
| 390 | } | ||
| 391 | |||
| 377 | #ifndef CONFIG_BLK_DEV_CMD640_ENHANCED | 392 | #ifndef CONFIG_BLK_DEV_CMD640_ENHANCED |
| 378 | /* | 393 | /* |
| 379 | * Check whether prefetch is on for a drive, | 394 | * Check whether prefetch is on for a drive, |
| @@ -383,19 +398,10 @@ static void __init check_prefetch(ide_drive_t *drive, unsigned int index) | |||
| 383 | { | 398 | { |
| 384 | u8 b = get_cmd640_reg(prefetch_regs[index]); | 399 | u8 b = get_cmd640_reg(prefetch_regs[index]); |
| 385 | 400 | ||
| 386 | if (b & prefetch_masks[index]) { /* is prefetch off? */ | 401 | __set_prefetch_mode(drive, (b & prefetch_masks[index]) ? 0 : 1); |
| 387 | drive->no_unmask = 0; | ||
| 388 | drive->no_io_32bit = 1; | ||
| 389 | drive->io_32bit = 0; | ||
| 390 | } else { | ||
| 391 | #if CMD640_PREFETCH_MASKS | ||
| 392 | drive->no_unmask = 1; | ||
| 393 | drive->unmask = 0; | ||
| 394 | #endif | ||
| 395 | drive->no_io_32bit = 0; | ||
| 396 | } | ||
| 397 | } | 402 | } |
| 398 | #else | 403 | #else |
| 404 | |||
| 399 | /* | 405 | /* |
| 400 | * Sets prefetch mode for a drive. | 406 | * Sets prefetch mode for a drive. |
| 401 | */ | 407 | */ |
| @@ -407,19 +413,11 @@ static void set_prefetch_mode(ide_drive_t *drive, unsigned int index, int mode) | |||
| 407 | 413 | ||
| 408 | spin_lock_irqsave(&cmd640_lock, flags); | 414 | spin_lock_irqsave(&cmd640_lock, flags); |
| 409 | b = __get_cmd640_reg(reg); | 415 | b = __get_cmd640_reg(reg); |
| 410 | if (mode) { /* want prefetch on? */ | 416 | __set_prefetch_mode(drive, mode); |
| 411 | #if CMD640_PREFETCH_MASKS | 417 | if (mode) |
| 412 | drive->no_unmask = 1; | ||
| 413 | drive->unmask = 0; | ||
| 414 | #endif | ||
| 415 | drive->no_io_32bit = 0; | ||
| 416 | b &= ~prefetch_masks[index]; /* enable prefetch */ | 418 | b &= ~prefetch_masks[index]; /* enable prefetch */ |
| 417 | } else { | 419 | else |
| 418 | drive->no_unmask = 0; | ||
| 419 | drive->no_io_32bit = 1; | ||
| 420 | drive->io_32bit = 0; | ||
| 421 | b |= prefetch_masks[index]; /* disable prefetch */ | 420 | b |= prefetch_masks[index]; /* disable prefetch */ |
| 422 | } | ||
| 423 | __put_cmd640_reg(reg, b); | 421 | __put_cmd640_reg(reg, b); |
| 424 | spin_unlock_irqrestore(&cmd640_lock, flags); | 422 | spin_unlock_irqrestore(&cmd640_lock, flags); |
| 425 | } | 423 | } |
