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;
310 if (wake && (tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
311 tty->ldisc.write_wakeup)
312 (tty->ldisc.write_wakeup)(tty);
313 wake_up_interruptible(&tty->write_wait);
316 return (skb_queue_empty(&info->tx_queue) ? 0 : 1);
319 /************************************************************
323 * mostly "stolen" from original Linux-serial.c and friends.
325 ************************************************************/
328 ctc_tty_paranoia_check(ctc_tty_info * info, char *name, const char *routine)
330 #ifdef MODEM_PARANOIA_CHECK
332 printk(KERN_WARNING "ctc_tty: null info_struct for %s in %s\n",
336 if (info->magic != CTC_ASYNC_MAGIC) {
337 printk(KERN_WARNING "ctc_tty: bad magic for info struct %s in %s\n",
346 ctc_tty_inject(ctc_tty_info *info, char c)
351 DBF_TEXT(trace, 4, __FUNCTION__);
352 if (ctc_tty_shuttingdown)
354 skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
356 skb = dev_alloc_skb(skb_res);
359 "ctc_tty: Out of memory in %s%d tx_inject\n",
360 CTC_TTY_NAME, info->line);
363 skb_reserve(skb, skb_res);
364 *(skb_put(skb, 1)) = c;
365 skb_queue_head(&info->tx_queue, skb);
366 tasklet_schedule(&info->tasklet);
370 ctc_tty_transmit_status(ctc_tty_info *info)
372 DBF_TEXT(trace, 5, __FUNCTION__);
373 if (ctc_tty_shuttingdown)
375 info->flags |= CTC_ASYNC_TX_LINESTAT;
376 tasklet_schedule(&info->tasklet);
380 ctc_tty_change_speed(ctc_tty_info * info)
386 DBF_TEXT(trace, 3, __FUNCTION__);
387 if (!info->tty || !info->tty->termios)
389 cflag = info->tty->termios->c_cflag;
391 quot = i = cflag & CBAUD;
395 info->tty->termios->c_cflag &= ~CBAUDEX;
400 info->mcr |= UART_MCR_DTR;
401 info->mcr |= UART_MCR_RTS;
402 ctc_tty_transmit_status(info);
404 info->mcr &= ~UART_MCR_DTR;
405 info->mcr &= ~UART_MCR_RTS;
406 ctc_tty_transmit_status(info);
410 /* CTS flow control flag and modem status interrupts */
411 if (cflag & CRTSCTS) {
412 info->flags |= CTC_ASYNC_CTS_FLOW;
414 info->flags &= ~CTC_ASYNC_CTS_FLOW;
416 info->flags &= ~CTC_ASYNC_CHECK_CD;
418 info->flags |= CTC_ASYNC_CHECK_CD;
423 ctc_tty_startup(ctc_tty_info * info)
425 DBF_TEXT(trace, 3, __FUNCTION__);
426 if (info->flags & CTC_ASYNC_INITIALIZED)
428 #ifdef CTC_DEBUG_MODEM_OPEN
429 printk(KERN_DEBUG "starting up %s%d ...\n", CTC_TTY_NAME, info->line);
432 * Now, initialize the UART
434 info->mcr = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
436 clear_bit(TTY_IO_ERROR, &info->tty->flags);
438 * and set the speed of the serial port
440 ctc_tty_change_speed(info);
442 info->flags |= CTC_ASYNC_INITIALIZED;
443 if (!(info->flags & CTC_ASYNC_NETDEV_OPEN))
444 info->netdev->open(info->netdev);
445 info->flags |= CTC_ASYNC_NETDEV_OPEN;
450 ctc_tty_stopdev(unsigned long data)
452 ctc_tty_info *info = (ctc_tty_info *)data;
454 if ((!info) || (!info->netdev) ||
455 (info->flags & CTC_ASYNC_INITIALIZED))
457 info->netdev->stop(info->netdev);
458 info->flags &= ~CTC_ASYNC_NETDEV_OPEN;
462 * This routine will shutdown a serial port; interrupts are disabled, and
463 * DTR is dropped if the hangup on close termio flag is on.
466 ctc_tty_shutdown(ctc_tty_info * info)
468 DBF_TEXT(trace, 3, __FUNCTION__);
469 if (!(info->flags & CTC_ASYNC_INITIALIZED))
471 #ifdef CTC_DEBUG_MODEM_OPEN
472 printk(KERN_DEBUG "Shutting down %s%d ....\n", CTC_TTY_NAME, info->line);
474 info->msr &= ~UART_MSR_RI;
475 if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
476 info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
478 set_bit(TTY_IO_ERROR, &info->tty->flags);
479 mod_timer(&info->stoptimer, jiffies + (10 * HZ));
480 skb_queue_purge(&info->tx_queue);
481 skb_queue_purge(&info->rx_queue);
482 info->flags &= ~CTC_ASYNC_INITIALIZED;
485 /* ctc_tty_write() is the main send-routine. It is called from the upper
486 * levels within the kernel to perform sending data. Depending on the
487 * online-flag it either directs output to the at-command-interpreter or
488 * to the lower level. Additional tasks done here:
489 * - If online, check for escape-sequence (+++)
490 * - If sending audio-data, call ctc_tty_DLEdown() to parse DLE-codes.
491 * - If receiving audio-data, call ctc_tty_end_vrx() to abort if needed.
492 * - If dialing, abort dial.
495 ctc_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int count)
499 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
501 DBF_TEXT(trace, 5, __FUNCTION__);
502 if (ctc_tty_shuttingdown)
504 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_write"))
513 down(&info->write_sem);
518 c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE;
522 skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
524 skb = dev_alloc_skb(skb_res + c);
527 "ctc_tty: Out of memory in %s%d write\n",
528 CTC_TTY_NAME, info->line);
531 skb_reserve(skb, skb_res);
533 copy_from_user(skb_put(skb, c),
534 (const u_char __user *)buf, c);
536 memcpy(skb_put(skb, c), buf, c);
537 skb_queue_tail(&info->tx_queue, skb);
542 if (skb_queue_len(&info->tx_queue)) {
543 info->lsr &= ~UART_LSR_TEMT;
544 tasklet_schedule(&info->tasklet);
547 up(&info->write_sem);
549 DBF_TEXT(trace, 6, __FUNCTION__);
554 ctc_tty_write_room(struct tty_struct *tty)
556 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
558 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_write_room"))
560 return CTC_TTY_XMIT_SIZE;
564 ctc_tty_chars_in_buffer(struct tty_struct *tty)
566 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
568 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_chars_in_buffer"))
574 ctc_tty_flush_buffer(struct tty_struct *tty)
579 DBF_TEXT(trace, 4, __FUNCTION__);
582 spin_lock_irqsave(&ctc_tty_lock, flags);
583 info = (ctc_tty_info *) tty->driver_data;
584 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_flush_buffer")) {
585 spin_unlock_irqrestore(&ctc_tty_lock, flags);
588 skb_queue_purge(&info->tx_queue);
589 info->lsr |= UART_LSR_TEMT;
590 spin_unlock_irqrestore(&ctc_tty_lock, flags);
591 wake_up_interruptible(&tty->write_wait);
592 if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
593 tty->ldisc.write_wakeup)
594 (tty->ldisc.write_wakeup) (tty);
596 DBF_TEXT_(trace, 2, "ex: %s ", __FUNCTION__);
601 ctc_tty_flush_chars(struct tty_struct *tty)
603 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
605 DBF_TEXT(trace, 4, __FUNCTION__);
606 if (ctc_tty_shuttingdown)
608 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_flush_chars"))
610 if (tty->stopped || tty->hw_stopped || (!skb_queue_len(&info->tx_queue)))
612 tasklet_schedule(&info->tasklet);
616 * ------------------------------------------------------------
619 * This routine is called by the upper-layer tty layer to signal that
620 * incoming characters should be throttled.
621 * ------------------------------------------------------------
624 ctc_tty_throttle(struct tty_struct *tty)
626 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
628 DBF_TEXT(trace, 4, __FUNCTION__);
629 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_throttle"))
631 info->mcr &= ~UART_MCR_RTS;
633 ctc_tty_inject(info, STOP_CHAR(tty));
634 ctc_tty_transmit_status(info);
638 ctc_tty_unthrottle(struct tty_struct *tty)
640 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
642 DBF_TEXT(trace, 4, __FUNCTION__);
643 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_unthrottle"))
645 info->mcr |= UART_MCR_RTS;
647 ctc_tty_inject(info, START_CHAR(tty));
648 ctc_tty_transmit_status(info);
652 * ------------------------------------------------------------
653 * ctc_tty_ioctl() and friends
654 * ------------------------------------------------------------
658 * ctc_tty_get_lsr_info - get line status register info
660 * Purpose: Let user call ioctl() to get info when the UART physically
661 * is emptied. On bus types like RS485, the transmitter must
662 * release the bus after transmitting. This must be done when
663 * the transmit shift register is empty, not be done when the
664 * transmit holding register is empty. This functionality
665 * allows RS485 driver to be written in user space.
668 ctc_tty_get_lsr_info(ctc_tty_info * info, uint __user *value)
674 DBF_TEXT(trace, 4, __FUNCTION__);
675 spin_lock_irqsave(&ctc_tty_lock, flags);
677 spin_unlock_irqrestore(&ctc_tty_lock, flags);
678 result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
679 put_user(result, value);
684 static int ctc_tty_tiocmget(struct tty_struct *tty, struct file *file)
686 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
692 DBF_TEXT(trace, 4, __FUNCTION__);
693 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl"))
695 if (tty->flags & (1 << TTY_IO_ERROR))
699 spin_lock_irqsave(&ctc_tty_lock, flags);
701 spin_unlock_irqrestore(&ctc_tty_lock, flags);
702 result = ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
703 | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
704 | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
705 | ((status & UART_MSR_RI) ? TIOCM_RNG : 0)
706 | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0)
707 | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
712 ctc_tty_tiocmset(struct tty_struct *tty, struct file *file,
713 unsigned int set, unsigned int clear)
715 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
717 DBF_TEXT(trace, 4, __FUNCTION__);
718 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl"))
720 if (tty->flags & (1 << TTY_IO_ERROR))
724 info->mcr |= UART_MCR_RTS;
726 info->mcr |= UART_MCR_DTR;
728 if (clear & TIOCM_RTS)
729 info->mcr &= ~UART_MCR_RTS;
730 if (clear & TIOCM_DTR)
731 info->mcr &= ~UART_MCR_DTR;
733 if ((set | clear) & (TIOCM_RTS|TIOCM_DTR))
734 ctc_tty_transmit_status(info);
739 ctc_tty_ioctl(struct tty_struct *tty, struct file *file,
742 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
746 DBF_TEXT(trace, 4, __FUNCTION__);
747 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl"))
749 if (tty->flags & (1 << TTY_IO_ERROR))
752 case TCSBRK: /* SVID version: non-zero arg --> no break */
753 #ifdef CTC_DEBUG_MODEM_IOCTL
754 printk(KERN_DEBUG "%s%d ioctl TCSBRK\n", CTC_TTY_NAME, info->line);
756 retval = tty_check_change(tty);
759 tty_wait_until_sent(tty, 0);
761 case TCSBRKP: /* support for POSIX tcsendbreak() */
762 #ifdef CTC_DEBUG_MODEM_IOCTL
763 printk(KERN_DEBUG "%s%d ioctl TCSBRKP\n", CTC_TTY_NAME, info->line);
765 retval = tty_check_change(tty);
768 tty_wait_until_sent(tty, 0);
771 #ifdef CTC_DEBUG_MODEM_IOCTL
772 printk(KERN_DEBUG "%s%d ioctl TIOCGSOFTCAR\n", CTC_TTY_NAME,
775 error = put_user(C_CLOCAL(tty) ? 1 : 0, (ulong __user *) arg);
778 #ifdef CTC_DEBUG_MODEM_IOCTL
779 printk(KERN_DEBUG "%s%d ioctl TIOCSSOFTCAR\n", CTC_TTY_NAME,
782 error = get_user(arg, (ulong __user *) arg);
785 tty->termios->c_cflag =
786 ((tty->termios->c_cflag & ~CLOCAL) |
789 case TIOCSERGETLSR: /* Get line status register */
790 #ifdef CTC_DEBUG_MODEM_IOCTL
791 printk(KERN_DEBUG "%s%d ioctl TIOCSERGETLSR\n", CTC_TTY_NAME,
794 error = verify_area(VERIFY_WRITE, (void __user *) arg, sizeof(uint));
798 return ctc_tty_get_lsr_info(info, (uint __user *) arg);
800 #ifdef CTC_DEBUG_MODEM_IOCTL
801 printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on %s%d\n", cmd,
802 CTC_TTY_NAME, info->line);
810 ctc_tty_set_termios(struct tty_struct *tty, struct termios *old_termios)
812 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
813 unsigned int cflag = tty->termios->c_cflag;
815 DBF_TEXT(trace, 4, __FUNCTION__);
816 ctc_tty_change_speed(info);
818 /* Handle transition to B0 */
819 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) {
820 info->mcr &= ~(UART_MCR_DTR|UART_MCR_RTS);
821 ctc_tty_transmit_status(info);
824 /* Handle transition from B0 to other */
825 if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
826 info->mcr |= UART_MCR_DTR;
827 if (!(tty->termios->c_cflag & CRTSCTS) ||
828 !test_bit(TTY_THROTTLED, &tty->flags)) {
829 info->mcr |= UART_MCR_RTS;
831 ctc_tty_transmit_status(info);
834 /* Handle turning off CRTSCTS */
835 if ((old_termios->c_cflag & CRTSCTS) &&
836 !(tty->termios->c_cflag & CRTSCTS))
841 * ------------------------------------------------------------
842 * ctc_tty_open() and friends
843 * ------------------------------------------------------------
846 ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info *info)
848 DECLARE_WAITQUEUE(wait, NULL);
853 DBF_TEXT(trace, 4, __FUNCTION__);
855 * If the device is in the middle of being closed, then block
856 * until it's done, and then try again.
858 if (tty_hung_up_p(filp) ||
859 (info->flags & CTC_ASYNC_CLOSING)) {
860 if (info->flags & CTC_ASYNC_CLOSING)
861 wait_event(info->close_wait,
862 !(info->flags & CTC_ASYNC_CLOSING));
863 #ifdef MODEM_DO_RESTART
864 if (info->flags & CTC_ASYNC_HUP_NOTIFY)
873 * If non-blocking mode is set, then make the check up front
876 if ((filp->f_flags & O_NONBLOCK) ||
877 (tty->flags & (1 << TTY_IO_ERROR))) {
878 info->flags |= CTC_ASYNC_NORMAL_ACTIVE;
881 if (tty->termios->c_cflag & CLOCAL)
884 * Block waiting for the carrier detect and the line to become
885 * free (i.e., not in use by the callout). While we are in
886 * this loop, info->count is dropped by one, so that
887 * ctc_tty_close() knows when to free things. We restore it upon
888 * exit, either normal or abnormal.
891 add_wait_queue(&info->open_wait, &wait);
892 #ifdef CTC_DEBUG_MODEM_OPEN
893 printk(KERN_DEBUG "ctc_tty_block_til_ready before block: %s%d, count = %d\n",
894 CTC_TTY_NAME, info->line, info->count);
896 spin_lock_irqsave(&ctc_tty_lock, flags);
897 if (!(tty_hung_up_p(filp)))
899 spin_unlock_irqrestore(&ctc_tty_lock, flags);
900 info->blocked_open++;
902 set_current_state(TASK_INTERRUPTIBLE);
903 if (tty_hung_up_p(filp) ||
904 !(info->flags & CTC_ASYNC_INITIALIZED)) {
905 #ifdef MODEM_DO_RESTART
906 if (info->flags & CTC_ASYNC_HUP_NOTIFY)
909 retval = -ERESTARTSYS;
915 if (!(info->flags & CTC_ASYNC_CLOSING) &&
916 (do_clocal || (info->msr & UART_MSR_DCD))) {
919 if (signal_pending(current)) {
920 retval = -ERESTARTSYS;
923 #ifdef CTC_DEBUG_MODEM_OPEN
924 printk(KERN_DEBUG "ctc_tty_block_til_ready blocking: %s%d, count = %d\n",
925 CTC_TTY_NAME, info->line, info->count);
929 current->state = TASK_RUNNING;
930 remove_wait_queue(&info->open_wait, &wait);
931 if (!tty_hung_up_p(filp))
933 info->blocked_open--;
934 #ifdef CTC_DEBUG_MODEM_OPEN
935 printk(KERN_DEBUG "ctc_tty_block_til_ready after blocking: %s%d, count = %d\n",
936 CTC_TTY_NAME, info->line, info->count);
940 info->flags |= CTC_ASYNC_NORMAL_ACTIVE;
945 * This routine is called whenever a serial port is opened. It
946 * enables interrupts for a serial port, linking in its async structure into
947 * the IRQ chain. It also performs the serial-specific
948 * initialization for the tty structure.
951 ctc_tty_open(struct tty_struct *tty, struct file *filp)
954 unsigned long saveflags;
958 DBF_TEXT(trace, 3, __FUNCTION__);
960 if (line < 0 || line > CTC_TTY_MAX_DEVICES)
962 info = &driver->info[line];
963 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_open"))
967 #ifdef CTC_DEBUG_MODEM_OPEN
968 printk(KERN_DEBUG "ctc_tty_open %s, count = %d\n", tty->name,
971 spin_lock_irqsave(&ctc_tty_lock, saveflags);
973 tty->driver_data = info;
975 spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
977 * Start up serial port
979 retval = ctc_tty_startup(info);
981 #ifdef CTC_DEBUG_MODEM_OPEN
982 printk(KERN_DEBUG "ctc_tty_open return after startup\n");
986 retval = ctc_tty_block_til_ready(tty, filp, info);
988 #ifdef CTC_DEBUG_MODEM_OPEN
989 printk(KERN_DEBUG "ctc_tty_open return after ctc_tty_block_til_ready \n");
993 #ifdef CTC_DEBUG_MODEM_OPEN
994 printk(KERN_DEBUG "ctc_tty_open %s successful...\n", tty->name);
1000 ctc_tty_close(struct tty_struct *tty, struct file *filp)
1002 ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
1005 DBF_TEXT(trace, 3, __FUNCTION__);
1006 if (!info || ctc_tty_paranoia_check(info, tty->name, "ctc_tty_close"))
1008 spin_lock_irqsave(&ctc_tty_lock, flags);
1009 if (tty_hung_up_p(filp)) {
1010 spin_unlock_irqrestore(&ctc_tty_lock, flags);
1011 #ifdef CTC_DEBUG_MODEM_OPEN
1012 printk(KERN_DEBUG "ctc_tty_close return after tty_hung_up_p\n");
1016 if ((tty->count == 1) && (info->count != 1)) {
1018 * Uh, oh. tty->count is 1, which means that the tty
1019 * structure will be freed. Info->count should always
1020 * be one in these conditions. If it's greater than
1021 * one, we've got real problems, since it means the
1022 * serial port won't be shutdown.
1024 printk(KERN_ERR "ctc_tty_close: bad port count; tty->count is 1, "
1025 "info->count is %d\n", info->count);
1028 if (--info->count < 0) {
1029 printk(KERN_ERR "ctc_tty_close: bad port count for %s%d: %d\n",
1030 CTC_TTY_NAME, info->line, info->count);
1034 local_irq_restore(flags);
1035 #ifdef CTC_DEBUG_MODEM_OPEN
1036 printk(KERN_DEBUG "ctc_tty_close after info->count != 0\n");
1040 info->flags |= CTC_ASYNC_CLOSING;
1043 * At this point we stop accepting input. To do this, we
1044 * disable the receive line status interrupts, and tell the
1045 * interrupt driver to stop checking the data ready bit in the
1046 * line status register.
1048 if (info->flags & CTC_ASYNC_INITIALIZED) {
1049 tty_wait_until_sent(tty, 30*HZ); /* 30 seconds timeout */
1051 * Before we drop DTR, make sure the UART transmitter
1052 * has completely drained; this is especially
1053 * important if there is a transmit FIFO!
1055 timeout = jiffies + HZ;
1056 while (!(info->lsr & UART_LSR_TEMT)) {
1057 spin_unlock_irqrestore(&ctc_tty_lock, flags);
1059 spin_lock_irqsave(&ctc_tty_lock, flags);
1060 if (time_after(jiffies,timeout))
1064 ctc_tty_shutdown(info);
1065 if (tty->driver->flush_buffer) {
1066 skb_queue_purge(&info->tx_queue);
1067 info->lsr |= UART_LSR_TEMT;
1069 if (tty->ldisc.flush_buffer)
1070 tty->ldisc.flush_buffer(tty);
1073 if (info->blocked_open) {
1074 set_current_state(TASK_INTERRUPTIBLE);
1075 schedule_timeout(HZ/2);
1076 wake_up_interruptible(&info->open_wait);
1078 info->flags &= ~(CTC_ASYNC_NORMAL_ACTIVE | CTC_ASYNC_CLOSING);
1079 wake_up_interruptible(&info->close_wait);
1080 spin_unlock_irqrestore(&ctc_tty_lock, flags);
1081 #ifdef CTC_DEBUG_MODEM_OPEN
1082 printk(KERN_DEBUG "ctc_tty_close normal exit\n");
1087 * ctc_tty_hangup() --- called by tty_hangup() when a hangup is signaled.
1090 ctc_tty_hangup(struct tty_struct *tty)
1092 ctc_tty_info *info = (ctc_tty_info *)tty->driver_data;
1093 unsigned long saveflags;
1094 DBF_TEXT(trace, 3, __FUNCTION__);
1095 if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_hangup"))
1097 ctc_tty_shutdown(info);
1099 info->flags &= ~CTC_ASYNC_NORMAL_ACTIVE;
1100 spin_lock_irqsave(&ctc_tty_lock, saveflags);
1102 spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
1103 wake_up_interruptible(&info->open_wait);
1108 * For all online tty's, try sending data to
1112 ctc_tty_task(unsigned long arg)
1114 ctc_tty_info *info = (void *)arg;
1115 unsigned long saveflags;
1118 DBF_TEXT(trace, 3, __FUNCTION__);
1119 spin_lock_irqsave(&ctc_tty_lock, saveflags);
1120 if ((!ctc_tty_shuttingdown) && info) {
1121 again = ctc_tty_tint(info);
1123 info->lsr |= UART_LSR_TEMT;
1124 again |= ctc_tty_readmodem(info);
1126 tasklet_schedule(&info->tasklet);
1129 spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
1132 static struct tty_operations ctc_ops = {
1133 .open = ctc_tty_open,
1134 .close = ctc_tty_close,
1135 .write = ctc_tty_write,
1136 .flush_chars = ctc_tty_flush_chars,
1137 .write_room = ctc_tty_write_room,
1138 .chars_in_buffer = ctc_tty_chars_in_buffer,
1139 .flush_buffer = ctc_tty_flush_buffer,
1140 .ioctl = ctc_tty_ioctl,
1141 .throttle = ctc_tty_throttle,
1142 .unthrottle = ctc_tty_unthrottle,
1143 .set_termios = ctc_tty_set_termios,
1144 .hangup = ctc_tty_hangup,
1145 .tiocmget = ctc_tty_tiocmget,
1146 .tiocmset = ctc_tty_tiocmset,
1154 struct tty_driver *device;
1156 DBF_TEXT(trace, 2, __FUNCTION__);
1157 driver = kmalloc(sizeof(ctc_tty_driver), GFP_KERNEL);
1158 if (driver == NULL) {
1159 printk(KERN_WARNING "Out of memory in ctc_tty_modem_init\n");
1162 memset(driver, 0, sizeof(ctc_tty_driver));
1163 device = alloc_tty_driver(CTC_TTY_MAX_DEVICES);
1166 printk(KERN_WARNING "Out of memory in ctc_tty_modem_init\n");
1170 device->devfs_name = "ctc/" CTC_TTY_NAME;
1171 device->name = CTC_TTY_NAME;
1172 device->major = CTC_TTY_MAJOR;
1173 device->minor_start = 0;
1174 device->type = TTY_DRIVER_TYPE_SERIAL;
1175 device->subtype = SERIAL_TYPE_NORMAL;
1176 device->init_termios = tty_std_termios;
1177 device->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1178 device->flags = TTY_DRIVER_REAL_RAW;
1179 device->driver_name = "ctc_tty",
1180 tty_set_operations(device, &ctc_ops);
1181 if (tty_register_driver(device)) {
1182 printk(KERN_WARNING "ctc_tty: Couldn't register serial-device\n");
1183 put_tty_driver(device);
1187 driver->ctc_tty_device = device;
1188 for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) {
1189 info = &driver->info[i];
1190 init_MUTEX(&info->write_sem);
1191 tasklet_init(&info->tasklet, ctc_tty_task,
1192 (unsigned long) info);
1193 info->magic = CTC_ASYNC_MAGIC;
1197 info->blocked_open = 0;
1198 init_waitqueue_head(&info->open_wait);
1199 init_waitqueue_head(&info->close_wait);
1200 skb_queue_head_init(&info->tx_queue);
1201 skb_queue_head_init(&info->rx_queue);
1202 init_timer(&info->stoptimer);
1203 info->stoptimer.function = ctc_tty_stopdev;
1204 info->stoptimer.data = (unsigned long)info;
1205 info->mcr = UART_MCR_RTS;
1211 ctc_tty_register_netdev(struct net_device *dev) {
1216 DBF_TEXT(trace, 2, __FUNCTION__);
1217 if ((!dev) || (!dev->name)) {
1219 "ctc_tty_register_netdev called "
1220 "with NULL dev or NULL dev-name\n");
1225 * If the name is a format string the caller wants us to
1226 * do a name allocation : format string must end with %d
1228 if (strchr(dev->name, '%'))
1230 int err = dev_alloc_name(dev, dev->name); // dev->name is changed by this
1232 printk(KERN_DEBUG "dev_alloc returned error %d\n", err);
1238 for (p = dev->name; p && ((*p < '0') || (*p > '9')); p++);
1239 ttynum = simple_strtoul(p, &err, 0);
1240 if ((ttynum < 0) || (ttynum >= CTC_TTY_MAX_DEVICES) ||
1243 "ctc_tty_register_netdev called "
1244 "with number in name '%s'\n", dev->name);
1247 if (driver->info[ttynum].netdev) {
1249 "ctc_tty_register_netdev called "
1250 "for already registered device '%s'\n",
1254 driver->info[ttynum].netdev = dev;
1259 ctc_tty_unregister_netdev(struct net_device *dev) {
1261 unsigned long saveflags;
1262 ctc_tty_info *info = NULL;
1264 DBF_TEXT(trace, 2, __FUNCTION__);
1265 spin_lock_irqsave(&ctc_tty_lock, saveflags);
1266 for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
1267 if (driver->info[i].netdev == dev) {
1268 info = &driver->info[i];
1272 info->netdev = NULL;
1273 skb_queue_purge(&info->tx_queue);
1274 skb_queue_purge(&info->rx_queue);
1276 spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
1280 ctc_tty_cleanup(void) {
1281 unsigned long saveflags;
1283 DBF_TEXT(trace, 2, __FUNCTION__);
1284 spin_lock_irqsave(&ctc_tty_lock, saveflags);
1285 ctc_tty_shuttingdown = 1;
1286 spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
1287 tty_unregister_driver(driver->ctc_tty_device);
1288 put_tty_driver(driver->ctc_tty_device);