提交 d2fbd0f2 编写于 作者: A Alan Cox 提交者: Linus Torvalds

specialix: Code cleanups

Go through the inlines and other oddments that are iffy. Remove various bits
of dead code and bogus debug. Turn the crtsdts compile time option into a
runtime switch.
Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 a72492bd
...@@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is: ...@@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is:
Hardware handshaking issues. Hardware handshaking issues.
============================ ============================
The driver can be compiled in two different ways. The default The driver can be told to operate in two different ways. The default
("Specialix DTR/RTS pin is RTS" is off) the pin behaves as DTR when behaviour is specialix.sx_rtscts = 0 where the pin behaves as DTR when
hardware handshaking is off. It behaves as the RTS hardware hardware handshaking is off. It behaves as the RTS hardware
handshaking signal when hardware handshaking is selected. handshaking signal when hardware handshaking is selected.
...@@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with ...@@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with
software handshaking. So switching on the fly is not really an software handshaking. So switching on the fly is not really an
option. option.
I actually prefer to use the "Specialix DTR/RTS pin is RTS" option. I actually prefer to use the "specialix.sx_rtscts=1" option.
This makes the DTR/RTS pin always an RTS pin, and ioctls to This makes the DTR/RTS pin always an RTS pin, and ioctls to
change DTR are always ignored. I have a cable that is configured change DTR are always ignored. I have a cable that is configured
for this. for this.
...@@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card. ...@@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card.
You have to WRITE to the address register to even You have to WRITE to the address register to even
read-probe a CD186x register. Disable autodetection? read-probe a CD186x register. Disable autodetection?
-- Specialix: any suggestions? -- Specialix: any suggestions?
- Arbitrary baud rates are not implemented yet.
If you need this, bug me about it.
...@@ -300,16 +300,6 @@ config SPECIALIX ...@@ -300,16 +300,6 @@ config SPECIALIX
and compile this driver as kernel loadable module which will be and compile this driver as kernel loadable module which will be
called specialix. called specialix.
config SPECIALIX_RTSCTS
bool "Specialix DTR/RTS pin is RTS"
depends on SPECIALIX
help
The Specialix IO8+ card can only support either RTS or DTR. If you
say N here, the driver will use the pin as "DTR" when the tty is in
software handshake mode. If you say Y here or hardware handshake is
on, it will always be RTS. Read the file
<file:Documentation/specialix.txt> for more information.
config SX config SX
tristate "Specialix SX (and SI) card support" tristate "Specialix SX (and SI) card support"
depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
......
...@@ -110,6 +110,7 @@ ...@@ -110,6 +110,7 @@
static int sx_debug; static int sx_debug;
static int sx_rxfifo = SPECIALIX_RXFIFO; static int sx_rxfifo = SPECIALIX_RXFIFO;
static int sx_rtscts;
#ifdef DEBUG #ifdef DEBUG
#define dprintk(f, str...) if (sx_debug & f) printk(str) #define dprintk(f, str...) if (sx_debug & f) printk(str)
...@@ -134,25 +135,12 @@ static int sx_rxfifo = SPECIALIX_RXFIFO; ...@@ -134,25 +135,12 @@ static int sx_rxfifo = SPECIALIX_RXFIFO;
#define func_enter() dprintk(SX_DEBUG_FLOW, "io8: enter %s\n", __func__) #define func_enter() dprintk(SX_DEBUG_FLOW, "io8: enter %s\n", __func__)
#define func_exit() dprintk(SX_DEBUG_FLOW, "io8: exit %s\n", __func__) #define func_exit() dprintk(SX_DEBUG_FLOW, "io8: exit %s\n", __func__)
#define jiffies_from_ms(a) ((((a) * HZ)/1000)+1)
/* Configurable options: */ /* Configurable options: */
/* Am I paranoid or not ? ;-) */ /* Am I paranoid or not ? ;-) */
#define SPECIALIX_PARANOIA_CHECK #define SPECIALIX_PARANOIA_CHECK
/* Do I trust the IRQ from the card? (enabeling it doesn't seem to help)
When the IRQ routine leaves the chip in a state that is keeps on
requiring attention, the timer doesn't help either. */
#undef SPECIALIX_TIMER
#ifdef SPECIALIX_TIMER
static int sx_poll = HZ;
#endif
/* /*
* The following defines are mostly for testing purposes. But if you need * The following defines are mostly for testing purposes. But if you need
* some nice reporting in your syslog, you can define them also. * some nice reporting in your syslog, you can define them also.
...@@ -162,16 +150,6 @@ static int sx_poll = HZ; ...@@ -162,16 +150,6 @@ static int sx_poll = HZ;
#ifdef CONFIG_SPECIALIX_RTSCTS
#define SX_CRTSCTS(bla) 1
#else
#define SX_CRTSCTS(tty) C_CRTSCTS(tty)
#endif
/* Used to be outb(0xff, 0x80); */
#define short_pause() udelay(1)
#define SPECIALIX_LEGAL_FLAGS \ #define SPECIALIX_LEGAL_FLAGS \
(ASYNC_HUP_NOTIFY | ASYNC_SAK | ASYNC_SPLIT_TERMIOS | \ (ASYNC_HUP_NOTIFY | ASYNC_SAK | ASYNC_SPLIT_TERMIOS | \
...@@ -190,14 +168,7 @@ static struct specialix_board sx_board[SX_NBOARD] = { ...@@ -190,14 +168,7 @@ static struct specialix_board sx_board[SX_NBOARD] = {
static struct specialix_port sx_port[SX_NBOARD * SX_NPORT]; static struct specialix_port sx_port[SX_NBOARD * SX_NPORT];
#ifdef SPECIALIX_TIMER static int sx_paranoia_check(struct specialix_port const *port,
static struct timer_list missed_irq_timer;
static irqreturn_t sx_interrupt(int irq, void *dev_id);
#endif
static inline int sx_paranoia_check(struct specialix_port const *port,
char *name, const char *routine) char *name, const char *routine)
{ {
#ifdef SPECIALIX_PARANOIA_CHECK #ifdef SPECIALIX_PARANOIA_CHECK
...@@ -288,7 +259,7 @@ static inline void sx_out_off(struct specialix_board *bp, ...@@ -288,7 +259,7 @@ static inline void sx_out_off(struct specialix_board *bp,
/* Wait for Channel Command Register ready */ /* Wait for Channel Command Register ready */
static inline void sx_wait_CCR(struct specialix_board *bp) static void sx_wait_CCR(struct specialix_board *bp)
{ {
unsigned long delay, flags; unsigned long delay, flags;
unsigned char ccr; unsigned char ccr;
...@@ -307,7 +278,7 @@ static inline void sx_wait_CCR(struct specialix_board *bp) ...@@ -307,7 +278,7 @@ static inline void sx_wait_CCR(struct specialix_board *bp)
/* Wait for Channel Command Register ready */ /* Wait for Channel Command Register ready */
static inline void sx_wait_CCR_off(struct specialix_board *bp) static void sx_wait_CCR_off(struct specialix_board *bp)
{ {
unsigned long delay; unsigned long delay;
unsigned char crr; unsigned char crr;
...@@ -330,7 +301,7 @@ static inline void sx_wait_CCR_off(struct specialix_board *bp) ...@@ -330,7 +301,7 @@ static inline void sx_wait_CCR_off(struct specialix_board *bp)
* specialix IO8+ IO range functions. * specialix IO8+ IO range functions.
*/ */
static inline int sx_request_io_range(struct specialix_board *bp) static int sx_request_io_range(struct specialix_board *bp)
{ {
return request_region(bp->base, return request_region(bp->base,
bp->flags & SX_BOARD_IS_PCI ? SX_PCI_IO_SPACE : SX_IO_SPACE, bp->flags & SX_BOARD_IS_PCI ? SX_PCI_IO_SPACE : SX_IO_SPACE,
...@@ -338,7 +309,7 @@ static inline int sx_request_io_range(struct specialix_board *bp) ...@@ -338,7 +309,7 @@ static inline int sx_request_io_range(struct specialix_board *bp)
} }
static inline void sx_release_io_range(struct specialix_board *bp) static void sx_release_io_range(struct specialix_board *bp)
{ {
release_region(bp->base, bp->flags & SX_BOARD_IS_PCI ? release_region(bp->base, bp->flags & SX_BOARD_IS_PCI ?
SX_PCI_IO_SPACE : SX_IO_SPACE); SX_PCI_IO_SPACE : SX_IO_SPACE);
...@@ -440,36 +411,10 @@ static int read_cross_byte(struct specialix_board *bp, int reg, int bit) ...@@ -440,36 +411,10 @@ static int read_cross_byte(struct specialix_board *bp, int reg, int bit)
} }
#ifdef SPECIALIX_TIMER
void missed_irq(unsigned long data)
{
unsigned char irq;
unsigned long flags;
struct specialix_board *bp = (struct specialix_board *)data;
spin_lock_irqsave(&bp->lock, flags);
irq = sx_in((struct specialix_board *)data, CD186x_SRSR) &
(SRSR_RREQint | SRSR_TREQint | SRSR_MREQint);
spin_unlock_irqrestore(&bp->lock, flags);
if (irq) {
printk(KERN_INFO
"Missed interrupt... Calling int from timer. \n");
sx_interrupt(-1, bp);
}
mod_timer(&missed_irq_timer, jiffies + sx_poll);
}
#endif
/* Main probing routine, also sets irq. */ /* Main probing routine, also sets irq. */
static int sx_probe(struct specialix_board *bp) static int sx_probe(struct specialix_board *bp)
{ {
unsigned char val1, val2; unsigned char val1, val2;
#if 0
int irqs = 0;
int retries;
#endif
int rev; int rev;
int chip; int chip;
...@@ -482,15 +427,15 @@ static int sx_probe(struct specialix_board *bp) ...@@ -482,15 +427,15 @@ static int sx_probe(struct specialix_board *bp)
/* Are the I/O ports here ? */ /* Are the I/O ports here ? */
sx_out_off(bp, CD186x_PPRL, 0x5a); sx_out_off(bp, CD186x_PPRL, 0x5a);
short_pause(); udelay(1);
val1 = sx_in_off(bp, CD186x_PPRL); val1 = sx_in_off(bp, CD186x_PPRL);
sx_out_off(bp, CD186x_PPRL, 0xa5); sx_out_off(bp, CD186x_PPRL, 0xa5);
short_pause(); udelay(1);
val2 = sx_in_off(bp, CD186x_PPRL); val2 = sx_in_off(bp, CD186x_PPRL);
if ((val1 != 0x5a) || (val2 != 0xa5)) { if (val1 != 0x5a || val2 != 0xa5) {
printk(KERN_INFO printk(KERN_INFO
"sx%d: specialix IO8+ Board at 0x%03x not found.\n", "sx%d: specialix IO8+ Board at 0x%03x not found.\n",
board_No(bp), bp->base); board_No(bp), bp->base);
...@@ -522,50 +467,6 @@ static int sx_probe(struct specialix_board *bp) ...@@ -522,50 +467,6 @@ static int sx_probe(struct specialix_board *bp)
} }
#if 0
/* It's time to find IRQ for this board */
for (retries = 0; retries < 5 && irqs <= 0; retries++) {
irqs = probe_irq_on();
sx_init_CD186x(bp); /* Reset CD186x chip */
sx_out(bp, CD186x_CAR, 2); /* Select port 2 */
sx_wait_CCR(bp);
sx_out(bp, CD186x_CCR, CCR_TXEN); /* Enable transmitter */
sx_out(bp, CD186x_IER, IER_TXRDY); /* Enable tx empty intr */
msleep(50);
irqs = probe_irq_off(irqs);
dprintk(SX_DEBUG_INIT, "SRSR = %02x, ", sx_in(bp, CD186x_SRSR));
dprintk(SX_DEBUG_INIT, "TRAR = %02x, ", sx_in(bp, CD186x_TRAR));
dprintk(SX_DEBUG_INIT, "GIVR = %02x, ", sx_in(bp, CD186x_GIVR));
dprintk(SX_DEBUG_INIT, "GICR = %02x, ", sx_in(bp, CD186x_GICR));
dprintk(SX_DEBUG_INIT, "\n");
/* Reset CD186x again */
if (!sx_init_CD186x(bp)) {
/* Hmmm. This is dead code anyway. */
}
dprintk(SX_DEBUG_INIT
"val1 = %02x, val2 = %02x, val3 = %02x.\n",
val1, val2, val3);
}
#if 0
if (irqs <= 0) {
printk(KERN_ERR
"sx%d: Can't find IRQ for specialix IO8+ board at 0x%03x.\n",
board_No(bp), bp->base);
sx_release_io_range(bp);
func_exit();
return 1;
}
#endif
printk(KERN_INFO "Started with irq=%d, but now have irq=%d.\n",
bp->irq, irqs);
if (irqs > 0)
bp->irq = irqs;
#endif
/* Reset CD186x again */ /* Reset CD186x again */
if (!sx_init_CD186x(bp)) { if (!sx_init_CD186x(bp)) {
sx_release_io_range(bp); sx_release_io_range(bp);
...@@ -610,11 +511,6 @@ static int sx_probe(struct specialix_board *bp) ...@@ -610,11 +511,6 @@ static int sx_probe(struct specialix_board *bp)
dprintk(SX_DEBUG_INIT, " GFCR = 0x%02x\n", sx_in_off(bp, CD186x_GFRCR)); dprintk(SX_DEBUG_INIT, " GFCR = 0x%02x\n", sx_in_off(bp, CD186x_GFRCR));
#ifdef SPECIALIX_TIMER
setup_timer(&missed_irq_timer, missed_irq, (unsigned long)bp);
mod_timer(&missed_irq_timer, jiffies + sx_poll);
#endif
printk(KERN_INFO printk(KERN_INFO
"sx%d: specialix IO8+ board detected at 0x%03x, IRQ %d, CD%d Rev. %c.\n", "sx%d: specialix IO8+ board detected at 0x%03x, IRQ %d, CD%d Rev. %c.\n",
board_No(bp), bp->base, bp->irq, chip, rev); board_No(bp), bp->base, bp->irq, chip, rev);
...@@ -628,7 +524,7 @@ static int sx_probe(struct specialix_board *bp) ...@@ -628,7 +524,7 @@ static int sx_probe(struct specialix_board *bp)
* Interrupt processing routines. * Interrupt processing routines.
* */ * */
static inline struct specialix_port *sx_get_port(struct specialix_board *bp, static struct specialix_port *sx_get_port(struct specialix_board *bp,
unsigned char const *what) unsigned char const *what)
{ {
unsigned char channel; unsigned char channel;
...@@ -654,7 +550,7 @@ static inline struct specialix_port *sx_get_port(struct specialix_board *bp, ...@@ -654,7 +550,7 @@ static inline struct specialix_port *sx_get_port(struct specialix_board *bp,
} }
static inline void sx_receive_exc(struct specialix_board *bp) static void sx_receive_exc(struct specialix_board *bp)
{ {
struct specialix_port *port; struct specialix_port *port;
struct tty_struct *tty; struct tty_struct *tty;
...@@ -729,7 +625,7 @@ static inline void sx_receive_exc(struct specialix_board *bp) ...@@ -729,7 +625,7 @@ static inline void sx_receive_exc(struct specialix_board *bp)
} }
static inline void sx_receive(struct specialix_board *bp) static void sx_receive(struct specialix_board *bp)
{ {
struct specialix_port *port; struct specialix_port *port;
struct tty_struct *tty; struct tty_struct *tty;
...@@ -758,7 +654,7 @@ static inline void sx_receive(struct specialix_board *bp) ...@@ -758,7 +654,7 @@ static inline void sx_receive(struct specialix_board *bp)
} }
static inline void sx_transmit(struct specialix_board *bp) static void sx_transmit(struct specialix_board *bp)
{ {
struct specialix_port *port; struct specialix_port *port;
struct tty_struct *tty; struct tty_struct *tty;
...@@ -838,7 +734,7 @@ static inline void sx_transmit(struct specialix_board *bp) ...@@ -838,7 +734,7 @@ static inline void sx_transmit(struct specialix_board *bp)
} }
static inline void sx_check_modem(struct specialix_board *bp) static void sx_check_modem(struct specialix_board *bp)
{ {
struct specialix_port *port; struct specialix_port *port;
struct tty_struct *tty; struct tty_struct *tty;
...@@ -853,7 +749,6 @@ static inline void sx_check_modem(struct specialix_board *bp) ...@@ -853,7 +749,6 @@ static inline void sx_check_modem(struct specialix_board *bp)
tty = port->port.tty; tty = port->port.tty;
mcr = sx_in(bp, CD186x_MCR); mcr = sx_in(bp, CD186x_MCR);
printk("mcr = %02x.\n", mcr); /* FIXME */
if ((mcr & MCR_CDCHG)) { if ((mcr & MCR_CDCHG)) {
dprintk(SX_DEBUG_SIGNALS, "CD just changed... "); dprintk(SX_DEBUG_SIGNALS, "CD just changed... ");
...@@ -983,13 +878,6 @@ static void turn_ints_off(struct specialix_board *bp) ...@@ -983,13 +878,6 @@ static void turn_ints_off(struct specialix_board *bp)
unsigned long flags; unsigned long flags;
func_enter(); func_enter();
if (bp->flags & SX_BOARD_IS_PCI) {
/* This was intended for enabeling the interrupt on the
* PCI card. However it seems that it's already enabled
* and as PCI interrupts can be shared, there is no real
* reason to have to turn it off. */
}
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
(void) sx_in_off(bp, 0); /* Turn off interrupts. */ (void) sx_in_off(bp, 0); /* Turn off interrupts. */
spin_unlock_irqrestore(&bp->lock, flags); spin_unlock_irqrestore(&bp->lock, flags);
...@@ -1003,9 +891,6 @@ static void turn_ints_on(struct specialix_board *bp) ...@@ -1003,9 +891,6 @@ static void turn_ints_on(struct specialix_board *bp)
func_enter(); func_enter();
if (bp->flags & SX_BOARD_IS_PCI) {
/* play with the PCI chip. See comment above. */
}
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
(void) sx_in(bp, 0); /* Turn ON interrupts. */ (void) sx_in(bp, 0); /* Turn ON interrupts. */
spin_unlock_irqrestore(&bp->lock, flags); spin_unlock_irqrestore(&bp->lock, flags);
...@@ -1015,7 +900,7 @@ static void turn_ints_on(struct specialix_board *bp) ...@@ -1015,7 +900,7 @@ static void turn_ints_on(struct specialix_board *bp)
/* Called with disabled interrupts */ /* Called with disabled interrupts */
static inline int sx_setup_board(struct specialix_board *bp) static int sx_setup_board(struct specialix_board *bp)
{ {
int error; int error;
...@@ -1040,7 +925,7 @@ static inline int sx_setup_board(struct specialix_board *bp) ...@@ -1040,7 +925,7 @@ static inline int sx_setup_board(struct specialix_board *bp)
/* Called with disabled interrupts */ /* Called with disabled interrupts */
static inline void sx_shutdown_board(struct specialix_board *bp) static void sx_shutdown_board(struct specialix_board *bp)
{ {
func_enter(); func_enter();
...@@ -1058,6 +943,12 @@ static inline void sx_shutdown_board(struct specialix_board *bp) ...@@ -1058,6 +943,12 @@ static inline void sx_shutdown_board(struct specialix_board *bp)
func_exit(); func_exit();
} }
static unsigned int sx_crtscts(struct tty_struct *tty)
{
if (sx_rtscts)
return C_CRTSCTS(tty);
return 1;
}
/* /*
* Setting up port characteristics. * Setting up port characteristics.
...@@ -1090,7 +981,7 @@ static void sx_change_speed(struct specialix_board *bp, ...@@ -1090,7 +981,7 @@ static void sx_change_speed(struct specialix_board *bp,
/* The Specialix board doens't implement the RTS lines. /* The Specialix board doens't implement the RTS lines.
They are used to set the IRQ level. Don't touch them. */ They are used to set the IRQ level. Don't touch them. */
if (SX_CRTSCTS(tty)) if (sx_crtscts(tty))
port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS); port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
else else
port->MSVR = (sx_in(bp, CD186x_MSVR) & MSVR_RTS); port->MSVR = (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
...@@ -1108,7 +999,7 @@ static void sx_change_speed(struct specialix_board *bp, ...@@ -1108,7 +999,7 @@ static void sx_change_speed(struct specialix_board *bp,
if (!baud) { if (!baud) {
/* Drop DTR & exit */ /* Drop DTR & exit */
dprintk(SX_DEBUG_TERMIOS, "Dropping DTR... Hmm....\n"); dprintk(SX_DEBUG_TERMIOS, "Dropping DTR... Hmm....\n");
if (!SX_CRTSCTS(tty)) { if (!sx_crtscts(tty)) {
port->MSVR &= ~MSVR_DTR; port->MSVR &= ~MSVR_DTR;
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
sx_out(bp, CD186x_MSVR, port->MSVR); sx_out(bp, CD186x_MSVR, port->MSVR);
...@@ -1118,7 +1009,7 @@ static void sx_change_speed(struct specialix_board *bp, ...@@ -1118,7 +1009,7 @@ static void sx_change_speed(struct specialix_board *bp,
return; return;
} else { } else {
/* Set DTR on */ /* Set DTR on */
if (!SX_CRTSCTS(tty)) if (!sx_crtscts(tty))
port->MSVR |= MSVR_DTR; port->MSVR |= MSVR_DTR;
} }
...@@ -1448,7 +1339,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, ...@@ -1448,7 +1339,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
sx_out(bp, CD186x_CAR, port_No(port)); sx_out(bp, CD186x_CAR, port_No(port));
CD = sx_in(bp, CD186x_MSVR) & MSVR_CD; CD = sx_in(bp, CD186x_MSVR) & MSVR_CD;
if (SX_CRTSCTS(tty)) { if (sx_crtscts(tty)) {
/* Activate RTS */ /* Activate RTS */
port->MSVR |= MSVR_DTR; /* WTF? */ port->MSVR |= MSVR_DTR; /* WTF? */
sx_out(bp, CD186x_MSVR, port->MSVR); sx_out(bp, CD186x_MSVR, port->MSVR);
...@@ -1600,7 +1491,7 @@ static void sx_close(struct tty_struct *tty, struct file *filp) ...@@ -1600,7 +1491,7 @@ static void sx_close(struct tty_struct *tty, struct file *filp)
} }
bp = port_Board(port); bp = port_Board(port);
if ((tty->count == 1) && (port->port.count != 1)) { if (tty->count == 1 && port->port.count != 1) {
printk(KERN_ERR "sx%d: sx_close: bad port count;" printk(KERN_ERR "sx%d: sx_close: bad port count;"
" tty->count is 1, port count is %d\n", " tty->count is 1, port count is %d\n",
board_No(bp), port->port.count); board_No(bp), port->port.count);
...@@ -1868,17 +1759,15 @@ static int sx_tiocmget(struct tty_struct *tty, struct file *file) ...@@ -1868,17 +1759,15 @@ static int sx_tiocmget(struct tty_struct *tty, struct file *file)
dprintk(SX_DEBUG_INIT, "Got msvr[%d] = %02x, car = %d.\n", dprintk(SX_DEBUG_INIT, "Got msvr[%d] = %02x, car = %d.\n",
port_No(port), status, sx_in(bp, CD186x_CAR)); port_No(port), status, sx_in(bp, CD186x_CAR));
dprintk(SX_DEBUG_INIT, "sx_port = %p, port = %p\n", sx_port, port); dprintk(SX_DEBUG_INIT, "sx_port = %p, port = %p\n", sx_port, port);
if (SX_CRTSCTS(port->port.tty)) { if (sx_crtscts(port->port.tty)) {
result = /* (status & MSVR_RTS) ? */ TIOCM_DTR /* : 0) */ result = TIOCM_DTR | TIOCM_DSR
| ((status & MSVR_DTR) ? TIOCM_RTS : 0) | ((status & MSVR_DTR) ? TIOCM_RTS : 0)
| ((status & MSVR_CD) ? TIOCM_CAR : 0) | ((status & MSVR_CD) ? TIOCM_CAR : 0)
|/* ((status & MSVR_DSR) ? */ TIOCM_DSR /* : 0) */
| ((status & MSVR_CTS) ? TIOCM_CTS : 0); | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
} else { } else {
result = /* (status & MSVR_RTS) ? */ TIOCM_RTS /* : 0) */ result = TIOCM_RTS | TIOCM_DSR
| ((status & MSVR_DTR) ? TIOCM_DTR : 0) | ((status & MSVR_DTR) ? TIOCM_DTR : 0)
| ((status & MSVR_CD) ? TIOCM_CAR : 0) | ((status & MSVR_CD) ? TIOCM_CAR : 0)
|/* ((status & MSVR_DSR) ? */ TIOCM_DSR /* : 0) */
| ((status & MSVR_CTS) ? TIOCM_CTS : 0); | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
} }
...@@ -1905,24 +1794,14 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file, ...@@ -1905,24 +1794,14 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
bp = port_Board(port); bp = port_Board(port);
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
/* if (set & TIOCM_RTS) if (sx_crtscts(port->port.tty)) {
port->MSVR |= MSVR_RTS; */
/* if (set & TIOCM_DTR)
port->MSVR |= MSVR_DTR; */
if (SX_CRTSCTS(port->port.tty)) {
if (set & TIOCM_RTS) if (set & TIOCM_RTS)
port->MSVR |= MSVR_DTR; port->MSVR |= MSVR_DTR;
} else { } else {
if (set & TIOCM_DTR) if (set & TIOCM_DTR)
port->MSVR |= MSVR_DTR; port->MSVR |= MSVR_DTR;
} }
if (sx_crtscts(port->port.tty)) {
/* if (clear & TIOCM_RTS)
port->MSVR &= ~MSVR_RTS; */
/* if (clear & TIOCM_DTR)
port->MSVR &= ~MSVR_DTR; */
if (SX_CRTSCTS(port->port.tty)) {
if (clear & TIOCM_RTS) if (clear & TIOCM_RTS)
port->MSVR &= ~MSVR_DTR; port->MSVR &= ~MSVR_DTR;
} else { } else {
...@@ -1939,7 +1818,7 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file, ...@@ -1939,7 +1818,7 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
} }
static inline void sx_send_break(struct specialix_port *port, static void sx_send_break(struct specialix_port *port,
unsigned long length) unsigned long length)
{ {
struct specialix_board *bp = port_Board(port); struct specialix_board *bp = port_Board(port);
...@@ -1967,7 +1846,7 @@ static inline void sx_send_break(struct specialix_port *port, ...@@ -1967,7 +1846,7 @@ static inline void sx_send_break(struct specialix_port *port,
} }
static inline int sx_set_serial_info(struct specialix_port *port, static int sx_set_serial_info(struct specialix_port *port,
struct serial_struct __user *newinfo) struct serial_struct __user *newinfo)
{ {
struct serial_struct tmp; struct serial_struct tmp;
...@@ -2015,7 +1894,7 @@ static inline int sx_set_serial_info(struct specialix_port *port, ...@@ -2015,7 +1894,7 @@ static inline int sx_set_serial_info(struct specialix_port *port,
} }
static inline int sx_get_serial_info(struct specialix_port *port, static int sx_get_serial_info(struct specialix_port *port,
struct serial_struct __user *retinfo) struct serial_struct __user *retinfo)
{ {
struct serial_struct tmp; struct serial_struct tmp;
...@@ -2112,7 +1991,7 @@ static void sx_throttle(struct tty_struct *tty) ...@@ -2112,7 +1991,7 @@ static void sx_throttle(struct tty_struct *tty)
bp = port_Board(port); bp = port_Board(port);
/* Use DTR instead of RTS ! */ /* Use DTR instead of RTS ! */
if (SX_CRTSCTS(tty)) if (sx_crtscts(tty))
port->MSVR &= ~MSVR_DTR; port->MSVR &= ~MSVR_DTR;
else { else {
/* Auch!!! I think the system shouldn't call this then. */ /* Auch!!! I think the system shouldn't call this then. */
...@@ -2158,7 +2037,7 @@ static void sx_unthrottle(struct tty_struct *tty) ...@@ -2158,7 +2037,7 @@ static void sx_unthrottle(struct tty_struct *tty)
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
/* XXXX Use DTR INSTEAD???? */ /* XXXX Use DTR INSTEAD???? */
if (SX_CRTSCTS(tty)) if (sx_crtscts(tty))
port->MSVR |= MSVR_DTR; port->MSVR |= MSVR_DTR;
/* Else clause: see remark in "sx_throttle"... */ /* Else clause: see remark in "sx_throttle"... */
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
...@@ -2381,11 +2260,11 @@ static int __init specialix_init(void) ...@@ -2381,11 +2260,11 @@ static int __init specialix_init(void)
printk(KERN_INFO "sx: Specialix IO8+ driver v" VERSION ", (c) R.E.Wolff 1997/1998.\n"); printk(KERN_INFO "sx: Specialix IO8+ driver v" VERSION ", (c) R.E.Wolff 1997/1998.\n");
printk(KERN_INFO "sx: derived from work (c) D.Gorodchanin 1994-1996.\n"); printk(KERN_INFO "sx: derived from work (c) D.Gorodchanin 1994-1996.\n");
#ifdef CONFIG_SPECIALIX_RTSCTS if (sx_rtscts)
printk(KERN_INFO "sx: DTR/RTS pin is always RTS.\n"); printk(KERN_INFO
#else "sx: DTR/RTS pin is RTS when CRTSCTS is on.\n");
printk(KERN_INFO "sx: DTR/RTS pin is RTS when CRTSCTS is on.\n"); else
#endif printk(KERN_INFO "sx: DTR/RTS pin is always RTS.\n");
for (i = 0; i < SX_NBOARD; i++) for (i = 0; i < SX_NBOARD; i++)
spin_lock_init(&sx_board[i].lock); spin_lock_init(&sx_board[i].lock);
...@@ -2443,16 +2322,13 @@ static int __init specialix_init(void) ...@@ -2443,16 +2322,13 @@ static int __init specialix_init(void)
} }
static int iobase[SX_NBOARD] = {0,}; static int iobase[SX_NBOARD] = {0,};
static int irq[SX_NBOARD] = {0,};
static int irq [SX_NBOARD] = {0,};
module_param_array(iobase, int, NULL, 0); module_param_array(iobase, int, NULL, 0);
module_param_array(irq, int, NULL, 0); module_param_array(irq, int, NULL, 0);
module_param(sx_debug, int, 0); module_param(sx_debug, int, 0);
module_param(sx_rtscts, int, 0);
module_param(sx_rxfifo, int, 0); module_param(sx_rxfifo, int, 0);
#ifdef SPECIALIX_TIMER
module_param(sx_poll, int, 0);
#endif
/* /*
* You can setup up to 4 boards. * You can setup up to 4 boards.
...@@ -2492,10 +2368,6 @@ static void __exit specialix_exit_module(void) ...@@ -2492,10 +2368,6 @@ static void __exit specialix_exit_module(void)
for (i = 0; i < SX_NBOARD; i++) for (i = 0; i < SX_NBOARD; i++)
if (sx_board[i].flags & SX_BOARD_PRESENT) if (sx_board[i].flags & SX_BOARD_PRESENT)
sx_release_io_range(&sx_board[i]); sx_release_io_range(&sx_board[i]);
#ifdef SPECIALIX_TIMER
del_timer_sync(&missed_irq_timer);
#endif
func_exit(); func_exit();
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册