Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/s3c2xx0 split sscomintr() to sscomtxintr() and ...



details:   https://anonhg.NetBSD.org/src/rev/55315c1ccb97
branches:  trunk
changeset: 550163:55315c1ccb97
user:      bsh <bsh%NetBSD.org@localhost>
date:      Thu Jul 31 19:08:10 2003 +0000

description:
split sscomintr() to sscomtxintr() and sscomrxintr().

diffstat:

 sys/arch/arm/s3c2xx0/sscom.c         |  112 +++++++++++++++++++++++++----------
 sys/arch/arm/s3c2xx0/sscom_s3c2800.c |   37 ++---------
 sys/arch/arm/s3c2xx0/sscom_var.h     |    9 +-
 3 files changed, 92 insertions(+), 66 deletions(-)

diffs (286 lines):

diff -r 050920c46e18 -r 55315c1ccb97 sys/arch/arm/s3c2xx0/sscom.c
--- a/sys/arch/arm/s3c2xx0/sscom.c      Thu Jul 31 17:51:09 2003 +0000
+++ b/sys/arch/arm/s3c2xx0/sscom.c      Thu Jul 31 19:08:10 2003 +0000
@@ -1,8 +1,8 @@
-/*     $NetBSD: sscom.c,v 1.8 2003/07/15 00:24:49 lukem Exp $ */
+/*     $NetBSD: sscom.c,v 1.9 2003/07/31 19:08:10 bsh Exp $ */
 
 /*
- * Copyright (c) 2002 Fujitsu Component Limited
- * Copyright (c) 2002 Genetec Corporation
+ * Copyright (c) 2002, 2003 Fujitsu Component Limited
+ * Copyright (c) 2002, 2003 Genetec Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -109,7 +109,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sscom.c,v 1.8 2003/07/15 00:24:49 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sscom.c,v 1.9 2003/07/31 19:08:10 bsh Exp $");
 
 #include "opt_sscom.h"
 #include "opt_ddb.h"
@@ -279,15 +279,14 @@
 
 
 static __inline void
-sscom_output_chunk( struct sscom_softc *sc )
+__sscom_output_chunk(struct sscom_softc *sc, int ufstat)
 {
        int n, space;
        bus_space_tag_t iot = sc->sc_iot;
        bus_space_handle_t ioh = sc->sc_ioh;
 
        n = sc->sc_tbc;
-       space = 16 - ((bus_space_read_2(iot, ioh, SSCOM_UFSTAT) &
-           UFSTAT_TXCOUNT) >> UFSTAT_TXCOUNT_SHIFT);
+       space = 16 - ((ufstat & UFSTAT_TXCOUNT) >> UFSTAT_TXCOUNT_SHIFT);
 
        if (n > space)
                n = space;
@@ -299,7 +298,14 @@
        }
 }
 
+static void
+sscom_output_chunk(struct sscom_softc *sc)
+{
+       int ufstat = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SSCOM_UFSTAT);
 
+       if (!(ufstat & UFSTAT_TXFULL))
+               __sscom_output_chunk(sc, ufstat);
+}
 
 int
 sscomspeed(long speed, long frequency)
@@ -949,7 +955,7 @@
                break;
 
        case TIOCMSET:
-               CLR(sc->sc_umcon, UMCON_DTR|UMCON_RTS);
+               CLR(sc->sc_umcon, UMCON_DTR);
                SET(sc->sc_umcon, sscombits);
                break;
        }
@@ -1548,7 +1554,7 @@
 
 
 int
-sscomintr(void *arg)
+sscomrxintr(void *arg)
 {
        struct sscom_softc *sc = arg;
        bus_space_tag_t iot = sc->sc_iot;
@@ -1576,6 +1582,7 @@
 
                if ( (ufstat & (UFSTAT_RXCOUNT|UFSTAT_RXFULL)) &&
                    !ISSET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED)) {
+
                        while (cc > 0) {
                                int cn_trapped = 0;
 
@@ -1647,11 +1654,12 @@
                        }
                }
 
+
                msts = sc->read_modem_status(sc);
                delta = msts ^ sc->sc_msts;
                sc->sc_msts = msts;
 
-#if 0
+#ifdef notyet
                /*
                 * Pulse-per-second (PSS) signals on edge of DCD?
                 * Process these even if line discipline is ignoring DCD.
@@ -1739,32 +1747,72 @@
                }
 
 
-               /*
-                * See if data can be transmitted as well. Schedule tx
-                * done event if no data left and tty was marked busy.
+       } while (0);
+
+       SSCOM_UNLOCK(sc);
+
+       /* Wake up the poller. */
+       softintr_schedule(sc->sc_si);
+
+#if NRND > 0 && defined(RND_COM)
+       rnd_add_uint32(&sc->rnd_source, iir | rsr);
+#endif
+
+       return 1;
+}
+
+int
+sscomtxintr(void *arg)
+{
+       struct sscom_softc *sc = arg;
+       bus_space_tag_t iot = sc->sc_iot;
+       bus_space_handle_t ioh = sc->sc_ioh;
+       uint16_t ufstat;
+
+       if (SSCOM_ISALIVE(sc) == 0)
+               return 0;
+
+       SSCOM_LOCK(sc);
+
+       ufstat = bus_space_read_2(iot, ioh, SSCOM_UFSTAT);
+
+       /*
+        * If we've delayed a parameter change, do it
+        * now, and restart * output.
+        */
+       if (sc->sc_heldchange && (ufstat & UFSTAT_TXCOUNT) == 0) {
+               /* XXX: we should check transmitter empty also */
+               sscom_loadchannelregs(sc);
+               sc->sc_heldchange = 0;
+               sc->sc_tbc = sc->sc_heldtbc;
+               sc->sc_heldtbc = 0;
+       }
+
+       /*
+        * See if data can be transmitted as well. Schedule tx
+        * done event if no data left and tty was marked busy.
+        */
+       if (!ISSET(ufstat,UFSTAT_TXFULL)) {
+               /* 
+                * Output the next chunk of the contiguous
+                * buffer, if any.
                 */
-               if (!ISSET(ufstat,UFSTAT_TXFULL)) {
-                       /* 
-                        * Output the next chunk of the contiguous
-                        * buffer, if any.
+               if (sc->sc_tbc > 0) {
+                       __sscom_output_chunk(sc, ufstat);
+               }
+               else {
+                       /*
+                        * Disable transmit sscompletion
+                        * interrupts if necessary.
                         */
-                       if (sc->sc_tbc > 0) {
-                               sscom_output_chunk(sc);
-                       }
-                       else {
-                               /*
-                                * Disable transmit sscompletion
-                                * interrupts if necessary.
-                                */
-                               if (sc->sc_hwflags & SSCOM_HW_TXINT)
-                                       sscom_disable_txint(sc);
-                               if (sc->sc_tx_busy) {
-                                       sc->sc_tx_busy = 0;
-                                       sc->sc_tx_done = 1;
-                               }
+                       if (sc->sc_hwflags & SSCOM_HW_TXINT)
+                               sscom_disable_txint(sc);
+                       if (sc->sc_tx_busy) {
+                               sc->sc_tx_busy = 0;
+                               sc->sc_tx_done = 1;
                        }
                }
-       } while (0);
+       }
 
        SSCOM_UNLOCK(sc);
 
diff -r 050920c46e18 -r 55315c1ccb97 sys/arch/arm/s3c2xx0/sscom_s3c2800.c
--- a/sys/arch/arm/s3c2xx0/sscom_s3c2800.c      Thu Jul 31 17:51:09 2003 +0000
+++ b/sys/arch/arm/s3c2xx0/sscom_s3c2800.c      Thu Jul 31 19:08:10 2003 +0000
@@ -1,8 +1,8 @@
-/*     $NetBSD: sscom_s3c2800.c,v 1.4 2003/07/15 00:24:49 lukem Exp $ */
+/*     $NetBSD: sscom_s3c2800.c,v 1.5 2003/07/31 19:08:10 bsh Exp $ */
 
 /*
- * Copyright (c) 2002 Fujitsu Component Limited
- * Copyright (c) 2002 Genetec Corporation
+ * Copyright (c) 2002, 2003 Fujitsu Component Limited
+ * Copyright (c) 2002, 2003 Genetec Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sscom_s3c2800.c,v 1.4 2003/07/15 00:24:49 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sscom_s3c2800.c,v 1.5 2003/07/31 19:08:10 bsh Exp $");
 
 #include "opt_sscom.h"
 #include "opt_ddb.h"
@@ -99,29 +99,6 @@
        return unit == 0 || unit == 1;
 }
 
-int tx_int(void *);
-int rx_int(void *);
-int err_int(void *);
-
-int
-tx_int(void *arg)
-{
-       return sscomintr(arg);
-}
-
-int
-rx_int(void *arg)
-{
-       return sscomintr(arg);
-}
-
-int
-err_int(void *arg)
-{
-       return sscomintr(arg);
-}
-
-
 static void
 sscom_attach(struct device *parent, struct device *self, void *aux)
 {
@@ -147,11 +124,11 @@
        printf("\n");
 
        s3c2800_intr_establish(s3c2800_uart_config[unit].tx_int,
-           IPL_SERIAL, IST_LEVEL, tx_int, sc);
+           IPL_SERIAL, IST_LEVEL, sscomtxintr, sc);
        s3c2800_intr_establish(s3c2800_uart_config[unit].rx_int,
-           IPL_SERIAL, IST_LEVEL, rx_int, sc);
+           IPL_SERIAL, IST_LEVEL, sscomrxintr, sc);
        s3c2800_intr_establish(s3c2800_uart_config[unit].err_int,
-           IPL_SERIAL, IST_LEVEL, err_int, sc);
+           IPL_SERIAL, IST_LEVEL, sscomrxintr, sc);
        sscom_disable_txrxint(sc);
 
        sscom_attach_subr(sc);
diff -r 050920c46e18 -r 55315c1ccb97 sys/arch/arm/s3c2xx0/sscom_var.h
--- a/sys/arch/arm/s3c2xx0/sscom_var.h  Thu Jul 31 17:51:09 2003 +0000
+++ b/sys/arch/arm/s3c2xx0/sscom_var.h  Thu Jul 31 19:08:10 2003 +0000
@@ -1,8 +1,8 @@
-/* $NetBSD: sscom_var.h,v 1.3 2003/06/23 11:01:09 martin Exp $ */
+/* $NetBSD: sscom_var.h,v 1.4 2003/07/31 19:08:10 bsh Exp $ */
 
 /*
- * Copyright (c) 2002 Fujitsu Component Limited
- * Copyright (c) 2002 Genetec Corporation
+ * Copyright (c) 2002, 2003 Fujitsu Component Limited
+ * Copyright (c) 2002, 2003 Genetec Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -227,7 +227,8 @@
 int    sscomread(dev_t, struct uio *, int);
 void   sscom_config(struct sscom_softc *);
 
-int    sscomintr(void *);
+int    sscomtxintr(void *);
+int    sscomrxintr(void *);
 
 int    sscom_cnattach(bus_space_tag_t, const struct sscom_uart_info *, 
            int, int, tcflag_t);



Home | Main Index | Thread Index | Old Index