1 1.20 msaitoh /* $NetBSD: if_skvar.h,v 1.20 2019/09/13 07:55:07 msaitoh Exp $ */ 2 1.1 jdolecek 3 1.1 jdolecek /*- 4 1.1 jdolecek * Copyright (c) 2003 The NetBSD Foundation, Inc. 5 1.1 jdolecek * All rights reserved. 6 1.1 jdolecek * 7 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 8 1.1 jdolecek * modification, are permitted provided that the following conditions 9 1.1 jdolecek * are met: 10 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 11 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 12 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 14 1.1 jdolecek * documentation and/or other materials provided with the distribution. 15 1.1 jdolecek * 16 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 jdolecek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 jdolecek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 jdolecek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 jdolecek * POSSIBILITY OF SUCH DAMAGE. 27 1.1 jdolecek */ 28 1.1 jdolecek /* $OpenBSD: if_skreg.h,v 1.10 2003/08/12 05:23:06 nate Exp $ */ 29 1.1 jdolecek 30 1.1 jdolecek /* 31 1.1 jdolecek * Copyright (c) 1997, 1998, 1999, 2000 32 1.1 jdolecek * Bill Paul <wpaul (at) ctr.columbia.edu>. All rights reserved. 33 1.1 jdolecek * 34 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 35 1.1 jdolecek * modification, are permitted provided that the following conditions 36 1.1 jdolecek * are met: 37 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 38 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 39 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 40 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 41 1.1 jdolecek * documentation and/or other materials provided with the distribution. 42 1.1 jdolecek * 3. All advertising materials mentioning features or use of this software 43 1.1 jdolecek * must display the following acknowledgement: 44 1.1 jdolecek * This product includes software developed by Bill Paul. 45 1.1 jdolecek * 4. Neither the name of the author nor the names of any co-contributors 46 1.1 jdolecek * may be used to endorse or promote products derived from this software 47 1.1 jdolecek * without specific prior written permission. 48 1.1 jdolecek * 49 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 50 1.1 jdolecek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 51 1.1 jdolecek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 52 1.1 jdolecek * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 53 1.1 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 54 1.1 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 55 1.1 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 56 1.1 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 57 1.1 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 58 1.1 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 59 1.1 jdolecek * THE POSSIBILITY OF SUCH DAMAGE. 60 1.1 jdolecek * 61 1.1 jdolecek * $FreeBSD: /c/ncvs/src/sys/pci/if_skreg.h,v 1.9 2000/04/22 02:16:37 wpaul Exp $ 62 1.1 jdolecek */ 63 1.1 jdolecek 64 1.1 jdolecek /* 65 1.1 jdolecek * Copyright (c) 2003 Nathan L. Binkert <binkertn (at) umich.edu> 66 1.1 jdolecek * 67 1.1 jdolecek * Permission to use, copy, modify, and distribute this software for any 68 1.1 jdolecek * purpose with or without fee is hereby granted, provided that the above 69 1.1 jdolecek * copyright notice and this permission notice appear in all copies. 70 1.1 jdolecek * 71 1.1 jdolecek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 72 1.1 jdolecek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 73 1.1 jdolecek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 74 1.1 jdolecek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 75 1.1 jdolecek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 76 1.1 jdolecek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 77 1.1 jdolecek * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 78 1.1 jdolecek */ 79 1.1 jdolecek 80 1.1 jdolecek #ifndef _DEV_PCI_IF_SKVAR_H_ 81 1.1 jdolecek #define _DEV_PCI_IF_SKVAR_H_ 82 1.1 jdolecek 83 1.18 riastrad #include <sys/rndsource.h> 84 1.8 rpaulo 85 1.1 jdolecek struct sk_jpool_entry { 86 1.1 jdolecek int slot; 87 1.1 jdolecek LIST_ENTRY(sk_jpool_entry) jpool_entries; 88 1.1 jdolecek }; 89 1.1 jdolecek 90 1.1 jdolecek struct sk_chain { 91 1.1 jdolecek void *sk_desc; 92 1.1 jdolecek struct mbuf *sk_mbuf; 93 1.1 jdolecek struct sk_chain *sk_next; 94 1.1 jdolecek }; 95 1.1 jdolecek 96 1.1 jdolecek /* 97 1.1 jdolecek * Number of DMA segments in a TxCB. Note that this is carefully 98 1.1 jdolecek * chosen to make the total struct size an even power of two. It's 99 1.3 wiz * critical that no TxCB be split across a page boundary since 100 1.1 jdolecek * no attempt is made to allocate physically contiguous memory. 101 1.5 perry * 102 1.1 jdolecek */ 103 1.1 jdolecek #define SK_NTXSEG 30 104 1.1 jdolecek 105 1.1 jdolecek struct sk_txmap_entry { 106 1.1 jdolecek bus_dmamap_t dmamap; 107 1.4 skd SIMPLEQ_ENTRY(sk_txmap_entry) link; 108 1.1 jdolecek }; 109 1.1 jdolecek 110 1.1 jdolecek struct sk_chain_data { 111 1.1 jdolecek struct sk_chain sk_tx_chain[SK_TX_RING_CNT]; 112 1.1 jdolecek struct sk_chain sk_rx_chain[SK_RX_RING_CNT]; 113 1.1 jdolecek struct sk_txmap_entry *sk_tx_map[SK_TX_RING_CNT]; 114 1.1 jdolecek bus_dmamap_t sk_rx_map[SK_RX_RING_CNT]; 115 1.10 riz bus_dmamap_t sk_rx_jumbo_map; 116 1.1 jdolecek int sk_tx_prod; 117 1.1 jdolecek int sk_tx_cons; 118 1.1 jdolecek int sk_tx_cnt; 119 1.1 jdolecek int sk_rx_prod; 120 1.1 jdolecek int sk_rx_cons; 121 1.1 jdolecek int sk_rx_cnt; 122 1.1 jdolecek /* Stick the jumbo mem management stuff here too. */ 123 1.12 christos void * sk_jslots[SK_JSLOTS]; 124 1.1 jdolecek void *sk_jumbo_buf; 125 1.1 jdolecek 126 1.1 jdolecek }; 127 1.1 jdolecek 128 1.1 jdolecek struct sk_ring_data { 129 1.1 jdolecek struct sk_tx_desc sk_tx_ring[SK_TX_RING_CNT]; 130 1.1 jdolecek struct sk_rx_desc sk_rx_ring[SK_RX_RING_CNT]; 131 1.1 jdolecek }; 132 1.1 jdolecek 133 1.1 jdolecek #define SK_TX_RING_ADDR(sc, i) \ 134 1.1 jdolecek ((sc)->sk_ring_map->dm_segs[0].ds_addr + \ 135 1.1 jdolecek offsetof(struct sk_ring_data, sk_tx_ring[(i)])) 136 1.1 jdolecek 137 1.1 jdolecek #define SK_RX_RING_ADDR(sc, i) \ 138 1.1 jdolecek ((sc)->sk_ring_map->dm_segs[0].ds_addr + \ 139 1.1 jdolecek offsetof(struct sk_ring_data, sk_rx_ring[(i)])) 140 1.2 briggs 141 1.2 briggs #define SK_CDOFF(x) offsetof(struct sk_ring_data, x) 142 1.2 briggs #define SK_CDTXOFF(x) SK_CDOFF(sk_tx_ring[(x)]) 143 1.2 briggs #define SK_CDRXOFF(x) SK_CDOFF(sk_rx_ring[(x)]) 144 1.2 briggs 145 1.2 briggs #define SK_CDTXSYNC(sc, x, n, ops) \ 146 1.2 briggs do { \ 147 1.2 briggs int __x, __n; \ 148 1.2 briggs \ 149 1.2 briggs __x = (x); \ 150 1.2 briggs __n = (n); \ 151 1.2 briggs \ 152 1.2 briggs /* If it will wrap around, sync to the end of the ring. */ \ 153 1.2 briggs if ((__x + __n) > SK_TX_RING_CNT) { \ 154 1.2 briggs bus_dmamap_sync((sc)->sk_softc->sc_dmatag, \ 155 1.2 briggs (sc)->sk_ring_map, SK_CDTXOFF(__x), \ 156 1.2 briggs sizeof(struct sk_tx_desc) * (SK_TX_RING_CNT - __x),\ 157 1.2 briggs (ops)); \ 158 1.2 briggs __n -= (SK_TX_RING_CNT - __x); \ 159 1.2 briggs __x = 0; \ 160 1.2 briggs } \ 161 1.2 briggs \ 162 1.2 briggs /* Now sync whatever is left. */ \ 163 1.2 briggs bus_dmamap_sync((sc)->sk_softc->sc_dmatag, (sc)->sk_ring_map, \ 164 1.2 briggs SK_CDTXOFF((__x)), sizeof(struct sk_tx_desc) * __n, (ops)); \ 165 1.2 briggs } while (/*CONSTCOND*/0) 166 1.2 briggs 167 1.2 briggs #define SK_CDRXSYNC(sc, x, ops) \ 168 1.2 briggs do { \ 169 1.2 briggs bus_dmamap_sync((sc)->sk_softc->sc_dmatag, (sc)->sk_ring_map, \ 170 1.2 briggs SK_CDRXOFF((x)), sizeof(struct sk_rx_desc), (ops)); \ 171 1.2 briggs } while (/*CONSTCOND*/0) 172 1.1 jdolecek 173 1.1 jdolecek struct sk_bcom_hack { 174 1.1 jdolecek int reg; 175 1.1 jdolecek int val; 176 1.1 jdolecek }; 177 1.1 jdolecek 178 1.1 jdolecek #define SK_INC(x, y) (x) = (x + 1) % y 179 1.1 jdolecek 180 1.1 jdolecek /* Forward decl. */ 181 1.1 jdolecek struct sk_if_softc; 182 1.1 jdolecek 183 1.1 jdolecek /* Softc for the GEnesis controller. */ 184 1.1 jdolecek struct sk_softc { 185 1.15 christos device_t sk_dev; /* generic device */ 186 1.1 jdolecek bus_space_handle_t sk_bhandle; /* bus space handle */ 187 1.1 jdolecek bus_space_tag_t sk_btag; /* bus space tag */ 188 1.1 jdolecek void *sk_intrhand; /* irq handler handle */ 189 1.1 jdolecek u_int8_t sk_type; 190 1.4 skd u_int8_t sk_rev; 191 1.6 christos const char *sk_name; 192 1.1 jdolecek char *sk_vpd_prodname; 193 1.1 jdolecek char *sk_vpd_readonly; 194 1.1 jdolecek u_int32_t sk_rboff; /* RAMbuffer offset */ 195 1.1 jdolecek u_int32_t sk_ramsize; /* amount of RAM on NIC */ 196 1.1 jdolecek u_int32_t sk_pmd; /* physical media type */ 197 1.1 jdolecek u_int32_t sk_intrmask; 198 1.9 riz struct sysctllog *sk_clog; 199 1.9 riz int sk_int_mod; 200 1.9 riz int sk_int_mod_pending; 201 1.1 jdolecek bus_dma_tag_t sc_dmatag; 202 1.1 jdolecek struct sk_if_softc *sk_if[2]; 203 1.19 jdolecek u_int8_t rnd_attached; 204 1.19 jdolecek krndsource_t rnd_source; 205 1.1 jdolecek }; 206 1.1 jdolecek 207 1.1 jdolecek /* Softc for each logical interface */ 208 1.1 jdolecek struct sk_if_softc { 209 1.15 christos device_t sk_dev; /* generic device */ 210 1.1 jdolecek struct ethercom sk_ethercom; /* interface info */ 211 1.1 jdolecek struct mii_data sk_mii; 212 1.1 jdolecek u_int8_t sk_enaddr[ETHER_ADDR_LEN]; /* station addr */ 213 1.1 jdolecek u_int8_t sk_port; /* port # on controller */ 214 1.1 jdolecek u_int8_t sk_xmac_rev; /* XMAC chip rev (B2 or C1) */ 215 1.1 jdolecek u_int32_t sk_rx_ramstart; 216 1.1 jdolecek u_int32_t sk_rx_ramend; 217 1.1 jdolecek u_int32_t sk_tx_ramstart; 218 1.1 jdolecek u_int32_t sk_tx_ramend; 219 1.1 jdolecek int sk_phytype; 220 1.1 jdolecek int sk_phyaddr; 221 1.1 jdolecek int sk_cnt; 222 1.1 jdolecek int sk_link; 223 1.1 jdolecek struct callout sk_tick_ch; 224 1.1 jdolecek struct sk_chain_data sk_cdata; 225 1.1 jdolecek struct sk_ring_data *sk_rdata; 226 1.1 jdolecek bus_dmamap_t sk_ring_map; 227 1.1 jdolecek struct sk_softc *sk_softc; /* parent controller */ 228 1.1 jdolecek int sk_tx_bmu; /* TX BMU register */ 229 1.20 msaitoh u_short sk_if_flags; 230 1.14 cube kmutex_t sk_jpool_mtx; 231 1.1 jdolecek LIST_HEAD(__sk_jfreehead, sk_jpool_entry) sk_jfree_listhead; 232 1.1 jdolecek LIST_HEAD(__sk_jinusehead, sk_jpool_entry) sk_jinuse_listhead; 233 1.4 skd SIMPLEQ_HEAD(__sk_txmaphead, sk_txmap_entry) sk_txmap_head; 234 1.1 jdolecek }; 235 1.1 jdolecek 236 1.1 jdolecek struct skc_attach_args { 237 1.1 jdolecek u_int16_t skc_port; 238 1.1 jdolecek }; 239 1.1 jdolecek 240 1.1 jdolecek #endif /* _DEV_PCI_IF_SKVAR_H_ */ 241