ecard_set_drvdata(ec, NULL);
 
-       ide_unregister(hwif->index);
+       ide_unregister(hwif);
 
        ecard_release_resources(ec);
 }
 
 {
        ide_hwif_t *hwif = pnp_get_drvdata(dev);
 
-       if (hwif)
-               ide_unregister(hwif->index);
-       else
-               printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
+       ide_unregister(hwif);
 
        release_region(pnp_port_start(dev, 1), 1);
        release_region(pnp_port_start(dev, 0), 8);
 
 
 /**
  *     ide_unregister          -       free an IDE interface
- *     @index: index of interface (will change soon to a pointer)
+ *     @hwif: IDE interface
  *
  *     Perform the final unregister of an IDE interface. At the moment
  *     we don't refcount interfaces so this will also get split up.
  *     This is raving bonkers.
  */
 
-void ide_unregister(unsigned int index)
+void ide_unregister(ide_hwif_t *hwif)
 {
-       ide_hwif_t *hwif, *g;
+       ide_hwif_t *g;
        ide_hwgroup_t *hwgroup;
        int irq_count = 0;
 
-       BUG_ON(index >= MAX_HWIFS);
-
        BUG_ON(in_interrupt());
        BUG_ON(irqs_disabled());
        mutex_lock(&ide_cfg_mtx);
        spin_lock_irq(&ide_lock);
-       hwif = &ide_hwifs[index];
        if (!hwif->present)
                goto abort;
        __ide_port_unregister_devices(hwif);
                ide_release_dma_engine(hwif);
 
        /* restore hwif data to pristine status */
-       ide_init_port_data(hwif, index);
+       ide_init_port_data(hwif, hwif->index);
 
 abort:
        spin_unlock_irq(&ide_lock);
 
     if (info->ndev) {
        /* FIXME: if this fails we need to queue the cleanup somehow
           -- need to investigate the required PCMCIA magic */
-       ide_unregister(hwif->index);
+       ide_unregister(hwif);
     }
     info->ndev = 0;
 
 
 {
        ide_hwif_t *hwif = pdev->dev.driver_data;
 
-       ide_unregister(hwif->index);
+       ide_unregister(hwif);
 
        return 0;
 }
 
        ide_hwif_t *hwif = dev_get_drvdata(dev);
        _auide_hwif *ahwif = &auide_hwif;
 
-       ide_unregister(hwif->index);
+       ide_unregister(hwif);
 
        iounmap((void *)ahwif->regbase);
 
 
 {
        ide_hwif_t *hwif = pci_get_drvdata(dev);
 
-       if (hwif)
-               ide_unregister(hwif->index);
+       ide_unregister(hwif);
 
        pci_release_regions(dev);
        pci_disable_device(dev);
 
                hwif->dmatable_cpu = NULL;
        }
 
-       ide_unregister(hwif->index);
+       ide_unregister(hwif);
 
-       hwif->chipset = ide_unknown;
        iounmap((void*)ports->dma);
        iounmap((void*)ports->ctl);
        pci_release_selected_regions(dev, (1 << 2) - 1);
 
 #endif
 
 void ide_remove_port_from_hwgroup(ide_hwif_t *);
-void ide_unregister(unsigned int);
+void ide_unregister(ide_hwif_t *);
 
 void ide_register_region(struct gendisk *);
 void ide_unregister_region(struct gendisk *);