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/elinkxlreg.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: elinkxlreg.h,v 1.15 2008/04/28 20:23:49 martin Exp $   */
    2 
    3 /*-
    4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Frank van der Linden.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   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 THE FOUNDATION OR CONTRIBUTORS
   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 /*
   33  * This file defines the registers specific to the EtherLink XL family
   34  * of NICs.
   35  */
   36 
   37 #define EEPROM_SOFTINFO3        0x15    /* Software info #3 */
   38 #define EEPROM_SUBVENDOR_ELXL   0x17    /* Subsys vendor id */
   39 #define EEPROM_SUBSYSID         0x18    /* Subsys id */
   40 #define EEPROM_MEDIA            0x19    /* Media options (90xB) */
   41 #define EEPROM_CHECKSUM_ELXL    0x20    /* EEPROM checksum */
   42 
   43 #define READ_EEPROM8            0x0200  /* 8 bit EEPROM read command */
   44 
   45 /*
   46  * Flat address space registers (outside the windows)
   47  */
   48 
   49 #define ELINK_TXPKTID           0x18    /* 90xB only */
   50 #define ELINK_TIMER             0x1a
   51 #define ELINK_TXSTATUS          0x1b
   52 #define ELINK_INTSTATUSAUTO     0x1e
   53 #define ELINK_DMACTRL           0x20
   54 #       define ELINK_DMAC_DNCMPLREQ     0x00000002
   55 #       define ELINK_DMAC_DNSTALLED     0x00000004
   56 #       define ELINK_DMAC_UPCOMPLETE    0x00000008
   57 #       define ELINK_DMAC_DNCOMPLETE    0x00000010
   58 #       define ELINK_DMAC_UPRXEAREN     0x00000020
   59 #       define ELINK_DMAC_ARNCNTDN      0x00000040
   60 #       define ELINK_DMAC_DNINPROG      0x00000080
   61 #       define ELINK_DMAC_CNTSPEED      0x00000100
   62 #       define ELINK_DMAC_CNTDNMODE     0x00000200
   63 #       define ELINK_DMAC_ALTSEQDIS     0x00010000
   64 #       define ELINK_DMAC_DEFEATMWI     0x00100000
   65 #       define ELINK_DMAC_DEFEATMRL     0x00200000
   66 #       define ELINK_DMAC_UPOVERDIS     0x00400000
   67 #       define ELINK_DMAC_TARGABORT     0x40000000
   68 #       define ELINK_DMAC_MSTRABORT     0x80000000
   69 #define ELINK_DNLISTPTR         0x24
   70 #define ELINK_DNBURSTTHRESH     0x2a    /* 90xB only */
   71 #define ELINK_DNPRIOTHRESH      0x2c    /* 90xB only */
   72 #define ELINK_DNPOLL            0x2d    /* 90xB only */
   73 #define ELINK_TXFREETHRESH      0x2f    /* 90x only */
   74 #define ELINK_UPPKTSTATUS       0x30
   75 #define ELINK_FREETIMER         0x34
   76 #define ELINK_COUNTDOWN         0x36
   77 #define ELINK_UPLISTPTR         0x38
   78 #define ELINK_UPPRIOTHRESH      0x3c    /* 90xB only */
   79 #define ELINK_UPPOLL            0x3d    /* 90xB only */
   80 #define ELINK_UPBURSTTHRESH     0x3e    /* 90xB only */
   81 #define ELINK_REALTIMECNT       0x40    /* 90xB only */
   82 #define ELINK_DNMAXBURST        0x78    /* 90xB only */
   83 #define ELINK_UPMAXBURST        0x7a    /* 90xB only */
   84 
   85 /*
   86  * This is reset options for the other cards, media options for
   87  * the 90xB NICs. Reset options are in a separate register for
   88  * the 90xB.
   89  */
   90 #define ELINK_W3_MEDIA_OPTIONS  0x08
   91 #       define ELINK_MEDIACAP_100BASET4 0x0001
   92 #       define ELINK_MEDIACAP_100BASETX 0x0002
   93 #       define ELINK_MEDIACAP_100BASEFX 0x0004
   94 #       define ELINK_MEDIACAP_10BASET   0x0008
   95 #       define ELINK_MEDIACAP_10BASE2   0x0010
   96 #       define ELINK_MEDIACAP_10BASE5   0x0020
   97 #       define ELINK_MEDIACAP_MII       0x0040
   98 #       define ELINK_MEDIACAP_10BASEFL  0x0080
   99 
  100 /*
  101  * Reset options for the 90xB
  102  */
  103 #define ELINK_W2_RESET_OPTIONS  0x0c
  104 #       define ELINK_RESET_OPT_LEDPOLAR 0x0010
  105 #       define ELINK_RESET_OPT_PHYPOWER 0x4000
  106 
  107 /*
  108  * Window 4, offset 8 is defined for MII/PHY access for EtherLink XL
  109  * cards.
  110  */
  111 #define ELINK_W4_PHYSMGMT       0x08
  112 #       define ELINK_PHY_CLK    0x0001
  113 #       define ELINK_PHY_DATA   0x0002
  114 #       define ELINK_PHY_DIR    0x0004
  115 
  116 /*
  117  * Counter in window 4 for packets with a bad start-of-stream delimiter/
  118  */
  119 #define ELINK_W4_BADSSD         0x0c
  120 #define ELINK_W4_UBYTESOK       0x0d
  121 
  122 /*
  123  * Define for extra multicast hash filter bit implemented in the 90xB
  124  */
  125 #define FIL_MULTIHASH           0x10
  126 
  127 /*
  128  * Defines for the interrupt status register, only for the 90x[B]
  129  */
  130 #define HOST_ERROR              0x0002
  131 #define LINK_EVENT              0x0100
  132 #define DN_COMPLETE             0x0200
  133 #define UP_COMPLETE             0x0400
  134 
  135 #define XL_WATCHED_INTERRUPTS \
  136     (HOST_ERROR | TX_COMPLETE | UPD_STATS | DN_COMPLETE | UP_COMPLETE)
  137 
  138 
  139 /*
  140  * Window 7 registers. These are different for 90x and 90xB than
  141  * for the EtherLink III / Fast EtherLink cards.
  142  */
  143 
  144 #define ELINK_W7_VLANMASK       0x00    /* 90xB only */
  145 #define ELINK_W7_VLANTYPE       0x04    /* 90xB only */
  146 #define ELINK_W7_TIMER          0x0a    /* 90x only */
  147 #define ELINK_W7_TX_STATUS      0x0b    /* 90x only */
  148 #define ELINK_W7_POWEREVENT     0x0c    /* 90xB only */
  149 #define ELINK_W7_INTSTATUS      0x0e
  150 
  151 /*
  152  * Command definitions.
  153  */
  154 #define ELINK_UPSTALL           0x3000
  155 #define ELINK_UPUNSTALL         0x3001
  156 #define ELINK_DNSTALL           0x3002
  157 #define ELINK_DNUNSTALL         0x3003
  158 #define ELINK_TXRECLTHRESH      0xc000
  159 #define ELINK_TXSTARTTHRESH     0x9800
  160 #define ELINK_CLEARHASHFILBIT   0xc800
  161 #define ELINK_SETHASHFILBIT     0xcc00
  162 
  163 /*
  164  * The Internal Config register is different on 90xB cards. The
  165  * different masks / shifts are defined here.
  166  */
  167 
  168 /*
  169  * Lower 16 bits.
  170  */
  171 #define CONFIG_TXLARGE          (u_int16_t) 0x4000
  172 #define CONFIG_TXLARGE_SHIFT    14
  173 
  174 #define CONFIG_RXLARGE          (u_int16_t) 0x8000
  175 #define CONFIG_RXLARGE_SHIFT    15
  176 
  177 /*
  178  * Upper 16 bits.
  179  */
  180 #define CONFIG_XCVR_SEL         (u_int16_t) 0x00f0
  181 #define CONFIG_XCVR_SEL_SHIFT   4
  182 
  183 #define ELINKMEDIA_AUTO         8
  184 
  185 #define CONFIG_AUTOSEL          (u_int16_t) 0x0100
  186 #define CONFIG_AUTOSEL_SHIFT    8
  187 
  188 #define CONFIG_DISABLEROM       (u_int16_t) 0x0200
  189 #define CONFIG_DISABLEROM_SHIFT 9
  190 
  191 /*
  192  * ID of internal PHY.
  193  */
  194 
  195 #define ELINK_INTPHY_ID         24
  196 
  197 /*
  198  * Fragment header as laid out in memory for DMA access.
  199  */
  200 
  201 struct ex_fraghdr {
  202         volatile u_int32_t fr_addr;     /* phys addr of frag */
  203         volatile u_int32_t fr_len;      /* length of frag */
  204 };
  205 
  206 #define EX_FR_LENMASK   0x00001fff      /* mask for length in fr_len field */
  207 #define EX_FR_LAST      0x80000000      /* indicates last fragment */
  208 
  209 #define EX_NDPD         256
  210 #define EX_NUPD         128
  211 
  212 /*
  213  * Note: the number of receive fragments in an UPD is 1, since we're
  214  * receiving into one contiguous mbuf.
  215  */
  216 #define EX_NRFRAGS      1               /* # fragments in rcv pkt (< 64) */
  217 #define EX_NTFRAGS      32              /* # fragments in tx pkt (< 64) */
  218 
  219 /*
  220  * Type 0 Download Packet Descriptor (DPD).
  221  */
  222 struct ex_dpd {
  223         volatile u_int32_t dpd_nextptr;         /* prt to next fragheader */
  224         volatile u_int32_t dpd_fsh;             /* frame start header */
  225         volatile struct ex_fraghdr dpd_frags[EX_NTFRAGS];
  226 };
  227 
  228 /*
  229  * Type 1 DPD, supported by 90xB.
  230  */
  231 struct ex_dpd1 {
  232         volatile u_int32_t dpd_nextptr;
  233         volatile u_int32_t dpd_schedtime;       /* time to download */
  234         volatile u_int32_t dpd_fsh;
  235         volatile struct ex_fraghdr dpd_frags[EX_NTFRAGS];
  236 };
  237 
  238 struct ex_upd {
  239         volatile u_int32_t upd_nextptr;
  240         volatile u_int32_t upd_pktstatus;
  241         volatile struct ex_fraghdr upd_frags[EX_NRFRAGS];
  242 };
  243 
  244 /*
  245  * Higher level linked list of upload packet descriptors.
  246  */
  247 struct ex_rxdesc {
  248         struct ex_rxdesc *rx_next;
  249         struct mbuf *rx_mbhead;
  250         bus_dmamap_t rx_dmamap;
  251         struct ex_upd *rx_upd;
  252 };
  253 
  254 /*
  255  * .. and for download packet descriptors.
  256  */
  257 struct ex_txdesc {
  258         struct ex_txdesc *tx_next;
  259         struct mbuf *tx_mbhead;
  260         bus_dmamap_t tx_dmamap;
  261         struct ex_dpd *tx_dpd;
  262 };
  263 
  264 /*
  265  * hardware ip4csum-tx on ex(4) sometimes seems to set wrong IP checksums
  266  * if the TX IP packet length is 21 or 22 bytes which requires autopadding.
  267  * To avoid this bug, we have to pad such very short packets manually.
  268  */
  269 #define EX_IP4CSUMTX_MINLEN     22
  270 #define EX_IP4CSUMTX_PADLEN     (ETHER_HDR_LEN + EX_IP4CSUMTX_MINLEN)
  271 
  272 #define DPDMEM_SIZE             (sizeof(struct ex_dpd) * EX_NDPD)
  273 #define DPDMEMPAD_OFF           DPDMEM_SIZE
  274 #define DPDMEMPAD_DMADDR(sc)    ((sc)->sc_dpddma + DPDMEMPAD_OFF)
  275 
  276 #define DPD_DMADDR(s,t) \
  277         ((s)->sc_dpddma + ((char *)((t)->tx_dpd) - (char *)((s)->sc_dpd)))
  278 
  279 /*
  280  * Frame Start Header bitfields.
  281  */
  282 
  283 #define EX_DPD_DNIND    0x80000000      /* intr on download done */
  284 #define EX_DPD_TXIND    0x00008000      /* intr on tx done */
  285 #define EX_DPD_NOCRC    0x00002000      /* no CRC append */
  286 
  287 /*
  288  * Lower 12 bits are the tx length for the 90x family. The 90xB
  289  * assumes that the tx length is the sum of all frame lengths,
  290  * and uses the bits as below. It also defines some more bits in
  291  * the upper part.
  292  */
  293 #define EX_DPD_EMPTY    0x20000000      /* no data in this DPD */
  294 #define EX_DPD_UPDEFEAT 0x10000000      /* don't round tx lengths up */
  295 #define EX_DPD_UDPCKSUM 0x08000000      /* do hardware UDP checksum */
  296 #define EX_DPD_TCPCKSUM 0x04000000      /* do hardware TCP checksum */
  297 #define EX_DPD_IPCKSUM  0x02000000      /* do hardware IP checksum */
  298 #define EX_DPD_DNCMPLT  0x01000000      /* packet has been downloaded */
  299 #define EX_DPD_IDMASK   0x000003fc      /* mask for packet id */
  300 #       define EX_DPD_IDSHIFT   2
  301 #define EX_DPD_RNDMASK  0x00000003      /* mask for rounding */
  302                                         /* 0 -> dword, 2 -> word, 1,3 -> none */
  303 
  304 /*
  305  * Schedtime bitfields.
  306  */
  307 #define EX_SCHED_TIMEVALID      0x20000000      /* field contains value */
  308 #define EX_SCHED_LDCOUNT        0x10000000      /* load schedtime onto NIC */
  309 #define EX_SCHED_TIMEMASK       0x00ffffff
  310 
  311 /*
  312  * upd_pktstatus bitfields.
  313  * The *CKSUMERR fields are only valid if the matching *CHECKED field
  314  * is set.
  315  */
  316 #define EX_UPD_PKTLENMASK       0x00001fff      /* 12:0 -> packet length */
  317 #define EX_UPD_ERROR            0x00004000      /* rcv error */
  318 #define EX_UPD_COMPLETE         0x00008000      /* rcv complete */
  319 #define EX_UPD_OVERRUN          0x00010000      /* rcv overrun */
  320 #define EX_UPD_RUNT             0x00020000      /* pkt < 60 bytes */
  321 #define EX_UPD_ALIGNERR         0x00040000      /* alignment error */
  322 #define EX_UPD_CRCERR           0x00080000      /* CRC error */
  323 #define EX_UPD_OVERSIZED        0x00100000      /* oversize frame */
  324 #define EX_UPD_DRIBBLEBITS      0x00800000      /* pkt had dribble bits */
  325 #define EX_UPD_OVERFLOW         0x01000000      /* insufficient space for pkt */
  326 #define EX_UPD_IPCKSUMERR       0x02000000      /* IP cksum error (90xB) */
  327 #define EX_UPD_TCPCKSUMERR      0x04000000      /* TCP cksum error (90xB) */
  328 #define EX_UPD_UDPCKSUMERR      0x08000000      /* UDP cksum error (90xB) */
  329 #define EX_UPD_IPCHECKED        0x20000000      /* IP cksum done */
  330 #define EX_UPD_TCPCHECKED       0x40000000      /* TCP cksum done */
  331 #define EX_UPD_UDPCHECKED       0x80000000      /* UDP cksum done */
  332 
  333 #define EX_UPD_ERR              0x001f4000      /* Errors we check for */
  334 #define EX_UPD_ERR_VLAN         0x000f0000      /* same for 802.1q */

Cache object: e95b402a66c72b7ff31c1b20c2d761f9


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