aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/amiserial.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/amiserial.c')
-rw-r--r--drivers/tty/amiserial.c82
1 files changed, 38 insertions, 44 deletions
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index d5fac8626988..8556ca022dbc 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -45,7 +45,7 @@
45 45
46#if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) 46#if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT)
47#define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ 47#define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \
48 tty->name, (info->flags), serial_driver->refcount,info->count,tty->count,s) 48 tty->name, (info->state->flags), serial_driver->refcount,info->count,tty->count,s)
49#else 49#else
50#define DBG_CNT(s) 50#define DBG_CNT(s)
51#endif 51#endif
@@ -297,7 +297,7 @@ static void receive_chars(struct async_struct *info)
297 printk("handling break...."); 297 printk("handling break....");
298#endif 298#endif
299 flag = TTY_BREAK; 299 flag = TTY_BREAK;
300 if (info->flags & ASYNC_SAK) 300 if (info->state->flags & ASYNC_SAK)
301 do_SAK(tty); 301 do_SAK(tty);
302 } else if (status & UART_LSR_PE) 302 } else if (status & UART_LSR_PE)
303 flag = TTY_PARITY; 303 flag = TTY_PARITY;
@@ -378,7 +378,7 @@ static void check_modem_status(struct async_struct *info)
378 if (dstatus & SER_DCD) { 378 if (dstatus & SER_DCD) {
379 icount->dcd++; 379 icount->dcd++;
380#ifdef CONFIG_HARD_PPS 380#ifdef CONFIG_HARD_PPS
381 if ((info->flags & ASYNC_HARDPPS_CD) && 381 if ((info->state->flags & ASYNC_HARDPPS_CD) &&
382 !(status & SER_DCD)) 382 !(status & SER_DCD))
383 hardpps(); 383 hardpps();
384#endif 384#endif
@@ -388,7 +388,7 @@ static void check_modem_status(struct async_struct *info)
388 wake_up_interruptible(&info->delta_msr_wait); 388 wake_up_interruptible(&info->delta_msr_wait);
389 } 389 }
390 390
391 if ((info->flags & ASYNC_CHECK_CD) && (dstatus & SER_DCD)) { 391 if ((info->state->flags & ASYNC_CHECK_CD) && (dstatus & SER_DCD)) {
392#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR)) 392#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
393 printk("ttyS%d CD now %s...", info->line, 393 printk("ttyS%d CD now %s...", info->line,
394 (!(status & SER_DCD)) ? "on" : "off"); 394 (!(status & SER_DCD)) ? "on" : "off");
@@ -403,7 +403,7 @@ static void check_modem_status(struct async_struct *info)
403 tty_hangup(info->tty); 403 tty_hangup(info->tty);
404 } 404 }
405 } 405 }
406 if (info->flags & ASYNC_CTS_FLOW) { 406 if (info->state->flags & ASYNC_CTS_FLOW) {
407 if (info->tty->hw_stopped) { 407 if (info->tty->hw_stopped) {
408 if (!(status & SER_CTS)) { 408 if (!(status & SER_CTS)) {
409#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW)) 409#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
@@ -516,7 +516,7 @@ static int startup(struct async_struct * info)
516 516
517 local_irq_save(flags); 517 local_irq_save(flags);
518 518
519 if (info->flags & ASYNC_INITIALIZED) { 519 if (info->state->flags & ASYNC_INITIALIZED) {
520 free_page(page); 520 free_page(page);
521 goto errout; 521 goto errout;
522 } 522 }
@@ -569,13 +569,13 @@ static int startup(struct async_struct * info)
569 * Set up the tty->alt_speed kludge 569 * Set up the tty->alt_speed kludge
570 */ 570 */
571 if (info->tty) { 571 if (info->tty) {
572 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) 572 if ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
573 info->tty->alt_speed = 57600; 573 info->tty->alt_speed = 57600;
574 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) 574 if ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
575 info->tty->alt_speed = 115200; 575 info->tty->alt_speed = 115200;
576 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) 576 if ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
577 info->tty->alt_speed = 230400; 577 info->tty->alt_speed = 230400;
578 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) 578 if ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
579 info->tty->alt_speed = 460800; 579 info->tty->alt_speed = 460800;
580 } 580 }
581 581
@@ -584,7 +584,7 @@ static int startup(struct async_struct * info)
584 */ 584 */
585 change_speed(info, NULL); 585 change_speed(info, NULL);
586 586
587 info->flags |= ASYNC_INITIALIZED; 587 info->state->flags |= ASYNC_INITIALIZED;
588 local_irq_restore(flags); 588 local_irq_restore(flags);
589 return 0; 589 return 0;
590 590
@@ -602,7 +602,7 @@ static void shutdown(struct async_struct * info)
602 unsigned long flags; 602 unsigned long flags;
603 struct serial_state *state; 603 struct serial_state *state;
604 604
605 if (!(info->flags & ASYNC_INITIALIZED)) 605 if (!(info->state->flags & ASYNC_INITIALIZED))
606 return; 606 return;
607 607
608 state = info->state; 608 state = info->state;
@@ -646,7 +646,7 @@ static void shutdown(struct async_struct * info)
646 if (info->tty) 646 if (info->tty)
647 set_bit(TTY_IO_ERROR, &info->tty->flags); 647 set_bit(TTY_IO_ERROR, &info->tty->flags);
648 648
649 info->flags &= ~ASYNC_INITIALIZED; 649 info->state->flags &= ~ASYNC_INITIALIZED;
650 local_irq_restore(flags); 650 local_irq_restore(flags);
651} 651}
652 652
@@ -691,7 +691,7 @@ static void change_speed(struct async_struct *info,
691 baud = 9600; /* B0 transition handled in rs_set_termios */ 691 baud = 9600; /* B0 transition handled in rs_set_termios */
692 baud_base = info->state->baud_base; 692 baud_base = info->state->baud_base;
693 if (baud == 38400 && 693 if (baud == 38400 &&
694 ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) 694 ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
695 quot = info->state->custom_divisor; 695 quot = info->state->custom_divisor;
696 else { 696 else {
697 if (baud == 134) 697 if (baud == 134)
@@ -709,7 +709,7 @@ static void change_speed(struct async_struct *info,
709 if (!baud) 709 if (!baud)
710 baud = 9600; 710 baud = 9600;
711 if (baud == 38400 && 711 if (baud == 38400 &&
712 ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) 712 ((info->state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
713 quot = info->state->custom_divisor; 713 quot = info->state->custom_divisor;
714 else { 714 else {
715 if (baud == 134) 715 if (baud == 134)
@@ -728,17 +728,17 @@ static void change_speed(struct async_struct *info,
728 728
729 /* CTS flow control flag and modem status interrupts */ 729 /* CTS flow control flag and modem status interrupts */
730 info->IER &= ~UART_IER_MSI; 730 info->IER &= ~UART_IER_MSI;
731 if (info->flags & ASYNC_HARDPPS_CD) 731 if (info->state->flags & ASYNC_HARDPPS_CD)
732 info->IER |= UART_IER_MSI; 732 info->IER |= UART_IER_MSI;
733 if (cflag & CRTSCTS) { 733 if (cflag & CRTSCTS) {
734 info->flags |= ASYNC_CTS_FLOW; 734 info->state->flags |= ASYNC_CTS_FLOW;
735 info->IER |= UART_IER_MSI; 735 info->IER |= UART_IER_MSI;
736 } else 736 } else
737 info->flags &= ~ASYNC_CTS_FLOW; 737 info->state->flags &= ~ASYNC_CTS_FLOW;
738 if (cflag & CLOCAL) 738 if (cflag & CLOCAL)
739 info->flags &= ~ASYNC_CHECK_CD; 739 info->state->flags &= ~ASYNC_CHECK_CD;
740 else { 740 else {
741 info->flags |= ASYNC_CHECK_CD; 741 info->state->flags |= ASYNC_CHECK_CD;
742 info->IER |= UART_IER_MSI; 742 info->IER |= UART_IER_MSI;
743 } 743 }
744 /* TBD: 744 /* TBD:
@@ -1080,8 +1080,6 @@ static int set_serial_info(struct async_struct * info,
1080 return -EPERM; 1080 return -EPERM;
1081 state->flags = ((state->flags & ~ASYNC_USR_MASK) | 1081 state->flags = ((state->flags & ~ASYNC_USR_MASK) |
1082 (new_serial.flags & ASYNC_USR_MASK)); 1082 (new_serial.flags & ASYNC_USR_MASK));
1083 info->flags = ((info->flags & ~ASYNC_USR_MASK) |
1084 (new_serial.flags & ASYNC_USR_MASK));
1085 state->custom_divisor = new_serial.custom_divisor; 1083 state->custom_divisor = new_serial.custom_divisor;
1086 goto check_and_exit; 1084 goto check_and_exit;
1087 } 1085 }
@@ -1099,15 +1097,13 @@ static int set_serial_info(struct async_struct * info,
1099 state->baud_base = new_serial.baud_base; 1097 state->baud_base = new_serial.baud_base;
1100 state->flags = ((state->flags & ~ASYNC_FLAGS) | 1098 state->flags = ((state->flags & ~ASYNC_FLAGS) |
1101 (new_serial.flags & ASYNC_FLAGS)); 1099 (new_serial.flags & ASYNC_FLAGS));
1102 info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
1103 (info->flags & ASYNC_INTERNAL_FLAGS));
1104 state->custom_divisor = new_serial.custom_divisor; 1100 state->custom_divisor = new_serial.custom_divisor;
1105 state->close_delay = new_serial.close_delay * HZ/100; 1101 state->close_delay = new_serial.close_delay * HZ/100;
1106 state->closing_wait = new_serial.closing_wait * HZ/100; 1102 state->closing_wait = new_serial.closing_wait * HZ/100;
1107 info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1103 info->tty->low_latency = (state->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1108 1104
1109check_and_exit: 1105check_and_exit:
1110 if (info->flags & ASYNC_INITIALIZED) { 1106 if (state->flags & ASYNC_INITIALIZED) {
1111 if (((old_state.flags & ASYNC_SPD_MASK) != 1107 if (((old_state.flags & ASYNC_SPD_MASK) !=
1112 (state->flags & ASYNC_SPD_MASK)) || 1108 (state->flags & ASYNC_SPD_MASK)) ||
1113 (old_state.custom_divisor != state->custom_divisor)) { 1109 (old_state.custom_divisor != state->custom_divisor)) {
@@ -1437,7 +1433,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1437 local_irq_restore(flags); 1433 local_irq_restore(flags);
1438 return; 1434 return;
1439 } 1435 }
1440 info->flags |= ASYNC_CLOSING; 1436 state->flags |= ASYNC_CLOSING;
1441 /* 1437 /*
1442 * Now we wait for the transmit buffer to clear; and we notify 1438 * Now we wait for the transmit buffer to clear; and we notify
1443 * the line discipline to only process XON/XOFF characters. 1439 * the line discipline to only process XON/XOFF characters.
@@ -1452,7 +1448,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1452 * line status register. 1448 * line status register.
1453 */ 1449 */
1454 info->read_status_mask &= ~UART_LSR_DR; 1450 info->read_status_mask &= ~UART_LSR_DR;
1455 if (info->flags & ASYNC_INITIALIZED) { 1451 if (state->flags & ASYNC_INITIALIZED) {
1456 /* disable receive interrupts */ 1452 /* disable receive interrupts */
1457 custom.intena = IF_RBF; 1453 custom.intena = IF_RBF;
1458 mb(); 1454 mb();
@@ -1479,7 +1475,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1479 } 1475 }
1480 wake_up_interruptible(&info->open_wait); 1476 wake_up_interruptible(&info->open_wait);
1481 } 1477 }
1482 info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); 1478 state->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
1483 wake_up_interruptible(&info->close_wait); 1479 wake_up_interruptible(&info->close_wait);
1484 local_irq_restore(flags); 1480 local_irq_restore(flags);
1485} 1481}
@@ -1563,7 +1559,7 @@ static void rs_hangup(struct tty_struct *tty)
1563 rs_flush_buffer(tty); 1559 rs_flush_buffer(tty);
1564 shutdown(info); 1560 shutdown(info);
1565 state->count = 0; 1561 state->count = 0;
1566 info->flags &= ~ASYNC_NORMAL_ACTIVE; 1562 state->flags &= ~ASYNC_NORMAL_ACTIVE;
1567 info->tty = NULL; 1563 info->tty = NULL;
1568 wake_up_interruptible(&info->open_wait); 1564 wake_up_interruptible(&info->open_wait);
1569} 1565}
@@ -1591,11 +1587,11 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1591 * until it's done, and then try again. 1587 * until it's done, and then try again.
1592 */ 1588 */
1593 if (tty_hung_up_p(filp) || 1589 if (tty_hung_up_p(filp) ||
1594 (info->flags & ASYNC_CLOSING)) { 1590 (state->flags & ASYNC_CLOSING)) {
1595 if (info->flags & ASYNC_CLOSING) 1591 if (state->flags & ASYNC_CLOSING)
1596 interruptible_sleep_on(&info->close_wait); 1592 interruptible_sleep_on(&info->close_wait);
1597#ifdef SERIAL_DO_RESTART 1593#ifdef SERIAL_DO_RESTART
1598 return ((info->flags & ASYNC_HUP_NOTIFY) ? 1594 return ((state->flags & ASYNC_HUP_NOTIFY) ?
1599 -EAGAIN : -ERESTARTSYS); 1595 -EAGAIN : -ERESTARTSYS);
1600#else 1596#else
1601 return -EAGAIN; 1597 return -EAGAIN;
@@ -1608,7 +1604,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1608 */ 1604 */
1609 if ((filp->f_flags & O_NONBLOCK) || 1605 if ((filp->f_flags & O_NONBLOCK) ||
1610 (tty->flags & (1 << TTY_IO_ERROR))) { 1606 (tty->flags & (1 << TTY_IO_ERROR))) {
1611 info->flags |= ASYNC_NORMAL_ACTIVE; 1607 state->flags |= ASYNC_NORMAL_ACTIVE;
1612 return 0; 1608 return 0;
1613 } 1609 }
1614 1610
@@ -1642,9 +1638,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1642 local_irq_restore(flags); 1638 local_irq_restore(flags);
1643 set_current_state(TASK_INTERRUPTIBLE); 1639 set_current_state(TASK_INTERRUPTIBLE);
1644 if (tty_hung_up_p(filp) || 1640 if (tty_hung_up_p(filp) ||
1645 !(info->flags & ASYNC_INITIALIZED)) { 1641 !(state->flags & ASYNC_INITIALIZED)) {
1646#ifdef SERIAL_DO_RESTART 1642#ifdef SERIAL_DO_RESTART
1647 if (info->flags & ASYNC_HUP_NOTIFY) 1643 if (state->flags & ASYNC_HUP_NOTIFY)
1648 retval = -EAGAIN; 1644 retval = -EAGAIN;
1649 else 1645 else
1650 retval = -ERESTARTSYS; 1646 retval = -ERESTARTSYS;
@@ -1653,7 +1649,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1653#endif 1649#endif
1654 break; 1650 break;
1655 } 1651 }
1656 if (!(info->flags & ASYNC_CLOSING) && 1652 if (!(state->flags & ASYNC_CLOSING) &&
1657 (do_clocal || (!(ciab.pra & SER_DCD)) )) 1653 (do_clocal || (!(ciab.pra & SER_DCD)) ))
1658 break; 1654 break;
1659 if (signal_pending(current)) { 1655 if (signal_pending(current)) {
@@ -1679,7 +1675,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1679#endif 1675#endif
1680 if (retval) 1676 if (retval)
1681 return retval; 1677 return retval;
1682 info->flags |= ASYNC_NORMAL_ACTIVE; 1678 state->flags |= ASYNC_NORMAL_ACTIVE;
1683 return 0; 1679 return 0;
1684} 1680}
1685 1681
@@ -1705,7 +1701,6 @@ static int get_async_struct(int line, struct async_struct **ret_info)
1705 init_waitqueue_head(&info->delta_msr_wait); 1701 init_waitqueue_head(&info->delta_msr_wait);
1706#endif 1702#endif
1707 info->port = sstate->port; 1703 info->port = sstate->port;
1708 info->flags = sstate->flags;
1709 info->xmit_fifo_size = sstate->xmit_fifo_size; 1704 info->xmit_fifo_size = sstate->xmit_fifo_size;
1710 info->line = line; 1705 info->line = line;
1711 info->state = sstate; 1706 info->state = sstate;
@@ -1741,17 +1736,17 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
1741#ifdef SERIAL_DEBUG_OPEN 1736#ifdef SERIAL_DEBUG_OPEN
1742 printk("rs_open %s, count = %d\n", tty->name, info->state->count); 1737 printk("rs_open %s, count = %d\n", tty->name, info->state->count);
1743#endif 1738#endif
1744 info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1739 info->tty->low_latency = (info->state->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1745 1740
1746 /* 1741 /*
1747 * If the port is the middle of closing, bail out now 1742 * If the port is the middle of closing, bail out now
1748 */ 1743 */
1749 if (tty_hung_up_p(filp) || 1744 if (tty_hung_up_p(filp) ||
1750 (info->flags & ASYNC_CLOSING)) { 1745 (info->state->flags & ASYNC_CLOSING)) {
1751 if (info->flags & ASYNC_CLOSING) 1746 if (info->state->flags & ASYNC_CLOSING)
1752 interruptible_sleep_on(&info->close_wait); 1747 interruptible_sleep_on(&info->close_wait);
1753#ifdef SERIAL_DO_RESTART 1748#ifdef SERIAL_DO_RESTART
1754 return ((info->flags & ASYNC_HUP_NOTIFY) ? 1749 return ((info->state->flags & ASYNC_HUP_NOTIFY) ?
1755 -EAGAIN : -ERESTARTSYS); 1750 -EAGAIN : -ERESTARTSYS);
1756#else 1751#else
1757 return -EAGAIN; 1752 return -EAGAIN;
@@ -1799,7 +1794,6 @@ static inline void line_info(struct seq_file *m, struct serial_state *state)
1799 if (!info) { 1794 if (!info) {
1800 info = &scr_info; /* This is just for serial_{in,out} */ 1795 info = &scr_info; /* This is just for serial_{in,out} */
1801 1796
1802 info->flags = state->flags;
1803 info->quot = 0; 1797 info->quot = 0;
1804 info->tty = NULL; 1798 info->tty = NULL;
1805 } 1799 }