* can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
@ 2005-06-28 0:06 rolf liu
2005-06-28 8:16 ` Jon Anders Haugum
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: rolf liu @ 2005-06-28 0:06 UTC (permalink / raw)
To: linux-mips
I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
starts up ok. but after start-up, I can't find the corresponding
interrupt number for this board, which is irq 2. I can find the device
under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
is working ok. Is there good (simple) method to test this serial port?
thanks
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 0:06 can't find interrupt number under /proc/interrupts for the pci multi-port on db1550 rolf liu
@ 2005-06-28 8:16 ` Jon Anders Haugum
2005-06-28 14:56 ` rolf liu
` (2 more replies)
2005-06-28 13:44 ` Alan Cox
2005-06-28 21:15 ` Ralf Baechle
2 siblings, 3 replies; 12+ messages in thread
From: Jon Anders Haugum @ 2005-06-28 8:16 UTC (permalink / raw)
To: rolf liu; +Cc: linux-mips
[-- Attachment #1: Type: TEXT/PLAIN, Size: 666 bytes --]
On Mon, 27 Jun 2005, rolf liu wrote:
> I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> starts up ok. but after start-up, I can't find the corresponding
> interrupt number for this board, which is irq 2. I can find the device
> under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> is working ok. Is there good (simple) method to test this serial port?
My guess is that you can get it working if you disable the built-in serial
ports in the kernel.
I've attached a quick'n'dirty patch I made for 2.4.27 that makes it
possible to use both internal and pci serial ports. It's a hack, but it
works.
--
Jon Anders Haugum
[-- Attachment #2: Type: TEXT/PLAIN, Size: 23804 bytes --]
Index: include/asm-mips/au1000.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/Attic/au1000.h,v
retrieving revision 1.5.2.29
diff -u -r1.5.2.29 au1000.h
--- include/asm-mips/au1000.h 7 Jul 2004 18:19:37 -0000 1.5.2.29
+++ include/asm-mips/au1000.h 17 Nov 2004 11:03:13 -0000
@@ -904,15 +904,15 @@
#define UART_BASE UART0_ADDR
#define UART_DEBUG_BASE UART3_ADDR
-#define UART_RX 0 /* Receive buffer */
-#define UART_TX 4 /* Transmit buffer */
-#define UART_IER 8 /* Interrupt Enable Register */
-#define UART_IIR 0xC /* Interrupt ID Register */
-#define UART_FCR 0x10 /* FIFO Control Register */
-#define UART_LCR 0x14 /* Line Control Register */
-#define UART_MCR 0x18 /* Modem Control Register */
-#define UART_LSR 0x1C /* Line Status Register */
-#define UART_MSR 0x20 /* Modem Status Register */
+#define AU_UART_RX 0 /* Receive buffer */
+#define AU_UART_TX 4 /* Transmit buffer */
+#define AU_UART_IER 8 /* Interrupt Enable Register */
+#define AU_UART_IIR 0xC /* Interrupt ID Register */
+#define AU_UART_FCR 0x10 /* FIFO Control Register */
+#define AU_UART_LCR 0x14 /* Line Control Register */
+#define AU_UART_MCR 0x18 /* Modem Control Register */
+#define AU_UART_LSR 0x1C /* Line Status Register */
+#define AU_UART_MSR 0x20 /* Modem Status Register */
#define UART_CLK 0x28 /* Baud Rate Clock Divider */
#define UART_MOD_CNTRL 0x100 /* Module Control */
@@ -920,7 +920,7 @@
#define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
#define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
#define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */
-#define UART_FCR_TRIGGER_MASK 0xF0 /* Mask for the FIFO trigger range */
+#define AU_UART_FCR_TRIGGER_MASK 0xF0 /* Mask for the FIFO trigger range */
#define UART_FCR_R_TRIGGER_1 0x00 /* Mask for receive trigger set at 1 */
#define UART_FCR_R_TRIGGER_4 0x40 /* Mask for receive trigger set at 4 */
#define UART_FCR_R_TRIGGER_8 0x80 /* Mask for receive trigger set at 8 */
Index: include/asm-mips/serial.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/serial.h,v
retrieving revision 1.23.2.21
diff -u -r1.23.2.21 serial.h
--- include/asm-mips/serial.h 19 Aug 2004 22:33:33 -0000 1.23.2.21
+++ include/asm-mips/serial.h 17 Nov 2004 11:03:14 -0000
@@ -191,6 +191,7 @@
#endif
#ifdef CONFIG_SOC_AU1550
+#define SERIAL_DEV_OFFSET 3
#define AU1000_SERIAL_PORT_DEFNS \
{ .baud_base = 0, .port = UART0_ADDR, .irq = AU1550_UART0_INT, \
.flags = STD_COM_FLAGS, .type = 1 }, \
@@ -469,7 +470,6 @@
#define SERIAL_PORT_DFNS \
ATLAS_SERIAL_PORT_DEFNS \
- AU1000_SERIAL_PORT_DEFNS \
COBALT_SERIAL_PORT_DEFNS \
DDB5477_SERIAL_PORT_DEFNS \
EV96100_SERIAL_PORT_DEFNS \
Index: drivers/char/au1x00-serial.c
===================================================================
RCS file: /home/cvs/linux/drivers/char/Attic/au1x00-serial.c,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 au1x00-serial.c
--- drivers/char/au1x00-serial.c 24 Jun 2003 22:19:58 -0000 1.1.2.2
+++ drivers/char/au1x00-serial.c 17 Nov 2004 11:03:14 -0000
@@ -110,19 +110,13 @@
#include <asm/irq.h>
#include <asm/bitops.h>
-#ifdef CONFIG_MAC_SERIAL
-#define SERIAL_DEV_OFFSET 2
-#else
-#define SERIAL_DEV_OFFSET 0
-#endif
-
#ifdef SERIAL_INLINE
#define _INLINE_ inline
#else
#define _INLINE_
#endif
-static char *serial_name = "Serial driver";
+static char *serial_name = "Au1xxx serial driver";
static DECLARE_TASK_QUEUE(tq_serial);
@@ -174,8 +168,8 @@
};
-static struct serial_state rs_table[RS_TABLE_SIZE] = {
- SERIAL_PORT_DFNS /* Defined in serial.h */
+static struct serial_state rs_table[] = {
+ AU1000_SERIAL_PORT_DEFNS /* Defined in serial.h */
};
#define NR_PORTS (sizeof(rs_table)/sizeof(struct serial_state))
@@ -279,7 +273,7 @@
spin_lock_irqsave(&serial_lock, flags);
if (info->IER & UART_IER_THRI) {
info->IER &= ~UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -297,7 +291,7 @@
&& info->xmit.buf
&& !(info->IER & UART_IER_THRI)) {
info->IER |= UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -345,7 +339,7 @@
icount = &info->state->icount;
do {
- ch = serial_inp(info, UART_RX);
+ ch = serial_inp(info, AU_UART_RX);
if (tty->flip.count >= TTY_FLIPBUF_SIZE)
goto ignore_char;
*tty->flip.char_buf_ptr = ch;
@@ -444,7 +438,7 @@
tty->flip.char_buf_ptr++;
tty->flip.count++;
ignore_char:
- *status = serial_inp(info, UART_LSR);
+ *status = serial_inp(info, AU_UART_LSR);
} while (*status & UART_LSR_DR);
tty_flip_buffer_push(tty);
}
@@ -454,7 +448,7 @@
int count;
if (info->x_char) {
- serial_outp(info, UART_TX, info->x_char);
+ serial_outp(info, AU_UART_TX, info->x_char);
info->state->icount.tx++;
info->x_char = 0;
if (intr_done)
@@ -465,13 +459,13 @@
|| info->tty->stopped
|| info->tty->hw_stopped) {
info->IER &= ~UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
return;
}
count = info->xmit_fifo_size;
do {
- serial_out(info, UART_TX, info->xmit.buf[info->xmit.tail]);
+ serial_out(info, AU_UART_TX, info->xmit.buf[info->xmit.tail]);
info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1);
info->state->icount.tx++;
if (info->xmit.head == info->xmit.tail)
@@ -491,7 +485,7 @@
if (info->xmit.head == info->xmit.tail) {
info->IER &= ~UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
}
@@ -500,7 +494,7 @@
int status;
struct async_icount *icount;
- status = serial_in(info, UART_MSR);
+ status = serial_in(info, AU_UART_MSR);
if (status & UART_MSR_ANY_DELTA) {
icount = &info->state->icount;
@@ -546,7 +540,7 @@
#endif
info->tty->hw_stopped = 0;
info->IER |= UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
return;
}
@@ -557,7 +551,7 @@
#endif
info->tty->hw_stopped = 1;
info->IER &= ~UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
}
}
@@ -583,7 +577,7 @@
return;
do {
- status = serial_inp(info, UART_LSR);
+ status = serial_inp(info, AU_UART_LSR);
#ifdef SERIAL_DEBUG_INTR
printk("status = %x...", status);
#endif
@@ -598,7 +592,7 @@
#endif
break;
}
- } while (!(serial_in(info, UART_IIR) & UART_IIR_NO_INT));
+ } while (!(serial_in(info, AU_UART_IIR) & UART_IIR_NO_INT));
info->last_active = jiffies;
#ifdef SERIAL_DEBUG_INTR
printk("end.\n");
@@ -764,20 +758,20 @@
* (they will be reenabled in change_speed())
*/
if (uart_config[state->type].flags & UART_CLEAR_FIFO) {
- serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO);
- serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO |
+ serial_outp(info, AU_UART_FCR, UART_FCR_ENABLE_FIFO);
+ serial_outp(info, AU_UART_FCR, (UART_FCR_ENABLE_FIFO |
UART_FCR_CLEAR_RCVR |
UART_FCR_CLEAR_XMIT));
- serial_outp(info, UART_FCR, 0);
+ serial_outp(info, AU_UART_FCR, 0);
}
/*
* Clear the interrupt registers.
*/
- (void) serial_inp(info, UART_LSR);
- (void) serial_inp(info, UART_RX);
- (void) serial_inp(info, UART_IIR);
- (void) serial_inp(info, UART_MSR);
+ (void) serial_inp(info, AU_UART_LSR);
+ (void) serial_inp(info, AU_UART_RX);
+ (void) serial_inp(info, AU_UART_IIR);
+ (void) serial_inp(info, AU_UART_MSR);
/*
* At this point there's no way the LSR could still be 0xFF;
@@ -785,7 +779,7 @@
* here.
*/
if (!(info->flags & ASYNC_BUGGY_UART) &&
- (serial_inp(info, UART_LSR) == 0xff)) {
+ (serial_inp(info, AU_UART_LSR) == 0xff)) {
printk("LSR safety check engaged!\n");
if (capable(CAP_SYS_ADMIN)) {
if (info->tty)
@@ -810,7 +804,7 @@
handler = rs_interrupt_single;
retval = request_irq(state->irq, handler, SA_SHIRQ,
- "serial", &IRQ_ports[state->irq]);
+ "Au1xxx serial", &IRQ_ports[state->irq]);
if (retval) {
if (capable(CAP_SYS_ADMIN)) {
if (info->tty)
@@ -835,7 +829,7 @@
/*
* Now, initialize the UART
*/
- serial_outp(info, UART_LCR, UART_LCR_WLEN8);
+ serial_outp(info, AU_UART_LCR, UART_LCR_WLEN8);
info->MCR = 0;
if (info->tty->termios->c_cflag & CBAUD)
@@ -845,22 +839,22 @@
info->MCR |= UART_MCR_OUT2;
}
info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */
- serial_outp(info, UART_MCR, info->MCR);
+ serial_outp(info, AU_UART_MCR, info->MCR);
/*
* Finally, enable interrupts
*/
info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
- serial_outp(info, UART_IER, info->IER); /* enable interrupts */
+ serial_outp(info, AU_UART_IER, info->IER); /* enable interrupts */
/*
* And clear the interrupt registers again for luck.
*/
- (void)serial_inp(info, UART_LSR);
- (void)serial_inp(info, UART_RX);
- (void)serial_inp(info, UART_IIR);
- (void)serial_inp(info, UART_MSR);
+ (void)serial_inp(info, AU_UART_LSR);
+ (void)serial_inp(info, AU_UART_RX);
+ (void)serial_inp(info, AU_UART_IIR);
+ (void)serial_inp(info, AU_UART_MSR);
if (info->tty)
clear_bit(TTY_IO_ERROR, &info->tty->flags);
@@ -947,7 +941,7 @@
if (IRQ_ports[state->irq]) {
free_irq(state->irq, &IRQ_ports[state->irq]);
retval = request_irq(state->irq, rs_interrupt_single,
- SA_SHIRQ, "serial",
+ SA_SHIRQ, "Au1xxx serial",
&IRQ_ports[state->irq]);
if (retval)
@@ -964,24 +958,24 @@
}
info->IER = 0;
- serial_outp(info, UART_IER, 0x00); /* disable all intrs */
+ serial_outp(info, AU_UART_IER, 0x00); /* disable all intrs */
info->MCR &= ~UART_MCR_OUT2;
info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */
/* disable break condition */
- serial_out(info, UART_LCR, serial_inp(info, UART_LCR) & ~UART_LCR_SBC);
+ serial_out(info, AU_UART_LCR, serial_inp(info, AU_UART_LCR) & ~UART_LCR_SBC);
if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
- serial_outp(info, UART_MCR, info->MCR);
+ serial_outp(info, AU_UART_MCR, info->MCR);
/* disable FIFO's */
- serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO |
+ serial_outp(info, AU_UART_FCR, (UART_FCR_ENABLE_FIFO |
UART_FCR_CLEAR_RCVR |
UART_FCR_CLEAR_XMIT));
- serial_outp(info, UART_FCR, 0);
+ serial_outp(info, AU_UART_FCR, 0);
- (void)serial_in(info, UART_RX); /* read data port to reset things */
+ (void)serial_in(info, AU_UART_RX); /* read data port to reset things */
if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags);
@@ -1104,7 +1098,7 @@
info->flags |= ASYNC_CHECK_CD;
info->IER |= UART_IER_MSI;
}
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
/*
* Set up parity check flag
@@ -1140,7 +1134,7 @@
spin_lock_irqsave(&serial_lock, flags);
serial_outp(info, UART_CLK, quot & 0xffff);
- serial_outp(info, UART_LCR, cval);
+ serial_outp(info, AU_UART_LCR, cval);
info->LCR = cval; /* Save LCR */
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1185,7 +1179,7 @@
spin_lock_irqsave(&serial_lock, flags);
info->IER |= UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1261,7 +1255,7 @@
&& !tty->hw_stopped
&& !(info->IER & UART_IER_THRI)) {
info->IER |= UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
return ret;
}
@@ -1318,7 +1312,7 @@
if (ch) {
/* Make sure transmit interrupts are on */
info->IER |= UART_IER_THRI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
}
}
@@ -1351,7 +1345,7 @@
info->MCR &= ~UART_MCR_RTS;
spin_lock_irqsave(&serial_lock, flags);
- serial_out(info, UART_MCR, info->MCR);
+ serial_out(info, AU_UART_MCR, info->MCR);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1378,7 +1372,7 @@
if (tty->termios->c_cflag & CRTSCTS)
info->MCR |= UART_MCR_RTS;
spin_lock_irqsave(&serial_lock, flags);
- serial_out(info, UART_MCR, info->MCR);
+ serial_out(info, AU_UART_MCR, info->MCR);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1564,7 +1558,7 @@
unsigned long flags;
spin_lock_irqsave(&serial_lock, flags);
- status = serial_in(info, UART_LSR);
+ status = serial_in(info, AU_UART_LSR);
spin_unlock_irqrestore(&serial_lock, flags);
result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
@@ -1594,7 +1588,7 @@
control = info->MCR;
spin_lock_irqsave(&serial_lock, flags);
- status = serial_in(info, UART_MSR);
+ status = serial_in(info, AU_UART_MSR);
spin_unlock_irqrestore(&serial_lock, flags);
result = ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
| ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
@@ -1671,7 +1665,7 @@
}
spin_lock_irqsave(&serial_lock, flags);
info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */
- serial_out(info, UART_MCR, info->MCR);
+ serial_out(info, AU_UART_MCR, info->MCR);
spin_unlock_irqrestore(&serial_lock, flags);
return 0;
}
@@ -1713,7 +1707,7 @@
info->LCR |= UART_LCR_SBC;
else
info->LCR &= ~UART_LCR_SBC;
- serial_out(info, UART_LCR, info->LCR);
+ serial_out(info, AU_UART_LCR, info->LCR);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1775,7 +1769,7 @@
spin_unlock_irqrestore(&serial_lock, flags);
/* Force modem status interrupts on */
info->IER |= UART_IER_MSI;
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
while (1) {
interruptible_sleep_on(&info->delta_msr_wait);
/* see if a signal did it */
@@ -1852,7 +1846,7 @@
!(cflag & CBAUD)) {
info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
spin_lock_irqsave(&serial_lock, flags);
- serial_out(info, UART_MCR, info->MCR);
+ serial_out(info, AU_UART_MCR, info->MCR);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1865,7 +1859,7 @@
info->MCR |= UART_MCR_RTS;
}
spin_lock_irqsave(&serial_lock, flags);
- serial_out(info, UART_MCR, info->MCR);
+ serial_out(info, AU_UART_MCR, info->MCR);
spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1959,7 +1953,7 @@
info->IER &= ~UART_IER_RLSI;
info->read_status_mask &= ~UART_LSR_DR;
if (info->flags & ASYNC_INITIALIZED) {
- serial_out(info, UART_IER, info->IER);
+ serial_out(info, AU_UART_IER, info->IER);
/*
* Before we drop DTR, make sure the UART transmitter
* has completely drained; this is especially
@@ -2036,7 +2030,7 @@
printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
printk("jiff=%lu...", jiffies);
#endif
- while (!((lsr = serial_inp(info, UART_LSR)) & UART_LSR_TEMT)) {
+ while (!((lsr = serial_inp(info, AU_UART_LSR)) & UART_LSR_TEMT)) {
#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
#endif
@@ -2170,8 +2164,8 @@
spin_lock_irqsave(&serial_lock, flags);
if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
(tty->termios->c_cflag & CBAUD))
- serial_out(info, UART_MCR,
- serial_inp(info, UART_MCR) |
+ serial_out(info, AU_UART_MCR,
+ serial_inp(info, AU_UART_MCR) |
(UART_MCR_DTR | UART_MCR_RTS));
spin_unlock_irqrestore(&serial_lock, flags);
set_current_state(TASK_INTERRUPTIBLE);
@@ -2189,7 +2183,7 @@
}
if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
!(info->flags & ASYNC_CLOSING) &&
- (do_clocal || (serial_in(info, UART_MSR) &
+ (do_clocal || (serial_in(info, AU_UART_MSR) &
UART_MSR_DCD)))
break;
if (signal_pending(current)) {
@@ -2397,8 +2391,8 @@
info->tty = 0;
}
spin_lock_irqsave(&serial_lock, flags);
- status = serial_in(info, UART_MSR);
- control = info != &scr_info ? info->MCR : serial_in(info, UART_MCR);
+ status = serial_in(info, AU_UART_MSR);
+ control = info != &scr_info ? info->MCR : serial_in(info, AU_UART_MCR);
spin_unlock_irqrestore(&serial_lock, flags);
stat_buf[0] = 0;
@@ -2536,23 +2530,23 @@
state->xmit_fifo_size = uart_config[state->type].dfl_xmit_fifo_size;
if (info->port) {
- request_region(info->port,8,"serial(auto)");
+ request_region(info->port,8,"Au1xxx serial(auto)");
}
/*
* Reset the UART.
*/
- serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO |
+ serial_outp(info, AU_UART_FCR, (UART_FCR_ENABLE_FIFO |
UART_FCR_CLEAR_RCVR |
UART_FCR_CLEAR_XMIT));
- serial_outp(info, UART_FCR, 0);
- (void)serial_in(info, UART_RX);
- serial_outp(info, UART_IER, 0);
+ serial_outp(info, AU_UART_FCR, 0);
+ (void)serial_in(info, AU_UART_RX);
+ serial_outp(info, AU_UART_IER, 0);
spin_unlock_irqrestore(&serial_lock, flags);
}
-int register_serial(struct serial_struct *req);
-void unregister_serial(int line);
+int register_Au1xxx_serial(struct serial_struct *req);
+void unregister_Au1xxx_serial(int line);
/*
* The serial driver boot-time initialization code!
@@ -2562,6 +2556,7 @@
int i;
struct serial_state * state;
+printk("au rs_init %d\n", NR_PORTS);
init_bh(SERIAL_BH, do_serial_bh);
init_timer(&serial_timer);
serial_timer.function = rs_timer;
@@ -2589,14 +2584,14 @@
memset(&serial_driver, 0, sizeof(struct tty_driver));
serial_driver.magic = TTY_DRIVER_MAGIC;
- serial_driver.driver_name = "serial";
+ serial_driver.driver_name = "Au1xxx_serial";
#if (LINUX_VERSION_CODE > 0x2032D && defined(CONFIG_DEVFS_FS))
serial_driver.name = "tts/%d";
#else
serial_driver.name = "ttyS";
#endif
serial_driver.major = TTY_MAJOR;
- serial_driver.minor_start = 64 + SERIAL_DEV_OFFSET;
+ serial_driver.minor_start = 64;
serial_driver.num = NR_PORTS;
serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
serial_driver.subtype = SERIAL_TYPE_NORMAL;
@@ -2680,7 +2675,7 @@
continue;
}
printk(KERN_INFO "ttyS%02d%s at 0x%04lx (irq = %d) is a %s\n",
- state->line + SERIAL_DEV_OFFSET,
+ state->line,
(state->flags & ASYNC_FOURPORT) ? " FourPort" : "",
state->port, state->irq,
uart_config[state->type].name);
@@ -2711,7 +2706,7 @@
* On success the port is ready to use and the line number is returned.
*/
-int register_serial(struct serial_struct *req)
+int register_Au1xxx_serial(struct serial_struct *req)
{
int i;
unsigned long flags;
@@ -2770,7 +2765,7 @@
spin_unlock_irqrestore(&serial_lock, flags);
printk(KERN_INFO "ttyS%02d at %s 0x%04lx (irq = %d) is a %s\n",
- state->line + SERIAL_DEV_OFFSET,
+ state->line,
state->iomem_base ? "iomem" : "port",
state->iomem_base ? (unsigned long)state->iomem_base :
state->port, state->irq, uart_config[state->type].name);
@@ -2778,7 +2773,7 @@
serial_driver.minor_start + state->line);
tty_register_devfs(&callout_driver, 0,
callout_driver.minor_start + state->line);
- return state->line + SERIAL_DEV_OFFSET;
+ return state->line;
}
/**
@@ -2790,7 +2785,7 @@
* the port number returned by register_serial().
*/
-void unregister_serial(int line)
+void unregister_Au1xxx_serial(int line)
{
unsigned long flags;
struct serial_state *state = &rs_table[line];
@@ -2869,7 +2864,7 @@
unsigned int status, tmout = 0xffffff;
do {
- status = serial_in(info, UART_LSR);
+ status = serial_in(info, AU_UART_LSR);
if (status & UART_LSR_BI)
lsr_break_flag = UART_LSR_BI;
@@ -2896,8 +2891,8 @@
/*
* First save the IER then disable the interrupts
*/
- ier = serial_in(info, UART_IER);
- serial_out(info, UART_IER, 0x00);
+ ier = serial_in(info, AU_UART_IER);
+ serial_out(info, AU_UART_IER, 0x00);
/*
* Now, do each character
@@ -2909,10 +2904,10 @@
* Send the character out.
* If a LF, also do CR...
*/
- serial_out(info, UART_TX, *s);
+ serial_out(info, AU_UART_TX, *s);
if (*s == 10) {
wait_for_xmitr(info);
- serial_out(info, UART_TX, 13);
+ serial_out(info, AU_UART_TX, 13);
}
}
@@ -2921,7 +2916,7 @@
* and restore the IER
*/
wait_for_xmitr(info);
- serial_out(info, UART_IER, ier);
+ serial_out(info, AU_UART_IER, ier);
}
/*
@@ -2939,16 +2934,16 @@
* that the real driver for the port does not get the
* character.
*/
- ier = serial_in(info, UART_IER);
- serial_out(info, UART_IER, 0x00);
+ ier = serial_in(info, AU_UART_IER);
+ serial_out(info, AU_UART_IER, 0x00);
- while ((serial_in(info, UART_LSR) & UART_LSR_DR) == 0);
- c = serial_in(info, UART_RX);
+ while ((serial_in(info, AU_UART_LSR) & UART_LSR_DR) == 0);
+ c = serial_in(info, AU_UART_RX);
/*
* Restore the interrupts
*/
- serial_out(info, UART_IER, ier);
+ serial_out(info, AU_UART_IER, ier);
return c;
}
@@ -3061,13 +3056,13 @@
* and set speed.
*/
serial_out(info, UART_CLK, quot & 0xffff);
- serial_out(info, UART_IER, 0);
- serial_out(info, UART_MCR, UART_MCR_DTR | UART_MCR_RTS);
+ serial_out(info, AU_UART_IER, 0);
+ serial_out(info, AU_UART_MCR, UART_MCR_DTR | UART_MCR_RTS);
/*
* If we read 0xff from the LSR, there is no UART here.
*/
- if (serial_in(info, UART_LSR) == 0xff)
+ if (serial_in(info, AU_UART_LSR) == 0xff)
return -1;
return 0;
Index: drivers/char/serial.c
===================================================================
RCS file: /home/cvs/linux/drivers/char/Attic/serial.c,v
retrieving revision 1.62.2.10
diff -u -r1.62.2.10 serial.c
--- drivers/char/serial.c 15 Dec 2003 18:19:50 -0000 1.62.2.10
+++ drivers/char/serial.c 17 Nov 2004 11:03:15 -0000
@@ -242,11 +243,13 @@
#include <asm/irq.h>
#include <asm/bitops.h>
+#ifndef SERIAL_DEV_OFFSET
#if defined(CONFIG_MAC_SERIAL)
#define SERIAL_DEV_OFFSET ((_machine == _MACH_prep || _machine == _MACH_chrp) ? 0 : 2)
#else
#define SERIAL_DEV_OFFSET 0
#endif
+#endif
#ifdef SERIAL_INLINE
#define _INLINE_ inline
@@ -5718,7 +5748,7 @@
serial_driver.minor_start + state->line);
tty_register_devfs(&callout_driver, 0,
callout_driver.minor_start + state->line);
- return state->line + SERIAL_DEV_OFFSET;
+ return state->line;
}
/**
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 0:06 can't find interrupt number under /proc/interrupts for the pci multi-port on db1550 rolf liu
2005-06-28 8:16 ` Jon Anders Haugum
@ 2005-06-28 13:44 ` Alan Cox
2005-06-28 16:30 ` rolf liu
2005-06-28 21:15 ` Ralf Baechle
2 siblings, 1 reply; 12+ messages in thread
From: Alan Cox @ 2005-06-28 13:44 UTC (permalink / raw)
To: rolf liu; +Cc: linux-mips
On Maw, 2005-06-28 at 01:06, rolf liu wrote:
> I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> starts up ok. but after start-up, I can't find the corresponding
> interrupt number for this board, which is irq 2. I can find the device
> under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> is working ok. Is there good (simple) method to test this serial port?
Do something like
cat /dev/ttySwhatever
then look at the IRQ list. The interrupt will only be allocated while
the port is in use.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 8:16 ` Jon Anders Haugum
@ 2005-06-28 14:56 ` rolf liu
2005-06-28 15:09 ` rolf liu
2005-07-05 19:43 ` rolf liu
2 siblings, 0 replies; 12+ messages in thread
From: rolf liu @ 2005-06-28 14:56 UTC (permalink / raw)
To: Jon Anders Haugum; +Cc: linux-mips
I did it and it is just stuck there. I have to use Ctrl-c to kill it.
It seems no working :(
On 6/28/05, Jon Anders Haugum <jonah@omegav.ntnu.no> wrote:
> On Mon, 27 Jun 2005, rolf liu wrote:
> > I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> > starts up ok. but after start-up, I can't find the corresponding
> > interrupt number for this board, which is irq 2. I can find the device
> > under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> > is working ok. Is there good (simple) method to test this serial port?
>
> My guess is that you can get it working if you disable the built-in serial
> ports in the kernel.
>
> I've attached a quick'n'dirty patch I made for 2.4.27 that makes it
> possible to use both internal and pci serial ports. It's a hack, but it
> works.
>
>
> --
> Jon Anders Haugum
>
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 8:16 ` Jon Anders Haugum
2005-06-28 14:56 ` rolf liu
@ 2005-06-28 15:09 ` rolf liu
2005-07-05 19:43 ` rolf liu
2 siblings, 0 replies; 12+ messages in thread
From: rolf liu @ 2005-06-28 15:09 UTC (permalink / raw)
To: Jon Anders Haugum; +Cc: linux-mips
What is the real reason to disable the existing uart on db1550? I
checked the PCI configuration for the multi-port board. It seems the
configuration is ok, including the memory map, irq number. The linux
can find such information and register this device, but it just can't
work :(
thanks
On 6/28/05, Jon Anders Haugum <jonah@omegav.ntnu.no> wrote:
> On Mon, 27 Jun 2005, rolf liu wrote:
> > I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> > starts up ok. but after start-up, I can't find the corresponding
> > interrupt number for this board, which is irq 2. I can find the device
> > under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> > is working ok. Is there good (simple) method to test this serial port?
>
> My guess is that you can get it working if you disable the built-in serial
> ports in the kernel.
>
> I've attached a quick'n'dirty patch I made for 2.4.27 that makes it
> possible to use both internal and pci serial ports. It's a hack, but it
> works.
>
>
> --
> Jon Anders Haugum
>
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 13:44 ` Alan Cox
@ 2005-06-28 16:30 ` rolf liu
2005-06-28 17:52 ` Alan Cox
0 siblings, 1 reply; 12+ messages in thread
From: rolf liu @ 2005-06-28 16:30 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-mips
I checked again. When I cat sth to /dev/ttyM0 and it is stuck there, I
cat /proc/interrupts, the interrupt number show up for that driver,
but the number of interrupts for that driver is always 0, which seems
not OK. I am wondering if such interrupt is routed to somewhere else?
If that is possible, what is the most likely place, the
au1x00_serial.c?
thanks
On 6/28/05, Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> On Maw, 2005-06-28 at 01:06, rolf liu wrote:
> > I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> > starts up ok. but after start-up, I can't find the corresponding
> > interrupt number for this board, which is irq 2. I can find the device
> > under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> > is working ok. Is there good (simple) method to test this serial port?
>
> Do something like
>
> cat /dev/ttySwhatever
>
> then look at the IRQ list. The interrupt will only be allocated while
> the port is in use.
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 16:30 ` rolf liu
@ 2005-06-28 17:52 ` Alan Cox
2005-06-28 19:01 ` rolf liu
0 siblings, 1 reply; 12+ messages in thread
From: Alan Cox @ 2005-06-28 17:52 UTC (permalink / raw)
To: rolf liu; +Cc: linux-mips
On Maw, 2005-06-28 at 17:30, rolf liu wrote:
> but the number of interrupts for that driver is always 0, which seems
> not OK. I am wondering if such interrupt is routed to somewhere else?
I'd expect it to stay zero unless characters were received or events
occurred. Something like
(echo "Hello world"; cat ) <> /dev/ttywhatever
ought to cause interrupts
[That bit of script writes Hello world to the serial port and then
copies anything from it back to it until you hit ^C]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 17:52 ` Alan Cox
@ 2005-06-28 19:01 ` rolf liu
0 siblings, 0 replies; 12+ messages in thread
From: rolf liu @ 2005-06-28 19:01 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-mips
Thanks for your help.
I tried your script. the result is really interesting.
the interrupt is still shown as 0 times. I even hacked into the do_IRQ
and handle_IRQ_event, let them printk if there is a interrupt number 2
coming in. Still no printk output through klogd logfile. more
interesting thing is there is a timer on the multi-port board, which
is keeping time-out and keeping the timer interrupt up.
Is that possible the board is not enabled to interrupt correctly?
really a pain. I just got the driver from the company. don't know what
is the start point if I want to really dig into the hardware control
of the board.
thanks
On 6/28/05, Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> On Maw, 2005-06-28 at 17:30, rolf liu wrote:
> > but the number of interrupts for that driver is always 0, which seems
> > not OK. I am wondering if such interrupt is routed to somewhere else?
>
> I'd expect it to stay zero unless characters were received or events
> occurred. Something like
>
> (echo "Hello world"; cat ) <> /dev/ttywhatever
>
> ought to cause interrupts
>
> [That bit of script writes Hello world to the serial port and then
> copies anything from it back to it until you hit ^C]
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 0:06 can't find interrupt number under /proc/interrupts for the pci multi-port on db1550 rolf liu
2005-06-28 8:16 ` Jon Anders Haugum
2005-06-28 13:44 ` Alan Cox
@ 2005-06-28 21:15 ` Ralf Baechle
2005-06-29 22:20 ` rolf liu
2 siblings, 1 reply; 12+ messages in thread
From: Ralf Baechle @ 2005-06-28 21:15 UTC (permalink / raw)
To: rolf liu; +Cc: linux-mips
On Mon, Jun 27, 2005 at 05:06:27PM -0700, rolf liu wrote:
> I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> starts up ok. but after start-up, I can't find the corresponding
> interrupt number for this board, which is irq 2. I can find the device
> under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> is working ok. Is there good (simple) method to test this serial port?
Linux will only allocate the interrupt when the interface is actually
opened, just loading the driver doesn't suffice.
Ralf
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 21:15 ` Ralf Baechle
@ 2005-06-29 22:20 ` rolf liu
2005-06-30 10:07 ` Ralf Baechle
0 siblings, 1 reply; 12+ messages in thread
From: rolf liu @ 2005-06-29 22:20 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
After some work, I found out the problem is the multi-port card is
using some of macros defined in au1000.h, which is not supposed to do.
I gave it a dirty hack by defining such macros in the source file.
Now I can see the interrupts coming up. BUT when I typed:
echo "hello world!">/dev/ttyM0
the message is shown on terminal connected to this serial port. But it
then is stuck there. Then the rs_timer gives a lot of timeouts and
enter the interrupt service routine each time there is timeout.
rs_close() is never got called. any suggestion on this part?
What is the function of serial_timer? it is just sitting there,
generating timeout, periodically. Just to make sure the interrupt
routine will be called periodically?
thanks
On 6/28/05, Ralf Baechle <ralf@linux-mips.org> wrote:
> On Mon, Jun 27, 2005 at 05:06:27PM -0700, rolf liu wrote:
>
> > I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> > starts up ok. but after start-up, I can't find the corresponding
> > interrupt number for this board, which is irq 2. I can find the device
> > under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> > is working ok. Is there good (simple) method to test this serial port?
>
> Linux will only allocate the interrupt when the interface is actually
> opened, just loading the driver doesn't suffice.
>
> Ralf
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-29 22:20 ` rolf liu
@ 2005-06-30 10:07 ` Ralf Baechle
0 siblings, 0 replies; 12+ messages in thread
From: Ralf Baechle @ 2005-06-30 10:07 UTC (permalink / raw)
To: rolf liu; +Cc: linux-mips
On Wed, Jun 29, 2005 at 03:20:56PM -0700, rolf liu wrote:
> What is the function of serial_timer? it is just sitting there,
> generating timeout, periodically. Just to make sure the interrupt
> routine will be called periodically?
It's for interrupt-less ports.
Ralf
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: can't find interrupt number under /proc/interrupts for the pci multi-port on db1550
2005-06-28 8:16 ` Jon Anders Haugum
2005-06-28 14:56 ` rolf liu
2005-06-28 15:09 ` rolf liu
@ 2005-07-05 19:43 ` rolf liu
2 siblings, 0 replies; 12+ messages in thread
From: rolf liu @ 2005-07-05 19:43 UTC (permalink / raw)
To: Jon Anders Haugum; +Cc: linux-mips
Jon,
did you make the board work under 2.6.x? I tried to turn off the
au1x00 uart, but the board does not work by just not using au1000.h.
Any idea?
thanks
On 6/28/05, Jon Anders Haugum <jonah@omegav.ntnu.no> wrote:
> On Mon, 27 Jun 2005, rolf liu wrote:
> > I am running 2.4.31 on db1550 with a pci multi-port board. the kernel
> > starts up ok. but after start-up, I can't find the corresponding
> > interrupt number for this board, which is irq 2. I can find the device
> > under /proc/devices and /proc/tty/driver, etc. So I am now sure if it
> > is working ok. Is there good (simple) method to test this serial port?
>
> My guess is that you can get it working if you disable the built-in serial
> ports in the kernel.
>
> I've attached a quick'n'dirty patch I made for 2.4.27 that makes it
> possible to use both internal and pci serial ports. It's a hack, but it
> works.
>
>
> --
> Jon Anders Haugum
>
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2005-07-05 19:43 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-06-28 0:06 can't find interrupt number under /proc/interrupts for the pci multi-port on db1550 rolf liu
2005-06-28 8:16 ` Jon Anders Haugum
2005-06-28 14:56 ` rolf liu
2005-06-28 15:09 ` rolf liu
2005-07-05 19:43 ` rolf liu
2005-06-28 13:44 ` Alan Cox
2005-06-28 16:30 ` rolf liu
2005-06-28 17:52 ` Alan Cox
2005-06-28 19:01 ` rolf liu
2005-06-28 21:15 ` Ralf Baechle
2005-06-29 22:20 ` rolf liu
2005-06-30 10:07 ` Ralf Baechle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox