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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: su.c,v 1.54 2001/11/07 14:52:30 davem Exp $
  2.  * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI
  3.  *
  4.  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
  5.  * Copyright (C) 1998-1999  Pete Zaitcev   (zaitcev@yahoo.com)
  6.  *
  7.  * This is mainly a variation of drivers/char/serial.c,
  8.  * credits go to authors mentioned therein.
  9.  *
  10.  * Fixed to use tty_get_baud_rate().
  11.  *   Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12
  12.  */
  13. /*
  14.  * Configuration section.
  15.  */
  16. #undef SERIAL_PARANOIA_CHECK
  17. #define CONFIG_SERIAL_NOPAUSE_IO /* Unused on sparc */
  18. #define SERIAL_DO_RESTART
  19. /* Set of debugging defines */
  20. #undef SERIAL_DEBUG_INTR
  21. #undef SERIAL_DEBUG_OPEN
  22. #undef SERIAL_DEBUG_FLOW
  23. #undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  24. #undef SERIAL_DEBUG_THROTTLE
  25. #define RS_ISR_PASS_LIMIT 256
  26. /*
  27.  * 0x20 is sun4m thing, Dave Redman heritage.
  28.  * See arch/sparc/kernel/irq.c.
  29.  */
  30. #define IRQ_4M(n) ((n)|0x20)
  31. #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT)
  32. #define DBG_CNT(s)
  33. do {
  34. printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %sn",
  35.        kdevname(tty->device), (info->flags), serial_refcount,
  36.        info->count,tty->count,s);
  37. } while (0)
  38. #else
  39. #define DBG_CNT(s)
  40. #endif
  41. /*
  42.  * End of serial driver configuration section.
  43.  */
  44. #include <linux/config.h>
  45. #include <linux/module.h>
  46. #include <linux/errno.h>
  47. #include <linux/signal.h>
  48. #include <linux/sched.h>
  49. #include <linux/interrupt.h>
  50. #include <linux/tty.h>
  51. #include <linux/tty_flip.h>
  52. #include <linux/serial.h>
  53. #include <linux/serialP.h>
  54. #include <linux/serial_reg.h>
  55. #include <linux/string.h>
  56. #include <linux/fcntl.h>
  57. #include <linux/ptrace.h>
  58. #include <linux/ioport.h>
  59. #include <linux/mm.h>
  60. #include <linux/slab.h>
  61. #include <linux/init.h>
  62. #include <linux/bootmem.h>
  63. #include <linux/delay.h>
  64. #ifdef CONFIG_SERIAL_CONSOLE
  65. #include <linux/console.h>
  66. #include <linux/major.h>
  67. #endif
  68. #include <linux/sysrq.h>
  69. #include <asm/system.h>
  70. #include <asm/oplib.h>
  71. #include <asm/io.h>
  72. #include <asm/ebus.h>
  73. #ifdef CONFIG_SPARC64
  74. #include <asm/isa.h>
  75. #endif
  76. #include <asm/irq.h>
  77. #include <asm/uaccess.h>
  78. #include <asm/bitops.h>
  79. #include "sunserial.h"
  80. #include "sunkbd.h"
  81. #include "sunmouse.h"
  82. /* We are on a NS PC87303 clocked with 24.0 MHz, which results
  83.  * in a UART clock of 1.8462 MHz.
  84.  */
  85. #define BAUD_BASE (1846200 / 16)
  86. #ifdef CONFIG_SERIAL_CONSOLE
  87. extern int serial_console;
  88. static struct console sercons;
  89. int su_serial_console_init(void);
  90. #endif
  91. enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT };
  92. static char *su_typev[] = { "???", "mouse", "kbd", "serial" };
  93. #define SU_PROPSIZE 128
  94. /*
  95.  * serial.c saves memory when it allocates async_info upon first open.
  96.  * We have parts of state structure together because we do call startup
  97.  * for keyboard and mouse.
  98.  */
  99. struct su_struct {
  100. int  magic;
  101. unsigned long  port;
  102. int  baud_base;
  103. int  type; /* Hardware type: e.g. 16550 */
  104. int  irq;
  105. int  flags;
  106. int  line;
  107. int  cflag;
  108. enum su_type  port_type; /* Hookup type: e.g. mouse */
  109. int  is_console;
  110. int  port_node;
  111. char  name[16];
  112. int  xmit_fifo_size;
  113. int  custom_divisor;
  114. unsigned short  close_delay;
  115. unsigned short  closing_wait; /* time to wait before closing */
  116. struct tty_struct  *tty;
  117. int read_status_mask;
  118. int ignore_status_mask;
  119. int timeout;
  120. int quot;
  121. int x_char; /* xon/xoff character */
  122. int IER;  /* Interrupt Enable Register */
  123. int MCR;  /* Modem control register */
  124. unsigned long event;
  125. int blocked_open; /* # of blocked opens */
  126. long session; /* Session of opening process */
  127. long pgrp; /* pgrp of opening process */
  128. unsigned char  *xmit_buf;
  129. int xmit_head;
  130. int xmit_tail;
  131. int xmit_cnt;
  132. struct tq_struct tqueue;
  133. wait_queue_head_t open_wait;
  134. wait_queue_head_t close_wait;
  135. wait_queue_head_t delta_msr_wait;
  136. int count;
  137. struct async_icount icount;
  138. struct termios normal_termios, callout_termios;
  139. unsigned long last_active; /* For async_struct, to be */
  140. };
  141. /*
  142.  * Scan status structure.
  143.  * "prop" is a local variable but it eats stack to keep it in each
  144.  * stack frame of a recursive procedure.
  145.  */
  146. struct su_probe_scan {
  147. int msnode, kbnode; /* PROM nodes for mouse and keyboard */
  148. int msx, kbx; /* minors for mouse and keyboard */
  149. int devices; /* scan index */
  150. char prop[SU_PROPSIZE];
  151. };
  152. static char *serial_name = "PCIO serial driver";
  153. static char serial_version[16];
  154. static DECLARE_TASK_QUEUE(tq_serial);
  155. static struct tty_driver serial_driver, callout_driver;
  156. static int serial_refcount;
  157. /* number of characters left in xmit buffer before we ask for more */
  158. #define WAKEUP_CHARS 256
  159. static void autoconfig(struct su_struct *info);
  160. static void change_speed(struct su_struct *info, struct termios *old);
  161. static void su_wait_until_sent(struct tty_struct *tty, int timeout);
  162. /*
  163.  * Here we define the default xmit fifo size used for each type of
  164.  * UART
  165.  */
  166. static struct serial_uart_config uart_config[] = {
  167. { "unknown", 1, 0 }, 
  168. { "8250", 1, 0 }, 
  169. { "16450", 1, 0 }, 
  170. { "16550", 1, 0 }, 
  171. { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, 
  172. { "cirrus", 1, 0 }, 
  173. { "ST16650", 1, UART_CLEAR_FIFO |UART_STARTECH }, 
  174. { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO |
  175.   UART_STARTECH }, 
  176. { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO},
  177. { 0, 0}
  178. };
  179. #define NR_PORTS 4
  180. static struct su_struct su_table[NR_PORTS];
  181. static struct tty_struct *serial_table[NR_PORTS];
  182. static struct termios *serial_termios[NR_PORTS];
  183. static struct termios *serial_termios_locked[NR_PORTS];
  184. #ifndef MIN
  185. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  186. #endif
  187. /*
  188.  * tmp_buf is used as a temporary buffer by serial_write.  We need to
  189.  * lock it in case the copy_from_user blocks while swapping in a page,
  190.  * and some other program tries to do a serial write at the same time.
  191.  * Since the lock will only come under contention when the system is
  192.  * swapping and available memory is low, it makes sense to share one
  193.  * buffer across all the serial ports, since it significantly saves
  194.  * memory if large numbers of serial ports are open.
  195.  */
  196. static unsigned char *tmp_buf;
  197. static DECLARE_MUTEX(tmp_buf_sem);
  198. static inline int serial_paranoia_check(struct su_struct *info,
  199. kdev_t device, const char *routine)
  200. {
  201. #ifdef SERIAL_PARANOIA_CHECK
  202. static const char *badmagic = KERN_WARNING
  203. "Warning: bad magic number for serial struct (%s) in %sn";
  204. static const char *badinfo = KERN_WARNING
  205. "Warning: null su_struct for (%s) in %sn";
  206. if (!info) {
  207. printk(badinfo, kdevname(device), routine);
  208. return 1;
  209. }
  210. if (info->magic != SERIAL_MAGIC) {
  211. printk(badmagic, kdevname(device), routine);
  212. return 1;
  213. }
  214. #endif
  215. return 0;
  216. }
  217. static inline
  218. unsigned int su_inb(struct su_struct *info, unsigned long offset)
  219. {
  220. return inb(info->port + offset);
  221. }
  222. static inline void
  223. su_outb(struct su_struct *info, unsigned long offset, int value)
  224. {
  225. #ifndef __sparc_v9__
  226. /*
  227.  * MrCoffee has weird schematics: IRQ4 & P10(?) pins of SuperIO are
  228.  * connected with a gate then go to SlavIO. When IRQ4 goes tristated
  229.  * gate outputs a logical one. Since we use level triggered interrupts
  230.  * we have lockup and watchdog reset. We cannot mask IRQ because
  231.  * keyboard shares IRQ with us (Word has it as Bob Smelik's design).
  232.  * This problem is similar to what Alpha people suffer, see serial.c.
  233.  */
  234. if (offset == UART_MCR) value |= UART_MCR_OUT2;
  235. #endif
  236. outb(value, info->port + offset);
  237. }
  238. #define serial_in(info, off) su_inb(info, off)
  239. #define serial_inp(info, off) su_inb(info, off)
  240. #define serial_out(info, off, val) su_outb(info, off, val)
  241. #define serial_outp(info, off, val) su_outb(info, off, val)
  242. /*
  243.  * ------------------------------------------------------------
  244.  * su_stop() and su_start()
  245.  *
  246.  * This routines are called before setting or resetting tty->stopped.
  247.  * They enable or disable transmitter interrupts, as necessary.
  248.  * ------------------------------------------------------------
  249.  */
  250. static void su_stop(struct tty_struct *tty)
  251. {
  252. struct su_struct *info = (struct su_struct *)tty->driver_data;
  253. unsigned long flags;
  254. if (serial_paranoia_check(info, tty->device, "su_stop"))
  255. return;
  256. save_flags(flags); cli();
  257. if (info->IER & UART_IER_THRI) {
  258. info->IER &= ~UART_IER_THRI;
  259. serial_out(info, UART_IER, info->IER);
  260. }
  261. restore_flags(flags);
  262. }
  263. static void su_start(struct tty_struct *tty)
  264. {
  265. struct su_struct *info = (struct su_struct *)tty->driver_data;
  266. unsigned long flags;
  267. if (serial_paranoia_check(info, tty->device, "su_start"))
  268. return;
  269. save_flags(flags); cli();
  270. if (info->xmit_cnt && info->xmit_buf && !(info->IER & UART_IER_THRI)) {
  271. info->IER |= UART_IER_THRI;
  272. serial_out(info, UART_IER, info->IER);
  273. }
  274. restore_flags(flags);
  275. }
  276. /*
  277.  * ----------------------------------------------------------------------
  278.  *
  279.  * Here starts the interrupt handling routines.  All of the following
  280.  * subroutines are declared as inline and are folded into
  281.  * su_interrupt().  They were separated out for readability's sake.
  282.  *
  283.  * Note: rs_interrupt() is a "fast" interrupt, which means that it
  284.  * runs with interrupts turned off.  People who may want to modify
  285.  * rs_interrupt() should try to keep the interrupt handler as fast as
  286.  * possible.  After you are done making modifications, it is not a bad
  287.  * idea to do:
  288.  * 
  289.  * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
  290.  *
  291.  * and look at the resulting assemble code in serial.s.
  292.  *
  293.  *  - Ted Ts'o (tytso@mit.edu), 7-Mar-93
  294.  * -----------------------------------------------------------------------
  295.  */
  296. /*
  297.  * This routine is used by the interrupt handler to schedule
  298.  * processing in the software interrupt portion of the driver.
  299.  */
  300. static void
  301. su_sched_event(struct su_struct *info, int event)
  302. {
  303. info->event |= 1 << event;
  304. queue_task(&info->tqueue, &tq_serial);
  305. mark_bh(SERIAL_BH);
  306. }
  307. static void
  308. receive_kbd_ms_chars(struct su_struct *info, struct pt_regs *regs, int is_brk)
  309. {
  310. unsigned char status = 0;
  311. unsigned char ch;
  312. do {
  313. ch = serial_inp(info, UART_RX);
  314. if (info->port_type == SU_PORT_KBD) {
  315. if (ch == SUNKBD_RESET) {
  316.                          l1a_state.kbd_id = 1;
  317.                          l1a_state.l1_down = 0;
  318.                  } else if (l1a_state.kbd_id) {
  319.                          l1a_state.kbd_id = 0;
  320.                  } else if (ch == SUNKBD_L1) {
  321.                          l1a_state.l1_down = 1;
  322.                  } else if (ch == (SUNKBD_L1|SUNKBD_UP)) {
  323.                          l1a_state.l1_down = 0;
  324.                  } else if (ch == SUNKBD_A && l1a_state.l1_down) {
  325.                          /* whee... */
  326.                          batten_down_hatches();
  327.                          /* Continue execution... */
  328.                          l1a_state.l1_down = 0;
  329.                          l1a_state.kbd_id = 0;
  330.                          return;
  331.                  }
  332.                  sunkbd_inchar(ch, regs);
  333. } else {
  334. sun_mouse_inbyte(ch, is_brk);
  335. }
  336. status = su_inb(info, UART_LSR);
  337. } while (status & UART_LSR_DR);
  338. }
  339. static void
  340. receive_serial_chars(struct su_struct *info, int *status, struct pt_regs *regs)
  341. {
  342. struct tty_struct *tty = info->tty;
  343. unsigned char ch;
  344. int ignored = 0, saw_console_brk = 0;
  345. struct async_icount *icount;
  346. icount = &info->icount;
  347. do {
  348. ch = serial_inp(info, UART_RX);
  349. if (info->is_console &&
  350.     (ch == 0 || (*status &UART_LSR_BI)))
  351. saw_console_brk = 1;
  352. if (tty->flip.count >= TTY_FLIPBUF_SIZE)
  353. break;
  354. *tty->flip.char_buf_ptr = ch;
  355. icount->rx++;
  356. #ifdef SERIAL_DEBUG_INTR
  357. printk("D%02x:%02x.", ch, *status);
  358. #endif
  359. *tty->flip.flag_buf_ptr = 0;
  360. if (*status & (UART_LSR_BI | UART_LSR_PE |
  361.        UART_LSR_FE | UART_LSR_OE)) {
  362. /*
  363.  * For statistics only
  364.  */
  365. if (*status & UART_LSR_BI) {
  366. *status &= ~(UART_LSR_FE | UART_LSR_PE);
  367. icount->brk++;
  368. } else if (*status & UART_LSR_PE)
  369. icount->parity++;
  370. else if (*status & UART_LSR_FE)
  371. icount->frame++;
  372. if (*status & UART_LSR_OE)
  373. icount->overrun++;
  374. /*
  375.  * Now check to see if character should be
  376.  * ignored, and mask off conditions which
  377.  * should be ignored.
  378.  */
  379. if (*status & info->ignore_status_mask) {
  380. if (++ignored > 100) {
  381. #ifdef SERIAL_DEBUG_INTR
  382. printk("ign100..");
  383. #endif
  384. break;
  385. }
  386. goto ignore_char;
  387. }
  388. *status &= info->read_status_mask;
  389. if (*status & (UART_LSR_BI)) {
  390. #ifdef SERIAL_DEBUG_INTR
  391. printk("handling break....");
  392. #endif
  393. *tty->flip.flag_buf_ptr = TTY_BREAK;
  394. if (info->flags & ASYNC_SAK)
  395. do_SAK(tty);
  396. } else if (*status & UART_LSR_PE)
  397. *tty->flip.flag_buf_ptr = TTY_PARITY;
  398. else if (*status & UART_LSR_FE)
  399. *tty->flip.flag_buf_ptr = TTY_FRAME;
  400. if (*status & UART_LSR_OE) {
  401. /*
  402.  * Overrun is special, since it's
  403.  * reported immediately, and doesn't
  404.  * affect the current character
  405.  */
  406. if (tty->flip.count < TTY_FLIPBUF_SIZE) {
  407. tty->flip.count++;
  408. tty->flip.flag_buf_ptr++;
  409. tty->flip.char_buf_ptr++;
  410. *tty->flip.flag_buf_ptr = TTY_OVERRUN;
  411. }
  412. }
  413. }
  414. tty->flip.flag_buf_ptr++;
  415. tty->flip.char_buf_ptr++;
  416. tty->flip.count++;
  417. ignore_char:
  418. *status = serial_inp(info, UART_LSR);
  419. } while (*status & UART_LSR_DR);
  420. #ifdef SERIAL_DEBUG_INTR
  421. printk("E%02x.R%d", *status, tty->flip.count);
  422. #endif
  423. tty_flip_buffer_push(tty);
  424. if (saw_console_brk != 0)
  425. batten_down_hatches();
  426. }
  427. static void
  428. transmit_chars(struct su_struct *info, int *intr_done)
  429. {
  430. int count;
  431. if (info->x_char) {
  432. serial_outp(info, UART_TX, info->x_char);
  433. info->icount.tx++;
  434. info->x_char = 0;
  435. if (intr_done)
  436. *intr_done = 0;
  437. return;
  438. }
  439. if ((info->xmit_cnt <= 0) || info->tty->stopped ||
  440.     info->tty->hw_stopped) {
  441. info->IER &= ~UART_IER_THRI;
  442. serial_out(info, UART_IER, info->IER);
  443. return;
  444. }
  445. count = info->xmit_fifo_size;
  446. do {
  447. serial_out(info, UART_TX, info->xmit_buf[info->xmit_tail++]);
  448. info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
  449. info->icount.tx++;
  450. if (--info->xmit_cnt <= 0)
  451. break;
  452. } while (--count > 0);
  453. if (info->xmit_cnt < WAKEUP_CHARS)
  454. su_sched_event(info, RS_EVENT_WRITE_WAKEUP);
  455. #ifdef SERIAL_DEBUG_INTR
  456. printk("T%d...", info->xmit_cnt);
  457. #endif
  458. if (intr_done)
  459. *intr_done = 0;
  460. if (info->xmit_cnt <= 0) {
  461. info->IER &= ~UART_IER_THRI;
  462. serial_out(info, UART_IER, info->IER);
  463. }
  464. }
  465. static void
  466. check_modem_status(struct su_struct *info)
  467. {
  468. int status;
  469. struct async_icount *icount;
  470. status = serial_in(info, UART_MSR);
  471. if (status & UART_MSR_ANY_DELTA) {
  472. icount = &info->icount;
  473. /* update input line counters */
  474. if (status & UART_MSR_TERI)
  475. icount->rng++;
  476. if (status & UART_MSR_DDSR)
  477. icount->dsr++;
  478. if (status & UART_MSR_DDCD) {
  479. icount->dcd++;
  480. #ifdef CONFIG_HARD_PPS
  481. if ((info->flags & ASYNC_HARDPPS_CD) &&
  482.     (status & UART_MSR_DCD))
  483. hardpps();
  484. #endif
  485. }
  486. if (status & UART_MSR_DCTS)
  487. icount->cts++;
  488. wake_up_interruptible(&info->delta_msr_wait);
  489. }
  490. if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
  491. #if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
  492. printk("ttys%d CD now %s...", info->line,
  493.        (status & UART_MSR_DCD) ? "on" : "off");
  494. #endif
  495. if (status & UART_MSR_DCD)
  496. wake_up_interruptible(&info->open_wait);
  497. else if (!((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  498.    (info->flags & ASYNC_CALLOUT_NOHUP))) {
  499. #ifdef SERIAL_DEBUG_OPEN
  500. printk("doing serial hangup...");
  501. #endif
  502. if (info->tty)
  503. tty_hangup(info->tty);
  504. }
  505. }
  506. if (info->flags & ASYNC_CTS_FLOW) {
  507. if (info->tty->hw_stopped) {
  508. if (status & UART_MSR_CTS) {
  509. #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
  510. printk("CTS tx start...");
  511. #endif
  512. info->tty->hw_stopped = 0;
  513. info->IER |= UART_IER_THRI;
  514. serial_out(info, UART_IER, info->IER);
  515. su_sched_event(info, RS_EVENT_WRITE_WAKEUP);
  516. return;
  517. }
  518. } else {
  519. if (!(status & UART_MSR_CTS)) {
  520. #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
  521. printk("CTS tx stop...");
  522. #endif
  523. info->tty->hw_stopped = 1;
  524. info->IER &= ~UART_IER_THRI;
  525. serial_out(info, UART_IER, info->IER);
  526. }
  527. }
  528. }
  529. }
  530. /*
  531.  * This is the kbd/mouse serial driver's interrupt routine
  532.  */
  533. static void
  534. su_kbd_ms_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  535. {
  536. struct su_struct *info = (struct su_struct *)dev_id;
  537. unsigned char status;
  538. #ifdef SERIAL_DEBUG_INTR
  539. printk("su_kbd_ms_interrupt(%s)...", __irq_itoa(irq));
  540. #endif
  541. if (!info)
  542. return;
  543. if (serial_in(info, UART_IIR) & UART_IIR_NO_INT)
  544. return;
  545. status = serial_inp(info, UART_LSR);
  546. #ifdef SERIAL_DEBUG_INTR
  547. printk("status = %x...", status);
  548. #endif
  549. if ((status & UART_LSR_DR) || (status & UART_LSR_BI))
  550. receive_kbd_ms_chars(info, regs,
  551.      (status & UART_LSR_BI) != 0);
  552. #ifdef SERIAL_DEBUG_INTR
  553. printk("end.n");
  554. #endif
  555. }
  556. /*
  557.  * This is the serial driver's generic interrupt routine
  558.  */
  559. static void
  560. su_serial_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  561. {
  562. int status;
  563. struct su_struct *info;
  564. int pass_counter = 0;
  565. #ifdef SERIAL_DEBUG_INTR
  566. printk("su_serial_interrupt(%s)...", __irq_itoa(irq));
  567. #endif
  568. info = (struct su_struct *)dev_id;
  569. if (!info || !info->tty) {
  570. #ifdef SERIAL_DEBUG_INTR
  571. printk("strainn");
  572. #endif
  573. return;
  574. }
  575. do {
  576. status = serial_inp(info, UART_LSR);
  577. #ifdef SERIAL_DEBUG_INTR
  578. printk("status = %x...", status);
  579. #endif
  580. if (status & UART_LSR_DR)
  581. receive_serial_chars(info, &status, regs);
  582. check_modem_status(info);
  583. if (status & UART_LSR_THRE)
  584. transmit_chars(info, 0);
  585. if (pass_counter++ > RS_ISR_PASS_LIMIT) {
  586. #ifdef SERIAL_DEBUG_INTR
  587. printk("rs loop break");
  588. #endif
  589. break;  /* Prevent infinite loops */
  590. }
  591. } while (!(serial_in(info, UART_IIR) & UART_IIR_NO_INT));
  592. info->last_active = jiffies;
  593. #ifdef SERIAL_DEBUG_INTR
  594. printk("end.n");
  595. #endif
  596. }
  597. /*
  598.  * -------------------------------------------------------------------
  599.  * Here ends the serial interrupt routines.
  600.  * -------------------------------------------------------------------
  601.  */
  602. /*
  603.  * This routine is used to handle the "bottom half" processing for the
  604.  * serial driver, known also the "software interrupt" processing.
  605.  * This processing is done at the kernel interrupt level, after the
  606.  * su_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
  607.  * is where time-consuming activities which can not be done in the
  608.  * interrupt driver proper are done; the interrupt driver schedules
  609.  * them using su_sched_event(), and they get done here.
  610.  */
  611. static void do_serial_bh(void)
  612. {
  613. run_task_queue(&tq_serial);
  614. }
  615. static void do_softint(void *private_)
  616. {
  617. struct su_struct *info = (struct su_struct *) private_;
  618. struct tty_struct *tty;
  619. tty = info->tty;
  620. if (!tty)
  621. return;
  622. if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
  623. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  624.     tty->ldisc.write_wakeup)
  625. (tty->ldisc.write_wakeup)(tty);
  626. wake_up_interruptible(&tty->write_wait);
  627. }
  628. }
  629. /*
  630.  * ---------------------------------------------------------------
  631.  * Low level utility subroutines for the serial driver:  routines to
  632.  * figure out the appropriate timeout for an interrupt chain, routines
  633.  * to initialize and startup a serial port, and routines to shutdown a
  634.  * serial port.  Useful stuff like that.
  635.  * ---------------------------------------------------------------
  636.  */
  637. static int
  638. startup(struct su_struct *info)
  639. {
  640. unsigned long flags;
  641. int retval=0;
  642. unsigned long page;
  643. save_flags(flags);
  644. if (info->tty) {
  645. page = get_free_page(GFP_KERNEL);
  646. if (!page)
  647. return -ENOMEM;
  648. cli();
  649. if (info->flags & ASYNC_INITIALIZED) {
  650. free_page(page);
  651. goto errout;
  652. }
  653. if (info->port == 0 || info->type == PORT_UNKNOWN) {
  654. set_bit(TTY_IO_ERROR, &info->tty->flags);
  655. free_page(page);
  656. goto errout;
  657. }
  658. if (info->xmit_buf)
  659. free_page(page);
  660. else
  661. info->xmit_buf = (unsigned char *) page;
  662. }
  663. cli();
  664. #ifdef SERIAL_DEBUG_OPEN
  665. printk("starting up ttys%d (irq %s)...", info->line,
  666.        __irq_itoa(info->irq));
  667. #endif
  668. if (uart_config[info->type].flags & UART_STARTECH) {
  669. /* Wake up UART */
  670. serial_outp(info, UART_LCR, 0xBF);
  671. serial_outp(info, UART_EFR, UART_EFR_ECB);
  672. serial_outp(info, UART_IER, 0);
  673. serial_outp(info, UART_EFR, 0);
  674. serial_outp(info, UART_LCR, 0);
  675. }
  676. if (info->type == PORT_16750) {
  677. /* Wake up UART */
  678. serial_outp(info, UART_IER, 0);
  679. }
  680. /*
  681.  * Clear the FIFO buffers and disable them
  682.  * (they will be reenabled in change_speed())
  683.  */
  684. if (uart_config[info->type].flags & UART_CLEAR_FIFO)
  685. serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR |
  686.      UART_FCR_CLEAR_XMIT));
  687. /*
  688.  * At this point there's no way the LSR could still be 0xFF;
  689.  * if it is, then bail out, because there's likely no UART
  690.  * here.
  691.  */
  692. if (serial_inp(info, UART_LSR) == 0xff) {
  693. if (capable(CAP_SYS_ADMIN)) {
  694. if (info->tty)
  695. set_bit(TTY_IO_ERROR, &info->tty->flags);
  696. } else
  697. retval = -ENODEV;
  698. goto errout;
  699. }
  700. /*
  701.  * Allocate the IRQ if necessary
  702.  */
  703. if (info->port_type != SU_PORT_PORT) {
  704. retval = request_irq(info->irq, su_kbd_ms_interrupt,
  705.      SA_SHIRQ, info->name, info);
  706. } else {
  707. retval = request_irq(info->irq, su_serial_interrupt,
  708.      SA_SHIRQ, info->name, info);
  709. }
  710. if (retval) {
  711. if (capable(CAP_SYS_ADMIN)) {
  712. if (info->tty)
  713. set_bit(TTY_IO_ERROR, &info->tty->flags);
  714. retval = 0;
  715. }
  716. goto errout;
  717. }
  718. /*
  719.  * Clear the interrupt registers.
  720.  */
  721. (void) serial_inp(info, UART_RX);
  722. (void) serial_inp(info, UART_IIR);
  723. (void) serial_inp(info, UART_MSR);
  724. /*
  725.  * Now, initialize the UART 
  726.  */
  727. serial_outp(info, UART_LCR, UART_LCR_WLEN8); /* reset DLAB */
  728. info->MCR = 0;
  729. if (info->tty && info->tty->termios->c_cflag & CBAUD)
  730. info->MCR = UART_MCR_DTR | UART_MCR_RTS;
  731. if (info->irq != 0)
  732. info->MCR |= UART_MCR_OUT2;
  733. serial_outp(info, UART_MCR, info->MCR);
  734. /*
  735.  * Finally, enable interrupts
  736.  */
  737. info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
  738. serial_outp(info, UART_IER, info->IER); /* enable interrupts */
  739. /*
  740.  * And clear the interrupt registers again for luck.
  741.  */
  742. (void)serial_inp(info, UART_LSR);
  743. (void)serial_inp(info, UART_RX);
  744. (void)serial_inp(info, UART_IIR);
  745. (void)serial_inp(info, UART_MSR);
  746. if (info->tty)
  747. clear_bit(TTY_IO_ERROR, &info->tty->flags);
  748. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  749. /*
  750.  * Set up the tty->alt_speed kludge
  751.  */
  752. if (info->tty) {
  753. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  754. info->tty->alt_speed = 57600;
  755. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  756. info->tty->alt_speed = 115200;
  757. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  758. info->tty->alt_speed = 230400;
  759. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  760. info->tty->alt_speed = 460800;
  761. }
  762. /*
  763.  * and set the speed of the serial port
  764.  */
  765. change_speed(info, 0);
  766. info->flags |= ASYNC_INITIALIZED;
  767. restore_flags(flags);
  768. return 0;
  769. errout:
  770. restore_flags(flags);
  771. return retval;
  772. }
  773. /*
  774.  * This routine will shutdown a serial port; interrupts are disabled, and
  775.  * DTR is dropped if the hangup on close termio flag is on.
  776.  */
  777. static void
  778. shutdown(struct su_struct *info)
  779. {
  780. unsigned long flags;
  781. if (!(info->flags & ASYNC_INITIALIZED))
  782. return;
  783. save_flags(flags); cli(); /* Disable interrupts */
  784. /*
  785.  * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
  786.  * here so the queue might never be waken up
  787.  */
  788. wake_up_interruptible(&info->delta_msr_wait);
  789. /*
  790.  * Free the IRQ, if necessary
  791.  */
  792. free_irq(info->irq, info);
  793. if (info->xmit_buf) {
  794. free_page((unsigned long) info->xmit_buf);
  795. info->xmit_buf = 0;
  796. }
  797. info->IER = 0;
  798. serial_outp(info, UART_IER, 0x00); /* disable all intrs */
  799. info->MCR &= ~UART_MCR_OUT2;
  800. /* disable break condition */
  801. serial_out(info, UART_LCR, serial_inp(info, UART_LCR) & ~UART_LCR_SBC);
  802. if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
  803. info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
  804. serial_outp(info, UART_MCR, info->MCR);
  805. /* disable FIFO's */
  806. serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR |
  807.      UART_FCR_CLEAR_XMIT));
  808. (void)serial_in(info, UART_RX);    /* read data port to reset things */
  809. if (info->tty)
  810. set_bit(TTY_IO_ERROR, &info->tty->flags);
  811. if (uart_config[info->type].flags & UART_STARTECH) {
  812. /* Arrange to enter sleep mode */
  813. serial_outp(info, UART_LCR, 0xBF);
  814. serial_outp(info, UART_EFR, UART_EFR_ECB);
  815. serial_outp(info, UART_IER, UART_IERX_SLEEP);
  816. serial_outp(info, UART_LCR, 0);
  817. }
  818. if (info->type == PORT_16750) {
  819. /* Arrange to enter sleep mode */
  820. serial_outp(info, UART_IER, UART_IERX_SLEEP);
  821. }
  822. info->flags &= ~ASYNC_INITIALIZED;
  823. restore_flags(flags);
  824. }
  825. static int
  826. su_get_baud_rate(struct su_struct *info)
  827. {
  828. static struct tty_struct c_tty;
  829. static struct termios c_termios;
  830. if (info->tty)
  831. return tty_get_baud_rate(info->tty);
  832. memset(&c_tty, 0, sizeof(c_tty));
  833. memset(&c_termios, 0, sizeof(c_termios));
  834. c_tty.termios = &c_termios;
  835. c_termios.c_cflag = info->cflag;
  836. return tty_get_baud_rate(&c_tty);
  837. }
  838. /*
  839.  * This routine is called to set the UART divisor registers to match
  840.  * the specified baud rate for a serial port.
  841.  */
  842. static void
  843. change_speed(struct su_struct *info,
  844.      struct termios *old_termios)
  845. {
  846. int quot = 0, baud;
  847. unsigned int cval, fcr = 0;
  848. int bits;
  849. unsigned long flags;
  850. if (info->port_type == SU_PORT_PORT) {
  851. if (!info->tty || !info->tty->termios)
  852. return;
  853. if (!info->port)
  854. return;
  855. info->cflag = info->tty->termios->c_cflag;
  856. }
  857. /* byte size and parity */
  858. switch (info->cflag & CSIZE) {
  859.       case CS5: cval = 0x00; bits = 7; break;
  860.       case CS6: cval = 0x01; bits = 8; break;
  861.       case CS7: cval = 0x02; bits = 9; break;
  862.       case CS8: cval = 0x03; bits = 10; break;
  863. /* Never happens, but GCC is too dumb to figure it out */
  864.       default:  cval = 0x00; bits = 7; break;
  865. }
  866. if (info->cflag & CSTOPB) {
  867. cval |= 0x04;
  868. bits++;
  869. }
  870. if (info->cflag & PARENB) {
  871. cval |= UART_LCR_PARITY;
  872. bits++;
  873. }
  874. if (!(info->cflag & PARODD))
  875. cval |= UART_LCR_EPAR;
  876. #ifdef CMSPAR
  877. if (info->cflag & CMSPAR)
  878. cval |= UART_LCR_SPAR;
  879. #endif
  880. /* Determine divisor based on baud rate */
  881. baud = su_get_baud_rate(info);
  882. if (baud == 38400 &&
  883.     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
  884. quot = info->custom_divisor;
  885. else {
  886. if (baud == 134)
  887. /* Special case since 134 is really 134.5 */
  888. quot = (2 * info->baud_base / 269);
  889. else if (baud)
  890. quot = info->baud_base / baud;
  891. }
  892. /* If the quotient is zero refuse the change */
  893. if (!quot && old_termios) {
  894. info->tty->termios->c_cflag &= ~CBAUD;
  895. info->tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
  896. baud = tty_get_baud_rate(info->tty);
  897. if (!baud)
  898. baud = 9600;
  899. if (baud == 38400 &&
  900.     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
  901. quot = info->custom_divisor;
  902. else {
  903. if (baud == 134)
  904. /* Special case since 134 is really 134.5 */
  905. quot = (2*info->baud_base / 269);
  906. else if (baud)
  907. quot = info->baud_base / baud;
  908. }
  909. }
  910. /* As a last resort, if the quotient is zero, default to 9600 bps */
  911. if (!quot)
  912. quot = info->baud_base / 9600;
  913. info->timeout = ((info->xmit_fifo_size*HZ*bits*quot) / info->baud_base);
  914. info->timeout += HZ/50; /* Add .02 seconds of slop */
  915. /* Set up FIFO's */
  916. if (uart_config[info->type].flags & UART_USE_FIFO) {
  917. if ((info->baud_base / quot) < 9600)
  918. fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
  919. else
  920. fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
  921. }
  922. if (info->type == PORT_16750)
  923. fcr |= UART_FCR7_64BYTE;
  924. /* CTS flow control flag and modem status interrupts */
  925. info->IER &= ~UART_IER_MSI;
  926. if (info->flags & ASYNC_HARDPPS_CD)
  927. info->IER |= UART_IER_MSI;
  928. if (info->cflag & CRTSCTS) {
  929. info->flags |= ASYNC_CTS_FLOW;
  930. info->IER |= UART_IER_MSI;
  931. } else
  932. info->flags &= ~ASYNC_CTS_FLOW;
  933. if (info->cflag & CLOCAL)
  934. info->flags &= ~ASYNC_CHECK_CD;
  935. else {
  936. info->flags |= ASYNC_CHECK_CD;
  937. info->IER |= UART_IER_MSI;
  938. }
  939. serial_out(info, UART_IER, info->IER);
  940. /*
  941.  * Set up parity check flag
  942.  */
  943. if (info->tty) {
  944. #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
  945. info->read_status_mask = UART_LSR_OE | UART_LSR_THRE |
  946.  UART_LSR_DR;
  947. if (I_INPCK(info->tty))
  948. info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
  949. if (I_BRKINT(info->tty) || I_PARMRK(info->tty))
  950. info->read_status_mask |= UART_LSR_BI;
  951. /*
  952.  * Characters to ignore
  953.  */
  954. info->ignore_status_mask = 0;
  955. if (I_IGNPAR(info->tty))
  956. info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
  957. if (I_IGNBRK(info->tty)) {
  958. info->ignore_status_mask |= UART_LSR_BI;
  959. /*
  960.  * If we're ignore parity and break indicators, ignore 
  961.  * overruns too.  (For real raw support).
  962.  */
  963. if (I_IGNPAR(info->tty))
  964. info->ignore_status_mask |= UART_LSR_OE;
  965. }
  966. /*
  967.  * !!! ignore all characters if CREAD is not set
  968.  */
  969. if ((info->cflag & CREAD) == 0)
  970. info->ignore_status_mask |= UART_LSR_DR;
  971. }
  972. save_flags(flags); cli();
  973. if (uart_config[info->type].flags & UART_STARTECH) {
  974. serial_outp(info, UART_LCR, 0xBF);
  975. serial_outp(info, UART_EFR,
  976.     (info->cflag & CRTSCTS) ? UART_EFR_CTS : 0);
  977. }
  978. serial_outp(info, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
  979. serial_outp(info, UART_DLL, quot & 0xff); /* LS of divisor */
  980. serial_outp(info, UART_DLM, quot >> 8); /* MS of divisor */
  981. if (info->type == PORT_16750)
  982. serial_outp(info, UART_FCR, fcr);  /* set fcr */
  983. serial_outp(info, UART_LCR, cval); /* reset DLAB */
  984. if (info->type != PORT_16750)
  985. serial_outp(info, UART_FCR, fcr);  /* set fcr */
  986. restore_flags(flags);
  987. info->quot = quot;
  988. }
  989. static void
  990. su_put_char(struct tty_struct *tty, unsigned char ch)
  991. {
  992. struct su_struct *info = (struct su_struct *)tty->driver_data;
  993. unsigned long flags;
  994. if (serial_paranoia_check(info, tty->device, "su_put_char"))
  995. return;
  996. if (!tty || !info->xmit_buf)
  997. return;
  998. save_flags(flags); cli();
  999. if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
  1000. restore_flags(flags);
  1001. return;
  1002. }
  1003. info->xmit_buf[info->xmit_head++] = ch;
  1004. info->xmit_head &= SERIAL_XMIT_SIZE-1;
  1005. info->xmit_cnt++;
  1006. restore_flags(flags);
  1007. }
  1008. static void su_put_char_kbd(unsigned char c)
  1009. {
  1010. struct su_struct *info = su_table;
  1011. int lsr;
  1012. if (info->port_type != SU_PORT_KBD)
  1013. ++info;
  1014. if (info->port_type != SU_PORT_KBD)
  1015. return;
  1016. do {
  1017. lsr = serial_in(info, UART_LSR);
  1018. } while (!(lsr & UART_LSR_THRE));
  1019. /* Send the character out. */
  1020. su_outb(info, UART_TX, c);
  1021. }
  1022. static void
  1023. su_change_mouse_baud(int baud)
  1024. {
  1025. struct su_struct *info = su_table;
  1026. if (info->port_type != SU_PORT_MS)
  1027. ++info;
  1028. if (info->port_type != SU_PORT_MS)
  1029. return;
  1030. info->cflag &= ~CBAUD;
  1031. switch (baud) {
  1032. case 1200:
  1033. info->cflag |= B1200;
  1034. break;
  1035. case 2400:
  1036. info->cflag |= B2400;
  1037. break;
  1038. case 4800:
  1039. info->cflag |= B4800;
  1040. break;
  1041. case 9600:
  1042. info->cflag |= B9600;
  1043. break;
  1044. default:
  1045. printk("su_change_mouse_baud: unknown baud rate %d, "
  1046.        "defaulting to 1200n", baud);
  1047. info->cflag |= 1200;
  1048. break;
  1049. }
  1050. change_speed(info, 0);
  1051. }
  1052. static void
  1053. su_flush_chars(struct tty_struct *tty)
  1054. {
  1055. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1056. unsigned long flags;
  1057. if (serial_paranoia_check(info, tty->device, "su_flush_chars"))
  1058. return;
  1059. if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
  1060.     !info->xmit_buf)
  1061. return;
  1062. save_flags(flags); cli();
  1063. info->IER |= UART_IER_THRI;
  1064. serial_out(info, UART_IER, info->IER);
  1065. restore_flags(flags);
  1066. }
  1067. static int
  1068. su_write(struct tty_struct * tty, int from_user,
  1069.     const unsigned char *buf, int count)
  1070. {
  1071. int c, ret = 0;
  1072. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1073. unsigned long flags;
  1074. if (serial_paranoia_check(info, tty->device, "su_write"))
  1075. return 0;
  1076. if (!tty || !info->xmit_buf || !tmp_buf)
  1077. return 0;
  1078. save_flags(flags);
  1079. if (from_user) {
  1080. down(&tmp_buf_sem);
  1081. while (1) {
  1082. c = MIN(count,
  1083. MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  1084.     SERIAL_XMIT_SIZE - info->xmit_head));
  1085. if (c <= 0)
  1086. break;
  1087. c -= copy_from_user(tmp_buf, buf, c);
  1088. if (!c) {
  1089. if (!ret)
  1090. ret = -EFAULT;
  1091. break;
  1092. }
  1093. cli();
  1094. c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  1095.        SERIAL_XMIT_SIZE - info->xmit_head));
  1096. memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
  1097. info->xmit_head = ((info->xmit_head + c) &
  1098.    (SERIAL_XMIT_SIZE-1));
  1099. info->xmit_cnt += c;
  1100. restore_flags(flags);
  1101. buf += c;
  1102. count -= c;
  1103. ret += c;
  1104. }
  1105. up(&tmp_buf_sem);
  1106. } else {
  1107. while (1) {
  1108. cli();
  1109. c = MIN(count,
  1110. MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  1111.     SERIAL_XMIT_SIZE - info->xmit_head));
  1112. if (c <= 0) {
  1113. restore_flags(flags);
  1114. break;
  1115. }
  1116. memcpy(info->xmit_buf + info->xmit_head, buf, c);
  1117. info->xmit_head = ((info->xmit_head + c) &
  1118.    (SERIAL_XMIT_SIZE-1));
  1119. info->xmit_cnt += c;
  1120. restore_flags(flags);
  1121. buf += c;
  1122. count -= c;
  1123. ret += c;
  1124. }
  1125. }
  1126. if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped &&
  1127.     !(info->IER & UART_IER_THRI)) {
  1128. info->IER |= UART_IER_THRI;
  1129. serial_out(info, UART_IER, info->IER);
  1130. }
  1131. return ret;
  1132. }
  1133. static int
  1134. su_write_room(struct tty_struct *tty)
  1135. {
  1136. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1137. int ret;
  1138. if (serial_paranoia_check(info, tty->device, "su_write_room"))
  1139. return 0;
  1140. ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
  1141. if (ret < 0)
  1142. ret = 0;
  1143. return ret;
  1144. }
  1145. static int
  1146. su_chars_in_buffer(struct tty_struct *tty)
  1147. {
  1148. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1149. if (serial_paranoia_check(info, tty->device, "su_chars_in_buffer"))
  1150. return 0;
  1151. return info->xmit_cnt;
  1152. }
  1153. static void
  1154. su_flush_buffer(struct tty_struct *tty)
  1155. {
  1156. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1157. unsigned long flags;
  1158. if (serial_paranoia_check(info, tty->device, "su_flush_buffer"))
  1159. return;
  1160. save_flags(flags); cli();
  1161. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  1162. restore_flags(flags);
  1163. wake_up_interruptible(&tty->write_wait);
  1164. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1165.     tty->ldisc.write_wakeup)
  1166. (tty->ldisc.write_wakeup)(tty);
  1167. }
  1168. /*
  1169.  * This function is used to send a high-priority XON/XOFF character to
  1170.  * the device
  1171.  */
  1172. static void
  1173. su_send_xchar(struct tty_struct *tty, char ch)
  1174. {
  1175. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1176. if (serial_paranoia_check(info, tty->device, "su_send_char"))
  1177. return;
  1178. if (!(info->flags & ASYNC_INITIALIZED))
  1179. return;
  1180. info->x_char = ch;
  1181. if (ch) {
  1182. /* Make sure transmit interrupts are on */
  1183. info->IER |= UART_IER_THRI;
  1184. serial_out(info, UART_IER, info->IER);
  1185. }
  1186. }
  1187. /*
  1188.  * ------------------------------------------------------------
  1189.  * su_throttle()
  1190.  * 
  1191.  * This routine is called by the upper-layer tty layer to signal that
  1192.  * incoming characters should be throttled.
  1193.  * ------------------------------------------------------------
  1194.  */
  1195. static void
  1196. su_throttle(struct tty_struct * tty)
  1197. {
  1198. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1199. unsigned long flags;
  1200. #ifdef SERIAL_DEBUG_THROTTLE
  1201. char buf[64];
  1202. printk("throttle %s: %d....n", tty_name(tty, buf),
  1203.        tty->ldisc.chars_in_buffer(tty));
  1204. #endif
  1205. if (serial_paranoia_check(info, tty->device, "su_throttle"))
  1206. return;
  1207. if (I_IXOFF(tty))
  1208. su_send_xchar(tty, STOP_CHAR(tty));
  1209. if (tty->termios->c_cflag & CRTSCTS)
  1210. info->MCR &= ~UART_MCR_RTS;
  1211. save_flags(flags); cli();
  1212. serial_out(info, UART_MCR, info->MCR);
  1213. restore_flags(flags);
  1214. }
  1215. static void
  1216. su_unthrottle(struct tty_struct * tty)
  1217. {
  1218. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1219. unsigned long flags;
  1220. #ifdef SERIAL_DEBUG_THROTTLE
  1221. char buf[64];
  1222. printk("unthrottle %s: %d....n", tty_name(tty, buf),
  1223.        tty->ldisc.chars_in_buffer(tty));
  1224. #endif
  1225. if (serial_paranoia_check(info, tty->device, "su_unthrottle"))
  1226. return;
  1227. if (I_IXOFF(tty)) {
  1228. if (info->x_char)
  1229. info->x_char = 0;
  1230. else
  1231. su_send_xchar(tty, START_CHAR(tty));
  1232. }
  1233. if (tty->termios->c_cflag & CRTSCTS)
  1234. info->MCR |= UART_MCR_RTS;
  1235. save_flags(flags); cli();
  1236. serial_out(info, UART_MCR, info->MCR);
  1237. restore_flags(flags);
  1238. }
  1239. /*
  1240.  * ------------------------------------------------------------
  1241.  * su_ioctl() and friends
  1242.  * ------------------------------------------------------------
  1243.  */
  1244. /*
  1245.  * get_serial_info - handle TIOCGSERIAL ioctl()
  1246.  *
  1247.  * Purpose: Return standard serial struct information about
  1248.  *          a serial port handled by this driver.
  1249.  *
  1250.  * Added:   11-May-2001 Lars Kellogg-Stedman <lars@larsshack.org>
  1251.  */
  1252. static int get_serial_info(struct su_struct * info,
  1253.    struct serial_struct * retinfo)
  1254. {
  1255. struct serial_struct tmp;
  1256. if (!retinfo)
  1257. return -EFAULT;
  1258. memset(&tmp, 0, sizeof(tmp));
  1259. tmp.type = info->type;
  1260. tmp.line = info->line;
  1261. tmp.port = info->port;
  1262. tmp.irq = info->irq;
  1263. tmp.flags = info->flags;
  1264. tmp.xmit_fifo_size = info->xmit_fifo_size;
  1265. tmp.baud_base = info->baud_base;
  1266. tmp.close_delay = info->close_delay;
  1267. tmp.closing_wait = info->closing_wait;
  1268. tmp.custom_divisor = info->custom_divisor;
  1269. tmp.hub6 = 0;
  1270. if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
  1271. return -EFAULT;
  1272. return 0;
  1273. }
  1274. /*
  1275.  * get_lsr_info - get line status register info
  1276.  *
  1277.  * Purpose: Let user call ioctl() to get info when the UART physically
  1278.  *      is emptied.  On bus types like RS485, the transmitter must
  1279.  *      release the bus after transmitting. This must be done when
  1280.  *      the transmit shift register is empty, not be done when the
  1281.  *      transmit holding register is empty.  This functionality
  1282.  *      allows an RS485 driver to be written in user space. 
  1283.  */
  1284. static int
  1285. get_lsr_info(struct su_struct * info, unsigned int *value)
  1286. {
  1287. unsigned char status;
  1288. unsigned int result;
  1289. unsigned long flags;
  1290. save_flags(flags); cli();
  1291. status = serial_in(info, UART_LSR);
  1292. restore_flags(flags);
  1293. result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
  1294. return put_user(result,value);
  1295. }
  1296. static int
  1297. get_modem_info(struct su_struct * info, unsigned int *value)
  1298. {
  1299. unsigned char control, status;
  1300. unsigned int result;
  1301. unsigned long flags;
  1302. control = info->MCR;
  1303. save_flags(flags); cli();
  1304. status = serial_in(info, UART_MSR);
  1305. restore_flags(flags);
  1306. result =  ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
  1307. | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
  1308. #ifdef TIOCM_OUT1
  1309. | ((control & UART_MCR_OUT1) ? TIOCM_OUT1 : 0)
  1310. | ((control & UART_MCR_OUT2) ? TIOCM_OUT2 : 0)
  1311. #endif
  1312. | ((status  & UART_MSR_DCD) ? TIOCM_CAR : 0)
  1313. | ((status  & UART_MSR_RI) ? TIOCM_RNG : 0)
  1314. | ((status  & UART_MSR_DSR) ? TIOCM_DSR : 0)
  1315. | ((status  & UART_MSR_CTS) ? TIOCM_CTS : 0);
  1316. return put_user(result,value);
  1317. }
  1318. static int
  1319. set_modem_info(struct su_struct * info, unsigned int cmd, unsigned int *value)
  1320. {
  1321. unsigned int arg;
  1322. unsigned long flags;
  1323. if (get_user(arg, value))
  1324. return -EFAULT;
  1325. switch (cmd) {
  1326. case TIOCMBIS: 
  1327. if (arg & TIOCM_RTS)
  1328. info->MCR |= UART_MCR_RTS;
  1329. if (arg & TIOCM_DTR)
  1330. info->MCR |= UART_MCR_DTR;
  1331. #ifdef TIOCM_OUT1
  1332. if (arg & TIOCM_OUT1)
  1333. info->MCR |= UART_MCR_OUT1;
  1334. if (arg & TIOCM_OUT2)
  1335. info->MCR |= UART_MCR_OUT2;
  1336. #endif
  1337. break;
  1338. case TIOCMBIC:
  1339. if (arg & TIOCM_RTS)
  1340. info->MCR &= ~UART_MCR_RTS;
  1341. if (arg & TIOCM_DTR)
  1342. info->MCR &= ~UART_MCR_DTR;
  1343. #ifdef TIOCM_OUT1
  1344. if (arg & TIOCM_OUT1)
  1345. info->MCR &= ~UART_MCR_OUT1;
  1346. if (arg & TIOCM_OUT2)
  1347. info->MCR &= ~UART_MCR_OUT2;
  1348. #endif
  1349. break;
  1350. case TIOCMSET:
  1351. info->MCR = ((info->MCR & ~(UART_MCR_RTS |
  1352. #ifdef TIOCM_OUT1
  1353.     UART_MCR_OUT1 |
  1354.     UART_MCR_OUT2 |
  1355. #endif
  1356.     UART_MCR_DTR))
  1357.      | ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0)
  1358. #ifdef TIOCM_OUT1
  1359.      | ((arg & TIOCM_OUT1) ? UART_MCR_OUT1 : 0)
  1360.      | ((arg & TIOCM_OUT2) ? UART_MCR_OUT2 : 0)
  1361. #endif
  1362.      | ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0));
  1363. break;
  1364. default:
  1365. return -EINVAL;
  1366. }
  1367. save_flags(flags); cli();
  1368. serial_out(info, UART_MCR, info->MCR);
  1369. restore_flags(flags);
  1370. return 0;
  1371. }
  1372. /*
  1373.  * su_break() --- routine which turns the break handling on or off
  1374.  */
  1375. static void
  1376. su_break(struct tty_struct *tty, int break_state)
  1377. {
  1378. struct su_struct * info = (struct su_struct *)tty->driver_data;
  1379. unsigned long flags;
  1380. if (serial_paranoia_check(info, tty->device, "su_break"))
  1381. return;
  1382. if (!info->port)
  1383. return;
  1384. save_flags(flags); cli();
  1385. if (break_state == -1)
  1386. serial_out(info, UART_LCR,
  1387.    serial_inp(info, UART_LCR) | UART_LCR_SBC);
  1388. else
  1389. serial_out(info, UART_LCR,
  1390.    serial_inp(info, UART_LCR) & ~UART_LCR_SBC);
  1391. restore_flags(flags);
  1392. }
  1393. static int
  1394. su_ioctl(struct tty_struct *tty, struct file * file,
  1395.     unsigned int cmd, unsigned long arg)
  1396. {
  1397. struct su_struct * info = (struct su_struct *)tty->driver_data;
  1398. struct async_icount cprev, cnow; /* kernel counter temps */
  1399. struct serial_icounter_struct *p_cuser; /* user space */
  1400. if (serial_paranoia_check(info, tty->device, "su_ioctl"))
  1401. return -ENODEV;
  1402. if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
  1403.     (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) &&
  1404.     (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
  1405. if (tty->flags & (1 << TTY_IO_ERROR))
  1406.     return -EIO;
  1407. }
  1408. switch (cmd) {
  1409. case TIOCMGET:
  1410. return get_modem_info(info, (unsigned int *) arg);
  1411. case TIOCMBIS:
  1412. case TIOCMBIC:
  1413. case TIOCMSET:
  1414. return set_modem_info(info, cmd, (unsigned int *) arg);
  1415. case TIOCGSERIAL:
  1416. return get_serial_info(info, (struct serial_struct *)arg);
  1417. case TIOCSERGETLSR: /* Get line status register */
  1418. return get_lsr_info(info, (unsigned int *) arg);
  1419. #if 0
  1420. case TIOCSERGSTRUCT:
  1421. if (copy_to_user((struct async_struct *) arg,
  1422.  info, sizeof(struct async_struct)))
  1423. return -EFAULT;
  1424. return 0;
  1425. #endif
  1426. /*
  1427.  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
  1428.  * - mask passed in arg for lines of interest
  1429.    *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
  1430.  * Caller should use TIOCGICOUNT to see which one it was
  1431.  */
  1432. case TIOCMIWAIT:
  1433. cli();
  1434. /* note the counters on entry */
  1435. cprev = info->icount;
  1436. sti();
  1437. while (1) {
  1438. interruptible_sleep_on(&info->delta_msr_wait);
  1439. /* see if a signal did it */
  1440. if (signal_pending(current))
  1441. return -ERESTARTSYS;
  1442. cli();
  1443. cnow = info->icount; /* atomic copy */
  1444. sti();
  1445. if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
  1446.     cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
  1447. return -EIO; /* no change => error */
  1448. if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
  1449.      ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
  1450.      ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
  1451.      ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
  1452. return 0;
  1453. }
  1454. cprev = cnow;
  1455. }
  1456. /* NOTREACHED */
  1457. /* 
  1458.  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
  1459.  * Return: write counters to the user passed counter struct
  1460.  * NB: both 1->0 and 0->1 transitions are counted except for
  1461.  *     RI where only 0->1 is counted.
  1462.  */
  1463. case TIOCGICOUNT:
  1464. cli();
  1465. cnow = info->icount;
  1466. sti();
  1467. p_cuser = (struct serial_icounter_struct *) arg;
  1468. if (put_user(cnow.cts, &p_cuser->cts) ||
  1469.     put_user(cnow.dsr, &p_cuser->dsr) ||
  1470.     put_user(cnow.rng, &p_cuser->rng) ||
  1471.     put_user(cnow.dcd, &p_cuser->dcd))
  1472. return -EFAULT;
  1473. return 0;
  1474. default:
  1475. return -ENOIOCTLCMD;
  1476. }
  1477. /* return 0; */ /* Trigger warnings if fall through by a chance. */
  1478. }
  1479. static void
  1480. su_set_termios(struct tty_struct *tty, struct termios *old_termios)
  1481. {
  1482. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1483. unsigned long flags;
  1484. if (   (tty->termios->c_cflag == old_termios->c_cflag)
  1485.     && (   RELEVANT_IFLAG(tty->termios->c_iflag) 
  1486. == RELEVANT_IFLAG(old_termios->c_iflag)))
  1487.   return;
  1488. change_speed(info, old_termios);
  1489. /* Handle transition to B0 status */
  1490. if ((old_termios->c_cflag & CBAUD) &&
  1491.     !(tty->termios->c_cflag & CBAUD)) {
  1492. info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
  1493. save_flags(flags); cli();
  1494. serial_out(info, UART_MCR, info->MCR);
  1495. restore_flags(flags);
  1496. }
  1497. /* Handle transition away from B0 status */
  1498. if (!(old_termios->c_cflag & CBAUD) &&
  1499.     (tty->termios->c_cflag & CBAUD)) {
  1500. info->MCR |= UART_MCR_DTR;
  1501. if (!(tty->termios->c_cflag & CRTSCTS) || 
  1502.     !test_bit(TTY_THROTTLED, &tty->flags)) {
  1503. info->MCR |= UART_MCR_RTS;
  1504. }
  1505. save_flags(flags); cli();
  1506. serial_out(info, UART_MCR, info->MCR);
  1507. restore_flags(flags);
  1508. }
  1509. /* Handle turning off CRTSCTS */
  1510. if ((old_termios->c_cflag & CRTSCTS) &&
  1511.     !(tty->termios->c_cflag & CRTSCTS)) {
  1512. tty->hw_stopped = 0;
  1513. su_start(tty);
  1514. }
  1515. #if 0
  1516. /*
  1517.  * No need to wake up processes in open wait, since they
  1518.  * sample the CLOCAL flag once, and don't recheck it.
  1519.  * XXX  It's not clear whether the current behavior is correct
  1520.  * or not.  Hence, this may change.....
  1521.  */
  1522. if (!(old_termios->c_cflag & CLOCAL) &&
  1523.     (tty->termios->c_cflag & CLOCAL))
  1524. wake_up_interruptible(&info->open_wait);
  1525. #endif
  1526. }
  1527. /*
  1528.  * ------------------------------------------------------------
  1529.  * su_close()
  1530.  * 
  1531.  * This routine is called when the serial port gets closed.  First, we
  1532.  * wait for the last remaining data to be sent.  Then, we unlink its
  1533.  * async structure from the interrupt chain if necessary, and we free
  1534.  * that IRQ if nothing is left in the chain.
  1535.  * ------------------------------------------------------------
  1536.  */
  1537. static void
  1538. su_close(struct tty_struct *tty, struct file * filp)
  1539. {
  1540. struct su_struct *info = (struct su_struct *)tty->driver_data;
  1541. unsigned long flags;
  1542. if (!info || serial_paranoia_check(info, tty->device, "su_close"))
  1543. return;
  1544. save_flags(flags); cli();
  1545. if (tty_hung_up_p(filp)) {
  1546. DBG_CNT("before DEC-hung");
  1547. MOD_DEC_USE_COUNT;
  1548. restore_flags(flags);
  1549. return;
  1550. }
  1551. #ifdef SERIAL_DEBUG_OPEN
  1552. printk("su_close ttys%d, count = %dn", info->line, info->count);
  1553. #endif
  1554. if ((tty->count == 1) && (info->count != 1)) {
  1555. /*
  1556.  * Uh, oh.  tty->count is 1, which means that the tty
  1557.  * structure will be freed.  info->count should always
  1558.  * be one in these conditions.  If it's greater than
  1559.  * one, we've got real problems, since it means the
  1560.  * serial port won't be shutdown.
  1561.  */
  1562. printk("su_close: bad serial port count; tty->count is 1, "
  1563.        "info->count is %dn", info->count);
  1564. info->count = 1;
  1565. }
  1566. if (--info->count < 0) {
  1567. printk("su_close: bad serial port count for ttys%d: %dn",
  1568.        info->line, info->count);
  1569. info->count = 0;
  1570. }
  1571. if (info->count) {
  1572. DBG_CNT("before DEC-2");
  1573. MOD_DEC_USE_COUNT;
  1574. restore_flags(flags);
  1575. return;
  1576. }
  1577. info->flags |= ASYNC_CLOSING;
  1578. /*
  1579.  * Save the termios structure, since this port may have
  1580.  * separate termios for callout and dialin.
  1581.  */
  1582. if (info->flags & ASYNC_NORMAL_ACTIVE)
  1583. info->normal_termios = *tty->termios;
  1584. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  1585. info->callout_termios = *tty->termios;
  1586. /*
  1587.  * Now we wait for the transmit buffer to clear; and we notify 
  1588.  * the line discipline to only process XON/XOFF characters.
  1589.  */
  1590. tty->closing = 1;
  1591. if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
  1592. tty_wait_until_sent(tty, info->closing_wait);
  1593. /*
  1594.  * At this point we stop accepting input.  To do this, we
  1595.  * disable the receive line status interrupts, and tell the
  1596.  * interrupt driver to stop checking the data ready bit in the
  1597.  * line status register.
  1598.  */
  1599. info->IER &= ~UART_IER_RLSI;
  1600. info->read_status_mask &= ~UART_LSR_DR;
  1601. if (info->flags & ASYNC_INITIALIZED) {
  1602. serial_out(info, UART_IER, info->IER);
  1603. /*
  1604.  * Before we drop DTR, make sure the UART transmitter
  1605.  * has completely drained; this is especially
  1606.  * important if there is a transmit FIFO!
  1607.  */
  1608. su_wait_until_sent(tty, info->timeout);
  1609. }
  1610. shutdown(info);
  1611. if (tty->driver.flush_buffer)
  1612. tty->driver.flush_buffer(tty);
  1613. if (tty->ldisc.flush_buffer)
  1614. tty->ldisc.flush_buffer(tty);
  1615. tty->closing = 0;
  1616. info->event = 0;
  1617. info->tty = 0;
  1618. if (info->blocked_open) {
  1619. if (info->close_delay) {
  1620. current->state = TASK_INTERRUPTIBLE;
  1621. schedule_timeout(info->close_delay);
  1622. }
  1623. wake_up_interruptible(&info->open_wait);
  1624. }
  1625. info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|
  1626.  ASYNC_CLOSING);
  1627. wake_up_interruptible(&info->close_wait);
  1628. MOD_DEC_USE_COUNT;
  1629. restore_flags(flags);
  1630. }
  1631. /*
  1632.  * su_wait_until_sent() --- wait until the transmitter is empty
  1633.  */
  1634. static void
  1635. su_wait_until_sent(struct tty_struct *tty, int timeout)
  1636. {
  1637. struct su_struct * info = (struct su_struct *)tty->driver_data;
  1638. unsigned long orig_jiffies, char_time;
  1639. int lsr;
  1640. if (serial_paranoia_check(info, tty->device, "su_wait_until_sent"))
  1641. return;
  1642. if (info->type == PORT_UNKNOWN)
  1643. return;
  1644. if (info->xmit_fifo_size == 0)
  1645. return; /* Just in case ... */
  1646. orig_jiffies = jiffies;
  1647. /*
  1648.  * Set the check interval to be 1/5 of the estimated time to
  1649.  * send a single character, and make it at least 1.  The check
  1650.  * interval should also be less than the timeout.
  1651.  * 
  1652.  * Note: we have to use pretty tight timings here to satisfy
  1653.  * the NIST-PCTS.
  1654.  */
  1655. char_time = (info->timeout - HZ/50) / info->xmit_fifo_size;
  1656. char_time = char_time / 5;
  1657. if (char_time == 0)
  1658. char_time = 1;
  1659. if (timeout)
  1660.   char_time = MIN(char_time, timeout);
  1661. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1662. printk("In su_wait_until_sent(%d) check=%lu...", timeout, char_time);
  1663. printk("jiff=%lu...", jiffies);
  1664. #endif
  1665. while (!((lsr = serial_inp(info, UART_LSR)) & UART_LSR_TEMT)) {
  1666. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1667. printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
  1668. #endif
  1669. current->state = TASK_INTERRUPTIBLE;
  1670. schedule_timeout(char_time);
  1671. if (signal_pending(current))
  1672. break;
  1673. if (timeout && time_after(jiffies, orig_jiffies + timeout))
  1674. break;
  1675. }
  1676. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1677. printk("lsr = %d (jiff=%lu)...donen", lsr, jiffies);
  1678. #endif
  1679. }
  1680. /*
  1681.  * su_hangup() --- called by tty_hangup() when a hangup is signaled.
  1682.  */
  1683. static void
  1684. su_hangup(struct tty_struct *tty)
  1685. {
  1686. struct su_struct * info = (struct su_struct *)tty->driver_data;
  1687. if (serial_paranoia_check(info, tty->device, "su_hangup"))
  1688. return;
  1689. su_flush_buffer(tty);
  1690. shutdown(info);
  1691. info->event = 0;
  1692. info->count = 0;
  1693. info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE);
  1694. info->tty = 0;
  1695. wake_up_interruptible(&info->open_wait);
  1696. }
  1697. /*
  1698.  * ------------------------------------------------------------
  1699.  * su_open() and friends
  1700.  * ------------------------------------------------------------
  1701.  */
  1702. static int
  1703. block_til_ready(struct tty_struct *tty, struct file * filp,
  1704. struct su_struct *info)
  1705. {
  1706. DECLARE_WAITQUEUE(wait, current);
  1707. int   retval;
  1708. int   do_clocal = 0, extra_count = 0;
  1709. unsigned long   flags;
  1710. /*
  1711.  * If the device is in the middle of being closed, then block
  1712.  * until it's done, and then try again.
  1713.  */
  1714. if (tty_hung_up_p(filp) ||
  1715.     (info->flags & ASYNC_CLOSING)) {
  1716. if (info->flags & ASYNC_CLOSING)
  1717. interruptible_sleep_on(&info->close_wait);
  1718. #ifdef SERIAL_DO_RESTART
  1719. return ((info->flags & ASYNC_HUP_NOTIFY) ?
  1720. -EAGAIN : -ERESTARTSYS);
  1721. #else
  1722. return -EAGAIN;
  1723. #endif
  1724. }
  1725. /*
  1726.  * If this is a callout device, then just make sure the normal
  1727.  * device isn't being used.
  1728.  */
  1729. if (tty->driver.subtype == SERIAL_TYPE_CALLOUT) {
  1730. if (info->flags & ASYNC_NORMAL_ACTIVE)
  1731. return -EBUSY;
  1732. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1733.     (info->flags & ASYNC_SESSION_LOCKOUT) &&
  1734.     (info->session != current->session))
  1735.     return -EBUSY;
  1736. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1737.     (info->flags & ASYNC_PGRP_LOCKOUT) &&
  1738.     (info->pgrp != current->pgrp))
  1739.     return -EBUSY;
  1740. info->flags |= ASYNC_CALLOUT_ACTIVE;
  1741. return 0;
  1742. }
  1743. /*
  1744.  * If non-blocking mode is set, or the port is not enabled,
  1745.  * then make the check up front and then exit.
  1746.  */
  1747. if ((filp->f_flags & O_NONBLOCK) ||
  1748.     (tty->flags & (1 << TTY_IO_ERROR))) {
  1749. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  1750. return -EBUSY;
  1751. info->flags |= ASYNC_NORMAL_ACTIVE;
  1752. return 0;
  1753. }
  1754. if (info->flags & ASYNC_CALLOUT_ACTIVE) {
  1755. if (info->normal_termios.c_cflag & CLOCAL)
  1756. do_clocal = 1;
  1757. } else {
  1758. if (tty->termios->c_cflag & CLOCAL)
  1759. do_clocal = 1;
  1760. }
  1761. /*
  1762.  * Block waiting for the carrier detect and the line to become
  1763.  * free (i.e., not in use by the callout).  While we are in
  1764.  * this loop, info->count is dropped by one, so that
  1765.  * su_close() knows when to free things.  We restore it upon
  1766.  * exit, either normal or abnormal.
  1767.  */
  1768. retval = 0;
  1769. add_wait_queue(&info->open_wait, &wait);
  1770. #ifdef SERIAL_DEBUG_OPEN
  1771. printk("block_til_ready before block: ttys%d, count = %dn",
  1772.        info->line, info->count);
  1773. #endif
  1774. save_flags(flags); cli();
  1775. if (!tty_hung_up_p(filp)) {
  1776. extra_count = 1;
  1777. info->count--;
  1778. }
  1779. restore_flags(flags);
  1780. info->blocked_open++;
  1781. while (1) {
  1782. save_flags(flags); cli();
  1783. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1784.     (tty->termios->c_cflag & CBAUD))
  1785. serial_out(info, UART_MCR,
  1786.    serial_inp(info, UART_MCR) |
  1787.    (UART_MCR_DTR | UART_MCR_RTS));
  1788. restore_flags(flags);
  1789. set_current_state(TASK_INTERRUPTIBLE);
  1790. if (tty_hung_up_p(filp) ||
  1791.     !(info->flags & ASYNC_INITIALIZED)) {
  1792. #ifdef SERIAL_DO_RESTART
  1793. if (info->flags & ASYNC_HUP_NOTIFY)
  1794. retval = -EAGAIN;
  1795. else
  1796. retval = -ERESTARTSYS;
  1797. #else
  1798. retval = -EAGAIN;
  1799. #endif
  1800. break;
  1801. }
  1802. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1803.     !(info->flags & ASYNC_CLOSING) &&
  1804.     (do_clocal || (serial_in(info, UART_MSR) &
  1805.    UART_MSR_DCD)))
  1806. break;
  1807. if (signal_pending(current)) {
  1808. retval = -ERESTARTSYS;
  1809. break;
  1810. }
  1811. #ifdef SERIAL_DEBUG_OPEN
  1812. printk("block_til_ready blocking: ttys%d, count = %dn",
  1813.        info->line, info->count);
  1814. #endif
  1815. schedule();
  1816. }
  1817. current->state = TASK_RUNNING;
  1818. remove_wait_queue(&info->open_wait, &wait);
  1819. if (extra_count)
  1820. info->count++;
  1821. info->blocked_open--;
  1822. #ifdef SERIAL_DEBUG_OPEN
  1823. printk("block_til_ready after blocking: ttys%d, count = %dn",
  1824.        info->line, info->count);
  1825. #endif
  1826. if (retval)
  1827. return retval;
  1828. info->flags |= ASYNC_NORMAL_ACTIVE;
  1829. return 0;
  1830. }
  1831. /*
  1832.  * This routine is called whenever a serial port is opened.  It
  1833.  * enables interrupts for a serial port, linking in its async structure into
  1834.  * the IRQ chain.   It also performs the serial-specific
  1835.  * initialization for the tty structure.
  1836.  */
  1837. static int
  1838. su_open(struct tty_struct *tty, struct file * filp)
  1839. {
  1840. struct su_struct *info;
  1841. int  retval, line;
  1842. unsigned long page;
  1843. line = MINOR(tty->device) - tty->driver.minor_start;
  1844. if ((line < 0) || (line >= NR_PORTS))
  1845. return -ENODEV;
  1846. info = su_table + line;
  1847. info->count++;
  1848. tty->driver_data = info;
  1849. info->tty = tty;
  1850. if (serial_paranoia_check(info, tty->device, "su_open")) {
  1851. info->count--;
  1852. return -ENODEV;
  1853. }
  1854. #ifdef SERIAL_DEBUG_OPEN
  1855. printk("su_open %s%d, count = %dn", tty->driver.name, info->line,
  1856.        info->count);
  1857. #endif
  1858. info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
  1859. if (!tmp_buf) {
  1860. page = get_free_page(GFP_KERNEL);
  1861. if (!page)
  1862. return -ENOMEM;
  1863. if (tmp_buf)
  1864. free_page(page);
  1865. else
  1866. tmp_buf = (unsigned char *) page;
  1867. }
  1868. /*
  1869.  * If the port is the middle of closing, bail out now
  1870.  */
  1871. if (tty_hung_up_p(filp) ||
  1872.     (info->flags & ASYNC_CLOSING)) {
  1873. if (info->flags & ASYNC_CLOSING)
  1874. interruptible_sleep_on(&info->close_wait);
  1875. #ifdef SERIAL_DO_RESTART
  1876. return ((info->flags & ASYNC_HUP_NOTIFY) ?
  1877. -EAGAIN : -ERESTARTSYS);
  1878. #else
  1879. return -EAGAIN;
  1880. #endif
  1881. }
  1882. /*
  1883.  * Start up serial port
  1884.  */
  1885. retval = startup(info);
  1886. if (retval)
  1887. return retval;
  1888. MOD_INC_USE_COUNT;
  1889. retval = block_til_ready(tty, filp, info);
  1890. if (retval) {
  1891. #ifdef SERIAL_DEBUG_OPEN
  1892. printk("su_open returning after block_til_ready with %dn",
  1893.        retval);
  1894. #endif
  1895. return retval;
  1896. }
  1897. if ((info->count == 1) &&
  1898.     (info->flags & ASYNC_SPLIT_TERMIOS)) {
  1899. if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
  1900. *tty->termios = info->normal_termios;
  1901. else 
  1902. *tty->termios = info->callout_termios;
  1903. change_speed(info, 0);
  1904. }
  1905. #ifdef CONFIG_SERIAL_CONSOLE
  1906. if (sercons.cflag && sercons.index == line) {
  1907. tty->termios->c_cflag = sercons.cflag;
  1908. sercons.cflag = 0;
  1909. change_speed(info, 0);
  1910. }
  1911. #endif
  1912. info->session = current->session;
  1913. info->pgrp = current->pgrp;
  1914. #ifdef SERIAL_DEBUG_OPEN
  1915. printk("su_open ttys%d successful...", info->line);
  1916. #endif
  1917. return 0;
  1918. }
  1919. /*
  1920.  * /proc fs routines....
  1921.  */
  1922. static int
  1923. line_info(char *buf, struct su_struct *info)
  1924. {
  1925. char stat_buf[30], control, status;
  1926. int ret;
  1927. unsigned long flags;
  1928. if (info->port == 0 || info->type == PORT_UNKNOWN)
  1929. return 0;
  1930. ret = sprintf(buf, "%u: uart:%s port:%lX irq:%s",
  1931.       info->line, uart_config[info->type].name, 
  1932.       (unsigned long)info->port, __irq_itoa(info->irq));
  1933. /*
  1934.  * Figure out the current RS-232 lines
  1935.  */
  1936. save_flags(flags); cli();
  1937. status = serial_in(info, UART_MSR);
  1938. control = info ? info->MCR : serial_in(info, UART_MCR);
  1939. restore_flags(flags);
  1940. stat_buf[0] = 0;
  1941. stat_buf[1] = 0;
  1942. if (control & UART_MCR_RTS)
  1943. strcat(stat_buf, "|RTS");
  1944. if (status & UART_MSR_CTS)
  1945. strcat(stat_buf, "|CTS");
  1946. if (control & UART_MCR_DTR)
  1947. strcat(stat_buf, "|DTR");
  1948. if (status & UART_MSR_DSR)
  1949. strcat(stat_buf, "|DSR");
  1950. if (status & UART_MSR_DCD)
  1951. strcat(stat_buf, "|CD");
  1952. if (status & UART_MSR_RI)
  1953. strcat(stat_buf, "|RI");
  1954. if (info->quot) {
  1955. ret += sprintf(buf+ret, " baud:%u",
  1956.        info->baud_base / info->quot);
  1957. }
  1958. ret += sprintf(buf+ret, " tx:%u rx:%u",
  1959.        info->icount.tx, info->icount.rx);
  1960. if (info->icount.frame)
  1961. ret += sprintf(buf+ret, " fe:%u", info->icount.frame);
  1962. if (info->icount.parity)
  1963. ret += sprintf(buf+ret, " pe:%u", info->icount.parity);
  1964. if (info->icount.brk)
  1965. ret += sprintf(buf+ret, " brk:%u", info->icount.brk);
  1966. if (info->icount.overrun)
  1967. ret += sprintf(buf+ret, " oe:%u", info->icount.overrun);
  1968. /*
  1969.  * Last thing is the RS-232 status lines
  1970.  */
  1971. ret += sprintf(buf+ret, " %sn", stat_buf+1);
  1972. return ret;
  1973. }
  1974. int su_read_proc(char *page, char **start, off_t off, int count,
  1975.  int *eof, void *data)
  1976. {
  1977. int i, len = 0;
  1978. off_t begin = 0;
  1979. len += sprintf(page, "serinfo:1.0 driver:%sn", serial_version);
  1980. for (i = 0; i < NR_PORTS && len < 4000; i++) {
  1981. len += line_info(page + len, &su_table[i]);
  1982. if (len+begin > off+count)
  1983. goto done;
  1984. if (len+begin < off) {
  1985. begin += len;
  1986. len = 0;
  1987. }
  1988. }
  1989. *eof = 1;
  1990. done:
  1991. if (off >= len+begin)
  1992. return 0;
  1993. *start = page + (off-begin);
  1994. return ((count < begin+len-off) ? count : begin+len-off);
  1995. }
  1996. /*
  1997.  * ---------------------------------------------------------------------
  1998.  * su_XXX_init() and friends
  1999.  *
  2000.  * su_XXX_init() is called at boot-time to initialize the serial driver.
  2001.  * ---------------------------------------------------------------------
  2002.  */
  2003. /*
  2004.  * This routine prints out the appropriate serial driver version
  2005.  * number, and identifies which options were configured into this
  2006.  * driver.
  2007.  */
  2008. static __inline__ void __init show_su_version(void)
  2009. {
  2010. char *revision = "$Revision: 1.54 $";
  2011. char *version, *p;
  2012. version = strchr(revision, ' ');
  2013. strcpy(serial_version, ++version);
  2014. p = strchr(serial_version, ' ');
  2015. *p = '';
  2016.   printk(KERN_INFO "%s version %sn", serial_name, serial_version);
  2017. }
  2018. /*
  2019.  * This routine is called by su_{serial|kbd_ms}_init() to initialize a specific
  2020.  * serial port.  It determines what type of UART chip this serial port is
  2021.  * using: 8250, 16450, 16550, 16550A.  The important question is
  2022.  * whether or not this UART is a 16550A, since this will determine
  2023.  * whether or not we can use its FIFO features.
  2024.  */
  2025. static void
  2026. autoconfig(struct su_struct *info)
  2027. {
  2028. unsigned char status1, status2, scratch, scratch2;
  2029. struct linux_ebus_device *dev = 0;
  2030. struct linux_ebus *ebus;
  2031. #ifdef CONFIG_SPARC64
  2032. struct isa_bridge *isa_br;
  2033. struct isa_device *isa_dev;
  2034. #endif
  2035. #ifndef __sparc_v9__
  2036. struct linux_prom_registers reg0;
  2037. #endif
  2038. unsigned long flags;
  2039. if (!info->port_node || !info->port_type)
  2040. return;
  2041. /*
  2042.  * First we look for Ebus-bases su's
  2043.  */
  2044. for_each_ebus(ebus) {
  2045. for_each_ebusdev(dev, ebus) {
  2046. if (dev->prom_node == info->port_node) {
  2047. info->port = dev->resource[0].start;
  2048. info->irq = dev->irqs[0];
  2049. goto ebus_done;
  2050. }
  2051. }
  2052. }
  2053. #ifdef CONFIG_SPARC64
  2054. for_each_isa(isa_br) {
  2055. for_each_isadev(isa_dev, isa_br) {
  2056. if (isa_dev->prom_node == info->port_node) {
  2057. info->port = isa_dev->resource.start;
  2058. info->irq = isa_dev->irq;
  2059. goto ebus_done;
  2060. }
  2061. }
  2062. }
  2063. #endif
  2064. #ifdef __sparc_v9__
  2065. /*
  2066.  * Not on Ebus, bailing.
  2067.  */
  2068. return;
  2069. #else
  2070. /*
  2071.  * Not on Ebus, must be OBIO.
  2072.  */
  2073. if (prom_getproperty(info->port_node, "reg",
  2074.     (char *)&reg0, sizeof(reg0)) == -1) {
  2075. prom_printf("su: no "reg" propertyn");
  2076. return;
  2077. }
  2078. prom_apply_obio_ranges(&reg0, 1);
  2079. if (reg0.which_io != 0) { /* Just in case... */
  2080. prom_printf("su: bus number nonzero: 0x%x:%xn",
  2081.     reg0.which_io, reg0.phys_addr);
  2082. return;
  2083. }
  2084. if ((info->port = (unsigned long) ioremap(reg0.phys_addr,
  2085.     reg0.reg_size)) == 0) {
  2086. prom_printf("su: cannot mapn");
  2087. return;
  2088. }
  2089. /*
  2090.  * There is no intr property on MrCoffee, so hardwire it.
  2091.  */
  2092. info->irq = IRQ_4M(13);
  2093. #endif
  2094. ebus_done:
  2095. #ifdef SERIAL_DEBUG_OPEN
  2096. printk("Found 'su' at %016lx IRQ %sn", info->port,
  2097. __irq_itoa(info->irq));
  2098. #endif
  2099. info->magic = SERIAL_MAGIC;
  2100. save_flags(flags); cli();
  2101. /*
  2102.  * Do a simple existence test first; if we fail this, there's
  2103.  * no point trying anything else.
  2104.  *
  2105.  * 0x80 is used as a nonsense port to prevent against false
  2106.  * positives due to ISA bus float.  The assumption is that
  2107.  * 0x80 is a non-existent port; which should be safe since
  2108.  * include/asm/io.h also makes this assumption.
  2109.  */
  2110. scratch = serial_inp(info, UART_IER);
  2111. serial_outp(info, UART_IER, 0);
  2112. scratch2 = serial_inp(info, UART_IER);
  2113. serial_outp(info, UART_IER, scratch);
  2114. if (scratch2) {
  2115. restore_flags(flags);
  2116. return; /* We failed; there's nothing here */
  2117. }
  2118. scratch = serial_inp(info, UART_MCR);
  2119. serial_outp(info, UART_MCR, UART_MCR_LOOP | scratch);
  2120. serial_outp(info, UART_MCR, UART_MCR_LOOP | 0x0A);
  2121. status1 = serial_inp(info, UART_MSR) & 0xF0;
  2122. serial_outp(info, UART_MCR, scratch);
  2123. if (status1 != 0x90) {
  2124. /*
  2125.  * This code fragment used to fail, now it fixed itself.
  2126.  * We keep the printout for a case.
  2127.  */
  2128. printk("su: loopback returned status 0x%02xn", status1);
  2129. restore_flags(flags);
  2130. return;
  2131. scratch2 = serial_in(info, UART_LCR);
  2132. serial_outp(info, UART_LCR, 0xBF); /* set up for StarTech test */
  2133. serial_outp(info, UART_EFR, 0); /* EFR is the same as FCR */
  2134. serial_outp(info, UART_LCR, 0);
  2135. serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO);
  2136. scratch = serial_in(info, UART_IIR) >> 6;
  2137. switch (scratch) {
  2138. case 0:
  2139. info->type = PORT_16450;
  2140. break;
  2141. case 1:
  2142. info->type = PORT_UNKNOWN;
  2143. break;
  2144. case 2:
  2145. info->type = PORT_16550;
  2146. break;
  2147. case 3:
  2148. info->type = PORT_16550A;
  2149. break;
  2150. }
  2151. if (info->type == PORT_16550A) {
  2152. /* Check for Startech UART's */
  2153. serial_outp(info, UART_LCR, scratch2 | UART_LCR_DLAB);
  2154. if (serial_in(info, UART_EFR) == 0) {
  2155. info->type = PORT_16650;
  2156. } else {
  2157. serial_outp(info, UART_LCR, 0xBF);
  2158. if (serial_in(info, UART_EFR) == 0)
  2159. info->type = PORT_16650V2;
  2160. }
  2161. }
  2162. if (info->type == PORT_16550A) {
  2163. /* Check for TI 16750 */
  2164. serial_outp(info, UART_LCR, scratch2 | UART_LCR_DLAB);
  2165. serial_outp(info, UART_FCR,
  2166.     UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
  2167. scratch = serial_in(info, UART_IIR) >> 5;
  2168. if (scratch == 7) {
  2169. serial_outp(info, UART_LCR, 0);
  2170. serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO);
  2171. scratch = serial_in(info, UART_IIR) >> 5;
  2172. if (scratch == 6)
  2173. info->type = PORT_16750;
  2174. }
  2175. serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO);
  2176. }
  2177. serial_outp(info, UART_LCR, scratch2);
  2178. if (info->type == PORT_16450) {
  2179. scratch = serial_in(info, UART_SCR);
  2180. serial_outp(info, UART_SCR, 0xa5);
  2181. status1 = serial_in(info, UART_SCR);
  2182. serial_outp(info, UART_SCR, 0x5a);
  2183. status2 = serial_in(info, UART_SCR);
  2184. serial_outp(info, UART_SCR, scratch);
  2185. if ((status1 != 0xa5) || (status2 != 0x5a))
  2186. info->type = PORT_8250;
  2187. }
  2188. info->xmit_fifo_size = uart_config[info->type].dfl_xmit_fifo_size;
  2189. if (info->type == PORT_UNKNOWN) {
  2190. restore_flags(flags);
  2191. return;
  2192. }
  2193. sprintf(info->name, "su(%s)", su_typev[info->port_type]);
  2194. /*
  2195.  * Reset the UART.
  2196.  */
  2197. serial_outp(info, UART_MCR, 0x00);
  2198. serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR|UART_FCR_CLEAR_XMIT));
  2199. (void)serial_in(info, UART_RX);
  2200. serial_outp(info, UART_IER, 0x00);
  2201. restore_flags(flags);
  2202. }
  2203. /* This is used by the SAB driver to adjust where its minor
  2204.  * numbers start, we always are probed for first.
  2205.  */
  2206. int su_num_ports = 0;
  2207. EXPORT_SYMBOL(su_num_ports);
  2208. /*
  2209.  * The serial driver boot-time initialization code!
  2210.  */
  2211. int __init su_serial_init(void)
  2212. {
  2213. int i;
  2214. struct su_struct *info;
  2215. init_bh(SERIAL_BH, do_serial_bh);
  2216. show_su_version();
  2217. /* Initialize the tty_driver structure */
  2218. memset(&serial_driver, 0, sizeof(struct tty_driver));
  2219. serial_driver.magic = TTY_DRIVER_MAGIC;
  2220. serial_driver.driver_name = "su";
  2221. #ifdef CONFIG_DEVFS_FS
  2222. serial_driver.name = "tts/%d";
  2223. #else
  2224. serial_driver.name = "ttyS";
  2225. #endif
  2226. serial_driver.major = TTY_MAJOR;
  2227. serial_driver.minor_start = 64;
  2228. serial_driver.num = NR_PORTS;
  2229. serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
  2230. serial_driver.subtype = SERIAL_TYPE_NORMAL;
  2231. serial_driver.init_termios = tty_std_termios;
  2232. serial_driver.init_termios.c_cflag =
  2233. B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  2234. serial_driver.flags = TTY_DRIVER_REAL_RAW;
  2235. serial_driver.refcount = &serial_refcount;
  2236. serial_driver.table = serial_table;
  2237. serial_driver.termios = serial_termios;
  2238. serial_driver.termios_locked = serial_termios_locked;
  2239. serial_driver.open = su_open;
  2240. serial_driver.close = su_close;
  2241. serial_driver.write = su_write;
  2242. serial_driver.put_char = su_put_char;
  2243. serial_driver.flush_chars = su_flush_chars;
  2244. serial_driver.write_room = su_write_room;
  2245. serial_driver.chars_in_buffer = su_chars_in_buffer;
  2246. serial_driver.flush_buffer = su_flush_buffer;
  2247. serial_driver.ioctl = su_ioctl;
  2248. serial_driver.throttle = su_throttle;
  2249. serial_driver.unthrottle = su_unthrottle;
  2250. serial_driver.send_xchar = su_send_xchar;
  2251. serial_driver.set_termios = su_set_termios;
  2252. serial_driver.stop = su_stop;
  2253. serial_driver.start = su_start;
  2254. serial_driver.hangup = su_hangup;
  2255. serial_driver.break_ctl = su_break;
  2256. serial_driver.wait_until_sent = su_wait_until_sent;
  2257. serial_driver.read_proc = su_read_proc;
  2258. /*
  2259.  * The callout device is just like normal device except for
  2260.  * major number and the subtype code.
  2261.  */
  2262. callout_driver = serial_driver;
  2263. #ifdef CONFIG_DEVFS_FS
  2264. callout_driver.name = "cua/%d";
  2265. #else
  2266. callout_driver.name = "cua";
  2267. #endif
  2268. callout_driver.major = TTYAUX_MAJOR;
  2269. callout_driver.subtype = SERIAL_TYPE_CALLOUT;
  2270. callout_driver.read_proc = 0;
  2271. callout_driver.proc_entry = 0;
  2272. if (tty_register_driver(&serial_driver))
  2273. panic("Couldn't register regular sun");
  2274. if (tty_register_driver(&callout_driver))
  2275. panic("Couldn't register callout sun");
  2276. for (i = 0, info = su_table; i < NR_PORTS; i++, info++) {
  2277. info->line = i;
  2278. info->type = PORT_UNKNOWN;
  2279. info->baud_base = BAUD_BASE;
  2280. /* info->flags = 0; */
  2281. info->custom_divisor = 0;
  2282. info->close_delay = 5*HZ/10;
  2283. info->closing_wait = 30*HZ;
  2284. info->callout_termios = callout_driver.init_termios;
  2285. info->normal_termios = serial_driver.init_termios;
  2286. info->icount.cts = info->icount.dsr = 
  2287. info->icount.rng = info->icount.dcd = 0;
  2288. info->icount.rx = info->icount.tx = 0;
  2289. info->icount.frame = info->icount.parity = 0;
  2290. info->icount.overrun = info->icount.brk = 0;
  2291. info->tqueue.routine = do_softint;
  2292. info->tqueue.data = info;
  2293. info->cflag = serial_driver.init_termios.c_cflag;
  2294. init_waitqueue_head(&info->open_wait);
  2295. init_waitqueue_head(&info->close_wait);
  2296. init_waitqueue_head(&info->delta_msr_wait);
  2297. autoconfig(info);
  2298. if (info->type == PORT_UNKNOWN)
  2299. continue;
  2300. printk(KERN_INFO "%s at 0x%lx (tty %d irq %s) is a %sn",
  2301.        info->name, (long)info->port, i, __irq_itoa(info->irq),
  2302.        uart_config[info->type].name);
  2303. }
  2304. for (i = 0, info = su_table; i < NR_PORTS; i++, info++)
  2305. if (info->type == PORT_UNKNOWN)
  2306. break;
  2307. su_num_ports = i;
  2308. serial_driver.num = callout_driver.num = i;
  2309. return 0;
  2310. }
  2311. int __init su_kbd_ms_init(void)
  2312. {
  2313. int i;
  2314. struct su_struct *info;
  2315. show_su_version();
  2316. for (i = 0, info = su_table; i < 2; i++, info++) {
  2317. info->line = i;
  2318. info->type = PORT_UNKNOWN;
  2319. info->baud_base = BAUD_BASE;
  2320. if (info->port_type == SU_PORT_KBD)
  2321. info->cflag = B1200 | CS8 | CLOCAL | CREAD;
  2322. else
  2323. info->cflag = B4800 | CS8 | CLOCAL | CREAD;
  2324. init_waitqueue_head(&info->open_wait);
  2325. init_waitqueue_head(&info->close_wait);
  2326. init_waitqueue_head(&info->delta_msr_wait);
  2327. autoconfig(info);
  2328. if (info->type == PORT_UNKNOWN)
  2329. continue;
  2330. printk(KERN_INFO "%s at 0x%lx (irq = %s) is a %sn",
  2331.        info->name, info->port, __irq_itoa(info->irq),
  2332.        uart_config[info->type].name);
  2333. startup(info);
  2334. if (info->port_type == SU_PORT_KBD)
  2335. keyboard_zsinit(su_put_char_kbd);
  2336. else
  2337. sun_mouse_zsinit();
  2338. }
  2339. return 0;
  2340. }
  2341. static int su_node_ok(int node, char *name, int namelen)
  2342. {
  2343. if (strncmp(name, "su", namelen) == 0 ||
  2344.     strncmp(name, "su_pnp", namelen) == 0)
  2345. return 1;
  2346. if (strncmp(name, "serial", namelen) == 0) {
  2347. char compat[32];
  2348. int clen;
  2349. /* Is it _really_ a 'su' device? */
  2350. clen = prom_getproperty(node, "compatible", compat, sizeof(compat));
  2351. if (clen > 0) {
  2352. if (strncmp(compat, "sab82532", 8) == 0) {
  2353. /* Nope, Siemens serial, not for us. */
  2354. return 0;
  2355. }
  2356. }
  2357. return 1;
  2358. }
  2359. return 0;
  2360. }
  2361. /*
  2362.  * We got several platforms which present 'su' in different parts
  2363.  * of device tree. 'su' may be found under obio, ebus, isa and pci.
  2364.  * We walk over the tree and find them wherever PROM hides them.
  2365.  */
  2366. void __init su_probe_any(struct su_probe_scan *t, int sunode)
  2367. {
  2368. struct su_struct *info;
  2369. int len;
  2370. if (t->devices >= NR_PORTS) return;
  2371. for (; sunode != 0; sunode = prom_getsibling(sunode)) {
  2372. len = prom_getproperty(sunode, "name", t->prop, SU_PROPSIZE);
  2373. if (len <= 1) continue; /* Broken PROM node */
  2374. if (su_node_ok(sunode, t->prop, len)) {
  2375. info = &su_table[t->devices];
  2376. if (t->kbnode != 0 && sunode == t->kbnode) {
  2377. t->kbx = t->devices;
  2378. info->port_type = SU_PORT_KBD;
  2379. } else if (t->msnode != 0 && sunode == t->msnode) {
  2380. t->msx = t->devices;
  2381. info->port_type = SU_PORT_MS;
  2382. } else {
  2383. #ifdef __sparc_v9__
  2384. /*
  2385.  * Do not attempt to use the truncated
  2386.  * keyboard/mouse ports as serial ports
  2387.  * on Ultras with PC keyboard attached.
  2388.  */
  2389. if (prom_getbool(sunode, "mouse"))
  2390. continue;
  2391. if (prom_getbool(sunode, "keyboard"))
  2392. continue;
  2393. #endif
  2394. info->port_type = SU_PORT_PORT;
  2395. }
  2396. info->is_console = 0;
  2397. info->port_node = sunode;
  2398. ++t->devices;
  2399. } else {
  2400. su_probe_any(t, prom_getchild(sunode));
  2401. }
  2402. }
  2403. }
  2404. int __init su_probe(void)
  2405. {
  2406. int node;
  2407. int len;
  2408. struct su_probe_scan scan;
  2409. /*
  2410.  * First, we scan the tree.
  2411.  */
  2412. scan.devices = 0;
  2413. scan.msx = -1;
  2414. scan.kbx = -1;
  2415. scan.kbnode = 0;
  2416. scan.msnode = 0;
  2417. /*
  2418.  * Get the nodes for keyboard and mouse from 'aliases'...
  2419.  */
  2420.         node = prom_getchild(prom_root_node);
  2421. node = prom_searchsiblings(node, "aliases");
  2422. if (node != 0) {
  2423. len = prom_getproperty(node, "keyboard", scan.prop,SU_PROPSIZE);
  2424. if (len > 0) {
  2425. scan.prop[len] = 0;
  2426. scan.kbnode = prom_finddevice(scan.prop);
  2427. }
  2428. len = prom_getproperty(node, "mouse", scan.prop, SU_PROPSIZE);
  2429. if (len > 0) {
  2430. scan.prop[len] = 0;
  2431. scan.msnode = prom_finddevice(scan.prop);
  2432. }
  2433. }
  2434. su_probe_any(&scan, prom_getchild(prom_root_node));
  2435. /*
  2436.  * Second, we process the special case of keyboard and mouse.
  2437.  *
  2438.  * Currently if we got keyboard and mouse hooked to "su" ports
  2439.  * we do not use any possible remaining "su" as a serial port.
  2440.  * Thus, we ignore values of .msx and .kbx, then compact ports.
  2441.  * Those who want to address this issue need to merge
  2442.  * su_serial_init() and su_ms_kbd_init().
  2443.  */
  2444. if (scan.msx != -1 && scan.kbx != -1) {
  2445. su_table[0].port_type = SU_PORT_MS;
  2446. su_table[0].is_console = 0;
  2447. su_table[0].port_node = scan.msnode;
  2448. su_table[1].port_type = SU_PORT_KBD;
  2449. su_table[1].is_console = 0;
  2450. su_table[1].port_node = scan.kbnode;
  2451.          sunserial_setinitfunc(su_kbd_ms_init);
  2452.          rs_ops.rs_change_mouse_baud = su_change_mouse_baud;
  2453. sunkbd_setinitfunc(sun_kbd_init);
  2454. kbd_ops.compute_shiftstate = sun_compute_shiftstate;
  2455. kbd_ops.setledstate = sun_setledstate;
  2456. kbd_ops.getledstate = sun_getledstate;
  2457. kbd_ops.setkeycode = sun_setkeycode;
  2458. kbd_ops.getkeycode = sun_getkeycode;
  2459. #ifdef CONFIG_PCI
  2460. sunkbd_install_keymaps(sun_key_maps,
  2461.     sun_keymap_count, sun_func_buf, sun_func_table,
  2462.     sun_funcbufsize, sun_funcbufleft,
  2463.     sun_accent_table, sun_accent_table_size);
  2464. #endif
  2465. return 0;
  2466. }
  2467. if (scan.msx != -1 || scan.kbx != -1) {
  2468. printk("su_probe: cannot match keyboard and mouse, confusedn");
  2469. return -ENODEV;
  2470. }
  2471. if (scan.devices == 0)
  2472. return -ENODEV;
  2473. #ifdef CONFIG_SERIAL_CONSOLE
  2474. /*
  2475.  * Console must be initiated after the generic initialization.
  2476.  * sunserial_setinitfunc inverts order, so call this before next one.
  2477.  */
  2478. sunserial_setinitfunc(su_serial_console_init);
  2479. #endif
  2480.         sunserial_setinitfunc(su_serial_init);
  2481. return 0;
  2482. }
  2483. /*
  2484.  * ------------------------------------------------------------
  2485.  * Serial console driver
  2486.  * ------------------------------------------------------------
  2487.  */
  2488. #ifdef CONFIG_SERIAL_CONSOLE
  2489. #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
  2490. /*
  2491.  * Wait for transmitter & holding register to empty
  2492.  */
  2493. static __inline__ void
  2494. wait_for_xmitr(struct su_struct *info)
  2495. {
  2496. int lsr;
  2497. unsigned int tmout = 1000000;
  2498. do {
  2499. lsr = su_inb(info, UART_LSR);
  2500. if (--tmout == 0)
  2501. break;
  2502. } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY);
  2503. }
  2504. /*
  2505.  * Print a string to the serial port trying not to disturb
  2506.  * any possible real use of the port...
  2507.  */
  2508. static void
  2509. serial_console_write(struct console *co, const char *s,
  2510. unsigned count)
  2511. {
  2512. struct su_struct *info;
  2513. int ier;
  2514. unsigned i;
  2515. info = su_table + co->index;
  2516. /*
  2517.  * First save the IER then disable the interrupts
  2518.  */
  2519. ier = su_inb(info, UART_IER);
  2520. su_outb(info, UART_IER, 0x00);
  2521. /*
  2522.  * Now, do each character
  2523.  */
  2524. for (i = 0; i < count; i++, s++) {
  2525. wait_for_xmitr(info);
  2526. /*
  2527.  * Send the character out.
  2528.  * If a LF, also do CR...
  2529.  */
  2530. su_outb(info, UART_TX, *s);
  2531. if (*s == 10) {
  2532. wait_for_xmitr(info);
  2533. su_outb(info, UART_TX, 13);
  2534. }
  2535. }
  2536. /*
  2537.  * Finally, Wait for transmitter & holding register to empty
  2538.  *  and restore the IER
  2539.  */
  2540. wait_for_xmitr(info);
  2541. su_outb(info, UART_IER, ier);
  2542. }
  2543. /*
  2544.  * Receive character from the serial port
  2545.  */
  2546. static int
  2547. serial_console_wait_key(struct console *co)
  2548. {
  2549. struct su_struct *info;
  2550. int ier;
  2551. int lsr;
  2552. int c;
  2553. info = su_table + co->index;
  2554. /*
  2555.  * First save the IER then disable the interrupts so
  2556.  * that the real driver for the port does not get the
  2557.  * character.
  2558.  */
  2559. ier = su_inb(info, UART_IER);
  2560. su_outb(info, UART_IER, 0x00);
  2561. do {
  2562. lsr = su_inb(info, UART_LSR);
  2563. } while (!(lsr & UART_LSR_DR));
  2564. c = su_inb(info, UART_RX);
  2565. /*
  2566.  * Restore the interrupts
  2567.  */
  2568. su_outb(info, UART_IER, ier);
  2569. return c;
  2570. }
  2571. static kdev_t
  2572. serial_console_device(struct console *c)
  2573. {
  2574. return MKDEV(TTY_MAJOR, 64 + c->index);
  2575. }
  2576. /*
  2577.  * Setup initial baud/bits/parity. We do two things here:
  2578.  * - construct a cflag setting for the first su_open()
  2579.  * - initialize the serial port
  2580.  * Return non-zero if we didn't find a serial port.
  2581.  */
  2582. static int __init serial_console_setup(struct console *co, char *options)
  2583. {
  2584. struct su_struct *info;
  2585. unsigned cval;
  2586. int baud = 9600;
  2587. int bits = 8;
  2588. int parity = 'n';
  2589. int cflag = CREAD | HUPCL | CLOCAL;
  2590. int quot = 0;
  2591. char *s;
  2592. if (options) {
  2593. baud = simple_strtoul(options, NULL, 10);
  2594. s = options;
  2595. while (*s >= '0' && *s <= '9')
  2596. s++;
  2597. if (*s) parity = *s++;
  2598. if (*s) bits   = *s - '0';
  2599. }
  2600. /*
  2601.  * Now construct a cflag setting.
  2602.  */
  2603. switch (baud) {
  2604. case 1200:
  2605. cflag |= B1200;
  2606. break;
  2607. case 2400:
  2608. cflag |= B2400;
  2609. break;
  2610. case 4800:
  2611. cflag |= B4800;
  2612. break;
  2613. case 19200:
  2614. cflag |= B19200;
  2615. break;
  2616. case 38400:
  2617. cflag |= B38400;
  2618. break;
  2619. case 57600:
  2620. cflag |= B57600;
  2621. break;
  2622. case 115200:
  2623. cflag |= B115200;
  2624. break;
  2625. case 9600:
  2626. default:
  2627. cflag |= B9600;
  2628. baud = 9600;
  2629. break;
  2630. }
  2631. switch (bits) {
  2632. case 7:
  2633. cflag |= CS7;
  2634. break;
  2635. default:
  2636. case 8:
  2637. cflag |= CS8;
  2638. break;
  2639. }
  2640. switch (parity) {
  2641. case 'o': case 'O':
  2642. cflag |= PARODD;
  2643. break;
  2644. case 'e': case 'E':
  2645. cflag |= PARENB;
  2646. break;
  2647. }
  2648. co->cflag = cflag;
  2649. /*
  2650.  * Divisor, bytesize and parity
  2651.  */
  2652. info = su_table + co->index;
  2653. quot = BAUD_BASE / baud;
  2654. cval = cflag & (CSIZE | CSTOPB);
  2655. #if defined(__powerpc__) || defined(__alpha__)
  2656. cval >>= 8;
  2657. #else /* !__powerpc__ && !__alpha__ */
  2658. cval >>= 4;
  2659. #endif /* !__powerpc__ && !__alpha__ */
  2660. if (cflag & PARENB)
  2661. cval |= UART_LCR_PARITY;
  2662. if (!(cflag & PARODD))
  2663. cval |= UART_LCR_EPAR;
  2664. /*
  2665.  * Disable UART interrupts, set DTR and RTS high
  2666.  * and set speed.
  2667.  */
  2668. su_outb(info, UART_IER, 0);
  2669. su_outb(info, UART_MCR, UART_MCR_DTR | UART_MCR_RTS);
  2670. su_outb(info, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
  2671. su_outb(info, UART_DLL, quot & 0xff); /* LS of divisor */
  2672. su_outb(info, UART_DLM, quot >> 8); /* MS of divisor */
  2673. su_outb(info, UART_LCR, cval); /* reset DLAB */
  2674. info->quot = quot;
  2675. /*
  2676.  * If we read 0xff from the LSR, there is no UART here.
  2677.  */
  2678. if (su_inb(info, UART_LSR) == 0xff)
  2679. return -1;
  2680. info->is_console = 1;
  2681. return 0;
  2682. }
  2683. static struct console sercons = {
  2684. name: "ttyS",
  2685. write: serial_console_write,
  2686. device: serial_console_device,
  2687. wait_key: serial_console_wait_key,
  2688. setup: serial_console_setup,
  2689. flags: CON_PRINTBUFFER,
  2690. index: -1,
  2691. };
  2692. int su_console_registered = 0;
  2693. /*
  2694.  * Register console.
  2695.  */
  2696. int __init su_serial_console_init(void)
  2697. {
  2698. extern int con_is_present(void);
  2699. int index;
  2700. if (con_is_present())
  2701. return 0;
  2702. if (serial_console == 0)
  2703. return 0;
  2704. index = serial_console - 1;
  2705. if (su_table[index].port == 0 || su_table[index].port_node == 0)
  2706. return 0;
  2707. sercons.index = index;
  2708. register_console(&sercons);
  2709. su_console_registered = 1;
  2710. return 0;
  2711. }
  2712. #endif /* CONFIG_SERIAL_CONSOLE */