提交 b0a239da 编写于 作者: A Alan Cox 提交者: Greg Kroah-Hartman

USB: oti6858: cleanup

- Rename the copied buffer functions from pl2303 to oti6858 to avodi
  confusion
- Initialise speeds properly
- Use modern baud rate handling
- Remove GSERIAL/SSERIAL ioctl hacks that reference termios unlocked
Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 95bef012
...@@ -79,7 +79,7 @@ static int debug; ...@@ -79,7 +79,7 @@ static int debug;
#define PL2303_BUF_SIZE 1024 #define PL2303_BUF_SIZE 1024
#define PL2303_TMP_BUF_SIZE 1024 #define PL2303_TMP_BUF_SIZE 1024
struct pl2303_buf { struct oti6858_buf {
unsigned int buf_size; unsigned int buf_size;
char *buf_buf; char *buf_buf;
char *buf_get; char *buf_get;
...@@ -161,14 +161,14 @@ static int oti6858_startup(struct usb_serial *serial); ...@@ -161,14 +161,14 @@ static int oti6858_startup(struct usb_serial *serial);
static void oti6858_shutdown(struct usb_serial *serial); static void oti6858_shutdown(struct usb_serial *serial);
/* functions operating on buffers */ /* functions operating on buffers */
static struct pl2303_buf *pl2303_buf_alloc(unsigned int size); static struct oti6858_buf *oti6858_buf_alloc(unsigned int size);
static void pl2303_buf_free(struct pl2303_buf *pb); static void oti6858_buf_free(struct oti6858_buf *pb);
static void pl2303_buf_clear(struct pl2303_buf *pb); static void oti6858_buf_clear(struct oti6858_buf *pb);
static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb); static unsigned int oti6858_buf_data_avail(struct oti6858_buf *pb);
static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb); static unsigned int oti6858_buf_space_avail(struct oti6858_buf *pb);
static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf, static unsigned int oti6858_buf_put(struct oti6858_buf *pb, const char *buf,
unsigned int count); unsigned int count);
static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf, static unsigned int oti6858_buf_get(struct oti6858_buf *pb, char *buf,
unsigned int count); unsigned int count);
...@@ -203,7 +203,7 @@ static struct usb_serial_driver oti6858_device = { ...@@ -203,7 +203,7 @@ static struct usb_serial_driver oti6858_device = {
struct oti6858_private { struct oti6858_private {
spinlock_t lock; spinlock_t lock;
struct pl2303_buf *buf; struct oti6858_buf *buf;
struct oti6858_control_pkt status; struct oti6858_control_pkt status;
struct { struct {
...@@ -316,7 +316,7 @@ void send_data(struct work_struct *work) ...@@ -316,7 +316,7 @@ void send_data(struct work_struct *work)
} }
priv->flags.write_urb_in_use = 1; priv->flags.write_urb_in_use = 1;
count = pl2303_buf_data_avail(priv->buf); count = oti6858_buf_data_avail(priv->buf);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
if (count > port->bulk_out_size) if (count > port->bulk_out_size)
count = port->bulk_out_size; count = port->bulk_out_size;
...@@ -345,7 +345,7 @@ void send_data(struct work_struct *work) ...@@ -345,7 +345,7 @@ void send_data(struct work_struct *work)
} }
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer, count); oti6858_buf_get(priv->buf, port->write_urb->transfer_buffer, count);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
port->write_urb->transfer_buffer_length = count; port->write_urb->transfer_buffer_length = count;
...@@ -370,7 +370,7 @@ static int oti6858_startup(struct usb_serial *serial) ...@@ -370,7 +370,7 @@ static int oti6858_startup(struct usb_serial *serial)
priv = kzalloc(sizeof(struct oti6858_private), GFP_KERNEL); priv = kzalloc(sizeof(struct oti6858_private), GFP_KERNEL);
if (!priv) if (!priv)
break; break;
priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE); priv->buf = oti6858_buf_alloc(PL2303_BUF_SIZE);
if (priv->buf == NULL) { if (priv->buf == NULL) {
kfree(priv); kfree(priv);
break; break;
...@@ -391,7 +391,7 @@ static int oti6858_startup(struct usb_serial *serial) ...@@ -391,7 +391,7 @@ static int oti6858_startup(struct usb_serial *serial)
for (--i; i >= 0; --i) { for (--i; i >= 0; --i) {
priv = usb_get_serial_port_data(serial->port[i]); priv = usb_get_serial_port_data(serial->port[i]);
pl2303_buf_free(priv->buf); oti6858_buf_free(priv->buf);
kfree(priv); kfree(priv);
usb_set_serial_port_data(serial->port[i], NULL); usb_set_serial_port_data(serial->port[i], NULL);
} }
...@@ -410,7 +410,7 @@ static int oti6858_write(struct usb_serial_port *port, ...@@ -410,7 +410,7 @@ static int oti6858_write(struct usb_serial_port *port,
return count; return count;
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
count = pl2303_buf_put(priv->buf, buf, count); count = oti6858_buf_put(priv->buf, buf, count);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return count; return count;
...@@ -425,7 +425,7 @@ static int oti6858_write_room(struct usb_serial_port *port) ...@@ -425,7 +425,7 @@ static int oti6858_write_room(struct usb_serial_port *port)
dbg("%s(port = %d)", __FUNCTION__, port->number); dbg("%s(port = %d)", __FUNCTION__, port->number);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
room = pl2303_buf_space_avail(priv->buf); room = oti6858_buf_space_avail(priv->buf);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return room; return room;
...@@ -440,7 +440,7 @@ static int oti6858_chars_in_buffer(struct usb_serial_port *port) ...@@ -440,7 +440,7 @@ static int oti6858_chars_in_buffer(struct usb_serial_port *port)
dbg("%s(port = %d)", __FUNCTION__, port->number); dbg("%s(port = %d)", __FUNCTION__, port->number);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
chars = pl2303_buf_data_avail(priv->buf); chars = oti6858_buf_data_avail(priv->buf);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return chars; return chars;
...@@ -458,7 +458,7 @@ static void oti6858_set_termios(struct usb_serial_port *port, ...@@ -458,7 +458,7 @@ static void oti6858_set_termios(struct usb_serial_port *port,
dbg("%s(port = %d)", __FUNCTION__, port->number); dbg("%s(port = %d)", __FUNCTION__, port->number);
if ((!port->tty) || (!port->tty->termios)) { if (!port->tty || !port->tty->termios) {
dbg("%s(): no tty structures", __FUNCTION__); dbg("%s(): no tty structures", __FUNCTION__);
return; return;
} }
...@@ -468,6 +468,8 @@ static void oti6858_set_termios(struct usb_serial_port *port, ...@@ -468,6 +468,8 @@ static void oti6858_set_termios(struct usb_serial_port *port,
*(port->tty->termios) = tty_std_termios; *(port->tty->termios) = tty_std_termios;
port->tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; port->tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
priv->flags.termios_initialized = 1; priv->flags.termios_initialized = 1;
port->tty->termios->c_ispeed = 38400;
port->tty->termios->c_ospeed = 38400;
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
...@@ -504,19 +506,14 @@ static void oti6858_set_termios(struct usb_serial_port *port, ...@@ -504,19 +506,14 @@ static void oti6858_set_termios(struct usb_serial_port *port,
br = tty_get_baud_rate(port->tty); br = tty_get_baud_rate(port->tty);
if (br == 0) { if (br == 0) {
divisor = 0; divisor = 0;
} else if (br <= OTI6858_MAX_BAUD_RATE) { } else {
int real_br; int real_br;
br = min(br, OTI6858_MAX_BAUD_RATE);
divisor = (96000000 + 8 * br) / (16 * br); divisor = (96000000 + 8 * br) / (16 * br);
real_br = 96000000 / (16 * divisor); real_br = 96000000 / (16 * divisor);
if ((((real_br - br) * 100 + br - 1) / br) > 2) {
dbg("%s(): baud rate %d is invalid", __FUNCTION__, br);
return;
}
divisor = cpu_to_le16(divisor); divisor = cpu_to_le16(divisor);
} else { tty_encode_baud_rate(port->tty, real_br, real_br);
dbg("%s(): baud rate %d is too high", __FUNCTION__, br);
return;
} }
frame_fmt &= ~FMT_STOP_BITS_MASK; frame_fmt &= ~FMT_STOP_BITS_MASK;
...@@ -650,7 +647,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp) ...@@ -650,7 +647,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
dbg("%s(): entering wait loop", __FUNCTION__); dbg("%s(): entering wait loop", __FUNCTION__);
for (;;) { for (;;) {
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (pl2303_buf_data_avail(priv->buf) == 0 if (oti6858_buf_data_avail(priv->buf) == 0
|| timeout == 0 || signal_pending(current) || timeout == 0 || signal_pending(current)
|| !usb_get_intfdata(port->serial->interface)) /* disconnect */ || !usb_get_intfdata(port->serial->interface)) /* disconnect */
break; break;
...@@ -663,7 +660,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp) ...@@ -663,7 +660,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
dbg("%s(): after wait loop", __FUNCTION__); dbg("%s(): after wait loop", __FUNCTION__);
/* clear out any remaining data in the buffer */ /* clear out any remaining data in the buffer */
pl2303_buf_clear(priv->buf); oti6858_buf_clear(priv->buf);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
/* wait for characters to drain from the device */ /* wait for characters to drain from the device */
...@@ -831,21 +828,6 @@ static int oti6858_ioctl(struct usb_serial_port *port, struct file *file, ...@@ -831,21 +828,6 @@ static int oti6858_ioctl(struct usb_serial_port *port, struct file *file,
return -EFAULT; return -EFAULT;
return oti6858_tiocmset(port, NULL, 0, x); return oti6858_tiocmset(port, NULL, 0, x);
case TIOCGSERIAL:
if (copy_to_user(user_arg, port->tty->termios,
sizeof(struct ktermios))) {
return -EFAULT;
}
return 0;
case TIOCSSERIAL:
if (copy_from_user(port->tty->termios, user_arg,
sizeof(struct ktermios))) {
return -EFAULT;
}
oti6858_set_termios(port, NULL);
return 0;
case TIOCMIWAIT: case TIOCMIWAIT:
dbg("%s(): TIOCMIWAIT", __FUNCTION__); dbg("%s(): TIOCMIWAIT", __FUNCTION__);
return wait_modem_info(port, arg); return wait_modem_info(port, arg);
...@@ -887,7 +869,7 @@ static void oti6858_shutdown(struct usb_serial *serial) ...@@ -887,7 +869,7 @@ static void oti6858_shutdown(struct usb_serial *serial)
for (i = 0; i < serial->num_ports; ++i) { for (i = 0; i < serial->num_ports; ++i) {
priv = usb_get_serial_port_data(serial->port[i]); priv = usb_get_serial_port_data(serial->port[i]);
if (priv) { if (priv) {
pl2303_buf_free(priv->buf); oti6858_buf_free(priv->buf);
kfree(priv); kfree(priv);
usb_set_serial_port_data(serial->port[i], NULL); usb_set_serial_port_data(serial->port[i], NULL);
} }
...@@ -987,7 +969,7 @@ static void oti6858_read_int_callback(struct urb *urb) ...@@ -987,7 +969,7 @@ static void oti6858_read_int_callback(struct urb *urb)
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
if (priv->flags.write_urb_in_use == 0 if (priv->flags.write_urb_in_use == 0
&& pl2303_buf_data_avail(priv->buf) != 0) { && oti6858_buf_data_avail(priv->buf) != 0) {
schedule_delayed_work(&priv->delayed_write_work,0); schedule_delayed_work(&priv->delayed_write_work,0);
resubmit = 0; resubmit = 0;
} }
...@@ -1015,9 +997,8 @@ static void oti6858_read_bulk_callback(struct urb *urb) ...@@ -1015,9 +997,8 @@ static void oti6858_read_bulk_callback(struct urb *urb)
struct tty_struct *tty; struct tty_struct *tty;
unsigned char *data = urb->transfer_buffer; unsigned char *data = urb->transfer_buffer;
unsigned long flags; unsigned long flags;
int i, result;
int status = urb->status; int status = urb->status;
char tty_flag; int result;
dbg("%s(port = %d, status = %d)", dbg("%s(port = %d, status = %d)",
__FUNCTION__, port->number, status); __FUNCTION__, port->number, status);
...@@ -1045,27 +1026,9 @@ static void oti6858_read_bulk_callback(struct urb *urb) ...@@ -1045,27 +1026,9 @@ static void oti6858_read_bulk_callback(struct urb *urb)
return; return;
} }
// get tty_flag from status
tty_flag = TTY_NORMAL;
/* FIXME: probably, errors will be signalled using interrupt pipe! */
/*
// break takes precedence over parity,
// which takes precedence over framing errors
if (status & UART_BREAK_ERROR )
tty_flag = TTY_BREAK;
else if (status & UART_PARITY_ERROR)
tty_flag = TTY_PARITY;
else if (status & UART_FRAME_ERROR)
tty_flag = TTY_FRAME;
dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
*/
tty = port->tty; tty = port->tty;
if (tty != NULL && urb->actual_length > 0) { if (tty != NULL && urb->actual_length > 0) {
tty_buffer_request_room(tty, urb->actual_length); tty_insert_flip_string(tty, data, urb->actual_length);
for (i = 0; i < urb->actual_length; ++i)
tty_insert_flip_char(tty, data[i], tty_flag);
tty_flip_buffer_push(tty); tty_flip_buffer_push(tty);
} }
...@@ -1133,18 +1096,18 @@ static void oti6858_write_bulk_callback(struct urb *urb) ...@@ -1133,18 +1096,18 @@ static void oti6858_write_bulk_callback(struct urb *urb)
/* /*
* pl2303_buf_alloc * oti6858_buf_alloc
* *
* Allocate a circular buffer and all associated memory. * Allocate a circular buffer and all associated memory.
*/ */
static struct pl2303_buf *pl2303_buf_alloc(unsigned int size) static struct oti6858_buf *oti6858_buf_alloc(unsigned int size)
{ {
struct pl2303_buf *pb; struct oti6858_buf *pb;
if (size == 0) if (size == 0)
return NULL; return NULL;
pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL); pb = kmalloc(sizeof(struct oti6858_buf), GFP_KERNEL);
if (pb == NULL) if (pb == NULL)
return NULL; return NULL;
...@@ -1161,11 +1124,11 @@ static struct pl2303_buf *pl2303_buf_alloc(unsigned int size) ...@@ -1161,11 +1124,11 @@ static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
} }
/* /*
* pl2303_buf_free * oti6858_buf_free
* *
* Free the buffer and all associated memory. * Free the buffer and all associated memory.
*/ */
static void pl2303_buf_free(struct pl2303_buf *pb) static void oti6858_buf_free(struct oti6858_buf *pb)
{ {
if (pb) { if (pb) {
kfree(pb->buf_buf); kfree(pb->buf_buf);
...@@ -1174,11 +1137,11 @@ static void pl2303_buf_free(struct pl2303_buf *pb) ...@@ -1174,11 +1137,11 @@ static void pl2303_buf_free(struct pl2303_buf *pb)
} }
/* /*
* pl2303_buf_clear * oti6858_buf_clear
* *
* Clear out all data in the circular buffer. * Clear out all data in the circular buffer.
*/ */
static void pl2303_buf_clear(struct pl2303_buf *pb) static void oti6858_buf_clear(struct oti6858_buf *pb)
{ {
if (pb != NULL) { if (pb != NULL) {
/* equivalent to a get of all data available */ /* equivalent to a get of all data available */
...@@ -1187,12 +1150,12 @@ static void pl2303_buf_clear(struct pl2303_buf *pb) ...@@ -1187,12 +1150,12 @@ static void pl2303_buf_clear(struct pl2303_buf *pb)
} }
/* /*
* pl2303_buf_data_avail * oti6858_buf_data_avail
* *
* Return the number of bytes of data available in the circular * Return the number of bytes of data available in the circular
* buffer. * buffer.
*/ */
static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb) static unsigned int oti6858_buf_data_avail(struct oti6858_buf *pb)
{ {
if (pb == NULL) if (pb == NULL)
return 0; return 0;
...@@ -1200,12 +1163,12 @@ static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb) ...@@ -1200,12 +1163,12 @@ static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
} }
/* /*
* pl2303_buf_space_avail * oti6858_buf_space_avail
* *
* Return the number of bytes of space available in the circular * Return the number of bytes of space available in the circular
* buffer. * buffer.
*/ */
static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb) static unsigned int oti6858_buf_space_avail(struct oti6858_buf *pb)
{ {
if (pb == NULL) if (pb == NULL)
return 0; return 0;
...@@ -1213,14 +1176,14 @@ static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb) ...@@ -1213,14 +1176,14 @@ static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
} }
/* /*
* pl2303_buf_put * oti6858_buf_put
* *
* Copy data data from a user buffer and put it into the circular buffer. * Copy data data from a user buffer and put it into the circular buffer.
* Restrict to the amount of space available. * Restrict to the amount of space available.
* *
* Return the number of bytes copied. * Return the number of bytes copied.
*/ */
static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf, static unsigned int oti6858_buf_put(struct oti6858_buf *pb, const char *buf,
unsigned int count) unsigned int count)
{ {
unsigned int len; unsigned int len;
...@@ -1228,7 +1191,7 @@ static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf, ...@@ -1228,7 +1191,7 @@ static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
if (pb == NULL) if (pb == NULL)
return 0; return 0;
len = pl2303_buf_space_avail(pb); len = oti6858_buf_space_avail(pb);
if (count > len) if (count > len)
count = len; count = len;
...@@ -1252,14 +1215,14 @@ static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf, ...@@ -1252,14 +1215,14 @@ static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
} }
/* /*
* pl2303_buf_get * oti6858_buf_get
* *
* Get data from the circular buffer and copy to the given buffer. * Get data from the circular buffer and copy to the given buffer.
* Restrict to the amount of data available. * Restrict to the amount of data available.
* *
* Return the number of bytes copied. * Return the number of bytes copied.
*/ */
static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf, static unsigned int oti6858_buf_get(struct oti6858_buf *pb, char *buf,
unsigned int count) unsigned int count)
{ {
unsigned int len; unsigned int len;
...@@ -1267,7 +1230,7 @@ static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf, ...@@ -1267,7 +1230,7 @@ static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
if (pb == NULL) if (pb == NULL)
return 0; return 0;
len = pl2303_buf_data_avail(pb); len = oti6858_buf_data_avail(pb);
if (count > len) if (count > len)
count = len; count = len;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册