lkml.org 
[lkml]   [2004]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] 2.6.6 synclinkmp.c
    From
    Date
    On Tue, 2004-06-01 at 15:57, Russell King wrote:
    > If pci_register_driver fails, the driver is not, repeat not left
    > registered. Therefore it must not be unregistered after failure
    > to register.

    OK, here is a corrected patch that properly distinguishes
    between pci_register_driver failure and the case
    of finding no hardware.


    --
    Paul Fulghum
    paulkf@microgate.com


    --- linux-2.6.6/drivers/char/synclinkmp.c 2004-06-02 09:07:40.495553141 -0500
    +++ linux-2.6.6-mg1/drivers/char/synclinkmp.c 2004-06-02 09:08:05.720218567 -0500
    @@ -1,5 +1,5 @@
    /*
    - * $Id: synclinkmp.c,v 4.19 2004/03/08 15:29:23 paulkf Exp $
    + * $Id: synclinkmp.c,v 4.21 2004/06/02 14:07:14 paulkf Exp $
    *
    * Device driver for Microgate SyncLink Multiport
    * high speed multiprotocol serial adapter.
    @@ -494,7 +494,7 @@
    MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICES) "i");

    static char *driver_name = "SyncLink MultiPort driver";
    -static char *driver_version = "$Revision: 4.19 $";
    +static char *driver_version = "$Revision: 4.21 $";

    static int synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent);
    static void synclinkmp_remove_one(struct pci_dev *dev);
    @@ -3781,56 +3781,7 @@
    .tiocmset = tiocmset,
    };

    -/* Driver initialization entry point.
    - */
    -
    -static int __init synclinkmp_init(void)
    -{
    - if (break_on_load) {
    - synclinkmp_get_text_ptr();
    - BREAKPOINT();
    - }
    -
    - printk("%s %s\n", driver_name, driver_version);
    -
    - synclinkmp_adapter_count = -1;
    - pci_register_driver(&synclinkmp_pci_driver);
    -
    - if ( !synclinkmp_device_list ) {
    - printk("%s(%d):No SyncLink devices found.\n",__FILE__,__LINE__);
    - return -ENODEV;
    - }
    -
    - serial_driver = alloc_tty_driver(synclinkmp_device_count);
    - if (!serial_driver)
    - return -ENOMEM;
    -
    - /* Initialize the tty_driver structure */
    -
    - serial_driver->owner = THIS_MODULE;
    - serial_driver->driver_name = "synclinkmp";
    - serial_driver->name = "ttySLM";
    - serial_driver->major = ttymajor;
    - serial_driver->minor_start = 64;
    - serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
    - serial_driver->subtype = SERIAL_TYPE_NORMAL;
    - serial_driver->init_termios = tty_std_termios;
    - serial_driver->init_termios.c_cflag =
    - B9600 | CS8 | CREAD | HUPCL | CLOCAL;
    - serial_driver->flags = TTY_DRIVER_REAL_RAW;
    - tty_set_operations(serial_driver, &ops);
    - if (tty_register_driver(serial_driver) < 0)
    - printk("%s(%d):Couldn't register serial driver\n",
    - __FILE__,__LINE__);
    -
    - printk("%s %s, tty major#%d\n",
    - driver_name, driver_version,
    - serial_driver->major);
    -
    - return 0;
    -}
    -
    -static void __exit synclinkmp_exit(void)
    +static void synclinkmp_cleanup(void)
    {
    unsigned long flags;
    int rc;
    @@ -3839,10 +3790,12 @@

    printk("Unloading %s %s\n", driver_name, driver_version);

    - if ((rc = tty_unregister_driver(serial_driver)))
    - printk("%s(%d) failed to unregister tty driver err=%d\n",
    - __FILE__,__LINE__,rc);
    - put_tty_driver(serial_driver);
    + if (serial_driver) {
    + if ((rc = tty_unregister_driver(serial_driver)))
    + printk("%s(%d) failed to unregister tty driver err=%d\n",
    + __FILE__,__LINE__,rc);
    + put_tty_driver(serial_driver);
    + }

    info = synclinkmp_device_list;
    while(info) {
    @@ -3882,6 +3835,75 @@
    pci_unregister_driver(&synclinkmp_pci_driver);
    }

    +/* Driver initialization entry point.
    + */
    +
    +static int __init synclinkmp_init(void)
    +{
    + int rc;
    +
    + if (break_on_load) {
    + synclinkmp_get_text_ptr();
    + BREAKPOINT();
    + }
    +
    + printk("%s %s\n", driver_name, driver_version);
    +
    + if ((rc = pci_register_driver(&synclinkmp_pci_driver)) < 0) {
    + printk("%s:failed to register PCI driver, error=%d\n",__FILE__,rc);
    + return rc;
    + }
    +
    + if (!synclinkmp_device_list) {
    + printk("%s(%d):No SyncLink devices found.\n",__FILE__,__LINE__);
    + rc = -ENODEV;
    + goto error;
    + }
    +
    + serial_driver = alloc_tty_driver(synclinkmp_device_count);
    + if (!serial_driver) {
    + rc = -ENOMEM;
    + goto error;
    + }
    +
    + /* Initialize the tty_driver structure */
    +
    + serial_driver->owner = THIS_MODULE;
    + serial_driver->driver_name = "synclinkmp";
    + serial_driver->name = "ttySLM";
    + serial_driver->major = ttymajor;
    + serial_driver->minor_start = 64;
    + serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
    + serial_driver->subtype = SERIAL_TYPE_NORMAL;
    + serial_driver->init_termios = tty_std_termios;
    + serial_driver->init_termios.c_cflag =
    + B9600 | CS8 | CREAD | HUPCL | CLOCAL;
    + serial_driver->flags = TTY_DRIVER_REAL_RAW;
    + tty_set_operations(serial_driver, &ops);
    + if ((rc = tty_register_driver(serial_driver)) < 0) {
    + printk("%s(%d):Couldn't register serial driver\n",
    + __FILE__,__LINE__);
    + put_tty_driver(serial_driver);
    + serial_driver = NULL;
    + goto error;
    + }
    +
    + printk("%s %s, tty major#%d\n",
    + driver_name, driver_version,
    + serial_driver->major);
    +
    + return 0;
    +
    +error:
    + synclinkmp_cleanup();
    + return rc;
    +}
    +
    +static void __exit synclinkmp_exit(void)
    +{
    + synclinkmp_cleanup();
    +}
    +
    module_init(synclinkmp_init);
    module_exit(synclinkmp_exit);



    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:03    [W:0.030 / U:90.152 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site