diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/mxser.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index dd1b0ab4b310..68c2e9234691 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * mxser.c -- MOXA Smartio/Industio family multiport serial driver. | 2 | * mxser.c -- MOXA Smartio/Industio family multiport serial driver. |
3 | * | 3 | * |
4 | * Copyright (C) 1999-2006 Moxa Technologies (support@moxa.com.tw). | 4 | * Copyright (C) 1999-2006 Moxa Technologies (support@moxa.com). |
5 | * Copyright (C) 2006-2007 Jiri Slaby <jirislaby@gmail.com> | 5 | * Copyright (C) 2006-2008 Jiri Slaby <jirislaby@gmail.com> |
6 | * | 6 | * |
7 | * This code is loosely based on the 1.8 moxa driver which is based on | 7 | * This code is loosely based on the 1.8 moxa driver which is based on |
8 | * Linux serial driver, written by Linus Torvalds, Theodore T'so and | 8 | * Linux serial driver, written by Linus Torvalds, Theodore T'so and |
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | #include "mxser.h" | 48 | #include "mxser.h" |
49 | 49 | ||
50 | #define MXSER_VERSION "2.0.2" /* 1.10 */ | 50 | #define MXSER_VERSION "2.0.3" /* 1.11 */ |
51 | #define MXSERMAJOR 174 | 51 | #define MXSERMAJOR 174 |
52 | #define MXSERCUMAJOR 175 | 52 | #define MXSERCUMAJOR 175 |
53 | 53 | ||
@@ -73,6 +73,7 @@ | |||
73 | 73 | ||
74 | #define PCI_DEVICE_ID_CB108 0x1080 | 74 | #define PCI_DEVICE_ID_CB108 0x1080 |
75 | #define PCI_DEVICE_ID_CB114 0x1142 | 75 | #define PCI_DEVICE_ID_CB114 0x1142 |
76 | #define PCI_DEVICE_ID_CP114UL 0x1143 | ||
76 | #define PCI_DEVICE_ID_CB134I 0x1341 | 77 | #define PCI_DEVICE_ID_CB134I 0x1341 |
77 | #define PCI_DEVICE_ID_CP138U 0x1380 | 78 | #define PCI_DEVICE_ID_CP138U 0x1380 |
78 | #define PCI_DEVICE_ID_POS104UL 0x1044 | 79 | #define PCI_DEVICE_ID_POS104UL 0x1044 |
@@ -140,7 +141,8 @@ static const struct mxser_cardinfo mxser_cards[] = { | |||
140 | /*25*/ { "CB-114 series", 4, }, | 141 | /*25*/ { "CB-114 series", 4, }, |
141 | { "CB-134I series", 4, }, | 142 | { "CB-134I series", 4, }, |
142 | { "CP-138U series", 8, }, | 143 | { "CP-138U series", 8, }, |
143 | { "POS-104UL series", 4, } | 144 | { "POS-104UL series", 4, }, |
145 | { "CP-114UL series", 4, } | ||
144 | }; | 146 | }; |
145 | 147 | ||
146 | /* driver_data correspond to the lines in the structure above | 148 | /* driver_data correspond to the lines in the structure above |
@@ -169,6 +171,7 @@ static struct pci_device_id mxser_pcibrds[] = { | |||
169 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CB134I), .driver_data = 26 }, | 171 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CB134I), .driver_data = 26 }, |
170 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), .driver_data = 27 }, | 172 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), .driver_data = 27 }, |
171 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_POS104UL), .driver_data = 28 }, | 173 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_POS104UL), .driver_data = 28 }, |
174 | { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL), .driver_data = 29 }, | ||
172 | { } | 175 | { } |
173 | }; | 176 | }; |
174 | MODULE_DEVICE_TABLE(pci, mxser_pcibrds); | 177 | MODULE_DEVICE_TABLE(pci, mxser_pcibrds); |
@@ -1188,20 +1191,19 @@ static int mxser_set_serial_info(struct mxser_port *info, | |||
1188 | struct serial_struct __user *new_info) | 1191 | struct serial_struct __user *new_info) |
1189 | { | 1192 | { |
1190 | struct serial_struct new_serial; | 1193 | struct serial_struct new_serial; |
1194 | speed_t baud; | ||
1191 | unsigned long sl_flags; | 1195 | unsigned long sl_flags; |
1192 | unsigned int flags; | 1196 | unsigned int flags; |
1193 | int retval = 0; | 1197 | int retval = 0; |
1194 | 1198 | ||
1195 | if (!new_info || !info->ioaddr) | 1199 | if (!new_info || !info->ioaddr) |
1196 | return -EFAULT; | 1200 | return -ENODEV; |
1197 | if (copy_from_user(&new_serial, new_info, sizeof(new_serial))) | 1201 | if (copy_from_user(&new_serial, new_info, sizeof(new_serial))) |
1198 | return -EFAULT; | 1202 | return -EFAULT; |
1199 | 1203 | ||
1200 | if ((new_serial.irq != info->board->irq) || | 1204 | if (new_serial.irq != info->board->irq || |
1201 | (new_serial.port != info->ioaddr) || | 1205 | new_serial.port != info->ioaddr) |
1202 | (new_serial.custom_divisor != info->custom_divisor) || | 1206 | return -EINVAL; |
1203 | (new_serial.baud_base != info->baud_base)) | ||
1204 | return -EPERM; | ||
1205 | 1207 | ||
1206 | flags = info->flags & ASYNC_SPD_MASK; | 1208 | flags = info->flags & ASYNC_SPD_MASK; |
1207 | 1209 | ||
@@ -1224,6 +1226,13 @@ static int mxser_set_serial_info(struct mxser_port *info, | |||
1224 | info->tty->low_latency = | 1226 | info->tty->low_latency = |
1225 | (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | 1227 | (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; |
1226 | info->tty->low_latency = 0; | 1228 | info->tty->low_latency = 0; |
1229 | if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && | ||
1230 | (new_serial.baud_base != info->baud_base || | ||
1231 | new_serial.custom_divisor != | ||
1232 | info->custom_divisor)) { | ||
1233 | baud = new_serial.baud_base / new_serial.custom_divisor; | ||
1234 | tty_encode_baud_rate(info->tty, baud, baud); | ||
1235 | } | ||
1227 | } | 1236 | } |
1228 | 1237 | ||
1229 | info->type = new_serial.type; | 1238 | info->type = new_serial.type; |