diff options
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/serqt_usb/serqt_usb.c | 449 |
1 files changed, 163 insertions, 286 deletions
diff --git a/drivers/staging/serqt_usb/serqt_usb.c b/drivers/staging/serqt_usb/serqt_usb.c index 1781510c53f..234f332fc82 100644 --- a/drivers/staging/serqt_usb/serqt_usb.c +++ b/drivers/staging/serqt_usb/serqt_usb.c @@ -289,7 +289,8 @@ static void serial_unthrottle(struct tty_struct *tty); static int serial_break(struct tty_struct *tty, int break_state); static int serial_chars_in_buffer(struct tty_struct *tty); -static int qt_open(struct usb_serial_port *port, struct file *filp); +static int qt_open(struct tty_struct *tty, struct usb_serial_port *port, + struct file *filp); static int BoxSetPrebufferLevel(struct usb_serial *serial); static int BoxSetATC(struct usb_serial *serial, __u16 n_Mode); @@ -300,24 +301,26 @@ static int BoxSetUart(struct usb_serial *serial, unsigned short Uart_Number, static int BoxOPenCloseChannel(struct usb_serial *serial, __u16 Uart_Number, __u16 OpenClose, struct qt_open_channel_data *pDeviceData); -static void qt_close(struct usb_serial_port *port, struct file *filp); +static void qt_close(struct tty_struct *tty, struct usb_serial_port *port, + struct file *filp); static int BoxGetRegister(struct usb_serial *serial, unsigned short Uart_Number, unsigned short Register_Num, __u8 *pValue); static int BoxSetRegister(struct usb_serial *serial, unsigned short Uart_Number, unsigned short Register_Num, unsigned short Value); static void qt_write_bulk_callback(struct urb *urb); -static int qt_write(struct usb_serial_port *port, int from_user, +static int qt_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *buf, int count); static void port_softint(struct work_struct *work); static int qt_write_room(struct usb_serial_port *port); static int qt_chars_in_buffer(struct usb_serial_port *port); -static int qt_ioctl(struct usb_serial_port *port, struct file *file, - unsigned int cmd, unsigned long arg); -static void qt_set_termios(struct usb_serial_port *port, +static int qt_ioctl(struct tty_struct *tty, struct usb_serial_port *port, + struct file *file, unsigned int cmd, unsigned long arg); +static void qt_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); -static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber, +static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int index, int bSet); -static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber); +static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 index); static int EmulateWriteQMCR_Reg(int index, unsigned uc_value); static int EmulateReadQMCR_Reg(int index, unsigned *uc_value); static struct usb_serial *find_the_box(unsigned int index); @@ -336,10 +339,11 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear); static int serial_tiocmget(struct tty_struct *tty, struct file *file); -static int qt_tiocmset(struct usb_serial_port *port, struct file *file, - unsigned int value); +static int qt_tiocmset(struct tty_struct *tty, struct usb_serial_port *port, + struct file *file, unsigned int value); -static int qt_tiocmget(struct usb_serial_port *port, struct file *file); +static int qt_tiocmget(struct tty_struct *tty, struct usb_serial_port *port, + struct file *file); /* Version Information */ #define DRIVER_VERSION "v2.14" @@ -818,7 +822,7 @@ static struct usb_serial *get_free_serial(int num_ports, int *minor) return NULL; } -static int flip_that(struct tty_struct *tty, __u16 UartNumber, +static int flip_that(struct tty_struct *tty, __u16 index, struct usb_serial *serial) { tty_flip_buffer_push(tty); @@ -829,18 +833,18 @@ static int flip_that(struct tty_struct *tty, __u16 UartNumber, /* Handles processing and moving data to the tty layer */ static void port_sofrint(void *private) { - struct usb_serial_port *port = (struct usb_serial_port *)private; + struct usb_serial_port *port = private; struct usb_serial *serial = get_usb_serial(port, __func__); struct tty_struct *tty = port->tty; unsigned char *data = port->read_urb->transfer_buffer; - unsigned int UartNumber; + unsigned int index; struct urb *urb = port->read_urb; unsigned int RxCount = urb->actual_length; int i, result; int flag, flag_data; - /* UartNumber = MINOR(port->tty->device) - serial->minor; */ - UartNumber = tty->index - serial->minor; + /* index = MINOR(port->tty->device) - serial->minor; */ + index = tty->index - serial->minor; mydbg("%s - port %d\n", __func__, port->number); mydbg("%s - port->RxHolding = %d\n", __func__, port->RxHolding); @@ -948,7 +952,7 @@ static void port_sofrint(void *private) __func__, result); else { if (tty && RxCount) - flip_that(tty, UartNumber, serial); + flip_that(tty, index, serial); } return; @@ -1097,7 +1101,7 @@ static int serial_open(struct tty_struct *tty, struct file *filp) port->RxHolding = 0; mydbg("%s port->RxHolding = 0\n", __func__); - retval = qt_open(port, filp); + retval = qt_open(tty, port, filp); } if (retval) @@ -1112,11 +1116,12 @@ static int serial_open(struct tty_struct *tty, struct file *filp) /***************************************************************************** *device's specific driver functions *****************************************************************************/ -static int qt_open(struct usb_serial_port *port, struct file *filp) +static int qt_open(struct tty_struct *tty, struct usb_serial_port *port, + struct file *filp) { struct usb_serial *serial = port->serial; int result = 0; - unsigned int UartNumber; + unsigned int index; struct qt_get_device_data DeviceData; struct qt_open_channel_data ChannelData; unsigned short default_divisor = 0x30; /* gives 9600 baud rate */ @@ -1128,13 +1133,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp) mydbg("%s - port %d\n", __func__, port->number); - /* force low_latency on so that our tty_push actually forces the data through, - otherwise it is scheduled, and with high data rates (like with OHCI) data - can get lost. */ - if (port->tty) - port->tty->low_latency = 0; - - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; status = box_get_device(serial, &DeviceData); if (status < 0) { @@ -1147,7 +1146,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp) /* Open uart channel */ /* Port specific setups */ - status = BoxOPenCloseChannel(serial, UartNumber, 1, &ChannelData); + status = BoxOPenCloseChannel(serial, index, 1, &ChannelData); if (status < 0) { mydbg(__FILE__ "BoxOPenCloseChannel failed\n"); return status; @@ -1161,7 +1160,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp) (SERIAL_MSR_CTS | SERIAL_MSR_DSR | SERIAL_MSR_RI | SERIAL_MSR_CD); /* Set Baud rate to default and turn off (default)flow control here */ - status = BoxSetUart(serial, UartNumber, default_divisor, default_LCR); + status = BoxSetUart(serial, index, default_divisor, default_LCR); if (status < 0) { mydbg(__FILE__ "BoxSetUart failed\n"); return status; @@ -1169,7 +1168,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp) mydbg(__FILE__ "BoxSetUart completed.\n"); /* Put this here to make it responsive to stty and defauls set by the tty layer */ - qt_set_termios(port, NULL); + qt_set_termios(tty, port, NULL); /* Initialize the wait que head */ init_waitqueue_head(&(port->wait)); @@ -1203,7 +1202,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp) static void serial_close(struct tty_struct *tty, struct file *filp) { struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); if (!serial) @@ -1226,7 +1225,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp) mydbg("%s - port->closePending = 1\n", __func__); if (serial->dev) { - qt_close(port, filp); + qt_close(tty, port, filp); port->open_count = 0; } } @@ -1240,20 +1239,21 @@ exit: } -static void qt_close(struct usb_serial_port *port, struct file *filp) +static void qt_close(struct tty_struct *tty, struct usb_serial_port *port, + struct file *filp) { unsigned long jift = jiffies + 10 * HZ; - __u8 LSR_Value, MCR_Value; + u8 lsr, mcr; struct usb_serial *serial = port->serial; int status; - unsigned int UartNumber; + unsigned int index; struct qt_open_channel_data ChannelData; status = 0; - LSR_Value = 0; + lsr = 0; mydbg("%s - port %d\n", __func__, port->number); - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; /* shutdown any bulk reads that might be going on */ if (serial->num_bulk_out) @@ -1263,20 +1263,19 @@ static void qt_close(struct usb_serial_port *port, struct file *filp) /* wait up to 30 seconds for transmitter to empty */ do { - status = BoxGetRegister(serial, UartNumber, LINE_STATUS_REGISTER, &LSR_Value); + status = BoxGetRegister(serial, index, LINE_STATUS_REGISTER, &lsr); if (status < 0) { mydbg(__FILE__ "box_get_device failed\n"); break; } - if ((LSR_Value & SERIAL_LSR_TEMT) + if ((lsr & SERIAL_LSR_TEMT) && (port->ReadBulkStopped == 1)) break; schedule(); } - while (jiffies <= jift) - ; + while (jiffies <= jift); if (jiffies > jift) mydbg("%s - port %d timout of checking transmitter empty\n", @@ -1286,17 +1285,17 @@ static void qt_close(struct usb_serial_port *port, struct file *filp) __func__, port->number); status = - BoxGetRegister(serial, UartNumber, MODEM_CONTROL_REGISTER, - &MCR_Value); - mydbg(__FILE__ "BoxGetRegister MCR = 0x%x.\n", MCR_Value); + BoxGetRegister(serial, index, MODEM_CONTROL_REGISTER, + &mcr); + mydbg(__FILE__ "BoxGetRegister MCR = 0x%x.\n", mcr); if (status >= 0) { - MCR_Value &= ~(SERIAL_MCR_DTR | SERIAL_MCR_RTS); - /* status = BoxSetRegister(serial, UartNumber, MODEM_CONTROL_REGISTER, MCR_Value); */ + mcr &= ~(SERIAL_MCR_DTR | SERIAL_MCR_RTS); + /* status = BoxSetRegister(serial, index, MODEM_CONTROL_REGISTER, mcr); */ } /* Close uart channel */ - status = BoxOPenCloseChannel(serial, UartNumber, 0, &ChannelData); + status = BoxOPenCloseChannel(serial, index, 0, &ChannelData); if (status < 0) mydbg("%s - port %d BoxOPenCloseChannel failed.\n", __func__, port->number); @@ -1308,12 +1307,10 @@ static void qt_close(struct usb_serial_port *port, struct file *filp) static int serial_write(struct tty_struct *tty, const unsigned char *buf, int count) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial; int retval = -EINVAL; - unsigned int UartNumber; - int from_user = 0; + unsigned int index; serial = get_usb_serial(port, __func__); if (serial == NULL) @@ -1321,7 +1318,7 @@ static int serial_write(struct tty_struct *tty, const unsigned char *buf, /* This can happen if we get disconnected a */ if (port->open_count == 0) return -ENODEV; - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; mydbg("%s - port %d, %d byte(s)\n", __func__, port->number, count); mydbg("%s - port->RxHolding = %d\n", __func__, port->RxHolding); @@ -1331,19 +1328,19 @@ static int serial_write(struct tty_struct *tty, const unsigned char *buf, goto exit; } - retval = qt_write(port, from_user, buf, count); + retval = qt_write(tty, port, buf, count); exit: return retval; } -static int qt_write(struct usb_serial_port *port, int from_user, - const unsigned char *buf, int count) +static int qt_write(struct tty_struct *tty, struct usb_serial_port *port, + const unsigned char *buf, int count) { int result; - unsigned int UartNumber; - + unsigned int index; struct usb_serial *serial = get_usb_serial(port, __func__); + if (serial == NULL) return -ENODEV; @@ -1354,7 +1351,7 @@ static int qt_write(struct usb_serial_port *port, int from_user, return 0; } - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; /* only do something if we have a bulk out endpoint */ if (serial->num_bulk_out) { if (port->write_urb->status == -EINPROGRESS) { @@ -1364,14 +1361,7 @@ static int qt_write(struct usb_serial_port *port, int from_user, count = (count > port->bulk_out_size) ? port->bulk_out_size : count; - - if (from_user) { - if (copy_from_user - (port->write_urb->transfer_buffer, buf, count)) - return -EFAULT; - } else { - memcpy(port->write_urb->transfer_buffer, buf, count); - } + memcpy(port->write_urb->transfer_buffer, buf, count); /* usb_serial_debug_data(__FILE__, __func__, count, port->write_urb->transfer_buffer); */ @@ -1449,8 +1439,7 @@ static void port_softint(struct work_struct *work) } static int serial_write_room(struct tty_struct *tty) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); int retval = -EINVAL; @@ -1493,8 +1482,7 @@ static int qt_write_room(struct usb_serial_port *port) } static int serial_chars_in_buffer(struct tty_struct *tty) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); int retval = -EINVAL; @@ -1537,17 +1525,16 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); int retval = -ENODEV; - unsigned int UartNumber; + unsigned int index; mydbg("In %s \n", __func__); if (!serial) return -ENODEV; - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; down(&port->sem); @@ -1559,22 +1546,22 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file, goto exit; } - retval = qt_tiocmset(port, file, set); + retval = qt_tiocmset(tty, port, file, set); exit: up(&port->sem); return retval; } -static int qt_tiocmset(struct usb_serial_port *port, struct file *file, - unsigned int value) +static int qt_tiocmset(struct tty_struct *tty, struct usb_serial_port *port, + struct file *file, unsigned int value) { - __u8 MCR_Value; + u8 mcr; int status; - unsigned int UartNumber; - + unsigned int index; struct usb_serial *serial = get_usb_serial(port, __func__); + if (serial == NULL) return -ENODEV; @@ -1583,10 +1570,10 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file, /**************************************************************************************/ /** TIOCMGET */ - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; status = - BoxGetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER, - &MCR_Value); + BoxGetRegister(port->serial, index, MODEM_CONTROL_REGISTER, + &mcr); if (status < 0) return -ESPIPE; @@ -1594,17 +1581,17 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file, * Turn off the RTS and DTR and loopbcck and then only turn on what was * asked for */ - MCR_Value &= ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR | SERIAL_MCR_LOOP); + mcr &= ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR | SERIAL_MCR_LOOP); if (value & TIOCM_RTS) - MCR_Value |= SERIAL_MCR_RTS; + mcr |= SERIAL_MCR_RTS; if (value & TIOCM_DTR) - MCR_Value |= SERIAL_MCR_DTR; + mcr |= SERIAL_MCR_DTR; if (value & TIOCM_LOOP) - MCR_Value |= SERIAL_MCR_LOOP; + mcr |= SERIAL_MCR_LOOP; status = - BoxSetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER, - MCR_Value); + BoxSetRegister(port->serial, index, MODEM_CONTROL_REGISTER, + mcr); if (status < 0) return -ESPIPE; else @@ -1614,18 +1601,16 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file, static int serial_tiocmget(struct tty_struct *tty, struct file *file) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; - + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); int retval = -ENODEV; - unsigned int UartNumber; + unsigned int index; mydbg("In %s \n", __func__); if (!serial) return -ENODEV; - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; down(&port->sem); @@ -1637,56 +1622,55 @@ static int serial_tiocmget(struct tty_struct *tty, struct file *file) goto exit; } - retval = qt_tiocmget(port, file); + retval = qt_tiocmget(tty, port, file); exit: up(&port->sem); return retval; } -static int qt_tiocmget(struct usb_serial_port *port, struct file *file) +static int qt_tiocmget(struct tty_struct *tty, + struct usb_serial_port *port, struct file *file) { - __u8 MCR_Value; - __u8 MSR_Value; + u8 mcr; + u8 msr; unsigned int result = 0; int status; - unsigned int UartNumber; - struct tty_struct *tty; + unsigned int index; struct usb_serial *serial = get_usb_serial(port, __func__); if (serial == NULL) return -ENODEV; - tty = port->tty; mydbg("%s - port %d, tty =0x%p\n", __func__, port->number, tty); /**************************************************************************************/ /** TIOCMGET */ - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; status = - BoxGetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER, - &MCR_Value); + BoxGetRegister(port->serial, index, MODEM_CONTROL_REGISTER, + &mcr); if (status >= 0) { status = - BoxGetRegister(port->serial, UartNumber, - MODEM_STATUS_REGISTER, &MSR_Value); + BoxGetRegister(port->serial, index, + MODEM_STATUS_REGISTER, &msr); } if (status >= 0) { - result = ((MCR_Value & SERIAL_MCR_DTR) ? TIOCM_DTR : 0) + result = ((mcr & SERIAL_MCR_DTR) ? TIOCM_DTR : 0) /* DTR IS SET */ - | ((MCR_Value & SERIAL_MCR_RTS) ? TIOCM_RTS : 0) + | ((mcr & SERIAL_MCR_RTS) ? TIOCM_RTS : 0) /* RTS IS SET */ - | ((MSR_Value & SERIAL_MSR_CTS) ? TIOCM_CTS : 0) + | ((msr & SERIAL_MSR_CTS) ? TIOCM_CTS : 0) /* CTS is set */ - | ((MSR_Value & SERIAL_MSR_CD) ? TIOCM_CAR : 0) + | ((msr & SERIAL_MSR_CD) ? TIOCM_CAR : 0) /* Carrier detect is set */ - | ((MSR_Value & SERIAL_MSR_RI) ? TIOCM_RI : 0) + | ((msr & SERIAL_MSR_RI) ? TIOCM_RI : 0) /* Ring indicator set */ - | ((MSR_Value & SERIAL_MSR_DSR) ? TIOCM_DSR : 0); + | ((msr & SERIAL_MSR_DSR) ? TIOCM_DSR : 0); /* DSR is set */ return result; @@ -1698,17 +1682,16 @@ static int serial_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); int retval = -ENODEV; - unsigned int UartNumber; + unsigned int index; mydbg("In %s \n", __func__); if (!serial) return -ENODEV; - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; down(&port->sem); @@ -1720,125 +1703,34 @@ static int serial_ioctl(struct tty_struct *tty, struct file *file, goto exit; } - retval = qt_ioctl(port, file, cmd, arg); + retval = qt_ioctl(tty, port, file, cmd, arg); exit: up(&port->sem); return retval; } -static int qt_ioctl(struct usb_serial_port *port, struct file *file, - unsigned int cmd, unsigned long arg) +static int qt_ioctl(struct tty_struct *tty, struct usb_serial_port *port, + struct file *file, unsigned int cmd, unsigned long arg) { - __u8 MCR_Value; - __u8 MSR_Value; - unsigned short Prev_MSR_Value; + __u8 mcr; + __u8 msr; + unsigned short prev_msr; unsigned int value, result = 0; int status; - unsigned int UartNumber; - struct tty_struct *tty; + unsigned int index; struct usb_serial *serial = get_usb_serial(port, __func__); if (serial == NULL) return -ENODEV; - tty = port->tty; mydbg("%s - port %d, tty =0x%p\n", __func__, port->number, tty); /* TIOCMGET */ - UartNumber = port->tty->index - serial->minor; - - if (cmd == TIOCMGET) { - MCR_Value = port->shadowMCR; - MSR_Value = port->shadowMSR; - - { - result = ((MCR_Value & SERIAL_MCR_DTR) ? TIOCM_DTR : 0) - /* DTR IS SET */ - | ((MCR_Value & SERIAL_MCR_RTS) ? TIOCM_RTS : 0) - /* RTS IS SET */ - | ((MSR_Value & SERIAL_MSR_CTS) ? TIOCM_CTS : 0) - /* CTS is set */ - | ((MSR_Value & SERIAL_MSR_CD) ? TIOCM_CAR : 0) - /* Carrier detect is set */ - | ((MSR_Value & SERIAL_MSR_RI) ? TIOCM_RI : 0) - /* Ring indicator set */ - | ((MSR_Value & SERIAL_MSR_DSR) ? TIOCM_DSR : 0); - /* DSR is set */ - if (copy_to_user - ((unsigned int *)arg, &result, - sizeof(unsigned int))) - return -EFAULT; - return 0; - - } - } - - /* TIOCMBIS, TIOCMBIC, AND TIOCMSET */ - if (cmd == TIOCMBIS || cmd == TIOCMBIC || cmd == TIOCMSET) { - status = - BoxGetRegister(port->serial, UartNumber, - MODEM_CONTROL_REGISTER, &MCR_Value); - if (status < 0) - return -ESPIPE; - if (copy_from_user - (&value, (unsigned int *)arg, sizeof(unsigned int))) - return -EFAULT; - - switch (cmd) { - case TIOCMBIS: - if (value & TIOCM_RTS) - MCR_Value |= SERIAL_MCR_RTS; - if (value & TIOCM_DTR) - MCR_Value |= SERIAL_MCR_DTR; - if (value & TIOCM_LOOP) - MCR_Value |= SERIAL_MCR_LOOP; - break; - case TIOCMBIC: - if (value & TIOCM_RTS) - MCR_Value &= ~SERIAL_MCR_RTS; - if (value & TIOCM_DTR) - MCR_Value &= ~SERIAL_MCR_DTR; - if (value & TIOCM_LOOP) - MCR_Value &= ~SERIAL_MCR_LOOP; - break; - case TIOCMSET: - /* - * Turn off the RTS and DTR and loopbcck and then only - * turn on what was asked for - */ - MCR_Value &= - ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR | - SERIAL_MCR_LOOP); - if (value & TIOCM_RTS) - MCR_Value |= SERIAL_MCR_RTS; - if (value & TIOCM_DTR) - MCR_Value |= SERIAL_MCR_DTR; - if (value & TIOCM_LOOP) - MCR_Value |= SERIAL_MCR_LOOP; - break; - default: - break; - - } - status = - BoxSetRegister(port->serial, UartNumber, - MODEM_CONTROL_REGISTER, MCR_Value); - if (status < 0) - return -ESPIPE; - else { - port->shadowMCR = MCR_Value; - return 0; - } - - } - /**************************************************************************************/ - /** TIOCMBIS, TIOCMBIC, AND TIOCMSET end - */ - /**************************************************************************************/ + index = tty->index - serial->minor; if (cmd == TIOCMIWAIT) { DECLARE_WAITQUEUE(wait, current); - Prev_MSR_Value = port->shadowMSR & SERIAL_MSR_MASK; + prev_msr = port->shadowMSR & SERIAL_MSR_MASK; while (1) { add_wait_queue(&port->wait, &wait); set_current_state(TASK_INTERRUPTIBLE); @@ -1847,22 +1739,22 @@ static int qt_ioctl(struct usb_serial_port *port, struct file *file, /* see if a signal woke us up */ if (signal_pending(current)) return -ERESTARTSYS; - MSR_Value = port->shadowMSR & SERIAL_MSR_MASK; - if (MSR_Value == Prev_MSR_Value) + msr = port->shadowMSR & SERIAL_MSR_MASK; + if (msr == prev_msr) return -EIO; /* no change error */ if ((arg & TIOCM_RNG - && ((Prev_MSR_Value & SERIAL_MSR_RI) == - (MSR_Value & SERIAL_MSR_RI))) + && ((prev_msr & SERIAL_MSR_RI) == + (msr & SERIAL_MSR_RI))) || (arg & TIOCM_DSR - && ((Prev_MSR_Value & SERIAL_MSR_DSR) == - (MSR_Value & SERIAL_MSR_DSR))) + && ((prev_msr & SERIAL_MSR_DSR) == + (msr & SERIAL_MSR_DSR))) || (arg & TIOCM_CD - && ((Prev_MSR_Value & SERIAL_MSR_CD) == - (MSR_Value & SERIAL_MSR_CD))) + && ((prev_msr & SERIAL_MSR_CD) == + (msr & SERIAL_MSR_CD))) || (arg & TIOCM_CTS - && ((Prev_MSR_Value & SERIAL_MSR_CTS) == - (MSR_Value & SERIAL_MSR_CTS)))) { + && ((prev_msr & SERIAL_MSR_CTS) == + (msr & SERIAL_MSR_CTS)))) { return 0; } @@ -1878,7 +1770,7 @@ static int qt_ioctl(struct usb_serial_port *port, struct file *file, static void serial_set_termios(struct tty_struct *tty, struct ktermios *old) { struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); if (!serial) @@ -1894,22 +1786,22 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old) } /* pass on to the driver specific version of this function if it is available */ - qt_set_termios(port, old); + qt_set_termios(tty, port, old); exit: up(&port->sem); } -static void qt_set_termios(struct usb_serial_port *port, +static void qt_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios) { unsigned int cflag; int baud, divisor, remainder; - unsigned char LCR_change_to = 0; - struct tty_struct *tty; + unsigned char new_LCR = 0; int status; struct usb_serial *serial; - __u16 UartNumber; + __u16 index; __u16 tmp, tmp2; mydbg("%s - port %d\n", __func__, port->number); @@ -1921,59 +1813,46 @@ static void qt_set_termios(struct usb_serial_port *port, tmp2 = serial->minor; mydbg("%s - serial->minor = %d\n", __func__, tmp2); - UartNumber = port->tty->index - serial->minor; - - tty = port->tty; + index = port->tty->index - serial->minor; cflag = tty->termios->c_cflag; - if (old_termios) { - if ((cflag == old_termios->c_cflag) - && (RELEVANT_IFLAG(tty->termios->c_iflag) == - RELEVANT_IFLAG(old_termios->c_iflag))) { - mydbg("%s - Nothing to change\n", __func__); - return; - } - - } - mydbg("%s - 3\n", __func__); switch (cflag) { case CS5: - LCR_change_to |= SERIAL_5_DATA; + new_LCR |= SERIAL_5_DATA; break; case CS6: - LCR_change_to |= SERIAL_6_DATA; + new_LCR |= SERIAL_6_DATA; break; case CS7: - LCR_change_to |= SERIAL_7_DATA; + new_LCR |= SERIAL_7_DATA; break; default: case CS8: - LCR_change_to |= SERIAL_8_DATA; + new_LCR |= SERIAL_8_DATA; break; } /* Parity stuff */ if (cflag & PARENB) { if (cflag & PARODD) - LCR_change_to |= SERIAL_ODD_PARITY; + new_LCR |= SERIAL_ODD_PARITY; else - LCR_change_to |= SERIAL_EVEN_PARITY; + new_LCR |= SERIAL_EVEN_PARITY; } if (cflag & CSTOPB) - LCR_change_to |= SERIAL_TWO_STOPB; + new_LCR |= SERIAL_TWO_STOPB; else - LCR_change_to |= SERIAL_TWO_STOPB; + new_LCR |= SERIAL_TWO_STOPB; mydbg("%s - 4\n", __func__); /* Thats the LCR stuff, go ahead and set it */ baud = tty_get_baud_rate(tty); - if (!baud) { + if (!baud) /* pick a default, any default... */ baud = 9600; - } mydbg("%s - got baud = %d\n", __func__, baud); @@ -1986,9 +1865,7 @@ static void qt_set_termios(struct usb_serial_port *port, /* * Set Baud rate to default and turn off (default)flow control here */ - status = - BoxSetUart(serial, UartNumber, (unsigned short)divisor, - LCR_change_to); + status = BoxSetUart(serial, index, (unsigned short)divisor, new_LCR); if (status < 0) { mydbg(__FILE__ "BoxSetUart failed\n"); return; @@ -2000,7 +1877,7 @@ static void qt_set_termios(struct usb_serial_port *port, port->number); /* Enable RTS/CTS flow control */ - status = BoxSetHW_FlowCtrl(serial, UartNumber, 1); + status = BoxSetHW_FlowCtrl(serial, index, 1); if (status < 0) { mydbg(__FILE__ "BoxSetHW_FlowCtrl failed\n"); @@ -2011,7 +1888,7 @@ static void qt_set_termios(struct usb_serial_port *port, mydbg("%s - disabling HW flow control port %d\n", __func__, port->number); - status = BoxSetHW_FlowCtrl(serial, UartNumber, 0); + status = BoxSetHW_FlowCtrl(serial, index, 0); if (status < 0) { mydbg(__FILE__ "BoxSetHW_FlowCtrl failed\n"); return; @@ -2025,19 +1902,20 @@ static void qt_set_termios(struct usb_serial_port *port, unsigned char stop_char = STOP_CHAR(tty); unsigned char start_char = START_CHAR(tty); status = - BoxSetSW_FlowCtrl(serial, UartNumber, stop_char, + BoxSetSW_FlowCtrl(serial, index, stop_char, start_char); if (status < 0) mydbg(__FILE__ "BoxSetSW_FlowCtrl (enabled) failed\n"); } else { /* disable SW flow control */ - status = BoxDisable_SW_FlowCtrl(serial, UartNumber); + status = BoxDisable_SW_FlowCtrl(serial, index); if (status < 0) mydbg(__FILE__ "BoxSetSW_FlowCtrl (diabling) failed\n"); } - + tty->termios->c_cflag &= ~CMSPAR; + /* FIXME: Error cases should be returning the actual bits changed only */ } /**************************************************************************** @@ -2237,11 +2115,11 @@ static int BoxSetUart(struct usb_serial *serial, unsigned short Uart_Number, return result; } -static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber, +static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int index, int bSet) { - __u8 MCR_Value = 0; - __u8 MSR_Value = 0, MOUT_Value = 0; + __u8 mcr = 0; + __u8 msr = 0, MOUT_Value = 0; struct usb_serial_port *port; unsigned int status; @@ -2249,34 +2127,34 @@ static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber, if (bSet == 1) { /* flow control, box will clear RTS line to prevent remote */ - MCR_Value = SERIAL_MCR_RTS; + mcr = SERIAL_MCR_RTS; } /* device from xmitting more chars */ else { /* no flow control to remote device */ - MCR_Value = 0; + mcr = 0; } - MOUT_Value = MCR_Value << 8; + MOUT_Value = mcr << 8; if (bSet == 1) { /* flow control, box will inhibit xmit data if CTS line is * asserted */ - MSR_Value = SERIAL_MSR_CTS; + msr = SERIAL_MSR_CTS; } else { /* Box will not inhimbe xmit data due to CTS line */ - MSR_Value = 0; + msr = 0; } - MOUT_Value |= MSR_Value; + MOUT_Value |= msr; status = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), QT_HW_FLOW_CONTROL_MASK, 0x40, MOUT_Value, - UartNumber, NULL, 0, 300); + index, NULL, 0, 300); return status; } -static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber, +static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 index, unsigned char stop_char, unsigned char start_char) { __u16 nSWflowout; @@ -2288,17 +2166,17 @@ static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber, result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), QT_SW_FLOW_CONTROL_MASK, 0x40, nSWflowout, - UartNumber, NULL, 0, 300); + index, NULL, 0, 300); return result; } -static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber) +static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 index) { int result; result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), - QT_SW_FLOW_CONTROL_DISABLE, 0x40, 0, UartNumber, + QT_SW_FLOW_CONTROL_DISABLE, 0x40, 0, index, NULL, 0, 300); return result; @@ -2307,7 +2185,7 @@ static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber) static void serial_throttle(struct tty_struct *tty) { struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); mydbg("%s - port %d\n", __func__, port->number); @@ -2334,7 +2212,7 @@ exit: static void serial_unthrottle(struct tty_struct *tty) { struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); unsigned int result; @@ -2380,20 +2258,19 @@ exit: static int serial_break(struct tty_struct *tty, int break_state) { - struct usb_serial_port *port = - (struct usb_serial_port *)tty->driver_data; + struct usb_serial_port *port = tty->driver_data; struct usb_serial *serial = get_usb_serial(port, __func__); - __u16 UartNumber, Break_Value; + u16 index, onoff; unsigned int result; - UartNumber = port->tty->index - serial->minor; + index = tty->index - serial->minor; if (!serial) return -ENODEV; if (break_state == -1) - Break_Value = 1; + onoff = 1; else - Break_Value = 0; + onoff = 0; down(&port->sem); @@ -2406,7 +2283,7 @@ static int serial_break(struct tty_struct *tty, int break_state) result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), - QT_BREAK_CONTROL, 0x40, Break_Value, UartNumber, + QT_BREAK_CONTROL, 0x40, onoff, index, NULL, 0, 300); exit: |