Hi Burn
Could you try the attached patch
It solved the same problem for me, it is NOT SMP safe due
to cli() calls, though will run fine on your system. I have been
running a console box for about 1mth non-stop with these applied.
The patch does two things it allows the driver to be built-in and
updates the call to request_irq, which is what is causing the
problem.
On Fri, 18 Feb 2005, Burn Alting wrote:
> Here is the bug report. Stallion was purchased by Lantronix and they
> don't really care about this bug.
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--------------------------------------------------
Darren Williams <dsw AT gelato.unsw.edu.au>
[EMAIL PROTECTED] <www.gelato.unsw.edu.au>
--------------------------------------------------
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2004/12/08 13:37:06+11:00 [EMAIL PROTECTED]
# Allow stallion console driver to be built-in, and register irqs correctly
with dev_id != NULL
#
# Signed-off Darren Williams <dswATgelato.unsw.edu.au>
# drivers/char/stallion.c
# 2004/12/08 13:36:57+11:00 [EMAIL PROTECTED] +12 -15
# Pass non NULL dev_id to request_irq to allow correct irq registration. We
use the board pointer as the dev_id
# to allow unique identification across shared interupts.
#
# Remove remaining #ifdef MODULES to allow for built-in support.
#
# Signed-off Darren Williams <dswATgelato.unsw.edu.au>
#
diff -Nru a/drivers/char/stallion.c b/drivers/char/stallion.c
--- a/drivers/char/stallion.c 2004-12-08 13:44:57 +11:00
+++ b/drivers/char/stallion.c 2004-12-08 13:44:57 +11:00
@@ -240,7 +240,6 @@
/*****************************************************************************/
-#ifdef MODULE
/*
* Define some string labels for arguments passed from the module
* load line. These allow for easy board definitions, and easy
@@ -316,7 +315,6 @@
MODULE_PARM(board3, "1-4s");
MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
-#endif
/*****************************************************************************/
@@ -472,12 +470,10 @@
* Declare all those functions in this driver!
*/
-#ifdef MODULE
static void stl_argbrds(void);
static int stl_parsebrd(stlconf_t *confp, char **argp);
static unsigned long stl_atol(char *str);
-#endif
int stl_init(void);
static int stl_open(struct tty_struct *tty, struct file *filp);
@@ -504,7 +500,7 @@
static int stl_brdinit(stlbrd_t *brdp);
static int stl_initports(stlbrd_t *brdp, stlpanel_t *panelp);
-static int stl_mapirq(int irq, char *name);
+static int stl_mapirq(stlbrd_t *brdp, char *name);
static int stl_getserial(stlport_t *portp, struct serial_struct __user
*sp);
static int stl_setserial(stlport_t *portp, struct serial_struct __user
*sp);
static int stl_getbrdstats(combrd_t __user *bp);
@@ -735,7 +731,6 @@
static struct class_simple *stallion_class;
-#ifdef MODULE
/*
* Loadable module initialization stuff.
@@ -959,7 +954,6 @@
return(1);
}
-#endif
/*****************************************************************************/
@@ -2179,26 +2173,27 @@
* interrupt across multiple boards.
*/
-static int __init stl_mapirq(int irq, char *name)
+static int __init stl_mapirq(stlbrd_t *brdp, char *name)
{
int rc, i;
#ifdef DEBUG
- printk("stl_mapirq(irq=%d,name=%s)\n", irq, name);
+ printk("stl_mapirq(irq=%d,name=%s)\n", brdp->irq, name);
#endif
rc = 0;
for (i = 0; (i < stl_numintrs); i++) {
- if (stl_gotintrs[i] == irq)
+ if (stl_gotintrs[i] == brdp->irq)
break;
}
if (i >= stl_numintrs) {
- if (request_irq(irq, stl_intr, SA_SHIRQ, name, NULL) != 0) {
+ /* pass the unique board pointer for shared interrupt dev_id */
+ if ( request_irq(brdp->irq, stl_intr, SA_SHIRQ, name, brdp) !=
0) {
printk("STALLION: failed to register interrupt "
- "routine for %s irq=%d\n", name, irq);
+ "routine for %s irq=%d\n", name, brdp->irq);
rc = -ENODEV;
} else {
- stl_gotintrs[stl_numintrs++] = irq;
+ stl_gotintrs[stl_numintrs++] = brdp->irq;
}
}
return(rc);
@@ -2389,7 +2384,7 @@
brdp->nrpanels = 1;
brdp->state |= BRD_FOUND;
brdp->hwid = status;
- rc = stl_mapirq(brdp->irq, name);
+ rc = stl_mapirq(brdp, name);
return(rc);
}
@@ -2594,7 +2589,7 @@
outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
brdp->state |= BRD_FOUND;
- i = stl_mapirq(brdp->irq, name);
+ i = stl_mapirq(brdp, name);
return(i);
}
@@ -2807,9 +2802,7 @@
*/
for (i = 0; (i < stl_nrbrds); i++) {
confp = &stl_brdconf[i];
-#ifdef MODULE
stl_parsebrd(confp, stl_brdsp[i]);
-#endif
if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
return(-ENOMEM);
brdp->brdnr = i;
@@ -2825,9 +2818,7 @@
* Find any dynamically supported boards. That is via module load
* line options or auto-detected on the PCI bus.
*/
-#ifdef MODULE
stl_argbrds();
-#endif
#ifdef CONFIG_PCI
stl_findpcibrds();
#endif