|
@@ -499,6 +499,8 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
|
|
|
/**
|
|
|
* ide_unregister - free an IDE interface
|
|
|
* @index: index of interface (will change soon to a pointer)
|
|
|
+ * @init_default: init default hwif flag
|
|
|
+ * @restore: restore hwif flag
|
|
|
*
|
|
|
* Perform the final unregister of an IDE interface. At the moment
|
|
|
* 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)
|
|
|
* This is raving bonkers.
|
|
|
*/
|
|
|
|
|
|
-void ide_unregister(unsigned int index)
|
|
|
+void ide_unregister(unsigned int index, int init_default, int restore)
|
|
|
{
|
|
|
ide_drive_t *drive;
|
|
|
ide_hwif_t *hwif, *g;
|
|
@@ -602,9 +604,12 @@ void ide_unregister(unsigned int index)
|
|
|
|
|
|
/* restore hwif data to pristine status */
|
|
|
ide_init_port_data(hwif, index);
|
|
|
- init_hwif_default(hwif, index);
|
|
|
|
|
|
- ide_hwif_restore(hwif, &tmp_hwif);
|
|
|
+ if (init_default)
|
|
|
+ init_hwif_default(hwif, index);
|
|
|
+
|
|
|
+ if (restore)
|
|
|
+ ide_hwif_restore(hwif, &tmp_hwif);
|
|
|
|
|
|
abort:
|
|
|
spin_unlock_irq(&ide_lock);
|
|
@@ -710,12 +715,12 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
|
|
|
goto found;
|
|
|
}
|
|
|
for (index = 0; index < MAX_HWIFS; index++)
|
|
|
- ide_unregister(index);
|
|
|
+ ide_unregister(index, 1, 1);
|
|
|
} while (retry--);
|
|
|
return -1;
|
|
|
found:
|
|
|
if (hwif->present)
|
|
|
- ide_unregister(index);
|
|
|
+ ide_unregister(index, 0, 1);
|
|
|
else if (!hwif->hold)
|
|
|
ide_init_port_data(hwif, index);
|
|
|
|
|
@@ -1058,7 +1063,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
|
|
case HDIO_UNREGISTER_HWIF:
|
|
|
if (!capable(CAP_SYS_RAWIO)) return -EACCES;
|
|
|
/* (arg > MAX_HWIFS) checked in function */
|
|
|
- ide_unregister(arg);
|
|
|
+ ide_unregister(arg, 1, 1);
|
|
|
return 0;
|
|
|
case HDIO_SET_NICE:
|
|
|
if (!capable(CAP_SYS_ADMIN)) return -EACCES;
|
|
@@ -1703,7 +1708,7 @@ void __exit cleanup_module (void)
|
|
|
int index;
|
|
|
|
|
|
for (index = 0; index < MAX_HWIFS; ++index)
|
|
|
- ide_unregister(index);
|
|
|
+ ide_unregister(index, 0, 0);
|
|
|
|
|
|
proc_ide_destroy();
|
|
|
|