git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.3
[linux-2.6.git]
/
drivers
/
atm
/
idt77252.c
diff --git
a/drivers/atm/idt77252.c
b/drivers/atm/idt77252.c
index
b929f43
..
3959cf8
100644
(file)
--- a/
drivers/atm/idt77252.c
+++ b/
drivers/atm/idt77252.c
@@
-2516,7
+2516,7
@@
idt77252_close(struct atm_vcc *vcc)
struct vc_map *vc = vcc->dev_data;
unsigned long flags;
unsigned long addr;
struct vc_map *vc = vcc->dev_data;
unsigned long flags;
unsigned long addr;
-
int
timeout;
+
unsigned long
timeout;
down(&card->mutex);
down(&card->mutex);
@@
-2566,9
+2566,9
@@
done:
}
spin_unlock_irqrestore(&vc->lock, flags);
}
spin_unlock_irqrestore(&vc->lock, flags);
- timeout = 5 *
HZ
;
+ timeout = 5 *
1000
;
while (atomic_read(&vc->scq->used) > 0) {
while (atomic_read(&vc->scq->used) > 0) {
- timeout =
schedule_timeout
(timeout);
+ timeout =
msleep_interruptible
(timeout);
if (!timeout)
break;
}
if (!timeout)
break;
}
@@
-3164,7
+3164,7
@@
deinit_card(struct idt77252_dev *card)
for (i = 0; i < 4; i++) {
if (card->fbq[i])
for (i = 0; i < 4; i++) {
if (card->fbq[i])
- iounmap(
(void *)
card->fbq[i]);
+ iounmap(card->fbq[i]);
}
if (card->membase)
}
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;
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);
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);
}
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));
}
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->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);
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);
}
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,
0
);
+ dev = atm_dev_register("idt77252", &idt77252_ops, -1,
NULL
);
if (!dev) {
printk("%s: can't register atm device\n", card->name);
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;
}
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);
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++) {
}
#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);
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);
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;
}
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 (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;
}
*last = card;
@@
-3796,6
+3793,23
@@
idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
index++;
return 0;
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[] =
}
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);
if (dev->phy->stop)
dev->phy->stop(dev);
deinit_card(card);
+ pci_disable_device(card->pcidev);
kfree(card);
}
kfree(card);
}