[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:
Michael Neuling 2006-03-25 17:30:00 +11:00 committed by Paul Mackerras
parent 1f5e3b028c
commit 55aab8cd3a

View file

@ -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);