diff options
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r-- | drivers/ide/ide.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 4b130e7102eb..166acd513d5b 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -499,6 +499,8 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) | |||
499 | /** | 499 | /** |
500 | * ide_unregister - free an IDE interface | 500 | * ide_unregister - free an IDE interface |
501 | * @index: index of interface (will change soon to a pointer) | 501 | * @index: index of interface (will change soon to a pointer) |
502 | * @init_default: init default hwif flag | ||
503 | * @restore: restore hwif flag | ||
502 | * | 504 | * |
503 | * Perform the final unregister of an IDE interface. At the moment | 505 | * Perform the final unregister of an IDE interface. At the moment |
504 | * we don't refcount interfaces so this will also get split up. | 506 | * we don't refcount interfaces so this will also get split up. |
@@ -518,7 +520,7 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) | |||
518 | * This is raving bonkers. | 520 | * This is raving bonkers. |
519 | */ | 521 | */ |
520 | 522 | ||
521 | void ide_unregister(unsigned int index) | 523 | void ide_unregister(unsigned int index, int init_default, int restore) |
522 | { | 524 | { |
523 | ide_drive_t *drive; | 525 | ide_drive_t *drive; |
524 | ide_hwif_t *hwif, *g; | 526 | ide_hwif_t *hwif, *g; |
@@ -602,9 +604,12 @@ void ide_unregister(unsigned int index) | |||
602 | 604 | ||
603 | /* restore hwif data to pristine status */ | 605 | /* restore hwif data to pristine status */ |
604 | ide_init_port_data(hwif, index); | 606 | ide_init_port_data(hwif, index); |
605 | init_hwif_default(hwif, index); | ||
606 | 607 | ||
607 | ide_hwif_restore(hwif, &tmp_hwif); | 608 | if (init_default) |
609 | init_hwif_default(hwif, index); | ||
610 | |||
611 | if (restore) | ||
612 | ide_hwif_restore(hwif, &tmp_hwif); | ||
608 | 613 | ||
609 | abort: | 614 | abort: |
610 | spin_unlock_irq(&ide_lock); | 615 | spin_unlock_irq(&ide_lock); |
@@ -710,12 +715,12 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), | |||
710 | goto found; | 715 | goto found; |
711 | } | 716 | } |
712 | for (index = 0; index < MAX_HWIFS; index++) | 717 | for (index = 0; index < MAX_HWIFS; index++) |
713 | ide_unregister(index); | 718 | ide_unregister(index, 1, 1); |
714 | } while (retry--); | 719 | } while (retry--); |
715 | return -1; | 720 | return -1; |
716 | found: | 721 | found: |
717 | if (hwif->present) | 722 | if (hwif->present) |
718 | ide_unregister(index); | 723 | ide_unregister(index, 0, 1); |
719 | else if (!hwif->hold) | 724 | else if (!hwif->hold) |
720 | ide_init_port_data(hwif, index); | 725 | ide_init_port_data(hwif, index); |
721 | 726 | ||
@@ -1058,7 +1063,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1058 | case HDIO_UNREGISTER_HWIF: | 1063 | case HDIO_UNREGISTER_HWIF: |
1059 | if (!capable(CAP_SYS_RAWIO)) return -EACCES; | 1064 | if (!capable(CAP_SYS_RAWIO)) return -EACCES; |
1060 | /* (arg > MAX_HWIFS) checked in function */ | 1065 | /* (arg > MAX_HWIFS) checked in function */ |
1061 | ide_unregister(arg); | 1066 | ide_unregister(arg, 1, 1); |
1062 | return 0; | 1067 | return 0; |
1063 | case HDIO_SET_NICE: | 1068 | case HDIO_SET_NICE: |
1064 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; | 1069 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; |
@@ -1703,7 +1708,7 @@ void __exit cleanup_module (void) | |||
1703 | int index; | 1708 | int index; |
1704 | 1709 | ||
1705 | for (index = 0; index < MAX_HWIFS; ++index) | 1710 | for (index = 0; index < MAX_HWIFS; ++index) |
1706 | ide_unregister(index); | 1711 | ide_unregister(index, 0, 0); |
1707 | 1712 | ||
1708 | proc_ide_destroy(); | 1713 | proc_ide_destroy(); |
1709 | 1714 | ||