summaryrefslogtreecommitdiff
path: root/drivers/staging/quatech_usb2
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/quatech_usb2')
-rw-r--r--drivers/staging/quatech_usb2/TODO8
-rw-r--r--drivers/staging/quatech_usb2/quatech_usb2.c30
2 files changed, 27 insertions, 11 deletions
diff --git a/drivers/staging/quatech_usb2/TODO b/drivers/staging/quatech_usb2/TODO
new file mode 100644
index 000000000000..67f61dbe14ac
--- /dev/null
+++ b/drivers/staging/quatech_usb2/TODO
@@ -0,0 +1,8 @@
+Incomplete list of things that this driver does not yet implement completely or
+at all. some of these may not be possible to implement because the hardware
+support does not exist. Others may be possible, but the magic control codes to
+make them happen are unknown, and some may just need the driver support to
+implement them writing.
+
+* Mark/Space parity is not implemented (reported back correctly)
+* IXANY flow control mode is not implemented (flag ignored completely)
diff --git a/drivers/staging/quatech_usb2/quatech_usb2.c b/drivers/staging/quatech_usb2/quatech_usb2.c
index deb222c7186e..2acef9466d47 100644
--- a/drivers/staging/quatech_usb2/quatech_usb2.c
+++ b/drivers/staging/quatech_usb2/quatech_usb2.c
@@ -83,8 +83,8 @@ static int debug;
#define QT2_SERIAL_6_DATA 0x01
#define QT2_SERIAL_5_DATA 0x00
-#define QT2_SERIAL_ODD_PARITY 0X08
-#define QT2_SERIAL_EVEN_PARITY 0X18
+#define QT2_SERIAL_ODD_PARITY 0x08
+#define QT2_SERIAL_EVEN_PARITY 0x18
#define QT2_SERIAL_TWO_STOPB 0x04
#define QT2_SERIAL_ONE_STOPB 0x00
@@ -978,14 +978,8 @@ static void qt2_set_termios(struct tty_struct *tty,
UartNumber = port->number;
- if (old_termios) {
- if ((tty->termios->c_cflag == old_termios->c_cflag) &&
- (RELEVANT_IFLAG(tty->termios->c_iflag) ==
- RELEVANT_IFLAG(old_termios->c_iflag))) {
- dbg("%s(): Nothing to change", __func__);
- return;
- }
- }
+ if (old_termios && !tty_termios_hw_change(old_termios, tty->termios))
+ return;
switch (tty->termios->c_cflag) {
case CS5:
@@ -1010,12 +1004,21 @@ static void qt2_set_termios(struct tty_struct *tty,
else
LCR_change_to |= QT2_SERIAL_EVEN_PARITY;
}
+ /* Because LCR_change_to is initialised to zero, we don't have to worry
+ * about the case where PARENB is not set or clearing bits, because by
+ * default all of them are cleared, turning parity off.
+ * as we don't support mark/space parity, we should clear the
+ * mark/space parity bit in c_cflag, so the caller can tell we have
+ * ignored the request */
+ tty->termios->c_cflag &= ~CMSPAR;
+
if (tty->termios->c_cflag & CSTOPB)
LCR_change_to |= QT2_SERIAL_TWO_STOPB;
else
LCR_change_to |= QT2_SERIAL_ONE_STOPB;
- /* Thats the LCR stuff, go ahead and set it */
+ /* Thats the LCR stuff, next we need to work out the divisor as the
+ * LCR and the divisor are set together */
baud = tty_get_baud_rate(tty);
if (!baud) {
/* pick a default, any default... */
@@ -1036,6 +1039,11 @@ static void qt2_set_termios(struct tty_struct *tty,
if (status < 0) {
dbg("qt2_boxsetuart() failed");
return;
+ } else {
+ /* now encode the baud rate we actually set, which may be
+ * different to the request */
+ baud = QT2_MAX_BAUD_RATE / divisor;
+ tty_encode_baud_rate(tty, baud, baud);
}
/* Now determine flow control */