diff options
Diffstat (limited to 'drivers/char/synclink_gt.c')
-rw-r--r-- | drivers/char/synclink_gt.c | 71 |
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 | ||
2043 | static void dsr_change(struct slgt_info *info) | 2042 | static 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 | ||
2061 | static void cts_change(struct slgt_info *info) | 2062 | static 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 | ||
2094 | static void dcd_change(struct slgt_info *info) | 2097 | static 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 | ||
2130 | static void ri_change(struct slgt_info *info) | 2134 | static 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 | ||
2203 | static void isr_rdma(struct slgt_info *info) | 2208 | static void isr_rdma(struct slgt_info *info) |