1235288Sadrian/* 2235288Sadrian * $FreeBSD$ 3235288Sadrian */ 4235288Sadrian 5235288Sadrian#ifndef __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H 6235288Sadrian#define __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H 7235288Sadrian 8235288Sadrian#include <sys/ioccom.h> 9235288Sadrian 10235288Sadrian#ifdef _KERNEL 11235288Sadrianextern devclass_t etherswitch_devclass; 12235288Sadrianextern driver_t etherswitch_driver; 13235288Sadrian#endif /* _KERNEL */ 14235288Sadrian 15235288Sadrianstruct etherswitch_reg { 16235288Sadrian uint16_t reg; 17235288Sadrian uint16_t val; 18235288Sadrian}; 19235288Sadriantypedef struct etherswitch_reg etherswitch_reg_t; 20235288Sadrian 21235288Sadrianstruct etherswitch_phyreg { 22235288Sadrian uint16_t phy; 23235288Sadrian uint16_t reg; 24235288Sadrian uint16_t val; 25235288Sadrian}; 26235288Sadriantypedef struct etherswitch_phyreg etherswitch_phyreg_t; 27235288Sadrian 28250381Sadrian#define ETHERSWITCH_NAMEMAX 64 29253569Sloos#define ETHERSWITCH_VID_MASK 0xfff 30253569Sloos#define ETHERSWITCH_VID_VALID (1 << 12) 31250381Sadrian#define ETHERSWITCH_VLAN_ISL (1 << 0) /* ISL */ 32250381Sadrian#define ETHERSWITCH_VLAN_PORT (1 << 1) /* Port based vlan */ 33250381Sadrian#define ETHERSWITCH_VLAN_DOT1Q (1 << 2) /* 802.1q */ 34250381Sadrian#define ETHERSWITCH_VLAN_DOT1Q_4K (1 << 3) /* 4k support on 802.1q */ 35250381Sadrian#define ETHERSWITCH_VLAN_DOUBLE_TAG (1 << 4) /* Q-in-Q */ 36250381Sadrian#define ETHERSWITCH_VLAN_CAPS_BITS \ 37250381Sadrian"\020\1ISL\2PORT\3DOT1Q\4DOT1Q4K\5QinQ" 38235288Sadrian 39235288Sadrianstruct etherswitch_info { 40235288Sadrian int es_nports; 41235288Sadrian int es_nvlangroups; 42235288Sadrian char es_name[ETHERSWITCH_NAMEMAX]; 43250381Sadrian uint32_t es_vlan_caps; 44235288Sadrian}; 45235288Sadriantypedef struct etherswitch_info etherswitch_info_t; 46235288Sadrian 47250381Sadrian#define ETHERSWITCH_CONF_FLAGS (1 << 0) 48250381Sadrian#define ETHERSWITCH_CONF_MIRROR (1 << 1) 49250381Sadrian#define ETHERSWITCH_CONF_VLAN_MODE (1 << 2) 50250381Sadrian 51250381Sadrianstruct etherswitch_conf { 52250381Sadrian uint32_t cmd; /* What to configure */ 53250381Sadrian uint32_t vlan_mode; /* Switch VLAN mode */ 54250381Sadrian}; 55250381Sadriantypedef struct etherswitch_conf etherswitch_conf_t; 56250381Sadrian 57250381Sadrian#define ETHERSWITCH_PORT_CPU (1 << 0) 58250381Sadrian#define ETHERSWITCH_PORT_STRIPTAG (1 << 1) 59250381Sadrian#define ETHERSWITCH_PORT_ADDTAG (1 << 2) 60250381Sadrian#define ETHERSWITCH_PORT_FIRSTLOCK (1 << 3) 61250381Sadrian#define ETHERSWITCH_PORT_DROPUNTAGGED (1 << 4) 62250381Sadrian#define ETHERSWITCH_PORT_DOUBLE_TAG (1 << 5) 63250381Sadrian#define ETHERSWITCH_PORT_INGRESS (1 << 6) 64250381Sadrian#define ETHERSWITCH_PORT_FLAGS_BITS \ 65250381Sadrian"\020\1CPUPORT\2STRIPTAG\3ADDTAG\4FIRSTLOCK\5DROPUNTAGGED\6QinQ\7INGRESS" 66250381Sadrian 67235288Sadrianstruct etherswitch_port { 68235288Sadrian int es_port; 69249752Sadrian int es_pvid; 70250381Sadrian uint32_t es_flags; 71235288Sadrian union { 72235288Sadrian struct ifreq es_uifr; 73235288Sadrian struct ifmediareq es_uifmr; 74235288Sadrian } es_ifu; 75235288Sadrian#define es_ifr es_ifu.es_uifr 76235288Sadrian#define es_ifmr es_ifu.es_uifmr 77235288Sadrian}; 78235288Sadriantypedef struct etherswitch_port etherswitch_port_t; 79235288Sadrian 80235288Sadrianstruct etherswitch_vlangroup { 81235288Sadrian int es_vlangroup; 82235288Sadrian int es_vid; 83235288Sadrian int es_member_ports; 84235288Sadrian int es_untagged_ports; 85235288Sadrian int es_fid; 86235288Sadrian}; 87235288Sadriantypedef struct etherswitch_vlangroup etherswitch_vlangroup_t; 88235288Sadrian 89235288Sadrian#define ETHERSWITCH_PORTMASK(_port) (1 << (_port)) 90235288Sadrian 91235288Sadrian#define IOETHERSWITCHGETINFO _IOR('i', 1, etherswitch_info_t) 92235288Sadrian#define IOETHERSWITCHGETREG _IOWR('i', 2, etherswitch_reg_t) 93235288Sadrian#define IOETHERSWITCHSETREG _IOW('i', 3, etherswitch_reg_t) 94235288Sadrian#define IOETHERSWITCHGETPORT _IOWR('i', 4, etherswitch_port_t) 95235288Sadrian#define IOETHERSWITCHSETPORT _IOW('i', 5, etherswitch_port_t) 96235288Sadrian#define IOETHERSWITCHGETVLANGROUP _IOWR('i', 6, etherswitch_vlangroup_t) 97235288Sadrian#define IOETHERSWITCHSETVLANGROUP _IOW('i', 7, etherswitch_vlangroup_t) 98235288Sadrian#define IOETHERSWITCHGETPHYREG _IOWR('i', 8, etherswitch_phyreg_t) 99235288Sadrian#define IOETHERSWITCHSETPHYREG _IOW('i', 9, etherswitch_phyreg_t) 100250381Sadrian#define IOETHERSWITCHGETCONF _IOR('i', 10, etherswitch_conf_t) 101250381Sadrian#define IOETHERSWITCHSETCONF _IOW('i', 11, etherswitch_conf_t) 102235288Sadrian 103235288Sadrian#endif 104