Port-atari archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: atari/dev/zs.c interrupt issue



Tuomo wrote:

> I tried to transfer some files to my Falcon running NetBSD 5 kernel
> with ppp. I'm using zs0b (ttyA1) device which is standard Falcon
> serial port.
> 
> However I started to see "zs0b: ring overrun" messages early during
> transfer and occasional freezing.

Hmm, what baud rate?  I'm afraid zs can't handle >38400 bps.

> It seems that BASEPRI() is causing this problem and following
> patch cures this issue:
 :

I guess there are too many devices which use sicallback.
As mentioned in machdep.c, most of them should be rewritten
to use the MI softint(9) APIs directly.

Could you try this one instead?
(though I'm not sure this could help overrun issue
 because "shortcut" path is removed in this patch)

It would also be better to use the MI dev/ic/z8530* driver.
(though it isn't so well designed)

---
Index: dev/zs.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/dev/zs.c,v
retrieving revision 1.57
diff -u -r1.57 zs.c
--- dev/zs.c    11 Jun 2008 14:35:53 -0000      1.57
+++ dev/zs.c    24 Jan 2009 01:24:35 -0000
@@ -124,7 +124,7 @@
     struct     zs_chanstate    zi_cs[2];  /* chan A and B software state */
 };
 
-static u_char  cb_scheduled = 0;       /* Already asked for callback? */
+static void    *zs_softint_cookie;     /* for callback */
 /*
  * Define the registers for a closed port
  */
@@ -260,8 +260,6 @@
 static void    zs_loadchannelregs __P((volatile struct zschan *, u_char *));
 static void    zs_shutdown __P((struct zs_chanstate *));
 
-static int zsshortcuts;        /* number of "shortcut" software interrupts */
-
 static int
 zsmatch(pdp, cfp, auxp)
 struct device  *pdp;
@@ -353,6 +351,9 @@
        cs->cs_unit  = 1;
        cs->cs_zc    = &addr->zs_chan[ZS_CHAN_B];
 
+       zs_softint_cookie = softint_establish(SOFTINT_SERIAL,
+           (void (*)(void *))zssoft, 0);
+
        printf(": serial2 on channel a and modem2 on channel b\n");
 }
 
@@ -629,17 +630,9 @@
        } while(intflags & 4);
 #undef b
 
-       if(intflags & 1) {
-               if(BASEPRI(sr)) {
-                       spl1();
-                       zsshortcuts++;
-                       return(zssoft(sr));
-               }
-               else if(!cb_scheduled) {
-                       cb_scheduled++;
-                       add_sicallback((si_farg)zssoft, 0, 0);
-               }
-       }
+       if(intflags & 1)
+               softint_schedule(zs_softint_cookie);
+
        return(intflags & 2);
 }
 
@@ -747,7 +740,6 @@
     register int                       get, n, c, cc, unit, s;
             int                        retval = 0;
 
-    cb_scheduled = 0;
     s = spltty();
     for(cs = zslist; cs != NULL; cs = cs->cs_next) {
        get = cs->cs_rbget;

---
Izumi Tsutsui


Home | Main Index | Thread Index | Old Index