mxser.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:62k
源码类别:

嵌入式Linux

开发平台:

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