|
@@ -685,8 +685,6 @@ static int nozomi_read_config_table(struct nozomi *dc)
|
|
|
dump_table(dc);
|
|
|
|
|
|
for (i = PORT_MDM; i < MAX_PORT; i++) {
|
|
|
- kfifo_alloc(&dc->port[i].fifo_ul,
|
|
|
- FIFO_BUFFER_SIZE_UL, GFP_ATOMIC);
|
|
|
memset(&dc->port[i].ctrl_dl, 0, sizeof(struct ctrl_dl));
|
|
|
memset(&dc->port[i].ctrl_ul, 0, sizeof(struct ctrl_ul));
|
|
|
}
|
|
@@ -1433,6 +1431,16 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|
|
goto err_free_sbuf;
|
|
|
}
|
|
|
|
|
|
+ for (i = PORT_MDM; i < MAX_PORT; i++) {
|
|
|
+ if (kfifo_alloc(&dc->port[i].fifo_ul,
|
|
|
+ FIFO_BUFFER_SIZE_UL, GFP_ATOMIC)) {
|
|
|
+ dev_err(&pdev->dev,
|
|
|
+ "Could not allocate kfifo buffer\n");
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto err_free_kfifo;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock_init(&dc->spin_mutex);
|
|
|
|
|
|
nozomi_setup_private_data(dc);
|
|
@@ -1445,7 +1453,7 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|
|
NOZOMI_NAME, dc);
|
|
|
if (unlikely(ret)) {
|
|
|
dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
|
|
|
- goto err_free_sbuf;
|
|
|
+ goto err_free_kfifo;
|
|
|
}
|
|
|
|
|
|
DBG1("base_addr: %p", dc->base_addr);
|
|
@@ -1464,13 +1472,28 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|
|
dc->state = NOZOMI_STATE_ENABLED;
|
|
|
|
|
|
for (i = 0; i < MAX_PORT; i++) {
|
|
|
+ struct device *tty_dev;
|
|
|
+
|
|
|
mutex_init(&dc->port[i].tty_sem);
|
|
|
tty_port_init(&dc->port[i].port);
|
|
|
- tty_register_device(ntty_driver, dc->index_start + i,
|
|
|
+ tty_dev = tty_register_device(ntty_driver, dc->index_start + i,
|
|
|
&pdev->dev);
|
|
|
+
|
|
|
+ if (IS_ERR(tty_dev)) {
|
|
|
+ ret = PTR_ERR(tty_dev);
|
|
|
+ dev_err(&pdev->dev, "Could not allocate tty?\n");
|
|
|
+ goto err_free_tty;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
+err_free_tty:
|
|
|
+ for (i = dc->index_start; i < dc->index_start + MAX_PORT; ++i)
|
|
|
+ tty_unregister_device(ntty_driver, i);
|
|
|
+err_free_kfifo:
|
|
|
+ for (i = 0; i < MAX_PORT; i++)
|
|
|
+ kfifo_free(&dc->port[i].fifo_ul);
|
|
|
err_free_sbuf:
|
|
|
kfree(dc->send_buf);
|
|
|
iounmap(dc->base_addr);
|