1 /* $NetBSD: if_enetvar.h,v 1.5 2019/09/13 07:55:06 msaitoh Exp $ */ 2 3 /* 4 * Copyright (c) 2014 Ryo Shimizu <ryo@nerv.org> 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 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef _ARM_IMX_IF_ENETVAR_H_ 30 #define _ARM_IMX_IF_ENETVAR_H_ 31 32 #include <sys/rndsource.h> 33 #include <net/if.h> 34 #include <net/if_media.h> 35 #include <net/if_ether.h> 36 #include <dev/mii/miivar.h> 37 38 #define ENET_TX_RING_CNT 256 39 #define ENET_RX_RING_CNT 256 40 41 struct enet_txsoft { 42 struct mbuf *txs_mbuf; /* head of our mbuf chain */ 43 bus_dmamap_t txs_dmamap; /* our DMA map */ 44 }; 45 46 struct enet_rxsoft { 47 struct mbuf *rxs_mbuf; /* head of our mbuf chain */ 48 bus_dmamap_t rxs_dmamap; /* our DMA map */ 49 }; 50 51 struct enet_softc { 52 device_t sc_dev; 53 54 bus_space_tag_t sc_iot; 55 bus_space_handle_t sc_ioh; 56 bus_dma_tag_t sc_dmat; 57 58 int sc_unit; 59 int sc_imxtype; 60 int sc_rgmii; 61 unsigned int sc_pllclock; 62 63 struct clk *sc_clk_enet; 64 struct clk *sc_clk_enet_ref; 65 66 /* interrupts */ 67 void *sc_ih; 68 void *sc_ih2; /* for i.MX7 */ 69 void *sc_ih3; /* for i.MX7 */ 70 callout_t sc_tick_ch; 71 bool sc_stopping; 72 73 /* TX */ 74 struct enet_txdesc *sc_txdesc_ring; /* [ENET_TX_RING_CNT] */ 75 bus_dmamap_t sc_txdesc_dmamap; 76 struct enet_rxdesc *sc_rxdesc_ring; /* [ENET_RX_RING_CNT] */ 77 bus_dmamap_t sc_rxdesc_dmamap; 78 struct enet_txsoft sc_txsoft[ENET_TX_RING_CNT]; 79 int sc_tx_considx; 80 int sc_tx_prodidx; 81 int sc_tx_free; 82 83 /* RX */ 84 struct enet_rxsoft sc_rxsoft[ENET_RX_RING_CNT]; 85 int sc_rx_readidx; 86 87 /* misc */ 88 u_short sc_if_flags; /* local copy of if_flags */ 89 int sc_flowflags; /* 802.3x flow control flags */ 90 struct ethercom sc_ethercom; /* interface info */ 91 struct mii_data sc_mii; 92 uint8_t sc_enaddr[ETHER_ADDR_LEN]; 93 krndsource_t sc_rnd_source; 94 95 #ifdef ENET_EVENT_COUNTER 96 struct evcnt sc_ev_t_drop; 97 struct evcnt sc_ev_t_packets; 98 struct evcnt sc_ev_t_bc_pkt; 99 struct evcnt sc_ev_t_mc_pkt; 100 struct evcnt sc_ev_t_crc_align; 101 struct evcnt sc_ev_t_undersize; 102 struct evcnt sc_ev_t_oversize; 103 struct evcnt sc_ev_t_frag; 104 struct evcnt sc_ev_t_jab; 105 struct evcnt sc_ev_t_col; 106 struct evcnt sc_ev_t_p64; 107 struct evcnt sc_ev_t_p65to127n; 108 struct evcnt sc_ev_t_p128to255n; 109 struct evcnt sc_ev_t_p256to511; 110 struct evcnt sc_ev_t_p512to1023; 111 struct evcnt sc_ev_t_p1024to2047; 112 struct evcnt sc_ev_t_p_gte2048; 113 struct evcnt sc_ev_t_octets; 114 struct evcnt sc_ev_r_packets; 115 struct evcnt sc_ev_r_bc_pkt; 116 struct evcnt sc_ev_r_mc_pkt; 117 struct evcnt sc_ev_r_crc_align; 118 struct evcnt sc_ev_r_undersize; 119 struct evcnt sc_ev_r_oversize; 120 struct evcnt sc_ev_r_frag; 121 struct evcnt sc_ev_r_jab; 122 struct evcnt sc_ev_r_p64; 123 struct evcnt sc_ev_r_p65to127; 124 struct evcnt sc_ev_r_p128to255; 125 struct evcnt sc_ev_r_p256to511; 126 struct evcnt sc_ev_r_p512to1023; 127 struct evcnt sc_ev_r_p1024to2047; 128 struct evcnt sc_ev_r_p_gte2048; 129 struct evcnt sc_ev_r_octets; 130 #endif /* ENET_EVENT_COUNTER */ 131 }; 132 133 int enet_attach_common(device_t); 134 int enet_match(device_t, cfdata_t, void *); 135 void enet_attach(device_t, device_t, void *); 136 137 int enet_intr(void *); 138 139 #endif /* _ARM_IMX_IF_ENETVAR_H_ */ 140