aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2010-09-03 04:31:37 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-10-22 13:20:02 -0400
commitdf480518a688f0d28f7e7de69abe6a441d1c2c64 (patch)
tree96c23d7a1ec5dc4774e9429292e27ba3f55b3654
parent24b4b67d17c308aaa956b73ab1e88190f6642bbe (diff)
Char: mxser, call pci_disable_device from probe/remove
Vasiliy found that pci_disable_device is not called on fail paths in mxser_probe. Actually, it is called from nowhere in the driver. There are three changes needed: 1) don't use pseudo-generic mxser_release_res. Let's use it only from ISA paths from now on. All the pci stuff is moved to probe and remove PCI-related functions. 2) reorder fail-paths in the probe function so that it makes sense and we can call them from the sequential code naturally (the further we are the earlier label we go to). 3) add pci_disable_device both to mxser_probe and mxser_remove. There is a nit of adding CONFIG_PCI ifdef to mxser_remove. it is because this driver supports ISA-only compilations and it would choke up on the newly added calls now. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: Kulikov Vasiliy <segooon@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/char/mxser.c47
1 files changed, 22 insertions, 25 deletions
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
index 3fc89da856ae..9d243de795df 100644
--- a/drivers/char/mxser.c
+++ b/drivers/char/mxser.c
@@ -2339,20 +2339,11 @@ struct tty_port_operations mxser_port_ops = {
2339 * The MOXA Smartio/Industio serial driver boot-time initialization code! 2339 * The MOXA Smartio/Industio serial driver boot-time initialization code!
2340 */ 2340 */
2341 2341
2342static void mxser_release_res(struct mxser_board *brd, struct pci_dev *pdev, 2342static void mxser_release_ISA_res(struct mxser_board *brd)
2343 unsigned int irq)
2344{ 2343{
2345 if (irq) 2344 free_irq(brd->irq, brd);
2346 free_irq(brd->irq, brd); 2345 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2347 if (pdev != NULL) { /* PCI */ 2346 release_region(brd->vector, 1);
2348#ifdef CONFIG_PCI
2349 pci_release_region(pdev, 2);
2350 pci_release_region(pdev, 3);
2351#endif
2352 } else {
2353 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2354 release_region(brd->vector, 1);
2355 }
2356} 2347}
2357 2348
2358static int __devinit mxser_initbrd(struct mxser_board *brd, 2349static int __devinit mxser_initbrd(struct mxser_board *brd,
@@ -2397,13 +2388,11 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
2397 2388
2398 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser", 2389 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser",
2399 brd); 2390 brd);
2400 if (retval) { 2391 if (retval)
2401 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may " 2392 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
2402 "conflict with another device.\n", 2393 "conflict with another device.\n",
2403 brd->info->name, brd->irq); 2394 brd->info->name, brd->irq);
2404 /* We hold resources, we need to release them. */ 2395
2405 mxser_release_res(brd, pdev, 0);
2406 }
2407 return retval; 2396 return retval;
2408} 2397}
2409 2398
@@ -2555,7 +2544,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
2555 ioaddress = pci_resource_start(pdev, 2); 2544 ioaddress = pci_resource_start(pdev, 2);
2556 retval = pci_request_region(pdev, 2, "mxser(IO)"); 2545 retval = pci_request_region(pdev, 2, "mxser(IO)");
2557 if (retval) 2546 if (retval)
2558 goto err; 2547 goto err_dis;
2559 2548
2560 brd->info = &mxser_cards[ent->driver_data]; 2549 brd->info = &mxser_cards[ent->driver_data];
2561 for (i = 0; i < brd->info->nports; i++) 2550 for (i = 0; i < brd->info->nports; i++)
@@ -2565,7 +2554,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
2565 ioaddress = pci_resource_start(pdev, 3); 2554 ioaddress = pci_resource_start(pdev, 3);
2566 retval = pci_request_region(pdev, 3, "mxser(vector)"); 2555 retval = pci_request_region(pdev, 3, "mxser(vector)");
2567 if (retval) 2556 if (retval)
2568 goto err_relio; 2557 goto err_zero;
2569 brd->vector = ioaddress; 2558 brd->vector = ioaddress;
2570 2559
2571 /* irq */ 2560 /* irq */
@@ -2608,7 +2597,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
2608 /* mxser_initbrd will hook ISR. */ 2597 /* mxser_initbrd will hook ISR. */
2609 retval = mxser_initbrd(brd, pdev); 2598 retval = mxser_initbrd(brd, pdev);
2610 if (retval) 2599 if (retval)
2611 goto err_null; 2600 goto err_rel3;
2612 2601
2613 for (i = 0; i < brd->info->nports; i++) 2602 for (i = 0; i < brd->info->nports; i++)
2614 tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev); 2603 tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev);
@@ -2616,10 +2605,13 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
2616 pci_set_drvdata(pdev, brd); 2605 pci_set_drvdata(pdev, brd);
2617 2606
2618 return 0; 2607 return 0;
2619err_relio: 2608err_rel3:
2620 pci_release_region(pdev, 2); 2609 pci_release_region(pdev, 3);
2621err_null: 2610err_zero:
2622 brd->info = NULL; 2611 brd->info = NULL;
2612 pci_release_region(pdev, 2);
2613err_dis:
2614 pci_disable_device(pdev);
2623err: 2615err:
2624 return retval; 2616 return retval;
2625#else 2617#else
@@ -2629,14 +2621,19 @@ err:
2629 2621
2630static void __devexit mxser_remove(struct pci_dev *pdev) 2622static void __devexit mxser_remove(struct pci_dev *pdev)
2631{ 2623{
2624#ifdef CONFIG_PCI
2632 struct mxser_board *brd = pci_get_drvdata(pdev); 2625 struct mxser_board *brd = pci_get_drvdata(pdev);
2633 unsigned int i; 2626 unsigned int i;
2634 2627
2635 for (i = 0; i < brd->info->nports; i++) 2628 for (i = 0; i < brd->info->nports; i++)
2636 tty_unregister_device(mxvar_sdriver, brd->idx + i); 2629 tty_unregister_device(mxvar_sdriver, brd->idx + i);
2637 2630
2638 mxser_release_res(brd, pdev, 1); 2631 free_irq(pdev->irq, brd);
2632 pci_release_region(pdev, 2);
2633 pci_release_region(pdev, 3);
2634 pci_disable_device(pdev);
2639 brd->info = NULL; 2635 brd->info = NULL;
2636#endif
2640} 2637}
2641 2638
2642static struct pci_driver mxser_driver = { 2639static struct pci_driver mxser_driver = {
@@ -2741,7 +2738,7 @@ static void __exit mxser_module_exit(void)
2741 2738
2742 for (i = 0; i < MXSER_BOARDS; i++) 2739 for (i = 0; i < MXSER_BOARDS; i++)
2743 if (mxser_boards[i].info != NULL) 2740 if (mxser_boards[i].info != NULL)
2744 mxser_release_res(&mxser_boards[i], NULL, 1); 2741 mxser_release_ISA_res(&mxser_boards[i]);
2745} 2742}
2746 2743
2747module_init(mxser_module_init); 2744module_init(mxser_module_init);