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

嵌入式Linux

开发平台:

Unix_Linux

  1.     if (info->blocked_open) {
  2. CY_UNLOCK(info, flags);
  3.         if (info->close_delay) {
  4.             current->state = TASK_INTERRUPTIBLE;
  5.             schedule_timeout(info->close_delay);
  6.         }
  7.         wake_up_interruptible(&info->open_wait);
  8. CY_LOCK(info, flags);
  9.     }
  10.     info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|
  11.                      ASYNC_CLOSING);
  12.     wake_up_interruptible(&info->close_wait);
  13. #ifdef CY_DEBUG_OTHER
  14.     printk(" cyc:cy_close donen");
  15. #endif
  16.     MOD_DEC_USE_COUNT;
  17.     CY_UNLOCK(info, flags);
  18.     return;
  19. } /* cy_close */
  20. /* This routine gets called when tty_write has put something into
  21.  * the write_queue.  The characters may come from user space or
  22.  * kernel space.
  23.  *
  24.  * This routine will return the number of characters actually
  25.  * accepted for writing.
  26.  *
  27.  * If the port is not already transmitting stuff, start it off by
  28.  * enabling interrupts.  The interrupt service routine will then
  29.  * ensure that the characters are sent.
  30.  * If the port is already active, there is no need to kick it.
  31.  *
  32.  */
  33. static int
  34. cy_write(struct tty_struct * tty, int from_user,
  35.            const unsigned char *buf, int count)
  36. {
  37.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  38.   unsigned long flags;
  39.   int c, ret = 0;
  40. #ifdef CY_DEBUG_IO
  41.     printk("cyc:cy_write ttyC%dn", info->line); /* */
  42. #endif
  43.     if (serial_paranoia_check(info, tty->device, "cy_write")){
  44.         return 0;
  45.     }
  46.         
  47.     if (!tty || !info->xmit_buf || !tmp_buf){
  48.         return 0;
  49.     }
  50.     if (from_user) {
  51. down(&tmp_buf_sem);
  52. while (1) {
  53.     int c1;
  54.     
  55.     c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  56. SERIAL_XMIT_SIZE - info->xmit_head));
  57.     if (c <= 0)
  58. break;
  59.     c -= copy_from_user(tmp_buf, buf, c);
  60.     if (!c) {
  61. if (!ret) {
  62.     ret = -EFAULT;
  63. }
  64. break;
  65.     }
  66.     CY_LOCK(info, flags);
  67.     c1 = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
  68. SERIAL_XMIT_SIZE - info->xmit_head));
  69.     if (c1 < c)
  70.      c = c1;
  71.     memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
  72.     info->xmit_head = ((info->xmit_head + c) & (SERIAL_XMIT_SIZE-1));
  73.     info->xmit_cnt += c;
  74.             CY_UNLOCK(info, flags);
  75.     buf += c;
  76.     count -= c;
  77.     ret += c;
  78. }
  79. up(&tmp_buf_sem);
  80.     } else {
  81. CY_LOCK(info, flags);
  82. while (1) {
  83.     c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, 
  84. SERIAL_XMIT_SIZE - info->xmit_head));
  85.         
  86.     if (c <= 0)
  87. break;
  88.     memcpy(info->xmit_buf + info->xmit_head, buf, c);
  89.     info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
  90.     info->xmit_cnt += c;
  91.     buf += c;
  92.     count -= c;
  93.     ret += c;
  94. }
  95.         CY_UNLOCK(info, flags);
  96.     }
  97.     info->idle_stats.xmit_bytes += ret;
  98.     info->idle_stats.xmit_idle   = jiffies;
  99.     if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
  100.         start_xmit(info);
  101.     }
  102.     return ret;
  103. } /* cy_write */
  104. /*
  105.  * This routine is called by the kernel to write a single
  106.  * character to the tty device.  If the kernel uses this routine,
  107.  * it must call the flush_chars() routine (if defined) when it is
  108.  * done stuffing characters into the driver.  If there is no room
  109.  * in the queue, the character is ignored.
  110.  */
  111. static void
  112. cy_put_char(struct tty_struct *tty, unsigned char ch)
  113. {
  114.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  115.   unsigned long flags;
  116. #ifdef CY_DEBUG_IO
  117.     printk("cyc:cy_put_char ttyC%dn", info->line);
  118. #endif
  119.     if (serial_paranoia_check(info, tty->device, "cy_put_char"))
  120.         return;
  121.     if (!tty || !info->xmit_buf)
  122.         return;
  123.     CY_LOCK(info, flags);
  124.         if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
  125.     CY_UNLOCK(info, flags);
  126.             return;
  127.         }
  128.         info->xmit_buf[info->xmit_head++] = ch;
  129.         info->xmit_head &= SERIAL_XMIT_SIZE - 1;
  130.         info->xmit_cnt++;
  131. info->idle_stats.xmit_bytes++;
  132. info->idle_stats.xmit_idle = jiffies;
  133.     CY_UNLOCK(info, flags);
  134. } /* cy_put_char */
  135. /*
  136.  * This routine is called by the kernel after it has written a
  137.  * series of characters to the tty device using put_char().  
  138.  */
  139. static void
  140. cy_flush_chars(struct tty_struct *tty)
  141. {
  142.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  143.                                 
  144. #ifdef CY_DEBUG_IO
  145.     printk("cyc:cy_flush_chars ttyC%dn", info->line); /* */
  146. #endif
  147.     if (serial_paranoia_check(info, tty->device, "cy_flush_chars"))
  148.         return;
  149.     if (info->xmit_cnt <= 0 || tty->stopped
  150.     || tty->hw_stopped || !info->xmit_buf)
  151.         return;
  152.     start_xmit(info);
  153. } /* cy_flush_chars */
  154. /*
  155.  * This routine returns the numbers of characters the tty driver
  156.  * will accept for queuing to be written.  This number is subject
  157.  * to change as output buffers get emptied, or if the output flow
  158.  * control is activated.
  159.  */
  160. static int
  161. cy_write_room(struct tty_struct *tty)
  162. {
  163.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  164.   int   ret;
  165.                                 
  166. #ifdef CY_DEBUG_IO
  167.     printk("cyc:cy_write_room ttyC%dn", info->line); /* */
  168. #endif
  169.     if (serial_paranoia_check(info, tty->device, "cy_write_room"))
  170.         return 0;
  171.     ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
  172.     if (ret < 0)
  173.         ret = 0;
  174.     return ret;
  175. } /* cy_write_room */
  176. static int
  177. cy_chars_in_buffer(struct tty_struct *tty)
  178. {
  179.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  180.   int card, channel;
  181.                                 
  182.     if (serial_paranoia_check(info, tty->device, "cy_chars_in_buffer"))
  183.         return 0;
  184.     card = info->card;
  185.     channel = (info->line) - (cy_card[card].first_line);
  186. #ifdef Z_EXT_CHARS_IN_BUFFER
  187.     if (!IS_CYC_Z(cy_card[card])) {
  188. #endif /* Z_EXT_CHARS_IN_BUFFER */
  189. #ifdef CY_DEBUG_IO
  190. printk("cyc:cy_chars_in_buffer ttyC%d %dn",
  191. info->line, info->xmit_cnt); /* */
  192. #endif
  193. return info->xmit_cnt;
  194. #ifdef Z_EXT_CHARS_IN_BUFFER
  195.     } else {
  196. static volatile struct FIRM_ID *firm_id;
  197. static volatile struct ZFW_CTRL *zfw_ctrl;
  198. static volatile struct CH_CTRL *ch_ctrl;
  199. static volatile struct BUF_CTRL *buf_ctrl;
  200. int char_count;
  201. volatile uclong tx_put, tx_get, tx_bufsize;
  202. firm_id = (struct FIRM_ID *)(cy_card[card].base_addr + ID_ADDRESS);
  203. zfw_ctrl = (struct ZFW_CTRL *)
  204.     (cy_card[card].base_addr + 
  205.      (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  206. ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
  207. buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
  208. tx_get = cy_readl(&buf_ctrl->tx_get);
  209. tx_put = cy_readl(&buf_ctrl->tx_put);
  210. tx_bufsize = cy_readl(&buf_ctrl->tx_bufsize);
  211. if (tx_put >= tx_get)
  212.     char_count = tx_put - tx_get;
  213. else
  214.     char_count = tx_put - tx_get + tx_bufsize;
  215. #ifdef CY_DEBUG_IO
  216. printk("cyc:cy_chars_in_buffer ttyC%d %dn",
  217. info->line, info->xmit_cnt + char_count); /* */
  218. #endif
  219. return (info->xmit_cnt + char_count);
  220.     }
  221. #endif /* Z_EXT_CHARS_IN_BUFFER */
  222. } /* cy_chars_in_buffer */
  223. /*
  224.  * ------------------------------------------------------------
  225.  * cy_ioctl() and friends
  226.  * ------------------------------------------------------------
  227.  */
  228. static void
  229. cyy_baud_calc(struct cyclades_port *info, uclong baud)
  230. {
  231.     int co, co_val, bpr;
  232.     uclong cy_clock = ((info->chip_rev >= CD1400_REV_J) ? 60000000 : 25000000);
  233.     if (baud == 0) {
  234. info->tbpr = info->tco = info->rbpr = info->rco = 0;
  235. return;
  236.     }
  237.     /* determine which prescaler to use */
  238.     for (co = 4, co_val = 2048; co; co--, co_val >>= 2) {
  239. if (cy_clock / co_val / baud > 63)
  240.     break;
  241.     }
  242.     bpr = (cy_clock / co_val * 2 / baud + 1) / 2;
  243.     if (bpr > 255)
  244. bpr = 255;
  245.     info->tbpr = info->rbpr = bpr;
  246.     info->tco = info->rco = co;
  247. }
  248. /*
  249.  * This routine finds or computes the various line characteristics.
  250.  * It used to be called config_setup
  251.  */
  252. static void
  253. set_line_char(struct cyclades_port * info)
  254. {
  255.   unsigned long flags;
  256.   unsigned char *base_addr;
  257.   int card,chip,channel,index;
  258.   unsigned cflag, iflag;
  259.   unsigned short chip_number;
  260.   int baud, baud_rate = 0;
  261.   int   i;
  262.     if (!info->tty || !info->tty->termios){
  263.         return;
  264.     }
  265.     if (info->line == -1){
  266.         return;
  267.     }
  268.     cflag = info->tty->termios->c_cflag;
  269.     iflag = info->tty->termios->c_iflag;
  270.     /*
  271.      * Set up the tty->alt_speed kludge
  272.      */
  273.     if (info->tty) {
  274. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  275.     info->tty->alt_speed = 57600;
  276. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  277.     info->tty->alt_speed = 115200;
  278. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  279.     info->tty->alt_speed = 230400;
  280. if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  281.     info->tty->alt_speed = 460800;
  282.     }
  283.     card = info->card;
  284.     channel = (info->line) - (cy_card[card].first_line);
  285.     chip_number = channel / 4;
  286.     if (!IS_CYC_Z(cy_card[card])) {
  287. index = cy_card[card].bus_index;
  288. /* baud rate */
  289. baud = tty_get_baud_rate(info->tty);
  290. if ((baud == 38400) &&
  291.     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) {
  292.     if (info->custom_divisor)
  293. baud_rate = info->baud / info->custom_divisor;
  294.     else
  295. baud_rate = info->baud;
  296. } else if (baud > CD1400_MAX_SPEED) {
  297.     baud = CD1400_MAX_SPEED;
  298. }
  299. /* find the baud index */
  300. for (i = 0; i < 20; i++) {
  301.     if (baud == baud_table[i]) {
  302. break;
  303.     }
  304. }
  305. if (i == 20) {
  306.     i = 19; /* CD1400_MAX_SPEED */
  307. if ((baud == 38400) &&
  308.     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) {
  309.     cyy_baud_calc(info, baud_rate);
  310. } else {
  311.     if(info->chip_rev >= CD1400_REV_J) {
  312. /* It is a CD1400 rev. J or later */
  313. info->tbpr = baud_bpr_60[i]; /* Tx BPR */
  314. info->tco = baud_co_60[i]; /* Tx CO */
  315. info->rbpr = baud_bpr_60[i]; /* Rx BPR */
  316. info->rco = baud_co_60[i]; /* Rx CO */
  317.     } else {
  318. info->tbpr = baud_bpr_25[i]; /* Tx BPR */
  319. info->tco = baud_co_25[i]; /* Tx CO */
  320. info->rbpr = baud_bpr_25[i]; /* Rx BPR */
  321. info->rco = baud_co_25[i]; /* Rx CO */
  322.     }
  323. }
  324. if (baud_table[i] == 134) {
  325.     /* get it right for 134.5 baud */
  326.     info->timeout = (info->xmit_fifo_size*HZ*30/269) + 2;
  327. } else if ((baud == 38400) &&
  328.    ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) {
  329.     info->timeout = (info->xmit_fifo_size*HZ*15/baud_rate) + 2;
  330. } else if (baud_table[i]) {
  331.     info->timeout = (info->xmit_fifo_size*HZ*15/baud_table[i]) + 2;
  332.     /* this needs to be propagated into the card info */
  333. } else {
  334.     info->timeout = 0;
  335. }
  336. /* By tradition (is it a standard?) a baud rate of zero
  337.    implies the line should be/has been closed.  A bit
  338.    later in this routine such a test is performed. */
  339. /* byte size and parity */
  340. info->cor5 = 0;
  341. info->cor4 = 0;
  342. info->cor3 = (info->default_threshold
  343.       ? info->default_threshold
  344.       : baud_cor3[i]); /* receive threshold */
  345. info->cor2 = CyETC;
  346. switch(cflag & CSIZE){
  347. case CS5:
  348.     info->cor1 = Cy_5_BITS;
  349.     break;
  350. case CS6:
  351.     info->cor1 = Cy_6_BITS;
  352.     break;
  353. case CS7:
  354.     info->cor1 = Cy_7_BITS;
  355.     break;
  356. case CS8:
  357.     info->cor1 = Cy_8_BITS;
  358.     break;
  359. }
  360. if(cflag & CSTOPB){
  361.     info->cor1 |= Cy_2_STOP;
  362. }
  363. if (cflag & PARENB){
  364.     if (cflag & PARODD){
  365. info->cor1 |= CyPARITY_O;
  366.     }else{
  367. info->cor1 |= CyPARITY_E;
  368.     }
  369. }else{
  370.     info->cor1 |= CyPARITY_NONE;
  371. }
  372.     
  373. /* CTS flow control flag */
  374. if (cflag & CRTSCTS){
  375.     info->flags |= ASYNC_CTS_FLOW;
  376.     info->cor2 |= CyCtsAE;
  377. }else{
  378.     info->flags &= ~ASYNC_CTS_FLOW;
  379.     info->cor2 &= ~CyCtsAE;
  380. }
  381. if (cflag & CLOCAL)
  382.     info->flags &= ~ASYNC_CHECK_CD;
  383. else
  384.     info->flags |= ASYNC_CHECK_CD;
  385.  /***********************************************
  386.     The hardware option, CyRtsAO, presents RTS when
  387.     the chip has characters to send.  Since most modems
  388.     use RTS as reverse (inbound) flow control, this
  389.     option is not used.  If inbound flow control is
  390.     necessary, DTR can be programmed to provide the
  391.     appropriate signals for use with a non-standard
  392.     cable.  Contact Marcio Saito for details.
  393.  ***********************************************/
  394. chip = channel>>2;
  395. channel &= 0x03;
  396. base_addr = (unsigned char*)
  397.        (cy_card[card].base_addr
  398.        + (cy_chip_offset[chip]<<index));
  399. CY_LOCK(info, flags);
  400.     cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  401.    /* tx and rx baud rate */
  402.     cy_writeb((u_long)base_addr+(CyTCOR<<index), info->tco);
  403.     cy_writeb((u_long)base_addr+(CyTBPR<<index), info->tbpr);
  404.     cy_writeb((u_long)base_addr+(CyRCOR<<index), info->rco);
  405.     cy_writeb((u_long)base_addr+(CyRBPR<<index), info->rbpr);
  406.     /* set line characteristics  according configuration */
  407.     cy_writeb((u_long)base_addr+(CySCHR1<<index), 
  408.       START_CHAR(info->tty));
  409.     cy_writeb((u_long)base_addr+(CySCHR2<<index), 
  410.       STOP_CHAR(info->tty));
  411.     cy_writeb((u_long)base_addr+(CyCOR1<<index), info->cor1);
  412.     cy_writeb((u_long)base_addr+(CyCOR2<<index), info->cor2);
  413.     cy_writeb((u_long)base_addr+(CyCOR3<<index), info->cor3);
  414.     cy_writeb((u_long)base_addr+(CyCOR4<<index), info->cor4);
  415.     cy_writeb((u_long)base_addr+(CyCOR5<<index), info->cor5);
  416.     cyy_issue_cmd(base_addr,
  417.      CyCOR_CHANGE|CyCOR1ch|CyCOR2ch|CyCOR3ch,index);
  418.     cy_writeb((u_long)base_addr+(CyCAR<<index), 
  419.       (u_char)channel); /* !!! Is this needed? */
  420.     cy_writeb((u_long)base_addr+(CyRTPR<<index), (info->default_timeout
  421.          ? info->default_timeout
  422.          : 0x02)); /* 10ms rx timeout */
  423.     if (C_CLOCAL(info->tty)) {
  424. /* without modem intr */
  425. cy_writeb((u_long)base_addr+(CySRER<<index),
  426.                    cy_readb(base_addr+(CySRER<<index)) | CyMdmCh); 
  427. /* act on 1->0 modem transitions */
  428.                 if ((cflag & CRTSCTS) && info->rflow) {
  429.                         cy_writeb((u_long)base_addr+(CyMCOR1<<index), 
  430.                                   (CyCTS|rflow_thr[i]));
  431.                 } else {
  432.                         cy_writeb((u_long)base_addr+(CyMCOR1<<index), CyCTS);
  433.                 }
  434. /* act on 0->1 modem transitions */
  435. cy_writeb((u_long)base_addr+(CyMCOR2<<index), CyCTS);
  436.     } else {
  437. /* without modem intr */
  438. cy_writeb((u_long)base_addr+(CySRER<<index),
  439.                    cy_readb(base_addr+(CySRER<<index)) | CyMdmCh); 
  440. /* act on 1->0 modem transitions */
  441.                 if ((cflag & CRTSCTS) && info->rflow) {
  442. cy_writeb((u_long)base_addr+(CyMCOR1<<index), 
  443.                            (CyDSR|CyCTS|CyRI|CyDCD|rflow_thr[i]));
  444.                 } else {
  445. cy_writeb((u_long)base_addr+(CyMCOR1<<index), 
  446.                                   CyDSR|CyCTS|CyRI|CyDCD);
  447.                 }
  448. /* act on 0->1 modem transitions */
  449. cy_writeb((u_long)base_addr+(CyMCOR2<<index), 
  450.   CyDSR|CyCTS|CyRI|CyDCD);
  451.     }
  452.     if(i == 0){ /* baud rate is zero, turn off line */
  453.         if (info->rtsdtr_inv) {
  454. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  455. } else {
  456.                         cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  457. }
  458. #ifdef CY_DEBUG_DTR
  459. printk("cyc:set_line_char dropping DTRn");
  460. printk("     status: 0x%x,
  461.     0x%xn", cy_readb(base_addr+(CyMSVR1<<index)),
  462.     cy_readb(base_addr+(CyMSVR2<<index)));
  463. #endif
  464.     }else{
  465.                 if (info->rtsdtr_inv) {
  466. cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  467.                 } else {
  468. cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  469.                 }
  470. #ifdef CY_DEBUG_DTR
  471. printk("cyc:set_line_char raising DTRn");
  472. printk("     status: 0x%x, 0x%xn",
  473.     cy_readb(base_addr+(CyMSVR1<<index)),
  474.     cy_readb(base_addr+(CyMSVR2<<index)));
  475. #endif
  476.     }
  477.     if (info->tty){
  478. clear_bit(TTY_IO_ERROR, &info->tty->flags);
  479.     }
  480. CY_UNLOCK(info, flags);
  481.     } else {
  482.       struct FIRM_ID *firm_id;
  483.       struct ZFW_CTRL *zfw_ctrl;
  484.       struct BOARD_CTRL *board_ctrl;
  485.       struct CH_CTRL *ch_ctrl;
  486.       struct BUF_CTRL *buf_ctrl;
  487.       uclong sw_flow;
  488.       int retval;
  489.         firm_id = (struct FIRM_ID *)
  490. (cy_card[card].base_addr + ID_ADDRESS);
  491.         if (!ISZLOADED(cy_card[card])) {
  492.     return;
  493. }
  494. zfw_ctrl = (struct ZFW_CTRL *)
  495.     (cy_card[card].base_addr + 
  496.      (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  497. board_ctrl = &zfw_ctrl->board_ctrl;
  498. ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
  499. buf_ctrl = &zfw_ctrl->buf_ctrl[channel];
  500. /* baud rate */
  501. baud = tty_get_baud_rate(info->tty);
  502. if ((baud == 38400) &&
  503.     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) {
  504.     if (info->custom_divisor)
  505. baud_rate = info->baud / info->custom_divisor;
  506.     else
  507. baud_rate = info->baud;
  508. } else if (baud > CYZ_MAX_SPEED) {
  509.     baud = CYZ_MAX_SPEED;
  510. }
  511. cy_writel(&ch_ctrl->comm_baud , baud);
  512. if (baud == 134) {
  513.     /* get it right for 134.5 baud */
  514.     info->timeout = (info->xmit_fifo_size*HZ*30/269) + 2;
  515. } else if ((baud == 38400) &&
  516.    ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) {
  517.     info->timeout = (info->xmit_fifo_size*HZ*15/baud_rate) + 2;
  518. } else if (baud) {
  519.     info->timeout = (info->xmit_fifo_size*HZ*15/baud) + 2;
  520.     /* this needs to be propagated into the card info */
  521. } else {
  522.     info->timeout = 0;
  523. }
  524. /* byte size and parity */
  525. switch(cflag & CSIZE){
  526. case CS5: cy_writel(&ch_ctrl->comm_data_l , C_DL_CS5); break;
  527. case CS6: cy_writel(&ch_ctrl->comm_data_l , C_DL_CS6); break;
  528. case CS7: cy_writel(&ch_ctrl->comm_data_l , C_DL_CS7); break;
  529. case CS8: cy_writel(&ch_ctrl->comm_data_l , C_DL_CS8); break;
  530. }
  531. if(cflag & CSTOPB){
  532.     cy_writel(&ch_ctrl->comm_data_l,
  533.                cy_readl(&ch_ctrl->comm_data_l) | C_DL_2STOP);
  534. }else{
  535.     cy_writel(&ch_ctrl->comm_data_l,
  536.                cy_readl(&ch_ctrl->comm_data_l) | C_DL_1STOP);
  537. }
  538. if (cflag & PARENB){
  539.     if (cflag & PARODD){
  540. cy_writel(&ch_ctrl->comm_parity , C_PR_ODD);
  541.     }else{
  542. cy_writel(&ch_ctrl->comm_parity , C_PR_EVEN);
  543.     }
  544. }else{
  545.     cy_writel(&ch_ctrl->comm_parity , C_PR_NONE);
  546. }
  547. /* CTS flow control flag */
  548. if (cflag & CRTSCTS){
  549.     cy_writel(&ch_ctrl->hw_flow,
  550.                cy_readl(&ch_ctrl->hw_flow) | C_RS_CTS | C_RS_RTS);
  551. }else{
  552.     cy_writel(&ch_ctrl->hw_flow,
  553.                cy_readl(&ch_ctrl->hw_flow) & ~(C_RS_CTS | C_RS_RTS));
  554. }
  555. /* As the HW flow control is done in firmware, the driver doesn't
  556.    need to care about it */
  557. info->flags &= ~ASYNC_CTS_FLOW;
  558. /* XON/XOFF/XANY flow control flags */
  559. sw_flow = 0;
  560. if (iflag & IXON){
  561.     sw_flow |= C_FL_OXX;
  562.     if (iflag & IXANY)
  563. sw_flow |= C_FL_OIXANY;
  564. }
  565. cy_writel(&ch_ctrl->sw_flow, sw_flow);
  566. retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_IOCTL, 0L);
  567. if (retval != 0){
  568.     printk("cyc:set_line_char retval on ttyC%d was %xn",
  569.    info->line, retval);
  570. }
  571. /* CD sensitivity */
  572. if (cflag & CLOCAL){
  573.     info->flags &= ~ASYNC_CHECK_CD;
  574. }else{
  575.     info->flags |= ASYNC_CHECK_CD;
  576. }
  577. if(baud == 0){ /* baud rate is zero, turn off line */
  578.     cy_writel(&ch_ctrl->rs_control,
  579.                cy_readl(&ch_ctrl->rs_control) & ~C_RS_DTR);
  580. #ifdef CY_DEBUG_DTR
  581.     printk("cyc:set_line_char dropping Z DTRn");
  582. #endif
  583. }else{
  584.     cy_writel(&ch_ctrl->rs_control,
  585.                cy_readl(&ch_ctrl->rs_control) | C_RS_DTR);
  586. #ifdef CY_DEBUG_DTR
  587.     printk("cyc:set_line_char raising Z DTRn");
  588. #endif
  589. }
  590. retval = cyz_issue_cmd( &cy_card[card], channel, C_CM_IOCTLM, 0L);
  591. if (retval != 0){
  592.     printk("cyc:set_line_char(2) retval on ttyC%d was %xn",
  593.    info->line, retval);
  594. }
  595. if (info->tty){
  596.     clear_bit(TTY_IO_ERROR, &info->tty->flags);
  597. }
  598.     }
  599. } /* set_line_char */
  600. static int
  601. get_serial_info(struct cyclades_port * info,
  602.                            struct serial_struct * retinfo)
  603. {
  604.   struct serial_struct tmp;
  605.   struct cyclades_card *cinfo = &cy_card[info->card];
  606.     if (!retinfo)
  607.             return -EFAULT;
  608.     memset(&tmp, 0, sizeof(tmp));
  609.     tmp.type = info->type;
  610.     tmp.line = info->line;
  611.     tmp.port = info->card * 0x100 + info->line - cinfo->first_line;
  612.     tmp.irq = cinfo->irq;
  613.     tmp.flags = info->flags;
  614.     tmp.close_delay = info->close_delay;
  615.     tmp.baud_base = info->baud;
  616.     tmp.custom_divisor = info->custom_divisor;
  617.     tmp.hub6 = 0;               /*!!!*/
  618.     return copy_to_user(retinfo,&tmp,sizeof(*retinfo))?-EFAULT:0;
  619. } /* get_serial_info */
  620. static int
  621. set_serial_info(struct cyclades_port * info,
  622.                            struct serial_struct * new_info)
  623. {
  624.   struct serial_struct new_serial;
  625.   struct cyclades_port old_info;
  626.     if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
  627. return -EFAULT;
  628.     old_info = *info;
  629.     if (!capable(CAP_SYS_ADMIN)) {
  630.             if ((new_serial.close_delay != info->close_delay) ||
  631. (new_serial.baud_base != info->baud) ||
  632. ((new_serial.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK) !=
  633.  (info->flags & ASYNC_FLAGS & ~ASYNC_USR_MASK)))
  634.                     return -EPERM;
  635.             info->flags = ((info->flags & ~ASYNC_USR_MASK) |
  636.                            (new_serial.flags & ASYNC_USR_MASK));
  637.             info->baud = new_serial.baud_base;
  638.     info->custom_divisor = new_serial.custom_divisor;
  639.             goto check_and_exit;
  640.     }
  641.     /*
  642.      * OK, past this point, all the error checking has been done.
  643.      * At this point, we start making changes.....
  644.      */
  645.     info->baud = new_serial.baud_base;
  646.     info->custom_divisor = new_serial.custom_divisor;
  647.     info->flags = ((info->flags & ~ASYNC_FLAGS) |
  648.                     (new_serial.flags & ASYNC_FLAGS));
  649.     info->close_delay = new_serial.close_delay * HZ/100;
  650.     info->closing_wait = new_serial.closing_wait * HZ/100;
  651. check_and_exit:
  652.     if (info->flags & ASYNC_INITIALIZED){
  653.         set_line_char(info);
  654.         return 0;
  655.     }else{
  656.         return startup(info);
  657.     }
  658. } /* set_serial_info */
  659. /*
  660.  * get_lsr_info - get line status register info
  661.  *
  662.  * Purpose: Let user call ioctl() to get info when the UART physically
  663.  *     is emptied.  On bus types like RS485, the transmitter must
  664.  *     release the bus after transmitting. This must be done when
  665.  *     the transmit shift register is empty, not be done when the
  666.  *     transmit holding register is empty.  This functionality
  667.  *     allows an RS485 driver to be written in user space.
  668.  */
  669. static int get_lsr_info(struct cyclades_port *info, unsigned int *value)
  670. {
  671.     int card, chip, channel, index;
  672.     unsigned char status;
  673.     unsigned int result;
  674.     unsigned long flags;
  675.     unsigned char *base_addr;
  676.     card = info->card;
  677.     channel = (info->line) - (cy_card[card].first_line);
  678.     if (!IS_CYC_Z(cy_card[card])) {
  679. chip = channel>>2;
  680. channel &= 0x03;
  681. index = cy_card[card].bus_index;
  682. base_addr = (unsigned char *)
  683.      (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
  684. CY_LOCK(info, flags);
  685. status = cy_readb(base_addr+(CySRER<<index)) & (CyTxRdy|CyTxMpty);
  686. CY_UNLOCK(info, flags);
  687. result = (status ? 0 : TIOCSER_TEMT);
  688.     } else {
  689. /* Not supported yet */
  690. return -EINVAL;
  691.     }
  692.     return cy_put_user(result, (unsigned long *) value);
  693. }
  694. static int
  695. get_modem_info(struct cyclades_port * info, unsigned int *value)
  696. {
  697.   int card,chip,channel,index;
  698.   unsigned char *base_addr;
  699.   unsigned long flags;
  700.   unsigned char status;
  701.   unsigned long lstatus;
  702.   unsigned int result;
  703.   struct FIRM_ID *firm_id;
  704.   struct ZFW_CTRL *zfw_ctrl;
  705.   struct BOARD_CTRL *board_ctrl;
  706.   struct CH_CTRL *ch_ctrl;
  707.     card = info->card;
  708.     channel = (info->line) - (cy_card[card].first_line);
  709.     if (!IS_CYC_Z(cy_card[card])) {
  710. chip = channel>>2;
  711. channel &= 0x03;
  712. index = cy_card[card].bus_index;
  713. base_addr = (unsigned char*)
  714.        (cy_card[card].base_addr
  715.        + (cy_chip_offset[chip]<<index));
  716. CY_LOCK(info, flags);
  717.     cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  718.     status = cy_readb(base_addr+(CyMSVR1<<index));
  719.     status |= cy_readb(base_addr+(CyMSVR2<<index));
  720. CY_UNLOCK(info, flags);
  721.         if (info->rtsdtr_inv) {
  722.     result =  ((status  & CyRTS) ? TIOCM_DTR : 0)
  723.     | ((status  & CyDTR) ? TIOCM_RTS : 0);
  724. } else {
  725.     result =  ((status  & CyRTS) ? TIOCM_RTS : 0)
  726.     | ((status  & CyDTR) ? TIOCM_DTR : 0);
  727. }
  728. result |=  ((status  & CyDCD) ? TIOCM_CAR : 0)
  729.  | ((status  & CyRI) ? TIOCM_RNG : 0)
  730.  | ((status  & CyDSR) ? TIOCM_DSR : 0)
  731.  | ((status  & CyCTS) ? TIOCM_CTS : 0);
  732.     } else {
  733. base_addr = (unsigned char*) (cy_card[card].base_addr);
  734.         if (cy_card[card].num_chips != -1){
  735.     return -EINVAL;
  736. }
  737. firm_id = (struct FIRM_ID *)
  738.     (cy_card[card].base_addr + ID_ADDRESS);
  739.         if (ISZLOADED(cy_card[card])) {
  740.     zfw_ctrl = (struct ZFW_CTRL *)
  741. (cy_card[card].base_addr + 
  742.  (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  743.     board_ctrl = &zfw_ctrl->board_ctrl;
  744.     ch_ctrl = zfw_ctrl->ch_ctrl;
  745.     lstatus = cy_readl(&ch_ctrl[channel].rs_status);
  746.     result =  ((lstatus  & C_RS_RTS) ? TIOCM_RTS : 0)
  747.     | ((lstatus  & C_RS_DTR) ? TIOCM_DTR : 0)
  748.             | ((lstatus  & C_RS_DCD) ? TIOCM_CAR : 0)
  749.     | ((lstatus  & C_RS_RI) ? TIOCM_RNG : 0)
  750.     | ((lstatus  & C_RS_DSR) ? TIOCM_DSR : 0)
  751.     | ((lstatus  & C_RS_CTS) ? TIOCM_CTS : 0);
  752. }else{
  753.     result = 0;
  754.     return -ENODEV;
  755. }
  756.     }
  757.     return cy_put_user(result, value);
  758. } /* get_modem_info */
  759. static int
  760. set_modem_info(struct cyclades_port * info, unsigned int cmd,
  761.                           unsigned int *value)
  762. {
  763.   int card,chip,channel,index;
  764.   unsigned char *base_addr;
  765.   unsigned long flags;
  766.   unsigned int arg = cy_get_user((unsigned long *) value);
  767.   struct FIRM_ID *firm_id;
  768.   struct ZFW_CTRL *zfw_ctrl;
  769.   struct BOARD_CTRL *board_ctrl;
  770.   struct CH_CTRL *ch_ctrl;
  771.   int retval;
  772.     card = info->card;
  773.     channel = (info->line) - (cy_card[card].first_line);
  774.     if (!IS_CYC_Z(cy_card[card])) {
  775. chip = channel>>2;
  776. channel &= 0x03;
  777. index = cy_card[card].bus_index;
  778. base_addr = (unsigned char*)
  779.        (cy_card[card].base_addr
  780.        + (cy_chip_offset[chip]<<index));
  781. switch (cmd) {
  782. case TIOCMBIS:
  783.     if (arg & TIOCM_RTS){
  784. CY_LOCK(info, flags);
  785. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  786.                 if (info->rtsdtr_inv) {
  787.     cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  788.                 } else {
  789.     cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  790.                 }
  791. CY_UNLOCK(info, flags);
  792.     }
  793.     if (arg & TIOCM_DTR){
  794. CY_LOCK(info, flags);
  795. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  796.                 if (info->rtsdtr_inv) {
  797.     cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  798.                 } else {
  799.     cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  800.                 }
  801. #ifdef CY_DEBUG_DTR
  802. printk("cyc:set_modem_info raising DTRn");
  803. printk("     status: 0x%x, 0x%xn",
  804.     cy_readb(base_addr+(CyMSVR1<<index)), 
  805.                     cy_readb(base_addr+(CyMSVR2<<index)));
  806. #endif
  807. CY_UNLOCK(info, flags);
  808.     }
  809.     break;
  810. case TIOCMBIC:
  811.     if (arg & TIOCM_RTS){
  812. CY_LOCK(info, flags);
  813. cy_writeb((u_long)base_addr+(CyCAR<<index), 
  814.                           (u_char)channel);
  815.                 if (info->rtsdtr_inv) {
  816.      cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  817.                 } else {
  818.      cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  819.                 }
  820. CY_UNLOCK(info, flags);
  821.     }
  822.     if (arg & TIOCM_DTR){
  823. CY_LOCK(info, flags);
  824. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  825.                 if (info->rtsdtr_inv) {
  826. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  827.                 } else {
  828. cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  829.                 }
  830. #ifdef CY_DEBUG_DTR
  831. printk("cyc:set_modem_info dropping DTRn");
  832. printk("     status: 0x%x, 0x%xn",
  833.     cy_readb(base_addr+(CyMSVR1<<index)), 
  834.                     cy_readb(base_addr+(CyMSVR2<<index)));
  835. #endif
  836. CY_UNLOCK(info, flags);
  837.     }
  838.     break;
  839. case TIOCMSET:
  840.     if (arg & TIOCM_RTS){
  841. CY_LOCK(info, flags);
  842.         cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  843.                 if (info->rtsdtr_inv) {
  844. cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  845.                 } else {
  846. cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  847.                 }
  848. CY_UNLOCK(info, flags);
  849.     }else{
  850. CY_LOCK(info, flags);
  851. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  852.                 if (info->rtsdtr_inv) {
  853. cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  854.                 } else {
  855. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  856.                 }
  857. CY_UNLOCK(info, flags);
  858.     }
  859.     if (arg & TIOCM_DTR){
  860. CY_LOCK(info, flags);
  861. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  862.                 if (info->rtsdtr_inv) {
  863. cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  864.                 } else {
  865. cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  866.                 }
  867. #ifdef CY_DEBUG_DTR
  868. printk("cyc:set_modem_info raising DTRn");
  869. printk("     status: 0x%x, 0x%xn",
  870.     cy_readb(base_addr+(CyMSVR1<<index)), 
  871.                     cy_readb(base_addr+(CyMSVR2<<index)));
  872. #endif
  873. CY_UNLOCK(info, flags);
  874.     }else{
  875. CY_LOCK(info, flags);
  876. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  877.                 if (info->rtsdtr_inv) {
  878. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  879.                 } else {
  880. cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  881.                 }
  882. #ifdef CY_DEBUG_DTR
  883. printk("cyc:set_modem_info dropping DTRn");
  884. printk("     status: 0x%x, 0x%xn",
  885.     cy_readb(base_addr+(CyMSVR1<<index)), 
  886.                     cy_readb(base_addr+(CyMSVR2<<index)));
  887. #endif
  888. CY_UNLOCK(info, flags);
  889.     }
  890.     break;
  891. default:
  892.     return -EINVAL;
  893. }
  894.     } else {
  895. base_addr = (unsigned char*) (cy_card[card].base_addr);
  896. firm_id = (struct FIRM_ID *)
  897.     (cy_card[card].base_addr + ID_ADDRESS);
  898.         if (ISZLOADED(cy_card[card])) {
  899.     zfw_ctrl = (struct ZFW_CTRL *)
  900. (cy_card[card].base_addr + 
  901.  (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  902.     board_ctrl = &zfw_ctrl->board_ctrl;
  903.     ch_ctrl = zfw_ctrl->ch_ctrl;
  904.     switch (cmd) {
  905.     case TIOCMBIS:
  906. if (arg & TIOCM_RTS){
  907.     CY_LOCK(info, flags);
  908.     cy_writel(&ch_ctrl[channel].rs_control,
  909.                        cy_readl(&ch_ctrl[channel].rs_control) | C_RS_RTS);
  910.     CY_UNLOCK(info, flags);
  911. }
  912. if (arg & TIOCM_DTR){
  913.     CY_LOCK(info, flags);
  914.     cy_writel(&ch_ctrl[channel].rs_control,
  915.                        cy_readl(&ch_ctrl[channel].rs_control) | C_RS_DTR);
  916. #ifdef CY_DEBUG_DTR
  917.     printk("cyc:set_modem_info raising Z DTRn");
  918. #endif
  919.     CY_UNLOCK(info, flags);
  920. }
  921. break;
  922.     case TIOCMBIC:
  923. if (arg & TIOCM_RTS){
  924.     CY_LOCK(info, flags);
  925.     cy_writel(&ch_ctrl[channel].rs_control,
  926.                        cy_readl(&ch_ctrl[channel].rs_control) & ~C_RS_RTS);
  927.     CY_UNLOCK(info, flags);
  928. }
  929. if (arg & TIOCM_DTR){
  930.     CY_LOCK(info, flags);
  931.     cy_writel(&ch_ctrl[channel].rs_control,
  932.                        cy_readl(&ch_ctrl[channel].rs_control) & ~C_RS_DTR);
  933. #ifdef CY_DEBUG_DTR
  934.     printk("cyc:set_modem_info clearing Z DTRn");
  935. #endif
  936.     CY_UNLOCK(info, flags);
  937. }
  938. break;
  939.     case TIOCMSET:
  940. if (arg & TIOCM_RTS){
  941.     CY_LOCK(info, flags);
  942.     cy_writel(&ch_ctrl[channel].rs_control,
  943.                        cy_readl(&ch_ctrl[channel].rs_control) | C_RS_RTS);
  944.     CY_UNLOCK(info, flags);
  945. }else{
  946.     CY_LOCK(info, flags);
  947.     cy_writel(&ch_ctrl[channel].rs_control,
  948.                        cy_readl(&ch_ctrl[channel].rs_control) & ~C_RS_RTS);
  949.     CY_UNLOCK(info, flags);
  950. }
  951. if (arg & TIOCM_DTR){
  952.     CY_LOCK(info, flags);
  953.     cy_writel(&ch_ctrl[channel].rs_control,
  954.                        cy_readl(&ch_ctrl[channel].rs_control) | C_RS_DTR);
  955. #ifdef CY_DEBUG_DTR
  956.     printk("cyc:set_modem_info raising Z DTRn");
  957. #endif
  958.     CY_UNLOCK(info, flags);
  959. }else{
  960.     CY_LOCK(info, flags);
  961.     cy_writel(&ch_ctrl[channel].rs_control,
  962.                        cy_readl(&ch_ctrl[channel].rs_control) & ~C_RS_DTR);
  963. #ifdef CY_DEBUG_DTR
  964.     printk("cyc:set_modem_info clearing Z DTRn");
  965. #endif
  966.     CY_UNLOCK(info, flags);
  967. }
  968. break;
  969.     default:
  970. return -EINVAL;
  971.     }
  972. }else{
  973.     return -ENODEV;
  974. }
  975. CY_LOCK(info, flags);
  976.         retval = cyz_issue_cmd(&cy_card[info->card],
  977.     channel, C_CM_IOCTLM,0L);
  978. if (retval != 0){
  979.     printk("cyc:set_modem_info retval on ttyC%d was %xn",
  980.    info->line, retval);
  981. }
  982. CY_UNLOCK(info, flags);
  983.     }
  984.     return 0;
  985. } /* set_modem_info */
  986. /*
  987.  * cy_break() --- routine which turns the break handling on or off
  988.  */
  989. static void
  990. cy_break(struct tty_struct *tty, int break_state)
  991. {
  992.     struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
  993.     unsigned long flags;
  994.     if (serial_paranoia_check(info, tty->device, "cy_break"))
  995. return;
  996.     CY_LOCK(info, flags);
  997.     if (!IS_CYC_Z(cy_card[info->card])) {
  998.         /* Let the transmit ISR take care of this (since it
  999.    requires stuffing characters into the output stream).
  1000.         */
  1001. if (break_state == -1) {
  1002.     if (!info->breakon) {
  1003. info->breakon = 1;
  1004. if (!info->xmit_cnt) {
  1005.     CY_UNLOCK(info, flags);
  1006.     start_xmit(info);
  1007.     CY_LOCK(info, flags);
  1008. }
  1009.     }
  1010. } else {
  1011.     if (!info->breakoff) {
  1012. info->breakoff = 1;
  1013. if (!info->xmit_cnt) {
  1014.     CY_UNLOCK(info, flags);
  1015.     start_xmit(info);
  1016.     CY_LOCK(info, flags);
  1017. }
  1018.     }
  1019. }
  1020.     } else {
  1021. int retval;
  1022. if (break_state == -1) {
  1023.     retval = cyz_issue_cmd(&cy_card[info->card],
  1024. (info->line) - (cy_card[info->card].first_line),
  1025. C_CM_SET_BREAK, 0L);
  1026.     if (retval != 0) {
  1027. printk("cyc:cy_break (set) retval on ttyC%d was %xn",
  1028.        info->line, retval);
  1029.     }
  1030. } else {
  1031.     retval = cyz_issue_cmd(&cy_card[info->card],
  1032. (info->line) - (cy_card[info->card].first_line),
  1033. C_CM_CLR_BREAK, 0L);
  1034.     if (retval != 0) {
  1035. printk("cyc:cy_break (clr) retval on ttyC%d was %xn",
  1036.        info->line, retval);
  1037.     }
  1038. }
  1039.     }
  1040.     CY_UNLOCK(info, flags);
  1041. } /* cy_break */
  1042. static int
  1043. get_mon_info(struct cyclades_port * info, struct cyclades_monitor * mon)
  1044. {
  1045.     if(copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
  1046.      return -EFAULT;
  1047.     info->mon.int_count  = 0;
  1048.     info->mon.char_count = 0;
  1049.     info->mon.char_max   = 0;
  1050.     info->mon.char_last  = 0;
  1051.     return 0;
  1052. }/* get_mon_info */
  1053. static int
  1054. set_threshold(struct cyclades_port * info, unsigned long value)
  1055. {
  1056.   unsigned char *base_addr;
  1057.   int card,channel,chip,index;
  1058.   unsigned long flags;
  1059.    
  1060.     card = info->card;
  1061.     channel = info->line - cy_card[card].first_line;
  1062.     if (!IS_CYC_Z(cy_card[card])) {
  1063. chip = channel>>2;
  1064. channel &= 0x03;
  1065. index = cy_card[card].bus_index;
  1066. base_addr = (unsigned char*)
  1067.        (cy_card[card].base_addr
  1068.        + (cy_chip_offset[chip]<<index));
  1069. info->cor3 &= ~CyREC_FIFO;
  1070. info->cor3 |= value & CyREC_FIFO;
  1071. CY_LOCK(info, flags);
  1072.     cy_writeb((u_long)base_addr+(CyCOR3<<index), info->cor3);
  1073.     cyy_issue_cmd(base_addr,CyCOR_CHANGE|CyCOR3ch,index);
  1074. CY_UNLOCK(info, flags);
  1075.     } else {
  1076. // Nothing to do!
  1077.     }
  1078.     return 0;
  1079. }/* set_threshold */
  1080. static int
  1081. get_threshold(struct cyclades_port * info, unsigned long *value)
  1082. {
  1083.   unsigned char *base_addr;
  1084.   int card,channel,chip,index;
  1085.   unsigned long tmp;
  1086.    
  1087.     card = info->card;
  1088.     channel = info->line - cy_card[card].first_line;
  1089.     if (!IS_CYC_Z(cy_card[card])) {
  1090. chip = channel>>2;
  1091. channel &= 0x03;
  1092. index = cy_card[card].bus_index;
  1093. base_addr = (unsigned char*)
  1094.        (cy_card[card].base_addr
  1095.        + (cy_chip_offset[chip]<<index));
  1096. tmp = cy_readb(base_addr+(CyCOR3<<index)) & CyREC_FIFO;
  1097. return cy_put_user(tmp,value);
  1098.     } else {
  1099. // Nothing to do!
  1100. return 0;
  1101.     }
  1102. }/* get_threshold */
  1103. static int
  1104. set_default_threshold(struct cyclades_port * info, unsigned long value)
  1105. {
  1106.     info->default_threshold = value & 0x0f;
  1107.     return 0;
  1108. }/* set_default_threshold */
  1109. static int
  1110. get_default_threshold(struct cyclades_port * info, unsigned long *value)
  1111. {
  1112.     return cy_put_user(info->default_threshold,value);
  1113. }/* get_default_threshold */
  1114. static int
  1115. set_timeout(struct cyclades_port * info, unsigned long value)
  1116. {
  1117.   unsigned char *base_addr;
  1118.   int card,channel,chip,index;
  1119.   unsigned long flags;
  1120.    
  1121.     card = info->card;
  1122.     channel = info->line - cy_card[card].first_line;
  1123.     if (!IS_CYC_Z(cy_card[card])) {
  1124. chip = channel>>2;
  1125. channel &= 0x03;
  1126. index = cy_card[card].bus_index;
  1127. base_addr = (unsigned char*)
  1128.        (cy_card[card].base_addr
  1129.        + (cy_chip_offset[chip]<<index));
  1130. CY_LOCK(info, flags);
  1131.     cy_writeb((u_long)base_addr+(CyRTPR<<index), value & 0xff);
  1132. CY_UNLOCK(info, flags);
  1133.     } else {
  1134. // Nothing to do!
  1135.     }
  1136.     return 0;
  1137. }/* set_timeout */
  1138. static int
  1139. get_timeout(struct cyclades_port * info, unsigned long *value)
  1140. {
  1141.   unsigned char *base_addr;
  1142.   int card,channel,chip,index;
  1143.   unsigned long tmp;
  1144.    
  1145.     card = info->card;
  1146.     channel = info->line - cy_card[card].first_line;
  1147.     if (!IS_CYC_Z(cy_card[card])) {
  1148. chip = channel>>2;
  1149. channel &= 0x03;
  1150. index = cy_card[card].bus_index;
  1151. base_addr = (unsigned char*)
  1152.        (cy_card[card].base_addr
  1153.        + (cy_chip_offset[chip]<<index));
  1154. tmp = cy_readb(base_addr+(CyRTPR<<index));
  1155. return cy_put_user(tmp,value);
  1156.     } else {
  1157. // Nothing to do!
  1158. return 0;
  1159.     }
  1160. }/* get_timeout */
  1161. static int
  1162. set_default_timeout(struct cyclades_port * info, unsigned long value)
  1163. {
  1164.     info->default_timeout = value & 0xff;
  1165.     return 0;
  1166. }/* set_default_timeout */
  1167. static int
  1168. get_default_timeout(struct cyclades_port * info, unsigned long *value)
  1169. {
  1170.     return cy_put_user(info->default_timeout,value);
  1171. }/* get_default_timeout */
  1172. /*
  1173.  * This routine allows the tty driver to implement device-
  1174.  * specific ioctl's.  If the ioctl number passed in cmd is
  1175.  * not recognized by the driver, it should return ENOIOCTLCMD.
  1176.  */
  1177. static int
  1178. cy_ioctl(struct tty_struct *tty, struct file * file,
  1179.             unsigned int cmd, unsigned long arg)
  1180. {
  1181.   struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
  1182.   struct cyclades_icount cprev, cnow; /* kernel counter temps */
  1183.   struct serial_icounter_struct *p_cuser; /* user space */
  1184.   int ret_val = 0;
  1185.   unsigned long flags;
  1186.     if (serial_paranoia_check(info, tty->device, "cy_ioctl"))
  1187. return -ENODEV;
  1188. #ifdef CY_DEBUG_OTHER
  1189.     printk("cyc:cy_ioctl ttyC%d, cmd = %x arg = %lxn",
  1190.         info->line, cmd, arg); /* */
  1191. #endif
  1192.     switch (cmd) {
  1193.         case CYGETMON:
  1194.             ret_val = get_mon_info(info, (struct cyclades_monitor *)arg);
  1195.             break;
  1196.         case CYGETTHRESH:
  1197.             ret_val = get_threshold(info, (unsigned long *)arg);
  1198.             break;
  1199.         case CYSETTHRESH:
  1200.             ret_val = set_threshold(info, (unsigned long)arg);
  1201.             break;
  1202.         case CYGETDEFTHRESH:
  1203.             ret_val = get_default_threshold(info, (unsigned long *)arg);
  1204.             break;
  1205.         case CYSETDEFTHRESH:
  1206.             ret_val = set_default_threshold(info, (unsigned long)arg);
  1207.             break;
  1208.         case CYGETTIMEOUT:
  1209.             ret_val = get_timeout(info, (unsigned long *)arg);
  1210.             break;
  1211.         case CYSETTIMEOUT:
  1212.             ret_val = set_timeout(info, (unsigned long)arg);
  1213.             break;
  1214.         case CYGETDEFTIMEOUT:
  1215.             ret_val = get_default_timeout(info, (unsigned long *)arg);
  1216.             break;
  1217.         case CYSETDEFTIMEOUT:
  1218.             ret_val = set_default_timeout(info, (unsigned long)arg);
  1219.             break;
  1220. case CYSETRFLOW:
  1221.          info->rflow = (int)arg;
  1222.     ret_val = 0;
  1223.     break;
  1224. case CYGETRFLOW:
  1225.     ret_val = info->rflow;
  1226.     break;
  1227. case CYSETRTSDTR_INV:
  1228.          info->rtsdtr_inv = (int)arg;
  1229.     ret_val = 0;
  1230.     break;
  1231. case CYGETRTSDTR_INV:
  1232.     ret_val = info->rtsdtr_inv;
  1233.     break;
  1234. case CYGETCARDINFO:
  1235.             if (copy_to_user((void *)arg, (void *)&cy_card[info->card], 
  1236. sizeof (struct cyclades_card))) {
  1237. ret_val = -EFAULT;
  1238. break;
  1239.     }
  1240.     ret_val = 0;
  1241.             break;
  1242. case CYGETCD1400VER:
  1243.     ret_val = info->chip_rev;
  1244.     break;
  1245. #ifndef CONFIG_CYZ_INTR
  1246. case CYZSETPOLLCYCLE:
  1247.             cyz_polling_cycle = (arg * HZ) / 1000;
  1248.     ret_val = 0;
  1249.     break;
  1250. case CYZGETPOLLCYCLE:
  1251.             ret_val = (cyz_polling_cycle * 1000) / HZ;
  1252.     break;
  1253. #endif /* CONFIG_CYZ_INTR */
  1254. case CYSETWAIT:
  1255.          info->closing_wait = (unsigned short)arg * HZ/100;
  1256.     ret_val = 0;
  1257.     break;
  1258. case CYGETWAIT:
  1259.     ret_val = info->closing_wait / (HZ/100);
  1260.     break;
  1261.         case TIOCMGET:
  1262.             ret_val = get_modem_info(info, (unsigned int *) arg);
  1263.             break;
  1264.         case TIOCMBIS:
  1265.         case TIOCMBIC:
  1266.         case TIOCMSET:
  1267.             ret_val = set_modem_info(info, cmd, (unsigned int *) arg);
  1268.             break;
  1269.         case TIOCGSERIAL:
  1270.             ret_val = get_serial_info(info, (struct serial_struct *) arg);
  1271.             break;
  1272.         case TIOCSSERIAL:
  1273.             ret_val = set_serial_info(info, (struct serial_struct *) arg);
  1274.             break;
  1275. case TIOCSERGETLSR: /* Get line status register */
  1276.     ret_val = get_lsr_info(info, (unsigned int *) arg);
  1277.     break;
  1278. /*
  1279.  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change 
  1280.  * - mask passed in arg for lines of interest
  1281.  *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
  1282.  * Caller should use TIOCGICOUNT to see which one it was
  1283.  */
  1284. case TIOCMIWAIT:
  1285.     CY_LOCK(info, flags);
  1286.     /* note the counters on entry */
  1287.     cprev = info->icount;
  1288.     CY_UNLOCK(info, flags);
  1289.     while (1) {
  1290. interruptible_sleep_on(&info->delta_msr_wait);
  1291. /* see if a signal did it */
  1292. if (signal_pending(current)) {
  1293.     return -ERESTARTSYS;
  1294. }
  1295. CY_LOCK(info, flags);
  1296. cnow = info->icount; /* atomic copy */
  1297. CY_UNLOCK(info, flags);
  1298. if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
  1299.     cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
  1300.     return -EIO; /* no change => error */
  1301. }
  1302. if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 
  1303.      ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 
  1304.      ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) || 
  1305.      ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
  1306.     return 0;
  1307. }
  1308. cprev = cnow;
  1309.     }
  1310.     /* NOTREACHED */
  1311. /*
  1312.  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
  1313.  * Return: write counters to the user passed counter struct
  1314.  * NB: both 1->0 and 0->1 transitions are counted except for
  1315.  *     RI where only 0->1 is counted.
  1316.  */
  1317. case TIOCGICOUNT:
  1318.     CY_LOCK(info, flags);
  1319.     cnow = info->icount;
  1320.     CY_UNLOCK(info, flags);
  1321.     p_cuser = (struct serial_icounter_struct *) arg;
  1322.     ret_val = put_user(cnow.cts, &p_cuser->cts);
  1323.     if (ret_val) return ret_val;
  1324.     ret_val = put_user(cnow.dsr, &p_cuser->dsr);
  1325.     if (ret_val) return ret_val;
  1326.     ret_val = put_user(cnow.rng, &p_cuser->rng);
  1327.     if (ret_val) return ret_val;
  1328.     ret_val = put_user(cnow.dcd, &p_cuser->dcd);
  1329.     if (ret_val) return ret_val;
  1330.     ret_val = put_user(cnow.rx, &p_cuser->rx);
  1331.     if (ret_val) return ret_val;
  1332.     ret_val = put_user(cnow.tx, &p_cuser->tx);
  1333.     if (ret_val) return ret_val;
  1334.     ret_val = put_user(cnow.frame, &p_cuser->frame);
  1335.     if (ret_val) return ret_val;
  1336.     ret_val = put_user(cnow.overrun, &p_cuser->overrun);
  1337.     if (ret_val) return ret_val;
  1338.     ret_val = put_user(cnow.parity, &p_cuser->parity);
  1339.     if (ret_val) return ret_val;
  1340.     ret_val = put_user(cnow.brk, &p_cuser->brk);
  1341.     if (ret_val) return ret_val;
  1342.     ret_val = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
  1343.     if (ret_val) return ret_val;
  1344.     ret_val = 0;
  1345.     break;
  1346.         default:
  1347.             ret_val = -ENOIOCTLCMD;
  1348.     }
  1349. #ifdef CY_DEBUG_OTHER
  1350.     printk(" cyc:cy_ioctl donen");
  1351. #endif
  1352.     return ret_val;
  1353. } /* cy_ioctl */
  1354. /*
  1355.  * This routine allows the tty driver to be notified when
  1356.  * device's termios settings have changed.  Note that a
  1357.  * well-designed tty driver should be prepared to accept the case
  1358.  * where old == NULL, and try to do something rational.
  1359.  */
  1360. static void
  1361. cy_set_termios(struct tty_struct *tty, struct termios * old_termios)
  1362. {
  1363.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1364. #ifdef CY_DEBUG_OTHER
  1365.     printk("cyc:cy_set_termios ttyC%dn", info->line);
  1366. #endif
  1367.     if ((tty->termios->c_cflag == old_termios->c_cflag) &&
  1368. ((tty->termios->c_iflag & (IXON|IXANY)) == 
  1369.  (old_termios->c_iflag & (IXON|IXANY))))
  1370.         return;
  1371.     set_line_char(info);
  1372.     if ((old_termios->c_cflag & CRTSCTS) &&
  1373.         !(tty->termios->c_cflag & CRTSCTS)) {
  1374.             tty->hw_stopped = 0;
  1375.             cy_start(tty);
  1376.     }
  1377. #if 0
  1378.     /*
  1379.      * No need to wake up processes in open wait, since they
  1380.      * sample the CLOCAL flag once, and don't recheck it.
  1381.      * XXX  It's not clear whether the current behavior is correct
  1382.      * or not.  Hence, this may change.....
  1383.      */
  1384.     if (!(old_termios->c_cflag & CLOCAL) &&
  1385.         (tty->termios->c_cflag & CLOCAL))
  1386.             wake_up_interruptible(&info->open_wait);
  1387. #endif
  1388.     return;
  1389. } /* cy_set_termios */
  1390. /* This routine is called by the upper-layer tty layer to signal
  1391.    that incoming characters should be throttled because the input
  1392.    buffers are close to full.
  1393.  */
  1394. static void
  1395. cy_throttle(struct tty_struct * tty)
  1396. {
  1397.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1398.   unsigned long flags;
  1399.   unsigned char *base_addr;
  1400.   int card,chip,channel,index;
  1401. #ifdef CY_DEBUG_THROTTLE
  1402.   char buf[64];
  1403.     printk("cyc:throttle %s: %d....ttyC%dn", 
  1404.    tty_name(tty, buf),
  1405.            tty->ldisc.chars_in_buffer(tty), info->line);
  1406. #endif
  1407.     if (serial_paranoia_check(info, tty->device, "cy_throttle")){
  1408.             return;
  1409.     }
  1410.     if (I_IXOFF(tty)) {
  1411.         info->x_char = STOP_CHAR(tty);
  1412.             /* Should use the "Send Special Character" feature!!! */
  1413.     }
  1414.     card = info->card;
  1415.     channel = info->line - cy_card[card].first_line;
  1416.     if (!IS_CYC_Z(cy_card[card])) {
  1417. chip = channel>>2;
  1418. channel &= 0x03;
  1419. index = cy_card[card].bus_index;
  1420. base_addr = (unsigned char*)
  1421.        (cy_card[card].base_addr
  1422.        + (cy_chip_offset[chip]<<index));
  1423. CY_LOCK(info, flags);
  1424. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  1425. if (info->rtsdtr_inv) {
  1426. cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  1427. } else {
  1428. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  1429. }
  1430. CY_UNLOCK(info, flags);
  1431.     } else {
  1432. // Nothing to do!
  1433.     }
  1434.     return;
  1435. } /* cy_throttle */
  1436. /*
  1437.  * This routine notifies the tty driver that it should signal
  1438.  * that characters can now be sent to the tty without fear of
  1439.  * overrunning the input buffers of the line disciplines.
  1440.  */
  1441. static void
  1442. cy_unthrottle(struct tty_struct * tty)
  1443. {
  1444.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1445.   unsigned long flags;
  1446.   unsigned char *base_addr;
  1447.   int card,chip,channel,index;
  1448. #ifdef CY_DEBUG_THROTTLE
  1449.   char buf[64];
  1450.         
  1451.     printk("cyc:unthrottle %s: %d....ttyC%dn", 
  1452.    tty_name(tty, buf),
  1453.            tty->ldisc.chars_in_buffer(tty), info->line);
  1454. #endif
  1455.     if (serial_paranoia_check(info, tty->device, "cy_unthrottle")){
  1456.             return;
  1457.     }
  1458.     if (I_IXOFF(tty)) {
  1459. if (info->x_char)
  1460.     info->x_char = 0;
  1461. else
  1462.     info->x_char = START_CHAR(tty);
  1463.             /* Should use the "Send Special Character" feature!!! */
  1464.     }
  1465.     card = info->card;
  1466.     channel = info->line - cy_card[card].first_line;
  1467.     if (!IS_CYC_Z(cy_card[card])) {
  1468. chip = channel>>2;
  1469. channel &= 0x03;
  1470. index = cy_card[card].bus_index;
  1471. base_addr = (unsigned char*)
  1472.        (cy_card[card].base_addr
  1473.        + (cy_chip_offset[chip]<<index));
  1474. CY_LOCK(info, flags);
  1475. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  1476. if (info->rtsdtr_inv) {
  1477. cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  1478. } else {
  1479. cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  1480. }
  1481. CY_UNLOCK(info, flags);
  1482.     }else{
  1483. // Nothing to do!
  1484.     }
  1485.     return;
  1486. } /* cy_unthrottle */
  1487. /* cy_start and cy_stop provide software output flow control as a
  1488.    function of XON/XOFF, software CTS, and other such stuff.
  1489. */
  1490. static void
  1491. cy_stop(struct tty_struct *tty)
  1492. {
  1493.   struct cyclades_card *cinfo;
  1494.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1495.   unsigned char *base_addr;
  1496.   int chip,channel,index;
  1497.   unsigned long flags;
  1498. #ifdef CY_DEBUG_OTHER
  1499.     printk("cyc:cy_stop ttyC%dn", info->line); /* */
  1500. #endif
  1501.     if (serial_paranoia_check(info, tty->device, "cy_stop"))
  1502.         return;
  1503.         
  1504.     cinfo = &cy_card[info->card];
  1505.     channel = info->line - cinfo->first_line;
  1506.     if (!IS_CYC_Z(*cinfo)) {
  1507.         index = cinfo->bus_index;
  1508.         chip = channel>>2;
  1509.         channel &= 0x03;
  1510.         base_addr = (unsigned char*)
  1511.                    (cy_card[info->card].base_addr
  1512.                            + (cy_chip_offset[chip]<<index));
  1513. CY_LOCK(info, flags);
  1514.             cy_writeb((u_long)base_addr+(CyCAR<<index),
  1515.        (u_char)(channel & 0x0003)); /* index channel */
  1516.             cy_writeb((u_long)base_addr+(CySRER<<index), 
  1517.                cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy);
  1518. CY_UNLOCK(info, flags);
  1519.     } else {
  1520. // Nothing to do!
  1521.     }
  1522.     return;
  1523. } /* cy_stop */
  1524. static void
  1525. cy_start(struct tty_struct *tty)
  1526. {
  1527.   struct cyclades_card *cinfo;
  1528.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1529.   unsigned char *base_addr;
  1530.   int chip,channel,index;
  1531.   unsigned long flags;
  1532. #ifdef CY_DEBUG_OTHER
  1533.     printk("cyc:cy_start ttyC%dn", info->line); /* */
  1534. #endif
  1535.     if (serial_paranoia_check(info, tty->device, "cy_start"))
  1536.         return;
  1537.         
  1538.     cinfo = &cy_card[info->card];
  1539.     channel = info->line - cinfo->first_line;
  1540.     index = cinfo->bus_index;
  1541.     if (!IS_CYC_Z(*cinfo)) {
  1542.         chip = channel>>2;
  1543.         channel &= 0x03;
  1544.         base_addr = (unsigned char*)
  1545.                        (cy_card[info->card].base_addr
  1546.        + (cy_chip_offset[chip]<<index));
  1547. CY_LOCK(info, flags);
  1548.             cy_writeb((u_long)base_addr+(CyCAR<<index),
  1549.        (u_char)(channel & 0x0003)); /* index channel */
  1550.             cy_writeb((u_long)base_addr+(CySRER<<index), 
  1551.                cy_readb(base_addr+(CySRER<<index)) | CyTxRdy);
  1552. CY_UNLOCK(info, flags);
  1553.     } else {
  1554. // Nothing to do!
  1555.     }
  1556.     return;
  1557. } /* cy_start */
  1558. static void
  1559. cy_flush_buffer(struct tty_struct *tty)
  1560. {
  1561.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  1562.   int card, channel, retval;
  1563.   unsigned long flags;
  1564.                                 
  1565. #ifdef CY_DEBUG_IO
  1566.     printk("cyc:cy_flush_buffer ttyC%dn", info->line); /* */
  1567. #endif
  1568.     if (serial_paranoia_check(info, tty->device, "cy_flush_buffer"))
  1569.         return;
  1570.     card = info->card;
  1571.     channel = (info->line) - (cy_card[card].first_line);
  1572.     CY_LOCK(info, flags);
  1573.     info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  1574.     CY_UNLOCK(info, flags);
  1575.     if (IS_CYC_Z(cy_card[card])) { /* If it is a Z card, flush the on-board 
  1576.       buffers as well */
  1577. CY_LOCK(info, flags);
  1578. retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_FLUSH_TX, 0L);
  1579. if (retval != 0) {
  1580.     printk("cyc: flush_buffer retval on ttyC%d was %xn",
  1581.    info->line, retval);
  1582. }
  1583. CY_UNLOCK(info, flags);
  1584.     }
  1585.     wake_up_interruptible(&tty->write_wait);
  1586.     if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP))
  1587. && tty->ldisc.write_wakeup)
  1588.     (tty->ldisc.write_wakeup)(tty);
  1589. } /* cy_flush_buffer */
  1590. /*
  1591.  * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
  1592.  */
  1593. static void
  1594. cy_hangup(struct tty_struct *tty)
  1595. {
  1596.   struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
  1597.         
  1598. #ifdef CY_DEBUG_OTHER
  1599.     printk("cyc:cy_hangup ttyC%dn", info->line); /* */
  1600. #endif
  1601.     if (serial_paranoia_check(info, tty->device, "cy_hangup"))
  1602.         return;
  1603.     cy_flush_buffer(tty);
  1604.     shutdown(info);
  1605.     info->event = 0;
  1606.     info->count = 0;
  1607. #ifdef CY_DEBUG_COUNT
  1608.     printk("cyc:cy_hangup (%d): setting count to 0n", current->pid);
  1609. #endif
  1610.     info->tty = 0;
  1611.     info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE);
  1612.     wake_up_interruptible(&info->open_wait);
  1613. } /* cy_hangup */
  1614. /*
  1615.  * ---------------------------------------------------------------------
  1616.  * cy_init() and friends
  1617.  *
  1618.  * cy_init() is called at boot-time to initialize the serial driver.
  1619.  * ---------------------------------------------------------------------
  1620.  */
  1621. /* initialize chips on Cyclom-Y card -- return number of valid
  1622.    chips (which is number of ports/4) */
  1623. static unsigned short __init
  1624. cyy_init_card(volatile ucchar *true_base_addr,int index)
  1625. {
  1626.   unsigned int chip_number;
  1627.   volatile ucchar* base_addr;
  1628.     cy_writeb((u_long)true_base_addr+(Cy_HwReset<<index), 0); 
  1629. /* Cy_HwReset is 0x1400 */
  1630.     cy_writeb((u_long)true_base_addr+(Cy_ClrIntr<<index), 0); 
  1631. /* Cy_ClrIntr is 0x1800 */
  1632.     udelay(500L);
  1633.     for(chip_number=0; chip_number<CyMAX_CHIPS_PER_CARD; chip_number++){
  1634.         base_addr = true_base_addr
  1635.                + (cy_chip_offset[chip_number]<<index);
  1636.         mdelay(1);
  1637.         if(cy_readb(base_addr+(CyCCR<<index)) != 0x00){
  1638.             /*************
  1639.             printk(" chip #%d at %#6lx is never idle (CCR != 0)n",
  1640.                chip_number, (unsigned long)base_addr);
  1641.             *************/
  1642.             return chip_number;
  1643.         }
  1644.         cy_writeb((u_long)base_addr+(CyGFRCR<<index), 0);
  1645.         udelay(10L);
  1646.         /* The Cyclom-16Y does not decode address bit 9 and therefore
  1647.            cannot distinguish between references to chip 0 and a non-
  1648.            existent chip 4.  If the preceding clearing of the supposed
  1649.            chip 4 GFRCR register appears at chip 0, there is no chip 4
  1650.            and this must be a Cyclom-16Y, not a Cyclom-32Ye.
  1651.         */
  1652.         if (chip_number == 4
  1653.         && cy_readb(true_base_addr
  1654.     + (cy_chip_offset[0]<<index)
  1655.     + (CyGFRCR<<index)) == 0){
  1656.             return chip_number;
  1657.         }
  1658.         cy_writeb((u_long)base_addr+(CyCCR<<index), CyCHIP_RESET);
  1659.         mdelay(1);
  1660.         if(cy_readb(base_addr+(CyGFRCR<<index)) == 0x00){
  1661.             /*
  1662.             printk(" chip #%d at %#6lx is not responding ",
  1663.                chip_number, (unsigned long)base_addr);
  1664.             printk("(GFRCR stayed 0)n",
  1665.             */
  1666.             return chip_number;
  1667.         }
  1668.         if((0xf0 & (cy_readb(base_addr+(CyGFRCR<<index)))) != 0x40){
  1669.             /*
  1670.             printk(" chip #%d at %#6lx is not valid (GFRCR == %#2x)n",
  1671.                chip_number, (unsigned long)base_addr,
  1672.        base_addr[CyGFRCR<<index]);
  1673.             */
  1674.             return chip_number;
  1675.         }
  1676.         cy_writeb((u_long)base_addr+(CyGCR<<index), CyCH0_SERIAL);
  1677.         if (cy_readb(base_addr+(CyGFRCR<<index)) >= CD1400_REV_J){
  1678.     /* It is a CD1400 rev. J or later */
  1679.     /* Impossible to reach 5ms with this chip. 
  1680.        Changed to 2ms instead (f = 500 Hz). */
  1681.     cy_writeb((u_long)base_addr+(CyPPR<<index), CyCLOCK_60_2MS);
  1682. } else {
  1683.     /* f = 200 Hz */
  1684.     cy_writeb((u_long)base_addr+(CyPPR<<index), CyCLOCK_25_5MS);
  1685. }
  1686.     /*
  1687.         printk(" chip #%d at %#6lx is rev 0x%2xn",
  1688.                chip_number, (unsigned long)base_addr,
  1689.        cy_readb(base_addr+(CyGFRCR<<index)));
  1690.     */
  1691.     }
  1692.     return chip_number;
  1693. } /* cyy_init_card */
  1694. /*
  1695.  * ---------------------------------------------------------------------
  1696.  * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
  1697.  * sets global variables and return the number of ISA boards found.
  1698.  * ---------------------------------------------------------------------
  1699.  */
  1700. static int __init
  1701. cy_detect_isa(void)
  1702. {
  1703. #ifdef CONFIG_ISA
  1704.   unsigned short cy_isa_irq,nboard;
  1705.   volatile ucchar *cy_isa_address;
  1706.   unsigned short i,j,cy_isa_nchan;
  1707. #ifdef MODULE
  1708.   int isparam = 0;
  1709. #endif
  1710.         nboard = 0;
  1711. #ifdef MODULE
  1712. /* Check for module parameters */
  1713. for(i = 0 ; i < NR_CARDS; i++) {
  1714.     if (maddr[i] || i) {
  1715. isparam = 1;
  1716. cy_isa_addresses[i] = (ucchar *)maddr[i];
  1717.     }
  1718.     if (!maddr[i])
  1719. break;
  1720. }
  1721. #endif
  1722.         /* scan the address table probing for Cyclom-Y/ISA boards */
  1723.         for (i = 0 ; i < NR_ISA_ADDRS ; i++) {
  1724.                 cy_isa_address = cy_isa_addresses[i];
  1725.                 if (cy_isa_address  == 0x0000) {
  1726.                         return(nboard);
  1727.                 }
  1728.                 /* probe for CD1400... */
  1729. #if !defined(__alpha__)
  1730. cy_isa_address = ioremap((ulong)cy_isa_address, CyISA_Ywin);
  1731. #endif
  1732.                 cy_isa_nchan = CyPORTS_PER_CHIP * 
  1733.                      cyy_init_card(cy_isa_address,0);
  1734.                 if (cy_isa_nchan == 0) {
  1735.                         continue;
  1736.                 }
  1737. #ifdef MODULE
  1738. if (isparam && irq[i])
  1739.     cy_isa_irq = irq[i];
  1740. else
  1741. #endif
  1742.                 /* find out the board's irq by probing */
  1743.                 cy_isa_irq = detect_isa_irq(cy_isa_address);
  1744.                 if (cy_isa_irq == 0) {
  1745.                         printk("Cyclom-Y/ISA found at 0x%lx ",
  1746.                                 (unsigned long) cy_isa_address);
  1747.                         printk("but the IRQ could not be detected.n");
  1748.                         continue;
  1749.                 }
  1750.                 if((cy_next_channel+cy_isa_nchan) > NR_PORTS) {
  1751.                         printk("Cyclom-Y/ISA found at 0x%lx ",
  1752.                                 (unsigned long) cy_isa_address);
  1753.                         printk("but no more channels are available.n");
  1754.                         printk("Change NR_PORTS in cyclades.c and recompile kernel.n");
  1755.                         return(nboard);
  1756.                 }
  1757.                 /* fill the next cy_card structure available */
  1758.                 for (j = 0 ; j < NR_CARDS ; j++) {
  1759.                         if (cy_card[j].base_addr == 0)  break;
  1760.                 }
  1761.                 if (j == NR_CARDS) {    /* no more cy_cards available */
  1762.                         printk("Cyclom-Y/ISA found at 0x%lx ",
  1763.                                 (unsigned long) cy_isa_address);
  1764.                         printk("but no more cards can be used .n");
  1765.                         printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  1766.                         return(nboard);
  1767.                 }
  1768.                 /* allocate IRQ */
  1769.                 if(request_irq(cy_isa_irq, cyy_interrupt,
  1770.    SA_INTERRUPT, "Cyclom-Y", &cy_card[j]))
  1771.                 {
  1772.                         printk("Cyclom-Y/ISA found at 0x%lx ",
  1773.                                 (unsigned long) cy_isa_address);
  1774.                         printk("but could not allocate IRQ#%d.n",
  1775.                                 cy_isa_irq);
  1776.                         return(nboard);
  1777.                 }
  1778.                 /* set cy_card */
  1779.                 cy_card[j].base_addr = (u_long) cy_isa_address;
  1780.                 cy_card[j].ctl_addr = 0;
  1781.                 cy_card[j].irq = (int) cy_isa_irq;
  1782.                 cy_card[j].bus_index = 0;
  1783.                 cy_card[j].first_line = cy_next_channel;
  1784.                 cy_card[j].num_chips = cy_isa_nchan/4;
  1785.                 nboard++;
  1786.                         
  1787.                 /* print message */
  1788.                 printk("Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d, ",
  1789.                     j+1, (unsigned long) cy_isa_address,
  1790.                     (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)),
  1791.     cy_isa_irq);
  1792.                 printk("%d channels starting from port %d.n",
  1793.                         cy_isa_nchan, cy_next_channel);
  1794.                 cy_next_channel += cy_isa_nchan;
  1795.         }
  1796.         return(nboard);
  1797. #else
  1798.         return(0);
  1799. #endif /* CONFIG_ISA */
  1800. } /* cy_detect_isa */
  1801. static void 
  1802. plx_init(uclong addr, uclong initctl)
  1803. {
  1804.     /* Reset PLX */
  1805.     cy_writel(addr + initctl, cy_readl(addr + initctl) | 0x40000000);
  1806.     udelay(100L);
  1807.     cy_writel(addr + initctl, cy_readl(addr + initctl) & ~0x40000000);
  1808.     /* Reload Config. Registers from EEPROM */
  1809.     cy_writel(addr + initctl, cy_readl(addr + initctl) | 0x20000000);
  1810.     udelay(100L);
  1811.     cy_writel(addr + initctl, cy_readl(addr + initctl) & ~0x20000000);
  1812. }
  1813. /*
  1814.  * ---------------------------------------------------------------------
  1815.  * cy_detect_pci() - Test PCI bus presence and Cyclom-Ye/PCI.
  1816.  * sets global variables and return the number of PCI boards found.
  1817.  * ---------------------------------------------------------------------
  1818.  */
  1819. static int __init
  1820. cy_detect_pci(void)
  1821. {
  1822. #ifdef CONFIG_PCI
  1823.   struct pci_dev *pdev = NULL;
  1824.   unsigned char cyy_rev_id;
  1825.   unsigned char         cy_pci_irq = 0;
  1826.   uclong cy_pci_phys0, cy_pci_phys1, cy_pci_phys2;
  1827.   uclong cy_pci_addr0, cy_pci_addr2;
  1828.   unsigned short        i,j,cy_pci_nchan, plx_ver;
  1829.   unsigned short        device_id,dev_index = 0;
  1830.   uclong mailbox;
  1831.   uclong Ze_addr0[NR_CARDS], Ze_addr2[NR_CARDS], ZeIndex = 0;
  1832.   uclong Ze_phys0[NR_CARDS], Ze_phys2[NR_CARDS];
  1833.   unsigned char         Ze_irq[NR_CARDS];
  1834.   struct resource *resource;
  1835.   unsigned long res_start, res_len;
  1836.         for (i = 0; i < NR_CARDS; i++) {
  1837.                 /* look for a Cyclades card by vendor and device id */
  1838.                 while((device_id = cy_pci_dev_id[dev_index]) != 0) {
  1839.                         if((pdev = pci_find_device(PCI_VENDOR_ID_CYCLADES,
  1840.                                         device_id, pdev)) == NULL) {
  1841.                                 dev_index++;    /* try next device id */
  1842.                         } else {
  1843.                                 break;          /* found a board */
  1844.                         }
  1845.                 }
  1846. if (device_id == 0)
  1847.     break;
  1848. if (pci_enable_device(pdev))
  1849.     continue;
  1850.                 /* read PCI configuration area */
  1851. cy_pci_irq = pdev->irq;
  1852. cy_pci_phys0 = pci_resource_start(pdev, 0);
  1853. cy_pci_phys1 = pci_resource_start(pdev, 1);
  1854. cy_pci_phys2 = pci_resource_start(pdev, 2);
  1855. pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id);
  1856. device_id &= ~PCI_DEVICE_ID_MASK;
  1857. if ((device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo)
  1858.     || (device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi)){
  1859. #ifdef CY_PCI_DEBUG
  1860.             printk("Cyclom-Y/PCI (bus=0x0%x, pci_id=0x%x, ",
  1861. pdev->bus->number, pdev->devfn);
  1862.             printk("rev_id=%d) IRQ%dn",
  1863. cyy_rev_id, (int)cy_pci_irq);
  1864.             printk("Cyclom-Y/PCI:found  winaddr=0x%lx ctladdr=0x%lxn",
  1865. (ulong)cy_pci_phys2, (ulong)cy_pci_phys0);
  1866. #endif
  1867. if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) {
  1868.     printk("  Warning: PCI I/O bit incorrectly set. "
  1869.    "Ignoring it...n");
  1870.     pdev->resource[2].flags &= ~IORESOURCE_IO;
  1871. }
  1872. /* Although we don't use this I/O region, we should
  1873.    request it from the kernel anyway, to avoid problems
  1874.    with other drivers accessing it. */
  1875. resource = request_region(cy_pci_phys1, CyPCI_Yctl, "Cyclom-Y");
  1876. if (resource == NULL) {
  1877.     printk(KERN_ERR "cyclades: failed to allocate IO "
  1878.     "resource at 0x%lxn", cy_pci_phys1);
  1879.     continue;
  1880. }
  1881. res_start = cy_pci_phys1;
  1882. res_len = CyPCI_Yctl;
  1883. #if defined(__alpha__)
  1884.                 if (device_id  == PCI_DEVICE_ID_CYCLOM_Y_Lo) { /* below 1M? */
  1885.     printk("Cyclom-Y/PCI (bus=0x0%x, pci_id=0x%x, ",
  1886. pdev->bus->number, pdev->devfn);
  1887.     printk("rev_id=%d) IRQ%dn",
  1888.         cyy_rev_id, (int)cy_pci_irq);
  1889.                     printk("Cyclom-Y/PCI:found  winaddr=0x%lx ctladdr=0x%lxn",
  1890.         (ulong)cy_pci_phys2, (ulong)cy_pci_phys0);
  1891.             printk("Cyclom-Y/PCI not supported for low addresses in "
  1892.                            "Alpha systems.n");
  1893.     i--;
  1894.             continue;
  1895.                 }
  1896. #endif
  1897. cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Yctl);
  1898. cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ywin);
  1899. #ifdef CY_PCI_DEBUG
  1900.             printk("Cyclom-Y/PCI: relocate winaddr=0x%lx ctladdr=0x%lxn",
  1901. (u_long)cy_pci_addr2, (u_long)cy_pci_addr0);
  1902. #endif
  1903.                 cy_pci_nchan = (unsigned short)(CyPORTS_PER_CHIP * 
  1904.                        cyy_init_card((volatile ucchar *)cy_pci_addr2, 1));
  1905.                 if(cy_pci_nchan == 0) {
  1906.                         printk("Cyclom-Y PCI host card with ");
  1907.                         printk("no Serial-Modules at 0x%lx.n",
  1908.     (ulong) cy_pci_phys2);
  1909.                         i--;
  1910.                         continue;
  1911.                 }
  1912.                 if((cy_next_channel+cy_pci_nchan) > NR_PORTS) {
  1913.                         printk("Cyclom-Y/PCI found at 0x%lx ",
  1914.     (ulong) cy_pci_phys2);
  1915.                         printk("but no channels are available.n");
  1916.                         printk("Change NR_PORTS in cyclades.c and recompile kernel.n");
  1917.                         return(i);
  1918.                 }
  1919.                 /* fill the next cy_card structure available */
  1920.                 for (j = 0 ; j < NR_CARDS ; j++) {
  1921.                         if (cy_card[j].base_addr == 0)  break;
  1922.                 }
  1923.                 if (j == NR_CARDS) {    /* no more cy_cards available */
  1924.                         printk("Cyclom-Y/PCI found at 0x%lx ",
  1925.     (ulong) cy_pci_phys2);
  1926.                         printk("but no more cards can be used.n");
  1927.                         printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  1928.                         return(i);
  1929.                 }
  1930.                 /* allocate IRQ */
  1931.                 if(request_irq(cy_pci_irq, cyy_interrupt,
  1932.         SA_SHIRQ, "Cyclom-Y", &cy_card[j]))
  1933.                 {
  1934.                         printk("Cyclom-Y/PCI found at 0x%lx ",
  1935.     (ulong) cy_pci_phys2);
  1936.                         printk("but could not allocate IRQ%d.n",
  1937.     cy_pci_irq);
  1938.                         return(i);
  1939.                 }
  1940.                 /* set cy_card */
  1941.                 cy_card[j].base_phys = (ulong)cy_pci_phys2;
  1942.                 cy_card[j].ctl_phys = (ulong)cy_pci_phys0;
  1943.                 cy_card[j].base_addr = (ulong)cy_pci_addr2;
  1944.                 cy_card[j].ctl_addr = (ulong)cy_pci_addr0;
  1945.                 cy_card[j].irq = (int) cy_pci_irq;
  1946.                 cy_card[j].bus_index = 1;
  1947.                 cy_card[j].first_line = cy_next_channel;
  1948.                 cy_card[j].num_chips = cy_pci_nchan/4;
  1949. cy_card[j].resource = resource;
  1950. cy_card[j].res_start = res_start;
  1951. cy_card[j].res_len = res_len;
  1952. resource = NULL; /* For next card */
  1953.                 /* enable interrupts in the PCI interface */
  1954. plx_ver = cy_readb(cy_pci_addr2 + CyPLX_VER) & 0x0f;
  1955. switch (plx_ver) {
  1956.     case PLX_9050:
  1957.     cy_writeb(cy_pci_addr0+0x4c, 0x43);
  1958.     break;
  1959.     case PLX_9060:
  1960.     case PLX_9080:
  1961.     default: /* Old boards, use PLX_9060 */
  1962.     plx_init(cy_pci_addr0, 0x6c);
  1963.     /* For some yet unknown reason, once the PLX9060 reloads
  1964.        the EEPROM, the IRQ is lost and, thus, we have to
  1965.        re-write it to the PCI config. registers.
  1966.        This will remain here until we find a permanent fix. */
  1967.     pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, cy_pci_irq);
  1968.     cy_writew(cy_pci_addr0+0x68, 
  1969. cy_readw(cy_pci_addr0+0x68)|0x0900);
  1970.     break;
  1971. }
  1972.                 /* print message */
  1973.                 printk("Cyclom-Y/PCI #%d: 0x%lx-0x%lx, IRQ%d, ",
  1974.        j+1, 
  1975.        (ulong)cy_pci_phys2, 
  1976.        (ulong)(cy_pci_phys2 + CyPCI_Ywin - 1),
  1977.        (int)cy_pci_irq);
  1978.                 printk("%d channels starting from port %d.n",
  1979.     cy_pci_nchan, cy_next_channel);
  1980.                 cy_next_channel += cy_pci_nchan;
  1981. }else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Lo){
  1982.     /* print message */
  1983. printk("Cyclades-Z/PCI (bus=0x0%x, pci_id=0x%x, ",
  1984.     pdev->bus->number, pdev->devfn);
  1985. printk("rev_id=%d) IRQ%dn",
  1986.     cyy_rev_id, (int)cy_pci_irq);
  1987. printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lxn",
  1988.     (ulong)cy_pci_phys2, (ulong)cy_pci_phys0);
  1989.     printk("Cyclades-Z/PCI not supported for low addressesn");
  1990.     break;
  1991. }else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi){
  1992. #ifdef CY_PCI_DEBUG
  1993.             printk("Cyclades-Z/PCI (bus=0x0%x, pci_id=0x%x, ",
  1994.         pdev->bus->number, pdev->devfn);
  1995.             printk("rev_id=%d) IRQ%dn",
  1996. cyy_rev_id, (int)cy_pci_irq);
  1997.             printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lxn",
  1998.                 (ulong)cy_pci_phys2, (ulong)cy_pci_phys0);
  1999. #endif
  2000. cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Zctl);
  2001. /* Disable interrupts on the PLX before resetting it */
  2002. cy_writew(cy_pci_addr0+0x68,
  2003. cy_readw(cy_pci_addr0+0x68) & ~0x0900);
  2004. plx_init(cy_pci_addr0, 0x6c);
  2005. /* For some yet unknown reason, once the PLX9060 reloads
  2006.    the EEPROM, the IRQ is lost and, thus, we have to
  2007.    re-write it to the PCI config. registers.
  2008.    This will remain here until we find a permanent fix. */
  2009. pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, cy_pci_irq);
  2010. mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) 
  2011.    cy_pci_addr0)->mail_box_0);
  2012. if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) {
  2013.     printk("  Warning: PCI I/O bit incorrectly set. "
  2014.    "Ignoring it...n");
  2015.     pdev->resource[2].flags &= ~IORESOURCE_IO;
  2016. }
  2017. /* Although we don't use this I/O region, we should
  2018.    request it from the kernel anyway, to avoid problems
  2019.    with other drivers accessing it. */
  2020. request_region(cy_pci_phys1, CyPCI_Zctl, "Cyclades-Z");
  2021. resource = request_region(cy_pci_phys1, CyPCI_Zctl, 
  2022.   "Cyclades-Z");
  2023. if (resource == NULL) {
  2024.     printk(KERN_ERR "cyclades: failed to allocate IO "
  2025.     "resource at 0x%lxn", cy_pci_phys1);
  2026.     continue;
  2027. }
  2028. res_start = cy_pci_phys1;
  2029. res_len = CyPCI_Zctl;
  2030. if (mailbox == ZE_V1) {
  2031.     cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ze_win);
  2032.     if (ZeIndex == NR_CARDS) {
  2033. printk("Cyclades-Ze/PCI found at 0x%lx ",
  2034. (ulong)cy_pci_phys2);
  2035. printk("but no more cards can be used.n");
  2036.                         printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  2037.     } else {
  2038. Ze_phys0[ZeIndex] = cy_pci_phys0;
  2039. Ze_phys2[ZeIndex] = cy_pci_phys2;
  2040. Ze_addr0[ZeIndex] = cy_pci_addr0;
  2041. Ze_addr2[ZeIndex] = cy_pci_addr2;
  2042. Ze_irq[ZeIndex] = cy_pci_irq;
  2043. ZeIndex++;
  2044.     }
  2045.     i--;
  2046.     continue;
  2047. } else {
  2048.     cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Zwin);
  2049. }
  2050. #ifdef CY_PCI_DEBUG
  2051.             printk("Cyclades-Z/PCI: relocate winaddr=0x%lx ctladdr=0x%lxn",
  2052.                 (ulong)cy_pci_addr2, (ulong)cy_pci_addr0);
  2053.     if (mailbox == ZO_V1) {
  2054. cy_writel(&((struct RUNTIME_9060 *)
  2055.   (cy_pci_addr0))->loc_addr_base, WIN_CREG);
  2056. PAUSE
  2057. printk("Cyclades-8Zo/PCI: FPGA id %lx, ver %lxn",
  2058.        (ulong)(0xff & cy_readl(&((struct CUSTOM_REG *)
  2059.         (cy_pci_addr2))->fpga_id)),
  2060.        (ulong)(0xff & cy_readl(&((struct CUSTOM_REG *)
  2061.         (cy_pci_addr2))->fpga_version)));
  2062. cy_writel(&((struct RUNTIME_9060 *)
  2063.   (cy_pci_addr0))->loc_addr_base, WIN_RAM);
  2064.     } else {
  2065. printk("Cyclades-Z/PCI: New Cyclades-Z board.  FPGA not loadedn");
  2066.     }
  2067. #endif
  2068.     /* The following clears the firmware id word.  This ensures
  2069.        that the driver will not attempt to talk to the board
  2070.        until it has been properly initialized.
  2071.      */
  2072. PAUSE
  2073. if ((mailbox == ZO_V1) || (mailbox == ZO_V2))
  2074.     cy_writel((ulong)(cy_pci_addr2+ID_ADDRESS), 0L);
  2075.                 /* This must be a Cyclades-8Zo/PCI.  The extendable
  2076.                    version will have a different device_id and will
  2077.                    be allocated its maximum number of ports. */
  2078.                 cy_pci_nchan = 8;
  2079.                 if((cy_next_channel+cy_pci_nchan) > NR_PORTS) {
  2080.                         printk("Cyclades-8Zo/PCI found at 0x%lx ",
  2081.     (ulong)cy_pci_phys2);
  2082.                         printk("but no channels are available.n");
  2083.                         printk("Change NR_PORTS in cyclades.c and recompile kernel.n");
  2084.                         return(i);
  2085.                 }
  2086.                 /* fill the next cy_card structure available */
  2087.                 for (j = 0 ; j < NR_CARDS ; j++) {
  2088.                         if (cy_card[j].base_addr == 0)  break;
  2089.                 }
  2090.                 if (j == NR_CARDS) {    /* no more cy_cards available */
  2091.     printk("Cyclades-8Zo/PCI found at 0x%lx ",
  2092. (ulong)cy_pci_phys2);
  2093.     printk("but no more cards can be used.n");
  2094.                     printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  2095.     return(i);
  2096.                 }
  2097. #ifdef CONFIG_CYZ_INTR
  2098.                 /* allocate IRQ only if board has an IRQ */
  2099. if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) {
  2100.     if(request_irq(cy_pci_irq, cyz_interrupt,
  2101. SA_SHIRQ, "Cyclades-Z", &cy_card[j]))
  2102.     {
  2103.                         printk("Cyclom-8Zo/PCI found at 0x%lx ",
  2104.     (ulong) cy_pci_phys2);
  2105.                         printk("but could not allocate IRQ%d.n",
  2106.     cy_pci_irq);
  2107. return(i);
  2108.     }
  2109. }
  2110. #endif /* CONFIG_CYZ_INTR */
  2111.                 /* set cy_card */
  2112.                 cy_card[j].base_phys = cy_pci_phys2;
  2113.                 cy_card[j].ctl_phys = cy_pci_phys0;
  2114.                 cy_card[j].base_addr = cy_pci_addr2;
  2115.                 cy_card[j].ctl_addr = cy_pci_addr0;
  2116.                 cy_card[j].irq = (int) cy_pci_irq;
  2117.                 cy_card[j].bus_index = 1;
  2118.                 cy_card[j].first_line = cy_next_channel;
  2119.                 cy_card[j].num_chips = -1;
  2120. cy_card[j].resource = resource;
  2121. cy_card[j].res_start = res_start;
  2122. cy_card[j].res_len = res_len;
  2123. resource = NULL; /* For next card */
  2124.                 /* print message */
  2125. #ifdef CONFIG_CYZ_INTR
  2126. /* don't report IRQ if board is no IRQ */
  2127. if( (cy_pci_irq != 0) && (cy_pci_irq != 255) )
  2128.     printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, IRQ%d, ",
  2129. j+1,(ulong)cy_pci_phys2,
  2130. (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1),
  2131. (int)cy_pci_irq);
  2132. else
  2133. #endif /* CONFIG_CYZ_INTR */
  2134.     printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, ",
  2135. j+1,(ulong)cy_pci_phys2,
  2136. (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1));
  2137.                 printk("%d channels starting from port %d.n",
  2138.     cy_pci_nchan,cy_next_channel);
  2139.                 cy_next_channel += cy_pci_nchan;
  2140.     }
  2141.         }
  2142.         for (; ZeIndex != 0 && i < NR_CARDS; i++) {
  2143.     cy_pci_phys0 = Ze_phys0[0];
  2144.     cy_pci_phys2 = Ze_phys2[0];
  2145.     cy_pci_addr0 = Ze_addr0[0];
  2146.     cy_pci_addr2 = Ze_addr2[0];
  2147.     cy_pci_irq = Ze_irq[0];
  2148.     for (j = 0 ; j < ZeIndex-1 ; j++) {
  2149. Ze_phys0[j] = Ze_phys0[j+1];
  2150. Ze_phys2[j] = Ze_phys2[j+1];
  2151. Ze_addr0[j] = Ze_addr0[j+1];
  2152. Ze_addr2[j] = Ze_addr2[j+1];
  2153. Ze_irq[j] = Ze_irq[j+1];
  2154.     }
  2155.     ZeIndex--;
  2156. mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) 
  2157.    cy_pci_addr0)->mail_box_0);
  2158. #ifdef CY_PCI_DEBUG
  2159.             printk("Cyclades-Z/PCI: relocate winaddr=0x%lx ctladdr=0x%lxn",
  2160.                 (ulong)cy_pci_addr2, (ulong)cy_pci_addr0);
  2161.     printk("Cyclades-Z/PCI: New Cyclades-Z board.  FPGA not loadedn");
  2162. #endif
  2163. PAUSE
  2164.                 /* This must be the new Cyclades-Ze/PCI. */
  2165.                 cy_pci_nchan = ZE_V1_NPORTS;
  2166.                 if((cy_next_channel+cy_pci_nchan) > NR_PORTS) {
  2167.                         printk("Cyclades-Ze/PCI found at 0x%lx ",
  2168.     (ulong)cy_pci_phys2);
  2169.                         printk("but no channels are available.n");
  2170.                         printk("Change NR_PORTS in cyclades.c and recompile kernel.n");
  2171.                         return(i);
  2172.                 }
  2173.                 /* fill the next cy_card structure available */
  2174.                 for (j = 0 ; j < NR_CARDS ; j++) {
  2175.                         if (cy_card[j].base_addr == 0)  break;
  2176.                 }
  2177.                 if (j == NR_CARDS) {    /* no more cy_cards available */
  2178.     printk("Cyclades-Ze/PCI found at 0x%lx ",
  2179. (ulong)cy_pci_phys2);
  2180.     printk("but no more cards can be used.n");
  2181.                     printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  2182.     return(i);
  2183.                 }
  2184. #ifdef CONFIG_CYZ_INTR
  2185.                 /* allocate IRQ only if board has an IRQ */
  2186. if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) {
  2187.     if(request_irq(cy_pci_irq, cyz_interrupt,
  2188. SA_SHIRQ, "Cyclades-Z", &cy_card[j]))
  2189.     {
  2190.                         printk("Cyclom-Ze/PCI found at 0x%lx ",
  2191.     (ulong) cy_pci_phys2);
  2192.                         printk("but could not allocate IRQ%d.n",
  2193.     cy_pci_irq);
  2194. return(i);
  2195.     }
  2196. }
  2197. #endif /* CONFIG_CYZ_INTR */
  2198.                 /* set cy_card */
  2199.                 cy_card[j].base_phys = cy_pci_phys2;
  2200.                 cy_card[j].ctl_phys = cy_pci_phys0;
  2201.                 cy_card[j].base_addr = cy_pci_addr2;
  2202.                 cy_card[j].ctl_addr = cy_pci_addr0;
  2203.                 cy_card[j].irq = (int) cy_pci_irq;
  2204.                 cy_card[j].bus_index = 1;
  2205.                 cy_card[j].first_line = cy_next_channel;
  2206.                 cy_card[j].num_chips = -1;
  2207.                 /* print message */
  2208. #ifdef CONFIG_CYZ_INTR
  2209. /* don't report IRQ if board is no IRQ */
  2210. if( (cy_pci_irq != 0) && (cy_pci_irq != 255) )
  2211.     printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, IRQ%d, ",
  2212. j+1,(ulong)cy_pci_phys2,
  2213. (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1),
  2214. (int)cy_pci_irq);
  2215. else
  2216. #endif /* CONFIG_CYZ_INTR */
  2217.     printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, ",
  2218. j+1,(ulong)cy_pci_phys2,
  2219. (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1));
  2220.                 printk("%d channels starting from port %d.n",
  2221.     cy_pci_nchan,cy_next_channel);
  2222.                 cy_next_channel += cy_pci_nchan;
  2223.         }
  2224. if (ZeIndex != 0) {
  2225.     printk("Cyclades-Ze/PCI found at 0x%x ",
  2226. (unsigned int) Ze_phys2[0]);
  2227.     printk("but no more cards can be used.n");
  2228.             printk("Change NR_CARDS in cyclades.c and recompile kernel.n");
  2229. }
  2230.         return(i);
  2231. #else
  2232.         return(0);
  2233. #endif /* ifdef CONFIG_PCI */
  2234. } /* cy_detect_pci */
  2235. /*
  2236.  * This routine prints out the appropriate serial driver version number
  2237.  * and identifies which options were configured into this driver.
  2238.  */
  2239. static inline void
  2240. show_version(void)
  2241. {
  2242.   char *rcsvers, *rcsdate, *tmp;
  2243.     rcsvers = strchr(rcsid, ' '); rcsvers++;
  2244.     tmp = strchr(rcsvers, ' '); *tmp++ = '';
  2245.     rcsdate = strchr(tmp, ' '); rcsdate++;
  2246.     tmp = strrchr(rcsdate, ' '); *tmp = '';
  2247.     printk("Cyclades driver %s %sn",
  2248.         rcsvers, rcsdate);
  2249.     printk("        built %s %sn",
  2250. __DATE__, __TIME__);
  2251. } /* show_version */
  2252. static int 
  2253. cyclades_get_proc_info(char *buf, char **start, off_t offset, int length,
  2254.        int *eof, void *data)
  2255. {
  2256.     struct cyclades_port  *info;
  2257.     int i;
  2258.     int len=0;
  2259.     off_t begin=0;
  2260.     off_t pos=0;
  2261.     int size;
  2262.     __u32 cur_jifs = jiffies;
  2263.     size = sprintf(buf, "Dev TimeOpen   BytesOut  IdleOut    BytesIn   IdleIn  Overruns  Ldiscn");
  2264.     pos += size;
  2265.     len += size;
  2266.     /* Output one line for each known port */
  2267.     for (i = 0; i < NR_PORTS && cy_port[i].line >= 0; i++) {
  2268. info = &cy_port[i];
  2269. if (info->count)
  2270.     size = sprintf(buf+len,
  2271. "%3d %8lu %10lu %8lu %10lu %8lu %9lu %6ldn",
  2272. info->line,
  2273. JIFFIES_DIFF(info->idle_stats.in_use, cur_jifs) / HZ,
  2274. info->idle_stats.xmit_bytes,
  2275. JIFFIES_DIFF(info->idle_stats.xmit_idle, cur_jifs) / HZ,
  2276. info->idle_stats.recv_bytes,
  2277. JIFFIES_DIFF(info->idle_stats.recv_idle, cur_jifs) / HZ,
  2278. info->idle_stats.overruns,
  2279. (long) info->tty->ldisc.num);
  2280. else
  2281.     size = sprintf(buf+len,
  2282. "%3d %8lu %10lu %8lu %10lu %8lu %9lu %6ldn",
  2283. info->line, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
  2284. len += size;
  2285. pos = begin + len;
  2286. if (pos < offset) {
  2287.     len   = 0;
  2288.     begin = pos;
  2289. }
  2290. if (pos > offset + length)
  2291.     goto done;
  2292.     }
  2293.     *eof = 1;
  2294. done:
  2295.     *start = buf + (offset - begin); /* Start of wanted data */
  2296.     len -= (offset - begin); /* Start slop */
  2297.     if (len > length)
  2298. len = length; /* Ending slop */
  2299.     if (len < 0)
  2300. len = 0;
  2301.     return len;
  2302. }
  2303. /* The serial driver boot-time initialization code!
  2304.     Hardware I/O ports are mapped to character special devices on a
  2305.     first found, first allocated manner.  That is, this code searches
  2306.     for Cyclom cards in the system.  As each is found, it is probed
  2307.     to discover how many chips (and thus how many ports) are present.
  2308.     These ports are mapped to the tty ports 32 and upward in monotonic
  2309.     fashion.  If an 8-port card is replaced with a 16-port card, the
  2310.     port mapping on a following card will shift.
  2311.     This approach is different from what is used in the other serial
  2312.     device driver because the Cyclom is more properly a multiplexer,
  2313.     not just an aggregation of serial ports on one card.
  2314.     If there are more cards with more ports than have been
  2315.     statically allocated above, a warning is printed and the
  2316.     extra ports are ignored.
  2317.  */
  2318. int __init
  2319. cy_init(void)
  2320. {
  2321.   struct cyclades_port  *info;
  2322.   struct cyclades_card *cinfo;
  2323.   int number_z_boards = 0;
  2324.   int board,port,i,index;
  2325.   unsigned long mailbox;
  2326.   unsigned short chip_number;
  2327.   int nports;
  2328.     init_bh(CYCLADES_BH, do_cyclades_bh);
  2329.     show_version();
  2330.     /* Initialize the tty_driver structure */
  2331.     
  2332.     memset(&cy_serial_driver, 0, sizeof(struct tty_driver));
  2333.     cy_serial_driver.magic = TTY_DRIVER_MAGIC;
  2334.     cy_serial_driver.driver_name = "cyclades";
  2335.     cy_serial_driver.name = "ttyC";
  2336.     cy_serial_driver.major = CYCLADES_MAJOR;
  2337.     cy_serial_driver.minor_start = 0;
  2338.     cy_serial_driver.num = NR_PORTS;
  2339.     cy_serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
  2340.     cy_serial_driver.subtype = SERIAL_TYPE_NORMAL;
  2341.     cy_serial_driver.init_termios = tty_std_termios;
  2342.     cy_serial_driver.init_termios.c_cflag =
  2343.             B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  2344.     cy_serial_driver.flags = TTY_DRIVER_REAL_RAW;
  2345.     cy_serial_driver.refcount = &serial_refcount;
  2346.     cy_serial_driver.table = serial_table;
  2347.     cy_serial_driver.termios = serial_termios;
  2348.     cy_serial_driver.termios_locked = serial_termios_locked;
  2349.     cy_serial_driver.open = cy_open;
  2350.     cy_serial_driver.close = cy_close;
  2351.     cy_serial_driver.write = cy_write;
  2352.     cy_serial_driver.put_char = cy_put_char;
  2353.     cy_serial_driver.flush_chars = cy_flush_chars;
  2354.     cy_serial_driver.write_room = cy_write_room;
  2355.     cy_serial_driver.chars_in_buffer = cy_chars_in_buffer;
  2356.     cy_serial_driver.flush_buffer = cy_flush_buffer;
  2357.     cy_serial_driver.ioctl = cy_ioctl;
  2358.     cy_serial_driver.throttle = cy_throttle;
  2359.     cy_serial_driver.unthrottle = cy_unthrottle;
  2360.     cy_serial_driver.set_termios = cy_set_termios;
  2361.     cy_serial_driver.stop = cy_stop;
  2362.     cy_serial_driver.start = cy_start;
  2363.     cy_serial_driver.hangup = cy_hangup;
  2364.     cy_serial_driver.break_ctl = cy_break;
  2365.     cy_serial_driver.wait_until_sent = cy_wait_until_sent;
  2366.     cy_serial_driver.read_proc = cyclades_get_proc_info;
  2367.     /*
  2368.      * The callout device is just like normal device except for
  2369.      * major number and the subtype code.
  2370.      */
  2371.     cy_callout_driver = cy_serial_driver;
  2372.     cy_callout_driver.name = "cub";
  2373.     cy_callout_driver.major = CYCLADESAUX_MAJOR;
  2374.     cy_callout_driver.subtype = SERIAL_TYPE_CALLOUT;
  2375.     cy_callout_driver.read_proc = 0;
  2376.     cy_callout_driver.proc_entry = 0;
  2377.     if (tty_register_driver(&cy_serial_driver))
  2378.             panic("Couldn't register Cyclades serial drivern");
  2379.     if (tty_register_driver(&cy_callout_driver))
  2380.             panic("Couldn't register Cyclades callout drivern");
  2381.     for (i = 0; i < NR_CARDS; i++) {
  2382.             /* base_addr=0 indicates board not found */
  2383.             cy_card[i].base_addr = 0;
  2384.     }
  2385.     /* the code below is responsible to find the boards. Each different
  2386.        type of board has its own detection routine. If a board is found,
  2387.        the next cy_card structure available is set by the detection
  2388.        routine. These functions are responsible for checking the
  2389.        availability of cy_card and cy_port data structures and updating
  2390.        the cy_next_channel. */
  2391.     /* look for isa boards */
  2392.     cy_isa_nboard = cy_detect_isa();
  2393.     /* look for pci boards */
  2394.     cy_pci_nboard = cy_detect_pci();
  2395.     cy_nboard = cy_isa_nboard + cy_pci_nboard;
  2396.     /* invalidate remaining cy_card structures */
  2397.     for (i = 0 ; i < NR_CARDS ; i++) {
  2398.         if (cy_card[i].base_addr == 0) {
  2399.                 cy_card[i].first_line = -1;
  2400.                 cy_card[i].ctl_addr = 0;
  2401.                 cy_card[i].irq = 0;
  2402.                 cy_card[i].bus_index = 0;
  2403.                 cy_card[i].first_line = 0;
  2404.                 cy_card[i].num_chips = 0;
  2405.         }
  2406.     }
  2407.     /* invalidate remaining cy_port structures */
  2408.     for (i = cy_next_channel ; i < NR_PORTS ; i++) {
  2409.         cy_port[i].line = -1;
  2410.         cy_port[i].magic = -1;
  2411.     }
  2412.     /* initialize per-port data structures for each valid board found */
  2413.     for (board = 0 ; board < cy_nboard ; board++) {
  2414.             cinfo = &cy_card[board];
  2415.             if (cinfo->num_chips == -1) { /* Cyclades-Z */
  2416. number_z_boards++;
  2417. mailbox = cy_readl(&((struct RUNTIME_9060 *)
  2418.      cy_card[board].ctl_addr)->mail_box_0);
  2419. nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
  2420. cinfo->intr_enabled = 0;
  2421. cinfo->nports = 0; /* Will be correctly set later, after 
  2422.       Z FW is loaded */
  2423. spin_lock_init(&cinfo->card_lock);
  2424.                 for (port = cinfo->first_line ;
  2425.                      port < cinfo->first_line + nports;
  2426.                      port++)
  2427.                 {
  2428.                     info = &cy_port[port];
  2429.                     info->magic = CYCLADES_MAGIC;
  2430.                     info->type = PORT_STARTECH;
  2431.                     info->card = board;
  2432.                     info->line = port;
  2433.     info->chip_rev = 0;
  2434.                     info->flags = STD_COM_FLAGS;
  2435.                     info->tty = 0;
  2436.     if (mailbox == ZO_V1)
  2437. info->xmit_fifo_size = CYZ_FIFO_SIZE;
  2438.     else
  2439. info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE;
  2440.                     info->cor1 = 0;
  2441.                     info->cor2 = 0;
  2442.                     info->cor3 = 0;
  2443.                     info->cor4 = 0;
  2444.                     info->cor5 = 0;
  2445.                     info->tbpr = 0;
  2446.                     info->tco = 0;
  2447.                     info->rbpr = 0;
  2448.                     info->rco = 0;
  2449.     info->custom_divisor = 0;
  2450.                     info->close_delay = 5*HZ/10;
  2451.     info->closing_wait = CLOSING_WAIT_DELAY;
  2452.     info->icount.cts = info->icount.dsr = 
  2453. info->icount.rng = info->icount.dcd = 0;
  2454.     info->icount.rx = info->icount.tx = 0;
  2455.     info->icount.frame = info->icount.parity = 0;
  2456.     info->icount.overrun = info->icount.brk = 0;
  2457.                     info->x_char = 0;
  2458.                     info->event = 0;
  2459.                     info->count = 0;
  2460.                     info->blocked_open = 0;
  2461.                     info->default_threshold = 0;
  2462.                     info->default_timeout = 0;
  2463.                     info->tqueue.routine = do_softint;
  2464.                     info->tqueue.data = info;
  2465.                     info->callout_termios =
  2466.                 cy_callout_driver.init_termios;
  2467.                     info->normal_termios =
  2468.                 cy_serial_driver.init_termios;
  2469.     init_waitqueue_head(&info->open_wait);
  2470.     init_waitqueue_head(&info->close_wait);
  2471.     init_waitqueue_head(&info->shutdown_wait);
  2472.     init_waitqueue_head(&info->delta_msr_wait);
  2473.                     /* info->session */
  2474.                     /* info->pgrp */
  2475.                     info->read_status_mask = 0;
  2476.                     /* info->timeout */
  2477.     /* Bentson's vars */
  2478.                     info->jiffies[0] = 0;
  2479.                     info->jiffies[1] = 0;
  2480.                     info->jiffies[2] = 0;
  2481.                     info->rflush_count = 0;
  2482. #ifdef CONFIG_CYZ_INTR
  2483.     cyz_rx_full_timer[port].function = NULL;
  2484. #endif
  2485.                 }
  2486.                 continue;
  2487.             }else{ /* Cyclom-Y of some kind*/
  2488.                 index = cinfo->bus_index;
  2489. spin_lock_init(&cinfo->card_lock);
  2490. cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips;
  2491.                 for (port = cinfo->first_line ;
  2492.                      port < cinfo->first_line + cinfo->nports ;
  2493.                      port++)
  2494.                 {
  2495.                     info = &cy_port[port];
  2496.                     info->magic = CYCLADES_MAGIC;
  2497.                     info->type = PORT_CIRRUS;
  2498.                     info->card = board;
  2499.                     info->line = port;
  2500.                     info->flags = STD_COM_FLAGS;
  2501.                     info->tty = 0;
  2502.                     info->xmit_fifo_size = CyMAX_CHAR_FIFO;
  2503.                     info->cor1 = CyPARITY_NONE|Cy_1_STOP|Cy_8_BITS;
  2504.                     info->cor2 = CyETC;
  2505.                     info->cor3 = 0x08; /* _very_ small rcv threshold */
  2506.                     info->cor4 = 0;
  2507.                     info->cor5 = 0;
  2508.     info->custom_divisor = 0;
  2509.                     info->close_delay = 5*HZ/10;
  2510.     info->closing_wait = CLOSING_WAIT_DELAY;
  2511.     info->icount.cts = info->icount.dsr = 
  2512. info->icount.rng = info->icount.dcd = 0;
  2513.     info->icount.rx = info->icount.tx = 0;
  2514.     info->icount.frame = info->icount.parity = 0;
  2515.     info->icount.overrun = info->icount.brk = 0;
  2516.     chip_number = (port - cinfo->first_line) / 4;
  2517.     if ((info->chip_rev =
  2518.  cy_readb(cinfo->base_addr +
  2519.   (cy_chip_offset[chip_number]<<index) +
  2520.   (CyGFRCR<<index))) >= CD1400_REV_J) {
  2521.                         /* It is a CD1400 rev. J or later */
  2522.                         info->tbpr = baud_bpr_60[13]; /* Tx BPR */
  2523.                         info->tco = baud_co_60[13]; /* Tx CO */
  2524.                         info->rbpr = baud_bpr_60[13]; /* Rx BPR */
  2525.                         info->rco = baud_co_60[13]; /* Rx CO */
  2526.                         info->rflow = 0;
  2527.                         info->rtsdtr_inv = 1;
  2528.                     } else {
  2529.                         info->tbpr = baud_bpr_25[13]; /* Tx BPR */
  2530.                         info->tco = baud_co_25[13]; /* Tx CO */
  2531.                         info->rbpr = baud_bpr_25[13]; /* Rx BPR */
  2532.                         info->rco = baud_co_25[13]; /* Rx CO */
  2533.                         info->rflow = 0;
  2534.                         info->rtsdtr_inv = 0;
  2535.                     }
  2536.                     info->x_char = 0;
  2537.                     info->event = 0;
  2538.                     info->count = 0;
  2539.                     info->blocked_open = 0;
  2540.                     info->default_threshold = 0;
  2541.                     info->default_timeout = 0;
  2542.                     info->tqueue.routine = do_softint;
  2543.                     info->tqueue.data = info;
  2544.                     info->callout_termios =
  2545.                cy_callout_driver.init_termios;
  2546.                     info->normal_termios =
  2547.                cy_serial_driver.init_termios;
  2548.     init_waitqueue_head(&info->open_wait);
  2549.     init_waitqueue_head(&info->close_wait);
  2550.     init_waitqueue_head(&info->shutdown_wait);
  2551.     init_waitqueue_head(&info->delta_msr_wait);
  2552.                     /* info->session */
  2553.                     /* info->pgrp */
  2554.                     info->read_status_mask =
  2555.                   CyTIMEOUT| CySPECHAR| CyBREAK
  2556.                                   | CyPARITY| CyFRAME| CyOVERRUN;
  2557.                     /* info->timeout */
  2558.                 }
  2559.             }
  2560.     }
  2561. #ifndef CONFIG_CYZ_INTR
  2562.     if (number_z_boards && !cyz_timeron){
  2563. cyz_timeron++;
  2564. cyz_timerlist.expires = jiffies + 1;
  2565. add_timer(&cyz_timerlist);
  2566. #ifdef CY_PCI_DEBUG
  2567. printk("Cyclades-Z polling initializedn");
  2568. #endif
  2569.     }
  2570. #endif /* CONFIG_CYZ_INTR */
  2571.     return 0;
  2572.     
  2573. } /* cy_init */
  2574. #ifdef MODULE
  2575. void
  2576. cy_cleanup_module(void)
  2577. {
  2578.     int i;
  2579.     int e1, e2;
  2580.     unsigned long flags;
  2581. #ifndef CONFIG_CYZ_INTR
  2582.     if (cyz_timeron){
  2583. cyz_timeron = 0;
  2584. del_timer(&cyz_timerlist);
  2585.     }
  2586. #endif /* CONFIG_CYZ_INTR */
  2587.     save_flags(flags); cli();
  2588.     remove_bh(CYCLADES_BH);
  2589.     if ((e1 = tty_unregister_driver(&cy_serial_driver)))
  2590.             printk("cyc: failed to unregister Cyclades serial driver(%d)n",
  2591. e1);
  2592.     if ((e2 = tty_unregister_driver(&cy_callout_driver)))
  2593.             printk("cyc: failed to unregister Cyclades callout driver (%d)n", 
  2594. e2);
  2595.     restore_flags(flags);
  2596.     for (i = 0; i < NR_CARDS; i++) {
  2597.         if (cy_card[i].base_addr != 0) {
  2598.     iounmap((void *)cy_card[i].base_addr);
  2599.     if (cy_card[i].ctl_addr != 0)
  2600. iounmap((void *)cy_card[i].ctl_addr);
  2601.     if (cy_card[i].irq
  2602. #ifndef CONFIG_CYZ_INTR
  2603. && cy_card[i].num_chips != -1 /* not a Z card */
  2604. #endif /* CONFIG_CYZ_INTR */
  2605.     )
  2606. free_irq(cy_card[i].irq, &cy_card[i]);
  2607.     if (cy_card[i].resource) {
  2608. cy_card[i].resource = NULL;
  2609. release_region(cy_card[i].res_start, cy_card[i].res_len);
  2610.     }
  2611.         }
  2612.     }
  2613.     if (tmp_buf) {
  2614. free_page((unsigned long) tmp_buf);
  2615. tmp_buf = NULL;
  2616.     }
  2617. } /* cy_cleanup_module */
  2618. /* Module entry-points */
  2619. module_init(cy_init);
  2620. module_exit(cy_cleanup_module);
  2621. #else /* MODULE */
  2622. /* called by linux/init/main.c to parse command line options */
  2623. void
  2624. cy_setup(char *str, int *ints)
  2625. {
  2626. #ifdef CONFIG_ISA
  2627.   int i, j;
  2628.     for (i = 0 ; i < NR_ISA_ADDRS ; i++) {
  2629.         if (cy_isa_addresses[i] == 0) break;
  2630.     }
  2631.     for (j = 1; j <= ints[0]; j++){
  2632.         if ( i < NR_ISA_ADDRS ){
  2633.             cy_isa_addresses[i++] = (unsigned char *)(ints[j]);
  2634.         }
  2635.     }
  2636. #endif /* CONFIG_ISA */
  2637. } /* cy_setup */
  2638. #endif /* MODULE */
  2639. MODULE_LICENSE("GPL");