diff options
author | Alan Cox <alan@redhat.com> | 2008-10-13 05:40:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-13 12:51:41 -0400 |
commit | d18a750fe9fa3b6cab882d51f99bba25bb0a006e (patch) | |
tree | 391ccab5a5847782ae48dde60a661486f434ae35 /drivers | |
parent | d450b5a0196b6442cf3f29fc611d9c8daa56b559 (diff) |
stallion: Use krefs
Use tty_port_init and krefs in the stallion drivers to protect us from devices
going away underneath us. As with the other drives some rearranging is done to
pass the tty structure down properly on the user side.
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/Kconfig | 4 | ||||
-rw-r--r-- | drivers/char/istallion.c | 107 | ||||
-rw-r--r-- | drivers/char/stallion.c | 105 |
3 files changed, 123 insertions, 93 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index caff85149b9d..700ff9679457 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -350,7 +350,7 @@ config STALDRV | |||
350 | 350 | ||
351 | config STALLION | 351 | config STALLION |
352 | tristate "Stallion EasyIO or EC8/32 support" | 352 | tristate "Stallion EasyIO or EC8/32 support" |
353 | depends on STALDRV && BROKEN_ON_SMP && (ISA || EISA || PCI) | 353 | depends on STALDRV && (ISA || EISA || PCI) |
354 | help | 354 | help |
355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion | 355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion |
356 | card, then this is for you; say Y. Make sure to read | 356 | card, then this is for you; say Y. Make sure to read |
@@ -361,7 +361,7 @@ config STALLION | |||
361 | 361 | ||
362 | config ISTALLION | 362 | config ISTALLION |
363 | tristate "Stallion EC8/64, ONboard, Brumby support" | 363 | tristate "Stallion EC8/64, ONboard, Brumby support" |
364 | depends on STALDRV && BROKEN_ON_SMP && (ISA || EISA || PCI) | 364 | depends on STALDRV && (ISA || EISA || PCI) |
365 | help | 365 | help |
366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion | 366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion |
367 | serial multiport card, say Y here. Make sure to read | 367 | serial multiport card, say Y here. Make sure to read |
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 843a2afaf204..96ee1121acef 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
@@ -623,24 +623,25 @@ static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, un | |||
623 | static void stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp); | 623 | static void stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp); |
624 | static void stli_poll(unsigned long arg); | 624 | static void stli_poll(unsigned long arg); |
625 | static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp); | 625 | static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp); |
626 | static int stli_initopen(struct stlibrd *brdp, struct stliport *portp); | 626 | static int stli_initopen(struct tty_struct *tty, struct stlibrd *brdp, struct stliport *portp); |
627 | static int stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait); | 627 | static int stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait); |
628 | static int stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait); | 628 | static int stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait); |
629 | static int stli_waitcarrier(struct stlibrd *brdp, struct stliport *portp, struct file *filp); | 629 | static int stli_waitcarrier(struct tty_struct *tty, struct stlibrd *brdp, |
630 | static int stli_setport(struct stliport *portp); | 630 | struct stliport *portp, struct file *filp); |
631 | static int stli_setport(struct tty_struct *tty); | ||
631 | static int stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); | 632 | static int stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); |
632 | static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); | 633 | static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); |
633 | static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); | 634 | static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback); |
634 | static void stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp); | 635 | static void stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp); |
635 | static void stli_mkasyport(struct stliport *portp, asyport_t *pp, struct ktermios *tiosp); | 636 | static void stli_mkasyport(struct tty_struct *tty, struct stliport *portp, asyport_t *pp, struct ktermios *tiosp); |
636 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts); | 637 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts); |
637 | static long stli_mktiocm(unsigned long sigvalue); | 638 | static long stli_mktiocm(unsigned long sigvalue); |
638 | static void stli_read(struct stlibrd *brdp, struct stliport *portp); | 639 | static void stli_read(struct stlibrd *brdp, struct stliport *portp); |
639 | static int stli_getserial(struct stliport *portp, struct serial_struct __user *sp); | 640 | static int stli_getserial(struct stliport *portp, struct serial_struct __user *sp); |
640 | static int stli_setserial(struct stliport *portp, struct serial_struct __user *sp); | 641 | static int stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp); |
641 | static int stli_getbrdstats(combrd_t __user *bp); | 642 | static int stli_getbrdstats(combrd_t __user *bp); |
642 | static int stli_getportstats(struct stliport *portp, comstats_t __user *cp); | 643 | static int stli_getportstats(struct tty_struct *tty, struct stliport *portp, comstats_t __user *cp); |
643 | static int stli_portcmdstats(struct stliport *portp); | 644 | static int stli_portcmdstats(struct tty_struct *tty, struct stliport *portp); |
644 | static int stli_clrportstats(struct stliport *portp, comstats_t __user *cp); | 645 | static int stli_clrportstats(struct stliport *portp, comstats_t __user *cp); |
645 | static int stli_getportstruct(struct stliport __user *arg); | 646 | static int stli_getportstruct(struct stliport __user *arg); |
646 | static int stli_getbrdstruct(struct stlibrd __user *arg); | 647 | static int stli_getbrdstruct(struct stlibrd __user *arg); |
@@ -731,12 +732,16 @@ static void stli_cleanup_ports(struct stlibrd *brdp) | |||
731 | { | 732 | { |
732 | struct stliport *portp; | 733 | struct stliport *portp; |
733 | unsigned int j; | 734 | unsigned int j; |
735 | struct tty_struct *tty; | ||
734 | 736 | ||
735 | for (j = 0; j < STL_MAXPORTS; j++) { | 737 | for (j = 0; j < STL_MAXPORTS; j++) { |
736 | portp = brdp->ports[j]; | 738 | portp = brdp->ports[j]; |
737 | if (portp != NULL) { | 739 | if (portp != NULL) { |
738 | if (portp->port.tty != NULL) | 740 | tty = tty_port_tty_get(&portp->port); |
739 | tty_hangup(portp->port.tty); | 741 | if (tty != NULL) { |
742 | tty_hangup(tty); | ||
743 | tty_kref_put(tty); | ||
744 | } | ||
740 | kfree(portp); | 745 | kfree(portp); |
741 | } | 746 | } |
742 | } | 747 | } |
@@ -824,7 +829,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
824 | * requires several commands to the board we will need to wait for any | 829 | * requires several commands to the board we will need to wait for any |
825 | * other open that is already initializing the port. | 830 | * other open that is already initializing the port. |
826 | */ | 831 | */ |
827 | portp->port.tty = tty; | 832 | tty_port_tty_set(&portp->port, tty); |
828 | tty->driver_data = portp; | 833 | tty->driver_data = portp; |
829 | portp->port.count++; | 834 | portp->port.count++; |
830 | 835 | ||
@@ -835,7 +840,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
835 | 840 | ||
836 | if ((portp->port.flags & ASYNC_INITIALIZED) == 0) { | 841 | if ((portp->port.flags & ASYNC_INITIALIZED) == 0) { |
837 | set_bit(ST_INITIALIZING, &portp->state); | 842 | set_bit(ST_INITIALIZING, &portp->state); |
838 | if ((rc = stli_initopen(brdp, portp)) >= 0) { | 843 | if ((rc = stli_initopen(tty, brdp, portp)) >= 0) { |
839 | portp->port.flags |= ASYNC_INITIALIZED; | 844 | portp->port.flags |= ASYNC_INITIALIZED; |
840 | clear_bit(TTY_IO_ERROR, &tty->flags); | 845 | clear_bit(TTY_IO_ERROR, &tty->flags); |
841 | } | 846 | } |
@@ -864,7 +869,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
864 | * then also we might have to wait for carrier. | 869 | * then also we might have to wait for carrier. |
865 | */ | 870 | */ |
866 | if (!(filp->f_flags & O_NONBLOCK)) { | 871 | if (!(filp->f_flags & O_NONBLOCK)) { |
867 | if ((rc = stli_waitcarrier(brdp, portp, filp)) != 0) | 872 | if ((rc = stli_waitcarrier(tty, brdp, portp, filp)) != 0) |
868 | return rc; | 873 | return rc; |
869 | } | 874 | } |
870 | portp->port.flags |= ASYNC_NORMAL_ACTIVE; | 875 | portp->port.flags |= ASYNC_NORMAL_ACTIVE; |
@@ -930,7 +935,7 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
930 | stli_flushbuffer(tty); | 935 | stli_flushbuffer(tty); |
931 | 936 | ||
932 | tty->closing = 0; | 937 | tty->closing = 0; |
933 | portp->port.tty = NULL; | 938 | tty_port_tty_set(&portp->port, NULL); |
934 | 939 | ||
935 | if (portp->openwaitcnt) { | 940 | if (portp->openwaitcnt) { |
936 | if (portp->close_delay) | 941 | if (portp->close_delay) |
@@ -952,9 +957,9 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
952 | * this still all happens pretty quickly. | 957 | * this still all happens pretty quickly. |
953 | */ | 958 | */ |
954 | 959 | ||
955 | static int stli_initopen(struct stlibrd *brdp, struct stliport *portp) | 960 | static int stli_initopen(struct tty_struct *tty, |
961 | struct stlibrd *brdp, struct stliport *portp) | ||
956 | { | 962 | { |
957 | struct tty_struct *tty; | ||
958 | asynotify_t nt; | 963 | asynotify_t nt; |
959 | asyport_t aport; | 964 | asyport_t aport; |
960 | int rc; | 965 | int rc; |
@@ -969,10 +974,7 @@ static int stli_initopen(struct stlibrd *brdp, struct stliport *portp) | |||
969 | sizeof(asynotify_t), 0)) < 0) | 974 | sizeof(asynotify_t), 0)) < 0) |
970 | return rc; | 975 | return rc; |
971 | 976 | ||
972 | tty = portp->port.tty; | 977 | stli_mkasyport(tty, portp, &aport, tty->termios); |
973 | if (tty == NULL) | ||
974 | return -ENODEV; | ||
975 | stli_mkasyport(portp, &aport, tty->termios); | ||
976 | if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport, | 978 | if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport, |
977 | sizeof(asyport_t), 0)) < 0) | 979 | sizeof(asyport_t), 0)) < 0) |
978 | return rc; | 980 | return rc; |
@@ -1161,22 +1163,21 @@ static int stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned l | |||
1161 | * waiting for the command to complete - so must have user context. | 1163 | * waiting for the command to complete - so must have user context. |
1162 | */ | 1164 | */ |
1163 | 1165 | ||
1164 | static int stli_setport(struct stliport *portp) | 1166 | static int stli_setport(struct tty_struct *tty) |
1165 | { | 1167 | { |
1168 | struct stliport *portp = tty->driver_data; | ||
1166 | struct stlibrd *brdp; | 1169 | struct stlibrd *brdp; |
1167 | asyport_t aport; | 1170 | asyport_t aport; |
1168 | 1171 | ||
1169 | if (portp == NULL) | 1172 | if (portp == NULL) |
1170 | return -ENODEV; | 1173 | return -ENODEV; |
1171 | if (portp->port.tty == NULL) | ||
1172 | return -ENODEV; | ||
1173 | if (portp->brdnr >= stli_nrbrds) | 1174 | if (portp->brdnr >= stli_nrbrds) |
1174 | return -ENODEV; | 1175 | return -ENODEV; |
1175 | brdp = stli_brds[portp->brdnr]; | 1176 | brdp = stli_brds[portp->brdnr]; |
1176 | if (brdp == NULL) | 1177 | if (brdp == NULL) |
1177 | return -ENODEV; | 1178 | return -ENODEV; |
1178 | 1179 | ||
1179 | stli_mkasyport(portp, &aport, portp->port.tty->termios); | 1180 | stli_mkasyport(tty, portp, &aport, tty->termios); |
1180 | return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0)); | 1181 | return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0)); |
1181 | } | 1182 | } |
1182 | 1183 | ||
@@ -1187,7 +1188,8 @@ static int stli_setport(struct stliport *portp) | |||
1187 | * maybe because if we are clocal then we don't need to wait... | 1188 | * maybe because if we are clocal then we don't need to wait... |
1188 | */ | 1189 | */ |
1189 | 1190 | ||
1190 | static int stli_waitcarrier(struct stlibrd *brdp, struct stliport *portp, struct file *filp) | 1191 | static int stli_waitcarrier(struct tty_struct *tty, struct stlibrd *brdp, |
1192 | struct stliport *portp, struct file *filp) | ||
1191 | { | 1193 | { |
1192 | unsigned long flags; | 1194 | unsigned long flags; |
1193 | int rc, doclocal; | 1195 | int rc, doclocal; |
@@ -1195,7 +1197,7 @@ static int stli_waitcarrier(struct stlibrd *brdp, struct stliport *portp, struct | |||
1195 | rc = 0; | 1197 | rc = 0; |
1196 | doclocal = 0; | 1198 | doclocal = 0; |
1197 | 1199 | ||
1198 | if (portp->port.tty->termios->c_cflag & CLOCAL) | 1200 | if (tty->termios->c_cflag & CLOCAL) |
1199 | doclocal++; | 1201 | doclocal++; |
1200 | 1202 | ||
1201 | spin_lock_irqsave(&stli_lock, flags); | 1203 | spin_lock_irqsave(&stli_lock, flags); |
@@ -1572,10 +1574,11 @@ static int stli_getserial(struct stliport *portp, struct serial_struct __user *s | |||
1572 | * just quietly ignore any requests to change irq, etc. | 1574 | * just quietly ignore any requests to change irq, etc. |
1573 | */ | 1575 | */ |
1574 | 1576 | ||
1575 | static int stli_setserial(struct stliport *portp, struct serial_struct __user *sp) | 1577 | static int stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp) |
1576 | { | 1578 | { |
1577 | struct serial_struct sio; | 1579 | struct serial_struct sio; |
1578 | int rc; | 1580 | int rc; |
1581 | struct stliport *portp = tty->driver_data; | ||
1579 | 1582 | ||
1580 | if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) | 1583 | if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) |
1581 | return -EFAULT; | 1584 | return -EFAULT; |
@@ -1594,7 +1597,7 @@ static int stli_setserial(struct stliport *portp, struct serial_struct __user *s | |||
1594 | portp->closing_wait = sio.closing_wait; | 1597 | portp->closing_wait = sio.closing_wait; |
1595 | portp->custom_divisor = sio.custom_divisor; | 1598 | portp->custom_divisor = sio.custom_divisor; |
1596 | 1599 | ||
1597 | if ((rc = stli_setport(portp)) < 0) | 1600 | if ((rc = stli_setport(tty)) < 0) |
1598 | return rc; | 1601 | return rc; |
1599 | return 0; | 1602 | return 0; |
1600 | } | 1603 | } |
@@ -1685,17 +1688,17 @@ static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cm | |||
1685 | rc = stli_getserial(portp, argp); | 1688 | rc = stli_getserial(portp, argp); |
1686 | break; | 1689 | break; |
1687 | case TIOCSSERIAL: | 1690 | case TIOCSSERIAL: |
1688 | rc = stli_setserial(portp, argp); | 1691 | rc = stli_setserial(tty, argp); |
1689 | break; | 1692 | break; |
1690 | case STL_GETPFLAG: | 1693 | case STL_GETPFLAG: |
1691 | rc = put_user(portp->pflag, (unsigned __user *)argp); | 1694 | rc = put_user(portp->pflag, (unsigned __user *)argp); |
1692 | break; | 1695 | break; |
1693 | case STL_SETPFLAG: | 1696 | case STL_SETPFLAG: |
1694 | if ((rc = get_user(portp->pflag, (unsigned __user *)argp)) == 0) | 1697 | if ((rc = get_user(portp->pflag, (unsigned __user *)argp)) == 0) |
1695 | stli_setport(portp); | 1698 | stli_setport(tty); |
1696 | break; | 1699 | break; |
1697 | case COM_GETPORTSTATS: | 1700 | case COM_GETPORTSTATS: |
1698 | rc = stli_getportstats(portp, argp); | 1701 | rc = stli_getportstats(tty, portp, argp); |
1699 | break; | 1702 | break; |
1700 | case COM_CLRPORTSTATS: | 1703 | case COM_CLRPORTSTATS: |
1701 | rc = stli_clrportstats(portp, argp); | 1704 | rc = stli_clrportstats(portp, argp); |
@@ -1742,7 +1745,7 @@ static void stli_settermios(struct tty_struct *tty, struct ktermios *old) | |||
1742 | 1745 | ||
1743 | tiosp = tty->termios; | 1746 | tiosp = tty->termios; |
1744 | 1747 | ||
1745 | stli_mkasyport(portp, &aport, tiosp); | 1748 | stli_mkasyport(tty, portp, &aport, tiosp); |
1746 | stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0); | 1749 | stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0); |
1747 | stli_mkasysigs(&portp->asig, ((tiosp->c_cflag & CBAUD) ? 1 : 0), -1); | 1750 | stli_mkasysigs(&portp->asig, ((tiosp->c_cflag & CBAUD) ? 1 : 0), -1); |
1748 | stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, | 1751 | stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, |
@@ -1854,7 +1857,7 @@ static void stli_hangup(struct tty_struct *tty) | |||
1854 | clear_bit(ST_TXBUSY, &portp->state); | 1857 | clear_bit(ST_TXBUSY, &portp->state); |
1855 | clear_bit(ST_RXSTOP, &portp->state); | 1858 | clear_bit(ST_RXSTOP, &portp->state); |
1856 | set_bit(TTY_IO_ERROR, &tty->flags); | 1859 | set_bit(TTY_IO_ERROR, &tty->flags); |
1857 | portp->port.tty = NULL; | 1860 | tty_port_tty_set(&portp->port, NULL); |
1858 | portp->port.flags &= ~ASYNC_NORMAL_ACTIVE; | 1861 | portp->port.flags &= ~ASYNC_NORMAL_ACTIVE; |
1859 | portp->port.count = 0; | 1862 | portp->port.count = 0; |
1860 | spin_unlock_irqrestore(&stli_lock, flags); | 1863 | spin_unlock_irqrestore(&stli_lock, flags); |
@@ -1998,7 +2001,7 @@ static int stli_portinfo(struct stlibrd *brdp, struct stliport *portp, int portn | |||
1998 | char *sp, *uart; | 2001 | char *sp, *uart; |
1999 | int rc, cnt; | 2002 | int rc, cnt; |
2000 | 2003 | ||
2001 | rc = stli_portcmdstats(portp); | 2004 | rc = stli_portcmdstats(NULL, portp); |
2002 | 2005 | ||
2003 | uart = "UNKNOWN"; | 2006 | uart = "UNKNOWN"; |
2004 | if (brdp->state & BST_STARTED) { | 2007 | if (brdp->state & BST_STARTED) { |
@@ -2188,7 +2191,7 @@ static void stli_read(struct stlibrd *brdp, struct stliport *portp) | |||
2188 | 2191 | ||
2189 | if (test_bit(ST_RXSTOP, &portp->state)) | 2192 | if (test_bit(ST_RXSTOP, &portp->state)) |
2190 | return; | 2193 | return; |
2191 | tty = portp->port.tty; | 2194 | tty = tty_port_tty_get(&portp->port); |
2192 | if (tty == NULL) | 2195 | if (tty == NULL) |
2193 | return; | 2196 | return; |
2194 | 2197 | ||
@@ -2230,6 +2233,7 @@ static void stli_read(struct stlibrd *brdp, struct stliport *portp) | |||
2230 | set_bit(ST_RXING, &portp->state); | 2233 | set_bit(ST_RXING, &portp->state); |
2231 | 2234 | ||
2232 | tty_schedule_flip(tty); | 2235 | tty_schedule_flip(tty); |
2236 | tty_kref_put(tty); | ||
2233 | } | 2237 | } |
2234 | 2238 | ||
2235 | /*****************************************************************************/ | 2239 | /*****************************************************************************/ |
@@ -2362,7 +2366,7 @@ static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp) | |||
2362 | if (ap->notify) { | 2366 | if (ap->notify) { |
2363 | nt = ap->changed; | 2367 | nt = ap->changed; |
2364 | ap->notify = 0; | 2368 | ap->notify = 0; |
2365 | tty = portp->port.tty; | 2369 | tty = tty_port_tty_get(&portp->port); |
2366 | 2370 | ||
2367 | if (nt.signal & SG_DCD) { | 2371 | if (nt.signal & SG_DCD) { |
2368 | oldsigs = portp->sigs; | 2372 | oldsigs = portp->sigs; |
@@ -2399,6 +2403,7 @@ static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp) | |||
2399 | tty_schedule_flip(tty); | 2403 | tty_schedule_flip(tty); |
2400 | } | 2404 | } |
2401 | } | 2405 | } |
2406 | tty_kref_put(tty); | ||
2402 | 2407 | ||
2403 | if (nt.data & DT_RXBUSY) { | 2408 | if (nt.data & DT_RXBUSY) { |
2404 | donerx++; | 2409 | donerx++; |
@@ -2535,14 +2540,15 @@ static void stli_poll(unsigned long arg) | |||
2535 | * the slave. | 2540 | * the slave. |
2536 | */ | 2541 | */ |
2537 | 2542 | ||
2538 | static void stli_mkasyport(struct stliport *portp, asyport_t *pp, struct ktermios *tiosp) | 2543 | static void stli_mkasyport(struct tty_struct *tty, struct stliport *portp, |
2544 | asyport_t *pp, struct ktermios *tiosp) | ||
2539 | { | 2545 | { |
2540 | memset(pp, 0, sizeof(asyport_t)); | 2546 | memset(pp, 0, sizeof(asyport_t)); |
2541 | 2547 | ||
2542 | /* | 2548 | /* |
2543 | * Start of by setting the baud, char size, parity and stop bit info. | 2549 | * Start of by setting the baud, char size, parity and stop bit info. |
2544 | */ | 2550 | */ |
2545 | pp->baudout = tty_get_baud_rate(portp->port.tty); | 2551 | pp->baudout = tty_get_baud_rate(tty); |
2546 | if ((tiosp->c_cflag & CBAUD) == B38400) { | 2552 | if ((tiosp->c_cflag & CBAUD) == B38400) { |
2547 | if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) | 2553 | if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) |
2548 | pp->baudout = 57600; | 2554 | pp->baudout = 57600; |
@@ -2695,7 +2701,7 @@ static int stli_initports(struct stlibrd *brdp) | |||
2695 | printk("STALLION: failed to allocate port structure\n"); | 2701 | printk("STALLION: failed to allocate port structure\n"); |
2696 | continue; | 2702 | continue; |
2697 | } | 2703 | } |
2698 | 2704 | tty_port_init(&portp->port); | |
2699 | portp->magic = STLI_PORTMAGIC; | 2705 | portp->magic = STLI_PORTMAGIC; |
2700 | portp->portnr = i; | 2706 | portp->portnr = i; |
2701 | portp->brdnr = brdp->brdnr; | 2707 | portp->brdnr = brdp->brdnr; |
@@ -4220,7 +4226,7 @@ static struct stliport *stli_getport(unsigned int brdnr, unsigned int panelnr, | |||
4220 | * what port to get stats for (used through board control device). | 4226 | * what port to get stats for (used through board control device). |
4221 | */ | 4227 | */ |
4222 | 4228 | ||
4223 | static int stli_portcmdstats(struct stliport *portp) | 4229 | static int stli_portcmdstats(struct tty_struct *tty, struct stliport *portp) |
4224 | { | 4230 | { |
4225 | unsigned long flags; | 4231 | unsigned long flags; |
4226 | struct stlibrd *brdp; | 4232 | struct stlibrd *brdp; |
@@ -4249,15 +4255,15 @@ static int stli_portcmdstats(struct stliport *portp) | |||
4249 | stli_comstats.flags = portp->port.flags; | 4255 | stli_comstats.flags = portp->port.flags; |
4250 | 4256 | ||
4251 | spin_lock_irqsave(&brd_lock, flags); | 4257 | spin_lock_irqsave(&brd_lock, flags); |
4252 | if (portp->port.tty != NULL) { | 4258 | if (tty != NULL) { |
4253 | if (portp->port.tty->driver_data == portp) { | 4259 | if (portp->port.tty == tty) { |
4254 | stli_comstats.ttystate = portp->port.tty->flags; | 4260 | stli_comstats.ttystate = tty->flags; |
4255 | stli_comstats.rxbuffered = -1; | 4261 | stli_comstats.rxbuffered = -1; |
4256 | if (portp->port.tty->termios != NULL) { | 4262 | if (tty->termios != NULL) { |
4257 | stli_comstats.cflags = portp->port.tty->termios->c_cflag; | 4263 | stli_comstats.cflags = tty->termios->c_cflag; |
4258 | stli_comstats.iflags = portp->port.tty->termios->c_iflag; | 4264 | stli_comstats.iflags = tty->termios->c_iflag; |
4259 | stli_comstats.oflags = portp->port.tty->termios->c_oflag; | 4265 | stli_comstats.oflags = tty->termios->c_oflag; |
4260 | stli_comstats.lflags = portp->port.tty->termios->c_lflag; | 4266 | stli_comstats.lflags = tty->termios->c_lflag; |
4261 | } | 4267 | } |
4262 | } | 4268 | } |
4263 | } | 4269 | } |
@@ -4294,7 +4300,8 @@ static int stli_portcmdstats(struct stliport *portp) | |||
4294 | * what port to get stats for (used through board control device). | 4300 | * what port to get stats for (used through board control device). |
4295 | */ | 4301 | */ |
4296 | 4302 | ||
4297 | static int stli_getportstats(struct stliport *portp, comstats_t __user *cp) | 4303 | static int stli_getportstats(struct tty_struct *tty, struct stliport *portp, |
4304 | comstats_t __user *cp) | ||
4298 | { | 4305 | { |
4299 | struct stlibrd *brdp; | 4306 | struct stlibrd *brdp; |
4300 | int rc; | 4307 | int rc; |
@@ -4312,7 +4319,7 @@ static int stli_getportstats(struct stliport *portp, comstats_t __user *cp) | |||
4312 | if (!brdp) | 4319 | if (!brdp) |
4313 | return -ENODEV; | 4320 | return -ENODEV; |
4314 | 4321 | ||
4315 | if ((rc = stli_portcmdstats(portp)) < 0) | 4322 | if ((rc = stli_portcmdstats(tty, portp)) < 0) |
4316 | return rc; | 4323 | return rc; |
4317 | 4324 | ||
4318 | return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ? | 4325 | return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ? |
@@ -4427,7 +4434,7 @@ static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, un | |||
4427 | 4434 | ||
4428 | switch (cmd) { | 4435 | switch (cmd) { |
4429 | case COM_GETPORTSTATS: | 4436 | case COM_GETPORTSTATS: |
4430 | rc = stli_getportstats(NULL, argp); | 4437 | rc = stli_getportstats(NULL, NULL, argp); |
4431 | done++; | 4438 | done++; |
4432 | break; | 4439 | break; |
4433 | case COM_CLRPORTSTATS: | 4440 | case COM_CLRPORTSTATS: |
diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index 19db1eb87c26..81b3234127db 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c | |||
@@ -405,9 +405,9 @@ static unsigned int stl_baudrates[] = { | |||
405 | 405 | ||
406 | static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg); | 406 | static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg); |
407 | static int stl_brdinit(struct stlbrd *brdp); | 407 | static int stl_brdinit(struct stlbrd *brdp); |
408 | static int stl_getportstats(struct stlport *portp, comstats_t __user *cp); | 408 | static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp); |
409 | static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp); | 409 | static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp); |
410 | static int stl_waitcarrier(struct stlport *portp, struct file *filp); | 410 | static int stl_waitcarrier(struct tty_struct *tty, struct stlport *portp, struct file *filp); |
411 | 411 | ||
412 | /* | 412 | /* |
413 | * CD1400 uart specific handling functions. | 413 | * CD1400 uart specific handling functions. |
@@ -612,8 +612,9 @@ static struct class *stallion_class; | |||
612 | static void stl_cd_change(struct stlport *portp) | 612 | static void stl_cd_change(struct stlport *portp) |
613 | { | 613 | { |
614 | unsigned int oldsigs = portp->sigs; | 614 | unsigned int oldsigs = portp->sigs; |
615 | struct tty_struct *tty = tty_port_tty_get(&portp->port); | ||
615 | 616 | ||
616 | if (!portp->port.tty) | 617 | if (!tty) |
617 | return; | 618 | return; |
618 | 619 | ||
619 | portp->sigs = stl_getsignals(portp); | 620 | portp->sigs = stl_getsignals(portp); |
@@ -623,7 +624,8 @@ static void stl_cd_change(struct stlport *portp) | |||
623 | 624 | ||
624 | if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0)) | 625 | if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0)) |
625 | if (portp->port.flags & ASYNC_CHECK_CD) | 626 | if (portp->port.flags & ASYNC_CHECK_CD) |
626 | tty_hangup(portp->port.tty); | 627 | tty_hangup(tty); |
628 | tty_kref_put(tty); | ||
627 | } | 629 | } |
628 | 630 | ||
629 | /* | 631 | /* |
@@ -734,7 +736,7 @@ static int stl_open(struct tty_struct *tty, struct file *filp) | |||
734 | * On the first open of the device setup the port hardware, and | 736 | * On the first open of the device setup the port hardware, and |
735 | * initialize the per port data structure. | 737 | * initialize the per port data structure. |
736 | */ | 738 | */ |
737 | portp->port.tty = tty; | 739 | tty_port_tty_set(&portp->port, tty); |
738 | tty->driver_data = portp; | 740 | tty->driver_data = portp; |
739 | portp->port.count++; | 741 | portp->port.count++; |
740 | 742 | ||
@@ -774,7 +776,7 @@ static int stl_open(struct tty_struct *tty, struct file *filp) | |||
774 | * then also we might have to wait for carrier. | 776 | * then also we might have to wait for carrier. |
775 | */ | 777 | */ |
776 | if (!(filp->f_flags & O_NONBLOCK)) | 778 | if (!(filp->f_flags & O_NONBLOCK)) |
777 | if ((rc = stl_waitcarrier(portp, filp)) != 0) | 779 | if ((rc = stl_waitcarrier(tty, portp, filp)) != 0) |
778 | return rc; | 780 | return rc; |
779 | 781 | ||
780 | portp->port.flags |= ASYNC_NORMAL_ACTIVE; | 782 | portp->port.flags |= ASYNC_NORMAL_ACTIVE; |
@@ -789,7 +791,8 @@ static int stl_open(struct tty_struct *tty, struct file *filp) | |||
789 | * maybe because if we are clocal then we don't need to wait... | 791 | * maybe because if we are clocal then we don't need to wait... |
790 | */ | 792 | */ |
791 | 793 | ||
792 | static int stl_waitcarrier(struct stlport *portp, struct file *filp) | 794 | static int stl_waitcarrier(struct tty_struct *tty, struct stlport *portp, |
795 | struct file *filp) | ||
793 | { | 796 | { |
794 | unsigned long flags; | 797 | unsigned long flags; |
795 | int rc, doclocal; | 798 | int rc, doclocal; |
@@ -801,7 +804,7 @@ static int stl_waitcarrier(struct stlport *portp, struct file *filp) | |||
801 | 804 | ||
802 | spin_lock_irqsave(&stallion_lock, flags); | 805 | spin_lock_irqsave(&stallion_lock, flags); |
803 | 806 | ||
804 | if (portp->port.tty->termios->c_cflag & CLOCAL) | 807 | if (tty->termios->c_cflag & CLOCAL) |
805 | doclocal++; | 808 | doclocal++; |
806 | 809 | ||
807 | portp->openwaitcnt++; | 810 | portp->openwaitcnt++; |
@@ -949,7 +952,7 @@ static void stl_close(struct tty_struct *tty, struct file *filp) | |||
949 | tty_ldisc_flush(tty); | 952 | tty_ldisc_flush(tty); |
950 | 953 | ||
951 | tty->closing = 0; | 954 | tty->closing = 0; |
952 | portp->port.tty = NULL; | 955 | tty_port_tty_set(&portp->port, NULL); |
953 | 956 | ||
954 | if (portp->openwaitcnt) { | 957 | if (portp->openwaitcnt) { |
955 | if (portp->close_delay) | 958 | if (portp->close_delay) |
@@ -1183,8 +1186,9 @@ static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp) | |||
1183 | * just quietly ignore any requests to change irq, etc. | 1186 | * just quietly ignore any requests to change irq, etc. |
1184 | */ | 1187 | */ |
1185 | 1188 | ||
1186 | static int stl_setserial(struct stlport *portp, struct serial_struct __user *sp) | 1189 | static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp) |
1187 | { | 1190 | { |
1191 | struct stlport * portp = tty->driver_data; | ||
1188 | struct serial_struct sio; | 1192 | struct serial_struct sio; |
1189 | 1193 | ||
1190 | pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp); | 1194 | pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp); |
@@ -1205,7 +1209,7 @@ static int stl_setserial(struct stlport *portp, struct serial_struct __user *sp) | |||
1205 | portp->close_delay = sio.close_delay; | 1209 | portp->close_delay = sio.close_delay; |
1206 | portp->closing_wait = sio.closing_wait; | 1210 | portp->closing_wait = sio.closing_wait; |
1207 | portp->custom_divisor = sio.custom_divisor; | 1211 | portp->custom_divisor = sio.custom_divisor; |
1208 | stl_setport(portp, portp->port.tty->termios); | 1212 | stl_setport(portp, tty->termios); |
1209 | return 0; | 1213 | return 0; |
1210 | } | 1214 | } |
1211 | 1215 | ||
@@ -1282,10 +1286,10 @@ static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd | |||
1282 | rc = stl_getserial(portp, argp); | 1286 | rc = stl_getserial(portp, argp); |
1283 | break; | 1287 | break; |
1284 | case TIOCSSERIAL: | 1288 | case TIOCSSERIAL: |
1285 | rc = stl_setserial(portp, argp); | 1289 | rc = stl_setserial(tty, argp); |
1286 | break; | 1290 | break; |
1287 | case COM_GETPORTSTATS: | 1291 | case COM_GETPORTSTATS: |
1288 | rc = stl_getportstats(portp, argp); | 1292 | rc = stl_getportstats(tty, portp, argp); |
1289 | break; | 1293 | break; |
1290 | case COM_CLRPORTSTATS: | 1294 | case COM_CLRPORTSTATS: |
1291 | rc = stl_clrportstats(portp, argp); | 1295 | rc = stl_clrportstats(portp, argp); |
@@ -1452,7 +1456,7 @@ static void stl_hangup(struct tty_struct *tty) | |||
1452 | portp->tx.head = NULL; | 1456 | portp->tx.head = NULL; |
1453 | portp->tx.tail = NULL; | 1457 | portp->tx.tail = NULL; |
1454 | } | 1458 | } |
1455 | portp->port.tty = NULL; | 1459 | tty_port_tty_set(&portp->port, NULL); |
1456 | portp->port.flags &= ~ASYNC_NORMAL_ACTIVE; | 1460 | portp->port.flags &= ~ASYNC_NORMAL_ACTIVE; |
1457 | portp->port.count = 0; | 1461 | portp->port.count = 0; |
1458 | wake_up_interruptible(&portp->port.open_wait); | 1462 | wake_up_interruptible(&portp->port.open_wait); |
@@ -1805,7 +1809,7 @@ static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp) | |||
1805 | "(size=%Zd)\n", sizeof(struct stlport)); | 1809 | "(size=%Zd)\n", sizeof(struct stlport)); |
1806 | break; | 1810 | break; |
1807 | } | 1811 | } |
1808 | 1812 | tty_port_init(&portp->port); | |
1809 | portp->magic = STL_PORTMAGIC; | 1813 | portp->magic = STL_PORTMAGIC; |
1810 | portp->portnr = i; | 1814 | portp->portnr = i; |
1811 | portp->brdnr = panelp->brdnr; | 1815 | portp->brdnr = panelp->brdnr; |
@@ -1832,6 +1836,7 @@ static void stl_cleanup_panels(struct stlbrd *brdp) | |||
1832 | struct stlpanel *panelp; | 1836 | struct stlpanel *panelp; |
1833 | struct stlport *portp; | 1837 | struct stlport *portp; |
1834 | unsigned int j, k; | 1838 | unsigned int j, k; |
1839 | struct tty_struct *tty; | ||
1835 | 1840 | ||
1836 | for (j = 0; j < STL_MAXPANELS; j++) { | 1841 | for (j = 0; j < STL_MAXPANELS; j++) { |
1837 | panelp = brdp->panels[j]; | 1842 | panelp = brdp->panels[j]; |
@@ -1841,8 +1846,11 @@ static void stl_cleanup_panels(struct stlbrd *brdp) | |||
1841 | portp = panelp->ports[k]; | 1846 | portp = panelp->ports[k]; |
1842 | if (portp == NULL) | 1847 | if (portp == NULL) |
1843 | continue; | 1848 | continue; |
1844 | if (portp->port.tty != NULL) | 1849 | tty = tty_port_tty_get(&portp->port); |
1845 | stl_hangup(portp->port.tty); | 1850 | if (tty != NULL) { |
1851 | stl_hangup(tty); | ||
1852 | tty_kref_put(tty); | ||
1853 | } | ||
1846 | kfree(portp->tx.buf); | 1854 | kfree(portp->tx.buf); |
1847 | kfree(portp); | 1855 | kfree(portp); |
1848 | } | 1856 | } |
@@ -2498,7 +2506,7 @@ static struct stlport *stl_getport(int brdnr, int panelnr, int portnr) | |||
2498 | * what port to get stats for (used through board control device). | 2506 | * what port to get stats for (used through board control device). |
2499 | */ | 2507 | */ |
2500 | 2508 | ||
2501 | static int stl_getportstats(struct stlport *portp, comstats_t __user *cp) | 2509 | static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp) |
2502 | { | 2510 | { |
2503 | comstats_t stl_comstats; | 2511 | comstats_t stl_comstats; |
2504 | unsigned char *head, *tail; | 2512 | unsigned char *head, *tail; |
@@ -2525,18 +2533,17 @@ static int stl_getportstats(struct stlport *portp, comstats_t __user *cp) | |||
2525 | portp->stats.rxbuffered = 0; | 2533 | portp->stats.rxbuffered = 0; |
2526 | 2534 | ||
2527 | spin_lock_irqsave(&stallion_lock, flags); | 2535 | spin_lock_irqsave(&stallion_lock, flags); |
2528 | if (portp->port.tty != NULL) | 2536 | if (tty != NULL && portp->port.tty == tty) { |
2529 | if (portp->port.tty->driver_data == portp) { | 2537 | portp->stats.ttystate = tty->flags; |
2530 | portp->stats.ttystate = portp->port.tty->flags; | 2538 | /* No longer available as a statistic */ |
2531 | /* No longer available as a statistic */ | 2539 | portp->stats.rxbuffered = 1; /*tty->flip.count; */ |
2532 | portp->stats.rxbuffered = 1; /*portp->port.tty->flip.count; */ | 2540 | if (tty->termios != NULL) { |
2533 | if (portp->port.tty->termios != NULL) { | 2541 | portp->stats.cflags = tty->termios->c_cflag; |
2534 | portp->stats.cflags = portp->port.tty->termios->c_cflag; | 2542 | portp->stats.iflags = tty->termios->c_iflag; |
2535 | portp->stats.iflags = portp->port.tty->termios->c_iflag; | 2543 | portp->stats.oflags = tty->termios->c_oflag; |
2536 | portp->stats.oflags = portp->port.tty->termios->c_oflag; | 2544 | portp->stats.lflags = tty->termios->c_lflag; |
2537 | portp->stats.lflags = portp->port.tty->termios->c_lflag; | ||
2538 | } | ||
2539 | } | 2545 | } |
2546 | } | ||
2540 | spin_unlock_irqrestore(&stallion_lock, flags); | 2547 | spin_unlock_irqrestore(&stallion_lock, flags); |
2541 | 2548 | ||
2542 | head = portp->tx.head; | 2549 | head = portp->tx.head; |
@@ -2640,7 +2647,7 @@ static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, uns | |||
2640 | 2647 | ||
2641 | switch (cmd) { | 2648 | switch (cmd) { |
2642 | case COM_GETPORTSTATS: | 2649 | case COM_GETPORTSTATS: |
2643 | rc = stl_getportstats(NULL, argp); | 2650 | rc = stl_getportstats(NULL, NULL, argp); |
2644 | break; | 2651 | break; |
2645 | case COM_CLRPORTSTATS: | 2652 | case COM_CLRPORTSTATS: |
2646 | rc = stl_clrportstats(NULL, argp); | 2653 | rc = stl_clrportstats(NULL, argp); |
@@ -3243,7 +3250,7 @@ static void stl_cd1400flowctrl(struct stlport *portp, int state) | |||
3243 | 3250 | ||
3244 | if (portp == NULL) | 3251 | if (portp == NULL) |
3245 | return; | 3252 | return; |
3246 | tty = portp->port.tty; | 3253 | tty = tty_port_tty_get(&portp->port); |
3247 | if (tty == NULL) | 3254 | if (tty == NULL) |
3248 | return; | 3255 | return; |
3249 | 3256 | ||
@@ -3288,6 +3295,7 @@ static void stl_cd1400flowctrl(struct stlport *portp, int state) | |||
3288 | 3295 | ||
3289 | BRDDISABLE(portp->brdnr); | 3296 | BRDDISABLE(portp->brdnr); |
3290 | spin_unlock_irqrestore(&brd_lock, flags); | 3297 | spin_unlock_irqrestore(&brd_lock, flags); |
3298 | tty_kref_put(tty); | ||
3291 | } | 3299 | } |
3292 | 3300 | ||
3293 | /*****************************************************************************/ | 3301 | /*****************************************************************************/ |
@@ -3305,7 +3313,7 @@ static void stl_cd1400sendflow(struct stlport *portp, int state) | |||
3305 | 3313 | ||
3306 | if (portp == NULL) | 3314 | if (portp == NULL) |
3307 | return; | 3315 | return; |
3308 | tty = portp->port.tty; | 3316 | tty = tty_port_tty_get(&portp->port); |
3309 | if (tty == NULL) | 3317 | if (tty == NULL) |
3310 | return; | 3318 | return; |
3311 | 3319 | ||
@@ -3325,6 +3333,7 @@ static void stl_cd1400sendflow(struct stlport *portp, int state) | |||
3325 | } | 3333 | } |
3326 | BRDDISABLE(portp->brdnr); | 3334 | BRDDISABLE(portp->brdnr); |
3327 | spin_unlock_irqrestore(&brd_lock, flags); | 3335 | spin_unlock_irqrestore(&brd_lock, flags); |
3336 | tty_kref_put(tty); | ||
3328 | } | 3337 | } |
3329 | 3338 | ||
3330 | /*****************************************************************************/ | 3339 | /*****************************************************************************/ |
@@ -3478,6 +3487,7 @@ static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr) | |||
3478 | int len, stlen; | 3487 | int len, stlen; |
3479 | char *head, *tail; | 3488 | char *head, *tail; |
3480 | unsigned char ioack, srer; | 3489 | unsigned char ioack, srer; |
3490 | struct tty_struct *tty; | ||
3481 | 3491 | ||
3482 | pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr); | 3492 | pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr); |
3483 | 3493 | ||
@@ -3504,8 +3514,11 @@ static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr) | |||
3504 | if ((len == 0) || ((len < STL_TXBUFLOW) && | 3514 | if ((len == 0) || ((len < STL_TXBUFLOW) && |
3505 | (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { | 3515 | (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { |
3506 | set_bit(ASYI_TXLOW, &portp->istate); | 3516 | set_bit(ASYI_TXLOW, &portp->istate); |
3507 | if (portp->port.tty) | 3517 | tty = tty_port_tty_get(&portp->port); |
3508 | tty_wakeup(portp->port.tty); | 3518 | if (tty) { |
3519 | tty_wakeup(tty); | ||
3520 | tty_kref_put(tty); | ||
3521 | } | ||
3509 | } | 3522 | } |
3510 | 3523 | ||
3511 | if (len == 0) { | 3524 | if (len == 0) { |
@@ -3569,7 +3582,7 @@ static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr) | |||
3569 | return; | 3582 | return; |
3570 | } | 3583 | } |
3571 | portp = panelp->ports[(ioack >> 3)]; | 3584 | portp = panelp->ports[(ioack >> 3)]; |
3572 | tty = portp->port.tty; | 3585 | tty = tty_port_tty_get(&portp->port); |
3573 | 3586 | ||
3574 | if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) { | 3587 | if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) { |
3575 | outb((RDCR + portp->uartaddr), ioaddr); | 3588 | outb((RDCR + portp->uartaddr), ioaddr); |
@@ -3633,10 +3646,12 @@ static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr) | |||
3633 | } | 3646 | } |
3634 | } else { | 3647 | } else { |
3635 | printk("STALLION: bad RX interrupt ack value=%x\n", ioack); | 3648 | printk("STALLION: bad RX interrupt ack value=%x\n", ioack); |
3649 | tty_kref_put(tty); | ||
3636 | return; | 3650 | return; |
3637 | } | 3651 | } |
3638 | 3652 | ||
3639 | stl_rxalldone: | 3653 | stl_rxalldone: |
3654 | tty_kref_put(tty); | ||
3640 | outb((EOSRR + portp->uartaddr), ioaddr); | 3655 | outb((EOSRR + portp->uartaddr), ioaddr); |
3641 | outb(0, (ioaddr + EREG_DATA)); | 3656 | outb(0, (ioaddr + EREG_DATA)); |
3642 | } | 3657 | } |
@@ -4175,7 +4190,7 @@ static void stl_sc26198flowctrl(struct stlport *portp, int state) | |||
4175 | 4190 | ||
4176 | if (portp == NULL) | 4191 | if (portp == NULL) |
4177 | return; | 4192 | return; |
4178 | tty = portp->port.tty; | 4193 | tty = tty_port_tty_get(&portp->port); |
4179 | if (tty == NULL) | 4194 | if (tty == NULL) |
4180 | return; | 4195 | return; |
4181 | 4196 | ||
@@ -4226,6 +4241,7 @@ static void stl_sc26198flowctrl(struct stlport *portp, int state) | |||
4226 | 4241 | ||
4227 | BRDDISABLE(portp->brdnr); | 4242 | BRDDISABLE(portp->brdnr); |
4228 | spin_unlock_irqrestore(&brd_lock, flags); | 4243 | spin_unlock_irqrestore(&brd_lock, flags); |
4244 | tty_kref_put(tty); | ||
4229 | } | 4245 | } |
4230 | 4246 | ||
4231 | /*****************************************************************************/ | 4247 | /*****************************************************************************/ |
@@ -4244,7 +4260,7 @@ static void stl_sc26198sendflow(struct stlport *portp, int state) | |||
4244 | 4260 | ||
4245 | if (portp == NULL) | 4261 | if (portp == NULL) |
4246 | return; | 4262 | return; |
4247 | tty = portp->port.tty; | 4263 | tty = tty_port_tty_get(&portp->port); |
4248 | if (tty == NULL) | 4264 | if (tty == NULL) |
4249 | return; | 4265 | return; |
4250 | 4266 | ||
@@ -4269,6 +4285,7 @@ static void stl_sc26198sendflow(struct stlport *portp, int state) | |||
4269 | } | 4285 | } |
4270 | BRDDISABLE(portp->brdnr); | 4286 | BRDDISABLE(portp->brdnr); |
4271 | spin_unlock_irqrestore(&brd_lock, flags); | 4287 | spin_unlock_irqrestore(&brd_lock, flags); |
4288 | tty_kref_put(tty); | ||
4272 | } | 4289 | } |
4273 | 4290 | ||
4274 | /*****************************************************************************/ | 4291 | /*****************************************************************************/ |
@@ -4408,6 +4425,7 @@ static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase) | |||
4408 | 4425 | ||
4409 | static void stl_sc26198txisr(struct stlport *portp) | 4426 | static void stl_sc26198txisr(struct stlport *portp) |
4410 | { | 4427 | { |
4428 | struct tty_struct *tty; | ||
4411 | unsigned int ioaddr; | 4429 | unsigned int ioaddr; |
4412 | unsigned char mr0; | 4430 | unsigned char mr0; |
4413 | int len, stlen; | 4431 | int len, stlen; |
@@ -4422,8 +4440,11 @@ static void stl_sc26198txisr(struct stlport *portp) | |||
4422 | if ((len == 0) || ((len < STL_TXBUFLOW) && | 4440 | if ((len == 0) || ((len < STL_TXBUFLOW) && |
4423 | (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { | 4441 | (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { |
4424 | set_bit(ASYI_TXLOW, &portp->istate); | 4442 | set_bit(ASYI_TXLOW, &portp->istate); |
4425 | if (portp->port.tty) | 4443 | tty = tty_port_tty_get(&portp->port); |
4426 | tty_wakeup(portp->port.tty); | 4444 | if (tty) { |
4445 | tty_wakeup(tty); | ||
4446 | tty_kref_put(tty); | ||
4447 | } | ||
4427 | } | 4448 | } |
4428 | 4449 | ||
4429 | if (len == 0) { | 4450 | if (len == 0) { |
@@ -4476,7 +4497,7 @@ static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack) | |||
4476 | 4497 | ||
4477 | pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack); | 4498 | pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack); |
4478 | 4499 | ||
4479 | tty = portp->port.tty; | 4500 | tty = tty_port_tty_get(&portp->port); |
4480 | ioaddr = portp->ioaddr; | 4501 | ioaddr = portp->ioaddr; |
4481 | outb(GIBCR, (ioaddr + XP_ADDR)); | 4502 | outb(GIBCR, (ioaddr + XP_ADDR)); |
4482 | len = inb(ioaddr + XP_DATA) + 1; | 4503 | len = inb(ioaddr + XP_DATA) + 1; |
@@ -4515,6 +4536,7 @@ static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack) | |||
4515 | stl_sc26198txunflow(portp, tty); | 4536 | stl_sc26198txunflow(portp, tty); |
4516 | } | 4537 | } |
4517 | } | 4538 | } |
4539 | tty_kref_put(tty); | ||
4518 | } | 4540 | } |
4519 | 4541 | ||
4520 | /*****************************************************************************/ | 4542 | /*****************************************************************************/ |
@@ -4528,7 +4550,7 @@ static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char | |||
4528 | struct tty_struct *tty; | 4550 | struct tty_struct *tty; |
4529 | unsigned int ioaddr; | 4551 | unsigned int ioaddr; |
4530 | 4552 | ||
4531 | tty = portp->port.tty; | 4553 | tty = tty_port_tty_get(&portp->port); |
4532 | ioaddr = portp->ioaddr; | 4554 | ioaddr = portp->ioaddr; |
4533 | 4555 | ||
4534 | if (status & SR_RXPARITY) | 4556 | if (status & SR_RXPARITY) |
@@ -4566,6 +4588,7 @@ static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char | |||
4566 | if (status == 0) | 4588 | if (status == 0) |
4567 | portp->stats.rxtotal++; | 4589 | portp->stats.rxtotal++; |
4568 | } | 4590 | } |
4591 | tty_kref_put(tty); | ||
4569 | } | 4592 | } |
4570 | 4593 | ||
4571 | /*****************************************************************************/ | 4594 | /*****************************************************************************/ |