aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/pcmcia
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/pcmcia')
-rw-r--r--drivers/char/pcmcia/synclink_cs.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 3f57d5de3957..21721d25e388 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -891,6 +891,14 @@ static void rx_ready_async(MGSLPC_INFO *info, int tcd, struct tty_struct *tty)
891 int work = 0; 891 int work = 0;
892 struct mgsl_icount *icount = &info->icount; 892 struct mgsl_icount *icount = &info->icount;
893 893
894 if (!tty) {
895 /* tty is not available anymore */
896 issue_command(info, CHA, CMD_RXRESET);
897 if (debug_level >= DEBUG_LEVEL_ISR)
898 printk("%s(%d):rx_ready_async(tty=NULL)\n",__FILE__,__LINE__);
899 return;
900 }
901
894 if (tcd) { 902 if (tcd) {
895 /* early termination, get FIFO count from RBCL register */ 903 /* early termination, get FIFO count from RBCL register */
896 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f); 904 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f);
@@ -980,7 +988,7 @@ static void tx_done(MGSLPC_INFO *info, struct tty_struct *tty)
980 else 988 else
981#endif 989#endif
982 { 990 {
983 if (tty->stopped || tty->hw_stopped) { 991 if (tty && (tty->stopped || tty->hw_stopped)) {
984 tx_stop(info); 992 tx_stop(info);
985 return; 993 return;
986 } 994 }
@@ -1000,7 +1008,7 @@ static void tx_ready(MGSLPC_INFO *info, struct tty_struct *tty)
1000 if (!info->tx_active) 1008 if (!info->tx_active)
1001 return; 1009 return;
1002 } else { 1010 } else {
1003 if (tty->stopped || tty->hw_stopped) { 1011 if (tty && (tty->stopped || tty->hw_stopped)) {
1004 tx_stop(info); 1012 tx_stop(info);
1005 return; 1013 return;
1006 } 1014 }
@@ -1050,13 +1058,12 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
1050 wake_up_interruptible(&info->status_event_wait_q); 1058 wake_up_interruptible(&info->status_event_wait_q);
1051 wake_up_interruptible(&info->event_wait_q); 1059 wake_up_interruptible(&info->event_wait_q);
1052 1060
1053 if (tty_port_cts_enabled(&info->port)) { 1061 if (tty && tty_port_cts_enabled(&info->port)) {
1054 if (tty->hw_stopped) { 1062 if (tty->hw_stopped) {
1055 if (info->serial_signals & SerialSignal_CTS) { 1063 if (info->serial_signals & SerialSignal_CTS) {
1056 if (debug_level >= DEBUG_LEVEL_ISR) 1064 if (debug_level >= DEBUG_LEVEL_ISR)
1057 printk("CTS tx start..."); 1065 printk("CTS tx start...");
1058 if (tty) 1066 tty->hw_stopped = 0;
1059 tty->hw_stopped = 0;
1060 tx_start(info, tty); 1067 tx_start(info, tty);
1061 info->pending_bh |= BH_TRANSMIT; 1068 info->pending_bh |= BH_TRANSMIT;
1062 return; 1069 return;
@@ -1065,8 +1072,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
1065 if (!(info->serial_signals & SerialSignal_CTS)) { 1072 if (!(info->serial_signals & SerialSignal_CTS)) {
1066 if (debug_level >= DEBUG_LEVEL_ISR) 1073 if (debug_level >= DEBUG_LEVEL_ISR)
1067 printk("CTS tx stop..."); 1074 printk("CTS tx stop...");
1068 if (tty) 1075 tty->hw_stopped = 1;
1069 tty->hw_stopped = 1;
1070 tx_stop(info); 1076 tx_stop(info);
1071 } 1077 }
1072 } 1078 }