Hello, Okash Khawaja, on Sun 27 Nov 2016 20:41:50 +0000, wrote: > Thanks for explanation. I have not been able to work on this recently - pulled > away for something urgent. As soon as it's over, I'll be back on it. Probably > third week of December. I've taken some time to have a look, I have attached the result: - tty_NULL is a patch against the kernel to make tty functions accept being called with filp == NULL - mymodule.tgz is a dumb module which opens ttyS0 (major 4 minor 64), and writes to it through the tty write operation. So this, combined with your work on the line discipline, should get something working, and opening other serial ports (e.g. ttyUSB0) is a matter of changing the major/minor pair (e.g. 188, 0). Samuel
Index: linux-4.8/drivers/tty/tty_port.c =================================================================== --- linux-4.8.orig/drivers/tty/tty_port.c +++ linux-4.8/drivers/tty/tty_port.c @@ -335,7 +335,7 @@ EXPORT_SYMBOL(tty_port_lower_dtr_rts); * tty_port_block_til_ready - Waiting logic for tty open * @port: the tty port being opened * @tty: the tty device being bound - * @filp: the file pointer of the opener + * @filp: the file pointer of the opener or NULL * * Implement the core POSIX/SuS tty behaviour when opening a tty device. * Handles: @@ -369,7 +369,7 @@ int tty_port_block_til_ready(struct tty_ tty_port_set_active(port, 1); return 0; } - if (filp->f_flags & O_NONBLOCK) { + if (filp == NULL || filp->f_flags & O_NONBLOCK) { /* Indicate we are open */ if (C_BAUD(tty)) tty_port_raise_dtr_rts(port); Index: linux-4.8/drivers/tty/tty_io.c =================================================================== --- linux-4.8.orig/drivers/tty/tty_io.c +++ linux-4.8/drivers/tty/tty_io.c @@ -855,7 +855,7 @@ static void tty_vhangup_session(struct t int tty_hung_up_p(struct file *filp) { - return (filp->f_op == &hung_up_tty_fops); + return (filp && filp->f_op == &hung_up_tty_fops); } EXPORT_SYMBOL(tty_hung_up_p); @@ -1368,7 +1368,10 @@ static struct tty_struct *tty_driver_loo struct tty_struct *tty; if (driver->ops->lookup) - tty = driver->ops->lookup(driver, file, idx); + if (!file) + tty = ERR_PTR(-EIO); + else + tty = driver->ops->lookup(driver, file, idx); else tty = driver->ttys[idx]; @@ -1986,7 +1989,7 @@ static struct tty_driver *tty_lookup_dri struct tty_driver *console_driver = console_device(index); if (console_driver) { driver = tty_driver_kref_get(console_driver); - if (driver) { + if (driver && filp) { /* Don't let /dev/console block */ filp->f_flags |= O_NONBLOCK; break; @@ -2019,7 +2022,7 @@ static struct tty_driver *tty_lookup_dri * - concurrent tty driver removal w/ lookup * - concurrent tty removal from driver table */ -static struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, +struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, struct file *filp) { struct tty_struct *tty; @@ -2064,6 +2067,7 @@ out: tty_driver_kref_put(driver); return tty; } +EXPORT_SYMBOL(tty_open_by_driver); /** * tty_open - open a tty device Index: linux-4.8/include/linux/tty.h =================================================================== --- linux-4.8.orig/include/linux/tty.h +++ linux-4.8/include/linux/tty.h @@ -394,6 +394,8 @@ extern struct tty_struct *get_current_tt /* tty_io.c */ extern int __init tty_init(void); extern const char *tty_name(const struct tty_struct *tty); +extern struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, + struct file *filp); #else static inline void console_init(void) { }
_______________________________________________ Speakup mailing list Speakup@xxxxxxxxxxxxxxxxx http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup