root/sys/dev/ic/dwqevar.h
/*      $OpenBSD: dwqevar.h,v 1.11 2024/02/26 18:57:50 kettenis Exp $   */
/*
 * Copyright (c) 2008, 2019 Mark Kettenis <kettenis@openbsd.org>
 * Copyright (c) 2017, 2022 Patrick Wildt <patrick@blueri.se>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

enum dwqe_phy_mode {
        DWQE_PHY_MODE_UNKNOWN,
        DWQE_PHY_MODE_RMII,
        DWQE_PHY_MODE_RGMII,
        DWQE_PHY_MODE_RGMII_ID,
        DWQE_PHY_MODE_RGMII_TXID,
        DWQE_PHY_MODE_RGMII_RXID,
        DWQE_PHY_MODE_SGMII,
};

struct dwqe_buf {
        bus_dmamap_t    tb_map;
        struct mbuf     *tb_m;
};

#define DWQE_NTXDESC    256
#define DWQE_NTXSEGS    16

#define DWQE_NRXDESC    256

struct dwqe_dmamem {
        bus_dmamap_t            tdm_map;
        bus_dma_segment_t       tdm_seg;
        size_t                  tdm_size;
        caddr_t                 tdm_kva;
};
#define DWQE_DMA_MAP(_tdm)      ((_tdm)->tdm_map)
#define DWQE_DMA_LEN(_tdm)      ((_tdm)->tdm_size)
#define DWQE_DMA_DVA(_tdm)      ((_tdm)->tdm_map->dm_segs[0].ds_addr)
#define DWQE_DMA_KVA(_tdm)      ((void *)(_tdm)->tdm_kva)

struct dwqe_softc {
        struct device           sc_dev;
        int                     sc_node;
        bus_space_tag_t         sc_iot;
        bus_space_handle_t      sc_ioh;
        bus_dma_tag_t           sc_dmat;
        void                    *sc_ih;

        struct arpcom           sc_ac;
#define sc_lladdr       sc_ac.ac_enaddr
        struct mii_data         sc_mii;
#define sc_media        sc_mii.mii_media
        int                     sc_link;
        int                     sc_phyloc;
        enum dwqe_phy_mode      sc_phy_mode;
        struct timeout          sc_phy_tick;
        int                     sc_fixed_link;

        struct dwqe_dmamem      *sc_txring;
        struct dwqe_buf         *sc_txbuf;
        struct dwqe_desc        *sc_txdesc;
        int                     sc_tx_prod;
        int                     sc_tx_cons;

        struct dwqe_dmamem      *sc_rxring;
        struct dwqe_buf         *sc_rxbuf;
        struct dwqe_desc        *sc_rxdesc;
        int                     sc_rx_prod;
        struct if_rxring        sc_rx_ring;
        int                     sc_rx_cons;

        struct timeout          sc_rxto;
        struct task             sc_statchg_task;

        uint32_t                sc_clk;
        uint32_t                sc_clkrate;

        bus_size_t              sc_clk_sel;
        uint32_t                sc_clk_sel_125;
        uint32_t                sc_clk_sel_25;
        uint32_t                sc_clk_sel_2_5;

        int                     sc_hw_feature[4];

        int                     sc_force_thresh_dma_mode;
        int                     sc_fixed_burst;
        int                     sc_mixed_burst;
        int                     sc_aal;
        int                     sc_8xpbl;
        int                     sc_pbl;
        int                     sc_txpbl;
        int                     sc_rxpbl;
        int                     sc_txfifo_size;
        int                     sc_rxfifo_size;
        int                     sc_axi_config;
        int                     sc_lpi_en;
        int                     sc_xit_frm;
        int                     sc_wr_osr_lmt;
        int                     sc_rd_osr_lmt;

        uint32_t                sc_blen[7];
};

#define DEVNAME(_s)     ((_s)->sc_dev.dv_xname)

int     dwqe_attach(struct dwqe_softc *);
void    dwqe_reset(struct dwqe_softc *);
int     dwqe_intr(void *);
uint32_t dwqe_read(struct dwqe_softc *, bus_addr_t);
void    dwqe_write(struct dwqe_softc *, bus_addr_t, uint32_t);
void    dwqe_lladdr_read(struct dwqe_softc *, uint8_t *);
void    dwqe_lladdr_write(struct dwqe_softc *);
void    dwqe_mii_statchg(struct device *);