vserver 1.9.3
[linux-2.6.git] / drivers / atm / idt77252.c
index b2bede5..3959cf8 100644 (file)
@@ -2516,7 +2516,7 @@ idt77252_close(struct atm_vcc *vcc)
        struct vc_map *vc = vcc->dev_data;
        unsigned long flags;
        unsigned long addr;
-       int timeout;
+       unsigned long timeout;
 
        down(&card->mutex);
 
@@ -2566,9 +2566,9 @@ done:
                }
                spin_unlock_irqrestore(&vc->lock, flags);
 
-               timeout = 5 * HZ;
+               timeout = 5 * 1000;
                while (atomic_read(&vc->scq->used) > 0) {
-                       timeout = schedule_timeout(timeout);
+                       timeout = msleep_interruptible(timeout);
                        if (!timeout)
                                break;
                }
@@ -3164,7 +3164,7 @@ deinit_card(struct idt77252_dev *card)
 
        for (i = 0; i < 4; i++) {
                if (card->fbq[i])
-                       iounmap((void *) card->fbq[i]);
+                       iounmap(card->fbq[i]);
        }
 
        if (card->membase)
@@ -3681,18 +3681,25 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
        struct idt77252_dev *card;
        struct atm_dev *dev;
        ushort revision = 0;
-       int i;
+       int i, err;
+
 
+       if (pci_enable_device(pcidev)) {
+               printk("idt77252: can't enable PCI device at %s\n", pci_name(pcidev));
+               return -ENODEV;
+       }
 
        if (pci_read_config_word(pcidev, PCI_REVISION_ID, &revision)) {
                printk("idt77252-%d: can't read PCI_REVISION_ID\n", index);
-               return -ENODEV;
+               err = -ENODEV;
+               goto err_out_disable_pdev;
        }
 
        card = kmalloc(sizeof(struct idt77252_dev), GFP_KERNEL);
        if (!card) {
                printk("idt77252-%d: can't allocate private data\n", index);
-               return -ENOMEM;
+               err = -ENOMEM;
+               goto err_out_disable_pdev;
        }
        memset(card, 0, sizeof(struct idt77252_dev));
 
@@ -3715,26 +3722,24 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
        card->tst_timer.function = tst_timer;
 
        /* Do the I/O remapping... */
-       card->membase = (unsigned long) ioremap(membase, 1024);
+       card->membase = ioremap(membase, 1024);
        if (!card->membase) {
                printk("%s: can't ioremap() membase\n", card->name);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_free_card;
        }
 
        if (idt77252_preset(card)) {
                printk("%s: preset failed\n", card->name);
-               iounmap((void *) card->membase);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_iounmap;
        }
 
        dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL);
        if (!dev) {
                printk("%s: can't register atm device\n", card->name);
-               iounmap((void *) card->membase);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_iounmap;
        }
        dev->dev_data = card;
        card->atmdev = dev;
@@ -3743,22 +3748,19 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
        suni_init(dev);
        if (!dev->phy) {
                printk("%s: can't init SUNI\n", card->name);
-               deinit_card(card);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_deinit_card;
        }
 #endif /* CONFIG_ATM_IDT77252_USE_SUNI */
 
        card->sramsize = probe_sram(card);
 
        for (i = 0; i < 4; i++) {
-               card->fbq[i] = (unsigned long)
-                           ioremap(srambase | 0x200000 | (i << 18), 4);
+               card->fbq[i] = ioremap(srambase | 0x200000 | (i << 18), 4);
                if (!card->fbq[i]) {
                        printk("%s: can't ioremap() FBQ%d\n", card->name, i);
-                       deinit_card(card);
-                       kfree(card);
-                       return -EIO;
+                       err = -EIO;
+                       goto err_out_deinit_card;
                }
        }
 
@@ -3769,9 +3771,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
 
        if (init_card(dev)) {
                printk("%s: init_card failed\n", card->name);
-               deinit_card(card);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_deinit_card;
        }
 
        dev->ci_range.vpi_bits = card->vpibits;
@@ -3783,12 +3784,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
 
        if (idt77252_dev_open(card)) {
                printk("%s: dev_open failed\n", card->name);
-
-               if (dev->phy->stop)
-                       dev->phy->stop(dev);
-               deinit_card(card);
-               kfree(card);
-               return -EIO;
+               err = -EIO;
+               goto err_out_stop;
        }
 
        *last = card;
@@ -3796,6 +3793,23 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
        index++;
 
        return 0;
+
+err_out_stop:
+       if (dev->phy->stop)
+               dev->phy->stop(dev);
+
+err_out_deinit_card:
+       deinit_card(card);
+
+err_out_iounmap:
+       iounmap((void *) card->membase);
+
+err_out_free_card:
+       kfree(card);
+
+err_out_disable_pdev:
+       pci_disable_device(pcidev);
+       return err;
 }
 
 static struct pci_device_id idt77252_pci_tbl[] =
@@ -3848,6 +3862,7 @@ static void __exit idt77252_exit(void)
                if (dev->phy->stop)
                        dev->phy->stop(dev);
                deinit_card(card);
+               pci_disable_device(card->pcidev);
                kfree(card);
        }