mxser.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:63k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  *          mxser.c  -- MOXA Smartio family multiport serial driver.
  4.  *
  5.  *      Copyright (C) 1999-2000  Moxa Technologies (support@moxa.com.tw).
  6.  *
  7.  *      This code is loosely based on the Linux serial driver, written by
  8.  *      Linus Torvalds, Theodore T'so and others.
  9.  *
  10.  *      This program is free software; you can redistribute it and/or modify
  11.  *      it under the terms of the GNU General Public License as published by
  12.  *      the Free Software Foundation; either version 2 of the License, or
  13.  *      (at your option) any later version.
  14.  *
  15.  *      This program is distributed in the hope that it will be useful,
  16.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *      GNU General Public License for more details.
  19.  *
  20.  *      You should have received a copy of the GNU General Public License
  21.  *      along with this program; if not, write to the Free Software
  22.  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. /*
  25.  *    MOXA Smartio Family Serial Driver
  26.  *
  27.  *      Copyright (C) 1999,2000  Moxa Technologies Co., LTD.
  28.  *
  29.  *      for             : LINUX 2.0.X, 2.2.X, 2.4.X
  30.  *      date            : 2001/05/01
  31.  *      version         : 1.2 
  32.  *      
  33.  *    Fixes for C104H/PCI by Tim Hockin <thockin@sun.com>
  34.  *    Added support for: C102, CI-132, CI-134, CP-132, CP-114, CT-114 cards
  35.  *                        by Damian Wrobel <dwrobel@ertel.com.pl>
  36.  *
  37.  */
  38. #include <linux/config.h>
  39. #include <linux/module.h>
  40. #include <linux/version.h>
  41. #include <linux/errno.h>
  42. #include <linux/signal.h>
  43. #include <linux/sched.h>
  44. #include <linux/timer.h>
  45. #include <linux/interrupt.h>
  46. #include <linux/tty.h>
  47. #include <linux/tty_flip.h>
  48. #include <linux/serial.h>
  49. #include <linux/serial_reg.h>
  50. #include <linux/major.h>
  51. #include <linux/string.h>
  52. #include <linux/fcntl.h>
  53. #include <linux/ptrace.h>
  54. #include <linux/ioport.h>
  55. #include <linux/mm.h>
  56. #include <linux/smp_lock.h>
  57. #include <linux/pci.h>
  58. #include <asm/system.h>
  59. #include <asm/io.h>
  60. #include <asm/irq.h>
  61. #include <asm/segment.h>
  62. #include <asm/bitops.h>
  63. #include <asm/uaccess.h>
  64. #define MXSER_VERSION "1.2.1"
  65. #define MXSERMAJOR   174
  66. #define MXSERCUMAJOR 175
  67. #define MXSER_EVENT_TXLOW  1
  68. #define MXSER_EVENT_HANGUP  2
  69. #define  SERIAL_DO_RESTART
  70. #define  MXSER_BOARDS 4 /* Max. boards */
  71. #define  MXSER_PORTS 32 /* Max. ports */
  72. #define  MXSER_PORTS_PER_BOARD 8 /* Max. ports per board */
  73. #define  MXSER_ISR_PASS_LIMIT 256
  74. #define MXSER_ERR_IOADDR -1
  75. #define MXSER_ERR_IRQ -2
  76. #define MXSER_ERR_IRQ_CONFLIT -3
  77. #define MXSER_ERR_VECTOR -4
  78. #define  SERIAL_TYPE_NORMAL 1
  79. #define  SERIAL_TYPE_CALLOUT 2
  80. #define  WAKEUP_CHARS 256
  81. #define  UART_MCR_AFE 0x20
  82. #define  UART_LSR_SPECIAL 0x1E
  83. #define PORTNO(x) (MINOR((x)->device) - (x)->driver.minor_start)
  84. #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
  85. #define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
  86. #ifndef MIN
  87. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  88. #endif
  89. /*
  90.  *    Define the Moxa PCI vendor and device IDs.
  91.  */
  92. #ifndef PCI_VENDOR_ID_MOXA
  93. #define PCI_VENDOR_ID_MOXA 0x1393
  94. #endif
  95. #ifndef PCI_DEVICE_ID_C168
  96. #define PCI_DEVICE_ID_C168 0x1680
  97. #endif
  98. #ifndef PCI_DEVICE_ID_C104
  99. #define PCI_DEVICE_ID_C104 0x1040
  100. #endif
  101. #ifndef PCI_DEVICE_ID_CP132
  102. #define PCI_DEVICE_ID_CP132 0x1320
  103. #endif
  104. #ifndef PCI_DEVICE_ID_CP114
  105. #define PCI_DEVICE_ID_CP114 0x1141
  106. #endif
  107. #ifndef PCI_DEVICE_ID_CT114
  108. #define PCI_DEVICE_ID_CT114 0x1140
  109. #endif
  110. #define C168_ASIC_ID    1
  111. #define C104_ASIC_ID    2
  112. #define CI134_ASIC_ID   3
  113. #define CI132_ASIC_ID   4
  114. #define CI104J_ASIC_ID  5
  115. #define C102_ASIC_ID 0xB
  116. enum {
  117. MXSER_BOARD_C168_ISA = 0,
  118. MXSER_BOARD_C104_ISA,
  119. MXSER_BOARD_CI104J,
  120. MXSER_BOARD_C168_PCI,
  121. MXSER_BOARD_C104_PCI,
  122. MXSER_BOARD_C102_ISA,
  123. MXSER_BOARD_CI132,
  124. MXSER_BOARD_CI134,
  125. MXSER_BOARD_CP132_PCI,
  126. MXSER_BOARD_CP114_PCI,
  127. MXSER_BOARD_CT114_PCI
  128. };
  129. static char *mxser_brdname[] =
  130. {
  131. "C168 series",
  132. "C104 series",
  133. "CI-104J series",
  134. "C168H/PCI series",
  135. "C104H/PCI series",
  136. "C102 series",
  137. "CI-132 series",
  138. "CI-134 series",
  139. "CP-132 series",
  140. "CP-114 series",
  141. "CT-114 series"
  142. };
  143. static int mxser_numports[] =
  144. {
  145. 8,
  146. 4,
  147. 4,
  148. 8,
  149. 4,
  150. 2,
  151. 2,
  152. 4,
  153. 2,
  154. 4,
  155. 4
  156. };
  157. /*
  158.  *    MOXA ioctls
  159.  */
  160. #define  MOXA 0x400
  161. #define  MOXA_GETDATACOUNT     (MOXA + 23)
  162. #define MOXA_GET_CONF         (MOXA + 35)
  163. #define  MOXA_DIAGNOSE         (MOXA + 50)
  164. #define  MOXA_CHKPORTENABLE    (MOXA + 60)
  165. #define  MOXA_HighSpeedOn      (MOXA + 61)
  166. #define         MOXA_GET_MAJOR        (MOXA + 63)
  167. #define         MOXA_GET_CUMAJOR      (MOXA + 64)
  168. #define         MOXA_GETMSTATUS       (MOXA + 65)
  169. static struct pci_device_id mxser_pcibrds[] = {
  170. { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
  171.   MXSER_BOARD_C168_PCI },
  172. { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C104, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
  173.   MXSER_BOARD_C104_PCI },
  174. { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CP132, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  175.   MXSER_BOARD_CP132_PCI },
  176. { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CP114, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  177.   MXSER_BOARD_CP114_PCI },
  178. { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CT114, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  179.   MXSER_BOARD_CT114_PCI },
  180. { 0 }
  181. };
  182. MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
  183. static int ioaddr[MXSER_BOARDS];
  184. static int ttymajor = MXSERMAJOR;
  185. static int calloutmajor = MXSERCUMAJOR;
  186. static int verbose;
  187. /* Variables for insmod */
  188. MODULE_AUTHOR("William Chen");
  189. MODULE_DESCRIPTION("MOXA Smartio Family Multiport Board Device Driver");
  190. MODULE_LICENSE("GPL");
  191. MODULE_PARM(ioaddr, "1-4i");
  192. MODULE_PARM(ttymajor, "i");
  193. MODULE_PARM(calloutmajor, "i");
  194. MODULE_PARM(verbose, "i");
  195. EXPORT_NO_SYMBOLS;
  196. struct mxser_hwconf {
  197. int board_type;
  198. int ports;
  199. int irq;
  200. int vector;
  201. int vector_mask;
  202. int uart_type;
  203. int ioaddr[MXSER_PORTS_PER_BOARD];
  204. int baud_base[MXSER_PORTS_PER_BOARD];
  205. struct pci_dev *pdev;
  206. };
  207. struct mxser_struct {
  208. int port;
  209. int base; /* port base address */
  210. int irq; /* port using irq no. */
  211. int vector; /* port irq vector */
  212. int vectormask; /* port vector mask */
  213. int rx_trigger; /* Rx fifo trigger level */
  214. int baud_base; /* max. speed */
  215. int flags; /* defined in tty.h */
  216. int type; /* UART type */
  217. struct tty_struct *tty;
  218. int read_status_mask;
  219. int ignore_status_mask;
  220. int xmit_fifo_size;
  221. int custom_divisor;
  222. int x_char; /* xon/xoff character */
  223. int close_delay;
  224. unsigned short closing_wait;
  225. int IER; /* Interrupt Enable Register */
  226. int MCR; /* Modem control register */
  227. unsigned long event;
  228. int count; /* # of fd on device */
  229. int blocked_open; /* # of blocked opens */
  230. long session; /* Session of opening process */
  231. long pgrp; /* pgrp of opening process */
  232. unsigned char *xmit_buf;
  233. int xmit_head;
  234. int xmit_tail;
  235. int xmit_cnt;
  236. struct tq_struct tqueue;
  237. struct termios normal_termios;
  238. struct termios callout_termios;
  239. wait_queue_head_t open_wait;
  240. wait_queue_head_t close_wait;
  241. wait_queue_head_t delta_msr_wait;
  242. struct async_icount icount; /* kernel counters for the 4 input interrupts */
  243. };
  244. struct mxser_log {
  245. int tick;
  246. int rxcnt[MXSER_PORTS];
  247. int txcnt[MXSER_PORTS];
  248. };
  249. struct mxser_mstatus {
  250. tcflag_t cflag;
  251. int cts;
  252. int dsr;
  253. int ri;
  254. int dcd;
  255. };
  256. static struct mxser_mstatus GMStatus[MXSER_PORTS];
  257. static int mxserBoardCAP[MXSER_BOARDS] =
  258. {
  259. 0, 0, 0, 0
  260.        /*  0x180, 0x280, 0x200, 0x320   */
  261. };
  262. static struct tty_driver mxvar_sdriver, mxvar_cdriver;
  263. static int mxvar_refcount;
  264. static struct mxser_struct mxvar_table[MXSER_PORTS];
  265. static struct tty_struct *mxvar_tty[MXSER_PORTS + 1];
  266. static struct termios *mxvar_termios[MXSER_PORTS + 1];
  267. static struct termios *mxvar_termios_locked[MXSER_PORTS + 1];
  268. static struct mxser_log mxvar_log;
  269. static int mxvar_diagflag;
  270. /*
  271.  * mxvar_tmp_buf is used as a temporary buffer by serial_write. We need
  272.  * to lock it in case the memcpy_fromfs blocks while swapping in a page,
  273.  * and some other program tries to do a serial write at the same time.
  274.  * Since the lock will only come under contention when the system is
  275.  * swapping and available memory is low, it makes sense to share one
  276.  * buffer across all the serial ports, since it significantly saves
  277.  * memory if large numbers of serial ports are open.
  278.  */
  279. static unsigned char *mxvar_tmp_buf;
  280. static struct semaphore mxvar_tmp_buf_sem;
  281. /*
  282.  * This is used to figure out the divisor speeds and the timeouts
  283.  */
  284. static int mxvar_baud_table[] =
  285. {
  286. 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
  287. 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 0};
  288. struct mxser_hwconf mxsercfg[MXSER_BOARDS];
  289. /*
  290.  * static functions:
  291.  */
  292. #ifdef MODULE
  293. int init_module(void);
  294. void cleanup_module(void);
  295. #endif
  296. static void mxser_getcfg(int board, struct mxser_hwconf *hwconf);
  297. int mxser_init(void);
  298. static int mxser_get_ISA_conf(int, struct mxser_hwconf *);
  299. static int mxser_get_PCI_conf(struct pci_dev *, int, struct mxser_hwconf *);
  300. static void mxser_do_softint(void *);
  301. static int mxser_open(struct tty_struct *, struct file *);
  302. static void mxser_close(struct tty_struct *, struct file *);
  303. static int mxser_write(struct tty_struct *, int, const unsigned char *, int);
  304. static int mxser_write_room(struct tty_struct *);
  305. static void mxser_flush_buffer(struct tty_struct *);
  306. static int mxser_chars_in_buffer(struct tty_struct *);
  307. static void mxser_flush_chars(struct tty_struct *);
  308. static void mxser_put_char(struct tty_struct *, unsigned char);
  309. static int mxser_ioctl(struct tty_struct *, struct file *, uint, ulong);
  310. static int mxser_ioctl_special(unsigned int, unsigned long);
  311. static void mxser_throttle(struct tty_struct *);
  312. static void mxser_unthrottle(struct tty_struct *);
  313. static void mxser_set_termios(struct tty_struct *, struct termios *);
  314. static void mxser_stop(struct tty_struct *);
  315. static void mxser_start(struct tty_struct *);
  316. static void mxser_hangup(struct tty_struct *);
  317. static void mxser_interrupt(int, void *, struct pt_regs *);
  318. static inline void mxser_receive_chars(struct mxser_struct *, int *);
  319. static inline void mxser_transmit_chars(struct mxser_struct *);
  320. static inline void mxser_check_modem_status(struct mxser_struct *, int);
  321. static int mxser_block_til_ready(struct tty_struct *, struct file *, struct mxser_struct *);
  322. static int mxser_startup(struct mxser_struct *);
  323. static void mxser_shutdown(struct mxser_struct *);
  324. static int mxser_change_speed(struct mxser_struct *, struct termios *old_termios);
  325. static int mxser_get_serial_info(struct mxser_struct *, struct serial_struct *);
  326. static int mxser_set_serial_info(struct mxser_struct *, struct serial_struct *);
  327. static int mxser_get_lsr_info(struct mxser_struct *, unsigned int *);
  328. static void mxser_send_break(struct mxser_struct *, int);
  329. static int mxser_get_modem_info(struct mxser_struct *, unsigned int *);
  330. static int mxser_set_modem_info(struct mxser_struct *, unsigned int, unsigned int *);
  331. /*
  332.  * The MOXA C168/C104 serial driver boot-time initialization code!
  333.  */
  334. #ifdef MODULE
  335. int init_module(void)
  336. {
  337. int ret;
  338. if (verbose)
  339. printk("Loading module mxser ...n");
  340. ret = mxser_init();
  341. if (verbose)
  342. printk("Done.n");
  343. return (ret);
  344. }
  345. void cleanup_module(void)
  346. {
  347. int i, err = 0;
  348. if (verbose)
  349. printk("Unloading module mxser ...n");
  350. if ((err |= tty_unregister_driver(&mxvar_cdriver)))
  351. printk("Couldn't unregister MOXA Smartio family callout drivern");
  352. if ((err |= tty_unregister_driver(&mxvar_sdriver)))
  353. printk("Couldn't unregister MOXA Smartio family serial drivern");
  354. for (i = 0; i < MXSER_BOARDS; i++) {
  355. if (mxsercfg[i].board_type == -1)
  356. continue;
  357. else {
  358. free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]);
  359. }
  360. }
  361. if (verbose)
  362. printk("Done.n");
  363. }
  364. #endif
  365. int mxser_initbrd(int board, struct mxser_hwconf *hwconf)
  366. {
  367. struct mxser_struct *info;
  368. unsigned long flags;
  369. int retval;
  370. int i, n;
  371. init_MUTEX(&mxvar_tmp_buf_sem);
  372. n = board * MXSER_PORTS_PER_BOARD;
  373. info = &mxvar_table[n];
  374. for (i = 0; i < hwconf->ports; i++, n++, info++) {
  375. if (verbose) {
  376. printk("        ttyM%d/cum%d at 0x%04x ", n, n, hwconf->ioaddr[i]);
  377. if (hwconf->baud_base[i] == 115200)
  378. printk(" max. baud rate up to 115200 bps.n");
  379. else
  380. printk(" max. baud rate up to 921600 bps.n");
  381. }
  382. info->port = n;
  383. info->base = hwconf->ioaddr[i];
  384. info->irq = hwconf->irq;
  385. info->vector = hwconf->vector;
  386. info->vectormask = hwconf->vector_mask;
  387. info->rx_trigger = 14;
  388. info->baud_base = hwconf->baud_base[i];
  389. info->flags = ASYNC_SHARE_IRQ;
  390. info->type = hwconf->uart_type;
  391. if ((info->type == PORT_16450) || (info->type == PORT_8250))
  392. info->xmit_fifo_size = 1;
  393. else
  394. info->xmit_fifo_size = 16;
  395. info->custom_divisor = hwconf->baud_base[i] * 16;
  396. info->close_delay = 5 * HZ / 10;
  397. info->closing_wait = 30 * HZ;
  398. info->tqueue.routine = mxser_do_softint;
  399. info->tqueue.data = info;
  400. info->callout_termios = mxvar_cdriver.init_termios;
  401. info->normal_termios = mxvar_sdriver.init_termios;
  402. init_waitqueue_head(&info->open_wait);
  403. init_waitqueue_head(&info->close_wait);
  404. init_waitqueue_head(&info->delta_msr_wait);
  405. }
  406. /*
  407.  * Allocate the IRQ if necessary
  408.  */
  409. save_flags(flags);
  410. n = board * MXSER_PORTS_PER_BOARD;
  411. info = &mxvar_table[n];
  412. cli();
  413. retval = request_irq(hwconf->irq, mxser_interrupt, IRQ_T(info),
  414.      "mxser", info);
  415. if (retval) {
  416. restore_flags(flags);
  417. printk("Board %d: %s", board, mxser_brdname[hwconf->board_type]);
  418. printk("  Request irq fail,IRQ (%d) may be conflit with another device.n", info->irq);
  419. return (retval);
  420. }
  421. restore_flags(flags);
  422. return 0;
  423. }
  424. static void mxser_getcfg(int board, struct mxser_hwconf *hwconf)
  425. {
  426. mxsercfg[board] = *hwconf;
  427. }
  428. static int mxser_get_PCI_conf(struct pci_dev *pdev, int board_type, struct mxser_hwconf *hwconf)
  429. {
  430. int i;
  431. unsigned int ioaddress;
  432. hwconf->board_type = board_type;
  433. hwconf->ports = mxser_numports[board_type];
  434. ioaddress = pci_resource_start (pdev, 2);
  435. for (i = 0; i < hwconf->ports; i++)
  436. hwconf->ioaddr[i] = ioaddress + 8 * i;
  437. ioaddress = pci_resource_start (pdev, 3);
  438. hwconf->vector = ioaddress;
  439. hwconf->irq = pdev->irq;
  440. hwconf->uart_type = PORT_16550A;
  441. hwconf->vector_mask = 0;
  442. for (i = 0; i < hwconf->ports; i++) {
  443. hwconf->vector_mask |= (1 << i);
  444. hwconf->baud_base[i] = 921600;
  445. }
  446. return (0);
  447. }
  448. int mxser_init(void)
  449. {
  450. int i, m, retval, b;
  451. int n, index;
  452. int ret1, ret2;
  453. struct mxser_hwconf hwconf;
  454. printk("MOXA Smartio family driver version %sn", MXSER_VERSION);
  455. /* Initialize the tty_driver structure */
  456. memset(&mxvar_sdriver, 0, sizeof(struct tty_driver));
  457. mxvar_sdriver.magic = TTY_DRIVER_MAGIC;
  458. mxvar_sdriver.name = "ttyM";
  459. mxvar_sdriver.major = ttymajor;
  460. mxvar_sdriver.minor_start = 0;
  461. mxvar_sdriver.num = MXSER_PORTS + 1;
  462. mxvar_sdriver.type = TTY_DRIVER_TYPE_SERIAL;
  463. mxvar_sdriver.subtype = SERIAL_TYPE_NORMAL;
  464. mxvar_sdriver.init_termios = tty_std_termios;
  465. mxvar_sdriver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  466. mxvar_sdriver.flags = TTY_DRIVER_REAL_RAW;
  467. mxvar_sdriver.refcount = &mxvar_refcount;
  468. mxvar_sdriver.table = mxvar_tty;
  469. mxvar_sdriver.termios = mxvar_termios;
  470. mxvar_sdriver.termios_locked = mxvar_termios_locked;
  471. mxvar_sdriver.open = mxser_open;
  472. mxvar_sdriver.close = mxser_close;
  473. mxvar_sdriver.write = mxser_write;
  474. mxvar_sdriver.put_char = mxser_put_char;
  475. mxvar_sdriver.flush_chars = mxser_flush_chars;
  476. mxvar_sdriver.write_room = mxser_write_room;
  477. mxvar_sdriver.chars_in_buffer = mxser_chars_in_buffer;
  478. mxvar_sdriver.flush_buffer = mxser_flush_buffer;
  479. mxvar_sdriver.ioctl = mxser_ioctl;
  480. mxvar_sdriver.throttle = mxser_throttle;
  481. mxvar_sdriver.unthrottle = mxser_unthrottle;
  482. mxvar_sdriver.set_termios = mxser_set_termios;
  483. mxvar_sdriver.stop = mxser_stop;
  484. mxvar_sdriver.start = mxser_start;
  485. mxvar_sdriver.hangup = mxser_hangup;
  486. /*
  487.  * The callout device is just like normal device except for
  488.  * major number and the subtype code.
  489.  */
  490. mxvar_cdriver = mxvar_sdriver;
  491. mxvar_cdriver.name = "cum";
  492. mxvar_cdriver.major = calloutmajor;
  493. mxvar_cdriver.subtype = SERIAL_TYPE_CALLOUT;
  494. printk("Tty devices major number = %d, callout devices major number = %dn", ttymajor, calloutmajor);
  495. mxvar_diagflag = 0;
  496. memset(mxvar_table, 0, MXSER_PORTS * sizeof(struct mxser_struct));
  497. memset(&mxvar_log, 0, sizeof(struct mxser_log));
  498. m = 0;
  499. /* Start finding ISA boards here */
  500. for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) {
  501. int cap;
  502. if (!(cap = mxserBoardCAP[b]))
  503. continue;
  504. retval = mxser_get_ISA_conf(cap, &hwconf);
  505. if (retval != 0)
  506. printk("Found MOXA %s board (CAP=0x%x)n",
  507.        mxser_brdname[hwconf.board_type],
  508.        ioaddr[b]);
  509. if (retval <= 0) {
  510. if (retval == MXSER_ERR_IRQ)
  511. printk("Invalid interrupt number,board not configuredn");
  512. else if (retval == MXSER_ERR_IRQ_CONFLIT)
  513. printk("Invalid interrupt number,board not configuredn");
  514. else if (retval == MXSER_ERR_VECTOR)
  515. printk("Invalid interrupt vector,board not configuredn");
  516. else if (retval == MXSER_ERR_IOADDR)
  517. printk("Invalid I/O address,board not configuredn");
  518. continue;
  519. }
  520. hwconf.pdev = NULL;
  521. if (mxser_initbrd(m, &hwconf) < 0)
  522. continue;
  523. mxser_getcfg(m, &hwconf);
  524. m++;
  525. }
  526. /* Start finding ISA boards from module arg */
  527. for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) {
  528. int cap;
  529. if (!(cap = ioaddr[b]))
  530. continue;
  531. retval = mxser_get_ISA_conf(cap, &hwconf);
  532. if (retval != 0)
  533. printk("Found MOXA %s board (CAP=0x%x)n",
  534.        mxser_brdname[hwconf.board_type],
  535.        ioaddr[b]);
  536. if (retval <= 0) {
  537. if (retval == MXSER_ERR_IRQ)
  538. printk("Invalid interrupt number,board not configuredn");
  539. else if (retval == MXSER_ERR_IRQ_CONFLIT)
  540. printk("Invalid interrupt number,board not configuredn");
  541. else if (retval == MXSER_ERR_VECTOR)
  542. printk("Invalid interrupt vector,board not configuredn");
  543. else if (retval == MXSER_ERR_IOADDR)
  544. printk("Invalid I/O address,board not configuredn");
  545. continue;
  546. }
  547. hwconf.pdev = NULL;
  548. if (mxser_initbrd(m, &hwconf) < 0)
  549. continue;
  550. mxser_getcfg(m, &hwconf);
  551. m++;
  552. }
  553. /* start finding PCI board here */
  554. #ifdef CONFIG_PCI
  555. {
  556. struct pci_dev *pdev = NULL;
  557. n = (sizeof(mxser_pcibrds) / sizeof(mxser_pcibrds[0])) - 1;
  558. index = 0;
  559. for (b = 0; b < n; b++) {
  560. while ((pdev = pci_find_device(mxser_pcibrds[b].vendor, mxser_pcibrds[b].device, pdev)) != NULL)
  561. {
  562. if (pci_enable_device(pdev))
  563. continue;
  564. hwconf.pdev = pdev;
  565. printk("Found MOXA %s board(BusNo=%d,DevNo=%d)n",
  566. mxser_brdname[mxser_pcibrds[b].driver_data],
  567. pdev->bus->number, PCI_SLOT(pdev->devfn));
  568. if (m >= MXSER_BOARDS) {
  569. printk("Too many Smartio family boards found (maximum %d),board not configuredn", MXSER_BOARDS);
  570. } else {
  571. retval = mxser_get_PCI_conf(pdev, mxser_pcibrds[b].driver_data, &hwconf);
  572. if (retval < 0) {
  573. if (retval == MXSER_ERR_IRQ)
  574. printk("Invalid interrupt number,board not configuredn");
  575. else if (retval == MXSER_ERR_IRQ_CONFLIT)
  576. printk("Invalid interrupt number,board not configuredn");
  577. else if (retval == MXSER_ERR_VECTOR)
  578. printk("Invalid interrupt vector,board not configuredn");
  579. else if (retval == MXSER_ERR_IOADDR)
  580. printk("Invalid I/O address,board not configuredn");
  581. continue;
  582. }
  583. if (mxser_initbrd(m, &hwconf) < 0)
  584. continue;
  585. mxser_getcfg(m, &hwconf);
  586. m++;
  587. }
  588. }
  589. }
  590. }
  591. #endif
  592. for (i = m; i < MXSER_BOARDS; i++) {
  593. mxsercfg[i].board_type = -1;
  594. }
  595. ret1 = 0;
  596. ret2 = 0;
  597. if (!(ret1 = tty_register_driver(&mxvar_sdriver))) {
  598. if (!(ret2 = tty_register_driver(&mxvar_cdriver))) {
  599. return 0;
  600. } else {
  601. tty_unregister_driver(&mxvar_sdriver);
  602. printk("Couldn't install MOXA Smartio family callout driver !n");
  603. }
  604. } else
  605. printk("Couldn't install MOXA Smartio family driver !n");
  606. if (ret1 || ret2) {
  607. for (i = 0; i < MXSER_BOARDS; i++) {
  608. if (mxsercfg[i].board_type == -1)
  609. continue;
  610. else {
  611. free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]);
  612. }
  613. }
  614. return -1;
  615. }
  616. return (0);
  617. }
  618. static void mxser_do_softint(void *private_)
  619. {
  620. struct mxser_struct *info = (struct mxser_struct *) private_;
  621. struct tty_struct *tty;
  622. tty = info->tty;
  623. if (tty) {
  624. if (test_and_clear_bit(MXSER_EVENT_TXLOW, &info->event)) {
  625. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  626.     tty->ldisc.write_wakeup)
  627. (tty->ldisc.write_wakeup) (tty);
  628. wake_up_interruptible(&tty->write_wait);
  629. }
  630. if (test_and_clear_bit(MXSER_EVENT_HANGUP, &info->event)) {
  631. tty_hangup(tty); /* FIXME: module removal race here - AKPM */
  632. }
  633. }
  634. MOD_DEC_USE_COUNT;
  635. }
  636. /*
  637.  * This routine is called whenever a serial port is opened.  It
  638.  * enables interrupts for a serial port, linking in its async structure into
  639.  * the IRQ chain.   It also performs the serial-specific
  640.  * initialization for the tty structure.
  641.  */
  642. static int mxser_open(struct tty_struct *tty, struct file *filp)
  643. {
  644. struct mxser_struct *info;
  645. int retval, line;
  646. unsigned long page;
  647. line = PORTNO(tty);
  648. if (line == MXSER_PORTS)
  649. return (0);
  650. if ((line < 0) || (line > MXSER_PORTS))
  651. return (-ENODEV);
  652. info = mxvar_table + line;
  653. if (!info->base)
  654. return (-ENODEV);
  655. info->count++;
  656. tty->driver_data = info;
  657. info->tty = tty;
  658. if (!mxvar_tmp_buf) {
  659. page = get_free_page(GFP_KERNEL);
  660. if (!page)
  661. return (-ENOMEM);
  662. if (mxvar_tmp_buf)
  663. free_page(page);
  664. else
  665. mxvar_tmp_buf = (unsigned char *) page;
  666. }
  667. /*
  668.  * Start up serial port
  669.  */
  670. retval = mxser_startup(info);
  671. if (retval)
  672. return (retval);
  673. retval = mxser_block_til_ready(tty, filp, info);
  674. if (retval)
  675. return (retval);
  676. if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
  677. if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
  678. *tty->termios = info->normal_termios;
  679. else
  680. *tty->termios = info->callout_termios;
  681. mxser_change_speed(info, 0);
  682. }
  683. info->session = current->session;
  684. info->pgrp = current->pgrp;
  685. MOD_INC_USE_COUNT;
  686. return (0);
  687. }
  688. /*
  689.  * This routine is called when the serial port gets closed.  First, we
  690.  * wait for the last remaining data to be sent.  Then, we unlink its
  691.  * async structure from the interrupt chain if necessary, and we free
  692.  * that IRQ if nothing is left in the chain.
  693.  */
  694. static void mxser_close(struct tty_struct *tty, struct file *filp)
  695. {
  696. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  697. unsigned long flags;
  698. unsigned long timeout;
  699. if (PORTNO(tty) == MXSER_PORTS)
  700. return;
  701. if (!info)
  702. return;
  703. save_flags(flags);
  704. cli();
  705. if (tty_hung_up_p(filp)) {
  706. restore_flags(flags);
  707. MOD_DEC_USE_COUNT;
  708. return;
  709. }
  710. if ((tty->count == 1) && (info->count != 1)) {
  711. /*
  712.  * Uh, oh.        tty->count is 1, which means that the tty
  713.  * structure will be freed.  Info->count should always
  714.  * be one in these conditions.  If it's greater than
  715.  * one, we've got real problems, since it means the
  716.  * serial port won't be shutdown.
  717.  */
  718. printk("mxser_close: bad serial port count; tty->count is 1, "
  719.        "info->count is %dn", info->count);
  720. info->count = 1;
  721. }
  722. if (--info->count < 0) {
  723. printk("mxser_close: bad serial port count for ttys%d: %dn",
  724.        info->port, info->count);
  725. info->count = 0;
  726. }
  727. if (info->count) {
  728. restore_flags(flags);
  729. MOD_DEC_USE_COUNT;
  730. return;
  731. }
  732. info->flags |= ASYNC_CLOSING;
  733. /*
  734.  * Save the termios structure, since this port may have
  735.  * separate termios for callout and dialin.
  736.  */
  737. if (info->flags & ASYNC_NORMAL_ACTIVE)
  738. info->normal_termios = *tty->termios;
  739. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  740. info->callout_termios = *tty->termios;
  741. /*
  742.  * Now we wait for the transmit buffer to clear; and we notify
  743.  * the line discipline to only process XON/XOFF characters.
  744.  */
  745. tty->closing = 1;
  746. if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
  747. tty_wait_until_sent(tty, info->closing_wait);
  748. /*
  749.  * At this point we stop accepting input.  To do this, we
  750.  * disable the receive line status interrupts, and tell the
  751.  * interrupt driver to stop checking the data ready bit in the
  752.  * line status register.
  753.  */
  754. info->IER &= ~UART_IER_RLSI;
  755. /* by William
  756.    info->read_status_mask &= ~UART_LSR_DR;
  757.  */
  758. if (info->flags & ASYNC_INITIALIZED) {
  759. outb(info->IER, info->base + UART_IER);
  760. /*
  761.  * Before we drop DTR, make sure the UART transmitter
  762.  * has completely drained; this is especially
  763.  * important if there is a transmit FIFO!
  764.  */
  765. timeout = jiffies + HZ;
  766. while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) {
  767. set_current_state(TASK_INTERRUPTIBLE);
  768. schedule_timeout(5);
  769. if (jiffies > timeout)
  770. break;
  771. }
  772. }
  773. mxser_shutdown(info);
  774. if (tty->driver.flush_buffer)
  775. tty->driver.flush_buffer(tty);
  776. if (tty->ldisc.flush_buffer)
  777. tty->ldisc.flush_buffer(tty);
  778. tty->closing = 0;
  779. info->event = 0;
  780. info->tty = 0;
  781. if (info->blocked_open) {
  782. if (info->close_delay) {
  783. set_current_state(TASK_INTERRUPTIBLE);
  784. schedule_timeout(info->close_delay);
  785. }
  786. wake_up_interruptible(&info->open_wait);
  787. }
  788. info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE |
  789.  ASYNC_CLOSING);
  790. wake_up_interruptible(&info->close_wait);
  791. restore_flags(flags);
  792. MOD_DEC_USE_COUNT;
  793. }
  794. static int mxser_write(struct tty_struct *tty, int from_user,
  795.        const unsigned char *buf, int count)
  796. {
  797. int c, total = 0;
  798. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  799. unsigned long flags;
  800. if (!tty || !info->xmit_buf || !mxvar_tmp_buf)
  801. return (0);
  802. save_flags(flags);
  803. if (from_user) {
  804. down(&mxvar_tmp_buf_sem);
  805. while (1) {
  806. c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  807.    SERIAL_XMIT_SIZE - info->xmit_head));
  808. if (c <= 0)
  809. break;
  810. c -= copy_from_user(mxvar_tmp_buf, buf, c);
  811. if (!c) {
  812. if (!total)
  813. total = -EFAULT;
  814. break;
  815. }
  816. cli();
  817. c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  818.        SERIAL_XMIT_SIZE - info->xmit_head));
  819. memcpy(info->xmit_buf + info->xmit_head, mxvar_tmp_buf, c);
  820. info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1);
  821. info->xmit_cnt += c;
  822. restore_flags(flags);
  823. buf += c;
  824. count -= c;
  825. total += c;
  826. }
  827. up(&mxvar_tmp_buf_sem);
  828. } else {
  829. while (1) {
  830. cli();
  831. c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  832.    SERIAL_XMIT_SIZE - info->xmit_head));
  833. if (c <= 0) {
  834. restore_flags(flags);
  835. break;
  836. }
  837. memcpy(info->xmit_buf + info->xmit_head, buf, c);
  838. info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1);
  839. info->xmit_cnt += c;
  840. restore_flags(flags);
  841. buf += c;
  842. count -= c;
  843. total += c;
  844. }
  845. }
  846. cli();
  847. if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped &&
  848.     !(info->IER & UART_IER_THRI)) {
  849. info->IER |= UART_IER_THRI;
  850. outb(info->IER, info->base + UART_IER);
  851. }
  852. restore_flags(flags);
  853. return (total);
  854. }
  855. static void mxser_put_char(struct tty_struct *tty, unsigned char ch)
  856. {
  857. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  858. unsigned long flags;
  859. if (!tty || !info->xmit_buf)
  860. return;
  861. save_flags(flags);
  862. cli();
  863. if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
  864. restore_flags(flags);
  865. return;
  866. }
  867. info->xmit_buf[info->xmit_head++] = ch;
  868. info->xmit_head &= SERIAL_XMIT_SIZE - 1;
  869. info->xmit_cnt++;
  870. /********************************************** why ??? ***********
  871. if ( !tty->stopped && !tty->hw_stopped &&
  872.      !(info->IER & UART_IER_THRI) ) {
  873.     info->IER |= UART_IER_THRI;
  874.     outb(info->IER, info->base + UART_IER);
  875. }
  876. *****************************************************************/
  877. restore_flags(flags);
  878. }
  879. static void mxser_flush_chars(struct tty_struct *tty)
  880. {
  881. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  882. unsigned long flags;
  883. if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
  884.     !info->xmit_buf)
  885. return;
  886. save_flags(flags);
  887. cli();
  888. info->IER |= UART_IER_THRI;
  889. outb(info->IER, info->base + UART_IER);
  890. restore_flags(flags);
  891. }
  892. static int mxser_write_room(struct tty_struct *tty)
  893. {
  894. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  895. int ret;
  896. ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
  897. if (ret < 0)
  898. ret = 0;
  899. return (ret);
  900. }
  901. static int mxser_chars_in_buffer(struct tty_struct *tty)
  902. {
  903. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  904. return (info->xmit_cnt);
  905. }
  906. static void mxser_flush_buffer(struct tty_struct *tty)
  907. {
  908. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  909. unsigned long flags;
  910. save_flags(flags);
  911. cli();
  912. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  913. restore_flags(flags);
  914. wake_up_interruptible(&tty->write_wait);
  915. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  916.     tty->ldisc.write_wakeup)
  917. (tty->ldisc.write_wakeup) (tty);
  918. }
  919. static int mxser_ioctl(struct tty_struct *tty, struct file *file,
  920.        unsigned int cmd, unsigned long arg)
  921. {
  922. unsigned long flags;
  923. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  924. int retval;
  925. struct async_icount cprev, cnow; /* kernel counter temps */
  926. struct serial_icounter_struct *p_cuser; /* user space */
  927. unsigned long templ;
  928. if (PORTNO(tty) == MXSER_PORTS)
  929. return (mxser_ioctl_special(cmd, arg));
  930. if ((cmd != TIOCGSERIAL) && (cmd != TIOCMIWAIT) &&
  931.     (cmd != TIOCGICOUNT)) {
  932. if (tty->flags & (1 << TTY_IO_ERROR))
  933. return (-EIO);
  934. }
  935. switch (cmd) {
  936. case TCSBRK: /* SVID version: non-zero arg --> no break */
  937. retval = tty_check_change(tty);
  938. if (retval)
  939. return (retval);
  940. tty_wait_until_sent(tty, 0);
  941. if (!arg)
  942. mxser_send_break(info, HZ / 4); /* 1/4 second */
  943. return (0);
  944. case TCSBRKP: /* support for POSIX tcsendbreak() */
  945. retval = tty_check_change(tty);
  946. if (retval)
  947. return (retval);
  948. tty_wait_until_sent(tty, 0);
  949. mxser_send_break(info, arg ? arg * (HZ / 10) : HZ / 4);
  950. return (0);
  951. case TIOCGSOFTCAR:
  952. return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg);
  953. case TIOCSSOFTCAR:
  954. if(get_user(templ, (unsigned long *) arg))
  955. return -EFAULT;
  956. arg = templ;
  957. tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) |
  958.  (arg ? CLOCAL : 0));
  959. return (0);
  960. case TIOCMGET:
  961. return (mxser_get_modem_info(info, (unsigned int *) arg));
  962. case TIOCMBIS:
  963. case TIOCMBIC:
  964. case TIOCMSET:
  965. return (mxser_set_modem_info(info, cmd, (unsigned int *) arg));
  966. case TIOCGSERIAL:
  967. return (mxser_get_serial_info(info, (struct serial_struct *) arg));
  968. case TIOCSSERIAL:
  969. return (mxser_set_serial_info(info, (struct serial_struct *) arg));
  970. case TIOCSERGETLSR: /* Get line status register */
  971. return (mxser_get_lsr_info(info, (unsigned int *) arg));
  972. /*
  973.  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
  974.  * - mask passed in arg for lines of interest
  975.  *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
  976.  * Caller should use TIOCGICOUNT to see which one it was
  977.  */
  978. case TIOCMIWAIT:
  979. save_flags(flags);
  980. cli();
  981. cprev = info->icount; /* note the counters on entry */
  982. restore_flags(flags);
  983. while (1) {
  984. interruptible_sleep_on(&info->delta_msr_wait);
  985. /* see if a signal did it */
  986. if (signal_pending(current))
  987. return (-ERESTARTSYS);
  988. save_flags(flags);
  989. cli();
  990. cnow = info->icount; /* atomic copy */
  991. restore_flags(flags);
  992. if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
  993.   cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
  994. return (-EIO); /* no change => error */
  995. if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
  996. ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
  997.  ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
  998. ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
  999. return (0);
  1000. }
  1001. cprev = cnow;
  1002. }
  1003. /* NOTREACHED */
  1004. /*
  1005.  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
  1006.  * Return: write counters to the user passed counter struct
  1007.  * NB: both 1->0 and 0->1 transitions are counted except for
  1008.  *     RI where only 0->1 is counted.
  1009.  */
  1010. case TIOCGICOUNT:
  1011. save_flags(flags);
  1012. cli();
  1013. cnow = info->icount;
  1014. restore_flags(flags);
  1015. p_cuser = (struct serial_icounter_struct *) arg;
  1016. if(put_user(cnow.cts, &p_cuser->cts))
  1017. return -EFAULT;
  1018. if(put_user(cnow.dsr, &p_cuser->dsr))
  1019. return -EFAULT;
  1020. if(put_user(cnow.rng, &p_cuser->rng))
  1021. return -EFAULT;
  1022. return put_user(cnow.dcd, &p_cuser->dcd);
  1023. case MOXA_HighSpeedOn:
  1024. return put_user(info->baud_base != 115200 ? 1 : 0, (int *) arg);
  1025. default:
  1026. return (-ENOIOCTLCMD);
  1027. }
  1028. return (0);
  1029. }
  1030. static int mxser_ioctl_special(unsigned int cmd, unsigned long arg)
  1031. {
  1032. int i, result, status;
  1033. switch (cmd) {
  1034. case MOXA_GET_CONF:
  1035. if(copy_to_user((struct mxser_hwconf *) arg, mxsercfg,
  1036.      sizeof(struct mxser_hwconf) * 4))
  1037.       return -EFAULT;
  1038. return 0;
  1039. case MOXA_GET_MAJOR:
  1040. if(copy_to_user((int *) arg, &ttymajor, sizeof(int)))
  1041. return -EFAULT;
  1042. return 0;
  1043. case MOXA_GET_CUMAJOR:
  1044. if(copy_to_user((int *) arg, &calloutmajor, sizeof(int)))
  1045. return -EFAULT;
  1046. return 0;
  1047. case MOXA_CHKPORTENABLE:
  1048. result = 0;
  1049. for (i = 0; i < MXSER_PORTS; i++) {
  1050. if (mxvar_table[i].base)
  1051. result |= (1 << i);
  1052. }
  1053. return put_user(result, (unsigned long *) arg);
  1054. case MOXA_GETDATACOUNT:
  1055. if(copy_to_user((struct mxser_log *) arg, &mxvar_log, sizeof(mxvar_log)))
  1056. return -EFAULT;
  1057. return (0);
  1058. case MOXA_GETMSTATUS:
  1059. for (i = 0; i < MXSER_PORTS; i++) {
  1060. GMStatus[i].ri = 0;
  1061. if (!mxvar_table[i].base) {
  1062. GMStatus[i].dcd = 0;
  1063. GMStatus[i].dsr = 0;
  1064. GMStatus[i].cts = 0;
  1065. continue;
  1066. }
  1067. if (!mxvar_table[i].tty || !mxvar_table[i].tty->termios)
  1068. GMStatus[i].cflag = mxvar_table[i].normal_termios.c_cflag;
  1069. else
  1070. GMStatus[i].cflag = mxvar_table[i].tty->termios->c_cflag;
  1071. status = inb(mxvar_table[i].base + UART_MSR);
  1072. if (status & 0x80 /*UART_MSR_DCD */ )
  1073. GMStatus[i].dcd = 1;
  1074. else
  1075. GMStatus[i].dcd = 0;
  1076. if (status & 0x20 /*UART_MSR_DSR */ )
  1077. GMStatus[i].dsr = 1;
  1078. else
  1079. GMStatus[i].dsr = 0;
  1080. if (status & 0x10 /*UART_MSR_CTS */ )
  1081. GMStatus[i].cts = 1;
  1082. else
  1083. GMStatus[i].cts = 0;
  1084. }
  1085. if(copy_to_user((struct mxser_mstatus *) arg, GMStatus,
  1086.      sizeof(struct mxser_mstatus) * MXSER_PORTS))
  1087. return -EFAULT;
  1088. return 0;
  1089. default:
  1090. return (-ENOIOCTLCMD);
  1091. }
  1092. return (0);
  1093. }
  1094. /*
  1095.  * This routine is called by the upper-layer tty layer to signal that
  1096.  * incoming characters should be throttled.
  1097.  */
  1098. static void mxser_throttle(struct tty_struct *tty)
  1099. {
  1100. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1101. unsigned long flags;
  1102. if (I_IXOFF(tty)) {
  1103. info->x_char = STOP_CHAR(tty);
  1104. save_flags(flags);
  1105. cli();
  1106. outb(info->IER, 0);
  1107. info->IER |= UART_IER_THRI;
  1108. outb(info->IER, info->base + UART_IER); /* force Tx interrupt */
  1109. restore_flags(flags);
  1110. }
  1111. if (info->tty->termios->c_cflag & CRTSCTS) {
  1112. info->MCR &= ~UART_MCR_RTS;
  1113. save_flags(flags);
  1114. cli();
  1115. outb(info->MCR, info->base + UART_MCR);
  1116. restore_flags(flags);
  1117. }
  1118. }
  1119. static void mxser_unthrottle(struct tty_struct *tty)
  1120. {
  1121. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1122. unsigned long flags;
  1123. if (I_IXOFF(tty)) {
  1124. if (info->x_char)
  1125. info->x_char = 0;
  1126. else {
  1127. info->x_char = START_CHAR(tty);
  1128. save_flags(flags);
  1129. cli();
  1130. outb(info->IER, 0);
  1131. info->IER |= UART_IER_THRI; /* force Tx interrupt */
  1132. outb(info->IER, info->base + UART_IER);
  1133. restore_flags(flags);
  1134. }
  1135. }
  1136. if (info->tty->termios->c_cflag & CRTSCTS) {
  1137. info->MCR |= UART_MCR_RTS;
  1138. save_flags(flags);
  1139. cli();
  1140. outb(info->MCR, info->base + UART_MCR);
  1141. restore_flags(flags);
  1142. }
  1143. }
  1144. static void mxser_set_termios(struct tty_struct *tty,
  1145.       struct termios *old_termios)
  1146. {
  1147. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1148. /* 8-2-99 by William
  1149.    if ( (tty->termios->c_cflag == old_termios->c_cflag) &&
  1150.    (RELEVANT_IFLAG(tty->termios->c_iflag) ==
  1151.    RELEVANT_IFLAG(old_termios->c_iflag)) )
  1152.    return;
  1153.    mxser_change_speed(info, old_termios);
  1154.    if ( (old_termios->c_cflag & CRTSCTS) &&
  1155.    !(tty->termios->c_cflag & CRTSCTS) ) {
  1156.    tty->hw_stopped = 0;
  1157.    mxser_start(tty);
  1158.    }
  1159.  */
  1160. if ((tty->termios->c_cflag != old_termios->c_cflag) ||
  1161.     (RELEVANT_IFLAG(tty->termios->c_iflag) !=
  1162.      RELEVANT_IFLAG(old_termios->c_iflag))) {
  1163. mxser_change_speed(info, old_termios);
  1164. if ((old_termios->c_cflag & CRTSCTS) &&
  1165.     !(tty->termios->c_cflag & CRTSCTS)) {
  1166. tty->hw_stopped = 0;
  1167. mxser_start(tty);
  1168. }
  1169. }
  1170. /* Handle sw stopped */
  1171. if ((old_termios->c_iflag & IXON) &&
  1172.     !(tty->termios->c_iflag & IXON)) {
  1173. tty->stopped = 0;
  1174. mxser_start(tty);
  1175. }
  1176. }
  1177. /*
  1178.  * mxser_stop() and mxser_start()
  1179.  *
  1180.  * This routines are called before setting or resetting tty->stopped.
  1181.  * They enable or disable transmitter interrupts, as necessary.
  1182.  */
  1183. static void mxser_stop(struct tty_struct *tty)
  1184. {
  1185. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1186. unsigned long flags;
  1187. save_flags(flags);
  1188. cli();
  1189. if (info->IER & UART_IER_THRI) {
  1190. info->IER &= ~UART_IER_THRI;
  1191. outb(info->IER, info->base + UART_IER);
  1192. }
  1193. restore_flags(flags);
  1194. }
  1195. static void mxser_start(struct tty_struct *tty)
  1196. {
  1197. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1198. unsigned long flags;
  1199. save_flags(flags);
  1200. cli();
  1201. if (info->xmit_cnt && info->xmit_buf &&
  1202.     !(info->IER & UART_IER_THRI)) {
  1203. info->IER |= UART_IER_THRI;
  1204. outb(info->IER, info->base + UART_IER);
  1205. }
  1206. restore_flags(flags);
  1207. }
  1208. /*
  1209.  * This routine is called by tty_hangup() when a hangup is signaled.
  1210.  */
  1211. void mxser_hangup(struct tty_struct *tty)
  1212. {
  1213. struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
  1214. mxser_flush_buffer(tty);
  1215. mxser_shutdown(info);
  1216. info->event = 0;
  1217. info->count = 0;
  1218. info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE);
  1219. info->tty = 0;
  1220. wake_up_interruptible(&info->open_wait);
  1221. }
  1222. /*
  1223.  * This is the serial driver's generic interrupt routine
  1224.  */
  1225. static void mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1226. {
  1227. int status, i;
  1228. struct mxser_struct *info;
  1229. struct mxser_struct *port;
  1230. int max, irqbits, bits, msr;
  1231. int pass_counter = 0;
  1232. port = 0;
  1233. for (i = 0; i < MXSER_BOARDS; i++) {
  1234. if (dev_id == &(mxvar_table[i * MXSER_PORTS_PER_BOARD])) {
  1235. port = dev_id;
  1236. break;
  1237. }
  1238. }
  1239. if (i == MXSER_BOARDS)
  1240. return;
  1241. if (port == 0)
  1242. return;
  1243. max = mxser_numports[mxsercfg[i].board_type];
  1244. while (1) {
  1245. irqbits = inb(port->vector) & port->vectormask;
  1246. if (irqbits == port->vectormask)
  1247. break;
  1248. for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
  1249. if (irqbits == port->vectormask)
  1250. break;
  1251. if (bits & irqbits)
  1252. continue;
  1253. info = port + i;
  1254. if (!info->tty ||
  1255.   (inb(info->base + UART_IIR) & UART_IIR_NO_INT))
  1256. continue;
  1257. status = inb(info->base + UART_LSR) & info->read_status_mask;
  1258. if (status & UART_LSR_DR)
  1259. mxser_receive_chars(info, &status);
  1260. msr = inb(info->base + UART_MSR);
  1261. if (msr & UART_MSR_ANY_DELTA)
  1262. mxser_check_modem_status(info, msr);
  1263. if (status & UART_LSR_THRE) {
  1264. /* 8-2-99 by William
  1265.    if ( info->x_char || (info->xmit_cnt > 0) )
  1266.  */
  1267. mxser_transmit_chars(info);
  1268. }
  1269. }
  1270. if (pass_counter++ > MXSER_ISR_PASS_LIMIT) {
  1271. #if 0
  1272. printk("MOXA Smartio/Indusrtio family driver interrupt loop breakn");
  1273. #endif
  1274. break; /* Prevent infinite loops */
  1275. }
  1276. }
  1277. }
  1278. static inline void mxser_receive_chars(struct mxser_struct *info,
  1279.  int *status)
  1280. {
  1281. struct tty_struct *tty = info->tty;
  1282. unsigned char ch;
  1283. int ignored = 0;
  1284. int cnt = 0;
  1285. do {
  1286. ch = inb(info->base + UART_RX);
  1287. if (*status & info->ignore_status_mask) {
  1288. if (++ignored > 100)
  1289. break;
  1290. } else {
  1291. if (tty->flip.count >= TTY_FLIPBUF_SIZE)
  1292. break;
  1293. tty->flip.count++;
  1294. if (*status & UART_LSR_SPECIAL) {
  1295. if (*status & UART_LSR_BI) {
  1296. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  1297. if (info->flags & ASYNC_SAK)
  1298. do_SAK(tty);
  1299. } else if (*status & UART_LSR_PE) {
  1300. *tty->flip.flag_buf_ptr++ = TTY_PARITY;
  1301. } else if (*status & UART_LSR_FE) {
  1302. *tty->flip.flag_buf_ptr++ = TTY_FRAME;
  1303. } else if (*status & UART_LSR_OE) {
  1304. *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
  1305. } else
  1306. *tty->flip.flag_buf_ptr++ = 0;
  1307. } else
  1308. *tty->flip.flag_buf_ptr++ = 0;
  1309. *tty->flip.char_buf_ptr++ = ch;
  1310. cnt++;
  1311. }
  1312. *status = inb(info->base + UART_LSR) & info->read_status_mask;
  1313. } while (*status & UART_LSR_DR);
  1314. mxvar_log.rxcnt[info->port] += cnt;
  1315. queue_task(&tty->flip.tqueue, &tq_timer);
  1316. }
  1317. static inline void mxser_transmit_chars(struct mxser_struct *info)
  1318. {
  1319. int count, cnt;
  1320. if (info->x_char) {
  1321. outb(info->x_char, info->base + UART_TX);
  1322. info->x_char = 0;
  1323. mxvar_log.txcnt[info->port]++;
  1324. return;
  1325. }
  1326. if ((info->xmit_cnt <= 0) || info->tty->stopped ||
  1327.     info->tty->hw_stopped) {
  1328. info->IER &= ~UART_IER_THRI;
  1329. outb(info->IER, info->base + UART_IER);
  1330. return;
  1331. }
  1332. cnt = info->xmit_cnt;
  1333. count = info->xmit_fifo_size;
  1334. do {
  1335. outb(info->xmit_buf[info->xmit_tail++], info->base + UART_TX);
  1336. info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE - 1);
  1337. if (--info->xmit_cnt <= 0)
  1338. break;
  1339. } while (--count > 0);
  1340. mxvar_log.txcnt[info->port] += (cnt - info->xmit_cnt);
  1341. if (info->xmit_cnt < WAKEUP_CHARS) {
  1342. set_bit(MXSER_EVENT_TXLOW, &info->event);
  1343. MOD_INC_USE_COUNT;
  1344. if (schedule_task(&info->tqueue) == 0)
  1345.     MOD_DEC_USE_COUNT;
  1346. }
  1347. if (info->xmit_cnt <= 0) {
  1348. info->IER &= ~UART_IER_THRI;
  1349. outb(info->IER, info->base + UART_IER);
  1350. }
  1351. }
  1352. static inline void mxser_check_modem_status(struct mxser_struct *info,
  1353.       int status)
  1354. {
  1355. /* update input line counters */
  1356. if (status & UART_MSR_TERI)
  1357. info->icount.rng++;
  1358. if (status & UART_MSR_DDSR)
  1359. info->icount.dsr++;
  1360. if (status & UART_MSR_DDCD)
  1361. info->icount.dcd++;
  1362. if (status & UART_MSR_DCTS)
  1363. info->icount.cts++;
  1364. wake_up_interruptible(&info->delta_msr_wait);
  1365. if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
  1366. if (status & UART_MSR_DCD)
  1367. wake_up_interruptible(&info->open_wait);
  1368. else if (!((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1369.    (info->flags & ASYNC_CALLOUT_NOHUP)))
  1370. set_bit(MXSER_EVENT_HANGUP, &info->event);
  1371. MOD_INC_USE_COUNT;
  1372. if (schedule_task(&info->tqueue) == 0)
  1373.     MOD_DEC_USE_COUNT;
  1374. }
  1375. if (info->flags & ASYNC_CTS_FLOW) {
  1376. if (info->tty->hw_stopped) {
  1377. if (status & UART_MSR_CTS) {
  1378. info->tty->hw_stopped = 0;
  1379. info->IER |= UART_IER_THRI;
  1380. outb(info->IER, info->base + UART_IER);
  1381. set_bit(MXSER_EVENT_TXLOW, &info->event);
  1382. MOD_INC_USE_COUNT;
  1383. if (schedule_task(&info->tqueue) == 0)
  1384. MOD_DEC_USE_COUNT;
  1385. }
  1386. } else {
  1387. if (!(status & UART_MSR_CTS)) {
  1388. info->tty->hw_stopped = 1;
  1389. info->IER &= ~UART_IER_THRI;
  1390. outb(info->IER, info->base + UART_IER);
  1391. }
  1392. }
  1393. }
  1394. }
  1395. static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp,
  1396.  struct mxser_struct *info)
  1397. {
  1398. DECLARE_WAITQUEUE(wait, current);
  1399. unsigned long flags;
  1400. int retval;
  1401. int do_clocal = 0;
  1402. /*
  1403.  * If the device is in the middle of being closed, then block
  1404.  * until it's done, and then try again.
  1405.  */
  1406. if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
  1407. if (info->flags & ASYNC_CLOSING)
  1408. interruptible_sleep_on(&info->close_wait);
  1409. #ifdef SERIAL_DO_RESTART
  1410. if (info->flags & ASYNC_HUP_NOTIFY)
  1411. return (-EAGAIN);
  1412. else
  1413. return (-ERESTARTSYS);
  1414. #else
  1415. return (-EAGAIN);
  1416. #endif
  1417. }
  1418. /*
  1419.  * If this is a callout device, then just make sure the normal
  1420.  * device isn't being used.
  1421.  */
  1422. if (tty->driver.subtype == SERIAL_TYPE_CALLOUT) {
  1423. if (info->flags & ASYNC_NORMAL_ACTIVE)
  1424. return (-EBUSY);
  1425. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1426.     (info->flags & ASYNC_SESSION_LOCKOUT) &&
  1427.     (info->session != current->session))
  1428. return (-EBUSY);
  1429. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1430.     (info->flags & ASYNC_PGRP_LOCKOUT) &&
  1431.     (info->pgrp != current->pgrp))
  1432. return (-EBUSY);
  1433. info->flags |= ASYNC_CALLOUT_ACTIVE;
  1434. return (0);
  1435. }
  1436. /*
  1437.  * If non-blocking mode is set, or the port is not enabled,
  1438.  * then make the check up front and then exit.
  1439.  */
  1440. if ((filp->f_flags & O_NONBLOCK) ||
  1441.     (tty->flags & (1 << TTY_IO_ERROR))) {
  1442. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  1443. return (-EBUSY);
  1444. info->flags |= ASYNC_NORMAL_ACTIVE;
  1445. return (0);
  1446. }
  1447. if (info->flags & ASYNC_CALLOUT_ACTIVE) {
  1448. if (info->normal_termios.c_cflag & CLOCAL)
  1449. do_clocal = 1;
  1450. } else {
  1451. if (tty->termios->c_cflag & CLOCAL)
  1452. do_clocal = 1;
  1453. }
  1454. /*
  1455.  * Block waiting for the carrier detect and the line to become
  1456.  * free (i.e., not in use by the callout).  While we are in
  1457.  * this loop, info->count is dropped by one, so that
  1458.  * mxser_close() knows when to free things.  We restore it upon
  1459.  * exit, either normal or abnormal.
  1460.  */
  1461. retval = 0;
  1462. add_wait_queue(&info->open_wait, &wait);
  1463. save_flags(flags);
  1464. cli();
  1465. if (!tty_hung_up_p(filp))
  1466. info->count--;
  1467. restore_flags(flags);
  1468. info->blocked_open++;
  1469. while (1) {
  1470. save_flags(flags);
  1471. cli();
  1472. if (!(info->flags & ASYNC_CALLOUT_ACTIVE))
  1473. outb(inb(info->base + UART_MCR) | UART_MCR_DTR | UART_MCR_RTS,
  1474.      info->base + UART_MCR);
  1475. restore_flags(flags);
  1476. set_current_state(TASK_INTERRUPTIBLE);
  1477. if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)) {
  1478. #ifdef SERIAL_DO_RESTART
  1479. if (info->flags & ASYNC_HUP_NOTIFY)
  1480. retval = -EAGAIN;
  1481. else
  1482. retval = -ERESTARTSYS;
  1483. #else
  1484. retval = -EAGAIN;
  1485. #endif
  1486. break;
  1487. }
  1488. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1489.     !(info->flags & ASYNC_CLOSING) &&
  1490.     (do_clocal || (inb(info->base + UART_MSR) & UART_MSR_DCD)))
  1491. break;
  1492. if (signal_pending(current)) {
  1493. retval = -ERESTARTSYS;
  1494. break;
  1495. }
  1496. schedule();
  1497. }
  1498. set_current_state(TASK_RUNNING);
  1499. remove_wait_queue(&info->open_wait, &wait);
  1500. if (!tty_hung_up_p(filp))
  1501. info->count++;
  1502. info->blocked_open--;
  1503. if (retval)
  1504. return (retval);
  1505. info->flags |= ASYNC_NORMAL_ACTIVE;
  1506. return (0);
  1507. }
  1508. static int mxser_startup(struct mxser_struct *info)
  1509. {
  1510. unsigned long flags;
  1511. unsigned long page;
  1512. page = get_free_page(GFP_KERNEL);
  1513. if (!page)
  1514. return (-ENOMEM);
  1515. save_flags(flags);
  1516. cli();
  1517. if (info->flags & ASYNC_INITIALIZED) {
  1518. free_page(page);
  1519. restore_flags(flags);
  1520. return (0);
  1521. }
  1522. if (!info->base || !info->type) {
  1523. if (info->tty)
  1524. set_bit(TTY_IO_ERROR, &info->tty->flags);
  1525. free_page(page);
  1526. restore_flags(flags);
  1527. return (0);
  1528. }
  1529. if (info->xmit_buf)
  1530. free_page(page);
  1531. else
  1532. info->xmit_buf = (unsigned char *) page;
  1533. /*
  1534.  * Clear the FIFO buffers and disable them
  1535.  * (they will be reenabled in mxser_change_speed())
  1536.  */
  1537. if (info->xmit_fifo_size == 16)
  1538. outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
  1539.      info->base + UART_FCR);
  1540. /*
  1541.  * At this point there's no way the LSR could still be 0xFF;
  1542.  * if it is, then bail out, because there's likely no UART
  1543.  * here.
  1544.  */
  1545. if (inb(info->base + UART_LSR) == 0xff) {
  1546. restore_flags(flags);
  1547. if (capable(CAP_SYS_ADMIN)) {
  1548. if (info->tty)
  1549. set_bit(TTY_IO_ERROR, &info->tty->flags);
  1550. return (0);
  1551. } else
  1552. return (-ENODEV);
  1553. }
  1554. /*
  1555.  * Clear the interrupt registers.
  1556.  */
  1557. (void) inb(info->base + UART_LSR);
  1558. (void) inb(info->base + UART_RX);
  1559. (void) inb(info->base + UART_IIR);
  1560. (void) inb(info->base + UART_MSR);
  1561. /*
  1562.  * Now, initialize the UART
  1563.  */
  1564. outb(UART_LCR_WLEN8, info->base + UART_LCR); /* reset DLAB */
  1565. info->MCR = UART_MCR_DTR | UART_MCR_RTS;
  1566. outb(info->MCR, info->base + UART_MCR);
  1567. /*
  1568.  * Finally, enable interrupts
  1569.  */
  1570. info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
  1571. outb(info->IER, info->base + UART_IER); /* enable interrupts */
  1572. /*
  1573.  * And clear the interrupt registers again for luck.
  1574.  */
  1575. (void) inb(info->base + UART_LSR);
  1576. (void) inb(info->base + UART_RX);
  1577. (void) inb(info->base + UART_IIR);
  1578. (void) inb(info->base + UART_MSR);
  1579. if (info->tty)
  1580. test_and_clear_bit(TTY_IO_ERROR, &info->tty->flags);
  1581. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  1582. /*
  1583.  * and set the speed of the serial port
  1584.  */
  1585. mxser_change_speed(info, 0);
  1586. info->flags |= ASYNC_INITIALIZED;
  1587. restore_flags(flags);
  1588. return (0);
  1589. }
  1590. /*
  1591.  * This routine will shutdown a serial port; interrupts maybe disabled, and
  1592.  * DTR is dropped if the hangup on close termio flag is on.
  1593.  */
  1594. static void mxser_shutdown(struct mxser_struct *info)
  1595. {
  1596. unsigned long flags;
  1597. if (!(info->flags & ASYNC_INITIALIZED))
  1598. return;
  1599. save_flags(flags);
  1600. cli(); /* Disable interrupts */
  1601. /*
  1602.  * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
  1603.  * here so the queue might never be waken up
  1604.  */
  1605. wake_up_interruptible(&info->delta_msr_wait);
  1606. /*
  1607.  * Free the IRQ, if necessary
  1608.  */
  1609. if (info->xmit_buf) {
  1610. free_page((unsigned long) info->xmit_buf);
  1611. info->xmit_buf = 0;
  1612. }
  1613. info->IER = 0;
  1614. outb(0x00, info->base + UART_IER); /* disable all intrs */
  1615. if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
  1616. info->MCR &= ~(UART_MCR_DTR | UART_MCR_RTS);
  1617. outb(info->MCR, info->base + UART_MCR);
  1618. /* clear Rx/Tx FIFO's */
  1619. outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), info->base + UART_FCR);
  1620. /* read data port to reset things */
  1621. (void) inb(info->base + UART_RX);
  1622. if (info->tty)
  1623. set_bit(TTY_IO_ERROR, &info->tty->flags);
  1624. info->flags &= ~ASYNC_INITIALIZED;
  1625. restore_flags(flags);
  1626. }
  1627. /*
  1628.  * This routine is called to set the UART divisor registers to match
  1629.  * the specified baud rate for a serial port.
  1630.  */
  1631. static int mxser_change_speed(struct mxser_struct *info,
  1632.       struct termios *old_termios)
  1633. {
  1634. int quot = 0;
  1635. unsigned cflag, cval, fcr;
  1636. int i;
  1637. int ret = 0;
  1638. unsigned long flags;
  1639. if (!info->tty || !info->tty->termios)
  1640. return ret;
  1641. cflag = info->tty->termios->c_cflag;
  1642. if (!(info->base))
  1643. return ret;
  1644. #ifndef B921600
  1645. #define B921600 (B460800 +1)
  1646. #endif
  1647. switch (cflag & (CBAUD | CBAUDEX)) {
  1648. case B921600:
  1649. i = 20;
  1650. break;
  1651. case B460800:
  1652. i = 19;
  1653. break;
  1654. case B230400:
  1655. i = 18;
  1656. break;
  1657. case B115200:
  1658. i = 17;
  1659. break;
  1660. case B57600:
  1661. i = 16;
  1662. break;
  1663. case B38400:
  1664. i = 15;
  1665. break;
  1666. case B19200:
  1667. i = 14;
  1668. break;
  1669. case B9600:
  1670. i = 13;
  1671. break;
  1672. case B4800:
  1673. i = 12;
  1674. break;
  1675. case B2400:
  1676. i = 11;
  1677. break;
  1678. case B1800:
  1679. i = 10;
  1680. break;
  1681. case B1200:
  1682. i = 9;
  1683. break;
  1684. case B600:
  1685. i = 8;
  1686. break;
  1687. case B300:
  1688. i = 7;
  1689. break;
  1690. case B200:
  1691. i = 6;
  1692. break;
  1693. case B150:
  1694. i = 5;
  1695. break;
  1696. case B134:
  1697. i = 4;
  1698. break;
  1699. case B110:
  1700. i = 3;
  1701. break;
  1702. case B75:
  1703. i = 2;
  1704. break;
  1705. case B50:
  1706. i = 1;
  1707. break;
  1708. default:
  1709. i = 0;
  1710. break;
  1711. }
  1712. if (i == 15) {
  1713. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  1714. i = 16; /* 57600 bps */
  1715. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  1716. i = 17; /* 115200 bps */
  1717. #ifdef ASYNC_SPD_SHI
  1718. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  1719. i = 18;
  1720. #endif
  1721. #ifdef ASYNC_SPD_WARP
  1722. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  1723. i = 19;
  1724. #endif
  1725. }
  1726. if (mxvar_baud_table[i] == 134) {
  1727. quot = (2 * info->baud_base / 269);
  1728. } else if (mxvar_baud_table[i]) {
  1729. quot = info->baud_base / mxvar_baud_table[i];
  1730. if (!quot && old_termios) {
  1731. /* re-calculate */
  1732. info->tty->termios->c_cflag &= ~CBAUD;
  1733. info->tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
  1734. switch (info->tty->termios->c_cflag & (CBAUD | CBAUDEX)) {
  1735. case B921600:
  1736. i = 20;
  1737. break;
  1738. case B460800:
  1739. i = 19;
  1740. break;
  1741. case B230400:
  1742. i = 18;
  1743. break;
  1744. case B115200:
  1745. i = 17;
  1746. break;
  1747. case B57600:
  1748. i = 16;
  1749. break;
  1750. case B38400:
  1751. i = 15;
  1752. break;
  1753. case B19200:
  1754. i = 14;
  1755. break;
  1756. case B9600:
  1757. i = 13;
  1758. break;
  1759. case B4800:
  1760. i = 12;
  1761. break;
  1762. case B2400:
  1763. i = 11;
  1764. break;
  1765. case B1800:
  1766. i = 10;
  1767. break;
  1768. case B1200:
  1769. i = 9;
  1770. break;
  1771. case B600:
  1772. i = 8;
  1773. break;
  1774. case B300:
  1775. i = 7;
  1776. break;
  1777. case B200:
  1778. i = 6;
  1779. break;
  1780. case B150:
  1781. i = 5;
  1782. break;
  1783. case B134:
  1784. i = 4;
  1785. break;
  1786. case B110:
  1787. i = 3;
  1788. break;
  1789. case B75:
  1790. i = 2;
  1791. break;
  1792. case B50:
  1793. i = 1;
  1794. break;
  1795. default:
  1796. i = 0;
  1797. break;
  1798. }
  1799. if (i == 15) {
  1800. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  1801. i = 16; /* 57600 bps */
  1802. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  1803. i = 17; /* 115200 bps */
  1804. #ifdef ASYNC_SPD_SHI
  1805. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  1806. i = 18;
  1807. #endif
  1808. #ifdef ASYNC_SPD_WARP
  1809. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  1810. i = 19;
  1811. #endif
  1812. }
  1813. if (mxvar_baud_table[i] == 134) {
  1814. quot = (2 * info->baud_base / 269);
  1815. } else if (mxvar_baud_table[i]) {
  1816. quot = info->baud_base / mxvar_baud_table[i];
  1817. if (quot == 0)
  1818. quot = 1;
  1819. } else {
  1820. quot = 0;
  1821. }
  1822. } else if (quot == 0)
  1823. quot = 1;
  1824. } else {
  1825. quot = 0;
  1826. }
  1827. if (quot) {
  1828. info->MCR |= UART_MCR_DTR;
  1829. save_flags(flags);
  1830. cli();
  1831. outb(info->MCR, info->base + UART_MCR);
  1832. restore_flags(flags);
  1833. } else {
  1834. info->MCR &= ~UART_MCR_DTR;
  1835. save_flags(flags);
  1836. cli();
  1837. outb(info->MCR, info->base + UART_MCR);
  1838. restore_flags(flags);
  1839. return ret;
  1840. }
  1841. /* byte size and parity */
  1842. switch (cflag & CSIZE) {
  1843. case CS5:
  1844. cval = 0x00;
  1845. break;
  1846. case CS6:
  1847. cval = 0x01;
  1848. break;
  1849. case CS7:
  1850. cval = 0x02;
  1851. break;
  1852. case CS8:
  1853. cval = 0x03;
  1854. break;
  1855. default:
  1856. cval = 0x00;
  1857. break; /* too keep GCC shut... */
  1858. }
  1859. if (cflag & CSTOPB)
  1860. cval |= 0x04;
  1861. if (cflag & PARENB)
  1862. cval |= UART_LCR_PARITY;
  1863. if (!(cflag & PARODD))
  1864. cval |= UART_LCR_EPAR;
  1865. if ((info->type == PORT_8250) || (info->type == PORT_16450)) {
  1866. fcr = 0;
  1867. } else {
  1868. fcr = UART_FCR_ENABLE_FIFO;
  1869. switch (info->rx_trigger) {
  1870. case 1:
  1871. fcr |= UART_FCR_TRIGGER_1;
  1872. break;
  1873. case 4:
  1874. fcr |= UART_FCR_TRIGGER_4;
  1875. break;
  1876. case 8:
  1877. fcr |= UART_FCR_TRIGGER_8;
  1878. break;
  1879. default:
  1880. fcr |= UART_FCR_TRIGGER_14;
  1881. }
  1882. }
  1883. /* CTS flow control flag and modem status interrupts */
  1884. info->IER &= ~UART_IER_MSI;
  1885. info->MCR &= ~UART_MCR_AFE;
  1886. if (cflag & CRTSCTS) {
  1887. info->flags |= ASYNC_CTS_FLOW;
  1888. info->IER |= UART_IER_MSI;
  1889. if (info->type == PORT_16550A)
  1890. info->MCR |= UART_MCR_AFE;
  1891. } else {
  1892. info->flags &= ~ASYNC_CTS_FLOW;
  1893. }
  1894. outb(info->MCR, info->base + UART_MCR);
  1895. if (cflag & CLOCAL)
  1896. info->flags &= ~ASYNC_CHECK_CD;
  1897. else {
  1898. info->flags |= ASYNC_CHECK_CD;
  1899. info->IER |= UART_IER_MSI;
  1900. }
  1901. outb(info->IER, info->base + UART_IER);
  1902. /*
  1903.  * Set up parity check flag
  1904.  */
  1905. info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
  1906. if (I_INPCK(info->tty))
  1907. info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
  1908. if (I_BRKINT(info->tty) || I_PARMRK(info->tty))
  1909. info->read_status_mask |= UART_LSR_BI;
  1910. info->ignore_status_mask = 0;
  1911. #if 0
  1912. /* This should be safe, but for some broken bits of hardware... */
  1913. if (I_IGNPAR(info->tty)) {
  1914. info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
  1915. info->read_status_mask |= UART_LSR_PE | UART_LSR_FE;
  1916. }
  1917. #endif
  1918. if (I_IGNBRK(info->tty)) {
  1919. info->ignore_status_mask |= UART_LSR_BI;
  1920. info->read_status_mask |= UART_LSR_BI;
  1921. /*
  1922.  * If we're ignore parity and break indicators, ignore
  1923.  * overruns too.  (For real raw support).
  1924.  */
  1925. if (I_IGNPAR(info->tty)) {
  1926. info->ignore_status_mask |= UART_LSR_OE | UART_LSR_PE | UART_LSR_FE;
  1927. info->read_status_mask |= UART_LSR_OE | UART_LSR_PE | UART_LSR_FE;
  1928. }
  1929. }
  1930. save_flags(flags);
  1931. cli();
  1932. outb(cval | UART_LCR_DLAB, info->base + UART_LCR); /* set DLAB */
  1933. outb(quot & 0xff, info->base + UART_DLL); /* LS of divisor */
  1934. outb(quot >> 8, info->base + UART_DLM); /* MS of divisor */
  1935. outb(cval, info->base + UART_LCR); /* reset DLAB */
  1936. outb(fcr, info->base + UART_FCR); /* set fcr */
  1937. restore_flags(flags);
  1938. return ret;
  1939. }
  1940. /*
  1941.  * ------------------------------------------------------------
  1942.  * friends of mxser_ioctl()
  1943.  * ------------------------------------------------------------
  1944.  */
  1945. static int mxser_get_serial_info(struct mxser_struct *info,
  1946.  struct serial_struct *retinfo)
  1947. {
  1948. struct serial_struct tmp;
  1949. if (!retinfo)
  1950. return (-EFAULT);
  1951. memset(&tmp, 0, sizeof(tmp));
  1952. tmp.type = info->type;
  1953. tmp.line = info->port;
  1954. tmp.port = info->base;
  1955. tmp.irq = info->irq;
  1956. tmp.flags = info->flags;
  1957. tmp.baud_base = info->baud_base;
  1958. tmp.close_delay = info->close_delay;
  1959. tmp.closing_wait = info->closing_wait;
  1960. tmp.custom_divisor = info->custom_divisor;
  1961. tmp.hub6 = 0;
  1962. return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
  1963. }
  1964. static int mxser_set_serial_info(struct mxser_struct *info,
  1965.  struct serial_struct *new_info)
  1966. {
  1967. struct serial_struct new_serial;
  1968. unsigned int flags;
  1969. int retval = 0;
  1970. if (!new_info || !info->base)
  1971. return (-EFAULT);
  1972. if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
  1973. return -EFAULT;
  1974. if ((new_serial.irq != info->irq) ||
  1975.     (new_serial.port != info->base) ||
  1976.     (new_serial.type != info->type) ||
  1977.     (new_serial.custom_divisor != info->custom_divisor) ||
  1978.     (new_serial.baud_base != info->baud_base))
  1979. return (-EPERM);
  1980. flags = info->flags & ASYNC_SPD_MASK;
  1981. if (!suser()) {
  1982. if ((new_serial.baud_base != info->baud_base) ||
  1983.     (new_serial.close_delay != info->close_delay) ||
  1984.     ((new_serial.flags & ~ASYNC_USR_MASK) !=
  1985.      (info->flags & ~ASYNC_USR_MASK)))
  1986. return (-EPERM);
  1987. info->flags = ((info->flags & ~ASYNC_USR_MASK) |
  1988.        (new_serial.flags & ASYNC_USR_MASK));
  1989. } else {
  1990. /*
  1991.  * OK, past this point, all the error checking has been done.
  1992.  * At this point, we start making changes.....
  1993.  */
  1994. info->flags = ((info->flags & ~ASYNC_FLAGS) |
  1995.        (new_serial.flags & ASYNC_FLAGS));
  1996. info->close_delay = new_serial.close_delay * HZ / 100;
  1997. info->closing_wait = new_serial.closing_wait * HZ / 100;
  1998. }
  1999. if (info->flags & ASYNC_INITIALIZED) {
  2000. if (flags != (info->flags & ASYNC_SPD_MASK)) {
  2001. mxser_change_speed(info, 0);
  2002. }
  2003. } else
  2004. retval = mxser_startup(info);
  2005. return (retval);
  2006. }
  2007. /*
  2008.  * mxser_get_lsr_info - get line status register info
  2009.  *
  2010.  * Purpose: Let user call ioctl() to get info when the UART physically
  2011.  *          is emptied.  On bus types like RS485, the transmitter must
  2012.  *          release the bus after transmitting. This must be done when
  2013.  *          the transmit shift register is empty, not be done when the
  2014.  *          transmit holding register is empty.  This functionality
  2015.  *          allows an RS485 driver to be written in user space.
  2016.  */
  2017. static int mxser_get_lsr_info(struct mxser_struct *info, unsigned int *value)
  2018. {
  2019. unsigned char status;
  2020. unsigned int result;
  2021. unsigned long flags;
  2022. save_flags(flags);
  2023. cli();
  2024. status = inb(info->base + UART_LSR);
  2025. restore_flags(flags);
  2026. result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
  2027. return put_user(result, value);
  2028. }
  2029. /*
  2030.  * This routine sends a break character out the serial port.
  2031.  */
  2032. static void mxser_send_break(struct mxser_struct *info, int duration)
  2033. {
  2034. unsigned long flags;
  2035. if (!info->base)
  2036. return;
  2037. set_current_state(TASK_INTERRUPTIBLE);
  2038. save_flags(flags);
  2039. cli();
  2040. outb(inb(info->base + UART_LCR) | UART_LCR_SBC, info->base + UART_LCR);
  2041. schedule_timeout(duration);
  2042. outb(inb(info->base + UART_LCR) & ~UART_LCR_SBC, info->base + UART_LCR);
  2043. restore_flags(flags);
  2044. }
  2045. static int mxser_get_modem_info(struct mxser_struct *info,
  2046. unsigned int *value)
  2047. {
  2048. unsigned char control, status;
  2049. unsigned int result;
  2050. unsigned long flags;
  2051. control = info->MCR;
  2052. save_flags(flags);
  2053. cli();
  2054. status = inb(info->base + UART_MSR);
  2055. if (status & UART_MSR_ANY_DELTA)
  2056. mxser_check_modem_status(info, status);
  2057. restore_flags(flags);
  2058. result = ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) |
  2059.     ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) |
  2060.     ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) |
  2061.     ((status & UART_MSR_RI) ? TIOCM_RNG : 0) |
  2062.     ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) |
  2063.     ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
  2064. return put_user(result, value);
  2065. }
  2066. static int mxser_set_modem_info(struct mxser_struct *info, unsigned int cmd,
  2067. unsigned int *value)
  2068. {
  2069. unsigned int arg;
  2070. unsigned long flags;
  2071. if(get_user(arg, value))
  2072. return -EFAULT;
  2073. switch (cmd) {
  2074. case TIOCMBIS:
  2075. if (arg & TIOCM_RTS)
  2076. info->MCR |= UART_MCR_RTS;
  2077. if (arg & TIOCM_DTR)
  2078. info->MCR |= UART_MCR_DTR;
  2079. break;
  2080. case TIOCMBIC:
  2081. if (arg & TIOCM_RTS)
  2082. info->MCR &= ~UART_MCR_RTS;
  2083. if (arg & TIOCM_DTR)
  2084. info->MCR &= ~UART_MCR_DTR;
  2085. break;
  2086. case TIOCMSET:
  2087. info->MCR = ((info->MCR & ~(UART_MCR_RTS | UART_MCR_DTR)) |
  2088.      ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0) |
  2089.      ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0));
  2090. break;
  2091. default:
  2092. return (-EINVAL);
  2093. }
  2094. save_flags(flags);
  2095. cli();
  2096. outb(info->MCR, info->base + UART_MCR);
  2097. restore_flags(flags);
  2098. return (0);
  2099. }
  2100. static int mxser_read_register(int, unsigned short *);
  2101. static int mxser_program_mode(int);
  2102. static void mxser_normal_mode(int);
  2103. static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf)
  2104. {
  2105. int id, i, bits;
  2106. unsigned short regs[16], irq;
  2107. unsigned char scratch, scratch2;
  2108. id = mxser_read_register(cap, regs);
  2109. if (id == C168_ASIC_ID)
  2110. hwconf->board_type = MXSER_BOARD_C168_ISA;
  2111. else if (id == C104_ASIC_ID)
  2112. hwconf->board_type = MXSER_BOARD_C104_ISA;
  2113. else if (id == C102_ASIC_ID)
  2114. hwconf->board_type = MXSER_BOARD_C102_ISA;
  2115. else if (id == CI132_ASIC_ID)
  2116. hwconf->board_type = MXSER_BOARD_CI132;
  2117. else if (id == CI134_ASIC_ID)
  2118. hwconf->board_type = MXSER_BOARD_CI134;
  2119. else if (id == CI104J_ASIC_ID)
  2120. hwconf->board_type = MXSER_BOARD_CI104J;
  2121. else
  2122. return (0);
  2123. irq = regs[9] & 0x0F;
  2124. irq = irq | (irq << 4);
  2125. irq = irq | (irq << 8);
  2126. if ((irq != regs[9]) || ((id == 1) && (irq != regs[10]))) {
  2127. return (MXSER_ERR_IRQ_CONFLIT);
  2128. }
  2129. if (!irq) {
  2130. return (MXSER_ERR_IRQ);
  2131. }
  2132. for (i = 0; i < 8; i++)
  2133. hwconf->ioaddr[i] = (int) regs[i + 1] & 0xFFF8;
  2134. hwconf->irq = (int) (irq & 0x0F);
  2135. if ((regs[12] & 0x80) == 0) {
  2136. return (MXSER_ERR_VECTOR);
  2137. }
  2138. hwconf->vector = (int) regs[11]; /* interrupt vector */
  2139. if (id == 1)
  2140. hwconf->vector_mask = 0x00FF;
  2141. else
  2142. hwconf->vector_mask = 0x000F;
  2143. for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) {
  2144. if (regs[12] & bits)
  2145. hwconf->baud_base[i] = 921600;
  2146. else
  2147. hwconf->baud_base[i] = 115200;
  2148. }
  2149. scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB);
  2150. outb(scratch2 | UART_LCR_DLAB, cap + UART_LCR);
  2151. outb(0, cap + UART_EFR); /* EFR is the same as FCR */
  2152. outb(scratch2, cap + UART_LCR);
  2153. outb(UART_FCR_ENABLE_FIFO, cap + UART_FCR);
  2154. scratch = inb(cap + UART_IIR);
  2155. if (scratch & 0xC0)
  2156. hwconf->uart_type = PORT_16550A;
  2157. else
  2158. hwconf->uart_type = PORT_16450;
  2159. if (id == 1)
  2160. hwconf->ports = 8;
  2161. else
  2162. hwconf->ports = 4;
  2163. return (hwconf->ports);
  2164. }
  2165. #define CHIP_SK  0x01 /* Serial Data Clock  in Eprom */
  2166. #define CHIP_DO  0x02 /* Serial Data Output in Eprom */
  2167. #define CHIP_CS  0x04 /* Serial Chip Select in Eprom */
  2168. #define CHIP_DI  0x08 /* Serial Data Input  in Eprom */
  2169. #define EN_CCMD  0x000 /* Chip's command register     */
  2170. #define EN0_RSARLO 0x008 /* Remote start address reg 0  */
  2171. #define EN0_RSARHI 0x009 /* Remote start address reg 1  */
  2172. #define EN0_RCNTLO 0x00A /* Remote byte count reg WR    */
  2173. #define EN0_RCNTHI 0x00B /* Remote byte count reg WR    */
  2174. #define EN0_DCFG 0x00E /* Data configuration reg WR   */
  2175. #define EN0_PORT 0x010 /* Rcv missed frame error counter RD */
  2176. #define ENC_PAGE0 0x000 /* Select page 0 of chip registers   */
  2177. #define ENC_PAGE3 0x0C0 /* Select page 3 of chip registers   */
  2178. static int mxser_read_register(int port, unsigned short *regs)
  2179. {
  2180. int i, k, value, id;
  2181. unsigned int j;
  2182. id = mxser_program_mode(port);
  2183. if (id < 0)
  2184. return (id);
  2185. for (i = 0; i < 14; i++) {
  2186. k = (i & 0x3F) | 0x180;
  2187. for (j = 0x100; j > 0; j >>= 1) {
  2188. outb(CHIP_CS, port);
  2189. if (k & j) {
  2190. outb(CHIP_CS | CHIP_DO, port);
  2191. outb(CHIP_CS | CHIP_DO | CHIP_SK, port); /* A? bit of read */
  2192. } else {
  2193. outb(CHIP_CS, port);
  2194. outb(CHIP_CS | CHIP_SK, port); /* A? bit of read */
  2195. }
  2196. }
  2197. (void) inb(port);
  2198. value = 0;
  2199. for (k = 0, j = 0x8000; k < 16; k++, j >>= 1) {
  2200. outb(CHIP_CS, port);
  2201. outb(CHIP_CS | CHIP_SK, port);
  2202. if (inb(port) & CHIP_DI)
  2203. value |= j;
  2204. }
  2205. regs[i] = value;
  2206. outb(0, port);
  2207. }
  2208. mxser_normal_mode(port);
  2209. return (id);
  2210. }
  2211. static int mxser_program_mode(int port)
  2212. {
  2213. int id, i, j, n;
  2214. unsigned long flags;
  2215. save_flags(flags);
  2216. cli();
  2217. outb(0, port);
  2218. outb(0, port);
  2219. outb(0, port);
  2220. (void) inb(port);
  2221. (void) inb(port);
  2222. outb(0, port);
  2223. (void) inb(port);
  2224. restore_flags(flags);
  2225. id = inb(port + 1) & 0x1F;
  2226. if ((id != C168_ASIC_ID) && (id != C104_ASIC_ID) && (id != CI104J_ASIC_ID) &&
  2227. (id != C102_ASIC_ID) && (id != CI132_ASIC_ID) && (id != CI134_ASIC_ID))
  2228. return (-1);
  2229. for (i = 0, j = 0; i < 4; i++) {
  2230. n = inb(port + 2);
  2231. if (n == 'M') {
  2232. j = 1;
  2233. } else if ((j == 1) && (n == 1)) {
  2234. j = 2;
  2235. break;
  2236. } else
  2237. j = 0;
  2238. }
  2239. if (j != 2)
  2240. id = -2;
  2241. return (id);
  2242. }
  2243. static void mxser_normal_mode(int port)
  2244. {
  2245. int i, n;
  2246. outb(0xA5, port + 1);
  2247. outb(0x80, port + 3);
  2248. outb(12, port + 0); /* 9600 bps */
  2249. outb(0, port + 1);
  2250. outb(0x03, port + 3); /* 8 data bits */
  2251. outb(0x13, port + 4); /* loop back mode */
  2252. for (i = 0; i < 16; i++) {
  2253. n = inb(port + 5);
  2254. if ((n & 0x61) == 0x60)
  2255. break;
  2256. if ((n & 1) == 1)
  2257. (void) inb(port);
  2258. }
  2259. outb(0x00, port + 4);
  2260. }