root/dev/ic/midwayvar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: midwayvar.h,v 1.12 2003/10/21 18:58:49 jmc Exp $      */
    2 
    3 /*
    4  *
    5  * Copyright (c) 1996 Charles D. Cranor and Washington University.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. All advertising materials mentioning features or use of this software
   17  *    must display the following acknowledgement:
   18  *      This product includes software developed by Charles D. Cranor and
   19  *      Washington University.
   20  * 4. The name of the author may not be used to endorse or promote products
   21  *    derived from this software without specific prior written permission.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   25  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   26  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   28  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   33  */
   34 
   35 /*
   36  * m i d w a y v a r . h
   37  *
   38  * we define the en_softc here so that bus specific modules can allocate
   39  * it as the first item in their softc.   note that BSD-required 
   40  * "struct device" is in the mid_softc!
   41  *
   42  * author: Chuck Cranor <chuck@ccrc.wustl.edu>
   43  */
   44 
   45 /*
   46  * params needed to determine softc size
   47  */
   48 
   49 #ifndef EN_NTX
   50 #define EN_NTX          8       /* number of tx bufs to use */
   51 #endif
   52 #ifndef EN_TXSZ
   53 #define EN_TXSZ         32      /* transmit buf size in KB */
   54 #endif
   55 #ifndef EN_RXSZ
   56 #define EN_RXSZ         32      /* recv buf size in KB */
   57 #endif
   58 #define EN_MAXNRX       ((2048-(EN_NTX*EN_TXSZ))/EN_RXSZ)
   59                                 /* largest possible NRX (depends on RAM size) */
   60 
   61 
   62 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)
   63 #define EN_INTR_TYPE int
   64 #define EN_INTR_RET(X) return(X)
   65 #if defined(__NetBSD__) || defined(__OpenBSD__)
   66 #define EN_IOCTL_CMDT u_long
   67 #elif defined(__bsdi__)
   68 #define EN_IOCTL_CMDT int
   69 #endif
   70 
   71 #elif defined(__FreeBSD__)
   72 
   73 #define EN_INTR_TYPE void
   74 #define EN_INTR_RET(X) return
   75 #define EN_IOCTL_CMDT int
   76 
   77 struct device {
   78   char dv_xname[IFNAMSIZ];
   79 };
   80 
   81 #define DV_IFNET 1
   82 
   83 struct cfdriver {
   84   int zero;
   85   char *name;
   86   int one;
   87   int cd_ndevs;
   88   void *cd_devs[NEN];
   89 };
   90 
   91 #endif
   92 
   93 
   94 /*
   95  * softc
   96  */
   97 
   98 struct en_softc {
   99   /* bsd glue */
  100   struct device sc_dev;         /* system device */
  101   struct ifnet enif;            /* network ifnet handle */
  102 
  103   /* bus glue */
  104   bus_space_tag_t en_memt;      /* for EN_READ/EN_WRITE */
  105   bus_space_handle_t en_base;   /* base of en card */
  106   bus_size_t en_obmemsz;        /* size of en card (bytes) */
  107   void (*en_busreset)(void *);  /* bus specific reset function */
  108 
  109   /* serv list */
  110   u_int32_t hwslistp;           /* hw pointer to service list (byte offset) */
  111   u_int16_t swslist[MID_SL_N];  /* software service list (see en_service()) */
  112   u_int16_t swsl_head,          /* ends of swslist (index into swslist) */
  113             swsl_tail;
  114   u_int32_t swsl_size;          /* # of items in swsl */
  115   
  116 
  117   /* xmit dma */
  118   u_int32_t dtq[MID_DTQ_N];     /* sw copy of dma q (see ENIDQ macros) */
  119   u_int32_t dtq_free;           /* # of dtq's free */
  120   u_int32_t dtq_us;             /* software copy of our pointer (byte offset) */
  121   u_int32_t dtq_chip;           /* chip's pointer (byte offset) */
  122   u_int32_t need_dtqs;          /* true if we ran out of DTQs */
  123 
  124   /* recv dma */
  125   u_int32_t drq[MID_DRQ_N];     /* sw copy of dma q (see ENIDQ macros) */
  126   u_int32_t drq_free;           /* # of drq's free */
  127   u_int32_t drq_us;             /* software copy of our pointer (byte offset) */
  128   u_int32_t drq_chip;           /* chip's pointer (byte offset) */
  129   u_int32_t need_drqs;          /* true if we ran out of DRQs */
  130 
  131   /* xmit buf ctrl. (per channel) */
  132   struct {
  133     u_int32_t mbsize;           /* # mbuf bytes we are using (max=TXHIWAT) */
  134     u_int32_t bfree;            /* # free bytes in buffer (not dma or xmit) */
  135     u_int32_t start, stop;      /* ends of buffer area (byte offset) */
  136     u_int32_t cur;              /* next free area (byte offset) */
  137     u_int32_t nref;             /* # of VCs using this channel */
  138     struct ifqueue indma;       /* mbufs being dma'd now */
  139     struct ifqueue q;           /* mbufs waiting for dma now */
  140   } txslot[MID_NTX_CH];
  141 
  142   /* xmit vc ctrl. (per vc) */
  143   u_int8_t txspeed[MID_N_VC];   /* speed of tx on a VC */
  144   u_int8_t txvc2slot[MID_N_VC]; /* map VC to slot */
  145 
  146   /* recv vc ctrl. (per vc).   maps VC number to recv slot */
  147   u_int16_t rxvc2slot[MID_N_VC];
  148   int en_nrx;                   /* # of active rx slots */
  149 
  150   /* recv buf ctrl. (per recv slot) */
  151   struct {
  152     void *rxhand;               /* recv. handle if doing direct delivery */
  153     u_int32_t mode;             /* saved copy of mode info */
  154     u_int32_t start, stop;      /* ends of my buffer area */
  155     u_int32_t cur;              /* where I am at */
  156     u_int16_t atm_vci;          /* backpointer to VCI */
  157     u_int8_t atm_flags;         /* copy of atm_flags from atm_ph */
  158     u_int8_t oth_flags;         /* other flags */
  159     u_int32_t raw_threshold;    /* for raw mode */
  160     struct ifqueue indma;       /* mbufs being dma'd now */
  161     struct ifqueue q;           /* mbufs waiting for dma now */
  162   } rxslot[EN_MAXNRX];          /* recv info */
  163 
  164   /* stats */
  165   u_int32_t vtrash;             /* sw copy of counter */
  166   u_int32_t otrash;             /* sw copy of counter */
  167   u_int32_t ttrash;             /* # of RBD's with T bit set */
  168   u_int32_t mfix;               /* # of times we had to call mfix */
  169   u_int32_t mfixfail;           /* # of times mfix failed */
  170   u_int32_t headbyte;           /* # of times we used BYTE DMA at front */
  171   u_int32_t tailbyte;           /* # of times we used BYTE DMA at end */
  172   u_int32_t tailflush;          /* # of times we had to FLUSH out DMA bytes */
  173   u_int32_t txmbovr;            /* # of times we dropped due to mbsize */
  174   u_int32_t dmaovr;             /* tx dma overflow count */
  175   u_int32_t txoutspace;         /* out of space in xmit buffer */
  176   u_int32_t txdtqout;           /* out of DTQs */
  177   u_int32_t launch;             /* total # of launches */
  178   u_int32_t lheader;            /* # of launches without OB header */
  179   u_int32_t ltail;              /* # of launches without OB tail */
  180   u_int32_t hwpull;             /* # of pulls off hardware service list */
  181   u_int32_t swadd;              /* # of pushes on sw service list */
  182   u_int32_t rxqnotus;           /* # of times we pull from rx q, but fail */
  183   u_int32_t rxqus;              /* # of good pulls from rx q */
  184   u_int32_t rxoutboth;          /* # of times out of mbufs and DRQs */
  185   u_int32_t rxdrqout;           /* # of times out of DRQs */
  186   u_int32_t rxmbufout;          /* # of time out of mbufs */
  187 
  188   /* random stuff */
  189   u_int32_t ipl;                /* sbus interrupt lvl (1 on pci?) */
  190   u_int8_t bestburstcode;       /* code of best burst we can use */
  191   u_int8_t bestburstlen;        /* length of best burst (bytes) */
  192   u_int8_t bestburstshift;      /* (x >> shift) == (x / bestburstlen) */
  193   u_int8_t bestburstmask;       /* bits to check if not multiple of burst */
  194   u_int8_t alburst;             /* align dma bursts? */
  195   u_int8_t is_adaptec;          /* adaptec version of midway? */
  196 };
  197 
  198 /*
  199  * exported functions
  200  */
  201 
  202 void    en_attach(struct en_softc *);
  203 EN_INTR_TYPE    en_intr(void *);
  204 void    en_reset(struct en_softc *);

/* [<][>][^][v][top][bottom][index][help] */