#ifndef _ROUTER_VAR_H
#define _ROUTER_VAR_H
struct router_softc;
struct router_command;
struct router_topo;
typedef void (*router_callback_t)(struct router_softc *,
struct router_command *, void *);
struct router_command {
TAILQ_ENTRY(router_command) link;
struct router_softc *sc;
struct nhi_cmd_frame *nhicmd;
u_int flags;
#define RCMD_POLLED (1 << 0)
#define RCMD_POLL_COMPLETE (1 << 1)
int resp_len;
router_callback_t callback;
void *callback_arg;
u_int dwlen;
u_int timeout;
int retries;
u_int ev;
uint8_t resp_buffer[NHI_RING0_FRAME_SIZE];
};
struct router_softc {
TAILQ_ENTRY(router_softc) link;
u_int debug;
tb_route_t route;
device_t dev;
struct nhi_softc *nsc;
struct mtx mtx;
struct nhi_ring_pair *ring0;
TAILQ_HEAD(,router_command) cmd_queue;
struct router_command *inflight_cmd;
uint8_t depth;
uint8_t max_adap;
struct router_softc **adapters;
uint32_t uuid[4];
};
struct router_cfg_cap {
uint16_t current_cap;
uint16_t next_cap;
uint32_t space;
uint8_t adap;
uint8_t cap_id;
uint8_t vsc_id;
uint8_t vsc_len;
uint16_t vsec_len;
};
int tb_router_attach(struct router_softc *, tb_route_t);
int tb_router_attach_root(struct nhi_softc *, tb_route_t);
int tb_router_detach(struct router_softc *);
int tb_config_read(struct router_softc *, u_int, u_int, u_int, u_int,
uint32_t *);
int tb_config_read_polled(struct router_softc *, u_int, u_int, u_int, u_int,
uint32_t *);
int tb_config_read_async(struct router_softc *, u_int, u_int, u_int, u_int,
uint32_t *, void *);
int tb_config_write(struct router_softc *, u_int, u_int, u_int, u_int,
uint32_t *);
int tb_config_next_cap(struct router_softc *, struct router_cfg_cap *);
int tb_config_find_cap(struct router_softc *, struct router_cfg_cap *);
int tb_config_find_router_cap(struct router_softc *, u_int, u_int, u_int *);
int tb_config_find_router_vsc(struct router_softc *, u_int, u_int *);
int tb_config_find_router_vsec(struct router_softc *, u_int, u_int *);
int tb_config_find_adapter_cap(struct router_softc *, u_int, u_int, u_int *);
int tb_config_get_lc_uuid(struct router_softc *, uint8_t *);
#define TB_CONFIG_ADDR(seq, space, adapter, dwlen, offset) \
((seq << TB_CFG_SEQ_SHIFT) | space | \
(adapter << TB_CFG_ADAPTER_SHIFT) | (dwlen << TB_CFG_SIZE_SHIFT) | \
(offset & TB_CFG_ADDR_MASK))
#define TB_ROUTE(router) \
((uint64_t)(router)->route.hi << 32) | (router)->route.lo
static __inline void *
router_get_frame_data(struct router_command *cmd)
{
return ((void *)cmd->nhicmd->data);
}
static __inline int
tb_config_router_read(struct router_softc *sc, u_int addr, u_int dwlen,
uint32_t *buf)
{
return (tb_config_read(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
}
static __inline int
tb_config_router_read_polled(struct router_softc *sc, u_int addr, u_int dwlen,
uint32_t *buf)
{
return (tb_config_read_polled(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
}
static __inline int
tb_config_router_write(struct router_softc *sc, u_int addr, u_int dwlen,
uint32_t *buf)
{
return (tb_config_write(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
}
static __inline int
tb_config_adapter_read(struct router_softc *sc, u_int adap, u_int addr,
u_int dwlen, uint32_t *buf)
{
return (tb_config_read(sc, TB_CFG_CS_ADAPTER, adap, addr, dwlen, buf));
}
static __inline int
tb_config_adapter_write(struct router_softc *sc, u_int adap, u_int addr,
u_int dwlen, uint32_t *buf)
{
return (tb_config_write(sc, TB_CFG_CS_ADAPTER, adap, addr, dwlen, buf));
}
static __inline int
tb_config_path_read(struct router_softc *sc, u_int adap, u_int hopid,
u_int num, uint32_t *buf)
{
return (tb_config_read(sc, TB_CFG_CS_PATH, adap, hopid * 2,
num * 2, buf));
}
static __inline int
tb_config_path_write(struct router_softc *sc, u_int adap, u_int hopid,
u_int num, uint32_t *buf)
{
return (tb_config_write(sc, TB_CFG_CS_PATH, adap, hopid * 2,
num * 2, buf));
}
static __inline int
tb_config_counters_read(struct router_softc *sc, u_int adap, u_int set,
u_int num, uint32_t *buf)
{
return (tb_config_read(sc, TB_CFG_CS_COUNTERS, adap, set * 3,
num * 3, buf));
}
static __inline void
tb_config_set_root(struct router_softc *sc)
{
sc->nsc->root_rsc = sc;
}
static __inline void *
tb_config_get_root(struct router_softc *sc)
{
return (sc->nsc->root_rsc);
}
#endif