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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.uart.c 1.23 12/29/01 14:50:03 trini
  3.  */
  4. /*
  5.  *  UART driver for MPC860 CPM SCC or SMC
  6.  *  Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
  7.  *
  8.  * I used the serial.c driver as the framework for this driver.
  9.  * Give credit to those guys.
  10.  * The original code was written for the MBX860 board.  I tried to make
  11.  * it generic, but there may be some assumptions in the structures that
  12.  * have to be fixed later.
  13.  * To save porting time, I did not bother to change any object names
  14.  * that are not accessed outside of this file.
  15.  * It still needs lots of work........When it was easy, I included code
  16.  * to support the SCCs, but this has never been tested, nor is it complete.
  17.  * Only the SCCs support modem control, so that is not complete either.
  18.  *
  19.  * This module exports the following rs232 io functions:
  20.  *
  21.  * int rs_8xx_init(void);
  22.  */
  23. #include <linux/config.h>
  24. #include <linux/module.h>
  25. #include <linux/errno.h>
  26. #include <linux/signal.h>
  27. #include <linux/sched.h>
  28. #include <linux/timer.h>
  29. #include <linux/interrupt.h>
  30. #include <linux/tty.h>
  31. #include <linux/tty_flip.h>
  32. #include <linux/serial.h>
  33. #include <linux/serialP.h>
  34. #include <linux/major.h>
  35. #include <linux/string.h>
  36. #include <linux/fcntl.h>
  37. #include <linux/ptrace.h>
  38. #include <linux/mm.h>
  39. #include <linux/slab.h>
  40. #include <linux/init.h>
  41. #include <linux/delay.h>
  42. #include <asm/uaccess.h>
  43. #include <asm/8xx_immap.h>
  44. #include <asm/mpc8xx.h>
  45. #include <asm/commproc.h>
  46. #ifdef CONFIG_MAGIC_SYSRQ
  47. #include <linux/sysrq.h>
  48. #endif
  49. #ifdef CONFIG_KGDB
  50. extern void breakpoint(void);
  51. extern void set_debug_traps(void);
  52. extern int  kgdb_output_string (const char* s, unsigned int count);
  53. #endif
  54. #ifdef CONFIG_SERIAL_CONSOLE
  55. #include <linux/console.h>
  56. /* this defines the index into rs_table for the port to use
  57. */
  58. # ifndef CONFIG_SERIAL_CONSOLE_PORT
  59. #  ifdef CONFIG_SCC3_ENET
  60. #   ifdef CONFIG_CONS_SMC2
  61. #    define CONFIG_SERIAL_CONSOLE_PORT 0 /* Console on SMC2 is 1st port */
  62. #   else
  63. #    error "Can't use SMC1 for console with Ethernet on SCC3"
  64. #   endif
  65. #  else /* ! CONFIG_SCC3_ENET */
  66. #   ifdef CONFIG_CONS_SMC2 /* Console on SMC2 */
  67. #    define CONFIG_SERIAL_CONSOLE_PORT 1
  68. #   else /* Console on SMC1 */
  69. #    define CONFIG_SERIAL_CONSOLE_PORT 0
  70. #   endif /* CONFIG_CONS_SMC2 */
  71. #  endif  /* CONFIG_SCC3_ENET */
  72. # endif   /* CONFIG_SERIAL_CONSOLE_PORT */
  73. #endif   /* CONFIG_SERIAL_CONSOLE */
  74. #if 0
  75. /* SCC2 for console
  76. */
  77. #undef CONFIG_SERIAL_CONSOLE_PORT
  78. #define CONFIG_SERIAL_CONSOLE_PORT 2
  79. #endif
  80. #define TX_WAKEUP ASYNC_SHARE_IRQ
  81. static char *serial_name = "CPM UART driver";
  82. static char *serial_version = "0.03";
  83. static DECLARE_TASK_QUEUE(tq_serial);
  84. static struct tty_driver serial_driver, callout_driver;
  85. static int serial_refcount;
  86. static int serial_console_setup(struct console *co, char *options);
  87. static void serial_console_write(struct console *c, const char *s,
  88. unsigned count);
  89. static kdev_t serial_console_device(struct console *c);
  90. #if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  91. static unsigned long break_pressed; /* break, really ... */
  92. #endif
  93. /*
  94.  * Serial driver configuration section.  Here are the various options:
  95.  */
  96. #define SERIAL_PARANOIA_CHECK
  97. #define CONFIG_SERIAL_NOPAUSE_IO
  98. #define SERIAL_DO_RESTART
  99. /* Set of debugging defines */
  100. #undef SERIAL_DEBUG_INTR
  101. #undef SERIAL_DEBUG_OPEN
  102. #undef SERIAL_DEBUG_FLOW
  103. #undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  104. #define _INLINE_ inline
  105.   
  106. #define DBG_CNT(s)
  107. /* We overload some of the items in the data structure to meet our
  108.  * needs.  For example, the port address is the CPM parameter ram
  109.  * offset for the SCC or SMC.  The maximum number of ports is 4 SCCs and
  110.  * 2 SMCs.  The "hub6" field is used to indicate the channel number, with
  111.  * a flag indicating SCC or SMC, and the number is used as an index into
  112.  * the CPM parameter area for this device.
  113.  * The "type" field is currently set to 0, for PORT_UNKNOWN.  It is
  114.  * not currently used.  I should probably use it to indicate the port
  115.  * type of SMC or SCC.
  116.  * The SMCs do not support any modem control signals.
  117.  */
  118. #define smc_scc_num hub6
  119. #define NUM_IS_SCC ((int)0x00010000)
  120. #define PORT_NUM(P) ((P) & 0x0000ffff)
  121. /* Processors other than the 860 only get SMCs configured by default.
  122.  * Either they don't have SCCs or they are allocated somewhere else.
  123.  * Of course, there are now 860s without some SCCs, so we will need to
  124.  * address that someday.
  125.  * The Embedded Planet Multimedia I/O cards use TDM interfaces to the
  126.  * stereo codec parts, and we use SMC2 to help support that.
  127.  */
  128. static struct serial_state rs_table[] = {
  129. /* UART CLK   PORT          IRQ      FLAGS  NUM   */
  130. #ifndef CONFIG_SCC3_ENET /* SMC1 not usable with Ethernet on SCC3 */
  131.    { 0,     0, PROFF_SMC1, CPMVEC_SMC1,   0,    0 },    /* SMC1 ttyS0 */
  132. #endif
  133. #if !defined(CONFIG_USB_MPC8xx) && !defined(CONFIG_USB_CLIENT_MPC8xx)
  134. # ifdef CONFIG_SMC2_UART
  135.    { 0,     0, PROFF_SMC2, CPMVEC_SMC2,   0,    1 },    /* SMC2 ttyS1 */
  136. # endif
  137. # ifdef CONFIG_USE_SCC_IO
  138.    { 0,     0, PROFF_SCC2, CPMVEC_SCC2,   0,    (NUM_IS_SCC | 1) },    /* SCC2 ttyS2 */
  139.    { 0,     0, PROFF_SCC3, CPMVEC_SCC3,   0,    (NUM_IS_SCC | 2) },    /* SCC3 ttyS3 */
  140. # endif
  141.   #else /* CONFIG_USB_xxx */
  142. # ifdef CONFIG_USE_SCC_IO
  143.    { 0,     0, PROFF_SCC3, CPMVEC_SCC3,   0,    (NUM_IS_SCC | 2) },    /* SCC3 ttyS3 */
  144. # endif
  145. #endif /* CONFIG_USB_xxx */
  146. };
  147. #define NR_PORTS (sizeof(rs_table)/sizeof(struct serial_state))
  148. static struct tty_struct *serial_table[NR_PORTS];
  149. static struct termios *serial_termios[NR_PORTS];
  150. static struct termios *serial_termios_locked[NR_PORTS];
  151. /* The number of buffer descriptors and their sizes.
  152. */
  153. #define RX_NUM_FIFO 4
  154. #define RX_BUF_SIZE 32
  155. #define TX_NUM_FIFO 4
  156. #define TX_BUF_SIZE 32
  157. #ifndef MIN
  158. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  159. #endif
  160. /* The async_struct in serial.h does not really give us what we
  161.  * need, so define our own here.
  162.  */
  163. typedef struct serial_info {
  164. int magic;
  165. int flags;
  166. struct serial_state *state;
  167. struct tty_struct  *tty;
  168. int read_status_mask;
  169. int ignore_status_mask;
  170. int timeout;
  171. int line;
  172. int x_char; /* xon/xoff character */
  173. int close_delay;
  174. unsigned short closing_wait;
  175. unsigned short closing_wait2;
  176. unsigned long event;
  177. unsigned long last_active;
  178. int blocked_open; /* # of blocked opens */
  179. long session; /* Session of opening process */
  180. long pgrp; /* pgrp of opening process */
  181. struct tq_struct tqueue;
  182. struct tq_struct tqueue_hangup;
  183. wait_queue_head_t open_wait;
  184. wait_queue_head_t close_wait;
  185. /* CPM Buffer Descriptor pointers.
  186. */
  187. cbd_t *rx_bd_base;
  188. cbd_t *rx_cur;
  189. cbd_t *tx_bd_base;
  190. cbd_t *tx_cur;
  191. } ser_info_t;
  192. static struct console sercons = {
  193. name: "ttyS",
  194. write: serial_console_write,
  195. device: serial_console_device,
  196. setup: serial_console_setup,
  197. flags: CON_PRINTBUFFER,
  198. index: CONFIG_SERIAL_CONSOLE_PORT,
  199. };
  200. static void change_speed(ser_info_t *info);
  201. static void rs_8xx_wait_until_sent(struct tty_struct *tty, int timeout);
  202. static inline int serial_paranoia_check(ser_info_t *info,
  203. kdev_t device, const char *routine)
  204. {
  205. #ifdef SERIAL_PARANOIA_CHECK
  206. static const char *badmagic =
  207. "Warning: bad magic number for serial struct (%s) in %sn";
  208. static const char *badinfo =
  209. "Warning: null async_struct for (%s) in %sn";
  210. if (!info) {
  211. printk(badinfo, kdevname(device), routine);
  212. return 1;
  213. }
  214. if (info->magic != SERIAL_MAGIC) {
  215. printk(badmagic, kdevname(device), routine);
  216. return 1;
  217. }
  218. #endif
  219. return 0;
  220. }
  221. /*
  222.  * This is used to figure out the divisor speeds and the timeouts,
  223.  * indexed by the termio value.  The generic CPM functions are responsible
  224.  * for setting and assigning baud rate generators for us.
  225.  */
  226. static int baud_table[] = {
  227. 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
  228. 9600, 19200, 38400, 57600, 115200, 230400, 460800, 0 };
  229. /*
  230.  * ------------------------------------------------------------
  231.  * rs_stop() and rs_start()
  232.  *
  233.  * This routines are called before setting or resetting tty->stopped.
  234.  * They enable or disable transmitter interrupts, as necessary.
  235.  * ------------------------------------------------------------
  236.  */
  237. static void rs_8xx_stop(struct tty_struct *tty)
  238. {
  239. ser_info_t *info = (ser_info_t *)tty->driver_data;
  240. int idx;
  241. unsigned long flags;
  242. volatile scc_t *sccp;
  243. volatile smc_t *smcp;
  244. if (serial_paranoia_check(info, tty->device, "rs_stop"))
  245. return;
  246. save_flags(flags); cli();
  247. idx = PORT_NUM(info->state->smc_scc_num);
  248. if (info->state->smc_scc_num & NUM_IS_SCC) {
  249. sccp = &cpmp->cp_scc[idx];
  250. sccp->scc_sccm &= ~UART_SCCM_TX;
  251. }
  252. else {
  253. smcp = &cpmp->cp_smc[idx];
  254. smcp->smc_smcm &= ~SMCM_TX;
  255. }
  256. restore_flags(flags);
  257. }
  258. static void rs_8xx_start(struct tty_struct *tty)
  259. {
  260. ser_info_t *info = (ser_info_t *)tty->driver_data;
  261. int idx;
  262. unsigned long flags;
  263. volatile scc_t *sccp;
  264. volatile smc_t *smcp;
  265. if (serial_paranoia_check(info, tty->device, "rs_stop"))
  266. return;
  267. idx = PORT_NUM(info->state->smc_scc_num);
  268. save_flags(flags); cli();
  269. if (info->state->smc_scc_num & NUM_IS_SCC) {
  270. sccp = &cpmp->cp_scc[idx];
  271. sccp->scc_sccm |= UART_SCCM_TX;
  272. }
  273. else {
  274. smcp = &cpmp->cp_smc[idx];
  275. smcp->smc_smcm |= SMCM_TX;
  276. }
  277. restore_flags(flags);
  278. }
  279. /*
  280.  * ----------------------------------------------------------------------
  281.  *
  282.  * Here starts the interrupt handling routines.  All of the following
  283.  * subroutines are declared as inline and are folded into
  284.  * rs_interrupt().  They were separated out for readability's sake.
  285.  *
  286.  * Note: rs_interrupt() is a "fast" interrupt, which means that it
  287.  * runs with interrupts turned off.  People who may want to modify
  288.  * rs_interrupt() should try to keep the interrupt handler as fast as
  289.  * possible.  After you are done making modifications, it is not a bad
  290.  * idea to do:
  291.  * 
  292.  * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
  293.  *
  294.  * and look at the resulting assemble code in serial.s.
  295.  *
  296.  *  - Ted Ts'o (tytso@mit.edu), 7-Mar-93
  297.  * -----------------------------------------------------------------------
  298.  */
  299. /*
  300.  * This routine is used by the interrupt handler to schedule
  301.  * processing in the software interrupt portion of the driver.
  302.  */
  303. static _INLINE_ void rs_sched_event(ser_info_t *info,
  304.   int event)
  305. {
  306. info->event |= 1 << event;
  307. queue_task(&info->tqueue, &tq_serial);
  308. mark_bh(SERIAL_BH);
  309. }
  310. static _INLINE_ void receive_chars(ser_info_t *info, struct pt_regs *regs)
  311. {
  312. struct tty_struct *tty = info->tty;
  313. unsigned char ch, *cp;
  314. /*int ignored = 0;*/
  315. int i;
  316. ushort status;
  317. struct async_icount *icount;
  318. volatile cbd_t *bdp;
  319. icount = &info->state->icount;
  320. /* Just loop through the closed BDs and copy the characters into
  321.  * the buffer.
  322.  */
  323. bdp = info->rx_cur;
  324. for (;;) {
  325. if (bdp->cbd_sc & BD_SC_EMPTY) /* If this one is empty */
  326. break; /*   we are all done */
  327. /* The read status mask tell us what we should do with
  328.  * incoming characters, especially if errors occur.
  329.  * One special case is the use of BD_SC_EMPTY.  If
  330.  * this is not set, we are supposed to be ignoring
  331.  * inputs.  In this case, just mark the buffer empty and
  332.  * continue.
  333. if (!(info->read_status_mask & BD_SC_EMPTY)) {
  334. bdp->cbd_sc |= BD_SC_EMPTY;
  335. bdp->cbd_sc &=
  336. ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV);
  337. if (bdp->cbd_sc & BD_SC_WRAP)
  338. bdp = info->rx_bd_base;
  339. else
  340. bdp++;
  341. continue;
  342. }
  343.  */
  344. /* Get the number of characters and the buffer pointer.
  345. */
  346. i = bdp->cbd_datlen;
  347. cp = (unsigned char *)__va(bdp->cbd_bufaddr);
  348. status = bdp->cbd_sc;
  349. /* Check to see if there is room in the tty buffer for
  350.  * the characters in our BD buffer.  If not, we exit
  351.  * now, leaving the BD with the characters.  We'll pick
  352.  * them up again on the next receive interrupt (which could
  353.  * be a timeout).
  354.  */
  355. if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE)
  356. break;
  357. while (i-- > 0) {
  358. ch = *cp++;
  359. *tty->flip.char_buf_ptr = ch;
  360. icount->rx++;
  361. #ifdef SERIAL_DEBUG_INTR
  362. printk("DR%02x:%02x...", ch, status);
  363. #endif
  364. *tty->flip.flag_buf_ptr = 0;
  365. if (status & (BD_SC_BR | BD_SC_FR |
  366.        BD_SC_PR | BD_SC_OV)) {
  367. /*
  368.  * For statistics only
  369.  */
  370. if (status & BD_SC_BR)
  371. icount->brk++;
  372. else if (status & BD_SC_PR)
  373. icount->parity++;
  374. else if (status & BD_SC_FR)
  375. icount->frame++;
  376. if (status & BD_SC_OV)
  377. icount->overrun++;
  378. /*
  379.  * Now check to see if character should be
  380.  * ignored, and mask off conditions which
  381.  * should be ignored.
  382. if (status & info->ignore_status_mask) {
  383. if (++ignored > 100)
  384. break;
  385. continue;
  386. }
  387.  */
  388. status &= info->read_status_mask;
  389. if (status & (BD_SC_BR)) {
  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 & BD_SC_PR)
  397. *tty->flip.flag_buf_ptr = TTY_PARITY;
  398. else if (status & BD_SC_FR)
  399. *tty->flip.flag_buf_ptr = TTY_FRAME;
  400. if (status & BD_SC_OV) {
  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 =
  411. TTY_OVERRUN;
  412. }
  413. }
  414. }
  415. #if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  416. if (break_pressed && info->line == sercons.index) {
  417. if (ch != 0 && time_before(jiffies, 
  418. break_pressed + HZ*5)) {
  419. handle_sysrq(ch, regs, NULL, NULL);
  420. break_pressed = 0;
  421. goto ignore_char;
  422. } else
  423. break_pressed = 0;
  424. }
  425. #endif
  426. if (tty->flip.count >= TTY_FLIPBUF_SIZE)
  427. break;
  428. tty->flip.flag_buf_ptr++;
  429. tty->flip.char_buf_ptr++;
  430. tty->flip.count++;
  431. }
  432. #if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  433. ignore_char:
  434. #endif
  435. /* This BD is ready to be used again.  Clear status.
  436.  * Get next BD.
  437.  */
  438. bdp->cbd_sc |= BD_SC_EMPTY;
  439. bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV);
  440. if (bdp->cbd_sc & BD_SC_WRAP)
  441. bdp = info->rx_bd_base;
  442. else
  443. bdp++;
  444. }
  445. info->rx_cur = (cbd_t *)bdp;
  446. queue_task(&tty->flip.tqueue, &tq_timer);
  447. }
  448. static _INLINE_ void receive_break(ser_info_t *info, struct pt_regs *regs)
  449. {
  450. struct tty_struct *tty = info->tty;
  451. info->state->icount.brk++;
  452. #if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  453. if (info->line == sercons.index) {
  454. if (!break_pressed) {
  455. break_pressed = jiffies;
  456. return;
  457. } else
  458. break_pressed = 0;
  459. }
  460. #endif
  461. /* Check to see if there is room in the tty buffer for
  462.  * the break.  If not, we exit now, losing the break.  FIXME
  463.  */
  464. if ((tty->flip.count + 1) >= TTY_FLIPBUF_SIZE)
  465. return;
  466. *(tty->flip.flag_buf_ptr++) = TTY_BREAK;
  467. *(tty->flip.char_buf_ptr++) = 0;
  468. tty->flip.count++;
  469. queue_task(&tty->flip.tqueue, &tq_timer);
  470. }
  471. static _INLINE_ void transmit_chars(ser_info_t *info, struct pt_regs *regs)
  472. {
  473. if ((info->flags & TX_WAKEUP) ||
  474.     (info->tty->flags & (1 << TTY_DO_WRITE_WAKEUP))) {
  475. rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
  476. }
  477. #ifdef SERIAL_DEBUG_INTR
  478. printk("THRE...");
  479. #endif
  480. }
  481. #ifdef notdef
  482. /* I need to do this for the SCCs, so it is left as a reminder.
  483. */
  484. static _INLINE_ void check_modem_status(struct async_struct *info)
  485. {
  486. int status;
  487. struct async_icount *icount;
  488. status = serial_in(info, UART_MSR);
  489. if (status & UART_MSR_ANY_DELTA) {
  490. icount = &info->state->icount;
  491. /* update input line counters */
  492. if (status & UART_MSR_TERI)
  493. icount->rng++;
  494. if (status & UART_MSR_DDSR)
  495. icount->dsr++;
  496. if (status & UART_MSR_DDCD) {
  497. icount->dcd++;
  498. #ifdef CONFIG_HARD_PPS
  499. if ((info->flags & ASYNC_HARDPPS_CD) &&
  500.     (status & UART_MSR_DCD))
  501. hardpps();
  502. #endif
  503. }
  504. if (status & UART_MSR_DCTS)
  505. icount->cts++;
  506. wake_up_interruptible(&info->delta_msr_wait);
  507. }
  508. if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
  509. #if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
  510. printk("ttys%d CD now %s...", info->line,
  511.        (status & UART_MSR_DCD) ? "on" : "off");
  512. #endif
  513. if (status & UART_MSR_DCD)
  514. wake_up_interruptible(&info->open_wait);
  515. else if (!((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  516.    (info->flags & ASYNC_CALLOUT_NOHUP))) {
  517. #ifdef SERIAL_DEBUG_OPEN
  518. printk("scheduling hangup...");
  519. #endif
  520. MOD_INC_USE_COUNT;
  521. if (schedule_task(&info->tqueue_hangup) == 0)
  522. MOD_DEC_USE_COUNT;
  523. }
  524. }
  525. if (info->flags & ASYNC_CTS_FLOW) {
  526. if (info->tty->hw_stopped) {
  527. if (status & UART_MSR_CTS) {
  528. #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
  529. printk("CTS tx start...");
  530. #endif
  531. info->tty->hw_stopped = 0;
  532. info->IER |= UART_IER_THRI;
  533. serial_out(info, UART_IER, info->IER);
  534. rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
  535. return;
  536. }
  537. } else {
  538. if (!(status & UART_MSR_CTS)) {
  539. #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
  540. printk("CTS tx stop...");
  541. #endif
  542. info->tty->hw_stopped = 1;
  543. info->IER &= ~UART_IER_THRI;
  544. serial_out(info, UART_IER, info->IER);
  545. }
  546. }
  547. }
  548. }
  549. #endif
  550. /*
  551.  * This is the serial driver's interrupt routine for a single port
  552.  */
  553. static void rs_8xx_interrupt(void *dev_id, struct pt_regs *regs)
  554. {
  555. u_char events;
  556. int idx;
  557. ser_info_t *info;
  558. volatile smc_t *smcp;
  559. volatile scc_t *sccp;
  560. info = (ser_info_t *)dev_id;
  561. idx = PORT_NUM(info->state->smc_scc_num);
  562. if (info->state->smc_scc_num & NUM_IS_SCC) {
  563. sccp = &cpmp->cp_scc[idx];
  564. events = sccp->scc_scce;
  565. if (events & SMCM_BRKE)
  566. receive_break(info, regs);
  567. if (events & SCCM_RX)
  568. receive_chars(info, regs);
  569. if (events & SCCM_TX)
  570. transmit_chars(info, regs);
  571. sccp->scc_scce = events;
  572. }
  573. else {
  574. smcp = &cpmp->cp_smc[idx];
  575. events = smcp->smc_smce;
  576. if (events & SMCM_BRKE)
  577. receive_break(info, regs);
  578. if (events & SMCM_RX)
  579. receive_chars(info, regs);
  580. if (events & SMCM_TX)
  581. transmit_chars(info, regs);
  582. smcp->smc_smce = events;
  583. }
  584. #ifdef SERIAL_DEBUG_INTR
  585. printk("rs_interrupt_single(%d, %x)...",
  586. info->state->smc_scc_num, events);
  587. #endif
  588. #ifdef modem_control
  589. check_modem_status(info);
  590. #endif
  591. info->last_active = jiffies;
  592. #ifdef SERIAL_DEBUG_INTR
  593. printk("end.n");
  594. #endif
  595. }
  596. /*
  597.  * -------------------------------------------------------------------
  598.  * Here ends the serial interrupt routines.
  599.  * -------------------------------------------------------------------
  600.  */
  601. /*
  602.  * This routine is used to handle the "bottom half" processing for the
  603.  * serial driver, known also the "software interrupt" processing.
  604.  * This processing is done at the kernel interrupt level, after the
  605.  * rs_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
  606.  * is where time-consuming activities which can not be done in the
  607.  * interrupt driver proper are done; the interrupt driver schedules
  608.  * them using rs_sched_event(), and they get done here.
  609.  */
  610. static void do_serial_bh(void)
  611. {
  612. run_task_queue(&tq_serial);
  613. }
  614. static void do_softint(void *private_)
  615. {
  616. ser_info_t *info = (ser_info_t *) private_;
  617. struct tty_struct *tty;
  618. tty = info->tty;
  619. if (!tty)
  620. return;
  621. if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
  622. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  623.     tty->ldisc.write_wakeup)
  624. (tty->ldisc.write_wakeup)(tty);
  625. wake_up_interruptible(&tty->write_wait);
  626. }
  627. }
  628. /*
  629.  * This routine is called from the scheduler tqueue when the interrupt
  630.  * routine has signalled that a hangup has occurred.  The path of
  631.  * hangup processing is:
  632.  *
  633.  *  serial interrupt routine -> (scheduler tqueue) ->
  634.  *  do_serial_hangup() -> tty->hangup() -> rs_hangup()
  635.  * 
  636.  */
  637. static void do_serial_hangup(void *private_)
  638. {
  639. struct async_struct *info = (struct async_struct *) private_;
  640. struct tty_struct *tty;
  641. tty = info->tty;
  642. if (tty)
  643. tty_hangup(tty);
  644. MOD_DEC_USE_COUNT;
  645. }
  646. /*static void rs_8xx_timer(void)
  647. {
  648. printk("rs_8xx_timern");
  649. }*/
  650. static int startup(ser_info_t *info)
  651. {
  652. unsigned long flags;
  653. int retval=0;
  654. int idx;
  655. struct serial_state *state= info->state;
  656. volatile smc_t *smcp;
  657. volatile scc_t *sccp;
  658. volatile smc_uart_t *up;
  659. volatile scc_uart_t *scup;
  660. save_flags(flags); cli();
  661. if (info->flags & ASYNC_INITIALIZED) {
  662. goto errout;
  663. }
  664. #ifdef maybe
  665. if (!state->port || !state->type) {
  666. if (info->tty)
  667. set_bit(TTY_IO_ERROR, &info->tty->flags);
  668. goto errout;
  669. }
  670. #endif
  671. #ifdef SERIAL_DEBUG_OPEN
  672. printk("starting up ttys%d (irq %d)...", info->line, state->irq);
  673. #endif
  674. #ifdef modem_control
  675. info->MCR = 0;
  676. if (info->tty->termios->c_cflag & CBAUD)
  677. info->MCR = UART_MCR_DTR | UART_MCR_RTS;
  678. #endif
  679. if (info->tty)
  680. clear_bit(TTY_IO_ERROR, &info->tty->flags);
  681. /*
  682.  * and set the speed of the serial port
  683.  */
  684. change_speed(info);
  685. idx = PORT_NUM(info->state->smc_scc_num);
  686. if (info->state->smc_scc_num & NUM_IS_SCC) {
  687. sccp = &cpmp->cp_scc[idx];
  688. scup = (scc_uart_t *)&cpmp->cp_dparam[state->port];
  689. scup->scc_genscc.scc_mrblr = RX_BUF_SIZE;
  690. scup->scc_maxidl = RX_BUF_SIZE;
  691. sccp->scc_sccm |= (UART_SCCM_TX | UART_SCCM_RX);
  692. sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  693. }
  694. else {
  695. smcp = &cpmp->cp_smc[idx];
  696. /* Enable interrupts and I/O.
  697. */
  698. smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
  699. smcp->smc_smcmr |= (SMCMR_REN | SMCMR_TEN);
  700. /* We can tune the buffer length and idle characters
  701.  * to take advantage of the entire incoming buffer size.
  702.  * If mrblr is something other than 1, maxidl has to be
  703.  * non-zero or we never get an interrupt.  The maxidl
  704.  * is the number of character times we wait after reception
  705.  * of the last character before we decide no more characters
  706.  * are coming.
  707.  */
  708. up = (smc_uart_t *)&cpmp->cp_dparam[state->port];
  709. up->smc_mrblr = RX_BUF_SIZE;
  710. up->smc_maxidl = RX_BUF_SIZE;
  711. up->smc_brkcr = 1; /* number of break chars */
  712. }
  713. info->flags |= ASYNC_INITIALIZED;
  714. restore_flags(flags);
  715. return 0;
  716. errout:
  717. restore_flags(flags);
  718. return retval;
  719. }
  720. /*
  721.  * This routine will shutdown a serial port; interrupts are disabled, and
  722.  * DTR is dropped if the hangup on close termio flag is on.
  723.  */
  724. static void shutdown(ser_info_t * info)
  725. {
  726. unsigned long flags;
  727. struct serial_state *state;
  728. int idx;
  729. volatile smc_t *smcp;
  730. volatile scc_t *sccp;
  731. if (!(info->flags & ASYNC_INITIALIZED))
  732. return;
  733. state = info->state;
  734. #ifdef SERIAL_DEBUG_OPEN
  735. printk("Shutting down serial port %d (irq %d)....", info->line,
  736.        state->irq);
  737. #endif
  738. save_flags(flags); cli(); /* Disable interrupts */
  739. idx = PORT_NUM(state->smc_scc_num);
  740. if (state->smc_scc_num & NUM_IS_SCC) {
  741. sccp = &cpmp->cp_scc[idx];
  742. sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  743. #ifdef CONFIG_SERIAL_CONSOLE
  744. /* We can't disable the transmitter if this is the
  745.  * system console.
  746.  */
  747. if ((state - rs_table) != CONFIG_SERIAL_CONSOLE_PORT)
  748. #endif
  749. sccp->scc_sccm &= ~(UART_SCCM_TX | UART_SCCM_RX);
  750. }
  751. else {
  752. smcp = &cpmp->cp_smc[idx];
  753. /* Disable interrupts and I/O.
  754. */
  755. smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX);
  756. #ifdef CONFIG_SERIAL_CONSOLE
  757. /* We can't disable the transmitter if this is the
  758.  * system console.
  759.  */
  760. if ((state - rs_table) != CONFIG_SERIAL_CONSOLE_PORT)
  761. #endif
  762. smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
  763. }
  764. if (info->tty)
  765. set_bit(TTY_IO_ERROR, &info->tty->flags);
  766. info->flags &= ~ASYNC_INITIALIZED;
  767. restore_flags(flags);
  768. }
  769. /*
  770.  * This routine is called to set the UART divisor registers to match
  771.  * the specified baud rate for a serial port.
  772.  */
  773. static void change_speed(ser_info_t *info)
  774. {
  775. int baud_rate;
  776. unsigned cflag, cval, scval, prev_mode, new_mode;
  777. int i, bits, sbits, idx;
  778. unsigned long flags;
  779. struct serial_state *state;
  780. volatile smc_t *smcp;
  781. volatile scc_t *sccp;
  782. if (!info->tty || !info->tty->termios)
  783. return;
  784. cflag = info->tty->termios->c_cflag;
  785. state = info->state;
  786. /* Character length programmed into the mode register is the
  787.  * sum of: 1 start bit, number of data bits, 0 or 1 parity bit,
  788.  * 1 or 2 stop bits, minus 1.
  789.  * The value 'bits' counts this for us.
  790.  */
  791. cval = 0;
  792. scval = 0;
  793. /* byte size and parity */
  794. switch (cflag & CSIZE) {
  795.       case CS5: bits = 5; break;
  796.       case CS6: bits = 6; break;
  797.       case CS7: bits = 7; break;
  798.       case CS8: bits = 8; break;
  799.       /* Never happens, but GCC is too dumb to figure it out */
  800.       default:  bits = 8; break;
  801. }
  802. sbits = bits - 5;
  803. if (cflag & CSTOPB) {
  804. cval |= SMCMR_SL; /* Two stops */
  805. scval |= SCU_PMSR_SL;
  806. bits++;
  807. }
  808. if (cflag & PARENB) {
  809. cval |= SMCMR_PEN;
  810. scval |= SCU_PMSR_PEN;
  811. bits++;
  812. if (!(cflag & PARODD)) {
  813. cval |= SMCMR_PM_EVEN;
  814. scval |= (SCU_PMSR_REVP | SCU_PMSR_TEVP);
  815. }
  816. }
  817. /* Determine divisor based on baud rate */
  818. i = cflag & CBAUD;
  819. if (i >= (sizeof(baud_table)/sizeof(int)))
  820. baud_rate = 9600;
  821. else
  822. baud_rate = baud_table[i];
  823. info->timeout = (TX_BUF_SIZE*HZ*bits);
  824. info->timeout += HZ/50; /* Add .02 seconds of slop */
  825. #ifdef modem_control
  826. /* CTS flow control flag and modem status interrupts */
  827. info->IER &= ~UART_IER_MSI;
  828. if (info->flags & ASYNC_HARDPPS_CD)
  829. info->IER |= UART_IER_MSI;
  830. if (cflag & CRTSCTS) {
  831. info->flags |= ASYNC_CTS_FLOW;
  832. info->IER |= UART_IER_MSI;
  833. } else
  834. info->flags &= ~ASYNC_CTS_FLOW;
  835. if (cflag & CLOCAL)
  836. info->flags &= ~ASYNC_CHECK_CD;
  837. else {
  838. info->flags |= ASYNC_CHECK_CD;
  839. info->IER |= UART_IER_MSI;
  840. }
  841. serial_out(info, UART_IER, info->IER);
  842. #endif
  843. /*
  844.  * Set up parity check flag
  845.  */
  846. #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
  847. info->read_status_mask = (BD_SC_EMPTY | BD_SC_OV);
  848. if (I_INPCK(info->tty))
  849. info->read_status_mask |= BD_SC_FR | BD_SC_PR;
  850. if (I_BRKINT(info->tty) || I_PARMRK(info->tty))
  851. info->read_status_mask |= BD_SC_BR;
  852. /*
  853.  * Characters to ignore
  854.  */
  855. info->ignore_status_mask = 0;
  856. if (I_IGNPAR(info->tty))
  857. info->ignore_status_mask |= BD_SC_PR | BD_SC_FR;
  858. if (I_IGNBRK(info->tty)) {
  859. info->ignore_status_mask |= BD_SC_BR;
  860. /*
  861.  * If we're ignore parity and break indicators, ignore 
  862.  * overruns too.  (For real raw support).
  863.  */
  864. if (I_IGNPAR(info->tty))
  865. info->ignore_status_mask |= BD_SC_OV;
  866. }
  867. /*
  868.  * !!! ignore all characters if CREAD is not set
  869.  */
  870. if ((cflag & CREAD) == 0)
  871. info->read_status_mask &= ~BD_SC_EMPTY;
  872. save_flags(flags); cli();
  873. /* Start bit has not been added (so don't, because we would just
  874.  * subtract it later), and we need to add one for the number of
  875.  * stops bits (there is always at least one).
  876.  */
  877. bits++;
  878. idx = PORT_NUM(state->smc_scc_num);
  879. if (state->smc_scc_num & NUM_IS_SCC) {
  880. sccp = &cpmp->cp_scc[idx];
  881. new_mode = (sbits << 12) | scval;
  882. prev_mode = sccp->scc_pmsr;
  883. if (!(prev_mode & SCU_PMSR_PEN)) 
  884. /* If parity is disabled, mask out even/odd */
  885. prev_mode &= ~(SCU_PMSR_TPM|SCU_PMSR_RPM);
  886. if (prev_mode != new_mode)
  887. sccp->scc_pmsr = new_mode;
  888. }
  889. else {
  890. smcp = &cpmp->cp_smc[idx];
  891. /* Set the mode register.  We want to keep a copy of the
  892.  * enables, because we want to put them back if they were
  893.  * present.
  894.  */
  895. prev_mode = smcp->smc_smcmr;
  896. new_mode = smcr_mk_clen(bits) | cval |  SMCMR_SM_UART;
  897. new_mode |= (prev_mode & (SMCMR_REN | SMCMR_TEN));
  898. if (!(prev_mode & SMCMR_PEN))
  899. /* If parity is disabled, mask out even/odd */
  900. prev_mode &= ~SMCMR_PM_EVEN;
  901. if (prev_mode != new_mode)
  902. smcp->smc_smcmr = new_mode;
  903. }
  904. m8xx_cpm_setbrg((state - rs_table), baud_rate);
  905. restore_flags(flags);
  906. }
  907. static void rs_8xx_put_char(struct tty_struct *tty, unsigned char ch)
  908. {
  909. ser_info_t *info = (ser_info_t *)tty->driver_data;
  910. volatile cbd_t *bdp;
  911. if (serial_paranoia_check(info, tty->device, "rs_put_char"))
  912. return;
  913. if (!tty)
  914. return;
  915. bdp = info->tx_cur;
  916. while (bdp->cbd_sc & BD_SC_READY);
  917. *((char *)__va(bdp->cbd_bufaddr)) = ch;
  918. bdp->cbd_datlen = 1;
  919. bdp->cbd_sc |= BD_SC_READY;
  920. /* Get next BD.
  921. */
  922. if (bdp->cbd_sc & BD_SC_WRAP)
  923. bdp = info->tx_bd_base;
  924. else
  925. bdp++;
  926. info->tx_cur = (cbd_t *)bdp;
  927. }
  928. static int rs_8xx_write(struct tty_struct * tty, int from_user,
  929.     const unsigned char *buf, int count)
  930. {
  931. int c, ret = 0;
  932. ser_info_t *info = (ser_info_t *)tty->driver_data;
  933. volatile cbd_t *bdp;
  934. #ifdef CONFIG_KGDB
  935.         /* Try to let stub handle output. Returns true if it did. */ 
  936.         if (kgdb_output_string(buf, count))
  937.             return ret;
  938. #endif
  939. if (serial_paranoia_check(info, tty->device, "rs_write"))
  940. return 0;
  941. if (!tty) 
  942. return 0;
  943. bdp = info->tx_cur;
  944. while (1) {
  945. c = MIN(count, TX_BUF_SIZE);
  946. if (c <= 0)
  947. break;
  948. if (bdp->cbd_sc & BD_SC_READY) {
  949. info->flags |= TX_WAKEUP;
  950. break;
  951. }
  952. if (from_user) {
  953. if (copy_from_user(__va(bdp->cbd_bufaddr), buf, c)) {
  954. if (!ret)
  955. ret = -EFAULT;
  956. break;
  957. }
  958. } else {
  959. memcpy(__va(bdp->cbd_bufaddr), buf, c);
  960. }
  961. bdp->cbd_datlen = c;
  962. bdp->cbd_sc |= BD_SC_READY;
  963. buf += c;
  964. count -= c;
  965. ret += c;
  966. /* Get next BD.
  967. */
  968. if (bdp->cbd_sc & BD_SC_WRAP)
  969. bdp = info->tx_bd_base;
  970. else
  971. bdp++;
  972. info->tx_cur = (cbd_t *)bdp;
  973. }
  974. return ret;
  975. }
  976. static int rs_8xx_write_room(struct tty_struct *tty)
  977. {
  978. ser_info_t *info = (ser_info_t *)tty->driver_data;
  979. int ret;
  980. if (serial_paranoia_check(info, tty->device, "rs_write_room"))
  981. return 0;
  982. if ((info->tx_cur->cbd_sc & BD_SC_READY) == 0) {
  983. info->flags &= ~TX_WAKEUP;
  984. ret = TX_BUF_SIZE;
  985. }
  986. else {
  987. info->flags |= TX_WAKEUP;
  988. ret = 0;
  989. }
  990. return ret;
  991. }
  992. /* I could track this with transmit counters....maybe later.
  993. */
  994. static int rs_8xx_chars_in_buffer(struct tty_struct *tty)
  995. {
  996. ser_info_t *info = (ser_info_t *)tty->driver_data;
  997. if (serial_paranoia_check(info, tty->device, "rs_chars_in_buffer"))
  998. return 0;
  999. return 0;
  1000. }
  1001. static void rs_8xx_flush_buffer(struct tty_struct *tty)
  1002. {
  1003. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1004. if (serial_paranoia_check(info, tty->device, "rs_flush_buffer"))
  1005. return;
  1006. /* There is nothing to "flush", whatever we gave the CPM
  1007.  * is on its way out.
  1008.  */
  1009. wake_up_interruptible(&tty->write_wait);
  1010. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1011.     tty->ldisc.write_wakeup)
  1012. (tty->ldisc.write_wakeup)(tty);
  1013. info->flags &= ~TX_WAKEUP;
  1014. }
  1015. /*
  1016.  * This function is used to send a high-priority XON/XOFF character to
  1017.  * the device
  1018.  */
  1019. static void rs_8xx_send_xchar(struct tty_struct *tty, char ch)
  1020. {
  1021. volatile cbd_t *bdp;
  1022. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1023. if (serial_paranoia_check(info, tty->device, "rs_send_char"))
  1024. return;
  1025. bdp = info->tx_cur;
  1026. while (bdp->cbd_sc & BD_SC_READY);
  1027. *((char *)__va(bdp->cbd_bufaddr)) = ch;
  1028. bdp->cbd_datlen = 1;
  1029. bdp->cbd_sc |= BD_SC_READY;
  1030. /* Get next BD.
  1031. */
  1032. if (bdp->cbd_sc & BD_SC_WRAP)
  1033. bdp = info->tx_bd_base;
  1034. else
  1035. bdp++;
  1036. info->tx_cur = (cbd_t *)bdp;
  1037. }
  1038. /*
  1039.  * ------------------------------------------------------------
  1040.  * rs_throttle()
  1041.  * 
  1042.  * This routine is called by the upper-layer tty layer to signal that
  1043.  * incoming characters should be throttled.
  1044.  * ------------------------------------------------------------
  1045.  */
  1046. static void rs_8xx_throttle(struct tty_struct * tty)
  1047. {
  1048. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1049. #ifdef SERIAL_DEBUG_THROTTLE
  1050. char buf[64];
  1051. printk("throttle %s: %d....n", _tty_name(tty, buf),
  1052.        tty->ldisc.chars_in_buffer(tty));
  1053. #endif
  1054. if (serial_paranoia_check(info, tty->device, "rs_throttle"))
  1055. return;
  1056. if (I_IXOFF(tty))
  1057. rs_8xx_send_xchar(tty, STOP_CHAR(tty));
  1058. #ifdef modem_control
  1059. if (tty->termios->c_cflag & CRTSCTS)
  1060. info->MCR &= ~UART_MCR_RTS;
  1061. cli();
  1062. serial_out(info, UART_MCR, info->MCR);
  1063. sti();
  1064. #endif
  1065. }
  1066. static void rs_8xx_unthrottle(struct tty_struct * tty)
  1067. {
  1068. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1069. #ifdef SERIAL_DEBUG_THROTTLE
  1070. char buf[64];
  1071. printk("unthrottle %s: %d....n", _tty_name(tty, buf),
  1072.        tty->ldisc.chars_in_buffer(tty));
  1073. #endif
  1074. if (serial_paranoia_check(info, tty->device, "rs_unthrottle"))
  1075. return;
  1076. if (I_IXOFF(tty)) {
  1077. if (info->x_char)
  1078. info->x_char = 0;
  1079. else
  1080. rs_8xx_send_xchar(tty, START_CHAR(tty));
  1081. }
  1082. #ifdef modem_control
  1083. if (tty->termios->c_cflag & CRTSCTS)
  1084. info->MCR |= UART_MCR_RTS;
  1085. cli();
  1086. serial_out(info, UART_MCR, info->MCR);
  1087. sti();
  1088. #endif
  1089. }
  1090. /*
  1091.  * ------------------------------------------------------------
  1092.  * rs_ioctl() and friends
  1093.  * ------------------------------------------------------------
  1094.  */
  1095. #ifdef maybe
  1096. /*
  1097.  * get_lsr_info - get line status register info
  1098.  *
  1099.  * Purpose: Let user call ioctl() to get info when the UART physically
  1100.  *      is emptied.  On bus types like RS485, the transmitter must
  1101.  *      release the bus after transmitting. This must be done when
  1102.  *      the transmit shift register is empty, not be done when the
  1103.  *      transmit holding register is empty.  This functionality
  1104.  *      allows an RS485 driver to be written in user space. 
  1105.  */
  1106. static int get_lsr_info(struct async_struct * info, unsigned int *value)
  1107. {
  1108. unsigned char status;
  1109. unsigned int result;
  1110. cli();
  1111. status = serial_in(info, UART_LSR);
  1112. sti();
  1113. result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
  1114. return put_user(result,value);
  1115. }
  1116. #endif
  1117. static int get_modem_info(ser_info_t *info, unsigned int *value)
  1118. {
  1119. unsigned int result = 0;
  1120. #ifdef modem_control
  1121. unsigned char control, status;
  1122. control = info->MCR;
  1123. cli();
  1124. status = serial_in(info, UART_MSR);
  1125. sti();
  1126. result =  ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
  1127. | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
  1128. #ifdef TIOCM_OUT1
  1129. | ((control & UART_MCR_OUT1) ? TIOCM_OUT1 : 0)
  1130. | ((control & UART_MCR_OUT2) ? TIOCM_OUT2 : 0)
  1131. #endif
  1132. | ((status  & UART_MSR_DCD) ? TIOCM_CAR : 0)
  1133. | ((status  & UART_MSR_RI) ? TIOCM_RNG : 0)
  1134. | ((status  & UART_MSR_DSR) ? TIOCM_DSR : 0)
  1135. | ((status  & UART_MSR_CTS) ? TIOCM_CTS : 0);
  1136. #endif
  1137. return put_user(result,value);
  1138. }
  1139. static int set_modem_info(ser_info_t *info, unsigned int cmd,
  1140.   unsigned int *value)
  1141. {
  1142. int error;
  1143. unsigned int arg;
  1144. error = get_user(arg, value);
  1145. if (error)
  1146. return error;
  1147. #ifdef modem_control
  1148. switch (cmd) {
  1149. case TIOCMBIS: 
  1150. if (arg & TIOCM_RTS)
  1151. info->MCR |= UART_MCR_RTS;
  1152. if (arg & TIOCM_DTR)
  1153. info->MCR |= UART_MCR_DTR;
  1154. #ifdef TIOCM_OUT1
  1155. if (arg & TIOCM_OUT1)
  1156. info->MCR |= UART_MCR_OUT1;
  1157. if (arg & TIOCM_OUT2)
  1158. info->MCR |= UART_MCR_OUT2;
  1159. #endif
  1160. break;
  1161. case TIOCMBIC:
  1162. if (arg & TIOCM_RTS)
  1163. info->MCR &= ~UART_MCR_RTS;
  1164. if (arg & TIOCM_DTR)
  1165. info->MCR &= ~UART_MCR_DTR;
  1166. #ifdef TIOCM_OUT1
  1167. if (arg & TIOCM_OUT1)
  1168. info->MCR &= ~UART_MCR_OUT1;
  1169. if (arg & TIOCM_OUT2)
  1170. info->MCR &= ~UART_MCR_OUT2;
  1171. #endif
  1172. break;
  1173. case TIOCMSET:
  1174. info->MCR = ((info->MCR & ~(UART_MCR_RTS |
  1175. #ifdef TIOCM_OUT1
  1176.     UART_MCR_OUT1 |
  1177.     UART_MCR_OUT2 |
  1178. #endif
  1179.     UART_MCR_DTR))
  1180.      | ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0)
  1181. #ifdef TIOCM_OUT1
  1182.      | ((arg & TIOCM_OUT1) ? UART_MCR_OUT1 : 0)
  1183.      | ((arg & TIOCM_OUT2) ? UART_MCR_OUT2 : 0)
  1184. #endif
  1185.      | ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0));
  1186. break;
  1187. default:
  1188. return -EINVAL;
  1189. }
  1190. cli();
  1191. serial_out(info, UART_MCR, info->MCR);
  1192. sti();
  1193. #endif
  1194. return 0;
  1195. }
  1196. /* Sending a break is a two step process on the SMC/SCC.  It is accomplished
  1197.  * by sending a STOP TRANSMIT command followed by a RESTART TRANSMIT
  1198.  * command.  We take advantage of the begin/end functions to make this
  1199.  * happen.
  1200.  */
  1201. static ushort smc_chan_map[] = {
  1202. CPM_CR_CH_SMC1,
  1203. CPM_CR_CH_SMC2
  1204. };
  1205. static ushort scc_chan_map[] = {
  1206. CPM_CR_CH_SCC1,
  1207. CPM_CR_CH_SCC2,
  1208. CPM_CR_CH_SCC3,
  1209. CPM_CR_CH_SCC4
  1210. };
  1211. static void begin_break(ser_info_t *info)
  1212. {
  1213. volatile cpm8xx_t *cp;
  1214. ushort chan;
  1215. int idx;
  1216. cp = cpmp;
  1217. idx = PORT_NUM(info->state->smc_scc_num);
  1218. if (info->state->smc_scc_num & NUM_IS_SCC)
  1219. chan = scc_chan_map[idx];
  1220. else
  1221. chan = smc_chan_map[idx];
  1222. cp->cp_cpcr = mk_cr_cmd(chan, CPM_CR_STOP_TX) | CPM_CR_FLG;
  1223. while (cp->cp_cpcr & CPM_CR_FLG);
  1224. }
  1225. static void end_break(ser_info_t *info)
  1226. {
  1227. volatile cpm8xx_t *cp;
  1228. ushort chan;
  1229. int idx;
  1230. cp = cpmp;
  1231. idx = PORT_NUM(info->state->smc_scc_num);
  1232. if (info->state->smc_scc_num & NUM_IS_SCC)
  1233. chan = scc_chan_map[idx];
  1234. else
  1235. chan = smc_chan_map[idx];
  1236. cp->cp_cpcr = mk_cr_cmd(chan, CPM_CR_RESTART_TX) | CPM_CR_FLG;
  1237. while (cp->cp_cpcr & CPM_CR_FLG);
  1238. }
  1239. /*
  1240.  * This routine sends a break character out the serial port.
  1241.  */
  1242. static void send_break(ser_info_t *info, int duration)
  1243. {
  1244. current->state = TASK_INTERRUPTIBLE;
  1245. #ifdef SERIAL_DEBUG_SEND_BREAK
  1246. printk("rs_send_break(%d) jiff=%lu...", duration, jiffies);
  1247. #endif
  1248. begin_break(info);
  1249. schedule_timeout(duration);
  1250. end_break(info);
  1251. #ifdef SERIAL_DEBUG_SEND_BREAK
  1252. printk("done jiffies=%lun", jiffies);
  1253. #endif
  1254. }
  1255. static int rs_8xx_ioctl(struct tty_struct *tty, struct file * file,
  1256.     unsigned int cmd, unsigned long arg)
  1257. {
  1258. int error;
  1259. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1260. int retval;
  1261. struct async_icount cnow; /* kernel counter temps */
  1262. struct serial_icounter_struct *p_cuser; /* user space */
  1263. if (serial_paranoia_check(info, tty->device, "rs_ioctl"))
  1264. return -ENODEV;
  1265. if ((cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
  1266. if (tty->flags & (1 << TTY_IO_ERROR))
  1267.     return -EIO;
  1268. }
  1269. switch (cmd) {
  1270. case TCSBRK: /* SVID version: non-zero arg --> no break */
  1271. retval = tty_check_change(tty);
  1272. if (retval)
  1273. return retval;
  1274. tty_wait_until_sent(tty, 0);
  1275. if (signal_pending(current))
  1276. return -EINTR;
  1277. if (!arg) {
  1278. send_break(info, HZ/4); /* 1/4 second */
  1279. if (signal_pending(current))
  1280. return -EINTR;
  1281. }
  1282. return 0;
  1283. case TCSBRKP: /* support for POSIX tcsendbreak() */
  1284. retval = tty_check_change(tty);
  1285. if (retval)
  1286. return retval;
  1287. tty_wait_until_sent(tty, 0);
  1288. if (signal_pending(current))
  1289. return -EINTR;
  1290. send_break(info, arg ? arg*(HZ/10) : HZ/4);
  1291. if (signal_pending(current))
  1292. return -EINTR;
  1293. return 0;
  1294. case TIOCSBRK:
  1295. retval = tty_check_change(tty);
  1296. if (retval)
  1297. return retval;
  1298. tty_wait_until_sent(tty, 0);
  1299. begin_break(info);
  1300. return 0;
  1301. case TIOCCBRK:
  1302. retval = tty_check_change(tty);
  1303. if (retval)
  1304. return retval;
  1305. end_break(info);
  1306. return 0;
  1307. case TIOCGSOFTCAR:
  1308. return put_user(C_CLOCAL(tty) ? 1 : 0, (int *) arg);
  1309. case TIOCSSOFTCAR:
  1310. error = get_user(arg, (unsigned int *) arg);
  1311. if (error)
  1312. return error;
  1313. tty->termios->c_cflag =
  1314. ((tty->termios->c_cflag & ~CLOCAL) |
  1315.  (arg ? CLOCAL : 0));
  1316. return 0;
  1317. case TIOCMGET:
  1318. return get_modem_info(info, (unsigned int *) arg);
  1319. case TIOCMBIS:
  1320. case TIOCMBIC:
  1321. case TIOCMSET:
  1322. return set_modem_info(info, cmd, (unsigned int *) arg);
  1323. #ifdef maybe
  1324. case TIOCSERGETLSR: /* Get line status register */
  1325. return get_lsr_info(info, (unsigned int *) arg);
  1326. #endif
  1327. /*
  1328.  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
  1329.  * - mask passed in arg for lines of interest
  1330.    *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
  1331.  * Caller should use TIOCGICOUNT to see which one it was
  1332.  */
  1333.  case TIOCMIWAIT:
  1334. #ifdef modem_control
  1335. cli();
  1336. /* note the counters on entry */
  1337. cprev = info->state->icount;
  1338. sti();
  1339. while (1) {
  1340. interruptible_sleep_on(&info->delta_msr_wait);
  1341. /* see if a signal did it */
  1342. if (signal_pending(current))
  1343. return -ERESTARTSYS;
  1344. cli();
  1345. cnow = info->state->icount; /* atomic copy */
  1346. sti();
  1347. if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
  1348.     cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
  1349. return -EIO; /* no change => error */
  1350. if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
  1351.      ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
  1352.      ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
  1353.      ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
  1354. return 0;
  1355. }
  1356. cprev = cnow;
  1357. }
  1358. /* NOTREACHED */
  1359. #else
  1360. return 0;
  1361. #endif
  1362. /* 
  1363.  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
  1364.  * Return: write counters to the user passed counter struct
  1365.  * NB: both 1->0 and 0->1 transitions are counted except for
  1366.  *     RI where only 0->1 is counted.
  1367.  */
  1368. case TIOCGICOUNT:
  1369. cli();
  1370. cnow = info->state->icount;
  1371. sti();
  1372. p_cuser = (struct serial_icounter_struct *) arg;
  1373. error = put_user(cnow.cts, &p_cuser->cts);
  1374. if (error) return error;
  1375. error = put_user(cnow.dsr, &p_cuser->dsr);
  1376. if (error) return error;
  1377. error = put_user(cnow.rng, &p_cuser->rng);
  1378. if (error) return error;
  1379. error = put_user(cnow.dcd, &p_cuser->dcd);
  1380. if (error) return error;
  1381. return 0;
  1382. default:
  1383. return -ENOIOCTLCMD;
  1384. }
  1385. return 0;
  1386. }
  1387. /* FIX UP modem control here someday......
  1388. */
  1389. static void rs_8xx_set_termios(struct tty_struct *tty, struct termios *old_termios)
  1390. {
  1391. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1392. if (   (tty->termios->c_cflag == old_termios->c_cflag)
  1393.     && (   RELEVANT_IFLAG(tty->termios->c_iflag) 
  1394. == RELEVANT_IFLAG(old_termios->c_iflag)))
  1395.   return;
  1396. change_speed(info);
  1397. #ifdef modem_control
  1398. /* Handle transition to B0 status */
  1399. if ((old_termios->c_cflag & CBAUD) &&
  1400.     !(tty->termios->c_cflag & CBAUD)) {
  1401. info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
  1402. cli();
  1403. serial_out(info, UART_MCR, info->MCR);
  1404. sti();
  1405. }
  1406. /* Handle transition away from B0 status */
  1407. if (!(old_termios->c_cflag & CBAUD) &&
  1408.     (tty->termios->c_cflag & CBAUD)) {
  1409. info->MCR |= UART_MCR_DTR;
  1410. if (!tty->hw_stopped ||
  1411.     !(tty->termios->c_cflag & CRTSCTS)) {
  1412. info->MCR |= UART_MCR_RTS;
  1413. }
  1414. cli();
  1415. serial_out(info, UART_MCR, info->MCR);
  1416. sti();
  1417. }
  1418. /* Handle turning off CRTSCTS */
  1419. if ((old_termios->c_cflag & CRTSCTS) &&
  1420.     !(tty->termios->c_cflag & CRTSCTS)) {
  1421. tty->hw_stopped = 0;
  1422. rs_8xx_start(tty);
  1423. }
  1424. #endif
  1425. #if 0
  1426. /*
  1427.  * No need to wake up processes in open wait, since they
  1428.  * sample the CLOCAL flag once, and don't recheck it.
  1429.  * XXX  It's not clear whether the current behavior is correct
  1430.  * or not.  Hence, this may change.....
  1431.  */
  1432. if (!(old_termios->c_cflag & CLOCAL) &&
  1433.     (tty->termios->c_cflag & CLOCAL))
  1434. wake_up_interruptible(&info->open_wait);
  1435. #endif
  1436. }
  1437. /*
  1438.  * ------------------------------------------------------------
  1439.  * rs_close()
  1440.  * 
  1441.  * This routine is called when the serial port gets closed.  First, we
  1442.  * wait for the last remaining data to be sent.  Then, we unlink its
  1443.  * async structure from the interrupt chain if necessary, and we free
  1444.  * that IRQ if nothing is left in the chain.
  1445.  * ------------------------------------------------------------
  1446.  */
  1447. static void rs_8xx_close(struct tty_struct *tty, struct file * filp)
  1448. {
  1449. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1450. struct serial_state *state;
  1451. unsigned long flags;
  1452. int idx;
  1453. volatile smc_t *smcp;
  1454. volatile scc_t *sccp;
  1455. if (!info || serial_paranoia_check(info, tty->device, "rs_close"))
  1456. return;
  1457. state = info->state;
  1458. save_flags(flags); cli();
  1459. if (tty_hung_up_p(filp)) {
  1460. DBG_CNT("before DEC-hung");
  1461. MOD_DEC_USE_COUNT;
  1462. restore_flags(flags);
  1463. return;
  1464. }
  1465. #ifdef SERIAL_DEBUG_OPEN
  1466. printk("rs_close ttys%d, count = %dn", info->line, state->count);
  1467. #endif
  1468. if ((tty->count == 1) && (state->count != 1)) {
  1469. /*
  1470.  * Uh, oh.  tty->count is 1, which means that the tty
  1471.  * structure will be freed.  state->count should always
  1472.  * be one in these conditions.  If it's greater than
  1473.  * one, we've got real problems, since it means the
  1474.  * serial port won't be shutdown.
  1475.  */
  1476. printk("rs_close: bad serial port count; tty->count is 1, "
  1477.        "state->count is %dn", state->count);
  1478. state->count = 1;
  1479. }
  1480. if (--state->count < 0) {
  1481. printk("rs_close: bad serial port count for ttys%d: %dn",
  1482.        info->line, state->count);
  1483. state->count = 0;
  1484. }
  1485. if (state->count) {
  1486. DBG_CNT("before DEC-2");
  1487. MOD_DEC_USE_COUNT;
  1488. restore_flags(flags);
  1489. return;
  1490. }
  1491. info->flags |= ASYNC_CLOSING;
  1492. /*
  1493.  * Save the termios structure, since this port may have
  1494.  * separate termios for callout and dialin.
  1495.  */
  1496. if (info->flags & ASYNC_NORMAL_ACTIVE)
  1497. info->state->normal_termios = *tty->termios;
  1498. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  1499. info->state->callout_termios = *tty->termios;
  1500. /*
  1501.  * Now we wait for the transmit buffer to clear; and we notify 
  1502.  * the line discipline to only process XON/XOFF characters.
  1503.  */
  1504. tty->closing = 1;
  1505. if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
  1506. tty_wait_until_sent(tty, info->closing_wait);
  1507. /*
  1508.  * At this point we stop accepting input.  To do this, we
  1509.  * disable the receive line status interrupts, and tell the
  1510.  * interrupt driver to stop checking the data ready bit in the
  1511.  * line status register.
  1512.  */
  1513. info->read_status_mask &= ~BD_SC_EMPTY;
  1514. if (info->flags & ASYNC_INITIALIZED) {
  1515. idx = PORT_NUM(info->state->smc_scc_num);
  1516. if (info->state->smc_scc_num & NUM_IS_SCC) {
  1517. sccp = &cpmp->cp_scc[idx];
  1518. sccp->scc_sccm &= ~UART_SCCM_RX;
  1519. sccp->scc_gsmrl &= ~SCC_GSMRL_ENR;
  1520. }
  1521. else {
  1522. smcp = &cpmp->cp_smc[idx];
  1523. smcp->smc_smcm &= ~SMCM_RX;
  1524. smcp->smc_smcmr &= ~SMCMR_REN;
  1525. }
  1526. /*
  1527.  * Before we drop DTR, make sure the UART transmitter
  1528.  * has completely drained; this is especially
  1529.  * important if there is a transmit FIFO!
  1530.  */
  1531. rs_8xx_wait_until_sent(tty, info->timeout);
  1532. }
  1533. shutdown(info);
  1534. if (tty->driver.flush_buffer)
  1535. tty->driver.flush_buffer(tty);
  1536. if (tty->ldisc.flush_buffer)
  1537. tty->ldisc.flush_buffer(tty);
  1538. tty->closing = 0;
  1539. info->event = 0;
  1540. info->tty = 0;
  1541. if (info->blocked_open) {
  1542. if (info->close_delay) {
  1543. current->state = TASK_INTERRUPTIBLE;
  1544. schedule_timeout(info->close_delay);
  1545. }
  1546. wake_up_interruptible(&info->open_wait);
  1547. }
  1548. info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|
  1549.  ASYNC_CLOSING);
  1550. wake_up_interruptible(&info->close_wait);
  1551. MOD_DEC_USE_COUNT;
  1552. restore_flags(flags);
  1553. }
  1554. /*
  1555.  * rs_wait_until_sent() --- wait until the transmitter is empty
  1556.  */
  1557. static void rs_8xx_wait_until_sent(struct tty_struct *tty, int timeout)
  1558. {
  1559. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1560. unsigned long orig_jiffies, char_time;
  1561. /*int lsr;*/
  1562. volatile cbd_t *bdp;
  1563. if (serial_paranoia_check(info, tty->device, "rs_wait_until_sent"))
  1564. return;
  1565. #ifdef maybe
  1566. if (info->state->type == PORT_UNKNOWN)
  1567. return;
  1568. #endif
  1569. orig_jiffies = jiffies;
  1570. /*
  1571.  * Set the check interval to be 1/5 of the estimated time to
  1572.  * send a single character, and make it at least 1.  The check
  1573.  * interval should also be less than the timeout.
  1574.  * 
  1575.  * Note: we have to use pretty tight timings here to satisfy
  1576.  * the NIST-PCTS.
  1577.  */
  1578. char_time = 1;
  1579. if (timeout)
  1580. char_time = MIN(char_time, timeout);
  1581. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1582. printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
  1583. printk("jiff=%lu...", jiffies);
  1584. #endif
  1585. /* We go through the loop at least once because we can't tell
  1586.  * exactly when the last character exits the shifter.  There can
  1587.  * be at least two characters waiting to be sent after the buffers
  1588.  * are empty.
  1589.  */
  1590. do {
  1591. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1592. printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
  1593. #endif
  1594. current->state = TASK_INTERRUPTIBLE;
  1595. /* current->counter = 0;  make us low-priority */
  1596. schedule_timeout(char_time);
  1597. if (signal_pending(current))
  1598. break;
  1599. if (timeout && time_after(jiffies, orig_jiffies + timeout))
  1600. break;
  1601. /* The 'tx_cur' is really the next buffer to send.  We
  1602.  * have to back up to the previous BD and wait for it
  1603.  * to go.  This isn't perfect, because all this indicates
  1604.  * is the buffer is available.  There are still characters
  1605.  * in the CPM FIFO.
  1606.  */
  1607. bdp = info->tx_cur;
  1608. if (bdp == info->tx_bd_base)
  1609. bdp += (TX_NUM_FIFO-1);
  1610. else
  1611. bdp--;
  1612. } while (bdp->cbd_sc & BD_SC_READY);
  1613. current->state = TASK_RUNNING;
  1614. #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  1615. printk("lsr = %d (jiff=%lu)...donen", lsr, jiffies);
  1616. #endif
  1617. }
  1618. /*
  1619.  * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
  1620.  */
  1621. static void rs_8xx_hangup(struct tty_struct *tty)
  1622. {
  1623. ser_info_t *info = (ser_info_t *)tty->driver_data;
  1624. struct serial_state *state = info->state;
  1625. if (serial_paranoia_check(info, tty->device, "rs_hangup"))
  1626. return;
  1627. state = info->state;
  1628. rs_8xx_flush_buffer(tty);
  1629. shutdown(info);
  1630. info->event = 0;
  1631. state->count = 0;
  1632. info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE);
  1633. info->tty = 0;
  1634. wake_up_interruptible(&info->open_wait);
  1635. }
  1636. /*
  1637.  * ------------------------------------------------------------
  1638.  * rs_open() and friends
  1639.  * ------------------------------------------------------------
  1640.  */
  1641. static int block_til_ready(struct tty_struct *tty, struct file * filp,
  1642.    ser_info_t *info)
  1643. {
  1644. #ifdef DO_THIS_LATER
  1645. DECLARE_WAITQUEUE(wait, current);
  1646. #endif
  1647. struct serial_state *state = info->state;
  1648. int retval;
  1649. int do_clocal = 0;
  1650. /*
  1651.  * If the device is in the middle of being closed, then block
  1652.  * until it's done, and then try again.
  1653.  */
  1654. if (tty_hung_up_p(filp) ||
  1655.     (info->flags & ASYNC_CLOSING)) {
  1656. if (info->flags & ASYNC_CLOSING)
  1657. interruptible_sleep_on(&info->close_wait);
  1658. #ifdef SERIAL_DO_RESTART
  1659. if (info->flags & ASYNC_HUP_NOTIFY)
  1660. return -EAGAIN;
  1661. else
  1662. return -ERESTARTSYS;
  1663. #else
  1664. return -EAGAIN;
  1665. #endif
  1666. }
  1667. /*
  1668.  * If this is a callout device, then just make sure the normal
  1669.  * device isn't being used.
  1670.  */
  1671. if (tty->driver.subtype == SERIAL_TYPE_CALLOUT) {
  1672. if (info->flags & ASYNC_NORMAL_ACTIVE)
  1673. return -EBUSY;
  1674. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1675.     (info->flags & ASYNC_SESSION_LOCKOUT) &&
  1676.     (info->session != current->session))
  1677.     return -EBUSY;
  1678. if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1679.     (info->flags & ASYNC_PGRP_LOCKOUT) &&
  1680.     (info->pgrp != current->pgrp))
  1681.     return -EBUSY;
  1682. info->flags |= ASYNC_CALLOUT_ACTIVE;
  1683. return 0;
  1684. }
  1685. /*
  1686.  * If non-blocking mode is set, or the port is not enabled,
  1687.  * then make the check up front and then exit.
  1688.  * If this is an SMC port, we don't have modem control to wait
  1689.  * for, so just get out here.
  1690.  */
  1691. if ((filp->f_flags & O_NONBLOCK) ||
  1692.     (tty->flags & (1 << TTY_IO_ERROR)) ||
  1693.     !(info->state->smc_scc_num & NUM_IS_SCC)) {
  1694. if (info->flags & ASYNC_CALLOUT_ACTIVE)
  1695. return -EBUSY;
  1696. info->flags |= ASYNC_NORMAL_ACTIVE;
  1697. return 0;
  1698. }
  1699. if (info->flags & ASYNC_CALLOUT_ACTIVE) {
  1700. if (state->normal_termios.c_cflag & CLOCAL)
  1701. do_clocal = 1;
  1702. } else {
  1703. if (tty->termios->c_cflag & CLOCAL)
  1704. do_clocal = 1;
  1705. }
  1706. /*
  1707.  * Block waiting for the carrier detect and the line to become
  1708.  * free (i.e., not in use by the callout).  While we are in
  1709.  * this loop, state->count is dropped by one, so that
  1710.  * rs_close() knows when to free things.  We restore it upon
  1711.  * exit, either normal or abnormal.
  1712.  */
  1713. retval = 0;
  1714. #ifdef DO_THIS_LATER
  1715. add_wait_queue(&info->open_wait, &wait);
  1716. #ifdef SERIAL_DEBUG_OPEN
  1717. printk("block_til_ready before block: ttys%d, count = %dn",
  1718.        state->line, state->count);
  1719. #endif
  1720. cli();
  1721. if (!tty_hung_up_p(filp)) 
  1722. state->count--;
  1723. sti();
  1724. info->blocked_open++;
  1725. while (1) {
  1726. cli();
  1727. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1728.     (tty->termios->c_cflag & CBAUD))
  1729. serial_out(info, UART_MCR,
  1730.    serial_inp(info, UART_MCR) |
  1731.    (UART_MCR_DTR | UART_MCR_RTS));
  1732. sti();
  1733. set_current_state(TASK_INTERRUPTIBLE);
  1734. if (tty_hung_up_p(filp) ||
  1735.     !(info->flags & ASYNC_INITIALIZED)) {
  1736. #ifdef SERIAL_DO_RESTART
  1737. if (info->flags & ASYNC_HUP_NOTIFY)
  1738. retval = -EAGAIN;
  1739. else
  1740. retval = -ERESTARTSYS;
  1741. #else
  1742. retval = -EAGAIN;
  1743. #endif
  1744. break;
  1745. }
  1746. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  1747.     !(info->flags & ASYNC_CLOSING) &&
  1748.     (do_clocal || (serial_in(info, UART_MSR) &
  1749.    UART_MSR_DCD)))
  1750. break;
  1751. if (signal_pending(current)) {
  1752. retval = -ERESTARTSYS;
  1753. break;
  1754. }
  1755. #ifdef SERIAL_DEBUG_OPEN
  1756. printk("block_til_ready blocking: ttys%d, count = %dn",
  1757.        info->line, state->count);
  1758. #endif
  1759. schedule();
  1760. }
  1761. current->state = TASK_RUNNING;
  1762. remove_wait_queue(&info->open_wait, &wait);
  1763. if (!tty_hung_up_p(filp))
  1764. state->count++;
  1765. info->blocked_open--;
  1766. #ifdef SERIAL_DEBUG_OPEN
  1767. printk("block_til_ready after blocking: ttys%d, count = %dn",
  1768.        info->line, state->count);
  1769. #endif
  1770. #endif /* DO_THIS_LATER */
  1771. if (retval)
  1772. return retval;
  1773. info->flags |= ASYNC_NORMAL_ACTIVE;
  1774. return 0;
  1775. }
  1776. static int get_async_struct(int line, ser_info_t **ret_info)
  1777. {
  1778. struct serial_state *sstate;
  1779. sstate = rs_table + line;
  1780. if (sstate->info) {
  1781. sstate->count++;
  1782. *ret_info = (ser_info_t *)sstate->info;
  1783. return 0;
  1784. }
  1785. else {
  1786. return -ENOMEM;
  1787. }
  1788. }
  1789. /*
  1790.  * This routine is called whenever a serial port is opened.  It
  1791.  * enables interrupts for a serial port, linking in its async structure into
  1792.  * the IRQ chain.   It also performs the serial-specific
  1793.  * initialization for the tty structure.
  1794.  */
  1795. static int rs_8xx_open(struct tty_struct *tty, struct file * filp)
  1796. {
  1797. ser_info_t *info;
  1798. int  retval, line;
  1799. line = MINOR(tty->device) - tty->driver.minor_start;
  1800. if ((line < 0) || (line >= NR_PORTS))
  1801. return -ENODEV;
  1802. retval = get_async_struct(line, &info);
  1803. if (retval)
  1804. return retval;
  1805. if (serial_paranoia_check(info, tty->device, "rs_open"))
  1806. return -ENODEV;
  1807. #ifdef SERIAL_DEBUG_OPEN
  1808. printk("rs_open %s%d, count = %dn", tty->driver.name, info->line,
  1809.        info->state->count);
  1810. #endif
  1811. tty->driver_data = info;
  1812. info->tty = tty;
  1813. /*
  1814.  * Start up serial port
  1815.  */
  1816. retval = startup(info);
  1817. if (retval)
  1818. return retval;
  1819. MOD_INC_USE_COUNT;
  1820. retval = block_til_ready(tty, filp, info);
  1821. if (retval) {
  1822. #ifdef SERIAL_DEBUG_OPEN
  1823. printk("rs_open returning after block_til_ready with %dn",
  1824.        retval);
  1825. #endif
  1826. MOD_DEC_USE_COUNT;
  1827. return retval;
  1828. }
  1829. if ((info->state->count == 1) &&
  1830.     (info->flags & ASYNC_SPLIT_TERMIOS)) {
  1831. if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
  1832. *tty->termios = info->state->normal_termios;
  1833. else 
  1834. *tty->termios = info->state->callout_termios;
  1835. change_speed(info);
  1836. }
  1837. info->session = current->session;
  1838. info->pgrp = current->pgrp;
  1839. #ifdef SERIAL_DEBUG_OPEN
  1840. printk("rs_open ttys%d successful...", info->line);
  1841. #endif
  1842. return 0;
  1843. }
  1844. /*
  1845.  * /proc fs routines....
  1846.  */
  1847. static int inline line_info(char *buf, struct serial_state *state)
  1848. {
  1849. #ifdef notdef
  1850. struct async_struct *info = state->info, scr_info;
  1851. char stat_buf[30], control, status;
  1852. #endif
  1853. int ret;
  1854. ret = sprintf(buf, "%d: uart:%s port:%X irq:%d",
  1855.       state->line,
  1856.       (state->smc_scc_num & NUM_IS_SCC) ? "SCC" : "SMC",
  1857.       (unsigned int)(state->port), state->irq);
  1858. if (!state->port || (state->type == PORT_UNKNOWN)) {
  1859. ret += sprintf(buf+ret, "n");
  1860. return ret;
  1861. }
  1862. #ifdef notdef
  1863. /*
  1864.  * Figure out the current RS-232 lines
  1865.  */
  1866. if (!info) {
  1867. info = &scr_info; /* This is just for serial_{in,out} */
  1868. info->magic = SERIAL_MAGIC;
  1869. info->port = state->port;
  1870. info->flags = state->flags;
  1871. info->quot = 0;
  1872. info->tty = 0;
  1873. }
  1874. cli();
  1875. status = serial_in(info, UART_MSR);
  1876. control = info ? info->MCR : serial_in(info, UART_MCR);
  1877. sti();
  1878. stat_buf[0] = 0;
  1879. stat_buf[1] = 0;
  1880. if (control & UART_MCR_RTS)
  1881. strcat(stat_buf, "|RTS");
  1882. if (status & UART_MSR_CTS)
  1883. strcat(stat_buf, "|CTS");
  1884. if (control & UART_MCR_DTR)
  1885. strcat(stat_buf, "|DTR");
  1886. if (status & UART_MSR_DSR)
  1887. strcat(stat_buf, "|DSR");
  1888. if (status & UART_MSR_DCD)
  1889. strcat(stat_buf, "|CD");
  1890. if (status & UART_MSR_RI)
  1891. strcat(stat_buf, "|RI");
  1892. if (info->quot) {
  1893. ret += sprintf(buf+ret, " baud:%d",
  1894.        state->baud_base / info->quot);
  1895. }
  1896. ret += sprintf(buf+ret, " tx:%d rx:%d",
  1897.       state->icount.tx, state->icount.rx);
  1898. if (state->icount.frame)
  1899. ret += sprintf(buf+ret, " fe:%d", state->icount.frame);
  1900. if (state->icount.parity)
  1901. ret += sprintf(buf+ret, " pe:%d", state->icount.parity);
  1902. if (state->icount.brk)
  1903. ret += sprintf(buf+ret, " brk:%d", state->icount.brk);
  1904. if (state->icount.overrun)
  1905. ret += sprintf(buf+ret, " oe:%d", state->icount.overrun);
  1906. /*
  1907.  * Last thing is the RS-232 status lines
  1908.  */
  1909. ret += sprintf(buf+ret, " %sn", stat_buf+1);
  1910. #endif
  1911. return ret;
  1912. }
  1913. int rs_8xx_read_proc(char *page, char **start, off_t off, int count,
  1914.  int *eof, void *data)
  1915. {
  1916. int i, len = 0;
  1917. off_t begin = 0;
  1918. len += sprintf(page, "serinfo:1.0 driver:%sn", serial_version);
  1919. for (i = 0; i < NR_PORTS && len < 4000; i++) {
  1920. len += line_info(page + len, &rs_table[i]);
  1921. if (len+begin > off+count)
  1922. goto done;
  1923. if (len+begin < off) {
  1924. begin += len;
  1925. len = 0;
  1926. }
  1927. }
  1928. *eof = 1;
  1929. done:
  1930. if (off >= len+begin)
  1931. return 0;
  1932. *start = page + (begin-off);
  1933. return ((count < begin+len-off) ? count : begin+len-off);
  1934. }
  1935. /*
  1936.  * ---------------------------------------------------------------------
  1937.  * rs_init() and friends
  1938.  *
  1939.  * rs_init() is called at boot-time to initialize the serial driver.
  1940.  * ---------------------------------------------------------------------
  1941.  */
  1942. /*
  1943.  * This routine prints out the appropriate serial driver version
  1944.  * number, and identifies which options were configured into this
  1945.  * driver.
  1946.  */
  1947. static _INLINE_ void show_serial_version(void)
  1948. {
  1949.   printk(KERN_INFO "%s version %sn", serial_name, serial_version);
  1950. }
  1951. /*
  1952.  * The serial console driver used during boot.  Note that these names
  1953.  * clash with those found in "serial.c", so we currently can't support
  1954.  * the 16xxx uarts and these at the same time.  I will fix this to become
  1955.  * an indirect function call from tty_io.c (or something).
  1956.  */
  1957. #ifdef CONFIG_SERIAL_CONSOLE
  1958. /*
  1959.  * Print a string to the serial port trying not to disturb any possible
  1960.  * real use of the port...
  1961.  */
  1962. static void my_console_write(int idx, const char *s,
  1963. unsigned count)
  1964. {
  1965. struct serial_state *ser;
  1966. ser_info_t *info;
  1967. unsigned i;
  1968. volatile cbd_t *bdp, *bdbase;
  1969. volatile smc_uart_t *up;
  1970. volatile u_char *cp;
  1971. ser = rs_table + idx;
  1972. /* If the port has been initialized for general use, we have
  1973.  * to use the buffer descriptors allocated there.  Otherwise,
  1974.  * we simply use the single buffer allocated.
  1975.  */
  1976. if ((info = (ser_info_t *)ser->info) != NULL) {
  1977. bdp = info->tx_cur;
  1978. bdbase = info->tx_bd_base;
  1979. }
  1980. else {
  1981. /* Pointer to UART in parameter ram.
  1982. */
  1983. up = (smc_uart_t *)&cpmp->cp_dparam[ser->port];
  1984. /* Get the address of the host memory buffer.
  1985.  */
  1986. bdp = bdbase = (cbd_t *)&cpmp->cp_dpmem[up->smc_tbase];
  1987. }
  1988. /*
  1989.  * We need to gracefully shut down the transmitter, disable
  1990.  * interrupts, then send our bytes out.
  1991.  */
  1992. /*
  1993.  * Now, do each character.  This is not as bad as it looks
  1994.  * since this is a holding FIFO and not a transmitting FIFO.
  1995.  * We could add the complexity of filling the entire transmit
  1996.  * buffer, but we would just wait longer between accesses......
  1997.  */
  1998. for (i = 0; i < count; i++, s++) {
  1999. /* Wait for transmitter fifo to empty.
  2000.  * Ready indicates output is ready, and xmt is doing
  2001.  * that, not that it is ready for us to send.
  2002.  */
  2003. while (bdp->cbd_sc & BD_SC_READY);
  2004. /* Send the character out.
  2005.  * If the buffer address is in the CPM DPRAM, don't
  2006.  * convert it.
  2007.  */
  2008. if ((uint)(bdp->cbd_bufaddr) > (uint)IMAP_ADDR)
  2009. cp = (u_char *)(bdp->cbd_bufaddr);
  2010. else
  2011. cp = __va(bdp->cbd_bufaddr);
  2012. *cp = *s;
  2013. bdp->cbd_datlen = 1;
  2014. bdp->cbd_sc |= BD_SC_READY;
  2015. if (bdp->cbd_sc & BD_SC_WRAP)
  2016. bdp = bdbase;
  2017. else
  2018. bdp++;
  2019. /* if a LF, also do CR... */
  2020. if (*s == 10) {
  2021. while (bdp->cbd_sc & BD_SC_READY);
  2022. cp = __va(bdp->cbd_bufaddr);
  2023. *cp = 13;
  2024. bdp->cbd_datlen = 1;
  2025. bdp->cbd_sc |= BD_SC_READY;
  2026. if (bdp->cbd_sc & BD_SC_WRAP) {
  2027. bdp = bdbase;
  2028. }
  2029. else {
  2030. bdp++;
  2031. }
  2032. }
  2033. }
  2034. /*
  2035.  * Finally, Wait for transmitter & holding register to empty
  2036.  *  and restore the IER
  2037.  */
  2038. while (bdp->cbd_sc & BD_SC_READY);
  2039. if (info)
  2040. info->tx_cur = (cbd_t *)bdp;
  2041. }
  2042. static void serial_console_write(struct console *c, const char *s,
  2043. unsigned count)
  2044. {
  2045. #ifdef CONFIG_KGDB
  2046. /* Try to let stub handle output. Returns true if it did. */ 
  2047. if (kgdb_output_string(s, count))
  2048. return;
  2049. #endif
  2050. my_console_write(c->index, s, count);
  2051. }
  2052. #ifdef CONFIG_XMON
  2053. int
  2054. xmon_8xx_write(const char *s, unsigned count)
  2055. {
  2056. my_console_write(0, s, count);
  2057. return(count);
  2058. }
  2059. #endif
  2060. #ifdef CONFIG_KGDB
  2061. void
  2062. putDebugChar(char ch)
  2063. {
  2064. my_console_write(0, &ch, 1);
  2065. }
  2066. #endif
  2067. /*
  2068.  * Receive character from the serial port.  This only works well
  2069.  * before the port is initialized for real use.
  2070.  */
  2071. static int my_console_wait_key(int idx, int xmon, char *obuf)
  2072. {
  2073. struct serial_state *ser;
  2074. u_char c, *cp;
  2075. ser_info_t *info;
  2076. volatile cbd_t *bdp;
  2077. volatile smc_uart_t *up;
  2078. int i;
  2079. ser = rs_table + idx;
  2080. /* Pointer to UART in parameter ram.
  2081. */
  2082. up = (smc_uart_t *)&cpmp->cp_dparam[ser->port];
  2083. /* Get the address of the host memory buffer.
  2084.  * If the port has been initialized for general use, we must
  2085.  * use information from the port structure.
  2086.  */
  2087. if ((info = (ser_info_t *)ser->info))
  2088. bdp = info->rx_cur;
  2089. else
  2090. bdp = (cbd_t *)&cpmp->cp_dpmem[up->smc_rbase];
  2091. /*
  2092.  * We need to gracefully shut down the receiver, disable
  2093.  * interrupts, then read the input.
  2094.  * XMON just wants a poll.  If no character, return -1, else
  2095.  * return the character.
  2096.  */
  2097. if (!xmon) {
  2098. while (bdp->cbd_sc & BD_SC_EMPTY);
  2099. }
  2100. else {
  2101. if (bdp->cbd_sc & BD_SC_EMPTY)
  2102. return -1;
  2103. }
  2104. /* If the buffer address is in the CPM DPRAM, don't
  2105.  * convert it.
  2106.  */
  2107. if ((uint)(bdp->cbd_bufaddr) > (uint)IMAP_ADDR)
  2108. cp = (u_char *)(bdp->cbd_bufaddr);
  2109. else
  2110. cp = __va(bdp->cbd_bufaddr);
  2111. if (obuf) {
  2112. i = c = bdp->cbd_datlen;
  2113. while (i-- > 0)
  2114. *obuf++ = *cp++;
  2115. }
  2116. else {
  2117. c = *cp;
  2118. }
  2119. bdp->cbd_sc |= BD_SC_EMPTY;
  2120. if (info) {
  2121. if (bdp->cbd_sc & BD_SC_WRAP) {
  2122. bdp = info->rx_bd_base;
  2123. }
  2124. else {
  2125. bdp++;
  2126. }
  2127. info->rx_cur = (cbd_t *)bdp;
  2128. }
  2129. return((int)c);
  2130. }
  2131. #ifdef CONFIG_XMON
  2132. int
  2133. xmon_8xx_read_poll(void)
  2134. {
  2135. return(my_console_wait_key(0, 1, NULL));
  2136. }
  2137. int
  2138. xmon_8xx_read_char(void)
  2139. {
  2140. return(my_console_wait_key(0, 0, NULL));
  2141. }
  2142. #endif
  2143. #ifdef CONFIG_KGDB
  2144. static char kgdb_buf[RX_BUF_SIZE], *kgdp;
  2145. static int kgdb_chars;
  2146. unsigned char
  2147. getDebugChar(void)
  2148. {
  2149. if (kgdb_chars <= 0) {
  2150. kgdb_chars = my_console_wait_key(0, 0, kgdb_buf);
  2151. kgdp = kgdb_buf;
  2152. }
  2153. kgdb_chars--;
  2154. return(*kgdp++);
  2155. }
  2156. void kgdb_interruptible(int state)
  2157. {
  2158. }
  2159. void kgdb_map_scc(void)
  2160. {
  2161. struct serial_state *ser;
  2162. uint mem_addr;
  2163. volatile cbd_t *bdp;
  2164. volatile smc_uart_t *up;
  2165. cpmp = (cpm8xx_t *)&(((immap_t *)IMAP_ADDR)->im_cpm);
  2166. /* To avoid data cache CPM DMA coherency problems, allocate a
  2167.  * buffer in the CPM DPRAM.  This will work until the CPM and
  2168.  * serial ports are initialized.  At that time a memory buffer
  2169.  * will be allocated.
  2170.  * The port is already initialized from the boot procedure, all
  2171.  * we do here is give it a different buffer and make it a FIFO.
  2172.  */
  2173. ser = rs_table;
  2174. /* Right now, assume we are using SMCs.
  2175. */
  2176. up = (smc_uart_t *)&cpmp->cp_dparam[ser->port];
  2177. /* Allocate space for an input FIFO, plus a few bytes for output.
  2178.  * Allocate bytes to maintain word alignment.
  2179.  */
  2180. mem_addr = (uint)(&cpmp->cp_dpmem[0x1000]);
  2181. /* Set the physical address of the host memory buffers in
  2182.  * the buffer descriptors.
  2183.  */
  2184. bdp = (cbd_t *)&cpmp->cp_dpmem[up->smc_rbase];
  2185. bdp->cbd_bufaddr = mem_addr;
  2186. bdp = (cbd_t *)&cpmp->cp_dpmem[up->smc_tbase];
  2187. bdp->cbd_bufaddr = mem_addr+RX_BUF_SIZE;
  2188. up->smc_mrblr = RX_BUF_SIZE; /* receive buffer length */
  2189. up->smc_maxidl = RX_BUF_SIZE;
  2190. }
  2191. #endif
  2192. static kdev_t serial_console_device(struct console *c)
  2193. {
  2194. return MKDEV(TTY_MAJOR, 64 + c->index);
  2195. }
  2196. /*
  2197.  * Register console.
  2198.  */
  2199. long __init console_8xx_init(long kmem_start, long kmem_end)
  2200. {
  2201. register_console(&sercons);
  2202. return kmem_start;
  2203. }
  2204. #endif
  2205. /* Index in baud rate table of the default console baud rate.
  2206. */
  2207. static int baud_idx;
  2208. /*
  2209.  * The serial driver boot-time initialization code!
  2210.  */
  2211. int __init rs_8xx_init(void)
  2212. {
  2213. struct serial_state * state;
  2214. ser_info_t *info;
  2215. uint mem_addr, dp_addr, iobits;
  2216. int i, j, idx;
  2217. ushort chan;
  2218. volatile cbd_t *bdp;
  2219. volatile cpm8xx_t *cp;
  2220. volatile smc_t *sp;
  2221. volatile smc_uart_t *up;
  2222. volatile scc_t *scp;
  2223. volatile scc_uart_t *sup;
  2224. volatile immap_t *immap;
  2225. init_bh(SERIAL_BH, do_serial_bh);
  2226. show_serial_version();
  2227. /* Initialize the tty_driver structure */
  2228. __clear_user(&serial_driver,sizeof(struct tty_driver));
  2229. serial_driver.magic = TTY_DRIVER_MAGIC;
  2230. serial_driver.driver_name = "serial";
  2231. #ifdef CONFIG_DEVFS_FS
  2232. serial_driver.name = "tts/%d";
  2233. #else
  2234. serial_driver.name = "ttyS";
  2235. #endif
  2236. serial_driver.major = TTY_MAJOR;
  2237. serial_driver.minor_start = 64;
  2238. serial_driver.num = NR_PORTS;
  2239. serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
  2240. serial_driver.subtype = SERIAL_TYPE_NORMAL;
  2241. serial_driver.init_termios = tty_std_termios;
  2242. serial_driver.init_termios.c_cflag =
  2243. baud_idx | CS8 | CREAD | HUPCL | CLOCAL;
  2244. serial_driver.flags = TTY_DRIVER_REAL_RAW;
  2245. serial_driver.refcount = &serial_refcount;
  2246. serial_driver.table = serial_table;
  2247. serial_driver.termios = serial_termios;
  2248. serial_driver.termios_locked = serial_termios_locked;
  2249. serial_driver.open = rs_8xx_open;
  2250. serial_driver.close = rs_8xx_close;
  2251. serial_driver.write = rs_8xx_write;
  2252. serial_driver.put_char = rs_8xx_put_char;
  2253. serial_driver.write_room = rs_8xx_write_room;
  2254. serial_driver.chars_in_buffer = rs_8xx_chars_in_buffer;
  2255. serial_driver.flush_buffer = rs_8xx_flush_buffer;
  2256. serial_driver.ioctl = rs_8xx_ioctl;
  2257. serial_driver.throttle = rs_8xx_throttle;
  2258. serial_driver.unthrottle = rs_8xx_unthrottle;
  2259. serial_driver.send_xchar = rs_8xx_send_xchar;
  2260. serial_driver.set_termios = rs_8xx_set_termios;
  2261. serial_driver.stop = rs_8xx_stop;
  2262. serial_driver.start = rs_8xx_start;
  2263. serial_driver.hangup = rs_8xx_hangup;
  2264. serial_driver.wait_until_sent = rs_8xx_wait_until_sent;
  2265. serial_driver.read_proc = rs_8xx_read_proc;
  2266. /*
  2267.  * The callout device is just like normal device except for
  2268.  * major number and the subtype code.
  2269.  */
  2270. callout_driver = serial_driver;
  2271. #ifdef CONFIG_DEVFS_FS
  2272. callout_driver.name = "cua/%d";
  2273. #else
  2274. callout_driver.name = "cua";
  2275. #endif
  2276. callout_driver.major = TTYAUX_MAJOR;
  2277. callout_driver.subtype = SERIAL_TYPE_CALLOUT;
  2278. callout_driver.read_proc = 0;
  2279. callout_driver.proc_entry = 0;
  2280. if (tty_register_driver(&serial_driver))
  2281. panic("Couldn't register serial drivern");
  2282. if (tty_register_driver(&callout_driver))
  2283. panic("Couldn't register callout drivern");
  2284. cp = cpmp; /* Get pointer to Communication Processor */
  2285. immap = (immap_t *)IMAP_ADDR; /* and to internal registers */
  2286. /* Configure SCC2, SCC3, and SCC4 instead of port A parallel I/O.
  2287.  */
  2288. #ifdef CONFIG_USE_SCC_IO
  2289. #ifndef CONFIG_MBX
  2290. /* The "standard" configuration through the 860.
  2291. */
  2292. immap->im_ioport.iop_papar |= 0x00fc;
  2293. immap->im_ioport.iop_padir &= ~0x00fc;
  2294. immap->im_ioport.iop_paodr &= ~0x00fc;
  2295. #else
  2296. /* On the MBX, SCC3 is through Port D.
  2297. */
  2298. immap->im_ioport.iop_papar |= 0x000c; /* SCC2 on port A */
  2299. immap->im_ioport.iop_padir &= ~0x000c;
  2300. immap->im_ioport.iop_paodr &= ~0x000c;
  2301. immap->im_ioport.iop_pdpar |= 0x0030; /* SCC3 on port D */
  2302. #endif
  2303. /* Since we don't yet do modem control, connect the port C pins
  2304.  * as general purpose I/O.  This will assert CTS and CD for the
  2305.  * SCC ports.
  2306.  */
  2307. immap->im_ioport.iop_pcdir |= 0x03c6;
  2308. immap->im_ioport.iop_pcpar &= ~0x03c6;
  2309. /* Connect SCC2 and SCC3 to NMSI.  Connect BRG3 to SCC2 and
  2310.  * BRG4 to SCC3.
  2311.  */
  2312. cp->cp_sicr &= ~0x00ffff00;
  2313. cp->cp_sicr |= 0x001b1200;
  2314. #ifdef CONFIG_PP04
  2315. /* Frequentis PP04 forced to RS-232 until we know better.
  2316.  * Port C 12 and 13 low enables RS-232 on SCC3 and SCC4.
  2317.  */
  2318. immap->im_ioport.iop_pcdir |= 0x000c;
  2319. immap->im_ioport.iop_pcpar &= ~0x000c;
  2320. immap->im_ioport.iop_pcdat &= ~0x000c;
  2321. /* This enables the TX driver.
  2322. */
  2323. cp->cp_pbpar &= ~0x6000;
  2324. cp->cp_pbdat &= ~0x6000;
  2325. #endif
  2326. #endif
  2327. for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) {
  2328. state->magic = SSTATE_MAGIC;
  2329. state->line = i;
  2330. state->type = PORT_UNKNOWN;
  2331. state->custom_divisor = 0;
  2332. state->close_delay = 5*HZ/10;
  2333. state->closing_wait = 30*HZ;
  2334. state->callout_termios = callout_driver.init_termios;
  2335. state->normal_termios = serial_driver.init_termios;
  2336. state->icount.cts = state->icount.dsr = 
  2337. state->icount.rng = state->icount.dcd = 0;
  2338. state->icount.rx = state->icount.tx = 0;
  2339. state->icount.frame = state->icount.parity = 0;
  2340. state->icount.overrun = state->icount.brk = 0;
  2341. printk(KERN_INFO "ttyS%02d at 0x%04x is a %sn",
  2342.        i, (unsigned int)(state->port),
  2343.        (state->smc_scc_num & NUM_IS_SCC) ? "SCC" : "SMC");
  2344. #ifdef CONFIG_SERIAL_CONSOLE
  2345. /* If we just printed the message on the console port, and
  2346.  * we are about to initialize it for general use, we have
  2347.  * to wait a couple of character times for the CR/NL to
  2348.  * make it out of the transmit buffer.
  2349.  */
  2350. if (i == CONFIG_SERIAL_CONSOLE_PORT)
  2351. mdelay(2);
  2352. #endif
  2353. info = kmalloc(sizeof(ser_info_t), GFP_KERNEL);
  2354. if (info) {
  2355. __clear_user(info,sizeof(ser_info_t));
  2356. init_waitqueue_head(&info->open_wait);
  2357. init_waitqueue_head(&info->close_wait);
  2358. info->magic = SERIAL_MAGIC;
  2359. info->flags = state->flags;
  2360. info->tqueue.routine = do_softint;
  2361. info->tqueue.data = info;
  2362. info->tqueue_hangup.routine = do_serial_hangup;
  2363. info->tqueue_hangup.data = info;
  2364. info->line = i;
  2365. info->state = state;
  2366. state->info = (struct async_struct *)info;
  2367. /* We need to allocate a transmit and receive buffer
  2368.  * descriptors from dual port ram, and a character
  2369.  * buffer area from host mem.
  2370.  */
  2371. dp_addr = m8xx_cpm_dpalloc(sizeof(cbd_t) * RX_NUM_FIFO);
  2372. /* Allocate space for FIFOs in the host memory.
  2373. */
  2374. mem_addr = m8xx_cpm_hostalloc(RX_NUM_FIFO * RX_BUF_SIZE);
  2375. /* Set the physical address of the host memory
  2376.  * buffers in the buffer descriptors, and the
  2377.  * virtual address for us to work with.
  2378.  */
  2379. bdp = (cbd_t *)&cp->cp_dpmem[dp_addr];
  2380. info->rx_cur = info->rx_bd_base = (cbd_t *)bdp;
  2381. for (j=0; j<(RX_NUM_FIFO-1); j++) {
  2382. bdp->cbd_bufaddr = __pa(mem_addr);
  2383. bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT;
  2384. mem_addr += RX_BUF_SIZE;
  2385. bdp++;
  2386. }
  2387. bdp->cbd_bufaddr = __pa(mem_addr);
  2388. bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT;
  2389. idx = PORT_NUM(info->state->smc_scc_num);
  2390. if (info->state->smc_scc_num & NUM_IS_SCC) {
  2391. scp = &cp->cp_scc[idx];
  2392. sup = (scc_uart_t *)&cp->cp_dparam[state->port];
  2393. sup->scc_genscc.scc_rbase = dp_addr;
  2394. }
  2395. else {
  2396. sp = &cp->cp_smc[idx];
  2397. up = (smc_uart_t *)&cp->cp_dparam[state->port];
  2398. up->smc_rbase = dp_addr;
  2399. }
  2400. dp_addr = m8xx_cpm_dpalloc(sizeof(cbd_t) * TX_NUM_FIFO);
  2401. /* Allocate space for FIFOs in the host memory.
  2402. */
  2403. mem_addr = m8xx_cpm_hostalloc(TX_NUM_FIFO * TX_BUF_SIZE);
  2404. /* Set the physical address of the host memory
  2405.  * buffers in the buffer descriptors, and the
  2406.  * virtual address for us to work with.
  2407.  */
  2408. bdp = (cbd_t *)&cp->cp_dpmem[dp_addr];
  2409. info->tx_cur = info->tx_bd_base = (cbd_t *)bdp;
  2410. for (j=0; j<(TX_NUM_FIFO-1); j++) {
  2411. bdp->cbd_bufaddr = __pa(mem_addr);
  2412. bdp->cbd_sc = BD_SC_INTRPT;
  2413. mem_addr += TX_BUF_SIZE;
  2414. bdp++;
  2415. }
  2416. bdp->cbd_bufaddr = __pa(mem_addr);
  2417. bdp->cbd_sc = (BD_SC_WRAP | BD_SC_INTRPT);
  2418. if (info->state->smc_scc_num & NUM_IS_SCC) {
  2419. sup->scc_genscc.scc_tbase = dp_addr;
  2420. /* Set up the uart parameters in the
  2421.  * parameter ram.
  2422.  */
  2423. sup->scc_genscc.scc_rfcr = SMC_EB;
  2424. sup->scc_genscc.scc_tfcr = SMC_EB;
  2425. /* Set this to 1 for now, so we get single
  2426.  * character interrupts.  Using idle charater
  2427.  * time requires some additional tuning.
  2428.  */
  2429. sup->scc_genscc.scc_mrblr = 1;
  2430. sup->scc_maxidl = 0;
  2431. sup->scc_brkcr = 1;
  2432. sup->scc_parec = 0;
  2433. sup->scc_frmec = 0;
  2434. sup->scc_nosec = 0;
  2435. sup->scc_brkec = 0;
  2436. sup->scc_uaddr1 = 0;
  2437. sup->scc_uaddr2 = 0;
  2438. sup->scc_toseq = 0;
  2439. sup->scc_char1 = 0x8000;
  2440. sup->scc_char2 = 0x8000;
  2441. sup->scc_char3 = 0x8000;
  2442. sup->scc_char4 = 0x8000;
  2443. sup->scc_char5 = 0x8000;
  2444. sup->scc_char6 = 0x8000;
  2445. sup->scc_char7 = 0x8000;
  2446. sup->scc_char8 = 0x8000;
  2447. sup->scc_rccm = 0xc0ff;
  2448. /* Send the CPM an initialize command.
  2449. */
  2450. chan = scc_chan_map[idx];
  2451. cp->cp_cpcr = mk_cr_cmd(chan,
  2452. CPM_CR_INIT_TRX) | CPM_CR_FLG;
  2453. while (cp->cp_cpcr & CPM_CR_FLG);
  2454. /* Set UART mode, 8 bit, no parity, one stop.
  2455.  * Enable receive and transmit.
  2456.  */
  2457. scp->scc_gsmrh = 0;
  2458. scp->scc_gsmrl = 
  2459. (SCC_GSMRL_MODE_UART | SCC_GSMRL_TDCR_16 | SCC_GSMRL_RDCR_16);
  2460. /* Disable all interrupts and clear all pending
  2461.  * events.
  2462.  */
  2463. scp->scc_sccm = 0;
  2464. scp->scc_scce = 0xffff;
  2465. scp->scc_dsr = 0x7e7e;
  2466. scp->scc_pmsr = 0x3000;
  2467. /* If the port is the console, enable Rx and Tx.
  2468. */
  2469. #ifdef CONFIG_SERIAL_CONSOLE
  2470. if (i == CONFIG_SERIAL_CONSOLE_PORT)
  2471. scp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  2472. #endif
  2473. }
  2474. else {
  2475. /* Configure SMCs Tx/Rx instead of port B
  2476.  * parallel I/O.  On 823/850 these are on
  2477.  * port A for SMC2.
  2478.  */
  2479. #ifndef CONFIG_ALTSMC2
  2480. iobits = 0xc0 << (idx * 4);
  2481. cp->cp_pbpar |= iobits;
  2482. cp->cp_pbdir &= ~iobits;
  2483. cp->cp_pbodr &= ~iobits;
  2484. #else
  2485. iobits = 0xc0;
  2486. if (idx == 0) {
  2487. /* SMC1 on Port B, like all 8xx.
  2488. */
  2489. cp->cp_pbpar |= iobits;
  2490. cp->cp_pbdir &= ~iobits;
  2491. cp->cp_pbodr &= ~iobits;
  2492. }
  2493. else {
  2494. /* SMC2 is on Port A.
  2495. */
  2496. immap->im_ioport.iop_papar |= iobits;
  2497. immap->im_ioport.iop_padir &= ~iobits;
  2498. immap->im_ioport.iop_paodr &= ~iobits;
  2499. }
  2500. #endif /* CONFIG_ALTSMC2 */
  2501. /* Connect the baud rate generator to the
  2502.  * SMC based upon index in rs_table.  Also
  2503.  * make sure it is connected to NMSI.
  2504.  */
  2505. cp->cp_simode &= ~(0xffff << (idx * 16));
  2506. cp->cp_simode |= (i << ((idx * 16) + 12));
  2507. up->smc_tbase = dp_addr;
  2508. /* Set up the uart parameters in the
  2509.  * parameter ram.
  2510.  */
  2511. up->smc_rfcr = SMC_EB;
  2512. up->smc_tfcr = SMC_EB;
  2513. /* Set this to 1 for now, so we get single
  2514.  * character interrupts.  Using idle charater
  2515.  * time requires some additional tuning.
  2516.  */
  2517. up->smc_mrblr = 1;
  2518. up->smc_maxidl = 0;
  2519. up->smc_brkcr = 1;
  2520. /* Send the CPM an initialize command.
  2521. */
  2522. chan = smc_chan_map[idx];
  2523. cp->cp_cpcr = mk_cr_cmd(chan,
  2524. CPM_CR_INIT_TRX) | CPM_CR_FLG;
  2525. while (cp->cp_cpcr & CPM_CR_FLG);
  2526. /* Set UART mode, 8 bit, no parity, one stop.
  2527.  * Enable receive and transmit.
  2528.  */
  2529. sp->smc_smcmr = smcr_mk_clen(9) | SMCMR_SM_UART;
  2530. /* Disable all interrupts and clear all pending
  2531.  * events.
  2532.  */
  2533. sp->smc_smcm = 0;
  2534. sp->smc_smce = 0xff;
  2535. /* If the port is the console, enable Rx and Tx.
  2536. */
  2537. #ifdef CONFIG_SERIAL_CONSOLE
  2538. if (i == CONFIG_SERIAL_CONSOLE_PORT)
  2539. sp->smc_smcmr |= SMCMR_REN | SMCMR_TEN;
  2540. #endif
  2541. }
  2542. /* Install interrupt handler.
  2543. */
  2544. cpm_install_handler(state->irq, rs_8xx_interrupt, info);
  2545. /* Set up the baud rate generator.
  2546. */
  2547. m8xx_cpm_setbrg(i, baud_table[baud_idx]);
  2548. }
  2549. }
  2550. return 0;
  2551. }
  2552. /* This must always be called before the rs_8xx_init() function, otherwise
  2553.  * it blows away the port control information.
  2554. */
  2555. static int __init serial_console_setup(struct console *co, char *options)
  2556. {
  2557. struct serial_state *ser;
  2558. uint mem_addr, dp_addr, bidx, idx;
  2559. ushort chan;
  2560. volatile cbd_t *bdp;
  2561. volatile cpm8xx_t *cp;
  2562. volatile smc_t *sp;
  2563. volatile scc_t *scp;
  2564. volatile smc_uart_t *up;
  2565. volatile scc_uart_t *sup;
  2566. bd_t *bd;
  2567. bd = (bd_t *)__res;
  2568. for (bidx = 0; bidx < (sizeof(baud_table) / sizeof(int)); bidx++)
  2569. if (bd->bi_baudrate == baud_table[bidx])
  2570. break;
  2571. /* make sure we have a useful value */
  2572. if (bidx == (sizeof(baud_table) / sizeof(int)))
  2573. bidx = 13; /* B9600 */
  2574. co->cflag = CREAD|CLOCAL|bidx|CS8;
  2575. baud_idx = bidx;
  2576. ser = rs_table + co->index;
  2577. cp = cpmp; /* Get pointer to Communication Processor */
  2578. idx = PORT_NUM(ser->smc_scc_num);
  2579. if (ser->smc_scc_num & NUM_IS_SCC) {
  2580. scp = &cp->cp_scc[idx];
  2581. sup = (scc_uart_t *)&cp->cp_dparam[ser->port];
  2582. }
  2583. else {
  2584. sp = &cp->cp_smc[idx];
  2585. up = (smc_uart_t *)&cpmp->cp_dparam[ser->port];
  2586. }
  2587. /* When we get here, the CPM has been reset, so we need
  2588.  * to configure the port.
  2589.  * We need to allocate a transmit and receive buffer descriptor
  2590.  * from dual port ram, and a character buffer area from host mem.
  2591.  */
  2592. /* Allocate space for two buffer descriptors in the DP ram.
  2593. */
  2594. dp_addr = m8xx_cpm_dpalloc(sizeof(cbd_t) * 2);
  2595. /* Allocate space for two 2 byte FIFOs in the host memory.
  2596. */
  2597. mem_addr = m8xx_cpm_hostalloc(8);
  2598. /* Set the physical address of the host memory buffers in
  2599.  * the buffer descriptors.
  2600.  */
  2601. bdp = (cbd_t *)&cp->cp_dpmem[dp_addr];
  2602. bdp->cbd_bufaddr = __pa(mem_addr);
  2603. (bdp+1)->cbd_bufaddr = __pa(mem_addr+4);
  2604. /* For the receive, set empty and wrap.
  2605.  * For transmit, set wrap.
  2606.  */
  2607. bdp->cbd_sc = BD_SC_EMPTY | BD_SC_WRAP;
  2608. (bdp+1)->cbd_sc = BD_SC_WRAP;
  2609. /* Set up the uart parameters in the parameter ram.
  2610. */
  2611. if (ser->smc_scc_num & NUM_IS_SCC) {
  2612. sup->scc_genscc.scc_rbase = dp_addr;
  2613. sup->scc_genscc.scc_tbase = dp_addr + sizeof(cbd_t);
  2614. /* Set up the uart parameters in the
  2615.  * parameter ram.
  2616.  */
  2617. sup->scc_genscc.scc_rfcr = SMC_EB;
  2618. sup->scc_genscc.scc_tfcr = SMC_EB;
  2619. /* Set this to 1 for now, so we get single
  2620.  * character interrupts.  Using idle charater
  2621.  * time requires some additional tuning.
  2622.  */
  2623. sup->scc_genscc.scc_mrblr = 1;
  2624. sup->scc_maxidl = 0;
  2625. sup->scc_brkcr = 1;
  2626. sup->scc_parec = 0;
  2627. sup->scc_frmec = 0;
  2628. sup->scc_nosec = 0;
  2629. sup->scc_brkec = 0;
  2630. sup->scc_uaddr1 = 0;
  2631. sup->scc_uaddr2 = 0;
  2632. sup->scc_toseq = 0;
  2633. sup->scc_char1 = 0x8000;
  2634. sup->scc_char2 = 0x8000;
  2635. sup->scc_char3 = 0x8000;
  2636. sup->scc_char4 = 0x8000;
  2637. sup->scc_char5 = 0x8000;
  2638. sup->scc_char6 = 0x8000;
  2639. sup->scc_char7 = 0x8000;
  2640. sup->scc_char8 = 0x8000;
  2641. sup->scc_rccm = 0xc0ff;
  2642. /* Send the CPM an initialize command.
  2643. */
  2644. chan = scc_chan_map[idx];
  2645. cp->cp_cpcr = mk_cr_cmd(chan, CPM_CR_INIT_TRX) | CPM_CR_FLG;
  2646. while (cp->cp_cpcr & CPM_CR_FLG);
  2647. /* Set UART mode, 8 bit, no parity, one stop.
  2648.  * Enable receive and transmit.
  2649.  */
  2650. scp->scc_gsmrh = 0;
  2651. scp->scc_gsmrl = 
  2652. (SCC_GSMRL_MODE_UART | SCC_GSMRL_TDCR_16 | SCC_GSMRL_RDCR_16);
  2653. /* Disable all interrupts and clear all pending
  2654.  * events.
  2655.  */
  2656. scp->scc_sccm = 0;
  2657. scp->scc_scce = 0xffff;
  2658. scp->scc_dsr = 0x7e7e;
  2659. scp->scc_pmsr = 0x3000;
  2660. scp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  2661. }
  2662. else {
  2663. up->smc_rbase = dp_addr; /* Base of receive buffer desc. */
  2664. up->smc_tbase = dp_addr+sizeof(cbd_t); /* Base of xmt buffer desc. */
  2665. up->smc_rfcr = SMC_EB;
  2666. up->smc_tfcr = SMC_EB;
  2667. /* Set this to 1 for now, so we get single character interrupts.
  2668. */
  2669. up->smc_mrblr = 1; /* receive buffer length */
  2670. up->smc_maxidl = 0; /* wait forever for next char */
  2671. /* Send the CPM an initialize command.
  2672. */
  2673. chan = smc_chan_map[idx];
  2674. cp->cp_cpcr = mk_cr_cmd(chan, CPM_CR_INIT_TRX) | CPM_CR_FLG;
  2675. printk("%s", "");
  2676. while (cp->cp_cpcr & CPM_CR_FLG);
  2677. /* Set UART mode, 8 bit, no parity, one stop.
  2678.  * Enable receive and transmit.
  2679.  */
  2680. sp->smc_smcmr = smcr_mk_clen(9) |  SMCMR_SM_UART;
  2681. /* And finally, enable Rx and Tx.
  2682. */
  2683. sp->smc_smcmr |= SMCMR_REN | SMCMR_TEN;
  2684. }
  2685. /* Set up the baud rate generator.
  2686. */
  2687. m8xx_cpm_setbrg((ser - rs_table), bd->bi_baudrate);
  2688. return 0;
  2689. }