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 #define STGE_MAXSGSIZE PAGE_SIZE 55 56 #define STGE_JUMBO_FRAMELEN 9022 57 #define STGE_JUMBO_MTU \ 58 (STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN) 59 60 struct stge_txdesc { 61 struct mbuf *tx_m; /* head of our mbuf chain */ 62 bus_dmamap_t tx_dmamap; /* our DMA map */ 63 STAILQ_ENTRY(stge_txdesc) tx_q; 64 }; 65 66 STAILQ_HEAD(stge_txdq, stge_txdesc); 67 68 struct stge_rxdesc { 69 struct mbuf *rx_m; 70 bus_dmamap_t rx_dmamap; 71 }; 72 73 #define STGE_ADDR_LO(x) ((u_int64_t) (x) & 0xffffffff) 74 #define STGE_ADDR_HI(x) ((u_int64_t) (x) >> 32) 75 76 #define STGE_RING_ALIGN 8 77 78 struct stge_chain_data{ 79 bus_dma_tag_t stge_parent_tag; 80 bus_dma_tag_t stge_tx_tag; 81 struct stge_txdesc stge_txdesc[STGE_TX_RING_CNT]; 82 struct stge_txdq stge_txfreeq; 83 struct stge_txdq stge_txbusyq; 84 bus_dma_tag_t stge_rx_tag; 85 struct stge_rxdesc stge_rxdesc[STGE_RX_RING_CNT]; 86 bus_dma_tag_t stge_tx_ring_tag; 87 bus_dmamap_t stge_tx_ring_map; 88 bus_dma_tag_t stge_rx_ring_tag; 89 bus_dmamap_t stge_rx_ring_map; 90 bus_dmamap_t stge_rx_sparemap; 91 92 int stge_tx_prod; 93 int stge_tx_cons; 94 int stge_tx_cnt; 95 int stge_rx_cons; 96 int stge_rxlen; 97 struct mbuf *stge_rxhead; 98 struct mbuf *stge_rxtail; 99 }; 100 101 struct stge_ring_data { 102 struct stge_tfd *stge_tx_ring; 103 bus_addr_t stge_tx_ring_paddr; 104 struct stge_rfd *stge_rx_ring; 105 bus_addr_t stge_rx_ring_paddr; 106 }; 107 108 #define STGE_TX_RING_ADDR(sc, i) \ 109 ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i)) 110 #define STGE_RX_RING_ADDR(sc, i) \ 111 ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i)) 112 113 #define STGE_TX_RING_SZ \ 114 (sizeof(struct stge_tfd) * STGE_TX_RING_CNT) 115 #define STGE_RX_RING_SZ \ 116 (sizeof(struct stge_rfd) * STGE_RX_RING_CNT) 117 118 /* 119 * Software state per device. 120 */ 121 struct stge_softc { 122 struct arpcom arpcom; 123 device_t sc_dev; 124 device_t sc_miibus; 125 126 bus_space_handle_t sc_bhandle; /* bus space handle */ 127 bus_space_tag_t sc_btag; /* bus space tag */ 128 int sc_res_rid; 129 int sc_res_type; 130 struct resource *sc_res; 131 132 int sc_irq_rid; 133 struct resource *sc_irq; 134 void *sc_ih; /* interrupt cookie */ 135 136 int sc_rev; /* silicon revision */ 137 138 struct callout sc_tick_ch; /* tick callout */ 139 140 struct ifpoll_compat sc_npoll; 141 struct stge_chain_data sc_cdata; 142 struct stge_ring_data sc_rdata; 143 int sc_if_flags; 144 int sc_if_framesize; 145 int sc_txthresh; /* Tx threshold */ 146 uint32_t sc_usefiber:1; /* if we're fiber */ 147 uint32_t sc_stge1023:1; /* are we a 1023 */ 148 uint32_t sc_DMACtrl; /* prototype DMACtrl reg. */ 149 uint32_t sc_MACCtrl; /* prototype MacCtrl reg. */ 150 uint16_t sc_IntEnable; /* prototype IntEnable reg. */ 151 uint16_t sc_led; /* LED conf. from EEPROM */ 152 uint8_t sc_PhyCtrl; /* prototype PhyCtrl reg. */ 153 int sc_suspended; 154 int sc_detach; 155 156 struct sysctl_ctx_list sc_sysctl_ctx; 157 struct sysctl_oid *sc_sysctl_tree; 158 int sc_rxint_nframe; 159 int sc_rxint_dmawait; 160 int sc_nerr; 161 }; 162 163 #define STGE_MAXERR 5 164 165 #define STGE_RXCHAIN_RESET(_sc) \ 166 do { \ 167 (_sc)->sc_cdata.stge_rxhead = NULL; \ 168 (_sc)->sc_cdata.stge_rxtail = NULL; \ 169 (_sc)->sc_cdata.stge_rxlen = 0; \ 170 } while (/*CONSTCOND*/0) 171 172 #define STGE_TIMEOUT 1000 173 174 struct stge_mii_frame { 175 uint8_t mii_stdelim; 176 uint8_t mii_opcode; 177 uint8_t mii_phyaddr; 178 uint8_t mii_regaddr; 179 uint8_t mii_turnaround; 180 uint16_t mii_data; 181 }; 182