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/ic/i82596var.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: i82596var.h,v 1.10 2008/04/04 17:03:42 tsutsui Exp $ */
    2 
    3 /*
    4  * Copyright (c) 2003 Jochen Kunz.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. The name of Jochen Kunz may not be used to endorse or promote
   16  *    products derived from this software without specific prior
   17  *    written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY JOCHEN KUNZ
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JOCHEN KUNZ
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 /* All definitions are for a Intel 82596 DX/SX / CA in linear 32 bit mode. */
   33 
   34 
   35 
   36 /* Supported chip variants */
   37 extern const char *i82596_typenames[];
   38 enum i82596_types { I82596_UNKNOWN, I82596_DX, I82596_CA };
   39 
   40 
   41 
   42 /* System Configuration Pointer */
   43 struct iee_scp {
   44         volatile uint16_t scp_pad1;
   45         volatile uint16_t scp_sysbus;           /* Sysbus Byte */
   46         volatile uint32_t scp_pad2;
   47         volatile uint32_t scp_iscp_addr;        /* Int. Sys. Conf. Pointer */
   48 } __packed;
   49 
   50 
   51 
   52 /* Intermediate System Configuration Pointer */
   53 struct iee_iscp {
   54         volatile uint16_t iscp_bussy;           /* Even Word, bits 0..15 */
   55         volatile uint16_t iscp_pad;             /* Odd Word, bits 16..32 */
   56         volatile uint32_t iscp_scb_addr;        /* address of SCB */
   57 } __packed;
   58 
   59 
   60 
   61 /* System Control Block */
   62 struct iee_scb {
   63         volatile uint16_t scb_status;           /* Status Bits */
   64         volatile uint16_t scb_cmd;              /* Command Bits */
   65         volatile uint32_t scb_cmd_blk_addr;     /* Command Block Address */
   66         volatile uint32_t scb_rfa_addr;         /* Receive Frame Area Address */
   67         volatile uint32_t scb_crc_err;          /* CRC Errors */
   68         volatile uint32_t scb_align_err;        /* Alignment Errors */
   69         volatile uint32_t scb_resource_err;     /* Resource Errors [1] */
   70         volatile uint32_t scb_overrun_err;      /* Overrun Errors [1] */
   71         volatile uint32_t scb_rcvcdt_err;       /* RCVCDT Errors [1] */
   72         volatile uint32_t scb_short_fr_err;     /* Short Frame Errors */
   73         volatile uint16_t scb_tt_off;           /* Bus Throtle Off Timer */
   74         volatile uint16_t scb_tt_on;            /* Bus Throtle On Timer */
   75 } __packed;
   76 /* [1] In MONITOR mode these counters change function. */
   77 
   78 
   79 
   80 /* Command Block */
   81 struct iee_cb {
   82         volatile uint16_t cb_status;            /* Status Bits */
   83         volatile uint16_t cb_cmd;               /* Command Bits */
   84         volatile uint32_t cb_link_addr;         /* Link Address to next CMD */
   85         union {
   86                 volatile uint8_t cb_ind_addr[8];/* Individual Address */
   87                 volatile uint8_t cb_cf[16];     /* Configuration Bytes */
   88                 struct {
   89                         volatile uint16_t mc_size;/* Num bytes of Mcast Addr.*/
   90                         volatile uint8_t mc_addrs[6]; /* List of Mcast Addr. */
   91                 } cb_mcast;
   92                 struct {
   93                         volatile uint32_t tx_tbd_addr;/* TX Buf. Descr. Addr.*/
   94                         volatile uint16_t tx_tcb_count; /* Len. of opt. data */
   95                         volatile uint16_t tx_pad;
   96                         volatile uint8_t tx_dest_addr[6]; /* Dest. Addr. */
   97                         volatile uint16_t tx_length; /* Length of data */
   98                         /* uint8_t data;         Data to send, optional */
   99                 } cb_transmit;
  100                 volatile uint32_t cb_tdr;       /* Time & Flags from TDR CMD */
  101                 volatile uint32_t cb_dump_addr; /* Address of Dump buffer */
  102         };
  103 } __packed;
  104 
  105 
  106 
  107 /* Transmit Buffer Descriptor */
  108 struct iee_tbd {
  109         volatile uint16_t tbd_size;             /* Size of buffer & Flags */
  110         volatile uint16_t tbd_pad;
  111         volatile uint32_t tbd_link_addr;        /* Link Address to next RFD */
  112         volatile uint32_t tbd_tb_addr;          /* Transmit Buffer Address */
  113 } __packed;
  114 
  115 
  116 
  117 /* Receive Frame Descriptor */
  118 struct iee_rfd {
  119         volatile uint16_t rfd_status;           /* Status Bits */
  120         volatile uint16_t rfd_cmd;              /* Command Bits */
  121         volatile uint32_t rfd_link_addr;        /* Link Address to next RFD */
  122         volatile uint32_t rfd_rbd_addr;         /* Address of first free RBD */
  123         volatile uint16_t rfd_count;            /* Actual Count */
  124         volatile uint16_t rfd_size;             /* Size */
  125         volatile uint8_t rfd_dest_addr[6];      /* Destination Address */
  126         volatile uint8_t rfd_src_addr[6];       /* Source Address */
  127         volatile uint16_t rfd_length;           /* Length Field */
  128         volatile uint16_t rfd_pad;              /* Optional Data */
  129 } __packed;
  130 
  131 
  132 
  133 /* Receive Buffer Descriptor */
  134 struct iee_rbd {
  135         volatile uint16_t rbd_count;            /* Actual Cont of bytes */
  136         volatile uint16_t rbd_pad1;
  137         volatile uint32_t rbd_next_rbd;         /* Address of Next RBD */
  138         volatile uint32_t rbd_rb_addr;          /* Receive Buffer Address */
  139         volatile uint16_t rbd_size;             /* Size of Receive Buffer */
  140         volatile uint16_t rbd_pad2;
  141 } __packed;
  142 
  143 
  144 
  145 #define IEE_NRFD        32      /* Number of RFDs == length of receive queue */
  146 #define IEE_NCB         32      /* Number of Command Blocks == transmit queue */
  147 #define IEE_NTBD        16      /* Number of TBDs per CB */
  148 
  149 
  150 
  151 struct iee_softc {
  152         device_t sc_dev;                /* common device data */
  153         struct ifmedia sc_ifmedia;      /* media interface */
  154         struct ethercom sc_ethercom;    /* ethernet specific stuff */
  155         enum i82596_types sc_type;
  156         bus_dma_tag_t sc_dmat;
  157         bus_dmamap_t sc_shmem_map;
  158         bus_dma_segment_t sc_dma_segs;
  159         bus_dmamap_t sc_rx_map[IEE_NRFD];
  160         bus_dmamap_t sc_tx_map[IEE_NCB];
  161         struct mbuf *sc_rx_mbuf[IEE_NRFD];
  162         struct mbuf *sc_tx_mbuf[IEE_NCB];
  163         uint8_t *sc_shmem_addr;
  164         int sc_next_cb;
  165         int sc_next_tbd;
  166         int sc_rx_done;
  167         uint8_t sc_cf[14];
  168         int sc_flags;
  169         int sc_cl_align;
  170         uint32_t sc_crc_err;
  171         uint32_t sc_align_err;
  172         uint32_t sc_resource_err;
  173         uint32_t sc_overrun_err;
  174         uint32_t sc_rcvcdt_err;
  175         uint32_t sc_short_fr_err;
  176         uint32_t sc_receive_err;
  177         uint32_t sc_tx_col;
  178         uint32_t sc_rx_err;
  179         uint32_t sc_cmd_err;
  180         uint32_t sc_tx_timeout;
  181         uint32_t sc_setup_timeout;
  182         int (*sc_iee_cmd)(struct iee_softc *, uint32_t);
  183         int (*sc_iee_reset)(struct iee_softc *);
  184         void (*sc_mediastatus)(struct ifnet *, struct ifmediareq *);
  185         int (*sc_mediachange)(struct ifnet *);
  186 };
  187 
  188 
  189 
  190 /* Flags */
  191 #define IEE_NEED_SWAP   0x01
  192 #define IEE_WANT_MCAST  0x02
  193 
  194 #define IEE_SWAP(x)     ((sc->sc_flags & IEE_NEED_SWAP) == 0 ? x :      \
  195                         (((x) << 16) | ((x) >> 16)))
  196 #define IEE_PHYS_SHMEM(x) ((uint32_t) (sc->sc_shmem_map->dm_segs[0].ds_addr \
  197                         + (x)))
  198 
  199 
  200 /* Offsets in shared memory */
  201 #define IEE_SCP_SZ      (((sizeof(struct iee_scp) - 1) / (sc)->sc_cl_align + 1)\
  202                         * (sc)->sc_cl_align)
  203 #define IEE_SCP_OFF     0
  204 
  205 #define IEE_ISCP_SZ     (((sizeof(struct iee_iscp) - 1) / (sc)->sc_cl_align + 1)\
  206                         * (sc)->sc_cl_align)
  207 #define IEE_ISCP_OFF    IEE_SCP_SZ
  208 
  209 #define IEE_SCB_SZ      (((sizeof(struct iee_scb) - 1) / (sc)->sc_cl_align + 1)\
  210                         * (sc)->sc_cl_align)
  211 #define IEE_SCB_OFF     (IEE_SCP_SZ + IEE_ISCP_SZ)
  212 
  213 #define IEE_RFD_SZ      (((sizeof(struct iee_rfd) - 1) / (sc)->sc_cl_align + 1)\
  214                         * (sc)->sc_cl_align)
  215 #define IEE_RFD_LIST_SZ (IEE_RFD_SZ * IEE_NRFD)
  216 #define IEE_RFD_OFF     (IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ)
  217 
  218 #define IEE_RBD_SZ      (((sizeof(struct iee_rbd) - 1) / (sc)->sc_cl_align + 1)\
  219                         * (sc)->sc_cl_align)
  220 #define IEE_RBD_LIST_SZ (IEE_RBD_SZ * IEE_NRFD)
  221 #define IEE_RBD_OFF     (IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ          \
  222                         + IEE_RFD_SZ * IEE_NRFD)
  223 
  224 #define IEE_CB_SZ       (((sizeof(struct iee_cb) - 1) / (sc)->sc_cl_align + 1)\
  225                         * (sc)->sc_cl_align)
  226 #define IEE_CB_LIST_SZ  (IEE_CB_SZ * IEE_NCB)
  227 #define IEE_CB_OFF      (IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ          \
  228                         + IEE_RFD_SZ * IEE_NRFD + IEE_RBD_SZ * IEE_NRFD)
  229 
  230 #define IEE_TBD_SZ      (((sizeof(struct iee_tbd) - 1) / (sc)->sc_cl_align + 1)\
  231                         * (sc)->sc_cl_align)
  232 #define IEE_TBD_LIST_SZ (IEE_TBD_SZ * IEE_NTBD * IEE_NCB)
  233 #define IEE_TBD_OFF     (IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ          \
  234                         + IEE_RFD_SZ * IEE_NRFD + IEE_RBD_SZ * IEE_NRFD \
  235                         + IEE_CB_SZ * IEE_NCB)
  236 
  237 #define IEE_SHMEM_MAX   (IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ          \
  238                         + IEE_RFD_SZ * IEE_NRFD + IEE_RBD_SZ * IEE_NRFD \
  239                         + IEE_CB_SZ * IEE_NCB + IEE_TBD_SZ * IEE_NTBD * IEE_NCB)
  240 
  241 
  242 #define SC_SCP          ((struct iee_scp*)((sc)->sc_shmem_addr + IEE_SCP_OFF))
  243 #define SC_ISCP         ((struct iee_iscp*)((sc)->sc_shmem_addr + IEE_ISCP_OFF))
  244 #define SC_SCB          ((struct iee_scb*)((sc)->sc_shmem_addr + IEE_SCB_OFF))
  245 #define SC_RFD(n)       ((struct iee_rfd*)((sc)->sc_shmem_addr + IEE_RFD_OFF \
  246                                 + (n) * IEE_RFD_SZ))
  247 #define SC_RBD(n)       ((struct iee_rbd*)((sc)->sc_shmem_addr + IEE_RBD_OFF \
  248                                 + (n) * IEE_RBD_SZ))
  249 #define SC_CB(n)        ((struct iee_cb*)((sc)->sc_shmem_addr + IEE_CB_OFF \
  250                                 + (n) * IEE_CB_SZ))
  251 #define SC_TBD(n)       ((struct iee_tbd*)((sc)->sc_shmem_addr + IEE_TBD_OFF \
  252                                 + (n) * IEE_TBD_SZ))
  253 
  254 
  255 
  256 void iee_attach(struct iee_softc *, uint8_t *, int *, int, int);
  257 void iee_detach(struct iee_softc *, int);
  258 int iee_intr(void *);
  259 
  260 
  261 
  262 

Cache object: dabe441e066fe14da74f544fd9f87c77


[ 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.