Hi all,
1. we should init the kref of tty which used as a fake tty in usb
serial console setup function.
2. Fix can't open /dev/console bug when the console is a usb serial device.
With these two patches we can boot and login successfully on an Eee PC
with a pl2303 usb serial as console.
Thanks,
Kevin
Add device funtion for usb serial console, so we can open /dev/console
when we use a usb serial device as console.
Signed-off-by: Kevin Hao <[email protected]>
---
drivers/usb/serial/console.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 5b95009..1dbb203 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -241,12 +241,25 @@ static void usb_console_write(struct console *co,
}
}
+static struct tty_driver *usb_console_device(struct console *co, int *index)
+{
+ struct tty_driver **p = (struct tty_driver **)co->data;
+
+ if (!*p)
+ return NULL;
+
+ *index = co->index;
+ return (struct tty_driver *)(*p);
+}
+
static struct console usbcons = {
.name = "ttyUSB",
.write = usb_console_write,
+ .device = usb_console_device,
.setup = usb_console_setup,
.flags = CON_PRINTBUFFER,
.index = -1,
+ .data = &usb_serial_tty_driver,
};
void usb_serial_console_disconnect(struct usb_serial *serial)
--
1.6.0.3.640.g6331a
We alloc a fake tty in usb serial console setup function. we should
init the tty's kref otherwise we will face WARN_ON after following
invoke of tty_port_tty_set --> tty_kref_get.
Signed-off-by: Kevin Hao <[email protected]>
---
drivers/usb/serial/console.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 5b20de1..5b95009 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -135,6 +135,7 @@ static int usb_console_setup(struct console *co, char *options)
err("no more memory");
goto reset_open_count;
}
+ kref_init(&tty->kref);
termios = kzalloc(sizeof(*termios), GFP_KERNEL);
if (!termios) {
retval = -ENOMEM;
--
1.6.0.3.640.g6331a
Hello.
Kevin Hao wrote:
> Add device funtion for usb serial console, so we can open /dev/console
> when we use a usb serial device as console.
> Signed-off-by: Kevin Hao <[email protected]>
> diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
> index 5b95009..1dbb203 100644
> --- a/drivers/usb/serial/console.c
> +++ b/drivers/usb/serial/console.c
> @@ -241,12 +241,25 @@ static void usb_console_write(struct console *co,
> }
> }
>
> +static struct tty_driver *usb_console_device(struct console *co, int *index)
> +{
> + struct tty_driver **p = (struct tty_driver **)co->data;
> +
> + if (!*p)
> + return NULL;
> +
> + *index = co->index;
> + return (struct tty_driver *)(*p);
Type cast not needed here.
WBR, Sergei
Add device funtion for usb serial console, so we can open /dev/console
when we use a usb serial device as console.
Signed-off-by: Kevin Hao <[email protected]>
---
drivers/usb/serial/console.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 5b95009..19e2404 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -241,12 +241,25 @@ static void usb_console_write(struct console *co,
}
}
+static struct tty_driver *usb_console_device(struct console *co, int *index)
+{
+ struct tty_driver **p = (struct tty_driver **)co->data;
+
+ if (!*p)
+ return NULL;
+
+ *index = co->index;
+ return *p;
+}
+
static struct console usbcons = {
.name = "ttyUSB",
.write = usb_console_write,
+ .device = usb_console_device,
.setup = usb_console_setup,
.flags = CON_PRINTBUFFER,
.index = -1,
+ .data = &usb_serial_tty_driver,
};
void usb_serial_console_disconnect(struct usb_serial *serial)
--
1.6.0.3.640.g6331a
On Thu, 13 Nov 2008 09:53:37 +0800
Kevin Hao <[email protected]> wrote:
> Add device funtion for usb serial console, so we can open /dev/console
> when we use a usb serial device as console.
>
> Signed-off-by: Kevin Hao <[email protected]>
> ---
> drivers/usb/serial/console.c | 13 +++++++++++++
> 1 files changed, 13 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
> index 5b95009..1dbb203 100644
> --- a/drivers/usb/serial/console.c
> +++ b/drivers/usb/serial/console.c
> @@ -241,12 +241,25 @@ static void usb_console_write(struct console *co,
> }
> }
>
> +static struct tty_driver *usb_console_device(struct console *co, int *index)
> +{
> + struct tty_driver **p = (struct tty_driver **)co->data;
co->data is already void*, hence this cast is unneeded. It is also
undesirable because it defeats typechecking.
> +
> + if (!*p)
> + return NULL;
> +
> + *index = co->index;
> + return (struct tty_driver *)(*p);
And *p already has type `struct tty_driver *'.
> +}
> +
> static struct console usbcons = {
> .name = "ttyUSB",
> .write = usb_console_write,
> + .device = usb_console_device,
> .setup = usb_console_setup,
> .flags = CON_PRINTBUFFER,
> .index = -1,
> + .data = &usb_serial_tty_driver,
> };
>
--- a/drivers/usb/serial/console.c~usb-serial-console-add-device-function-fix
+++ a/drivers/usb/serial/console.c
@@ -243,13 +243,13 @@ static void usb_console_write(struct con
static struct tty_driver *usb_console_device(struct console *co, int *index)
{
- struct tty_driver **p = (struct tty_driver **)co->data;
+ struct tty_driver **p = co->data;
if (!*p)
return NULL;
*index = co->index;
- return (struct tty_driver *)(*p);
+ return *p;
}
static struct console usbcons = {
_