mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'work.tty-ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull tty ioctl updates from Al Viro:
"This is the compat_ioctl work related to tty ioctls.
Quite a bit of dead code taken out, all tty-related stuff gone from
fs/compat_ioctl.c. A bunch of compat bugs fixed - some still remain,
but all more or less generic tty-related ioctls should be covered
(remaining issues are in things like driver-private ioctls in a pcmcia
serial card driver not getting properly handled in 32bit processes on
64bit host, etc)"
* 'work.tty-ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (53 commits)
kill TIOCSERGSTRUCT
change semantics of ldisc ->compat_ioctl()
kill TIOCSER[SG]WILD
synclink_gt(): fix compat_ioctl()
pty: fix compat ioctls
compat_ioctl - kill keyboard ioctl handling
gigaset: add ->compat_ioctl()
vt_compat_ioctl(): clean up, use compat_ptr() properly
gigaset: don't try to printk userland buffer contents
dgnc: don't bother with (empty) stub for TCXONC
dgnc: leave TIOC[GS]SOFTCAR to ldisc
remove fallback to drivers for TIOCGICOUNT
dgnc: break-related ioctls won't reach ->ioctl()
kill the rest of tty COMPAT_IOCTL() entries
dgnc: TIOCM... won't reach ->ioctl()
isdn_tty: TCSBRK{,P} won't reach ->ioctl()
kill capinc_tty_ioctl()
take compat TIOC[SG]SERIAL treatment into tty_compat_ioctl()
synclink: reduce pointless checks in ->ioctl()
complete ->[sg]et_serial() switchover
...
This commit is contained in:
commit
44adbac8f7
56 changed files with 779 additions and 1522 deletions
|
|
@ -884,37 +884,28 @@ static int acm_tty_tiocmset(struct tty_struct *tty,
|
|||
return acm_set_control(acm, acm->ctrlout = newctrl);
|
||||
}
|
||||
|
||||
static int get_serial_info(struct acm *acm, struct serial_struct __user *info)
|
||||
static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
struct acm *acm = tty->driver_data;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
tmp.xmit_fifo_size = acm->writesize;
|
||||
tmp.baud_base = le32_to_cpu(acm->line.dwDTERate);
|
||||
tmp.close_delay = acm->port.close_delay / 10;
|
||||
tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ss->xmit_fifo_size = acm->writesize;
|
||||
ss->baud_base = le32_to_cpu(acm->line.dwDTERate);
|
||||
ss->close_delay = acm->port.close_delay / 10;
|
||||
ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
acm->port.closing_wait / 10;
|
||||
|
||||
if (copy_to_user(info, &tmp, sizeof(tmp)))
|
||||
return -EFAULT;
|
||||
else
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_serial_info(struct acm *acm,
|
||||
struct serial_struct __user *newinfo)
|
||||
static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct new_serial;
|
||||
struct acm *acm = tty->driver_data;
|
||||
unsigned int closing_wait, close_delay;
|
||||
int retval = 0;
|
||||
|
||||
if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
|
||||
return -EFAULT;
|
||||
|
||||
close_delay = new_serial.close_delay * 10;
|
||||
closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
|
||||
close_delay = ss->close_delay * 10;
|
||||
closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10;
|
||||
|
||||
mutex_lock(&acm->port.mutex);
|
||||
|
||||
|
|
@ -999,12 +990,6 @@ static int acm_tty_ioctl(struct tty_struct *tty,
|
|||
int rv = -ENOIOCTLCMD;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL: /* gets serial port data */
|
||||
rv = get_serial_info(acm, (struct serial_struct __user *) arg);
|
||||
break;
|
||||
case TIOCSSERIAL:
|
||||
rv = set_serial_info(acm, (struct serial_struct __user *) arg);
|
||||
break;
|
||||
case TIOCMIWAIT:
|
||||
rv = usb_autopm_get_interface(acm->control);
|
||||
if (rv < 0) {
|
||||
|
|
@ -1931,6 +1916,8 @@ static const struct tty_operations acm_ops = {
|
|||
.set_termios = acm_tty_set_termios,
|
||||
.tiocmget = acm_tty_tiocmget,
|
||||
.tiocmset = acm_tty_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.set_serial = set_serial_info,
|
||||
.get_icount = acm_tty_get_icount,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -397,38 +397,16 @@ err_free:
|
|||
return result;
|
||||
}
|
||||
|
||||
static int ark3116_get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16654;
|
||||
tmp.line = port->minor;
|
||||
tmp.port = port->port_number;
|
||||
tmp.baud_base = 460800;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(tmp)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ark3116_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int ark3116_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
void __user *user_arg = (void __user *)arg;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return ark3116_get_serial_info(port, user_arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
ss->type = PORT_16654;
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->baud_base = 460800;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ark3116_tiocmget(struct tty_struct *tty)
|
||||
|
|
@ -668,7 +646,7 @@ static struct usb_serial_driver ark3116_device = {
|
|||
.port_remove = ark3116_port_remove,
|
||||
.set_termios = ark3116_set_termios,
|
||||
.init_termios = ark3116_init_termios,
|
||||
.ioctl = ark3116_ioctl,
|
||||
.get_serial = ark3116_get_serial_info,
|
||||
.tiocmget = ark3116_tiocmget,
|
||||
.tiocmset = ark3116_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
|
|
|
|||
|
|
@ -583,36 +583,16 @@ static int f81232_carrier_raised(struct usb_serial_port *port)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int f81232_get_serial_info(struct usb_serial_port *port,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct serial_struct ser;
|
||||
|
||||
memset(&ser, 0, sizeof(ser));
|
||||
|
||||
ser.type = PORT_16550A;
|
||||
ser.line = port->minor;
|
||||
ser.port = port->port_number;
|
||||
ser.baud_base = F81232_MAX_BAUDRATE;
|
||||
|
||||
if (copy_to_user((void __user *)arg, &ser, sizeof(ser)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int f81232_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int f81232_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return f81232_get_serial_info(port, arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return -ENOIOCTLCMD;
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->baud_base = F81232_MAX_BAUDRATE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void f81232_interrupt_work(struct work_struct *work)
|
||||
|
|
@ -665,7 +645,7 @@ static struct usb_serial_driver f81232_device = {
|
|||
.close = f81232_close,
|
||||
.dtr_rts = f81232_dtr_rts,
|
||||
.carrier_raised = f81232_carrier_raised,
|
||||
.ioctl = f81232_ioctl,
|
||||
.get_serial = f81232_get_serial_info,
|
||||
.break_ctl = f81232_break_ctl,
|
||||
.set_termios = f81232_set_termios,
|
||||
.tiocmget = f81232_tiocmget,
|
||||
|
|
|
|||
|
|
@ -1139,43 +1139,21 @@ static void f81534_close(struct usb_serial_port *port)
|
|||
mutex_unlock(&serial_priv->urb_mutex);
|
||||
}
|
||||
|
||||
static int f81534_get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
static int f81534_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct f81534_port_private *port_priv;
|
||||
struct serial_struct tmp;
|
||||
|
||||
port_priv = usb_get_serial_port_data(port);
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.port = port->port_number;
|
||||
tmp.line = port->minor;
|
||||
tmp.baud_base = port_priv->baud_base;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
|
||||
ss->type = PORT_16550A;
|
||||
ss->port = port->port_number;
|
||||
ss->line = port->minor;
|
||||
ss->baud_base = port_priv->baud_base;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int f81534_ioctl(struct tty_struct *tty, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct serial_struct __user *buf = (struct serial_struct __user *)arg;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return f81534_get_serial_info(port, buf);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static void f81534_process_per_serial_block(struct usb_serial_port *port,
|
||||
u8 *data)
|
||||
{
|
||||
|
|
@ -1581,7 +1559,7 @@ static struct usb_serial_driver f81534_device = {
|
|||
.break_ctl = f81534_break_ctl,
|
||||
.dtr_rts = f81534_dtr_rts,
|
||||
.process_read_urb = f81534_process_read_urb,
|
||||
.ioctl = f81534_ioctl,
|
||||
.get_serial = f81534_get_serial_info,
|
||||
.tiocmget = f81534_tiocmget,
|
||||
.tiocmset = f81534_tiocmset,
|
||||
.write_bulk_callback = f81534_write_usb_callback,
|
||||
|
|
|
|||
|
|
@ -1055,6 +1055,10 @@ static int ftdi_tiocmset(struct tty_struct *tty,
|
|||
unsigned int set, unsigned int clear);
|
||||
static int ftdi_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
static int set_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
|
||||
static bool ftdi_tx_empty(struct usb_serial_port *port);
|
||||
static int ftdi_get_modem_status(struct usb_serial_port *port,
|
||||
|
|
@ -1091,6 +1095,8 @@ static struct usb_serial_driver ftdi_sio_device = {
|
|||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.ioctl = ftdi_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.set_serial = set_serial_info,
|
||||
.set_termios = ftdi_set_termios,
|
||||
.break_ctl = ftdi_break_ctl,
|
||||
.tx_empty = ftdi_tx_empty,
|
||||
|
|
@ -1443,48 +1449,42 @@ static int read_latency_timer(struct usb_serial_port *port)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
tmp.flags = priv->flags;
|
||||
tmp.baud_base = priv->baud_base;
|
||||
tmp.custom_divisor = priv->custom_divisor;
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
ss->flags = priv->flags;
|
||||
ss->baud_base = priv->baud_base;
|
||||
ss->custom_divisor = priv->custom_divisor;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_serial_info(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct serial_struct __user *newinfo)
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
struct serial_struct new_serial;
|
||||
struct ftdi_private old_priv;
|
||||
|
||||
if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
|
||||
return -EFAULT;
|
||||
|
||||
mutex_lock(&priv->cfg_lock);
|
||||
old_priv = *priv;
|
||||
|
||||
/* Do error checking and permission checking */
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
if ((new_serial.flags ^ priv->flags) & ~ASYNC_USR_MASK) {
|
||||
if ((ss->flags ^ priv->flags) & ~ASYNC_USR_MASK) {
|
||||
mutex_unlock(&priv->cfg_lock);
|
||||
return -EPERM;
|
||||
}
|
||||
priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
|
||||
(new_serial.flags & ASYNC_USR_MASK));
|
||||
priv->custom_divisor = new_serial.custom_divisor;
|
||||
(ss->flags & ASYNC_USR_MASK));
|
||||
priv->custom_divisor = ss->custom_divisor;
|
||||
goto check_and_exit;
|
||||
}
|
||||
|
||||
if (new_serial.baud_base != priv->baud_base) {
|
||||
if (ss->baud_base != priv->baud_base) {
|
||||
mutex_unlock(&priv->cfg_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -1492,8 +1492,8 @@ static int set_serial_info(struct tty_struct *tty,
|
|||
/* Make the changes - these are privileged changes! */
|
||||
|
||||
priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
|
||||
(new_serial.flags & ASYNC_FLAGS));
|
||||
priv->custom_divisor = new_serial.custom_divisor;
|
||||
(ss->flags & ASYNC_FLAGS));
|
||||
priv->custom_divisor = ss->custom_divisor;
|
||||
|
||||
check_and_exit:
|
||||
write_latency_timer(port);
|
||||
|
|
@ -1507,10 +1507,8 @@ check_and_exit:
|
|||
dev_warn_ratelimited(&port->dev, "use of SPD flags is deprecated\n");
|
||||
|
||||
change_speed(tty, port);
|
||||
mutex_unlock(&priv->cfg_lock);
|
||||
}
|
||||
else
|
||||
mutex_unlock(&priv->cfg_lock);
|
||||
mutex_unlock(&priv->cfg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2452,10 +2450,6 @@ static int ftdi_ioctl(struct tty_struct *tty,
|
|||
void __user *argp = (void __user *)arg;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(port, argp);
|
||||
case TIOCSSERIAL:
|
||||
return set_serial_info(tty, port, argp);
|
||||
case TIOCSERGETLSR:
|
||||
return get_lsr_info(port, argp);
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -1637,24 +1637,20 @@ static int edge_tiocmget(struct tty_struct *tty)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct edgeport_port *edge_port,
|
||||
struct serial_struct __user *retinfo)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = edge_port->port->minor;
|
||||
tmp.port = edge_port->port->port_number;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = edge_port->maxTxCredits;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = 30*HZ;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = edge_port->port->minor;
|
||||
ss->port = edge_port->port->port_number;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = edge_port->maxTxCredits;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = 30*HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1667,17 +1663,12 @@ static int edge_ioctl(struct tty_struct *tty,
|
|||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
DEFINE_WAIT(wait);
|
||||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCSERGETLSR:
|
||||
dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
|
||||
return get_lsr_info(edge_port, (unsigned int __user *) arg);
|
||||
|
||||
case TIOCGSERIAL:
|
||||
dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
|
||||
return get_serial_info(edge_port, (struct serial_struct __user *) arg);
|
||||
}
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
|
@ -3126,6 +3117,7 @@ static struct usb_serial_driver edgeport_2port_device = {
|
|||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
|
|
@ -3161,6 +3153,7 @@ static struct usb_serial_driver edgeport_4port_device = {
|
|||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
|
|
@ -3196,6 +3189,7 @@ static struct usb_serial_driver edgeport_8port_device = {
|
|||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
|
|
@ -3231,6 +3225,7 @@ static struct usb_serial_driver epic_device = {
|
|||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
|
|
|
|||
|
|
@ -2437,47 +2437,28 @@ static int edge_tiocmget(struct tty_struct *tty)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct edgeport_port *edge_port,
|
||||
struct serial_struct __user *retinfo)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
unsigned cwait;
|
||||
|
||||
cwait = edge_port->port->port.closing_wait;
|
||||
if (cwait != ASYNC_CLOSING_WAIT_NONE)
|
||||
cwait = jiffies_to_msecs(cwait) / 10;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = edge_port->port->minor;
|
||||
tmp.port = edge_port->port->port_number;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = edge_port->port->bulk_out_size;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = cwait;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = edge_port->port->minor;
|
||||
ss->port = edge_port->port->port_number;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = edge_port->port->bulk_out_size;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = cwait;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int edge_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
dev_dbg(&port->dev, "%s - TIOCGSERIAL\n", __func__);
|
||||
return get_serial_info(edge_port,
|
||||
(struct serial_struct __user *) arg);
|
||||
}
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static void edge_break(struct tty_struct *tty, int break_state)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
|
@ -2738,7 +2719,7 @@ static struct usb_serial_driver edgeport_1port_device = {
|
|||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
|
|
@ -2777,7 +2758,7 @@ static struct usb_serial_driver edgeport_2port_device = {
|
|||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
|
|
|
|||
|
|
@ -1786,69 +1786,20 @@ static int mos7720_tiocmset(struct tty_struct *tty,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd,
|
||||
unsigned int __user *value)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
unsigned int mcr;
|
||||
unsigned int arg;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
|
||||
|
||||
struct usb_serial_port *port;
|
||||
|
||||
if (mos7720_port == NULL)
|
||||
return -1;
|
||||
|
||||
port = (struct usb_serial_port *)mos7720_port->port;
|
||||
mcr = mos7720_port->shadowMCR;
|
||||
|
||||
if (copy_from_user(&arg, value, sizeof(int)))
|
||||
return -EFAULT;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCMBIS:
|
||||
if (arg & TIOCM_RTS)
|
||||
mcr |= UART_MCR_RTS;
|
||||
if (arg & TIOCM_DTR)
|
||||
mcr |= UART_MCR_RTS;
|
||||
if (arg & TIOCM_LOOP)
|
||||
mcr |= UART_MCR_LOOP;
|
||||
break;
|
||||
|
||||
case TIOCMBIC:
|
||||
if (arg & TIOCM_RTS)
|
||||
mcr &= ~UART_MCR_RTS;
|
||||
if (arg & TIOCM_DTR)
|
||||
mcr &= ~UART_MCR_RTS;
|
||||
if (arg & TIOCM_LOOP)
|
||||
mcr &= ~UART_MCR_LOOP;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
mos7720_port->shadowMCR = mcr;
|
||||
write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
|
||||
mos7720_port->shadowMCR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct moschip_port *mos7720_port,
|
||||
struct serial_struct __user *retinfo)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = mos7720_port->port->minor;
|
||||
tmp.port = mos7720_port->port->port_number;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = 30*HZ;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = mos7720_port->port->minor;
|
||||
ss->port = mos7720_port->port->port_number;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = 30*HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1867,18 +1818,6 @@ static int mos7720_ioctl(struct tty_struct *tty,
|
|||
dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
|
||||
return get_lsr_info(tty, mos7720_port,
|
||||
(unsigned int __user *)arg);
|
||||
|
||||
/* FIXME: These should be using the mode methods */
|
||||
case TIOCMBIS:
|
||||
case TIOCMBIC:
|
||||
dev_dbg(&port->dev, "%s TIOCMSET/TIOCMBIC/TIOCMSET\n", __func__);
|
||||
return set_modem_info(mos7720_port, cmd,
|
||||
(unsigned int __user *)arg);
|
||||
|
||||
case TIOCGSERIAL:
|
||||
dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
|
||||
return get_serial_info(mos7720_port,
|
||||
(struct serial_struct __user *)arg);
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
|
|
@ -2015,6 +1954,7 @@ static struct usb_serial_driver moschip7720_2port_driver = {
|
|||
.ioctl = mos7720_ioctl,
|
||||
.tiocmget = mos7720_tiocmget,
|
||||
.tiocmset = mos7720_tiocmset,
|
||||
.get_serial = get_serial_info,
|
||||
.set_termios = mos7720_set_termios,
|
||||
.write = mos7720_write,
|
||||
.write_room = mos7720_write_room,
|
||||
|
|
|
|||
|
|
@ -1931,27 +1931,20 @@ static int mos7840_get_lsr_info(struct tty_struct *tty,
|
|||
* function to get information about serial port
|
||||
*****************************************************************************/
|
||||
|
||||
static int mos7840_get_serial_info(struct moschip_port *mos7840_port,
|
||||
struct serial_struct __user *retinfo)
|
||||
static int mos7840_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct moschip_port *mos7840_port = mos7840_get_port_private(port);
|
||||
|
||||
if (mos7840_port == NULL)
|
||||
return -1;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = mos7840_port->port->minor;
|
||||
tmp.port = mos7840_port->port->port_number;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5 * HZ;
|
||||
tmp.closing_wait = 30 * HZ;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = mos7840_port->port->minor;
|
||||
ss->port = mos7840_port->port->port_number;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5 * HZ;
|
||||
ss->closing_wait = 30 * HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1982,13 +1975,6 @@ static int mos7840_ioctl(struct tty_struct *tty,
|
|||
dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
|
||||
return mos7840_get_lsr_info(tty, argp);
|
||||
|
||||
case TIOCGSERIAL:
|
||||
dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
|
||||
return mos7840_get_serial_info(mos7840_port, argp);
|
||||
|
||||
case TIOCSSERIAL:
|
||||
dev_dbg(&port->dev, "%s TIOCSSERIAL\n", __func__);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -2376,6 +2362,7 @@ static struct usb_serial_driver moschip7840_4port_device = {
|
|||
.calc_num_ports = mos7840_calc_num_ports,
|
||||
.probe = mos7840_probe,
|
||||
.ioctl = mos7840_ioctl,
|
||||
.get_serial = mos7840_get_serial_info,
|
||||
.set_termios = mos7840_set_termios,
|
||||
.break_ctl = mos7840_break,
|
||||
.tiocmget = mos7840_tiocmget,
|
||||
|
|
|
|||
|
|
@ -328,40 +328,21 @@ static int opticon_tiocmset(struct tty_struct *tty,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *serial)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0x00, sizeof(tmp));
|
||||
|
||||
/* fake emulate a 16550 uart to make userspace code happy */
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = port->minor;
|
||||
tmp.port = 0;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = 1024;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = 30*HZ;
|
||||
|
||||
if (copy_to_user(serial, &tmp, sizeof(*serial)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opticon_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(port,
|
||||
(struct serial_struct __user *)arg);
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
/* fake emulate a 16550 uart to make userspace code happy */
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = port->minor;
|
||||
ss->port = 0;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = 1024;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = 30*HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opticon_port_probe(struct usb_serial_port *port)
|
||||
|
|
@ -404,7 +385,7 @@ static struct usb_serial_driver opticon_device = {
|
|||
.write_room = opticon_write_room,
|
||||
.throttle = usb_serial_generic_throttle,
|
||||
.unthrottle = usb_serial_generic_unthrottle,
|
||||
.ioctl = opticon_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.tiocmget = opticon_tiocmget,
|
||||
.tiocmset = opticon_tiocmset,
|
||||
.process_read_urb = opticon_process_read_urb,
|
||||
|
|
|
|||
|
|
@ -1966,7 +1966,8 @@ static struct usb_serial_driver option_1port_device = {
|
|||
.chars_in_buffer = usb_wwan_chars_in_buffer,
|
||||
.tiocmget = usb_wwan_tiocmget,
|
||||
.tiocmset = usb_wwan_tiocmset,
|
||||
.ioctl = usb_wwan_ioctl,
|
||||
.get_serial = usb_wwan_get_serial_info,
|
||||
.set_serial = usb_wwan_set_serial_info,
|
||||
.attach = option_attach,
|
||||
.release = option_release,
|
||||
.port_probe = usb_wwan_port_probe,
|
||||
|
|
|
|||
|
|
@ -808,29 +808,16 @@ static int pl2303_carrier_raised(struct usb_serial_port *port)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pl2303_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int pl2303_get_serial(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct ser;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
memset(&ser, 0, sizeof ser);
|
||||
ser.type = PORT_16654;
|
||||
ser.line = port->minor;
|
||||
ser.port = port->port_number;
|
||||
ser.baud_base = 460800;
|
||||
|
||||
if (copy_to_user((void __user *)arg, &ser, sizeof ser))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
ss->type = PORT_16654;
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->baud_base = 460800;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pl2303_set_break(struct usb_serial_port *port, bool enable)
|
||||
|
|
@ -1016,7 +1003,7 @@ static struct usb_serial_driver pl2303_device = {
|
|||
.close = pl2303_close,
|
||||
.dtr_rts = pl2303_dtr_rts,
|
||||
.carrier_raised = pl2303_carrier_raised,
|
||||
.ioctl = pl2303_ioctl,
|
||||
.get_serial = pl2303_get_serial,
|
||||
.break_ctl = pl2303_break_ctl,
|
||||
.set_termios = pl2303_set_termios,
|
||||
.tiocmget = pl2303_tiocmget,
|
||||
|
|
|
|||
|
|
@ -453,39 +453,19 @@ static void qt2_disconnect(struct usb_serial *serial)
|
|||
usb_kill_urb(serial_priv->read_urb);
|
||||
}
|
||||
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
tmp.line = port->minor;
|
||||
tmp.port = 0;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = port->bulk_out_size;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = 30*HZ;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qt2_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(port,
|
||||
(struct serial_struct __user *)arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
ss->line = port->minor;
|
||||
ss->port = 0;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = port->bulk_out_size;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = 30*HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qt2_process_status(struct usb_serial_port *port, unsigned char *ch)
|
||||
|
|
@ -1013,7 +993,7 @@ static struct usb_serial_driver qt2_device = {
|
|||
.tiocmset = qt2_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.ioctl = qt2_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.set_termios = qt2_set_termios,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -331,39 +331,19 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|||
return usb_serial_generic_open(tty, port);
|
||||
}
|
||||
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
tmp.line = port->minor;
|
||||
tmp.port = 0;
|
||||
tmp.irq = 0;
|
||||
tmp.xmit_fifo_size = port->bulk_out_size;
|
||||
tmp.baud_base = 9600;
|
||||
tmp.close_delay = 5*HZ;
|
||||
tmp.closing_wait = 30*HZ;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ssu100_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(port,
|
||||
(struct serial_struct __user *) arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
ss->line = port->minor;
|
||||
ss->port = 0;
|
||||
ss->irq = 0;
|
||||
ss->xmit_fifo_size = port->bulk_out_size;
|
||||
ss->baud_base = 9600;
|
||||
ss->close_delay = 5*HZ;
|
||||
ss->closing_wait = 30*HZ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ssu100_attach(struct usb_serial *serial)
|
||||
|
|
@ -566,7 +546,7 @@ static struct usb_serial_driver ssu100_device = {
|
|||
.tiocmset = ssu100_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.ioctl = ssu100_ioctl,
|
||||
.get_serial = get_serial_info,
|
||||
.set_termios = ssu100_set_termios,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -313,8 +313,6 @@ static int ti_chars_in_buffer(struct tty_struct *tty);
|
|||
static bool ti_tx_empty(struct usb_serial_port *port);
|
||||
static void ti_throttle(struct tty_struct *tty);
|
||||
static void ti_unthrottle(struct tty_struct *tty);
|
||||
static int ti_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
static void ti_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ktermios *old_termios);
|
||||
static int ti_tiocmget(struct tty_struct *tty);
|
||||
|
|
@ -330,10 +328,10 @@ static void ti_recv(struct usb_serial_port *port, unsigned char *data,
|
|||
static void ti_send(struct ti_port *tport);
|
||||
static int ti_set_mcr(struct ti_port *tport, unsigned int mcr);
|
||||
static int ti_get_lsr(struct ti_port *tport, u8 *lsr);
|
||||
static int ti_get_serial_info(struct ti_port *tport,
|
||||
struct serial_struct __user *ret_arg);
|
||||
static int ti_set_serial_info(struct tty_struct *tty, struct ti_port *tport,
|
||||
struct serial_struct __user *new_arg);
|
||||
static int ti_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
static int ti_set_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
static void ti_handle_new_msr(struct ti_port *tport, u8 msr);
|
||||
|
||||
static void ti_stop_read(struct ti_port *tport, struct tty_struct *tty);
|
||||
|
|
@ -436,7 +434,8 @@ static struct usb_serial_driver ti_1port_device = {
|
|||
.tx_empty = ti_tx_empty,
|
||||
.throttle = ti_throttle,
|
||||
.unthrottle = ti_unthrottle,
|
||||
.ioctl = ti_ioctl,
|
||||
.get_serial = ti_get_serial_info,
|
||||
.set_serial = ti_set_serial_info,
|
||||
.set_termios = ti_set_termios,
|
||||
.tiocmget = ti_tiocmget,
|
||||
.tiocmset = ti_tiocmset,
|
||||
|
|
@ -469,7 +468,8 @@ static struct usb_serial_driver ti_2port_device = {
|
|||
.tx_empty = ti_tx_empty,
|
||||
.throttle = ti_throttle,
|
||||
.unthrottle = ti_unthrottle,
|
||||
.ioctl = ti_ioctl,
|
||||
.get_serial = ti_get_serial_info,
|
||||
.set_serial = ti_set_serial_info,
|
||||
.set_termios = ti_set_termios,
|
||||
.tiocmget = ti_tiocmget,
|
||||
.tiocmset = ti_tiocmset,
|
||||
|
|
@ -902,24 +902,6 @@ static void ti_unthrottle(struct tty_struct *tty)
|
|||
}
|
||||
}
|
||||
|
||||
static int ti_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ti_port *tport = usb_get_serial_port_data(port);
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return ti_get_serial_info(tport,
|
||||
(struct serial_struct __user *)arg);
|
||||
case TIOCSSERIAL:
|
||||
return ti_set_serial_info(tty, tport,
|
||||
(struct serial_struct __user *)arg);
|
||||
}
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
|
||||
static void ti_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ktermios *old_termios)
|
||||
{
|
||||
|
|
@ -1417,45 +1399,37 @@ free_data:
|
|||
}
|
||||
|
||||
|
||||
static int ti_get_serial_info(struct ti_port *tport,
|
||||
struct serial_struct __user *ret_arg)
|
||||
static int ti_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tport->tp_port;
|
||||
struct serial_struct ret_serial;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ti_port *tport = usb_get_serial_port_data(port);
|
||||
unsigned cwait;
|
||||
|
||||
cwait = port->port.closing_wait;
|
||||
if (cwait != ASYNC_CLOSING_WAIT_NONE)
|
||||
cwait = jiffies_to_msecs(cwait) / 10;
|
||||
|
||||
memset(&ret_serial, 0, sizeof(ret_serial));
|
||||
|
||||
ret_serial.type = PORT_16550A;
|
||||
ret_serial.line = port->minor;
|
||||
ret_serial.port = port->port_number;
|
||||
ret_serial.xmit_fifo_size = kfifo_size(&port->write_fifo);
|
||||
ret_serial.baud_base = tport->tp_tdev->td_is_3410 ? 921600 : 460800;
|
||||
ret_serial.closing_wait = cwait;
|
||||
|
||||
if (copy_to_user(ret_arg, &ret_serial, sizeof(*ret_arg)))
|
||||
return -EFAULT;
|
||||
|
||||
ss->type = PORT_16550A;
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->xmit_fifo_size = kfifo_size(&port->write_fifo);
|
||||
ss->baud_base = tport->tp_tdev->td_is_3410 ? 921600 : 460800;
|
||||
ss->closing_wait = cwait;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int ti_set_serial_info(struct tty_struct *tty, struct ti_port *tport,
|
||||
struct serial_struct __user *new_arg)
|
||||
static int ti_set_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct new_serial;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ti_port *tport = usb_get_serial_port_data(port);
|
||||
unsigned cwait;
|
||||
|
||||
if (copy_from_user(&new_serial, new_arg, sizeof(new_serial)))
|
||||
return -EFAULT;
|
||||
|
||||
cwait = new_serial.closing_wait;
|
||||
cwait = ss->closing_wait;
|
||||
if (cwait != ASYNC_CLOSING_WAIT_NONE)
|
||||
cwait = msecs_to_jiffies(10 * new_serial.closing_wait);
|
||||
cwait = msecs_to_jiffies(10 * ss->closing_wait);
|
||||
|
||||
tport->tp_port->port.closing_wait = cwait;
|
||||
|
||||
|
|
|
|||
|
|
@ -396,6 +396,24 @@ static void serial_unthrottle(struct tty_struct *tty)
|
|||
port->serial->type->unthrottle(tty);
|
||||
}
|
||||
|
||||
static int serial_get_serial(struct tty_struct *tty, struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
if (port->serial->type->get_serial)
|
||||
return port->serial->type->get_serial(tty, ss);
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
static int serial_set_serial(struct tty_struct *tty, struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
if (port->serial->type->set_serial)
|
||||
return port->serial->type->set_serial(tty, ss);
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
static int serial_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
|
@ -1177,6 +1195,8 @@ static const struct tty_operations serial_ops = {
|
|||
.tiocmget = serial_tiocmget,
|
||||
.tiocmset = serial_tiocmset,
|
||||
.get_icount = serial_get_icount,
|
||||
.set_serial = serial_set_serial,
|
||||
.get_serial = serial_get_serial,
|
||||
.cleanup = serial_cleanup,
|
||||
.install = serial_install,
|
||||
.proc_show = serial_proc_show,
|
||||
|
|
|
|||
|
|
@ -15,8 +15,10 @@ extern int usb_wwan_write_room(struct tty_struct *tty);
|
|||
extern int usb_wwan_tiocmget(struct tty_struct *tty);
|
||||
extern int usb_wwan_tiocmset(struct tty_struct *tty,
|
||||
unsigned int set, unsigned int clear);
|
||||
extern int usb_wwan_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int usb_wwan_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
extern int usb_wwan_set_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
extern int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count);
|
||||
extern int usb_wwan_chars_in_buffer(struct tty_struct *tty);
|
||||
|
|
|
|||
|
|
@ -132,38 +132,32 @@ int usb_wwan_tiocmset(struct tty_struct *tty,
|
|||
}
|
||||
EXPORT_SYMBOL(usb_wwan_tiocmset);
|
||||
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *retinfo)
|
||||
int usb_wwan_get_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
tmp.line = port->minor;
|
||||
tmp.port = port->port_number;
|
||||
tmp.baud_base = tty_get_baud_rate(port->port.tty);
|
||||
tmp.close_delay = port->port.close_delay / 10;
|
||||
tmp.closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->baud_base = tty_get_baud_rate(port->port.tty);
|
||||
ss->close_delay = port->port.close_delay / 10;
|
||||
ss->closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
port->port.closing_wait / 10;
|
||||
|
||||
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_get_serial_info);
|
||||
|
||||
static int set_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *newinfo)
|
||||
int usb_wwan_set_serial_info(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct serial_struct new_serial;
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
unsigned int closing_wait, close_delay;
|
||||
int retval = 0;
|
||||
|
||||
if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
|
||||
return -EFAULT;
|
||||
|
||||
close_delay = new_serial.close_delay * 10;
|
||||
closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
|
||||
close_delay = ss->close_delay * 10;
|
||||
closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10;
|
||||
|
||||
mutex_lock(&port->port.mutex);
|
||||
|
||||
|
|
@ -181,30 +175,7 @@ static int set_serial_info(struct usb_serial_port *port,
|
|||
mutex_unlock(&port->port.mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
int usb_wwan_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
||||
dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(port,
|
||||
(struct serial_struct __user *) arg);
|
||||
case TIOCSSERIAL:
|
||||
return set_serial_info(port,
|
||||
(struct serial_struct __user *) arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s arg not supported\n", __func__);
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_ioctl);
|
||||
EXPORT_SYMBOL(usb_wwan_set_serial_info);
|
||||
|
||||
int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count)
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@ static int whiteheat_port_remove(struct usb_serial_port *port);
|
|||
static int whiteheat_open(struct tty_struct *tty,
|
||||
struct usb_serial_port *port);
|
||||
static void whiteheat_close(struct usb_serial_port *port);
|
||||
static int whiteheat_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
static int whiteheat_get_serial(struct tty_struct *tty,
|
||||
struct serial_struct *ss);
|
||||
static void whiteheat_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ktermios *old);
|
||||
static int whiteheat_tiocmget(struct tty_struct *tty);
|
||||
|
|
@ -120,7 +120,7 @@ static struct usb_serial_driver whiteheat_device = {
|
|||
.port_remove = whiteheat_port_remove,
|
||||
.open = whiteheat_open,
|
||||
.close = whiteheat_close,
|
||||
.ioctl = whiteheat_ioctl,
|
||||
.get_serial = whiteheat_get_serial,
|
||||
.set_termios = whiteheat_set_termios,
|
||||
.break_ctl = whiteheat_break_ctl,
|
||||
.tiocmget = whiteheat_tiocmget,
|
||||
|
|
@ -442,33 +442,21 @@ static int whiteheat_tiocmset(struct tty_struct *tty,
|
|||
}
|
||||
|
||||
|
||||
static int whiteheat_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int whiteheat_get_serial(struct tty_struct *tty,
|
||||
struct serial_struct *ss)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct serial_struct serstruct;
|
||||
void __user *user_arg = (void __user *)arg;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
memset(&serstruct, 0, sizeof(serstruct));
|
||||
serstruct.type = PORT_16654;
|
||||
serstruct.line = port->minor;
|
||||
serstruct.port = port->port_number;
|
||||
serstruct.xmit_fifo_size = kfifo_size(&port->write_fifo);
|
||||
serstruct.custom_divisor = 0;
|
||||
serstruct.baud_base = 460800;
|
||||
serstruct.close_delay = CLOSING_DELAY;
|
||||
serstruct.closing_wait = CLOSING_DELAY;
|
||||
ss->type = PORT_16654;
|
||||
ss->line = port->minor;
|
||||
ss->port = port->port_number;
|
||||
ss->xmit_fifo_size = kfifo_size(&port->write_fifo);
|
||||
ss->custom_divisor = 0;
|
||||
ss->baud_base = 460800;
|
||||
ss->close_delay = CLOSING_DELAY;
|
||||
ss->closing_wait = CLOSING_DELAY;
|
||||
|
||||
if (copy_to_user(user_arg, &serstruct, sizeof(serstruct)))
|
||||
return -EFAULT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue