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 4 /*- 5 * Copyright (c) 2001 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Jason R. Thorpe. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Transmit descriptor list size. 42 */ 43 #define STGE_TX_RING_CNT 256 44 #define STGE_TX_LOWAT (STGE_TX_RING_CNT/32) 45 #define STGE_TX_HIWAT (STGE_TX_RING_CNT - STGE_TX_LOWAT) 46 47 /* 48 * Receive descriptor list size. 49 */ 50 #define STGE_RX_RING_CNT 256 51 52 #define STGE_MAXTXSEGS STGE_NTXFRAGS 53 #define STGE_MAXSGSIZE PAGE_SIZE 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 int stge_rxlen; 96 struct mbuf *stge_rxhead; 97 struct mbuf *stge_rxtail; 98 }; 99 100 struct stge_ring_data { 101 struct stge_tfd *stge_tx_ring; 102 bus_addr_t stge_tx_ring_paddr; 103 struct stge_rfd *stge_rx_ring; 104 bus_addr_t stge_rx_ring_paddr; 105 }; 106 107 #define STGE_TX_RING_ADDR(sc, i) \ 108 ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i)) 109 #define STGE_RX_RING_ADDR(sc, i) \ 110 ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i)) 111 112 #define STGE_TX_RING_SZ \ 113 (sizeof(struct stge_tfd) * STGE_TX_RING_CNT) 114 #define STGE_RX_RING_SZ \ 115 (sizeof(struct stge_rfd) * STGE_RX_RING_CNT) 116 117 /* 118 * Software state per device. 119 */ 120 struct stge_softc { 121 struct arpcom arpcom; 122 device_t sc_dev; 123 device_t sc_miibus; 124 125 bus_space_handle_t sc_bhandle; /* bus space handle */ 126 bus_space_tag_t sc_btag; /* bus space tag */ 127 int sc_res_rid; 128 int sc_res_type; 129 struct resource *sc_res; 130 131 int sc_irq_rid; 132 struct resource *sc_irq; 133 void *sc_ih; /* interrupt cookie */ 134 135 int sc_rev; /* silicon revision */ 136 137 struct callout sc_tick_ch; /* tick callout */ 138 139 struct ifpoll_compat sc_npoll; 140 struct stge_chain_data sc_cdata; 141 struct stge_ring_data sc_rdata; 142 int sc_if_flags; 143 int sc_if_framesize; 144 int sc_txthresh; /* Tx threshold */ 145 uint32_t sc_usefiber:1; /* if we're fiber */ 146 uint32_t sc_stge1023:1; /* are we a 1023 */ 147 uint32_t sc_DMACtrl; /* prototype DMACtrl reg. */ 148 uint32_t sc_MACCtrl; /* prototype MacCtrl reg. */ 149 uint16_t sc_IntEnable; /* prototype IntEnable reg. */ 150 uint16_t sc_led; /* LED conf. from EEPROM */ 151 uint8_t sc_PhyCtrl; /* prototype PhyCtrl reg. */ 152 int sc_suspended; 153 int sc_detach; 154 155 int sc_rxint_nframe; 156 int sc_rxint_dmawait; 157 int sc_nerr; 158 }; 159 160 #define STGE_MAXERR 5 161 162 #define STGE_RXCHAIN_RESET(_sc) \ 163 do { \ 164 (_sc)->sc_cdata.stge_rxhead = NULL; \ 165 (_sc)->sc_cdata.stge_rxtail = NULL; \ 166 (_sc)->sc_cdata.stge_rxlen = 0; \ 167 } while (/*CONSTCOND*/0) 168 169 #define STGE_TIMEOUT 1000 170 171 struct stge_mii_frame { 172 uint8_t mii_stdelim; 173 uint8_t mii_opcode; 174 uint8_t mii_phyaddr; 175 uint8_t mii_regaddr; 176 uint8_t mii_turnaround; 177 uint16_t mii_data; 178 }; 179