Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arc/dev Moved from /cvsroot/syssrc/sys/arch/pica/de...



details:   https://anonhg.NetBSD.org/src/rev/4892008b35e4
branches:  trunk
changeset: 480968:4892008b35e4
user:      soda <soda%NetBSD.org@localhost>
date:      Sun Jan 23 20:08:11 2000 +0000

description:
Moved from /cvsroot/syssrc/sys/arch/pica/dev/if_sn.c,v

diffstat:

 sys/arch/arc/dev/if_sn.c |  1320 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1320 insertions(+), 0 deletions(-)

diffs (truncated from 1324 to 300 lines):

diff -r a6a05be1e26b -r 4892008b35e4 sys/arch/arc/dev/if_sn.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arc/dev/if_sn.c  Sun Jan 23 20:08:11 2000 +0000
@@ -0,0 +1,1320 @@
+/*     $NetBSD: if_sn.c,v 1.14 2000/01/23 20:08:12 soda Exp $  */
+
+/*
+ * National Semiconductor  SONIC Driver
+ * Copyright (c) 1991   Algorithmics Ltd (http://www.algor.co.uk)
+ * You may use, copy, and modify this program so long as you retain the
+ * copyright line.
+ *
+ * This driver has been substantially modified since Algorithmics donated
+ * it.
+ */
+
+#include "sn.h"
+#include "opt_inet.h"
+#include "opt_ns.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/mbuf.h>
+#include <sys/buf.h>
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/syslog.h>
+#include <sys/ioctl.h>
+#include <sys/errno.h>
+#include <sys/device.h>
+#include <machine/autoconf.h>
+
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_ether.h>
+#include <net/if_media.h>
+
+#ifdef INET
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/in_var.h>
+#include <netinet/ip.h>
+#include <netinet/if_inarp.h>
+#endif
+
+#include <machine/cpu.h>
+#include <machine/bus.h>
+
+#ifdef NS
+#include <netns/ns.h>
+#include <netns/ns_if.h>
+#endif
+
+#ifdef RMP
+#include <netrmp/rmp.h>
+#include <netrmp/rmp_var.h>
+#endif
+
+#include <vm/vm.h>
+
+#include "bpfilter.h"
+#if NBPFILTER > 0
+#include <net/bpf.h>
+#include <net/bpfdesc.h>
+#endif
+
+#include <machine/bus.h>
+
+#define SONICDW 32
+typedef unsigned char uchar;
+
+#include <mips/cpuregs.h>      /* XXX */
+#include <pica/dev/if_sn.h>
+#define SWR(a, x)      (a) = (x)
+#define SRD(a)         ((a) & 0xffff)
+
+
+/*
+ * Statistics collected over time
+ */
+struct sn_stats {
+       int     ls_opacks;      /* packets transmitted */
+       int     ls_ipacks;      /* packets received */
+       int     ls_tdr;         /* contents of tdr after collision */
+       int     ls_tdef;        /* packets where had to wait */
+       int     ls_tone;        /* packets with one retry */
+       int     ls_tmore;       /* packets with more than one retry */
+       int     ls_tbuff;       /* transmit buff errors */
+       int     ls_tuflo;       /* "      uflo  "     */
+       int     ls_tlcol;
+       int     ls_tlcar;
+       int     ls_trtry;
+       int     ls_rbuff;       /* receive buff errors */
+       int     ls_rfram;       /* framing     */
+       int     ls_roflo;       /* overflow    */
+       int     ls_rcrc;
+       int     ls_rrng;        /* rx ring sequence error */
+       int     ls_babl;        /* chip babl error */
+       int     ls_cerr;        /* collision error */
+       int     ls_miss;        /* missed packet */
+       int     ls_merr;        /* memory error */
+       int     ls_copies;      /* copies due to out of range mbufs */
+       int     ls_maxmbufs;    /* max mbufs on transmit */
+       int     ls_maxslots;    /* max ring slots on transmit */
+};
+
+struct sn_softc {
+       struct  device sc_dev;
+       struct  ethercom sc_ec;
+#define        sc_if           sc_ec.ec_if     /* network visible interface */
+
+       struct sonic_reg *sc_csr;       /* hardware pointer */
+       dma_softc_t     __dma;          /* stupid macro ... */
+       dma_softc_t     *dma;           /* dma mapper control */
+       int     sc_rxmark;              /* position in rx ring for reading buffs */
+
+       int     sc_rramark;             /* index into rra of wp */
+
+       int     sc_txhead;              /* index of first TDA passed to chip  */
+       int     sc_missed;              /* missed packet counter */
+       struct  RXpkt *sc_lrxp;         /* last RDA available to chip */
+       struct  sn_stats sc_sum;
+       short   sc_iflags;
+} sn_softc;
+
+int snmatch __P((struct device *, void *, void *));
+void snattach __P((struct device *, struct device *, void *));
+
+struct cfattach sn_ca = {
+       sizeof(struct sn_softc), snmatch, snattach
+};
+
+
+
+void   m_check __P((struct mbuf *m));
+void   m_checkm __P((struct mbuf *m));
+
+void 
+m_check(m)
+       struct mbuf *m;
+{
+       if (m->m_flags & M_EXT) {
+               assert(m->m_len >= 0);
+               assert(m->m_len <= m->m_ext.ext_size);
+               assert(m->m_data >= &m->m_ext.ext_buf[0]);
+               assert(m->m_data <= &m->m_ext.ext_buf[m->m_ext.ext_size]);
+               assert(m->m_data + m->m_len <= &m->m_ext.ext_buf[m->m_ext.ext_size]);
+       } else if (m->m_flags & M_PKTHDR) {
+               assert(m->m_len >= 0);
+               assert(m->m_len <= MHLEN);
+               assert(m->m_data >= m->m_pktdat);
+               assert(m->m_data <= &m->m_pktdat[MHLEN]);
+               assert(m->m_data + m->m_len <= &m->m_pktdat[MHLEN]);
+       } else {
+               assert(m->m_len >= 0);
+               assert(m->m_len <= MLEN);
+               assert(m->m_data >= m->m_dat);
+               assert(m->m_data <= &m->m_dat[MLEN]);
+               assert(m->m_data + m->m_len <= &m->m_dat[MLEN]);
+       }
+}
+
+void 
+m_checkm(m)
+       struct mbuf *m;
+{
+       while (m) {
+               m_check(m);
+               m = m->m_next;
+       }
+}
+
+int ethdebug = 0;
+
+int snintr __P((struct sn_softc *));
+int snioctl __P((struct ifnet *ifp, u_long cmd, caddr_t data));
+void snstart __P((struct ifnet *ifp));
+void snwatchdog __P((struct ifnet *ifp));
+void snreset __P((struct sn_softc *sc));
+
+/*
+ * SONIC buffers need to be aligned 16 or 32 bit aligned.
+ * These macros calculate and verify alignment.
+ */
+#if SONICDW == 32
+#define SONICALIGN 4
+#else
+#define SONICALIGN 2
+#endif
+#define SOALIGN(array) (((int)array+SONICALIGN-1) & ~(SONICALIGN-1))
+#define SOALIGNED(p) (!(((uint)p)&(SONICALIGN-1)))
+
+#define UPPER(x) ((unsigned)(x) >> 16)
+#define LOWER(x) ((unsigned)(x) & 0xffff)
+
+#define NRRA   32              /* # receive resource descriptors */
+#define RRAMASK        0x1f            /* why it must be poer of two */
+
+#define NRBA   16              /* # receive buffers < NRRA */
+#define NRDA   NRBA            /* # receive descriptors */
+#define NTDA   4               /* # transmit descriptors */
+
+#define CDASIZE sizeof(struct CDA)
+#define RRASIZE (NRRA*sizeof(struct RXrsrc))
+#define RDASIZE (NRDA*sizeof(struct RXpkt))
+#define TDASIZE (NTDA*sizeof(struct TXpkt))
+
+#define FCSSIZE        4               /* size of FCS append te received packets */
+
+/*
+ * maximum recieve packet size plus 2 byte pad to make each
+ * one aligned. 4 byte slop (required for eobc)
+ */
+#define RBASIZE        (sizeof(struct ether_header) + ETHERMTU + FCSSIZE + 2 + 4)
+
+/*
+ * space requiered for descriptors
+ */
+#define DESC_SIZE (RRASIZE + CDASIZE + RDASIZE + TDASIZE + SONICALIGN - 1)
+
+/*
+ *  This should really be 'allocated' but for now we
+ *  'hardwire' it.
+ */
+#define SONICBUF       0xa0010000
+
+/*
+ *  Nicely aligned pointers into the sonicbuffers
+ *  p_ points at physical (K1_SEG) addresses.
+ *  v_ is dma viritual address used by sonic.
+ */
+struct RXrsrc  *p_rra; /* receiver resource descriptors */
+struct RXrsrc  *v_rra;
+struct RXpkt   *p_rda; /* receiver desriptors */
+struct RXpkt   *v_rda;
+struct TXpkt   *p_tda; /* transmitter descriptors */
+struct TXpkt   *v_tda;
+struct CDA     *p_cda; /* CAM descriptors */
+struct CDA     *v_cda;
+char           *p_rba; /* receive buffer area base */
+char           *v_rba;
+
+/* Meta transmit descriptors */
+struct mtd {
+       struct  mtd *mtd_link;
+       struct  TXpkt *mtd_txp;
+       struct  mbuf *mtd_mbuf;
+} mtda[NTDA];
+
+struct mtd *mtdfree;           /* list of free meta transmit descriptors */
+struct mtd *mtdhead;           /* head of descriptors assigned to chip */
+struct mtd *mtdtail;           /* tail of descriptors assigned to chip */
+struct mtd *mtdnext;           /* next descriptor to give to chip */
+
+void mtd_free __P((struct mtd *));
+struct mtd *mtd_alloc __P((void));
+
+int sngetaddr __P((struct sn_softc *sc, uchar *ap));
+int sninit __P((struct sn_softc *sc));
+int snstop __P((struct sn_softc *sc));
+int sonicput __P((struct sn_softc *sc, struct mbuf *m0));
+
+void camdump __P((struct sn_softc *sc));
+
+int
+snmatch(parent, match, aux)
+       struct device *parent;
+       void *match, *aux;
+{
+       /*struct cfdata *cf = match;*/
+       struct confargs *ca = aux;
+
+       /* XXX CHECK BUS */
+       /* make sure that we're looking for this type of device. */
+       if (!BUS_MATCHNAME(ca, "sonic"))
+               return (0);
+
+       return (1);
+}
+
+/*
+ * Interface exists: make available by filling in network interface
+ * record.  System will initialize the interface when it is ready
+ * to accept packets.
+ */
+void
+snattach(parent, self, aux)
+       struct device *parent, *self;
+       void   *aux;
+{
+       struct sn_softc *sc = (void *)self;
+       struct confargs *ca = aux;
+       struct ifnet *ifp = &sc->sc_if;
+       /*struct cfdata *cf = sc->sc_dev.dv_cfdata;*/
+       int p, pp;
+       uchar myaddr[ETHER_ADDR_LEN];
+
+       sc->sc_csr = (struct sonic_reg *)BUS_CVTADDR(ca);
+
+       sc->dma = &sc->__dma;



Home | Main Index | Thread Index | Old Index