synclink_gt use dynamic tty device registration
PATCH 1/1 synclink_gt use dynamic tty device registration
Change synclink_gt driver to use dynamic tty device registration.
drivers/char/synclink_gt.c +18 -16
@@ -3415,6 +3415,9 @@ static void device_init(int adapter_num, } } } + +for (i=0 ; i < port_count; ++i) +tty_register_device (serial_driver, port_array[i]->line, &(port_array[i]->pdev->dev)); } static int __devinit init_one(struct pci_dev *dev,
@@ -3466,6 +3469,8 @@ static void slgt_cleanup(void)printk ("unload %s %s\n" , driver_name, driver_version);if (serial_driver) { +for (info=slgt_device_list ; info !=NULL ; info=info->next_device) +tty_unregister_device (serial_driver, info->line);if ((rc =tty_unregister_driver (serial_driver)))DBGERR (("tty_unregister_driver error=%d\n" , rc));put_tty_driver (serial_driver);
@@ -3506,23 +3511,10 @@ static int __init slgt_init(void)printk ("%s %s\n" , driver_name, driver_version); - slgt_device_count =0 ; -if ((rc =pci_register_driver (&pci_driver)) <0 ) { -printk ("%s pci_register_driver error=%d\n" , driver_name, rc); -return rc; - } - pci_registered =1 ; - -if (!slgt_device_list) { -printk ("%s no devices found\n" ,driver_name); -pci_unregister_driver (&pci_driver); -return -ENODEV ; - } - serial_driver =alloc_tty_driver (MAX_DEVICES );if (!serial_driver) { - rc = -ENOMEM ; - goto error; +printk ("%s can't allocate tty driver\n" , driver_name); +return -ENOMEM ; }/* Initialize the tty_driver structure */
@@ -3539,7 +3531,7 @@ static int __init slgt_init(void)B9600 |CS8 |CREAD |HUPCL |CLOCAL ; serial_driver->init_termios.c_ispeed =9600 ; serial_driver->init_termios.c_ospeed =9600 ; - serial_driver->flags =TTY_DRIVER_REAL_RAW ; + serial_driver->flags =TTY_DRIVER_REAL_RAW |TTY_DRIVER_DYNAMIC_DEV ;tty_set_operations (serial_driver, &ops);if ((rc =tty_register_driver (serial_driver)) <0 ) {DBGERR (("%s can't register serial driver\n" , driver_name));
@@ -3552,6 +3544,16 @@ static int __init slgt_init(void) driver_name, driver_version, serial_driver->major); + slgt_device_count =0 ; +if ((rc =pci_register_driver (&pci_driver)) <0 ) { +printk ("%s pci_register_driver error=%d\n" , driver_name, rc); + goto error; + } + pci_registered =1 ; + +if (!slgt_device_list) +printk ("%s no devices found\n" ,driver_name); +return 0 ; error:
Review
Quoted 11 lines · On Wed, 02 May 2007 11:17:33 -0500 Paul Fulghum <[email protected]> wrote:
Change
synclink_gtdriver to use dynamic tty device registration....
(quoted diff) +5
-0+ for (i=0; i < port_count; ++i) + tty_register_device(serial_driver, port_array[i]->line, &(port_array[i]->pdev->dev)); + for (info=slgt_device_list ; info != NULL ; info=info->next_device) + tty_unregister_device(serial_driver, info->line); + if ((rc = pci_register_driver(&pci_driver)) < 0) {
hm, not a big fan of kernel coding style, I see.
What's going to happen here if tty_register_device() fails?
Quoted 6 lines · Andrew Morton
Quoted 4 lines · On Wed, 02 May 2007 11:17:33 -0500 Paul Fulghum <[email protected]> wrote:
Change
synclink_gtdriver to use dynamic tty device registration....
Quoted 9 lines
Review
Quoted 7 lines
(quoted diff) +5
-0+ for (i=0; i < port_count; ++i) + tty_register_device(serial_driver, port_array[i]->line, &(port_array[i]->pdev->dev)); + for (info=slgt_device_list ; info != NULL ; info=info->next_device) + tty_unregister_device(serial_driver, info->line); + if ((rc = pci_register_driver(&pci_driver)) < 0) {hm, not a big fan of kernel coding style, I see.
It varies. If this idiom bothers you, I can split it into 2 lines.
Quoted 1 line
What's going to happen here if
tty_register_device()fails?
Then the device will not be accessible as a tty device. It may still be accessible as a network device.
On driver unload, tty_unregister_device() does nothing because the device was never created.
In this case, tracking the return value does not change anything. I could add a printk on error to better inform the user that the kernel's plumbing went south.
Signature · 2 lines
Paul Fulghum Microgate Systems, Ltd