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

嵌入式Linux

开发平台:

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