116199571SPyun YongHyeon /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 416199571SPyun YongHyeon * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 516199571SPyun YongHyeon * All rights reserved. 616199571SPyun YongHyeon * 716199571SPyun YongHyeon * Redistribution and use in source and binary forms, with or without 816199571SPyun YongHyeon * modification, are permitted provided that the following conditions 916199571SPyun YongHyeon * are met: 1016199571SPyun YongHyeon * 1. Redistributions of source code must retain the above copyright 1116199571SPyun YongHyeon * notice unmodified, this list of conditions, and the following 1216199571SPyun YongHyeon * disclaimer. 1316199571SPyun YongHyeon * 2. Redistributions in binary form must reproduce the above copyright 1416199571SPyun YongHyeon * notice, this list of conditions and the following disclaimer in the 1516199571SPyun YongHyeon * documentation and/or other materials provided with the distribution. 1616199571SPyun YongHyeon * 1716199571SPyun YongHyeon * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1816199571SPyun YongHyeon * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1916199571SPyun YongHyeon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2016199571SPyun YongHyeon * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2116199571SPyun YongHyeon * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2216199571SPyun YongHyeon * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2316199571SPyun YongHyeon * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2416199571SPyun YongHyeon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2516199571SPyun YongHyeon * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2616199571SPyun YongHyeon * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2716199571SPyun YongHyeon * SUCH DAMAGE. 2816199571SPyun YongHyeon */ 2916199571SPyun YongHyeon 3016199571SPyun YongHyeon #ifndef _IF_AGEVAR_H 3116199571SPyun YongHyeon #define _IF_AGEVAR_H 3216199571SPyun YongHyeon 3316199571SPyun YongHyeon #define AGE_TX_RING_CNT 256 3416199571SPyun YongHyeon #define AGE_RX_RING_CNT 256 3516199571SPyun YongHyeon #define AGE_RR_RING_CNT (AGE_TX_RING_CNT + AGE_RX_RING_CNT) 3616199571SPyun YongHyeon /* The following ring alignments are just guessing. */ 3716199571SPyun YongHyeon #define AGE_TX_RING_ALIGN 16 3816199571SPyun YongHyeon #define AGE_RX_RING_ALIGN 16 3916199571SPyun YongHyeon #define AGE_RR_RING_ALIGN 16 4016199571SPyun YongHyeon #define AGE_CMB_ALIGN 16 4116199571SPyun YongHyeon #define AGE_SMB_ALIGN 16 4216199571SPyun YongHyeon 4316199571SPyun YongHyeon #define AGE_TSO_MAXSEGSIZE 4096 4416199571SPyun YongHyeon #define AGE_TSO_MAXSIZE (65535 + sizeof(struct ether_vlan_header)) 4552ee8ac0SPyun YongHyeon #define AGE_MAXTXSEGS 35 46088dd4b7SPyun YongHyeon #define AGE_RX_BUF_ALIGN 8 47088dd4b7SPyun YongHyeon #ifndef __NO_STRICT_ALIGNMENT 48088dd4b7SPyun YongHyeon #define AGE_RX_BUF_SIZE (MCLBYTES - AGE_RX_BUF_ALIGN) 49088dd4b7SPyun YongHyeon #else 50088dd4b7SPyun YongHyeon #define AGE_RX_BUF_SIZE (MCLBYTES) 51088dd4b7SPyun YongHyeon #endif 5216199571SPyun YongHyeon 5316199571SPyun YongHyeon #define AGE_ADDR_LO(x) ((uint64_t) (x) & 0xFFFFFFFF) 5416199571SPyun YongHyeon #define AGE_ADDR_HI(x) ((uint64_t) (x) >> 32) 5516199571SPyun YongHyeon 5616199571SPyun YongHyeon #define AGE_MSI_MESSAGES 1 5716199571SPyun YongHyeon #define AGE_MSIX_MESSAGES 1 5816199571SPyun YongHyeon 5916199571SPyun YongHyeon /* TODO : Should get real jumbo MTU size. */ 6016199571SPyun YongHyeon #define AGE_JUMBO_FRAMELEN 10240 6116199571SPyun YongHyeon #define AGE_JUMBO_MTU \ 6216199571SPyun YongHyeon (AGE_JUMBO_FRAMELEN - ETHER_VLAN_ENCAP_LEN - \ 6316199571SPyun YongHyeon ETHER_HDR_LEN - ETHER_CRC_LEN) 6416199571SPyun YongHyeon 6516199571SPyun YongHyeon #define AGE_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 6616199571SPyun YongHyeon 6716199571SPyun YongHyeon #define AGE_PROC_MIN 30 6816199571SPyun YongHyeon #define AGE_PROC_MAX (AGE_RX_RING_CNT - 1) 6916199571SPyun YongHyeon #define AGE_PROC_DEFAULT (AGE_RX_RING_CNT / 2) 7016199571SPyun YongHyeon 7116199571SPyun YongHyeon struct age_txdesc { 7216199571SPyun YongHyeon struct mbuf *tx_m; 7316199571SPyun YongHyeon bus_dmamap_t tx_dmamap; 7416199571SPyun YongHyeon struct tx_desc *tx_desc; 7516199571SPyun YongHyeon }; 7616199571SPyun YongHyeon 7716199571SPyun YongHyeon struct age_rxdesc { 7816199571SPyun YongHyeon struct mbuf *rx_m; 7916199571SPyun YongHyeon bus_dmamap_t rx_dmamap; 8016199571SPyun YongHyeon struct rx_desc *rx_desc; 8116199571SPyun YongHyeon }; 8216199571SPyun YongHyeon 8316199571SPyun YongHyeon struct age_chain_data{ 8416199571SPyun YongHyeon bus_dma_tag_t age_parent_tag; 8516199571SPyun YongHyeon bus_dma_tag_t age_buffer_tag; 8616199571SPyun YongHyeon bus_dma_tag_t age_tx_tag; 8716199571SPyun YongHyeon struct age_txdesc age_txdesc[AGE_TX_RING_CNT]; 8816199571SPyun YongHyeon bus_dma_tag_t age_rx_tag; 8916199571SPyun YongHyeon struct age_rxdesc age_rxdesc[AGE_RX_RING_CNT]; 9016199571SPyun YongHyeon bus_dma_tag_t age_tx_ring_tag; 9116199571SPyun YongHyeon bus_dmamap_t age_tx_ring_map; 9216199571SPyun YongHyeon bus_dma_tag_t age_rx_ring_tag; 9316199571SPyun YongHyeon bus_dmamap_t age_rx_ring_map; 9416199571SPyun YongHyeon bus_dmamap_t age_rx_sparemap; 9516199571SPyun YongHyeon bus_dma_tag_t age_rr_ring_tag; 9616199571SPyun YongHyeon bus_dmamap_t age_rr_ring_map; 9716199571SPyun YongHyeon bus_dma_tag_t age_cmb_block_tag; 9816199571SPyun YongHyeon bus_dmamap_t age_cmb_block_map; 9916199571SPyun YongHyeon bus_dma_tag_t age_smb_block_tag; 10016199571SPyun YongHyeon bus_dmamap_t age_smb_block_map; 10116199571SPyun YongHyeon 10216199571SPyun YongHyeon int age_tx_prod; 10316199571SPyun YongHyeon int age_tx_cons; 10416199571SPyun YongHyeon int age_tx_cnt; 10516199571SPyun YongHyeon int age_rx_cons; 10616199571SPyun YongHyeon int age_rr_cons; 10716199571SPyun YongHyeon int age_rxlen; 10816199571SPyun YongHyeon 10916199571SPyun YongHyeon struct mbuf *age_rxhead; 11016199571SPyun YongHyeon struct mbuf *age_rxtail; 11116199571SPyun YongHyeon struct mbuf *age_rxprev_tail; 11216199571SPyun YongHyeon }; 11316199571SPyun YongHyeon 11416199571SPyun YongHyeon struct age_ring_data { 11516199571SPyun YongHyeon struct tx_desc *age_tx_ring; 11616199571SPyun YongHyeon bus_addr_t age_tx_ring_paddr; 11716199571SPyun YongHyeon struct rx_desc *age_rx_ring; 11816199571SPyun YongHyeon bus_addr_t age_rx_ring_paddr; 11916199571SPyun YongHyeon struct rx_rdesc *age_rr_ring; 12016199571SPyun YongHyeon bus_addr_t age_rr_ring_paddr; 12116199571SPyun YongHyeon struct cmb *age_cmb_block; 12216199571SPyun YongHyeon bus_addr_t age_cmb_block_paddr; 12316199571SPyun YongHyeon struct smb *age_smb_block; 12416199571SPyun YongHyeon bus_addr_t age_smb_block_paddr; 12516199571SPyun YongHyeon }; 12616199571SPyun YongHyeon 12716199571SPyun YongHyeon #define AGE_TX_RING_SZ \ 12816199571SPyun YongHyeon (sizeof(struct tx_desc) * AGE_TX_RING_CNT) 12916199571SPyun YongHyeon #define AGE_RX_RING_SZ \ 13016199571SPyun YongHyeon (sizeof(struct rx_desc) * AGE_RX_RING_CNT) 13116199571SPyun YongHyeon #define AGE_RR_RING_SZ \ 13216199571SPyun YongHyeon (sizeof(struct rx_rdesc) * AGE_RR_RING_CNT) 13316199571SPyun YongHyeon #define AGE_CMB_BLOCK_SZ sizeof(struct cmb) 13416199571SPyun YongHyeon #define AGE_SMB_BLOCK_SZ sizeof(struct smb) 13516199571SPyun YongHyeon 13616199571SPyun YongHyeon struct age_stats { 13716199571SPyun YongHyeon /* Rx stats. */ 13816199571SPyun YongHyeon uint64_t rx_frames; 13916199571SPyun YongHyeon uint64_t rx_bcast_frames; 14016199571SPyun YongHyeon uint64_t rx_mcast_frames; 14116199571SPyun YongHyeon uint32_t rx_pause_frames; 14216199571SPyun YongHyeon uint32_t rx_control_frames; 14316199571SPyun YongHyeon uint32_t rx_crcerrs; 14416199571SPyun YongHyeon uint32_t rx_lenerrs; 14516199571SPyun YongHyeon uint64_t rx_bytes; 14616199571SPyun YongHyeon uint32_t rx_runts; 14716199571SPyun YongHyeon uint64_t rx_fragments; 14816199571SPyun YongHyeon uint64_t rx_pkts_64; 14916199571SPyun YongHyeon uint64_t rx_pkts_65_127; 15016199571SPyun YongHyeon uint64_t rx_pkts_128_255; 15116199571SPyun YongHyeon uint64_t rx_pkts_256_511; 15216199571SPyun YongHyeon uint64_t rx_pkts_512_1023; 15316199571SPyun YongHyeon uint64_t rx_pkts_1024_1518; 15416199571SPyun YongHyeon uint64_t rx_pkts_1519_max; 15516199571SPyun YongHyeon uint64_t rx_pkts_truncated; 15616199571SPyun YongHyeon uint32_t rx_fifo_oflows; 15716199571SPyun YongHyeon uint32_t rx_desc_oflows; 15816199571SPyun YongHyeon uint32_t rx_alignerrs; 15916199571SPyun YongHyeon uint64_t rx_bcast_bytes; 16016199571SPyun YongHyeon uint64_t rx_mcast_bytes; 16116199571SPyun YongHyeon uint64_t rx_pkts_filtered; 16216199571SPyun YongHyeon /* Tx stats. */ 16316199571SPyun YongHyeon uint64_t tx_frames; 16416199571SPyun YongHyeon uint64_t tx_bcast_frames; 16516199571SPyun YongHyeon uint64_t tx_mcast_frames; 16616199571SPyun YongHyeon uint32_t tx_pause_frames; 16716199571SPyun YongHyeon uint32_t tx_excess_defer; 16816199571SPyun YongHyeon uint32_t tx_control_frames; 16916199571SPyun YongHyeon uint32_t tx_deferred; 17016199571SPyun YongHyeon uint64_t tx_bytes; 17116199571SPyun YongHyeon uint64_t tx_pkts_64; 17216199571SPyun YongHyeon uint64_t tx_pkts_65_127; 17316199571SPyun YongHyeon uint64_t tx_pkts_128_255; 17416199571SPyun YongHyeon uint64_t tx_pkts_256_511; 17516199571SPyun YongHyeon uint64_t tx_pkts_512_1023; 17616199571SPyun YongHyeon uint64_t tx_pkts_1024_1518; 17716199571SPyun YongHyeon uint64_t tx_pkts_1519_max; 17816199571SPyun YongHyeon uint32_t tx_single_colls; 17916199571SPyun YongHyeon uint32_t tx_multi_colls; 18016199571SPyun YongHyeon uint32_t tx_late_colls; 18116199571SPyun YongHyeon uint32_t tx_excess_colls; 18216199571SPyun YongHyeon uint32_t tx_underrun; 18316199571SPyun YongHyeon uint32_t tx_desc_underrun; 18416199571SPyun YongHyeon uint32_t tx_lenerrs; 18516199571SPyun YongHyeon uint32_t tx_pkts_truncated; 18616199571SPyun YongHyeon uint64_t tx_bcast_bytes; 18716199571SPyun YongHyeon uint64_t tx_mcast_bytes; 18816199571SPyun YongHyeon }; 18916199571SPyun YongHyeon 19016199571SPyun YongHyeon /* 19116199571SPyun YongHyeon * Software state per device. 19216199571SPyun YongHyeon */ 19316199571SPyun YongHyeon struct age_softc { 19452436412SJustin Hibbits if_t age_ifp; 19516199571SPyun YongHyeon device_t age_dev; 19616199571SPyun YongHyeon device_t age_miibus; 19716199571SPyun YongHyeon struct resource *age_res[1]; 19816199571SPyun YongHyeon struct resource_spec *age_res_spec; 19916199571SPyun YongHyeon struct resource *age_irq[AGE_MSI_MESSAGES]; 20016199571SPyun YongHyeon struct resource_spec *age_irq_spec; 20116199571SPyun YongHyeon void *age_intrhand[AGE_MSI_MESSAGES]; 20216199571SPyun YongHyeon int age_rev; 20316199571SPyun YongHyeon int age_chip_rev; 20416199571SPyun YongHyeon int age_phyaddr; 20516199571SPyun YongHyeon uint8_t age_eaddr[ETHER_ADDR_LEN]; 20616199571SPyun YongHyeon uint32_t age_dma_rd_burst; 20716199571SPyun YongHyeon uint32_t age_dma_wr_burst; 20816199571SPyun YongHyeon int age_flags; 20916199571SPyun YongHyeon #define AGE_FLAG_PCIE 0x0001 21016199571SPyun YongHyeon #define AGE_FLAG_PCIX 0x0002 21116199571SPyun YongHyeon #define AGE_FLAG_MSI 0x0004 21216199571SPyun YongHyeon #define AGE_FLAG_MSIX 0x0008 21316199571SPyun YongHyeon #define AGE_FLAG_DETACH 0x4000 21416199571SPyun YongHyeon #define AGE_FLAG_LINK 0x8000 21516199571SPyun YongHyeon 21616199571SPyun YongHyeon struct callout age_tick_ch; 21716199571SPyun YongHyeon struct age_stats age_stat; 21816199571SPyun YongHyeon struct age_chain_data age_cdata; 21916199571SPyun YongHyeon struct age_ring_data age_rdata; 22016199571SPyun YongHyeon int age_if_flags; 22116199571SPyun YongHyeon int age_watchdog_timer; 22216199571SPyun YongHyeon int age_process_limit; 22316199571SPyun YongHyeon int age_int_mod; 22416199571SPyun YongHyeon int age_max_frame_size; 22516199571SPyun YongHyeon int age_morework; 22616199571SPyun YongHyeon int age_rr_prod; 22716199571SPyun YongHyeon int age_tpd_cons; 22816199571SPyun YongHyeon 22916199571SPyun YongHyeon struct task age_int_task; 23016199571SPyun YongHyeon struct task age_link_task; 23116199571SPyun YongHyeon struct taskqueue *age_tq; 23216199571SPyun YongHyeon struct mtx age_mtx; 23316199571SPyun YongHyeon }; 23416199571SPyun YongHyeon 23516199571SPyun YongHyeon /* Register access macros. */ 23616199571SPyun YongHyeon #define CSR_WRITE_4(_sc, reg, val) \ 23716199571SPyun YongHyeon bus_write_4((_sc)->age_res[0], (reg), (val)) 23816199571SPyun YongHyeon #define CSR_WRITE_2(_sc, reg, val) \ 23916199571SPyun YongHyeon bus_write_2((_sc)->age_res[0], (reg), (val)) 24016199571SPyun YongHyeon #define CSR_READ_2(_sc, reg) \ 24116199571SPyun YongHyeon bus_read_2((_sc)->age_res[0], (reg)) 24216199571SPyun YongHyeon #define CSR_READ_4(_sc, reg) \ 24316199571SPyun YongHyeon bus_read_4((_sc)->age_res[0], (reg)) 24416199571SPyun YongHyeon 24516199571SPyun YongHyeon #define AGE_LOCK(_sc) mtx_lock(&(_sc)->age_mtx) 24616199571SPyun YongHyeon #define AGE_UNLOCK(_sc) mtx_unlock(&(_sc)->age_mtx) 24716199571SPyun YongHyeon #define AGE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->age_mtx, MA_OWNED) 24816199571SPyun YongHyeon 24916199571SPyun YongHyeon #define AGE_COMMIT_MBOX(_sc) \ 25016199571SPyun YongHyeon do { \ 25116199571SPyun YongHyeon CSR_WRITE_4(_sc, AGE_MBOX, \ 25216199571SPyun YongHyeon (((_sc)->age_cdata.age_rx_cons << MBOX_RD_PROD_IDX_SHIFT) & \ 25316199571SPyun YongHyeon MBOX_RD_PROD_IDX_MASK) | \ 25416199571SPyun YongHyeon (((_sc)->age_cdata.age_rr_cons << \ 25516199571SPyun YongHyeon MBOX_RRD_CONS_IDX_SHIFT) & MBOX_RRD_CONS_IDX_MASK) | \ 25616199571SPyun YongHyeon (((_sc)->age_cdata.age_tx_prod << MBOX_TD_PROD_IDX_SHIFT) & \ 25716199571SPyun YongHyeon MBOX_TD_PROD_IDX_MASK)); \ 25816199571SPyun YongHyeon } while (0) 25916199571SPyun YongHyeon 26016199571SPyun YongHyeon #define AGE_RXCHAIN_RESET(_sc) \ 26116199571SPyun YongHyeon do { \ 26216199571SPyun YongHyeon (_sc)->age_cdata.age_rxhead = NULL; \ 26316199571SPyun YongHyeon (_sc)->age_cdata.age_rxtail = NULL; \ 26416199571SPyun YongHyeon (_sc)->age_cdata.age_rxprev_tail = NULL; \ 26516199571SPyun YongHyeon (_sc)->age_cdata.age_rxlen = 0; \ 26616199571SPyun YongHyeon } while (0) 26716199571SPyun YongHyeon 26816199571SPyun YongHyeon #define AGE_TX_TIMEOUT 5 26916199571SPyun YongHyeon #define AGE_RESET_TIMEOUT 100 27016199571SPyun YongHyeon #define AGE_TIMEOUT 1000 27116199571SPyun YongHyeon #define AGE_PHY_TIMEOUT 1000 27216199571SPyun YongHyeon 27316199571SPyun YongHyeon #endif /* _IF_AGEVAR_H */ 274