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

Linux/Unix编程

开发平台:

Unix_Linux

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