In order for a serial function to implement its own ioctl() calls, propagate the ioctl() callback to the next layer so it can handle it if it sees fit to do so. Signed-off-by: Tal Shorer <tal.shorer@xxxxxxxxx> --- drivers/usb/gadget/function/u_serial.c | 15 +++++++++++++++ drivers/usb/gadget/function/u_serial.h | 1 + 2 files changed, 16 insertions(+) diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index d466f58..8d9abf1 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c @@ -1040,6 +1040,20 @@ static unsigned int gs_poll(struct tty_struct *tty, struct file *file, return mask; } +static int gs_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) +{ + struct gs_port *port = tty->driver_data; + struct gserial *gser; + int ret = -ENOIOCTLCMD; + + spin_lock_irq(&port->port_lock); + gser = port->port_usb; + if (gser && gser->ioctl) + ret = gser->ioctl(gser, cmd, arg); + spin_unlock_irq(&port->port_lock); + return ret; +} + static const struct tty_operations gs_tty_ops = { .open = gs_open, .close = gs_close, @@ -1051,6 +1065,7 @@ static const struct tty_operations gs_tty_ops = { .unthrottle = gs_unthrottle, .break_ctl = gs_break_ctl, .poll = gs_poll, + .ioctl = gs_ioctl, }; /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/gadget/function/u_serial.h b/drivers/usb/gadget/function/u_serial.h index ce00840..8d0901e 100644 --- a/drivers/usb/gadget/function/u_serial.h +++ b/drivers/usb/gadget/function/u_serial.h @@ -53,6 +53,7 @@ struct gserial { int (*send_break)(struct gserial *p, int duration); unsigned int (*poll)(struct gserial *p, struct file *file, poll_table *wait); + int (*ioctl)(struct gserial *p, unsigned int cmd, unsigned long arg); }; /* utilities to allocate/free request and buffer */ -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html