]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/serial/jsm/jsm_tty.c
tty: jsm cleanups
[linux-2.6-omap-h63xx.git] / drivers / serial / jsm / jsm_tty.c
1 /************************************************************************
2  * Copyright 2003 Digi International (www.digi.com)
3  *
4  * Copyright (C) 2004 IBM Corporation. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  * PURPOSE.  See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 * Temple Place - Suite 330, Boston,
19  * MA  02111-1307, USA.
20  *
21  * Contact Information:
22  * Scott H Kilau <Scott_Kilau@digi.com>
23  * Ananda Venkatarman <mansarov@us.ibm.com>
24  * Modifications:
25  * 01/19/06:    changed jsm_input routine to use the dynamically allocated
26  *              tty_buffer changes. Contributors: Scott Kilau and Ananda V.
27  ***********************************************************************/
28 #include <linux/tty.h>
29 #include <linux/tty_flip.h>
30 #include <linux/serial_reg.h>
31 #include <linux/delay.h>        /* For udelay */
32 #include <linux/pci.h>
33
34 #include "jsm.h"
35
36 static void jsm_carrier(struct jsm_channel *ch);
37
38 static inline int jsm_get_mstat(struct jsm_channel *ch)
39 {
40         unsigned char mstat;
41         unsigned result;
42
43         jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "start\n");
44
45         mstat = (ch->ch_mostat | ch->ch_mistat);
46
47         result = 0;
48
49         if (mstat & UART_MCR_DTR)
50                 result |= TIOCM_DTR;
51         if (mstat & UART_MCR_RTS)
52                 result |= TIOCM_RTS;
53         if (mstat & UART_MSR_CTS)
54                 result |= TIOCM_CTS;
55         if (mstat & UART_MSR_DSR)
56                 result |= TIOCM_DSR;
57         if (mstat & UART_MSR_RI)
58                 result |= TIOCM_RI;
59         if (mstat & UART_MSR_DCD)
60                 result |= TIOCM_CD;
61
62         jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "finish\n");
63         return result;
64 }
65
66 static unsigned int jsm_tty_tx_empty(struct uart_port *port)
67 {
68         return TIOCSER_TEMT;
69 }
70
71 /*
72  * Return modem signals to ld.
73  */
74 static unsigned int jsm_tty_get_mctrl(struct uart_port *port)
75 {
76         int result;
77         struct jsm_channel *channel = (struct jsm_channel *)port;
78
79         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
80
81         result = jsm_get_mstat(channel);
82
83         if (result < 0)
84                 return -ENXIO;
85
86         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
87
88         return result;
89 }
90
91 /*
92  * jsm_set_modem_info()
93  *
94  * Set modem signals, called by ld.
95  */
96 static void jsm_tty_set_mctrl(struct uart_port *port, unsigned int mctrl)
97 {
98         struct jsm_channel *channel = (struct jsm_channel *)port;
99
100         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
101
102         if (mctrl & TIOCM_RTS)
103                 channel->ch_mostat |= UART_MCR_RTS;
104         else
105                 channel->ch_mostat &= ~UART_MCR_RTS;
106
107         if (mctrl & TIOCM_DTR)
108                 channel->ch_mostat |= UART_MCR_DTR;
109         else
110                 channel->ch_mostat &= ~UART_MCR_DTR;
111
112         channel->ch_bd->bd_ops->assert_modem_signals(channel);
113
114         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
115         udelay(10);
116 }
117
118 static void jsm_tty_start_tx(struct uart_port *port)
119 {
120         struct jsm_channel *channel = (struct jsm_channel *)port;
121
122         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
123
124         channel->ch_flags &= ~(CH_STOP);
125         jsm_tty_write(port);
126
127         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
128 }
129
130 static void jsm_tty_stop_tx(struct uart_port *port)
131 {
132         struct jsm_channel *channel = (struct jsm_channel *)port;
133
134         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
135
136         channel->ch_flags |= (CH_STOP);
137
138         jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
139 }
140
141 static void jsm_tty_send_xchar(struct uart_port *port, char ch)
142 {
143         unsigned long lock_flags;
144         struct jsm_channel *channel = (struct jsm_channel *)port;
145         struct ktermios *termios;
146
147         spin_lock_irqsave(&port->lock, lock_flags);
148         termios = port->info->port.tty->termios;
149         if (ch == termios->c_cc[VSTART])
150                 channel->ch_bd->bd_ops->send_start_character(channel);
151
152         if (ch == termios->c_cc[VSTOP])
153                 channel->ch_bd->bd_ops->send_stop_character(channel);
154         spin_unlock_irqrestore(&port->lock, lock_flags);
155 }
156
157 static void jsm_tty_stop_rx(struct uart_port *port)
158 {
159         struct jsm_channel *channel = (struct jsm_channel *)port;
160
161         channel->ch_bd->bd_ops->disable_receiver(channel);
162 }
163
164 static void jsm_tty_enable_ms(struct uart_port *port)
165 {
166         /* Nothing needed */
167 }
168
169 static void jsm_tty_break(struct uart_port *port, int break_state)
170 {
171         unsigned long lock_flags;
172         struct jsm_channel *channel = (struct jsm_channel *)port;
173
174         spin_lock_irqsave(&port->lock, lock_flags);
175         if (break_state == -1)
176                 channel->ch_bd->bd_ops->send_break(channel);
177         else
178                 channel->ch_bd->bd_ops->clear_break(channel, 0);
179
180         spin_unlock_irqrestore(&port->lock, lock_flags);
181 }
182
183 static int jsm_tty_open(struct uart_port *port)
184 {
185         struct jsm_board *brd;
186         struct jsm_channel *channel = (struct jsm_channel *)port;
187         struct ktermios *termios;
188
189         /* Get board pointer from our array of majors we have allocated */
190         brd = channel->ch_bd;
191
192         /*
193          * Allocate channel buffers for read/write/error.
194          * Set flag, so we don't get trounced on.
195          */
196         channel->ch_flags |= (CH_OPENING);
197
198         /* Drop locks, as malloc with GFP_KERNEL can sleep */
199
200         if (!channel->ch_rqueue) {
201                 channel->ch_rqueue = kzalloc(RQUEUESIZE, GFP_KERNEL);
202                 if (!channel->ch_rqueue) {
203                         jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
204                                 "unable to allocate read queue buf");
205                         return -ENOMEM;
206                 }
207         }
208         if (!channel->ch_equeue) {
209                 channel->ch_equeue = kzalloc(EQUEUESIZE, GFP_KERNEL);
210                 if (!channel->ch_equeue) {
211                         jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
212                                 "unable to allocate error queue buf");
213                         return -ENOMEM;
214                 }
215         }
216         if (!channel->ch_wqueue) {
217                 channel->ch_wqueue = kzalloc(WQUEUESIZE, GFP_KERNEL);
218                 if (!channel->ch_wqueue) {
219                         jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
220                                 "unable to allocate write queue buf");
221                         return -ENOMEM;
222                 }
223         }
224
225         channel->ch_flags &= ~(CH_OPENING);
226         /*
227          * Initialize if neither terminal is open.
228          */
229         jsm_printk(OPEN, INFO, &channel->ch_bd->pci_dev,
230                 "jsm_open: initializing channel in open...\n");
231
232         /*
233          * Flush input queues.
234          */
235         channel->ch_r_head = channel->ch_r_tail = 0;
236         channel->ch_e_head = channel->ch_e_tail = 0;
237         channel->ch_w_head = channel->ch_w_tail = 0;
238
239         brd->bd_ops->flush_uart_write(channel);
240         brd->bd_ops->flush_uart_read(channel);
241
242         channel->ch_flags = 0;
243         channel->ch_cached_lsr = 0;
244         channel->ch_stops_sent = 0;
245
246         termios = port->info->port.tty->termios;
247         channel->ch_c_cflag     = termios->c_cflag;
248         channel->ch_c_iflag     = termios->c_iflag;
249         channel->ch_c_oflag     = termios->c_oflag;
250         channel->ch_c_lflag     = termios->c_lflag;
251         channel->ch_startc      = termios->c_cc[VSTART];
252         channel->ch_stopc       = termios->c_cc[VSTOP];
253
254         /* Tell UART to init itself */
255         brd->bd_ops->uart_init(channel);
256
257         /*
258          * Run param in case we changed anything
259          */
260         brd->bd_ops->param(channel);
261
262         jsm_carrier(channel);
263
264         channel->ch_open_count++;
265
266         jsm_printk(OPEN, INFO, &channel->ch_bd->pci_dev, "finish\n");
267         return 0;
268 }
269
270 static void jsm_tty_close(struct uart_port *port)
271 {
272         struct jsm_board *bd;
273         struct ktermios *ts;
274         struct jsm_channel *channel = (struct jsm_channel *)port;
275
276         jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n");
277
278         bd = channel->ch_bd;
279         ts = port->info->port.tty->termios;
280
281         channel->ch_flags &= ~(CH_STOPI);
282
283         channel->ch_open_count--;
284
285         /*
286          * If we have HUPCL set, lower DTR and RTS
287          */
288         if (channel->ch_c_cflag & HUPCL) {
289                 jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev,
290                         "Close. HUPCL set, dropping DTR/RTS\n");
291
292                 /* Drop RTS/DTR */
293                 channel->ch_mostat &= ~(UART_MCR_DTR | UART_MCR_RTS);
294                 bd->bd_ops->assert_modem_signals(channel);
295         }
296
297         channel->ch_old_baud = 0;
298
299         /* Turn off UART interrupts for this port */
300         channel->ch_bd->bd_ops->uart_off(channel);
301
302         jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "finish\n");
303 }
304
305 static void jsm_tty_set_termios(struct uart_port *port,
306                                  struct ktermios *termios,
307                                  struct ktermios *old_termios)
308 {
309         unsigned long lock_flags;
310         struct jsm_channel *channel = (struct jsm_channel *)port;
311
312         spin_lock_irqsave(&port->lock, lock_flags);
313         channel->ch_c_cflag     = termios->c_cflag;
314         channel->ch_c_iflag     = termios->c_iflag;
315         channel->ch_c_oflag     = termios->c_oflag;
316         channel->ch_c_lflag     = termios->c_lflag;
317         channel->ch_startc      = termios->c_cc[VSTART];
318         channel->ch_stopc       = termios->c_cc[VSTOP];
319
320         channel->ch_bd->bd_ops->param(channel);
321         jsm_carrier(channel);
322         spin_unlock_irqrestore(&port->lock, lock_flags);
323 }
324
325 static const char *jsm_tty_type(struct uart_port *port)
326 {
327         return "jsm";
328 }
329
330 static void jsm_tty_release_port(struct uart_port *port)
331 {
332 }
333
334 static int jsm_tty_request_port(struct uart_port *port)
335 {
336         return 0;
337 }
338
339 static void jsm_config_port(struct uart_port *port, int flags)
340 {
341         port->type = PORT_JSM;
342 }
343
344 static struct uart_ops jsm_ops = {
345         .tx_empty       = jsm_tty_tx_empty,
346         .set_mctrl      = jsm_tty_set_mctrl,
347         .get_mctrl      = jsm_tty_get_mctrl,
348         .stop_tx        = jsm_tty_stop_tx,
349         .start_tx       = jsm_tty_start_tx,
350         .send_xchar     = jsm_tty_send_xchar,
351         .stop_rx        = jsm_tty_stop_rx,
352         .enable_ms      = jsm_tty_enable_ms,
353         .break_ctl      = jsm_tty_break,
354         .startup        = jsm_tty_open,
355         .shutdown       = jsm_tty_close,
356         .set_termios    = jsm_tty_set_termios,
357         .type           = jsm_tty_type,
358         .release_port   = jsm_tty_release_port,
359         .request_port   = jsm_tty_request_port,
360         .config_port    = jsm_config_port,
361 };
362
363 /*
364  * jsm_tty_init()
365  *
366  * Init the tty subsystem.  Called once per board after board has been
367  * downloaded and init'ed.
368  */
369 int __devinit jsm_tty_init(struct jsm_board *brd)
370 {
371         int i;
372         void __iomem *vaddr;
373         struct jsm_channel *ch;
374
375         if (!brd)
376                 return -ENXIO;
377
378         jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
379
380         /*
381          * Initialize board structure elements.
382          */
383
384         brd->nasync = brd->maxports;
385
386         /*
387          * Allocate channel memory that might not have been allocated
388          * when the driver was first loaded.
389          */
390         for (i = 0; i < brd->nasync; i++) {
391                 if (!brd->channels[i]) {
392
393                         /*
394                          * Okay to malloc with GFP_KERNEL, we are not at
395                          * interrupt context, and there are no locks held.
396                          */
397                         brd->channels[i] = kzalloc(sizeof(struct jsm_channel), GFP_KERNEL);
398                         if (!brd->channels[i]) {
399                                 jsm_printk(CORE, ERR, &brd->pci_dev,
400                                         "%s:%d Unable to allocate memory for channel struct\n",
401                                                          __FILE__, __LINE__);
402                         }
403                 }
404         }
405
406         ch = brd->channels[0];
407         vaddr = brd->re_map_membase;
408
409         /* Set up channel variables */
410         for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
411
412                 if (!brd->channels[i])
413                         continue;
414
415                 spin_lock_init(&ch->ch_lock);
416
417                 if (brd->bd_uart_offset == 0x200)
418                         ch->ch_neo_uart =  vaddr + (brd->bd_uart_offset * i);
419
420                 ch->ch_bd = brd;
421                 ch->ch_portnum = i;
422
423                 /* .25 second delay */
424                 ch->ch_close_delay = 250;
425
426                 init_waitqueue_head(&ch->ch_flags_wait);
427         }
428
429         jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
430         return 0;
431 }
432
433 int __devinit jsm_uart_port_init(struct jsm_board *brd)
434 {
435         int i;
436         struct jsm_channel *ch;
437
438         if (!brd)
439                 return -ENXIO;
440
441         jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
442
443         /*
444          * Initialize board structure elements.
445          */
446
447         brd->nasync = brd->maxports;
448
449         /* Set up channel variables */
450         for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
451
452                 if (!brd->channels[i])
453                         continue;
454
455                 brd->channels[i]->uart_port.irq = brd->irq;
456                 brd->channels[i]->uart_port.uartclk = 14745600;
457                 brd->channels[i]->uart_port.type = PORT_JSM;
458                 brd->channels[i]->uart_port.iotype = UPIO_MEM;
459                 brd->channels[i]->uart_port.membase = brd->re_map_membase;
460                 brd->channels[i]->uart_port.fifosize = 16;
461                 brd->channels[i]->uart_port.ops = &jsm_ops;
462                 brd->channels[i]->uart_port.line = brd->channels[i]->ch_portnum + brd->boardnum * 2;
463                 if (uart_add_one_port (&jsm_uart_driver, &brd->channels[i]->uart_port))
464                         printk(KERN_INFO "Added device failed\n");
465                 else
466                         printk(KERN_INFO "Added device \n");
467         }
468
469         jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
470         return 0;
471 }
472
473 int jsm_remove_uart_port(struct jsm_board *brd)
474 {
475         int i;
476         struct jsm_channel *ch;
477
478         if (!brd)
479                 return -ENXIO;
480
481         jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
482
483         /*
484          * Initialize board structure elements.
485          */
486
487         brd->nasync = brd->maxports;
488
489         /* Set up channel variables */
490         for (i = 0; i < brd->nasync; i++) {
491
492                 if (!brd->channels[i])
493                         continue;
494
495                 ch = brd->channels[i];
496
497                 uart_remove_one_port(&jsm_uart_driver, &brd->channels[i]->uart_port);
498         }
499
500         jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
501         return 0;
502 }
503
504 void jsm_input(struct jsm_channel *ch)
505 {
506         struct jsm_board *bd;
507         struct tty_struct *tp;
508         u32 rmask;
509         u16 head;
510         u16 tail;
511         int data_len;
512         unsigned long lock_flags;
513         int len = 0;
514         int n = 0;
515         int s = 0;
516         int i = 0;
517
518         jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start\n");
519
520         if (!ch)
521                 return;
522
523         tp = ch->uart_port.info->port.tty;
524
525         bd = ch->ch_bd;
526         if(!bd)
527                 return;
528
529         spin_lock_irqsave(&ch->ch_lock, lock_flags);
530
531         /*
532          *Figure the number of characters in the buffer.
533          *Exit immediately if none.
534          */
535
536         rmask = RQUEUEMASK;
537
538         head = ch->ch_r_head & rmask;
539         tail = ch->ch_r_tail & rmask;
540
541         data_len = (head - tail) & rmask;
542         if (data_len == 0) {
543                 spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
544                 return;
545         }
546
547         jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start\n");
548
549         /*
550          *If the device is not open, or CREAD is off, flush
551          *input data and return immediately.
552          */
553         if (!tp ||
554                 !(tp->termios->c_cflag & CREAD) ) {
555
556                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
557                         "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum);
558                 ch->ch_r_head = tail;
559
560                 /* Force queue flow control to be released, if needed */
561                 jsm_check_queue_flow_control(ch);
562
563                 spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
564                 return;
565         }
566
567         /*
568          * If we are throttled, simply don't read any data.
569          */
570         if (ch->ch_flags & CH_STOPI) {
571                 spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
572                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
573                         "Port %d throttled, not reading any data. head: %x tail: %x\n",
574                         ch->ch_portnum, head, tail);
575                 return;
576         }
577
578         jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start 2\n");
579
580         if (data_len <= 0) {
581                 spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
582                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "jsm_input 1\n");
583                 return;
584         }
585
586         len = tty_buffer_request_room(tp, data_len);
587         n = len;
588
589         /*
590          * n now contains the most amount of data we can copy,
591          * bounded either by the flip buffer size or the amount
592          * of data the card actually has pending...
593          */
594         while (n) {
595                 s = ((head >= tail) ? head : RQUEUESIZE) - tail;
596                 s = min(s, n);
597
598                 if (s <= 0)
599                         break;
600
601                         /*
602                          * If conditions are such that ld needs to see all
603                          * UART errors, we will have to walk each character
604                          * and error byte and send them to the buffer one at
605                          * a time.
606                          */
607
608                 if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) {
609                         for (i = 0; i < s; i++) {
610                                 /*
611                                  * Give the Linux ld the flags in the
612                                  * format it likes.
613                                  */
614                                 if (*(ch->ch_equeue +tail +i) & UART_LSR_BI)
615                                         tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i),  TTY_BREAK);
616                                 else if (*(ch->ch_equeue +tail +i) & UART_LSR_PE)
617                                         tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_PARITY);
618                                 else if (*(ch->ch_equeue +tail +i) & UART_LSR_FE)
619                                         tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_FRAME);
620                                 else
621                                         tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_NORMAL);
622                         }
623                 } else {
624                         tty_insert_flip_string(tp, ch->ch_rqueue + tail, s) ;
625                 }
626                 tail += s;
627                 n -= s;
628                 /* Flip queue if needed */
629                 tail &= rmask;
630         }
631
632         ch->ch_r_tail = tail & rmask;
633         ch->ch_e_tail = tail & rmask;
634         jsm_check_queue_flow_control(ch);
635         spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
636
637         /* Tell the tty layer its okay to "eat" the data now */
638         tty_flip_buffer_push(tp);
639
640         jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "finish\n");
641 }
642
643 static void jsm_carrier(struct jsm_channel *ch)
644 {
645         struct jsm_board *bd;
646
647         int virt_carrier = 0;
648         int phys_carrier = 0;
649
650         jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev, "start\n");
651         if (!ch)
652                 return;
653
654         bd = ch->ch_bd;
655
656         if (!bd)
657                 return;
658
659         if (ch->ch_mistat & UART_MSR_DCD) {
660                 jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
661                         "mistat: %x D_CD: %x\n", ch->ch_mistat, ch->ch_mistat & UART_MSR_DCD);
662                 phys_carrier = 1;
663         }
664
665         if (ch->ch_c_cflag & CLOCAL)
666                 virt_carrier = 1;
667
668         jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
669                 "DCD: physical: %d virt: %d\n", phys_carrier, virt_carrier);
670
671         /*
672          * Test for a VIRTUAL carrier transition to HIGH.
673          */
674         if (((ch->ch_flags & CH_FCAR) == 0) && (virt_carrier == 1)) {
675
676                 /*
677                  * When carrier rises, wake any threads waiting
678                  * for carrier in the open routine.
679                  */
680
681                 jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
682                         "carrier: virt DCD rose\n");
683
684                 if (waitqueue_active(&(ch->ch_flags_wait)))
685                         wake_up_interruptible(&ch->ch_flags_wait);
686         }
687
688         /*
689          * Test for a PHYSICAL carrier transition to HIGH.
690          */
691         if (((ch->ch_flags & CH_CD) == 0) && (phys_carrier == 1)) {
692
693                 /*
694                  * When carrier rises, wake any threads waiting
695                  * for carrier in the open routine.
696                  */
697
698                 jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
699                         "carrier: physical DCD rose\n");
700
701                 if (waitqueue_active(&(ch->ch_flags_wait)))
702                         wake_up_interruptible(&ch->ch_flags_wait);
703         }
704
705         /*
706          *  Test for a PHYSICAL transition to low, so long as we aren't
707          *  currently ignoring physical transitions (which is what "virtual
708          *  carrier" indicates).
709          *
710          *  The transition of the virtual carrier to low really doesn't
711          *  matter... it really only means "ignore carrier state", not
712          *  "make pretend that carrier is there".
713          */
714         if ((virt_carrier == 0) && ((ch->ch_flags & CH_CD) != 0)
715                         && (phys_carrier == 0)) {
716                 /*
717                  *      When carrier drops:
718                  *
719                  *      Drop carrier on all open units.
720                  *
721                  *      Flush queues, waking up any task waiting in the
722                  *      line discipline.
723                  *
724                  *      Send a hangup to the control terminal.
725                  *
726                  *      Enable all select calls.
727                  */
728                 if (waitqueue_active(&(ch->ch_flags_wait)))
729                         wake_up_interruptible(&ch->ch_flags_wait);
730         }
731
732         /*
733          *  Make sure that our cached values reflect the current reality.
734          */
735         if (virt_carrier == 1)
736                 ch->ch_flags |= CH_FCAR;
737         else
738                 ch->ch_flags &= ~CH_FCAR;
739
740         if (phys_carrier == 1)
741                 ch->ch_flags |= CH_CD;
742         else
743                 ch->ch_flags &= ~CH_CD;
744 }
745
746
747 void jsm_check_queue_flow_control(struct jsm_channel *ch)
748 {
749         struct board_ops *bd_ops = ch->ch_bd->bd_ops;
750         int qleft;
751
752         /* Store how much space we have left in the queue */
753         if ((qleft = ch->ch_r_tail - ch->ch_r_head - 1) < 0)
754                 qleft += RQUEUEMASK + 1;
755
756         /*
757          * Check to see if we should enforce flow control on our queue because
758          * the ld (or user) isn't reading data out of our queue fast enuf.
759          *
760          * NOTE: This is done based on what the current flow control of the
761          * port is set for.
762          *
763          * 1) HWFLOW (RTS) - Turn off the UART's Receive interrupt.
764          *      This will cause the UART's FIFO to back up, and force
765          *      the RTS signal to be dropped.
766          * 2) SWFLOW (IXOFF) - Keep trying to send a stop character to
767          *      the other side, in hopes it will stop sending data to us.
768          * 3) NONE - Nothing we can do.  We will simply drop any extra data
769          *      that gets sent into us when the queue fills up.
770          */
771         if (qleft < 256) {
772                 /* HWFLOW */
773                 if (ch->ch_c_cflag & CRTSCTS) {
774                         if(!(ch->ch_flags & CH_RECEIVER_OFF)) {
775                                 bd_ops->disable_receiver(ch);
776                                 ch->ch_flags |= (CH_RECEIVER_OFF);
777                                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
778                                         "Internal queue hit hilevel mark (%d)! Turning off interrupts.\n",
779                                         qleft);
780                         }
781                 }
782                 /* SWFLOW */
783                 else if (ch->ch_c_iflag & IXOFF) {
784                         if (ch->ch_stops_sent <= MAX_STOPS_SENT) {
785                                 bd_ops->send_stop_character(ch);
786                                 ch->ch_stops_sent++;
787                                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
788                                         "Sending stop char! Times sent: %x\n", ch->ch_stops_sent);
789                         }
790                 }
791         }
792
793         /*
794          * Check to see if we should unenforce flow control because
795          * ld (or user) finally read enuf data out of our queue.
796          *
797          * NOTE: This is done based on what the current flow control of the
798          * port is set for.
799          *
800          * 1) HWFLOW (RTS) - Turn back on the UART's Receive interrupt.
801          *      This will cause the UART's FIFO to raise RTS back up,
802          *      which will allow the other side to start sending data again.
803          * 2) SWFLOW (IXOFF) - Send a start character to
804          *      the other side, so it will start sending data to us again.
805          * 3) NONE - Do nothing. Since we didn't do anything to turn off the
806          *      other side, we don't need to do anything now.
807          */
808         if (qleft > (RQUEUESIZE / 2)) {
809                 /* HWFLOW */
810                 if (ch->ch_c_cflag & CRTSCTS) {
811                         if (ch->ch_flags & CH_RECEIVER_OFF) {
812                                 bd_ops->enable_receiver(ch);
813                                 ch->ch_flags &= ~(CH_RECEIVER_OFF);
814                                 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
815                                         "Internal queue hit lowlevel mark (%d)! Turning on interrupts.\n",
816                                         qleft);
817                         }
818                 }
819                 /* SWFLOW */
820                 else if (ch->ch_c_iflag & IXOFF && ch->ch_stops_sent) {
821                         ch->ch_stops_sent = 0;
822                         bd_ops->send_start_character(ch);
823                         jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Sending start char!\n");
824                 }
825         }
826 }
827
828 /*
829  * jsm_tty_write()
830  *
831  * Take data from the user or kernel and send it out to the FEP.
832  * In here exists all the Transparent Print magic as well.
833  */
834 int jsm_tty_write(struct uart_port *port)
835 {
836         int bufcount;
837         int data_count = 0,data_count1 =0;
838         u16 head;
839         u16 tail;
840         u16 tmask;
841         u32 remain;
842         int temp_tail = port->info->xmit.tail;
843         struct jsm_channel *channel = (struct jsm_channel *)port;
844
845         tmask = WQUEUEMASK;
846         head = (channel->ch_w_head) & tmask;
847         tail = (channel->ch_w_tail) & tmask;
848
849         if ((bufcount = tail - head - 1) < 0)
850                 bufcount += WQUEUESIZE;
851
852         bufcount = min(bufcount, 56);
853         remain = WQUEUESIZE - head;
854
855         data_count = 0;
856         if (bufcount >= remain) {
857                 bufcount -= remain;
858                 while ((port->info->xmit.head != temp_tail) &&
859                 (data_count < remain)) {
860                         channel->ch_wqueue[head++] =
861                         port->info->xmit.buf[temp_tail];
862
863                         temp_tail++;
864                         temp_tail &= (UART_XMIT_SIZE - 1);
865                         data_count++;
866                 }
867                 if (data_count == remain) head = 0;
868         }
869
870         data_count1 = 0;
871         if (bufcount > 0) {
872                 remain = bufcount;
873                 while ((port->info->xmit.head != temp_tail) &&
874                         (data_count1 < remain)) {
875                         channel->ch_wqueue[head++] =
876                                 port->info->xmit.buf[temp_tail];
877
878                         temp_tail++;
879                         temp_tail &= (UART_XMIT_SIZE - 1);
880                         data_count1++;
881
882                 }
883         }
884
885         port->info->xmit.tail = temp_tail;
886
887         data_count += data_count1;
888         if (data_count) {
889                 head &= tmask;
890                 channel->ch_w_head = head;
891         }
892
893         if (data_count) {
894                 channel->ch_bd->bd_ops->copy_data_from_queue_to_uart(channel);
895         }
896
897         return data_count;
898 }