Commit 0c212603 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

serqt: initial clean up pass for tty side



Avoid using port->tty where possible (makes refcount fixing easier
later).

Remove unused code (the ioctl path is not used if the device has
mget/mset functions)

Remove various un-needed typecasts and long names so it could read it to
do the changes.
Signed-off-by: default avatarAlan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6fd1af4c
......@@ -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 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
}
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;