1*5e1c6ec4Skettenis /* $OpenBSD: dwqevar.h,v 1.11 2024/02/26 18:57:50 kettenis Exp $ */ 2305ac5f9Spatrick /* 3305ac5f9Spatrick * Copyright (c) 2008, 2019 Mark Kettenis <kettenis@openbsd.org> 4305ac5f9Spatrick * Copyright (c) 2017, 2022 Patrick Wildt <patrick@blueri.se> 5305ac5f9Spatrick * 6305ac5f9Spatrick * Permission to use, copy, modify, and distribute this software for any 7305ac5f9Spatrick * purpose with or without fee is hereby granted, provided that the above 8305ac5f9Spatrick * copyright notice and this permission notice appear in all copies. 9305ac5f9Spatrick * 10305ac5f9Spatrick * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11305ac5f9Spatrick * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12305ac5f9Spatrick * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13305ac5f9Spatrick * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14305ac5f9Spatrick * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15305ac5f9Spatrick * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16305ac5f9Spatrick * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17305ac5f9Spatrick */ 18305ac5f9Spatrick 19e9f49f11Skettenis enum dwqe_phy_mode { 20e9f49f11Skettenis DWQE_PHY_MODE_UNKNOWN, 21*5e1c6ec4Skettenis DWQE_PHY_MODE_RMII, 22e9f49f11Skettenis DWQE_PHY_MODE_RGMII, 23e9f49f11Skettenis DWQE_PHY_MODE_RGMII_ID, 24e9f49f11Skettenis DWQE_PHY_MODE_RGMII_TXID, 25e9f49f11Skettenis DWQE_PHY_MODE_RGMII_RXID, 26b7fc3726Sstsp DWQE_PHY_MODE_SGMII, 27e9f49f11Skettenis }; 28e9f49f11Skettenis 29305ac5f9Spatrick struct dwqe_buf { 30305ac5f9Spatrick bus_dmamap_t tb_map; 31305ac5f9Spatrick struct mbuf *tb_m; 32305ac5f9Spatrick }; 33305ac5f9Spatrick 34305ac5f9Spatrick #define DWQE_NTXDESC 256 35305ac5f9Spatrick #define DWQE_NTXSEGS 16 36305ac5f9Spatrick 37305ac5f9Spatrick #define DWQE_NRXDESC 256 38305ac5f9Spatrick 39305ac5f9Spatrick struct dwqe_dmamem { 40305ac5f9Spatrick bus_dmamap_t tdm_map; 41305ac5f9Spatrick bus_dma_segment_t tdm_seg; 42305ac5f9Spatrick size_t tdm_size; 43305ac5f9Spatrick caddr_t tdm_kva; 44305ac5f9Spatrick }; 45305ac5f9Spatrick #define DWQE_DMA_MAP(_tdm) ((_tdm)->tdm_map) 46305ac5f9Spatrick #define DWQE_DMA_LEN(_tdm) ((_tdm)->tdm_size) 47305ac5f9Spatrick #define DWQE_DMA_DVA(_tdm) ((_tdm)->tdm_map->dm_segs[0].ds_addr) 48305ac5f9Spatrick #define DWQE_DMA_KVA(_tdm) ((void *)(_tdm)->tdm_kva) 49305ac5f9Spatrick 50305ac5f9Spatrick struct dwqe_softc { 51305ac5f9Spatrick struct device sc_dev; 52305ac5f9Spatrick int sc_node; 53305ac5f9Spatrick bus_space_tag_t sc_iot; 54305ac5f9Spatrick bus_space_handle_t sc_ioh; 55305ac5f9Spatrick bus_dma_tag_t sc_dmat; 56305ac5f9Spatrick void *sc_ih; 57305ac5f9Spatrick 58305ac5f9Spatrick struct arpcom sc_ac; 59305ac5f9Spatrick #define sc_lladdr sc_ac.ac_enaddr 60305ac5f9Spatrick struct mii_data sc_mii; 61305ac5f9Spatrick #define sc_media sc_mii.mii_media 62305ac5f9Spatrick int sc_link; 63305ac5f9Spatrick int sc_phyloc; 64e9f49f11Skettenis enum dwqe_phy_mode sc_phy_mode; 6547707f8eSdlg struct timeout sc_phy_tick; 6645f5f3c8Sdlg int sc_fixed_link; 67305ac5f9Spatrick 68305ac5f9Spatrick struct dwqe_dmamem *sc_txring; 69305ac5f9Spatrick struct dwqe_buf *sc_txbuf; 70305ac5f9Spatrick struct dwqe_desc *sc_txdesc; 71305ac5f9Spatrick int sc_tx_prod; 72305ac5f9Spatrick int sc_tx_cons; 73305ac5f9Spatrick 74305ac5f9Spatrick struct dwqe_dmamem *sc_rxring; 75305ac5f9Spatrick struct dwqe_buf *sc_rxbuf; 76305ac5f9Spatrick struct dwqe_desc *sc_rxdesc; 77305ac5f9Spatrick int sc_rx_prod; 78305ac5f9Spatrick struct if_rxring sc_rx_ring; 79305ac5f9Spatrick int sc_rx_cons; 80305ac5f9Spatrick 81305ac5f9Spatrick struct timeout sc_rxto; 827bc2c437Skettenis struct task sc_statchg_task; 83305ac5f9Spatrick 84305ac5f9Spatrick uint32_t sc_clk; 85b97405d6Sstsp uint32_t sc_clkrate; 86305ac5f9Spatrick 87305ac5f9Spatrick bus_size_t sc_clk_sel; 88305ac5f9Spatrick uint32_t sc_clk_sel_125; 89305ac5f9Spatrick uint32_t sc_clk_sel_25; 90305ac5f9Spatrick uint32_t sc_clk_sel_2_5; 91305ac5f9Spatrick 92305ac5f9Spatrick int sc_hw_feature[4]; 93305ac5f9Spatrick 94305ac5f9Spatrick int sc_force_thresh_dma_mode; 95305ac5f9Spatrick int sc_fixed_burst; 96305ac5f9Spatrick int sc_mixed_burst; 97305ac5f9Spatrick int sc_aal; 98305ac5f9Spatrick int sc_8xpbl; 99305ac5f9Spatrick int sc_pbl; 100305ac5f9Spatrick int sc_txpbl; 101305ac5f9Spatrick int sc_rxpbl; 1026e9149a4Sstsp int sc_txfifo_size; 1036e9149a4Sstsp int sc_rxfifo_size; 104305ac5f9Spatrick int sc_axi_config; 105305ac5f9Spatrick int sc_lpi_en; 106305ac5f9Spatrick int sc_xit_frm; 107305ac5f9Spatrick int sc_wr_osr_lmt; 108305ac5f9Spatrick int sc_rd_osr_lmt; 109305ac5f9Spatrick 110305ac5f9Spatrick uint32_t sc_blen[7]; 111305ac5f9Spatrick }; 112305ac5f9Spatrick 113305ac5f9Spatrick #define DEVNAME(_s) ((_s)->sc_dev.dv_xname) 114305ac5f9Spatrick 115305ac5f9Spatrick int dwqe_attach(struct dwqe_softc *); 116305ac5f9Spatrick void dwqe_reset(struct dwqe_softc *); 117305ac5f9Spatrick int dwqe_intr(void *); 118305ac5f9Spatrick uint32_t dwqe_read(struct dwqe_softc *, bus_addr_t); 119305ac5f9Spatrick void dwqe_write(struct dwqe_softc *, bus_addr_t, uint32_t); 120305ac5f9Spatrick void dwqe_lladdr_read(struct dwqe_softc *, uint8_t *); 121305ac5f9Spatrick void dwqe_lladdr_write(struct dwqe_softc *); 122305ac5f9Spatrick void dwqe_mii_statchg(struct device *); 123