diff options
author | Jiri Slaby <jslaby@suse.cz> | 2012-11-15 03:49:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-15 20:20:58 -0500 |
commit | 191c5f10275cfbb36802edadbdb10c73537327b4 (patch) | |
tree | 93e6f0d57cb1295fb7c461dbe5ecefafeb4ad15a /drivers/tty/mxser.c | |
parent | d0f59141ca40159c9d142c0f62e9aea61f846539 (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.c | 25 |
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 | ||
2425 | static 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 | |||
2422 | static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) | 2435 | static 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 | ||
2749 | static void __exit mxser_module_exit(void) | 2760 | static 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 | ||