The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/le/lancevar.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: lancevar.h,v 1.10 2005/12/11 12:21:27 christos Exp $   */
    2 
    3 /*-
    4  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
    5  *
    6  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
    7  * All rights reserved.
    8  *
    9  * This code is derived from software contributed to The NetBSD Foundation
   10  * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
   11  * Simulation Facility, NASA Ames Research Center.
   12  *
   13  * Redistribution and use in source and binary forms, with or without
   14  * modification, are permitted provided that the following conditions
   15  * are met:
   16  * 1. Redistributions of source code must retain the above copyright
   17  *    notice, this list of conditions and the following disclaimer.
   18  * 2. Redistributions in binary form must reproduce the above copyright
   19  *    notice, this list of conditions and the following disclaimer in the
   20  *    documentation and/or other materials provided with the distribution.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   25  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   32  * POSSIBILITY OF SUCH DAMAGE.
   33  */
   34 
   35 /* $FreeBSD: releng/12.0/sys/dev/le/lancevar.h 326255 2017-11-27 14:52:40Z pfg $ */
   36 
   37 #ifndef _DEV_LE_LANCEVAR_H_
   38 #define _DEV_LE_LANCEVAR_H_
   39 
   40 extern devclass_t le_devclass;
   41 
   42 struct lance_softc {
   43         struct ifnet    *sc_ifp;
   44         struct ifmedia  sc_media;
   45         struct mtx      sc_mtx;
   46         struct callout  sc_wdog_ch;
   47         int             sc_wdog_timer;
   48 
   49         /*
   50          * Memory functions:
   51          *
   52          *      copy to/from descriptor
   53          *      copy to/from buffer
   54          *      zero bytes in buffer
   55          */
   56         void    (*sc_copytodesc)(struct lance_softc *, void *, int, int);
   57         void    (*sc_copyfromdesc)(struct lance_softc *, void *, int, int);
   58         void    (*sc_copytobuf)(struct lance_softc *, void *, int, int);
   59         void    (*sc_copyfrombuf)(struct lance_softc *, void *, int, int);
   60         void    (*sc_zerobuf)(struct lance_softc *, int, int);
   61 
   62         /*
   63          * Machine-dependent functions:
   64          *
   65          *      read/write CSR
   66          *      hardware reset hook - may be NULL
   67          *      hardware init hook - may be NULL
   68          *      no carrier hook - may be NULL
   69          *      media change hook - may be NULL
   70          */
   71         uint16_t        (*sc_rdcsr)(struct lance_softc *, uint16_t);
   72         void    (*sc_wrcsr)(struct lance_softc *, uint16_t, uint16_t);
   73         void    (*sc_hwreset)(struct lance_softc *);
   74         void    (*sc_hwinit)(struct lance_softc *);
   75         int     (*sc_hwintr)(struct lance_softc *);
   76         void    (*sc_nocarrier)(struct lance_softc *);
   77         int     (*sc_mediachange)(struct lance_softc *);
   78         void    (*sc_mediastatus)(struct lance_softc *, struct ifmediareq *);
   79 
   80         /*
   81          * Media-supported by this interface.  If this is NULL,
   82          * the only supported media is assumed to be "manual".
   83          */
   84         const int       *sc_supmedia;
   85         int     sc_nsupmedia;
   86         int     sc_defaultmedia;
   87 
   88         uint16_t        sc_conf3;       /* CSR3 value */
   89 
   90         void    *sc_mem;                /* base address of RAM - CPU's view */
   91         bus_addr_t      sc_addr;        /* base address of RAM - LANCE's view */
   92 
   93         bus_size_t      sc_memsize;     /* size of RAM */
   94 
   95         int     sc_nrbuf;       /* number of receive buffers */
   96         int     sc_ntbuf;       /* number of transmit buffers */
   97         int     sc_last_rd;
   98         int     sc_first_td;
   99         int     sc_last_td;
  100         int     sc_no_td;
  101 
  102         int     sc_initaddr;
  103         int     sc_rmdaddr;
  104         int     sc_tmdaddr;
  105         int     sc_rbufaddr;
  106         int     sc_tbufaddr;
  107 
  108         uint8_t sc_enaddr[ETHER_ADDR_LEN];
  109 
  110         void    (*sc_meminit)(struct lance_softc *);
  111         void    (*sc_start_locked)(struct lance_softc *);
  112 
  113         int     sc_flags;
  114 #define LE_ALLMULTI     (1 << 0)
  115 #define LE_BSWAP        (1 << 1)
  116 #define LE_CARRIER      (1 << 2)
  117 #define LE_DEBUG        (1 << 3)
  118 #define LE_PROMISC      (1 << 4)
  119 };
  120 
  121 #define LE_LOCK_INIT(_sc, _name)                                        \
  122         mtx_init(&(_sc)->sc_mtx, _name, MTX_NETWORK_LOCK, MTX_DEF)
  123 #define LE_LOCK_INITIALIZED(_sc)        mtx_initialized(&(_sc)->sc_mtx)
  124 #define LE_LOCK(_sc)                    mtx_lock(&(_sc)->sc_mtx)
  125 #define LE_UNLOCK(_sc)                  mtx_unlock(&(_sc)->sc_mtx)
  126 #define LE_LOCK_ASSERT(_sc, _what)      mtx_assert(&(_sc)->sc_mtx, (_what))
  127 #define LE_LOCK_DESTROY(_sc)            mtx_destroy(&(_sc)->sc_mtx)
  128 
  129 /*
  130  * Unfortunately, manual byte swapping is only necessary for the PCnet-PCI
  131  * variants but not for the original LANCE or ILACC so we cannot do this
  132  * with #ifdefs resolved at compile time.
  133  */
  134 #define LE_HTOLE16(v)   (((sc)->sc_flags & LE_BSWAP) ? htole16(v) : (v))
  135 #define LE_HTOLE32(v)   (((sc)->sc_flags & LE_BSWAP) ? htole32(v) : (v))
  136 #define LE_LE16TOH(v)   (((sc)->sc_flags & LE_BSWAP) ? le16toh(v) : (v))
  137 #define LE_LE32TOH(v)   (((sc)->sc_flags & LE_BSWAP) ? le32toh(v) : (v))
  138 
  139 int lance_config(struct lance_softc *, const char*, int);
  140 void lance_attach(struct lance_softc *);
  141 void lance_detach(struct lance_softc *);
  142 void lance_suspend(struct lance_softc *);
  143 void lance_resume(struct lance_softc *);
  144 void lance_init_locked(struct lance_softc *);
  145 int lance_put(struct lance_softc *, int, struct mbuf *);
  146 struct mbuf *lance_get(struct lance_softc *, int, int);
  147 void lance_setladrf(struct lance_softc *, u_int16_t *);
  148 
  149 /*
  150  * The following functions are only useful on certain CPU/bus
  151  * combinations.  They should be written in assembly language for
  152  * maximum efficiency, but machine-independent versions are provided
  153  * for drivers that have not yet been optimized.
  154  */
  155 void lance_copytobuf_contig(struct lance_softc *, void *, int, int);
  156 void lance_copyfrombuf_contig(struct lance_softc *, void *, int, int);
  157 void lance_zerobuf_contig(struct lance_softc *, int, int);
  158 
  159 #if 0   /* Example only - see lance.c */
  160 void lance_copytobuf_gap2(struct lance_softc *, void *, int, int);
  161 void lance_copyfrombuf_gap2(struct lance_softc *, void *, int, int);
  162 void lance_zerobuf_gap2(struct lance_softc *, int, int);
  163 
  164 void lance_copytobuf_gap16(struct lance_softc *, void *, int, int);
  165 void lance_copyfrombuf_gap16(struct lance_softc *, void *, int, int);
  166 void lance_zerobuf_gap16(struct lance_softc *, int, int);
  167 #endif /* Example only */
  168 
  169 /*
  170  * Compare two Ether/802 addresses for equality, inlined and
  171  * unrolled for speed.  Use this like memcmp().
  172  *
  173  * XXX: Add <machine/inlines.h> for stuff like this?
  174  * XXX: or maybe add it to libkern.h instead?
  175  *
  176  * "I'd love to have an inline assembler version of this."
  177  * XXX: Who wanted that? mycroft?  I wrote one, but this
  178  * version in C is as good as hand-coded assembly. -gwr
  179  *
  180  * Please do NOT tweak this without looking at the actual
  181  * assembly code generated before and after your tweaks!
  182  */
  183 static inline uint16_t
  184 ether_cmp(void *one, void *two)
  185 {
  186         uint16_t *a = (u_short *)one;
  187         uint16_t *b = (u_short *)two;
  188         uint16_t diff;
  189 
  190 #ifdef  m68k
  191         /*
  192          * The post-increment-pointer form produces the best
  193          * machine code for m68k.  This was carefully tuned
  194          * so it compiles to just 8 short (2-byte) op-codes!
  195          */
  196         diff  = *a++ - *b++;
  197         diff |= *a++ - *b++;
  198         diff |= *a++ - *b++;
  199 #else
  200         /*
  201          * Most modern CPUs do better with a single expresion.
  202          * Note that short-cut evaluation is NOT helpful here,
  203          * because it just makes the code longer, not faster!
  204          */
  205         diff = (a[0] - b[0]) | (a[1] - b[1]) | (a[2] - b[2]);
  206 #endif
  207 
  208         return (diff);
  209 }
  210 
  211 #endif /* _DEV_LE_LANCEVAR_H_ */

Cache object: 6d008cac8fe84b1fc9f618c3475502d8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.