1 /* $NetBSD: if_stgereg.h,v 1.3 2003/02/10 21:10:07 christos Exp $ */ 2 /* $FreeBSD: src/sys/dev/stge/if_stgereg.h,v 1.1 2006/07/25 00:37:09 yongari Exp $ */ 3 /* $DragonFly: src/sys/dev/netif/stge/if_stgevar.h,v 1.1 2006/11/16 13:43:55 sephe Exp $ */ 4 5 /*- 6 * Copyright (c) 2001 The NetBSD Foundation, Inc. 7 * All rights reserved. 8 * 9 * This code is derived from software contributed to The NetBSD Foundation 10 * by Jason R. Thorpe. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * This product includes software developed by the NetBSD 23 * Foundation, Inc. and its contributors. 24 * 4. Neither the name of The NetBSD Foundation nor the names of its 25 * contributors may be used to endorse or promote products derived 26 * from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 31 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 32 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 */ 40 41 /* 42 * Transmit descriptor list size. 43 */ 44 #define STGE_TX_RING_CNT 256 45 #define STGE_TX_LOWAT (STGE_TX_RING_CNT/32) 46 #define STGE_TX_HIWAT (STGE_TX_RING_CNT - STGE_TX_LOWAT) 47 48 /* 49 * Receive descriptor list size. 50 */ 51 #define STGE_RX_RING_CNT 256 52 53 #define STGE_MAXTXSEGS STGE_NTXFRAGS 54 55 #define STGE_JUMBO_FRAMELEN 9022 56 #define STGE_JUMBO_MTU \ 57 (STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 58 59 struct stge_txdesc { 60 struct mbuf *tx_m; /* head of our mbuf chain */ 61 bus_dmamap_t tx_dmamap; /* our DMA map */ 62 STAILQ_ENTRY(stge_txdesc) tx_q; 63 }; 64 65 STAILQ_HEAD(stge_txdq, stge_txdesc); 66 67 struct stge_rxdesc { 68 struct mbuf *rx_m; 69 bus_dmamap_t rx_dmamap; 70 }; 71 72 #define STGE_ADDR_LO(x) ((u_int64_t) (x) & 0xffffffff) 73 #define STGE_ADDR_HI(x) ((u_int64_t) (x) >> 32) 74 75 #define STGE_RING_ALIGN 8 76 77 struct stge_chain_data{ 78 bus_dma_tag_t stge_parent_tag; 79 bus_dma_tag_t stge_tx_tag; 80 struct stge_txdesc stge_txdesc[STGE_TX_RING_CNT]; 81 struct stge_txdq stge_txfreeq; 82 struct stge_txdq stge_txbusyq; 83 bus_dma_tag_t stge_rx_tag; 84 struct stge_rxdesc stge_rxdesc[STGE_RX_RING_CNT]; 85 bus_dma_tag_t stge_tx_ring_tag; 86 bus_dmamap_t stge_tx_ring_map; 87 bus_dma_tag_t stge_rx_ring_tag; 88 bus_dmamap_t stge_rx_ring_map; 89 bus_dmamap_t stge_rx_sparemap; 90 91 int stge_tx_prod; 92 int stge_tx_cons; 93 int stge_tx_cnt; 94 int stge_rx_cons; 95 #ifdef DEVICE_POLLING 96 int stge_rxcycles; 97 #endif 98 int stge_rxlen; 99 struct mbuf *stge_rxhead; 100 struct mbuf *stge_rxtail; 101 }; 102 103 struct stge_ring_data { 104 struct stge_tfd *stge_tx_ring; 105 bus_addr_t stge_tx_ring_paddr; 106 struct stge_rfd *stge_rx_ring; 107 bus_addr_t stge_rx_ring_paddr; 108 }; 109 110 #define STGE_TX_RING_ADDR(sc, i) \ 111 ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i)) 112 #define STGE_RX_RING_ADDR(sc, i) \ 113 ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i)) 114 115 #define STGE_TX_RING_SZ \ 116 (sizeof(struct stge_tfd) * STGE_TX_RING_CNT) 117 #define STGE_RX_RING_SZ \ 118 (sizeof(struct stge_rfd) * STGE_RX_RING_CNT) 119 120 /* 121 * Software state per device. 122 */ 123 struct stge_softc { 124 struct arpcom arpcom; 125 device_t sc_dev; 126 device_t sc_miibus; 127 128 bus_space_handle_t sc_bhandle; /* bus space handle */ 129 bus_space_tag_t sc_btag; /* bus space tag */ 130 int sc_res_rid; 131 int sc_res_type; 132 struct resource *sc_res; 133 134 int sc_irq_rid; 135 struct resource *sc_irq; 136 void *sc_ih; /* interrupt cookie */ 137 138 int sc_rev; /* silicon revision */ 139 140 struct callout sc_tick_ch; /* tick callout */ 141 142 struct stge_chain_data sc_cdata; 143 struct stge_ring_data sc_rdata; 144 int sc_if_flags; 145 int sc_if_framesize; 146 int sc_txthresh; /* Tx threshold */ 147 uint32_t sc_usefiber:1; /* if we're fiber */ 148 uint32_t sc_stge1023:1; /* are we a 1023 */ 149 uint32_t sc_DMACtrl; /* prototype DMACtrl reg. */ 150 uint32_t sc_MACCtrl; /* prototype MacCtrl reg. */ 151 uint16_t sc_IntEnable; /* prototype IntEnable reg. */ 152 uint16_t sc_led; /* LED conf. from EEPROM */ 153 uint8_t sc_PhyCtrl; /* prototype PhyCtrl reg. */ 154 int sc_suspended; 155 int sc_detach; 156 157 struct sysctl_ctx_list sc_sysctl_ctx; 158 struct sysctl_oid *sc_sysctl_tree; 159 int sc_rxint_nframe; 160 int sc_rxint_dmawait; 161 int sc_nerr; 162 }; 163 164 #define STGE_MAXERR 5 165 166 #define STGE_RXCHAIN_RESET(_sc) \ 167 do { \ 168 (_sc)->sc_cdata.stge_rxhead = NULL; \ 169 (_sc)->sc_cdata.stge_rxtail = NULL; \ 170 (_sc)->sc_cdata.stge_rxlen = 0; \ 171 } while (/*CONSTCOND*/0) 172 173 #define STGE_TIMEOUT 1000 174 175 struct stge_mii_frame { 176 uint8_t mii_stdelim; 177 uint8_t mii_opcode; 178 uint8_t mii_phyaddr; 179 uint8_t mii_regaddr; 180 uint8_t mii_turnaround; 181 uint16_t mii_data; 182 }; 183