[PATCH] powerpc: HVC init race
I've been hitting a crash on boot where tty_open is being called before the hvc console driver setup is complete. This fixes the problem. Thanks to benh for his help on this. Signed-off-by: Michael Neuling <mikey@neuling.org> Acked-by: Anton Blanchard <anton@samba.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
1f5e3b028c
commit
55aab8cd3a
1 changed files with 18 additions and 14 deletions
|
@ -823,34 +823,38 @@ EXPORT_SYMBOL(hvc_remove);
|
||||||
* interfaces start to become available. */
|
* interfaces start to become available. */
|
||||||
int __init hvc_init(void)
|
int __init hvc_init(void)
|
||||||
{
|
{
|
||||||
|
struct tty_driver *drv;
|
||||||
|
|
||||||
/* We need more than hvc_count adapters due to hotplug additions. */
|
/* We need more than hvc_count adapters due to hotplug additions. */
|
||||||
hvc_driver = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
|
drv = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
|
||||||
if (!hvc_driver)
|
if (!drv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
hvc_driver->owner = THIS_MODULE;
|
drv->owner = THIS_MODULE;
|
||||||
hvc_driver->devfs_name = "hvc/";
|
drv->devfs_name = "hvc/";
|
||||||
hvc_driver->driver_name = "hvc";
|
drv->driver_name = "hvc";
|
||||||
hvc_driver->name = "hvc";
|
drv->name = "hvc";
|
||||||
hvc_driver->major = HVC_MAJOR;
|
drv->major = HVC_MAJOR;
|
||||||
hvc_driver->minor_start = HVC_MINOR;
|
drv->minor_start = HVC_MINOR;
|
||||||
hvc_driver->type = TTY_DRIVER_TYPE_SYSTEM;
|
drv->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||||
hvc_driver->init_termios = tty_std_termios;
|
drv->init_termios = tty_std_termios;
|
||||||
hvc_driver->flags = TTY_DRIVER_REAL_RAW;
|
drv->flags = TTY_DRIVER_REAL_RAW;
|
||||||
tty_set_operations(hvc_driver, &hvc_ops);
|
tty_set_operations(drv, &hvc_ops);
|
||||||
|
|
||||||
/* Always start the kthread because there can be hotplug vty adapters
|
/* Always start the kthread because there can be hotplug vty adapters
|
||||||
* added later. */
|
* added later. */
|
||||||
hvc_task = kthread_run(khvcd, NULL, "khvcd");
|
hvc_task = kthread_run(khvcd, NULL, "khvcd");
|
||||||
if (IS_ERR(hvc_task)) {
|
if (IS_ERR(hvc_task)) {
|
||||||
panic("Couldn't create kthread for console.\n");
|
panic("Couldn't create kthread for console.\n");
|
||||||
put_tty_driver(hvc_driver);
|
put_tty_driver(drv);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tty_register_driver(hvc_driver))
|
if (tty_register_driver(drv))
|
||||||
panic("Couldn't register hvc console driver\n");
|
panic("Couldn't register hvc console driver\n");
|
||||||
|
|
||||||
|
mb();
|
||||||
|
hvc_driver = drv;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
module_init(hvc_init);
|
module_init(hvc_init);
|
||||||
|
|
Loading…
Reference in a new issue