#ifndef _ENETC_H_
#define _ENETC_H_
#include <sys/param.h>
#include <dev/enetc/enetc_hw.h>
struct enetc_softc;
struct enetc_rx_queue {
struct enetc_softc *sc;
uint16_t qid;
union enetc_rx_bd *ring;
uint64_t ring_paddr;
struct if_irq irq;
bool enabled;
};
struct enetc_tx_queue {
struct enetc_softc *sc;
union enetc_tx_bd *ring;
uint64_t ring_paddr;
qidx_t cidx;
struct if_irq irq;
};
struct enetc_ctrl_queue {
qidx_t pidx;
struct iflib_dma_info dma;
struct enetc_cbd *ring;
struct if_irq irq;
};
struct enetc_softc {
device_t dev;
struct mtx mii_lock;
if_ctx_t ctx;
if_softc_ctx_t shared;
#define tx_num_queues shared->isc_ntxqsets
#define rx_num_queues shared->isc_nrxqsets
#define tx_queue_size shared->isc_ntxd[0]
#define rx_queue_size shared->isc_nrxd[0]
struct resource *regs;
device_t miibus;
struct enetc_tx_queue *tx_queues;
struct enetc_rx_queue *rx_queues;
struct enetc_ctrl_queue ctrl_queue;
uint32_t rbmr;
#define VLAN_BITMAP_SIZE 64
uint8_t vlan_bitmap[64];
struct if_irq admin_irq;
int phy_addr;
struct ifmedia fixed_ifmedia;
bool fixed_link;
};
#define ENETC_RD4(sc, reg) \
bus_read_4((sc)->regs, reg)
#define ENETC_WR4(sc, reg, value) \
bus_write_4((sc)->regs, reg, value)
#define ENETC_PORT_RD8(sc, reg) \
bus_read_8((sc)->regs, ENETC_PORT_BASE + (reg))
#define ENETC_PORT_RD4(sc, reg) \
bus_read_4((sc)->regs, ENETC_PORT_BASE + (reg))
#define ENETC_PORT_WR4(sc, reg, value) \
bus_write_4((sc)->regs, ENETC_PORT_BASE + (reg), value)
#define ENETC_PORT_RD2(sc, reg) \
bus_read_2((sc)->regs, ENETC_PORT_BASE + (reg))
#define ENETC_PORT_WR2(sc, reg, value) \
bus_write_2((sc)->regs, ENETC_PORT_BASE + (reg), value)
#define ENETC_TXQ_RD4(sc, q, reg) \
ENETC_RD4((sc), ENETC_BDR(TX, q, reg))
#define ENETC_TXQ_WR4(sc, q, reg, value) \
ENETC_WR4((sc), ENETC_BDR(TX, q, reg), value)
#define ENETC_RXQ_RD4(sc, q, reg) \
ENETC_RD4((sc), ENETC_BDR(RX, q, reg))
#define ENETC_RXQ_WR4(sc, q, reg, value) \
ENETC_WR4((sc), ENETC_BDR(RX, q, reg), value)
#define ENETC_MAX_FRAME_LEN 9600
#define ENETC_MAX_QUEUES 4
#define ENETC_MAX_SCATTER 15
#define ENETC_MIN_DESC 64
#define ENETC_MAX_DESC 4096
#define ENETC_DEFAULT_DESC 512
#define ENETC_DESC_ALIGN 64
#define ENETC_RING_ALIGN 128
#define ENETC_MSIX_COUNT 32
#define ENETC_RX_INTR_PKT_THR 16
#define ENETC_RX_INTR_TIME_THR ((100ULL * ENETC_CLK) / 1000000ULL)
#define ENETC_RX_IP_ALIGN 2
#endif