aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/mxser.c
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2012-11-15 03:49:56 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-15 20:20:58 -0500
commit191c5f10275cfbb36802edadbdb10c73537327b4 (patch)
tree93e6f0d57cb1295fb7c461dbe5ecefafeb4ad15a /drivers/tty/mxser.c
parentd0f59141ca40159c9d142c0f62e9aea61f846539 (diff)
TTY: call tty_port_destroy in the rest of drivers
After commit "TTY: move tty buffers to tty_port", the tty buffers are not freed in some drivers. This is because tty_port_destructor is not called whenever a tty_port is freed. This was an assumption I counted with but was unfortunately untrue. So fix the drivers to fulfil this assumption. To be sure, the TTY buffers (and later some stuff) are gone along with the tty_port, we have to call tty_port_destroy at tear-down places. This is mostly where the structure containing a tty_port is freed. This patch does exactly that -- put tty_port_destroy at those places. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/mxser.c')
-rw-r--r--drivers/tty/mxser.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index cfda47dabd28..802a248e7ab9 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -2411,14 +2411,27 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
2411 2411
2412 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser", 2412 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser",
2413 brd); 2413 brd);
2414 if (retval) 2414 if (retval) {
2415 for (i = 0; i < brd->info->nports; i++)
2416 tty_port_destroy(&brd->ports[i].port);
2415 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may " 2417 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
2416 "conflict with another device.\n", 2418 "conflict with another device.\n",
2417 brd->info->name, brd->irq); 2419 brd->info->name, brd->irq);
2420 }
2418 2421
2419 return retval; 2422 return retval;
2420} 2423}
2421 2424
2425static void mxser_board_remove(struct mxser_board *brd)
2426{
2427 unsigned int i;
2428
2429 for (i = 0; i < brd->info->nports; i++) {
2430 tty_unregister_device(mxvar_sdriver, brd->idx + i);
2431 tty_port_destroy(&brd->ports[i].port);
2432 }
2433}
2434
2422static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) 2435static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
2423{ 2436{
2424 int id, i, bits, ret; 2437 int id, i, bits, ret;
@@ -2649,10 +2662,8 @@ static void __devexit mxser_remove(struct pci_dev *pdev)
2649{ 2662{
2650#ifdef CONFIG_PCI 2663#ifdef CONFIG_PCI
2651 struct mxser_board *brd = pci_get_drvdata(pdev); 2664 struct mxser_board *brd = pci_get_drvdata(pdev);
2652 unsigned int i;
2653 2665
2654 for (i = 0; i < brd->info->nports; i++) 2666 mxser_board_remove(brd);
2655 tty_unregister_device(mxvar_sdriver, brd->idx + i);
2656 2667
2657 free_irq(pdev->irq, brd); 2668 free_irq(pdev->irq, brd);
2658 pci_release_region(pdev, 2); 2669 pci_release_region(pdev, 2);
@@ -2748,15 +2759,13 @@ err_put:
2748 2759
2749static void __exit mxser_module_exit(void) 2760static void __exit mxser_module_exit(void)
2750{ 2761{
2751 unsigned int i, j; 2762 unsigned int i;
2752 2763
2753 pci_unregister_driver(&mxser_driver); 2764 pci_unregister_driver(&mxser_driver);
2754 2765
2755 for (i = 0; i < MXSER_BOARDS; i++) /* ISA remains */ 2766 for (i = 0; i < MXSER_BOARDS; i++) /* ISA remains */
2756 if (mxser_boards[i].info != NULL) 2767 if (mxser_boards[i].info != NULL)
2757 for (j = 0; j < mxser_boards[i].info->nports; j++) 2768 mxser_board_remove(&mxser_boards[i]);
2758 tty_unregister_device(mxvar_sdriver,
2759 mxser_boards[i].idx + j);
2760 tty_unregister_driver(mxvar_sdriver); 2769 tty_unregister_driver(mxvar_sdriver);
2761 put_tty_driver(mxvar_sdriver); 2770 put_tty_driver(mxvar_sdriver);
2762 2771