#ifndef _SYS_GLD_H
#define _SYS_GLD_H
#include <sys/ethernet.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef union media_stats {
struct dot3stat {
uint32_t first_coll;
uint32_t multi_coll;
uint32_t sqe_error;
uint32_t mac_xmt_error;
uint32_t frame_too_long;
uint32_t mac_rcv_error;
} dot3;
struct dot5stat {
uint32_t ace_error;
uint32_t internal_error;
uint32_t lost_frame_error;
uint32_t frame_copied_error;
uint32_t token_error;
uint32_t freq_error;
} dot5;
struct fddistat {
uint32_t mac_error;
uint32_t mac_lost;
uint32_t mac_token;
uint32_t mac_tvx_expired;
uint32_t mac_late;
uint32_t mac_ring_op;
} fddi;
uint32_t pad[16];
} media_stats_t;
#define glds_dot3_first_coll glds_media_specific.dot3.first_coll
#define glds_dot3_multi_coll glds_media_specific.dot3.multi_coll
#define glds_dot3_sqe_error glds_media_specific.dot3.sqe_error
#define glds_dot3_mac_xmt_error glds_media_specific.dot3.mac_xmt_error
#define glds_dot3_mac_rcv_error glds_media_specific.dot3.mac_rcv_error
#define glds_dot3_frame_too_long glds_media_specific.dot3.frame_too_long
#define glds_dot5_line_error glds_crc
#define glds_dot5_burst_error glds_frame
#define glds_dot5_ace_error glds_media_specific.dot5.ace_error
#define glds_dot5_internal_error glds_media_specific.dot5.internal_error
#define glds_dot5_lost_frame_error glds_media_specific.dot5.lost_frame_error
#define glds_dot5_frame_copied_error glds_media_specific.dot5.frame_copied_error
#define glds_dot5_token_error glds_media_specific.dot5.token_error
#define glds_dot5_signal_loss glds_nocarrier
#define glds_dot5_freq_error glds_media_specific.dot5.freq_error
#define glds_fddi_mac_error glds_media_specific.fddi.mac_error
#define glds_fddi_mac_lost glds_media_specific.fddi.mac_lost
#define glds_fddi_mac_token glds_media_specific.fddi.mac_token
#define glds_fddi_mac_tvx_expired glds_media_specific.fddi.mac_tvx_expired
#define glds_fddi_mac_late glds_media_specific.fddi.mac_late
#define glds_fddi_mac_ring_op glds_media_specific.fddi.mac_ring_op
struct gld_stats {
ulong_t glds_multixmt;
ulong_t glds_multircv;
ulong_t glds_brdcstxmt;
ulong_t glds_brdcstrcv;
uint32_t glds_blocked;
uint32_t glds_reserved1;
uint32_t glds_reserved2;
uint32_t glds_reserved3;
uint32_t glds_reserved4;
uint32_t glds_errxmt;
uint32_t glds_errrcv;
uint32_t glds_collisions;
uint32_t glds_excoll;
uint32_t glds_defer;
uint32_t glds_frame;
uint32_t glds_crc;
uint32_t glds_overflow;
uint32_t glds_underflow;
uint32_t glds_short;
uint32_t glds_missed;
uint32_t glds_xmtlatecoll;
uint32_t glds_nocarrier;
uint32_t glds_noxmtbuf;
uint32_t glds_norcvbuf;
uint32_t glds_intr;
uint32_t glds_xmtretry;
uint64_t glds_pktxmt64;
uint64_t glds_pktrcv64;
uint64_t glds_bytexmt64;
uint64_t glds_bytercv64;
uint64_t glds_speed;
uint32_t glds_duplex;
uint32_t glds_media;
uint32_t glds_unknowns;
uint32_t reserved[19];
media_stats_t glds_media_specific;
uint32_t glds_xmtbadinterp;
uint32_t glds_rcvbadinterp;
uint32_t glds_gldnorcvbuf;
};
#define GLD_STATS_SIZE_ORIG (sizeof (uint32_t) * 26)
#define GLD_KSTAT_SIZE_ORIG (sizeof (kstat_named_t) * 26)
#define GLD_PAD ((int)GLD_KSTAT_SIZE_ORIG + (int)GLD_STATS_SIZE_ORIG)
typedef union gld_lock {
kmutex_t reserved;
krwlock_t gldl_rw_lock;
} gld_lock_t;
typedef struct gld_mac_info {
struct gld_mac_info *gldm_next;
struct gld_mac_info *gldm_prev;
caddr_t reserved1;
caddr_t reserved2;
uint16_t gldm_driver_version;
uint16_t gldm_GLD_version;
uint16_t gldm_GLD_flags;
uint16_t gldm_options;
dev_info_t *gldm_devinfo;
uchar_t *gldm_vendor_addr;
uchar_t *gldm_broadcast_addr;
gld_lock_t gldm_lock;
ddi_iblock_cookie_t gldm_cookie;
uint32_t gldm_margin;
uint32_t reserved4;
uint32_t gldm_maxpkt;
uint32_t gldm_minpkt;
char *gldm_ident;
uint32_t gldm_type;
uint32_t reserved5;
uint32_t gldm_addrlen;
int32_t gldm_saplen;
unsigned char reserved7[ETHERADDRL];
unsigned char reserved8[ETHERADDRL];
unsigned char reserved9[ETHERADDRL];
t_uscalar_t gldm_ppa;
int32_t reserved10;
uint32_t gldm_capabilities;
int32_t gldm_linkstate;
uint32_t reserved11;
caddr_t reserved12;
int32_t reserved13;
uint32_t reserved14;
int32_t reserved15;
caddr_t gldm_mac_pvt;
caddr_t reserved16;
char reserved17[GLD_PAD];
caddr_t reserved18;
caddr_t gldm_private;
int (*gldm_reset)();
int (*gldm_start)();
int (*gldm_stop)();
int (*gldm_set_mac_addr)();
int (*gldm_send)();
int (*gldm_set_promiscuous)();
int (*gldm_get_stats)();
int (*gldm_ioctl)();
int (*gldm_set_multicast)();
uint_t (*gldm_intr)();
int (*gldm_mctl)();
int (*gldm_send_tagged)();
} gld_mac_info_t;
#define GLD_MAC_PROMISC_NOOP -1
#define GLD_MAC_PROMISC_NONE 0
#define GLD_MAC_PROMISC_PHYS 1
#define GLD_MAC_PROMISC_MULTI 2
#define GLD_MULTI_ENABLE 1
#define GLD_MULTI_DISABLE 0
#define GLD_CAP_LINKSTATE 0x00000001
#define GLD_CAP_CKSUM_IPHDR 0x00000008
#define GLD_CAP_CKSUM_PARTIAL 0x00000010
#define GLD_CAP_CKSUM_FULL_V4 0x00000020
#define GLD_CAP_ZEROCOPY 0x00000040
#define GLD_CAP_CKSUM_FULL_V6 0x00000080
#define GLD_CAP_CKSUM_ANY \
(GLD_CAP_CKSUM_IPHDR|GLD_CAP_CKSUM_PARTIAL| \
GLD_CAP_CKSUM_FULL_V4|GLD_CAP_CKSUM_FULL_V6)
#define GLD_LINKSTATE_DOWN -1
#define GLD_LINKSTATE_UNKNOWN 0
#define GLD_LINKSTATE_UP 1
#define GLDM_UNKNOWN 0
#define GLDM_AUI 1
#define GLDM_BNC 2
#define GLDM_TP 3
#define GLDM_FIBER 4
#define GLDM_100BT 5
#define GLDM_VGANYLAN 6
#define GLDM_10BT 7
#define GLDM_RING4 8
#define GLDM_RING16 9
#define GLDM_PHYMII 10
#define GLDM_100BTX 11
#define GLDM_100BT4 12
#define GLDM_IB 14
#define GLD_DUPLEX_UNKNOWN 0
#define GLD_DUPLEX_HALF 1
#define GLD_DUPLEX_FULL 2
#define GLD_SUCCESS 0
#define GLD_NORESOURCES 1
#define GLD_NOTSUPPORTED 2
#define GLD_BADARG 3
#define GLD_NOLINK 4
#define GLD_RETRY 5
#define GLD_FAILURE (-1)
#if defined(_KERNEL)
extern gld_mac_info_t *gld_mac_alloc(dev_info_t *);
extern void gld_mac_free(gld_mac_info_t *);
extern int gld_register(dev_info_t *, char *, gld_mac_info_t *);
extern int gld_unregister(gld_mac_info_t *);
extern void gld_recv(gld_mac_info_t *, mblk_t *);
extern void gld_recv_tagged(gld_mac_info_t *, mblk_t *, uint32_t);
extern void gld_linkstate(gld_mac_info_t *, int32_t);
extern void gld_sched(gld_mac_info_t *);
extern uint_t gld_intr();
extern int gld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
extern int gld_open(queue_t *, dev_t *, int, int, cred_t *);
extern int gld_close(queue_t *, int, cred_t *);
extern int gld_wput(queue_t *, mblk_t *);
extern int gld_wsrv(queue_t *);
extern int gld_rsrv(queue_t *);
#endif
#define VTAG_SIZE 4
#define VLAN_TPID_MASK 0xffff0000u
#define VLAN_TPID_SHIFT 16
#define VLAN_TCI_MASK 0x0000ffffu
#define VLAN_TCI_SHIFT 0
#define VLAN_PRI_MASK 0x0000e000u
#define VLAN_PRI_SHIFT 13
#define VLAN_CFI_MASK 0x00001000u
#define VLAN_CFI_SHIFT 12
#define VLAN_VID_MASK 0x00000fffu
#define VLAN_VID_SHIFT 0
#define VLAN_TPID 0x8100u
#define VLAN_CFI_ETHER 0
#define VLAN_PRI_DFLT 0
#define VLAN_PRI_MAX 7
#define VLAN_VID_NONE 0
#define VLAN_VID_MIN 1
#define VLAN_VID_MAX 4094
#define VLAN_VTAG_NONE 0
#define GLD_MAKE_TCI(pri, cfi, vid) (((pri) << VLAN_PRI_SHIFT) | \
((cfi) << VLAN_CFI_SHIFT) | \
((vid) << VLAN_VID_SHIFT))
#define GLD_MAKE_VTAG(pri, cfi, vid) \
(((uint32_t)ETHERTYPE_VLAN << VLAN_TPID_SHIFT) | \
((pri) << VLAN_PRI_SHIFT) | \
((cfi) << VLAN_CFI_SHIFT) | \
((vid) << VLAN_VID_SHIFT))
#define GLD_TCI2VTAG(tci) \
(((uint32_t)ETHERTYPE_VLAN << VLAN_TPID_SHIFT) | (tci))
#define GLD_MK_PTCI(cfi, vid) GLD_MAKE_TCI(VLAN_PRI_MAX, cfi, vid)
#define GLD_MK_PTAG(cfi, vid) GLD_MAKE_VTAG(VLAN_PRI_MAX, cfi, vid)
#define GLD_MK_PMSK(pri) (((pri) << VLAN_PRI_SHIFT) | ~VLAN_PRI_MASK)
#define GLD_MK_VTAG(ptag, pri) ((ptag) & GLD_MK_PMSK(pri))
#define GLD_VTAG_TPID(vtag) (((vtag) & VLAN_TPID_MASK) >> VLAN_TPID_SHIFT)
#define GLD_VTAG_TCI(vtag) (((vtag) & VLAN_TCI_MASK) >> VLAN_TCI_SHIFT)
#define GLD_VTAG_PRI(vtag) (((vtag) & VLAN_PRI_MASK) >> VLAN_PRI_SHIFT)
#define GLD_VTAG_CFI(vtag) (((vtag) & VLAN_CFI_MASK) >> VLAN_CFI_SHIFT)
#define GLD_VTAG_VID(vtag) (((vtag) & VLAN_VID_MASK) >> VLAN_VID_SHIFT)
#ifdef __cplusplus
}
#endif
#endif