aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/synclink_gt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/synclink_gt.c')
-rw-r--r--drivers/char/synclink_gt.c71
1 files changed, 38 insertions, 33 deletions
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c
index 64e835f62438..1f954acf2bac 100644
--- a/drivers/char/synclink_gt.c
+++ b/drivers/char/synclink_gt.c
@@ -73,6 +73,7 @@
73#include <linux/bitops.h> 73#include <linux/bitops.h>
74#include <linux/workqueue.h> 74#include <linux/workqueue.h>
75#include <linux/hdlc.h> 75#include <linux/hdlc.h>
76#include <linux/synclink.h>
76 77
77#include <asm/system.h> 78#include <asm/system.h>
78#include <asm/io.h> 79#include <asm/io.h>
@@ -81,8 +82,6 @@
81#include <asm/types.h> 82#include <asm/types.h>
82#include <asm/uaccess.h> 83#include <asm/uaccess.h>
83 84
84#include "linux/synclink.h"
85
86#if defined(CONFIG_HDLC) || (defined(CONFIG_HDLC_MODULE) && defined(CONFIG_SYNCLINK_GT_MODULE)) 85#if defined(CONFIG_HDLC) || (defined(CONFIG_HDLC_MODULE) && defined(CONFIG_SYNCLINK_GT_MODULE))
87#define SYNCLINK_GENERIC_HDLC 1 86#define SYNCLINK_GENERIC_HDLC 1
88#else 87#else
@@ -2040,37 +2039,41 @@ static void bh_transmit(struct slgt_info *info)
2040 tty_wakeup(tty); 2039 tty_wakeup(tty);
2041} 2040}
2042 2041
2043static void dsr_change(struct slgt_info *info) 2042static void dsr_change(struct slgt_info *info, unsigned short status)
2044{ 2043{
2045 get_signals(info); 2044 if (status & BIT3) {
2045 info->signals |= SerialSignal_DSR;
2046 info->input_signal_events.dsr_up++;
2047 } else {
2048 info->signals &= ~SerialSignal_DSR;
2049 info->input_signal_events.dsr_down++;
2050 }
2046 DBGISR(("dsr_change %s signals=%04X\n", info->device_name, info->signals)); 2051 DBGISR(("dsr_change %s signals=%04X\n", info->device_name, info->signals));
2047 if ((info->dsr_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) { 2052 if ((info->dsr_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) {
2048 slgt_irq_off(info, IRQ_DSR); 2053 slgt_irq_off(info, IRQ_DSR);
2049 return; 2054 return;
2050 } 2055 }
2051 info->icount.dsr++; 2056 info->icount.dsr++;
2052 if (info->signals & SerialSignal_DSR)
2053 info->input_signal_events.dsr_up++;
2054 else
2055 info->input_signal_events.dsr_down++;
2056 wake_up_interruptible(&info->status_event_wait_q); 2057 wake_up_interruptible(&info->status_event_wait_q);
2057 wake_up_interruptible(&info->event_wait_q); 2058 wake_up_interruptible(&info->event_wait_q);
2058 info->pending_bh |= BH_STATUS; 2059 info->pending_bh |= BH_STATUS;
2059} 2060}
2060 2061
2061static void cts_change(struct slgt_info *info) 2062static void cts_change(struct slgt_info *info, unsigned short status)
2062{ 2063{
2063 get_signals(info); 2064 if (status & BIT2) {
2065 info->signals |= SerialSignal_CTS;
2066 info->input_signal_events.cts_up++;
2067 } else {
2068 info->signals &= ~SerialSignal_CTS;
2069 info->input_signal_events.cts_down++;
2070 }
2064 DBGISR(("cts_change %s signals=%04X\n", info->device_name, info->signals)); 2071 DBGISR(("cts_change %s signals=%04X\n", info->device_name, info->signals));
2065 if ((info->cts_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) { 2072 if ((info->cts_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) {
2066 slgt_irq_off(info, IRQ_CTS); 2073 slgt_irq_off(info, IRQ_CTS);
2067 return; 2074 return;
2068 } 2075 }
2069 info->icount.cts++; 2076 info->icount.cts++;
2070 if (info->signals & SerialSignal_CTS)
2071 info->input_signal_events.cts_up++;
2072 else
2073 info->input_signal_events.cts_down++;
2074 wake_up_interruptible(&info->status_event_wait_q); 2077 wake_up_interruptible(&info->status_event_wait_q);
2075 wake_up_interruptible(&info->event_wait_q); 2078 wake_up_interruptible(&info->event_wait_q);
2076 info->pending_bh |= BH_STATUS; 2079 info->pending_bh |= BH_STATUS;
@@ -2091,20 +2094,21 @@ static void cts_change(struct slgt_info *info)
2091 } 2094 }
2092} 2095}
2093 2096
2094static void dcd_change(struct slgt_info *info) 2097static void dcd_change(struct slgt_info *info, unsigned short status)
2095{ 2098{
2096 get_signals(info); 2099 if (status & BIT1) {
2100 info->signals |= SerialSignal_DCD;
2101 info->input_signal_events.dcd_up++;
2102 } else {
2103 info->signals &= ~SerialSignal_DCD;
2104 info->input_signal_events.dcd_down++;
2105 }
2097 DBGISR(("dcd_change %s signals=%04X\n", info->device_name, info->signals)); 2106 DBGISR(("dcd_change %s signals=%04X\n", info->device_name, info->signals));
2098 if ((info->dcd_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) { 2107 if ((info->dcd_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) {
2099 slgt_irq_off(info, IRQ_DCD); 2108 slgt_irq_off(info, IRQ_DCD);
2100 return; 2109 return;
2101 } 2110 }
2102 info->icount.dcd++; 2111 info->icount.dcd++;
2103 if (info->signals & SerialSignal_DCD) {
2104 info->input_signal_events.dcd_up++;
2105 } else {
2106 info->input_signal_events.dcd_down++;
2107 }
2108#if SYNCLINK_GENERIC_HDLC 2112#if SYNCLINK_GENERIC_HDLC
2109 if (info->netcount) { 2113 if (info->netcount) {
2110 if (info->signals & SerialSignal_DCD) 2114 if (info->signals & SerialSignal_DCD)
@@ -2127,20 +2131,21 @@ static void dcd_change(struct slgt_info *info)
2127 } 2131 }
2128} 2132}
2129 2133
2130static void ri_change(struct slgt_info *info) 2134static void ri_change(struct slgt_info *info, unsigned short status)
2131{ 2135{
2132 get_signals(info); 2136 if (status & BIT0) {
2137 info->signals |= SerialSignal_RI;
2138 info->input_signal_events.ri_up++;
2139 } else {
2140 info->signals &= ~SerialSignal_RI;
2141 info->input_signal_events.ri_down++;
2142 }
2133 DBGISR(("ri_change %s signals=%04X\n", info->device_name, info->signals)); 2143 DBGISR(("ri_change %s signals=%04X\n", info->device_name, info->signals));
2134 if ((info->ri_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) { 2144 if ((info->ri_chkcount)++ == IO_PIN_SHUTDOWN_LIMIT) {
2135 slgt_irq_off(info, IRQ_RI); 2145 slgt_irq_off(info, IRQ_RI);
2136 return; 2146 return;
2137 } 2147 }
2138 info->icount.dcd++; 2148 info->icount.rng++;
2139 if (info->signals & SerialSignal_RI) {
2140 info->input_signal_events.ri_up++;
2141 } else {
2142 info->input_signal_events.ri_down++;
2143 }
2144 wake_up_interruptible(&info->status_event_wait_q); 2149 wake_up_interruptible(&info->status_event_wait_q);
2145 wake_up_interruptible(&info->event_wait_q); 2150 wake_up_interruptible(&info->event_wait_q);
2146 info->pending_bh |= BH_STATUS; 2151 info->pending_bh |= BH_STATUS;
@@ -2191,13 +2196,13 @@ static void isr_serial(struct slgt_info *info)
2191 } 2196 }
2192 2197
2193 if (status & IRQ_DSR) 2198 if (status & IRQ_DSR)
2194 dsr_change(info); 2199 dsr_change(info, status);
2195 if (status & IRQ_CTS) 2200 if (status & IRQ_CTS)
2196 cts_change(info); 2201 cts_change(info, status);
2197 if (status & IRQ_DCD) 2202 if (status & IRQ_DCD)
2198 dcd_change(info); 2203 dcd_change(info, status);
2199 if (status & IRQ_RI) 2204 if (status & IRQ_RI)
2200 ri_change(info); 2205 ri_change(info, status);
2201} 2206}
2202 2207
2203static void isr_rdma(struct slgt_info *info) 2208static void isr_rdma(struct slgt_info *info)