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/mgb/if_mgb.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 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause
    3  *
    4  * Copyright (c) 2019 The FreeBSD Foundation, Inc.
    5  *
    6  * This driver was written by Gerald ND Aryeetey <gndaryee@uwaterloo.ca>
    7  * under sponsorship from the FreeBSD Foundation.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  *
   30  * $FreeBSD$
   31  */
   32 #ifndef _IF_MGB_H_
   33 #define _IF_MGB_H_
   34 
   35 #define MGB_MICROCHIP_VENDOR_ID         0x1055
   36 #define MGB_LAN7430_DEVICE_ID           0x7430
   37 #define MGB_LAN7431_DEVICE_ID           0x7431
   38 
   39 #define MGB_TIMEOUT                     (500)
   40 
   41 /** Control/Status Registers **/
   42 #define MGB_BAR                         0 /* PCI Base Address */
   43 
   44 /** Reset **/
   45 #define MGB_HW_CFG                      0x10 /** H/W Configuration Register **/
   46 #define MGB_LITE_RESET                  0x2
   47 
   48 /** MAC **/
   49 #define MGB_MAC_CR                      0x0100 /** MAC Crontrol Register **/
   50 #define MGB_MAC_ADD_ENBL                0x1000 /* Automatic Duplex Detection */
   51 #define MGB_MAC_ASD_ENBL                0x0800 /* Automatic Speed Detection */
   52 
   53 #define MGB_MAC_ADDR_BASE_L             0x11C /** MAC address lower 4 bytes (read) register **/
   54 #define MGB_MAC_ADDR_BASE_H             0x118 /** MAC address upper 2 bytes (read) register **/
   55 
   56 #define MGB_MAC_TX                      0x0104
   57 #define MGB_MAC_RX                      0x0108
   58 #define MGB_MAC_ENBL                    (1 << 0)
   59 #define MGB_MAC_DSBL                    (1 << 1)
   60 
   61 /** MAC Statistics **/
   62 #define MGB_MAC_STAT_RX_FCS_ERR_CNT     0x1200
   63 #define MGB_MAC_STAT_RX_ALIGN_ERR_CNT   0x1204
   64 #define MGB_MAC_STAT_RX_FRAG_ERR_CNT    0x1208
   65 #define MGB_MAC_STAT_RX_JABBER_ERR_CNT  0x120C
   66 #define MGB_MAC_STAT_RX_UNDER_ERR_CNT   0x1210
   67 #define MGB_MAC_STAT_RX_OVER_ERR_CNT    0x1214
   68 #define MGB_MAC_STAT_RX_DROPPED_CNT     0x1218
   69 #define MGB_MAC_STAT_RX_BROADCAST_CNT1  0x1220
   70 #define MGB_MAC_STAT_RX_BROADCAST_CNT   0x122C
   71 #define MGB_MAC_STAT_RX_FRAME_CNT       0x1254
   72 #define MGB_MAC_STAT_RX_DROPPED_CNT     0x1218
   73 #define MGB_MAC_STAT_RX_BROADCAST_CNT1  0x1220
   74 #define MGB_MAC_STAT_RX_BROADCAST_CNT   0x122C
   75 #define MGB_MAC_STAT_RX_FRAME_CNT       0x1254
   76 /* etc. */
   77 
   78 /** Receive Filtering Engine **/
   79 #define MGB_RFE_CTL                     0x508
   80 #define MGB_RFE_ALLOW_BROADCAST         (1 << 10)
   81 #define MGB_RFE_ALLOW_MULTICAST         (1 << 9)
   82 #define MGB_RFE_ALLOW_UNICAST           (1 << 8)
   83 #define MGB_RFE_ALLOW_PERFECT_FILTER    (1 << 1)
   84 
   85 /** PHY Reset (via power management control) **/
   86 #define MGB_PMT_CTL                     0x14 /** Power Management Control Register **/
   87 #define MGB_PHY_RESET                   0x10
   88 #define MGB_PHY_READY                   0x80
   89 
   90 /** FIFO Controller **/
   91 #define MGB_FCT_TX_CTL                  0xC4
   92 #define MGB_FCT_RX_CTL                  0xAC
   93 #define MGB_FCT_ENBL(_channel)          (1 << (28 + (_channel)))
   94 #define MGB_FCT_DSBL(_channel)          (1 << (24 + (_channel)))
   95 #define MGB_FCT_RESET(_channel)         (1 << (20 + (_channel)))
   96 
   97 /** DMA Controller **/
   98 #define MGB_DMAC_CMD                    0xC0C
   99 #define MGB_DMAC_RESET                  (1 << 31)
  100 #define MGB_DMAC_TX_START               16
  101 #define MGB_DMAC_RX_START               0
  102 #define MGB_DMAC_CMD_VAL(s, o, ch)      (1 << ((s) + (o) + (ch)))
  103 #define MGB_DMAC_CMD_RESET(_s, _ch)     MGB_DMAC_CMD_VAL(_s, 8, _ch)
  104 #define MGB_DMAC_CMD_START(_s, _ch)     MGB_DMAC_CMD_VAL(_s, 4, _ch)
  105 #define MGB_DMAC_CMD_STOP( _s, _ch)     MGB_DMAC_CMD_VAL(_s, 0, _ch)
  106 #define MGB_DMAC_STATE(_start, _stop)   \
  107         (((_start) ? 2 : 0) | ((_stop) ? 1 : 0))
  108 #define MGB_DMAC_STATE_INITIAL          MGB_DMAC_STATE(0, 0)
  109 #define MGB_DMAC_STATE_STARTED          MGB_DMAC_STATE(1, 0)
  110 #define MGB_DMAC_STATE_STOP_PENDING     MGB_DMAC_STATE(1, 1)
  111 #define MGB_DMAC_STATE_STOPPED          MGB_DMAC_STATE(0, 1)
  112 #define MGB_DMAC_CMD_STATE(sc, _s, _ch)                         \
  113         (MGB_DMAC_STATE(                                        \
  114             CSR_READ_REG(sc, MGB_DMAC_CMD) & MGB_DMAC_CMD_START(_s, _ch),       \
  115             CSR_READ_REG(sc, MGB_DMAC_CMD) & MGB_DMAC_CMD_STOP(_s, _ch)))
  116 #define MGB_DMAC_STATE_IS_INITIAL(sc, _s, _ch)                  \
  117         (MGB_DMAC_CMD_STATE(sc, _s, _ch) == MGB_DMAC_STATE_INITIAL)
  118 
  119 #define MGB_DMAC_INTR_STS               0xC10
  120 #define MGB_DMAC_INTR_ENBL_SET          0xC14
  121 #define MGB_DMAC_INTR_ENBL_CLR          0xC18
  122 #define MGB_DMAC_TX_INTR_ENBL(_ch)      (1 << (_ch))
  123 #define MGB_DMAC_RX_INTR_ENBL(_ch)      (1 << (16 + (_ch)))
  124 
  125 /** DMA Rings **/
  126 /**
  127  * Page size is 256 bytes
  128  *
  129  * Ring size, however, these could be tunable (for RX & TX)
  130  * to be a multiple of 4 (max is 65532)
  131  *
  132  **/
  133 /* In linux driver these numbers are 50 and 65 for tx and rx .... */
  134 #define MGB_DMA_RING_SIZE               16 /* in programming guide, this number is 100 */
  135 #define MGB_DMA_MAXSEGS                 32
  136 #define MGB_DMA_REG(reg, _channel)      ((reg) | ((_channel) << 6))
  137 #define MGB_DMA_RING_LIST_SIZE          \
  138         (sizeof(struct mgb_ring_desc) * MGB_DMA_RING_SIZE)
  139 #define MGB_DMA_RING_INFO_SIZE          \
  140         (sizeof(uint32_t) + MGB_DMA_RING_LIST_SIZE)
  141 
  142 #define MGB_DMA_TX_CONFIG0(_channel)    MGB_DMA_REG(0x0D40, _channel)
  143 #define MGB_DMA_TX_CONFIG1(_channel)    MGB_DMA_REG(0x0D44, _channel)
  144 #define MGB_DMA_TX_BASE_H(_channel)     MGB_DMA_REG(0x0D48, _channel)
  145 #define MGB_DMA_TX_BASE_L(_channel)     MGB_DMA_REG(0x0D4C, _channel)
  146 #define MGB_DMA_TX_HEAD_WB_H(_channel)  MGB_DMA_REG(0x0D50, _channel) /* head Writeback */
  147 #define MGB_DMA_TX_HEAD_WB_L(_channel)  MGB_DMA_REG(0x0D54, _channel)
  148 #define MGB_DMA_TX_HEAD(_channel)       MGB_DMA_REG(0x0D58, _channel)
  149 #define MGB_DMA_TX_TAIL(_channel)       MGB_DMA_REG(0x0D5C, _channel)
  150 
  151 #define MGB_DMA_RX_CONFIG0(_channel)    MGB_DMA_REG(0x0C40, _channel)
  152 #define MGB_DMA_RX_CONFIG1(_channel)    MGB_DMA_REG(0x0C44, _channel)
  153 #define MGB_DMA_RX_BASE_H(_channel)     MGB_DMA_REG(0x0C48, _channel)
  154 #define MGB_DMA_RX_BASE_L(_channel)     MGB_DMA_REG(0x0C4C, _channel)
  155 #define MGB_DMA_RX_HEAD_WB_H(_channel)  MGB_DMA_REG(0x0C50, _channel) /* head Writeback */
  156 #define MGB_DMA_RX_HEAD_WB_L(_channel)  MGB_DMA_REG(0x0C54, _channel)
  157 #define MGB_DMA_RX_HEAD(_channel)       MGB_DMA_REG(0x0C58, _channel)
  158 #define MGB_DMA_RX_TAIL(_channel)       MGB_DMA_REG(0x0C5C, _channel)
  159 
  160 #define MGB_DMA_RING_LEN_MASK           0xFFFF
  161 #define MGB_DMA_IOC_ENBL                0x10000000
  162 #define MGB_DMA_HEAD_WB_LS_ENBL         0x20000000
  163 #define MGB_DMA_HEAD_WB_ENBL            (1 << 5)
  164 #define MGB_DMA_RING_PAD_MASK           0x03000000
  165 #define MGB_DMA_RING_PAD_0              0x00000000
  166 #define MGB_DMA_RING_PAD_2              0x02000000
  167 
  168 #define MGB_DESC_CTL_OWN                (1 << 15)
  169 #define MGB_DESC_CTL_FCS                (1 << 17)
  170 #define MGB_DESC_CTL_IOC                (1 << 26)
  171 #define MGB_TX_DESC_CTL_LS              (1 << 28)
  172 #define MGB_TX_DESC_CTL_FS              (1 << 29)
  173 #define MGB_RX_DESC_CTL_LS              (1 << 30)
  174 #define MGB_RX_DESC_CTL_FS              (1 << 31)
  175 #define MGB_DESC_CTL_BUFLEN_MASK        (0x0000FFFF)
  176 #define MGB_DESC_STS_BUFLEN_MASK        (0x00003FFF)
  177 #define MGB_DESC_FRAME_LEN_MASK         (0x3FFF0000)
  178 #define MGB_DESC_GET_FRAME_LEN(_desc)   \
  179         (((_desc)->ctl & MGB_DESC_FRAME_LEN_MASK) >> 16)
  180 
  181 #define MGB_NEXT_RING_IDX(_idx)         (((_idx) == MGB_DMA_RING_SIZE - 1) ? 0 : ((_idx) + 1))
  182 #define MGB_PREV_RING_IDX(_idx)         (((_idx) == 0) ? (MGB_DMA_RING_SIZE - 1) : ((_idx) - 1))
  183 #define MGB_RING_SPACE(_sc)             \
  184         ((((_sc)->tx_ring_data.last_head - (_sc)->tx_ring_data.last_tail - 1) \
  185          + MGB_DMA_RING_SIZE ) % MGB_DMA_RING_SIZE )
  186 
  187 /** PHY **/
  188 #define MGB_MII_ACCESS                  0x120
  189 #define MGB_MII_DATA                    0x124
  190 #define MGB_MII_PHY_ADDR_MASK           0x1F
  191 #define MGB_MII_PHY_ADDR_SHIFT          11
  192 #define MGB_MII_REG_ADDR_MASK           0x1F
  193 #define MGB_MII_REG_ADDR_SHIFT          6
  194 #define MGB_MII_READ                    0x0
  195 #define MGB_MII_WRITE                   0x2
  196 #define MGB_MII_BUSY                    0x1
  197 
  198 /** Interrupt registers **/
  199 #define MGB_INTR_STS                    0x780
  200 #define MGB_INTR_SET                    0x784 /* This triggers a particular interrupt */
  201 #define MGB_INTR_ENBL_SET               0x788
  202 #define MGB_INTR_STS_ANY                (0x1)
  203 #define MGB_INTR_STS_RX(_channel)       (1 << (24 + (_channel)))
  204 #define MGB_INTR_STS_RX_ANY             (0xF << 24)
  205 #define MGB_INTR_STS_TX(_channel)       (1 << (16 + (_channel)))
  206 #define MGB_INTR_STS_TX_ANY             (0xF << 16)
  207 #define MGB_INTR_STS_TEST               (1 << 9)
  208 #define MGB_INTR_ENBL_CLR               0x78C
  209 
  210 #define MGB_INTR_VEC_ENBL_SET           0x794
  211 #define MGB_INTR_VEC_ENBL_CLR           0x798
  212 #define MGB_INTR_VEC_ENBL_AUTO_CLR      0x79C
  213 #define MGB_INTR_VEC_RX_MAP             0x7A0
  214 #define MGB_INTR_VEC_TX_MAP             0x7A4
  215 #define MGB_INTR_VEC_OTHER_MAP          0x7A8
  216 #define MGB_INTR_VEC_MAP(_vsts, _ch)    ((_vsts) << ((_ch) << 2))
  217 #define MGB_INTR_VEC_STS(_v)            (1 << (_v))
  218 #define MGB_INTR_RX_VEC_STS(_qid)       MGB_INTR_VEC_STS((_qid) + 1)
  219 
  220 #define MGB_STS_OK                      ( 0 )
  221 #define MGB_STS_TIMEOUT                 (-1 )
  222 
  223 #define CSR_READ_BYTE(sc, reg)          \
  224         bus_read_1((sc)->regs, reg)
  225 
  226 #define CSR_WRITE_BYTE(sc, reg, val)    \
  227         bus_write_1((sc)->regs, reg, val)
  228 
  229 #define CSR_UPDATE_BYTE(sc, reg, val)   \
  230         CSR_WRITE_BYTE(sc, reg, CSR_READ_BYTE(sc, reg) | (val))
  231 
  232 #define CSR_READ_REG(sc, reg)           \
  233         bus_read_4((sc)->regs, reg)
  234 
  235 #define CSR_WRITE_REG(sc, reg, val)     \
  236         bus_write_4((sc)->regs, reg, val)
  237 
  238 #define CSR_CLEAR_REG(sc, reg, bits)    \
  239         CSR_WRITE_REG(sc, reg, CSR_READ_REG(sc, reg) & ~(bits))
  240 
  241 #define CSR_UPDATE_REG(sc, reg, val)    \
  242         CSR_WRITE_REG(sc, reg, CSR_READ_REG(sc, reg) | (val))
  243 
  244 #define CSR_READ_2_BYTES(sc, reg)       \
  245         bus_read_2((sc)->regs, reg)
  246 
  247 #define CSR_READ_REG_BYTES(sc, reg, dest, cnt)  \
  248         bus_read_region_1((sc)->regs, reg, dest, cnt)
  249 
  250 #define CSR_TRANSLATE_ADDR_LOW32(addr)          ((uint64_t) (addr) & 0xFFFFFFFF)
  251 #define CSR_TRANSLATE_ADDR_HIGH32(addr)         ((uint64_t) (addr) >> 32)
  252 
  253 struct mgb_irq {
  254         struct resource                 *res;
  255         void                            *handler;
  256 };
  257 
  258 enum mgb_dmac_cmd { DMAC_RESET, DMAC_START, DMAC_STOP };
  259 enum mgb_fct_cmd { FCT_RESET, FCT_ENABLE, FCT_DISABLE };
  260 
  261 struct mgb_ring_desc_addr {
  262         uint32_t                                low;
  263         uint32_t                                high;
  264 } __packed;
  265 
  266 /* TODO: With descriptor bit information
  267  * this could be done without masks etc.
  268  * (using bitwise structs like vmx,
  269  * would have to separate rx/tx ring desc
  270  * definitions)
  271  */
  272 struct mgb_ring_desc {
  273         uint32_t                                ctl; /* data0 */
  274         struct mgb_ring_desc_addr               addr; /* data(1|2) */
  275         uint32_t                                sts; /* data3 */
  276 } __packed;
  277 
  278 #if 0
  279 struct mgb_ring_info {
  280         uint32_t                                head_wb;
  281         struct mgb_ring_desc                    *ring;
  282 }
  283 #endif
  284 #define MGB_HEAD_WB_PTR(_ring_info_ptr)         \
  285         ((uint32_t *)(_ring_info_ptr))
  286 
  287 #define MGB_RING_PTR(_ring_info_ptr)            \
  288         ((struct mgb_ring_desc *)(MGB_HEAD_WB_PTR(_ring_info_ptr) + 1))
  289 
  290 struct mgb_ring_data {
  291         uint32_t                        *head_wb;
  292         struct mgb_ring_desc            *ring;
  293 
  294         bus_addr_t                       head_wb_bus_addr;
  295         bus_addr_t                       ring_bus_addr;
  296 
  297         uint32_t                         last_head;
  298         uint32_t                         last_tail;
  299 };
  300 
  301 struct mgb_softc {
  302         if_ctx_t                         ctx;
  303         device_t                         dev;
  304 
  305         struct resource                 *regs;
  306 
  307         struct resource                 *pba;
  308         struct if_irq                    admin_irq;
  309         struct if_irq                    rx_irq;
  310 
  311         bool                             isr_test_flag;
  312 
  313         device_t                         miibus;
  314         int                              link_state;
  315         int                              baudrate;
  316 
  317         int                              if_flags;
  318         int                              ethaddr;
  319         int                              flags;
  320 
  321         struct mtx                       mtx;
  322         struct callout                   watchdog;
  323         int                              timer;
  324 
  325         bus_dma_tag_t                    dma_parent_tag;
  326         struct mgb_ring_data             rx_ring_data;
  327         struct mgb_ring_data             tx_ring_data;
  328 
  329 };
  330 
  331 #endif /* _IF_MGB_H_ */

Cache object: d73eafa3d779a55e7160296ece2082c1


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