2 * $Id: ctctty.c,v 1.26 2004/08/04 11:06:55 mschwide Exp $
4 * CTC / ESCON network driver, tty interface.
6 * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include <linux/config.h>
26 #include <linux/module.h>
27 #include <linux/tty.h>
28 #include <linux/serial_reg.h>
29 #include <linux/interrupt.h>
30 #include <linux/delay.h>
31 #include <asm/uaccess.h>
32 #include <linux/devfs_fs_kernel.h>
36 #define CTC_TTY_MAJOR 43
37 #define CTC_TTY_MAX_DEVICES 64
39 #define CTC_ASYNC_MAGIC 0x49344C01 /* for paranoia-checking */
40 #define CTC_ASYNC_INITIALIZED 0x80000000 /* port was initialized */
41 #define CTC_ASYNC_NORMAL_ACTIVE 0x20000000 /* Normal device active */
42 #define CTC_ASYNC_CLOSING 0x08000000 /* Serial port is closing */
43 #define CTC_ASYNC_CTS_FLOW 0x04000000 /* Do CTS flow control */
44 #define CTC_ASYNC_CHECK_CD 0x02000000 /* i.e., CLOCAL */
45 #define CTC_ASYNC_HUP_NOTIFY 0x0001 /* Notify tty on hangups/closes */
46 #define CTC_ASYNC_NETDEV_OPEN 0x0002 /* Underlying netdev is open */
47 #define CTC_ASYNC_TX_LINESTAT 0x0004 /* Must send line status */
48 #define CTC_ASYNC_SPLIT_TERMIOS 0x0008 /* Sep. termios for dialin/out */
49 #define CTC_TTY_XMIT_SIZE 1024 /* Default bufsize for write */
50 #define CTC_SERIAL_XMIT_MAX 4000 /* Maximum bufsize for write */
52 /* Private data (similar to async_struct in <linux/serial.h>) */
55 int flags
; /* defined in tty.h */
56 int mcr
; /* Modem control register */
57 int msr
; /* Modem status register */
58 int lsr
; /* Line status register */
60 int count
; /* # of fd on device */
61 int blocked_open
; /* # of blocked opens */
62 struct net_device
*netdev
;
63 struct sk_buff_head tx_queue
; /* transmit queue */
64 struct sk_buff_head rx_queue
; /* receive queue */
65 struct tty_struct
*tty
; /* Pointer to corresponding tty */
66 wait_queue_head_t open_wait
;
67 wait_queue_head_t close_wait
;
68 struct semaphore write_sem
;
69 struct tasklet_struct tasklet
;
70 struct timer_list stoptimer
;
73 /* Description of one CTC-tty */
75 struct tty_driver
*ctc_tty_device
; /* tty-device */
76 ctc_tty_info info
[CTC_TTY_MAX_DEVICES
]; /* Private data */
79 static ctc_tty_driver
*driver
;
81 /* Leave this unchanged unless you know what you do! */
82 #define MODEM_PARANOIA_CHECK
83 #define MODEM_DO_RESTART
85 #define CTC_TTY_NAME "ctctty"
87 static __u32 ctc_tty_magic
= CTC_ASYNC_MAGIC
;
88 static int ctc_tty_shuttingdown
= 0;
90 static spinlock_t ctc_tty_lock
;
92 /* ctc_tty_try_read() is called from within ctc_tty_rcv_skb()
93 * to stuff incoming data directly into a tty's flip-buffer. If the
94 * flip buffer is full, the packet gets queued up.
98 * 0 = Failure, data has to be buffered and later processed by
99 * ctc_tty_readmodem().
102 ctc_tty_try_read(ctc_tty_info
* info
, struct sk_buff
*skb
)
106 struct tty_struct
*tty
;
108 DBF_TEXT(trace
, 5, __FUNCTION__
);
109 if ((tty
= info
->tty
)) {
110 if (info
->mcr
& UART_MCR_RTS
) {
111 c
= TTY_FLIPBUF_SIZE
- tty
->flip
.count
;
114 memcpy(tty
->flip
.char_buf_ptr
, skb
->data
, len
);
115 memset(tty
->flip
.flag_buf_ptr
, 0, len
);
116 tty
->flip
.count
+= len
;
117 tty
->flip
.char_buf_ptr
+= len
;
118 tty
->flip
.flag_buf_ptr
+= len
;
119 tty_flip_buffer_push(tty
);
128 /* ctc_tty_readmodem() is called periodically from within timer-interrupt.
129 * It tries getting received data from the receive queue an stuff it into
130 * the tty's flip-buffer.
133 ctc_tty_readmodem(ctc_tty_info
*info
)
136 struct tty_struct
*tty
;
138 DBF_TEXT(trace
, 5, __FUNCTION__
);
139 if ((tty
= info
->tty
)) {
140 if (info
->mcr
& UART_MCR_RTS
) {
141 int c
= TTY_FLIPBUF_SIZE
- tty
->flip
.count
;
144 if ((c
> 0) && (skb
= skb_dequeue(&info
->rx_queue
))) {
148 memcpy(tty
->flip
.char_buf_ptr
, skb
->data
, len
);
150 memset(tty
->flip
.flag_buf_ptr
, 0, len
);
151 tty
->flip
.count
+= len
;
152 tty
->flip
.char_buf_ptr
+= len
;
153 tty
->flip
.flag_buf_ptr
+= len
;
154 tty_flip_buffer_push(tty
);
156 skb_queue_head(&info
->rx_queue
, skb
);
159 ret
= skb_queue_len(&info
->rx_queue
);
168 ctc_tty_setcarrier(struct net_device
*netdev
, int on
)
172 DBF_TEXT(trace
, 4, __FUNCTION__
);
173 if ((!driver
) || ctc_tty_shuttingdown
)
175 for (i
= 0; i
< CTC_TTY_MAX_DEVICES
; i
++)
176 if (driver
->info
[i
].netdev
== netdev
) {
177 ctc_tty_info
*info
= &driver
->info
[i
];
179 info
->msr
|= UART_MSR_DCD
;
181 info
->msr
&= ~UART_MSR_DCD
;
182 if ((info
->flags
& CTC_ASYNC_CHECK_CD
) && (!on
))
183 tty_hangup(info
->tty
);
188 ctc_tty_netif_rx(struct sk_buff
*skb
)
191 ctc_tty_info
*info
= NULL
;
193 DBF_TEXT(trace
, 5, __FUNCTION__
);
196 if ((!skb
->dev
) || (!driver
) || ctc_tty_shuttingdown
) {
200 for (i
= 0; i
< CTC_TTY_MAX_DEVICES
; i
++)
201 if (driver
->info
[i
].netdev
== skb
->dev
) {
202 info
= &driver
->info
[i
];
213 if (memcmp(skb
->data
, &ctc_tty_magic
, sizeof(__u32
))) {
217 skb_pull(skb
, sizeof(__u32
));
219 i
= *((int *)skb
->data
);
220 skb_pull(skb
, sizeof(info
->mcr
));
221 if (i
& UART_MCR_RTS
) {
222 info
->msr
|= UART_MSR_CTS
;
223 if (info
->flags
& CTC_ASYNC_CTS_FLOW
)
224 info
->tty
->hw_stopped
= 0;
226 info
->msr
&= ~UART_MSR_CTS
;
227 if (info
->flags
& CTC_ASYNC_CTS_FLOW
)
228 info
->tty
->hw_stopped
= 1;
230 if (i
& UART_MCR_DTR
)
231 info
->msr
|= UART_MSR_DSR
;
233 info
->msr
&= ~UART_MSR_DSR
;
238 /* Try to deliver directly via tty-flip-buf if queue is empty */
239 if (skb_queue_empty(&info
->rx_queue
))
240 if (ctc_tty_try_read(info
, skb
))
242 /* Direct deliver failed or queue wasn't empty.
243 * Queue up for later dequeueing via timer-irq.
245 skb_queue_tail(&info
->rx_queue
, skb
);
246 /* Schedule dequeuing */
247 tasklet_schedule(&info
->tasklet
);
251 ctc_tty_tint(ctc_tty_info
* info
)
253 struct sk_buff
*skb
= skb_dequeue(&info
->tx_queue
);
254 int stopped
= (info
->tty
->hw_stopped
|| info
->tty
->stopped
);
258 DBF_TEXT(trace
, 4, __FUNCTION__
);
264 if (info
->flags
& CTC_ASYNC_TX_LINESTAT
) {
265 int skb_res
= info
->netdev
->hard_header_len
+
266 sizeof(info
->mcr
) + sizeof(__u32
);
267 /* If we must update line status,
268 * create an empty dummy skb and insert it.
271 skb_queue_head(&info
->tx_queue
, skb
);
273 skb
= dev_alloc_skb(skb_res
);
276 "ctc_tty: Out of memory in %s%d tint\n",
277 CTC_TTY_NAME
, info
->line
);
280 skb_reserve(skb
, skb_res
);
287 skb_queue_head(&info
->tx_queue
, skb
);
292 printk(KERN_DEBUG
"tint: %d %02x\n", skb
->len
, *(skb
->data
));
294 printk(KERN_DEBUG
"tint: %d STAT\n", skb
->len
);
296 memcpy(skb_push(skb
, sizeof(info
->mcr
)), &info
->mcr
, sizeof(info
->mcr
));
297 memcpy(skb_push(skb
, sizeof(__u32
)), &ctc_tty_magic
, sizeof(__u32
));
298 rc
= info
->netdev
->hard_start_xmit(skb
, info
->netdev
);
300 skb_pull(skb
, sizeof(info
->mcr
) + sizeof(__u32
));
302 skb_queue_head(&info
->tx_queue
, skb
);
306 struct tty_struct
*tty
= info
->tty
;
308 info
->flags
&= ~CTC_ASYNC_TX_LINESTAT
;
313 return (skb_queue_empty(&info
->tx_queue
) ? 0 : 1);
316 /************************************************************
320 * mostly "stolen" from original Linux-serial.c and friends.
322 ************************************************************/
325 ctc_tty_paranoia_check(ctc_tty_info
* info
, char *name
, const char *routine
)
327 #ifdef MODEM_PARANOIA_CHECK
329 printk(KERN_WARNING
"ctc_tty: null info_struct for %s in %s\n",
333 if (info
->magic
!= CTC_ASYNC_MAGIC
) {
334 printk(KERN_WARNING
"ctc_tty: bad magic for info struct %s in %s\n",
343 ctc_tty_inject(ctc_tty_info
*info
, char c
)
348 DBF_TEXT(trace
, 4, __FUNCTION__
);
349 if (ctc_tty_shuttingdown
)
351 skb_res
= info
->netdev
->hard_header_len
+ sizeof(info
->mcr
) +
353 skb
= dev_alloc_skb(skb_res
);
356 "ctc_tty: Out of memory in %s%d tx_inject\n",
357 CTC_TTY_NAME
, info
->line
);
360 skb_reserve(skb
, skb_res
);
361 *(skb_put(skb
, 1)) = c
;
362 skb_queue_head(&info
->tx_queue
, skb
);
363 tasklet_schedule(&info
->tasklet
);
367 ctc_tty_transmit_status(ctc_tty_info
*info
)
369 DBF_TEXT(trace
, 5, __FUNCTION__
);
370 if (ctc_tty_shuttingdown
)
372 info
->flags
|= CTC_ASYNC_TX_LINESTAT
;
373 tasklet_schedule(&info
->tasklet
);
377 ctc_tty_change_speed(ctc_tty_info
* info
)
383 DBF_TEXT(trace
, 3, __FUNCTION__
);
384 if (!info
->tty
|| !info
->tty
->termios
)
386 cflag
= info
->tty
->termios
->c_cflag
;
388 quot
= i
= cflag
& CBAUD
;
392 info
->tty
->termios
->c_cflag
&= ~CBAUDEX
;
397 info
->mcr
|= UART_MCR_DTR
;
398 info
->mcr
|= UART_MCR_RTS
;
399 ctc_tty_transmit_status(info
);
401 info
->mcr
&= ~UART_MCR_DTR
;
402 info
->mcr
&= ~UART_MCR_RTS
;
403 ctc_tty_transmit_status(info
);
407 /* CTS flow control flag and modem status interrupts */
408 if (cflag
& CRTSCTS
) {
409 info
->flags
|= CTC_ASYNC_CTS_FLOW
;
411 info
->flags
&= ~CTC_ASYNC_CTS_FLOW
;
413 info
->flags
&= ~CTC_ASYNC_CHECK_CD
;
415 info
->flags
|= CTC_ASYNC_CHECK_CD
;
420 ctc_tty_startup(ctc_tty_info
* info
)
422 DBF_TEXT(trace
, 3, __FUNCTION__
);
423 if (info
->flags
& CTC_ASYNC_INITIALIZED
)
425 #ifdef CTC_DEBUG_MODEM_OPEN
426 printk(KERN_DEBUG
"starting up %s%d ...\n", CTC_TTY_NAME
, info
->line
);
429 * Now, initialize the UART
431 info
->mcr
= UART_MCR_DTR
| UART_MCR_RTS
| UART_MCR_OUT2
;
433 clear_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
435 * and set the speed of the serial port
437 ctc_tty_change_speed(info
);
439 info
->flags
|= CTC_ASYNC_INITIALIZED
;
440 if (!(info
->flags
& CTC_ASYNC_NETDEV_OPEN
))
441 info
->netdev
->open(info
->netdev
);
442 info
->flags
|= CTC_ASYNC_NETDEV_OPEN
;
447 ctc_tty_stopdev(unsigned long data
)
449 ctc_tty_info
*info
= (ctc_tty_info
*)data
;
451 if ((!info
) || (!info
->netdev
) ||
452 (info
->flags
& CTC_ASYNC_INITIALIZED
))
454 info
->netdev
->stop(info
->netdev
);
455 info
->flags
&= ~CTC_ASYNC_NETDEV_OPEN
;
459 * This routine will shutdown a serial port; interrupts are disabled, and
460 * DTR is dropped if the hangup on close termio flag is on.
463 ctc_tty_shutdown(ctc_tty_info
* info
)
465 DBF_TEXT(trace
, 3, __FUNCTION__
);
466 if (!(info
->flags
& CTC_ASYNC_INITIALIZED
))
468 #ifdef CTC_DEBUG_MODEM_OPEN
469 printk(KERN_DEBUG
"Shutting down %s%d ....\n", CTC_TTY_NAME
, info
->line
);
471 info
->msr
&= ~UART_MSR_RI
;
472 if (!info
->tty
|| (info
->tty
->termios
->c_cflag
& HUPCL
))
473 info
->mcr
&= ~(UART_MCR_DTR
| UART_MCR_RTS
);
475 set_bit(TTY_IO_ERROR
, &info
->tty
->flags
);
476 mod_timer(&info
->stoptimer
, jiffies
+ (10 * HZ
));
477 skb_queue_purge(&info
->tx_queue
);
478 skb_queue_purge(&info
->rx_queue
);
479 info
->flags
&= ~CTC_ASYNC_INITIALIZED
;
482 /* ctc_tty_write() is the main send-routine. It is called from the upper
483 * levels within the kernel to perform sending data. Depending on the
484 * online-flag it either directs output to the at-command-interpreter or
485 * to the lower level. Additional tasks done here:
486 * - If online, check for escape-sequence (+++)
487 * - If sending audio-data, call ctc_tty_DLEdown() to parse DLE-codes.
488 * - If receiving audio-data, call ctc_tty_end_vrx() to abort if needed.
489 * - If dialing, abort dial.
492 ctc_tty_write(struct tty_struct
*tty
, const u_char
* buf
, int count
)
496 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
498 DBF_TEXT(trace
, 5, __FUNCTION__
);
499 if (ctc_tty_shuttingdown
)
501 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_write"))
513 c
= (count
< CTC_TTY_XMIT_SIZE
) ? count
: CTC_TTY_XMIT_SIZE
;
517 skb_res
= info
->netdev
->hard_header_len
+ sizeof(info
->mcr
) +
519 skb
= dev_alloc_skb(skb_res
+ c
);
522 "ctc_tty: Out of memory in %s%d write\n",
523 CTC_TTY_NAME
, info
->line
);
526 skb_reserve(skb
, skb_res
);
527 memcpy(skb_put(skb
, c
), buf
, c
);
528 skb_queue_tail(&info
->tx_queue
, skb
);
533 if (skb_queue_len(&info
->tx_queue
)) {
534 info
->lsr
&= ~UART_LSR_TEMT
;
535 tasklet_schedule(&info
->tasklet
);
538 DBF_TEXT(trace
, 6, __FUNCTION__
);
543 ctc_tty_write_room(struct tty_struct
*tty
)
545 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
547 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_write_room"))
549 return CTC_TTY_XMIT_SIZE
;
553 ctc_tty_chars_in_buffer(struct tty_struct
*tty
)
555 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
557 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_chars_in_buffer"))
563 ctc_tty_flush_buffer(struct tty_struct
*tty
)
568 DBF_TEXT(trace
, 4, __FUNCTION__
);
571 spin_lock_irqsave(&ctc_tty_lock
, flags
);
572 info
= (ctc_tty_info
*) tty
->driver_data
;
573 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_flush_buffer")) {
574 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
577 skb_queue_purge(&info
->tx_queue
);
578 info
->lsr
|= UART_LSR_TEMT
;
579 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
580 wake_up_interruptible(&tty
->write_wait
);
583 DBF_TEXT_(trace
, 2, "ex: %s ", __FUNCTION__
);
588 ctc_tty_flush_chars(struct tty_struct
*tty
)
590 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
592 DBF_TEXT(trace
, 4, __FUNCTION__
);
593 if (ctc_tty_shuttingdown
)
595 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_flush_chars"))
597 if (tty
->stopped
|| tty
->hw_stopped
|| (!skb_queue_len(&info
->tx_queue
)))
599 tasklet_schedule(&info
->tasklet
);
603 * ------------------------------------------------------------
606 * This routine is called by the upper-layer tty layer to signal that
607 * incoming characters should be throttled.
608 * ------------------------------------------------------------
611 ctc_tty_throttle(struct tty_struct
*tty
)
613 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
615 DBF_TEXT(trace
, 4, __FUNCTION__
);
616 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_throttle"))
618 info
->mcr
&= ~UART_MCR_RTS
;
620 ctc_tty_inject(info
, STOP_CHAR(tty
));
621 ctc_tty_transmit_status(info
);
625 ctc_tty_unthrottle(struct tty_struct
*tty
)
627 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
629 DBF_TEXT(trace
, 4, __FUNCTION__
);
630 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_unthrottle"))
632 info
->mcr
|= UART_MCR_RTS
;
634 ctc_tty_inject(info
, START_CHAR(tty
));
635 ctc_tty_transmit_status(info
);
639 * ------------------------------------------------------------
640 * ctc_tty_ioctl() and friends
641 * ------------------------------------------------------------
645 * ctc_tty_get_lsr_info - get line status register info
647 * Purpose: Let user call ioctl() to get info when the UART physically
648 * is emptied. On bus types like RS485, the transmitter must
649 * release the bus after transmitting. This must be done when
650 * the transmit shift register is empty, not be done when the
651 * transmit holding register is empty. This functionality
652 * allows RS485 driver to be written in user space.
655 ctc_tty_get_lsr_info(ctc_tty_info
* info
, uint __user
*value
)
661 DBF_TEXT(trace
, 4, __FUNCTION__
);
662 spin_lock_irqsave(&ctc_tty_lock
, flags
);
664 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
665 result
= ((status
& UART_LSR_TEMT
) ? TIOCSER_TEMT
: 0);
666 put_user(result
, value
);
671 static int ctc_tty_tiocmget(struct tty_struct
*tty
, struct file
*file
)
673 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
679 DBF_TEXT(trace
, 4, __FUNCTION__
);
680 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_ioctl"))
682 if (tty
->flags
& (1 << TTY_IO_ERROR
))
686 spin_lock_irqsave(&ctc_tty_lock
, flags
);
688 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
689 result
= ((control
& UART_MCR_RTS
) ? TIOCM_RTS
: 0)
690 | ((control
& UART_MCR_DTR
) ? TIOCM_DTR
: 0)
691 | ((status
& UART_MSR_DCD
) ? TIOCM_CAR
: 0)
692 | ((status
& UART_MSR_RI
) ? TIOCM_RNG
: 0)
693 | ((status
& UART_MSR_DSR
) ? TIOCM_DSR
: 0)
694 | ((status
& UART_MSR_CTS
) ? TIOCM_CTS
: 0);
699 ctc_tty_tiocmset(struct tty_struct
*tty
, struct file
*file
,
700 unsigned int set
, unsigned int clear
)
702 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
704 DBF_TEXT(trace
, 4, __FUNCTION__
);
705 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_ioctl"))
707 if (tty
->flags
& (1 << TTY_IO_ERROR
))
711 info
->mcr
|= UART_MCR_RTS
;
713 info
->mcr
|= UART_MCR_DTR
;
715 if (clear
& TIOCM_RTS
)
716 info
->mcr
&= ~UART_MCR_RTS
;
717 if (clear
& TIOCM_DTR
)
718 info
->mcr
&= ~UART_MCR_DTR
;
720 if ((set
| clear
) & (TIOCM_RTS
|TIOCM_DTR
))
721 ctc_tty_transmit_status(info
);
726 ctc_tty_ioctl(struct tty_struct
*tty
, struct file
*file
,
729 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
733 DBF_TEXT(trace
, 4, __FUNCTION__
);
734 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_ioctl"))
736 if (tty
->flags
& (1 << TTY_IO_ERROR
))
739 case TCSBRK
: /* SVID version: non-zero arg --> no break */
740 #ifdef CTC_DEBUG_MODEM_IOCTL
741 printk(KERN_DEBUG
"%s%d ioctl TCSBRK\n", CTC_TTY_NAME
, info
->line
);
743 retval
= tty_check_change(tty
);
746 tty_wait_until_sent(tty
, 0);
748 case TCSBRKP
: /* support for POSIX tcsendbreak() */
749 #ifdef CTC_DEBUG_MODEM_IOCTL
750 printk(KERN_DEBUG
"%s%d ioctl TCSBRKP\n", CTC_TTY_NAME
, info
->line
);
752 retval
= tty_check_change(tty
);
755 tty_wait_until_sent(tty
, 0);
758 #ifdef CTC_DEBUG_MODEM_IOCTL
759 printk(KERN_DEBUG
"%s%d ioctl TIOCGSOFTCAR\n", CTC_TTY_NAME
,
762 error
= put_user(C_CLOCAL(tty
) ? 1 : 0, (ulong __user
*) arg
);
765 #ifdef CTC_DEBUG_MODEM_IOCTL
766 printk(KERN_DEBUG
"%s%d ioctl TIOCSSOFTCAR\n", CTC_TTY_NAME
,
769 error
= get_user(arg
, (ulong __user
*) arg
);
772 tty
->termios
->c_cflag
=
773 ((tty
->termios
->c_cflag
& ~CLOCAL
) |
776 case TIOCSERGETLSR
: /* Get line status register */
777 #ifdef CTC_DEBUG_MODEM_IOCTL
778 printk(KERN_DEBUG
"%s%d ioctl TIOCSERGETLSR\n", CTC_TTY_NAME
,
781 if (access_ok(VERIFY_WRITE
, (void __user
*) arg
, sizeof(uint
)))
782 return ctc_tty_get_lsr_info(info
, (uint __user
*) arg
);
786 #ifdef CTC_DEBUG_MODEM_IOCTL
787 printk(KERN_DEBUG
"UNKNOWN ioctl 0x%08x on %s%d\n", cmd
,
788 CTC_TTY_NAME
, info
->line
);
796 ctc_tty_set_termios(struct tty_struct
*tty
, struct termios
*old_termios
)
798 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
799 unsigned int cflag
= tty
->termios
->c_cflag
;
801 DBF_TEXT(trace
, 4, __FUNCTION__
);
802 ctc_tty_change_speed(info
);
804 /* Handle transition to B0 */
805 if ((old_termios
->c_cflag
& CBAUD
) && !(cflag
& CBAUD
)) {
806 info
->mcr
&= ~(UART_MCR_DTR
|UART_MCR_RTS
);
807 ctc_tty_transmit_status(info
);
810 /* Handle transition from B0 to other */
811 if (!(old_termios
->c_cflag
& CBAUD
) && (cflag
& CBAUD
)) {
812 info
->mcr
|= UART_MCR_DTR
;
813 if (!(tty
->termios
->c_cflag
& CRTSCTS
) ||
814 !test_bit(TTY_THROTTLED
, &tty
->flags
)) {
815 info
->mcr
|= UART_MCR_RTS
;
817 ctc_tty_transmit_status(info
);
820 /* Handle turning off CRTSCTS */
821 if ((old_termios
->c_cflag
& CRTSCTS
) &&
822 !(tty
->termios
->c_cflag
& CRTSCTS
))
827 * ------------------------------------------------------------
828 * ctc_tty_open() and friends
829 * ------------------------------------------------------------
832 ctc_tty_block_til_ready(struct tty_struct
*tty
, struct file
*filp
, ctc_tty_info
*info
)
834 DECLARE_WAITQUEUE(wait
, NULL
);
839 DBF_TEXT(trace
, 4, __FUNCTION__
);
841 * If the device is in the middle of being closed, then block
842 * until it's done, and then try again.
844 if (tty_hung_up_p(filp
) ||
845 (info
->flags
& CTC_ASYNC_CLOSING
)) {
846 if (info
->flags
& CTC_ASYNC_CLOSING
)
847 wait_event(info
->close_wait
,
848 !(info
->flags
& CTC_ASYNC_CLOSING
));
849 #ifdef MODEM_DO_RESTART
850 if (info
->flags
& CTC_ASYNC_HUP_NOTIFY
)
859 * If non-blocking mode is set, then make the check up front
862 if ((filp
->f_flags
& O_NONBLOCK
) ||
863 (tty
->flags
& (1 << TTY_IO_ERROR
))) {
864 info
->flags
|= CTC_ASYNC_NORMAL_ACTIVE
;
867 if (tty
->termios
->c_cflag
& CLOCAL
)
870 * Block waiting for the carrier detect and the line to become
871 * free (i.e., not in use by the callout). While we are in
872 * this loop, info->count is dropped by one, so that
873 * ctc_tty_close() knows when to free things. We restore it upon
874 * exit, either normal or abnormal.
877 add_wait_queue(&info
->open_wait
, &wait
);
878 #ifdef CTC_DEBUG_MODEM_OPEN
879 printk(KERN_DEBUG
"ctc_tty_block_til_ready before block: %s%d, count = %d\n",
880 CTC_TTY_NAME
, info
->line
, info
->count
);
882 spin_lock_irqsave(&ctc_tty_lock
, flags
);
883 if (!(tty_hung_up_p(filp
)))
885 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
886 info
->blocked_open
++;
888 set_current_state(TASK_INTERRUPTIBLE
);
889 if (tty_hung_up_p(filp
) ||
890 !(info
->flags
& CTC_ASYNC_INITIALIZED
)) {
891 #ifdef MODEM_DO_RESTART
892 if (info
->flags
& CTC_ASYNC_HUP_NOTIFY
)
895 retval
= -ERESTARTSYS
;
901 if (!(info
->flags
& CTC_ASYNC_CLOSING
) &&
902 (do_clocal
|| (info
->msr
& UART_MSR_DCD
))) {
905 if (signal_pending(current
)) {
906 retval
= -ERESTARTSYS
;
909 #ifdef CTC_DEBUG_MODEM_OPEN
910 printk(KERN_DEBUG
"ctc_tty_block_til_ready blocking: %s%d, count = %d\n",
911 CTC_TTY_NAME
, info
->line
, info
->count
);
915 current
->state
= TASK_RUNNING
;
916 remove_wait_queue(&info
->open_wait
, &wait
);
917 if (!tty_hung_up_p(filp
))
919 info
->blocked_open
--;
920 #ifdef CTC_DEBUG_MODEM_OPEN
921 printk(KERN_DEBUG
"ctc_tty_block_til_ready after blocking: %s%d, count = %d\n",
922 CTC_TTY_NAME
, info
->line
, info
->count
);
926 info
->flags
|= CTC_ASYNC_NORMAL_ACTIVE
;
931 * This routine is called whenever a serial port is opened. It
932 * enables interrupts for a serial port, linking in its async structure into
933 * the IRQ chain. It also performs the serial-specific
934 * initialization for the tty structure.
937 ctc_tty_open(struct tty_struct
*tty
, struct file
*filp
)
940 unsigned long saveflags
;
944 DBF_TEXT(trace
, 3, __FUNCTION__
);
946 if (line
< 0 || line
> CTC_TTY_MAX_DEVICES
)
948 info
= &driver
->info
[line
];
949 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_open"))
953 #ifdef CTC_DEBUG_MODEM_OPEN
954 printk(KERN_DEBUG
"ctc_tty_open %s, count = %d\n", tty
->name
,
957 spin_lock_irqsave(&ctc_tty_lock
, saveflags
);
959 tty
->driver_data
= info
;
961 spin_unlock_irqrestore(&ctc_tty_lock
, saveflags
);
963 * Start up serial port
965 retval
= ctc_tty_startup(info
);
967 #ifdef CTC_DEBUG_MODEM_OPEN
968 printk(KERN_DEBUG
"ctc_tty_open return after startup\n");
972 retval
= ctc_tty_block_til_ready(tty
, filp
, info
);
974 #ifdef CTC_DEBUG_MODEM_OPEN
975 printk(KERN_DEBUG
"ctc_tty_open return after ctc_tty_block_til_ready \n");
979 #ifdef CTC_DEBUG_MODEM_OPEN
980 printk(KERN_DEBUG
"ctc_tty_open %s successful...\n", tty
->name
);
986 ctc_tty_close(struct tty_struct
*tty
, struct file
*filp
)
988 ctc_tty_info
*info
= (ctc_tty_info
*) tty
->driver_data
;
991 DBF_TEXT(trace
, 3, __FUNCTION__
);
992 if (!info
|| ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_close"))
994 spin_lock_irqsave(&ctc_tty_lock
, flags
);
995 if (tty_hung_up_p(filp
)) {
996 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
997 #ifdef CTC_DEBUG_MODEM_OPEN
998 printk(KERN_DEBUG
"ctc_tty_close return after tty_hung_up_p\n");
1002 if ((tty
->count
== 1) && (info
->count
!= 1)) {
1004 * Uh, oh. tty->count is 1, which means that the tty
1005 * structure will be freed. Info->count should always
1006 * be one in these conditions. If it's greater than
1007 * one, we've got real problems, since it means the
1008 * serial port won't be shutdown.
1010 printk(KERN_ERR
"ctc_tty_close: bad port count; tty->count is 1, "
1011 "info->count is %d\n", info
->count
);
1014 if (--info
->count
< 0) {
1015 printk(KERN_ERR
"ctc_tty_close: bad port count for %s%d: %d\n",
1016 CTC_TTY_NAME
, info
->line
, info
->count
);
1020 local_irq_restore(flags
);
1021 #ifdef CTC_DEBUG_MODEM_OPEN
1022 printk(KERN_DEBUG
"ctc_tty_close after info->count != 0\n");
1026 info
->flags
|= CTC_ASYNC_CLOSING
;
1029 * At this point we stop accepting input. To do this, we
1030 * disable the receive line status interrupts, and tell the
1031 * interrupt driver to stop checking the data ready bit in the
1032 * line status register.
1034 if (info
->flags
& CTC_ASYNC_INITIALIZED
) {
1035 tty_wait_until_sent(tty
, 30*HZ
); /* 30 seconds timeout */
1037 * Before we drop DTR, make sure the UART transmitter
1038 * has completely drained; this is especially
1039 * important if there is a transmit FIFO!
1041 timeout
= jiffies
+ HZ
;
1042 while (!(info
->lsr
& UART_LSR_TEMT
)) {
1043 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
1045 spin_lock_irqsave(&ctc_tty_lock
, flags
);
1046 if (time_after(jiffies
,timeout
))
1050 ctc_tty_shutdown(info
);
1051 if (tty
->driver
->flush_buffer
) {
1052 skb_queue_purge(&info
->tx_queue
);
1053 info
->lsr
|= UART_LSR_TEMT
;
1055 tty_ldisc_flush(tty
);
1058 if (info
->blocked_open
) {
1059 set_current_state(TASK_INTERRUPTIBLE
);
1060 schedule_timeout(HZ
/2);
1061 wake_up_interruptible(&info
->open_wait
);
1063 info
->flags
&= ~(CTC_ASYNC_NORMAL_ACTIVE
| CTC_ASYNC_CLOSING
);
1064 wake_up_interruptible(&info
->close_wait
);
1065 spin_unlock_irqrestore(&ctc_tty_lock
, flags
);
1066 #ifdef CTC_DEBUG_MODEM_OPEN
1067 printk(KERN_DEBUG
"ctc_tty_close normal exit\n");
1072 * ctc_tty_hangup() --- called by tty_hangup() when a hangup is signaled.
1075 ctc_tty_hangup(struct tty_struct
*tty
)
1077 ctc_tty_info
*info
= (ctc_tty_info
*)tty
->driver_data
;
1078 unsigned long saveflags
;
1079 DBF_TEXT(trace
, 3, __FUNCTION__
);
1080 if (ctc_tty_paranoia_check(info
, tty
->name
, "ctc_tty_hangup"))
1082 ctc_tty_shutdown(info
);
1084 info
->flags
&= ~CTC_ASYNC_NORMAL_ACTIVE
;
1085 spin_lock_irqsave(&ctc_tty_lock
, saveflags
);
1087 spin_unlock_irqrestore(&ctc_tty_lock
, saveflags
);
1088 wake_up_interruptible(&info
->open_wait
);
1093 * For all online tty's, try sending data to
1097 ctc_tty_task(unsigned long arg
)
1099 ctc_tty_info
*info
= (void *)arg
;
1100 unsigned long saveflags
;
1103 DBF_TEXT(trace
, 3, __FUNCTION__
);
1104 spin_lock_irqsave(&ctc_tty_lock
, saveflags
);
1105 if ((!ctc_tty_shuttingdown
) && info
) {
1106 again
= ctc_tty_tint(info
);
1108 info
->lsr
|= UART_LSR_TEMT
;
1109 again
|= ctc_tty_readmodem(info
);
1111 tasklet_schedule(&info
->tasklet
);
1114 spin_unlock_irqrestore(&ctc_tty_lock
, saveflags
);
1117 static struct tty_operations ctc_ops
= {
1118 .open
= ctc_tty_open
,
1119 .close
= ctc_tty_close
,
1120 .write
= ctc_tty_write
,
1121 .flush_chars
= ctc_tty_flush_chars
,
1122 .write_room
= ctc_tty_write_room
,
1123 .chars_in_buffer
= ctc_tty_chars_in_buffer
,
1124 .flush_buffer
= ctc_tty_flush_buffer
,
1125 .ioctl
= ctc_tty_ioctl
,
1126 .throttle
= ctc_tty_throttle
,
1127 .unthrottle
= ctc_tty_unthrottle
,
1128 .set_termios
= ctc_tty_set_termios
,
1129 .hangup
= ctc_tty_hangup
,
1130 .tiocmget
= ctc_tty_tiocmget
,
1131 .tiocmset
= ctc_tty_tiocmset
,
1139 struct tty_driver
*device
;
1141 DBF_TEXT(trace
, 2, __FUNCTION__
);
1142 driver
= kmalloc(sizeof(ctc_tty_driver
), GFP_KERNEL
);
1143 if (driver
== NULL
) {
1144 printk(KERN_WARNING
"Out of memory in ctc_tty_modem_init\n");
1147 memset(driver
, 0, sizeof(ctc_tty_driver
));
1148 device
= alloc_tty_driver(CTC_TTY_MAX_DEVICES
);
1151 printk(KERN_WARNING
"Out of memory in ctc_tty_modem_init\n");
1155 device
->devfs_name
= "ctc/" CTC_TTY_NAME
;
1156 device
->name
= CTC_TTY_NAME
;
1157 device
->major
= CTC_TTY_MAJOR
;
1158 device
->minor_start
= 0;
1159 device
->type
= TTY_DRIVER_TYPE_SERIAL
;
1160 device
->subtype
= SERIAL_TYPE_NORMAL
;
1161 device
->init_termios
= tty_std_termios
;
1162 device
->init_termios
.c_cflag
= B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
1163 device
->flags
= TTY_DRIVER_REAL_RAW
;
1164 device
->driver_name
= "ctc_tty",
1165 tty_set_operations(device
, &ctc_ops
);
1166 if (tty_register_driver(device
)) {
1167 printk(KERN_WARNING
"ctc_tty: Couldn't register serial-device\n");
1168 put_tty_driver(device
);
1172 driver
->ctc_tty_device
= device
;
1173 for (i
= 0; i
< CTC_TTY_MAX_DEVICES
; i
++) {
1174 info
= &driver
->info
[i
];
1175 init_MUTEX(&info
->write_sem
);
1176 tasklet_init(&info
->tasklet
, ctc_tty_task
,
1177 (unsigned long) info
);
1178 info
->magic
= CTC_ASYNC_MAGIC
;
1182 info
->blocked_open
= 0;
1183 init_waitqueue_head(&info
->open_wait
);
1184 init_waitqueue_head(&info
->close_wait
);
1185 skb_queue_head_init(&info
->tx_queue
);
1186 skb_queue_head_init(&info
->rx_queue
);
1187 init_timer(&info
->stoptimer
);
1188 info
->stoptimer
.function
= ctc_tty_stopdev
;
1189 info
->stoptimer
.data
= (unsigned long)info
;
1190 info
->mcr
= UART_MCR_RTS
;
1196 ctc_tty_register_netdev(struct net_device
*dev
) {
1201 DBF_TEXT(trace
, 2, __FUNCTION__
);
1202 if ((!dev
) || (!dev
->name
)) {
1204 "ctc_tty_register_netdev called "
1205 "with NULL dev or NULL dev-name\n");
1210 * If the name is a format string the caller wants us to
1211 * do a name allocation : format string must end with %d
1213 if (strchr(dev
->name
, '%'))
1215 int err
= dev_alloc_name(dev
, dev
->name
); // dev->name is changed by this
1217 printk(KERN_DEBUG
"dev_alloc returned error %d\n", err
);
1223 for (p
= dev
->name
; p
&& ((*p
< '0') || (*p
> '9')); p
++);
1224 ttynum
= simple_strtoul(p
, &err
, 0);
1225 if ((ttynum
< 0) || (ttynum
>= CTC_TTY_MAX_DEVICES
) ||
1228 "ctc_tty_register_netdev called "
1229 "with number in name '%s'\n", dev
->name
);
1232 if (driver
->info
[ttynum
].netdev
) {
1234 "ctc_tty_register_netdev called "
1235 "for already registered device '%s'\n",
1239 driver
->info
[ttynum
].netdev
= dev
;
1244 ctc_tty_unregister_netdev(struct net_device
*dev
) {
1246 unsigned long saveflags
;
1247 ctc_tty_info
*info
= NULL
;
1249 DBF_TEXT(trace
, 2, __FUNCTION__
);
1250 spin_lock_irqsave(&ctc_tty_lock
, saveflags
);
1251 for (i
= 0; i
< CTC_TTY_MAX_DEVICES
; i
++)
1252 if (driver
->info
[i
].netdev
== dev
) {
1253 info
= &driver
->info
[i
];
1257 info
->netdev
= NULL
;
1258 skb_queue_purge(&info
->tx_queue
);
1259 skb_queue_purge(&info
->rx_queue
);
1261 spin_unlock_irqrestore(&ctc_tty_lock
, saveflags
);
1265 ctc_tty_cleanup(void) {
1266 unsigned long saveflags
;
1268 DBF_TEXT(trace
, 2, __FUNCTION__
);
1269 spin_lock_irqsave(&ctc_tty_lock
, saveflags
);
1270 ctc_tty_shuttingdown
= 1;
1271 spin_unlock_irqrestore(&ctc_tty_lock
, saveflags
);
1272 tty_unregister_driver(driver
->ctc_tty_device
);
1273 put_tty_driver(driver
->ctc_tty_device
);