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

Reply via email to