diff options
Diffstat (limited to 'drivers/tty/moxa.c')
-rw-r--r-- | drivers/tty/moxa.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c index 324467d28a54..56e616b9109a 100644 --- a/drivers/tty/moxa.c +++ b/drivers/tty/moxa.c | |||
@@ -169,6 +169,7 @@ static DEFINE_SPINLOCK(moxa_lock); | |||
169 | static unsigned long baseaddr[MAX_BOARDS]; | 169 | static unsigned long baseaddr[MAX_BOARDS]; |
170 | static unsigned int type[MAX_BOARDS]; | 170 | static unsigned int type[MAX_BOARDS]; |
171 | static unsigned int numports[MAX_BOARDS]; | 171 | static unsigned int numports[MAX_BOARDS]; |
172 | static struct tty_port moxa_service_port; | ||
172 | 173 | ||
173 | MODULE_AUTHOR("William Chen"); | 174 | MODULE_AUTHOR("William Chen"); |
174 | MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver"); | 175 | MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver"); |
@@ -367,10 +368,10 @@ static int moxa_ioctl(struct tty_struct *tty, | |||
367 | tmp.dcd = 1; | 368 | tmp.dcd = 1; |
368 | 369 | ||
369 | ttyp = tty_port_tty_get(&p->port); | 370 | ttyp = tty_port_tty_get(&p->port); |
370 | if (!ttyp || !ttyp->termios) | 371 | if (!ttyp) |
371 | tmp.cflag = p->cflag; | 372 | tmp.cflag = p->cflag; |
372 | else | 373 | else |
373 | tmp.cflag = ttyp->termios->c_cflag; | 374 | tmp.cflag = ttyp->termios.c_cflag; |
374 | tty_kref_put(ttyp); | 375 | tty_kref_put(ttyp); |
375 | copy: | 376 | copy: |
376 | if (copy_to_user(argm, &tmp, sizeof(tmp))) | 377 | if (copy_to_user(argm, &tmp, sizeof(tmp))) |
@@ -834,7 +835,7 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) | |||
834 | const struct firmware *fw; | 835 | const struct firmware *fw; |
835 | const char *file; | 836 | const char *file; |
836 | struct moxa_port *p; | 837 | struct moxa_port *p; |
837 | unsigned int i; | 838 | unsigned int i, first_idx; |
838 | int ret; | 839 | int ret; |
839 | 840 | ||
840 | brd->ports = kcalloc(MAX_PORTS_PER_BOARD, sizeof(*brd->ports), | 841 | brd->ports = kcalloc(MAX_PORTS_PER_BOARD, sizeof(*brd->ports), |
@@ -887,6 +888,11 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) | |||
887 | mod_timer(&moxaTimer, jiffies + HZ / 50); | 888 | mod_timer(&moxaTimer, jiffies + HZ / 50); |
888 | spin_unlock_bh(&moxa_lock); | 889 | spin_unlock_bh(&moxa_lock); |
889 | 890 | ||
891 | first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; | ||
892 | for (i = 0; i < brd->numPorts; i++) | ||
893 | tty_port_register_device(&brd->ports[i].port, moxaDriver, | ||
894 | first_idx + i, dev); | ||
895 | |||
890 | return 0; | 896 | return 0; |
891 | err_free: | 897 | err_free: |
892 | kfree(brd->ports); | 898 | kfree(brd->ports); |
@@ -896,7 +902,7 @@ err: | |||
896 | 902 | ||
897 | static void moxa_board_deinit(struct moxa_board_conf *brd) | 903 | static void moxa_board_deinit(struct moxa_board_conf *brd) |
898 | { | 904 | { |
899 | unsigned int a, opened; | 905 | unsigned int a, opened, first_idx; |
900 | 906 | ||
901 | mutex_lock(&moxa_openlock); | 907 | mutex_lock(&moxa_openlock); |
902 | spin_lock_bh(&moxa_lock); | 908 | spin_lock_bh(&moxa_lock); |
@@ -925,6 +931,10 @@ static void moxa_board_deinit(struct moxa_board_conf *brd) | |||
925 | mutex_lock(&moxa_openlock); | 931 | mutex_lock(&moxa_openlock); |
926 | } | 932 | } |
927 | 933 | ||
934 | first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; | ||
935 | for (a = 0; a < brd->numPorts; a++) | ||
936 | tty_unregister_device(moxaDriver, first_idx + a); | ||
937 | |||
928 | iounmap(brd->basemem); | 938 | iounmap(brd->basemem); |
929 | brd->basemem = NULL; | 939 | brd->basemem = NULL; |
930 | kfree(brd->ports); | 940 | kfree(brd->ports); |
@@ -967,6 +977,7 @@ static int __devinit moxa_pci_probe(struct pci_dev *pdev, | |||
967 | board->basemem = ioremap_nocache(pci_resource_start(pdev, 2), 0x4000); | 977 | board->basemem = ioremap_nocache(pci_resource_start(pdev, 2), 0x4000); |
968 | if (board->basemem == NULL) { | 978 | if (board->basemem == NULL) { |
969 | dev_err(&pdev->dev, "can't remap io space 2\n"); | 979 | dev_err(&pdev->dev, "can't remap io space 2\n"); |
980 | retval = -ENOMEM; | ||
970 | goto err_reg; | 981 | goto err_reg; |
971 | } | 982 | } |
972 | 983 | ||
@@ -1031,9 +1042,14 @@ static int __init moxa_init(void) | |||
1031 | 1042 | ||
1032 | printk(KERN_INFO "MOXA Intellio family driver version %s\n", | 1043 | printk(KERN_INFO "MOXA Intellio family driver version %s\n", |
1033 | MOXA_VERSION); | 1044 | MOXA_VERSION); |
1034 | moxaDriver = alloc_tty_driver(MAX_PORTS + 1); | 1045 | |
1035 | if (!moxaDriver) | 1046 | tty_port_init(&moxa_service_port); |
1036 | return -ENOMEM; | 1047 | |
1048 | moxaDriver = tty_alloc_driver(MAX_PORTS + 1, | ||
1049 | TTY_DRIVER_REAL_RAW | | ||
1050 | TTY_DRIVER_DYNAMIC_DEV); | ||
1051 | if (IS_ERR(moxaDriver)) | ||
1052 | return PTR_ERR(moxaDriver); | ||
1037 | 1053 | ||
1038 | moxaDriver->name = "ttyMX"; | 1054 | moxaDriver->name = "ttyMX"; |
1039 | moxaDriver->major = ttymajor; | 1055 | moxaDriver->major = ttymajor; |
@@ -1044,8 +1060,9 @@ static int __init moxa_init(void) | |||
1044 | moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; | 1060 | moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; |
1045 | moxaDriver->init_termios.c_ispeed = 9600; | 1061 | moxaDriver->init_termios.c_ispeed = 9600; |
1046 | moxaDriver->init_termios.c_ospeed = 9600; | 1062 | moxaDriver->init_termios.c_ospeed = 9600; |
1047 | moxaDriver->flags = TTY_DRIVER_REAL_RAW; | ||
1048 | tty_set_operations(moxaDriver, &moxa_ops); | 1063 | tty_set_operations(moxaDriver, &moxa_ops); |
1064 | /* Having one more port only for ioctls is ugly */ | ||
1065 | tty_port_link_device(&moxa_service_port, moxaDriver, MAX_PORTS); | ||
1049 | 1066 | ||
1050 | if (tty_register_driver(moxaDriver)) { | 1067 | if (tty_register_driver(moxaDriver)) { |
1051 | printk(KERN_ERR "can't register MOXA Smartio tty driver!\n"); | 1068 | printk(KERN_ERR "can't register MOXA Smartio tty driver!\n"); |
@@ -1178,7 +1195,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) | |||
1178 | mutex_lock(&ch->port.mutex); | 1195 | mutex_lock(&ch->port.mutex); |
1179 | if (!(ch->port.flags & ASYNC_INITIALIZED)) { | 1196 | if (!(ch->port.flags & ASYNC_INITIALIZED)) { |
1180 | ch->statusflags = 0; | 1197 | ch->statusflags = 0; |
1181 | moxa_set_tty_param(tty, tty->termios); | 1198 | moxa_set_tty_param(tty, &tty->termios); |
1182 | MoxaPortLineCtrl(ch, 1, 1); | 1199 | MoxaPortLineCtrl(ch, 1, 1); |
1183 | MoxaPortEnable(ch); | 1200 | MoxaPortEnable(ch); |
1184 | MoxaSetFifo(ch, ch->type == PORT_16550A); | 1201 | MoxaSetFifo(ch, ch->type == PORT_16550A); |
@@ -1193,7 +1210,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) | |||
1193 | static void moxa_close(struct tty_struct *tty, struct file *filp) | 1210 | static void moxa_close(struct tty_struct *tty, struct file *filp) |
1194 | { | 1211 | { |
1195 | struct moxa_port *ch = tty->driver_data; | 1212 | struct moxa_port *ch = tty->driver_data; |
1196 | ch->cflag = tty->termios->c_cflag; | 1213 | ch->cflag = tty->termios.c_cflag; |
1197 | tty_port_close(&ch->port, tty, filp); | 1214 | tty_port_close(&ch->port, tty, filp); |
1198 | } | 1215 | } |
1199 | 1216 | ||
@@ -1464,7 +1481,7 @@ static void moxa_poll(unsigned long ignored) | |||
1464 | 1481 | ||
1465 | static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) | 1482 | static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) |
1466 | { | 1483 | { |
1467 | register struct ktermios *ts = tty->termios; | 1484 | register struct ktermios *ts = &tty->termios; |
1468 | struct moxa_port *ch = tty->driver_data; | 1485 | struct moxa_port *ch = tty->driver_data; |
1469 | int rts, cts, txflow, rxflow, xany, baud; | 1486 | int rts, cts, txflow, rxflow, xany, baud; |
1470 | 1487 | ||