1a043e8c7SAdrian Chadd /* 2a043e8c7SAdrian Chadd * $FreeBSD$ 3a043e8c7SAdrian Chadd */ 4a043e8c7SAdrian Chadd 5a043e8c7SAdrian Chadd #ifndef __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H 6a043e8c7SAdrian Chadd #define __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H 7a043e8c7SAdrian Chadd 8a043e8c7SAdrian Chadd #include <sys/ioccom.h> 9877d73ecSAdrian Chadd #include <net/ethernet.h> 10a043e8c7SAdrian Chadd 11a043e8c7SAdrian Chadd #ifdef _KERNEL 12a043e8c7SAdrian Chadd extern devclass_t etherswitch_devclass; 13a043e8c7SAdrian Chadd extern driver_t etherswitch_driver; 14a043e8c7SAdrian Chadd #endif /* _KERNEL */ 15a043e8c7SAdrian Chadd 16a043e8c7SAdrian Chadd struct etherswitch_reg { 17a043e8c7SAdrian Chadd uint16_t reg; 18c94dc808SAdrian Chadd uint32_t val; 19a043e8c7SAdrian Chadd }; 20a043e8c7SAdrian Chadd typedef struct etherswitch_reg etherswitch_reg_t; 21a043e8c7SAdrian Chadd 22a043e8c7SAdrian Chadd struct etherswitch_phyreg { 23a043e8c7SAdrian Chadd uint16_t phy; 24a043e8c7SAdrian Chadd uint16_t reg; 25a043e8c7SAdrian Chadd uint16_t val; 26a043e8c7SAdrian Chadd }; 27a043e8c7SAdrian Chadd typedef struct etherswitch_phyreg etherswitch_phyreg_t; 28a043e8c7SAdrian Chadd 29a043e8c7SAdrian Chadd #define ETHERSWITCH_NAMEMAX 64 30cc320e37SLuiz Otavio O Souza #define ETHERSWITCH_VID_MASK 0xfff 31cc320e37SLuiz Otavio O Souza #define ETHERSWITCH_VID_VALID (1 << 12) 32a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_ISL (1 << 0) /* ISL */ 33a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_PORT (1 << 1) /* Port based vlan */ 34a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_DOT1Q (1 << 2) /* 802.1q */ 35a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_DOT1Q_4K (1 << 3) /* 4k support on 802.1q */ 36a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_DOUBLE_TAG (1 << 4) /* Q-in-Q */ 37a48a9355SAdrian Chadd #define ETHERSWITCH_VLAN_CAPS_BITS \ 38a48a9355SAdrian Chadd "\020\1ISL\2PORT\3DOT1Q\4DOT1Q4K\5QinQ" 39a043e8c7SAdrian Chadd 40a043e8c7SAdrian Chadd struct etherswitch_info { 41a043e8c7SAdrian Chadd int es_nports; 42a043e8c7SAdrian Chadd int es_nvlangroups; 43a043e8c7SAdrian Chadd char es_name[ETHERSWITCH_NAMEMAX]; 44a48a9355SAdrian Chadd uint32_t es_vlan_caps; 45a043e8c7SAdrian Chadd }; 46a043e8c7SAdrian Chadd typedef struct etherswitch_info etherswitch_info_t; 47a043e8c7SAdrian Chadd 48a48a9355SAdrian Chadd #define ETHERSWITCH_CONF_FLAGS (1 << 0) 49a48a9355SAdrian Chadd #define ETHERSWITCH_CONF_MIRROR (1 << 1) 50a48a9355SAdrian Chadd #define ETHERSWITCH_CONF_VLAN_MODE (1 << 2) 51*15bd1a86SAdrian Chadd #define ETHERSWITCH_CONF_SWITCH_MACADDR (1 << 3) 52a48a9355SAdrian Chadd 53a48a9355SAdrian Chadd struct etherswitch_conf { 54a48a9355SAdrian Chadd uint32_t cmd; /* What to configure */ 55a48a9355SAdrian Chadd uint32_t vlan_mode; /* Switch VLAN mode */ 56*15bd1a86SAdrian Chadd struct ether_addr switch_macaddr; /* Switch MAC address */ 57a48a9355SAdrian Chadd }; 58a48a9355SAdrian Chadd typedef struct etherswitch_conf etherswitch_conf_t; 59a48a9355SAdrian Chadd 60a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_CPU (1 << 0) 61a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_STRIPTAG (1 << 1) 62a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_ADDTAG (1 << 2) 63a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_FIRSTLOCK (1 << 3) 64a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_DROPUNTAGGED (1 << 4) 65a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_DOUBLE_TAG (1 << 5) 66a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_INGRESS (1 << 6) 67a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_FLAGS_BITS \ 68a48a9355SAdrian Chadd "\020\1CPUPORT\2STRIPTAG\3ADDTAG\4FIRSTLOCK\5DROPUNTAGGED\6QinQ\7INGRESS" 69a48a9355SAdrian Chadd 70c94dc808SAdrian Chadd #define ETHERSWITCH_PORT_MAX_LEDS 3 71c94dc808SAdrian Chadd 72c94dc808SAdrian Chadd enum etherswitch_port_led { 73c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_DEFAULT, 74c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_ON, 75c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_OFF, 76c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_BLINK, 77c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_MAX 78c94dc808SAdrian Chadd }; 79c94dc808SAdrian Chadd typedef enum etherswitch_port_led etherswitch_port_led_t; 80c94dc808SAdrian Chadd 81a043e8c7SAdrian Chadd struct etherswitch_port { 82a043e8c7SAdrian Chadd int es_port; 83a3219359SAdrian Chadd int es_pvid; 84c94dc808SAdrian Chadd int es_nleds; 85a48a9355SAdrian Chadd uint32_t es_flags; 86c94dc808SAdrian Chadd etherswitch_port_led_t es_led[ETHERSWITCH_PORT_MAX_LEDS]; 87a043e8c7SAdrian Chadd union { 88a043e8c7SAdrian Chadd struct ifreq es_uifr; 89a043e8c7SAdrian Chadd struct ifmediareq es_uifmr; 90a043e8c7SAdrian Chadd } es_ifu; 91a043e8c7SAdrian Chadd #define es_ifr es_ifu.es_uifr 92a043e8c7SAdrian Chadd #define es_ifmr es_ifu.es_uifmr 93a043e8c7SAdrian Chadd }; 94a043e8c7SAdrian Chadd typedef struct etherswitch_port etherswitch_port_t; 95a043e8c7SAdrian Chadd 96a043e8c7SAdrian Chadd struct etherswitch_vlangroup { 97a043e8c7SAdrian Chadd int es_vlangroup; 98a043e8c7SAdrian Chadd int es_vid; 99a043e8c7SAdrian Chadd int es_member_ports; 100a043e8c7SAdrian Chadd int es_untagged_ports; 101a043e8c7SAdrian Chadd int es_fid; 102a043e8c7SAdrian Chadd }; 103a043e8c7SAdrian Chadd typedef struct etherswitch_vlangroup etherswitch_vlangroup_t; 104a043e8c7SAdrian Chadd 105a043e8c7SAdrian Chadd #define ETHERSWITCH_PORTMASK(_port) (1 << (_port)) 106a043e8c7SAdrian Chadd 107877d73ecSAdrian Chadd struct etherswitch_portid { 108877d73ecSAdrian Chadd int es_port; 109877d73ecSAdrian Chadd }; 110877d73ecSAdrian Chadd typedef struct etherswitch_portid etherswitch_portid_t; 111877d73ecSAdrian Chadd 112877d73ecSAdrian Chadd struct etherswitch_atu_entry { 113877d73ecSAdrian Chadd int id; 114877d73ecSAdrian Chadd int es_portmask; 115877d73ecSAdrian Chadd uint8_t es_macaddr[ETHER_ADDR_LEN]; 116877d73ecSAdrian Chadd }; 117877d73ecSAdrian Chadd typedef struct etherswitch_atu_entry etherswitch_atu_entry_t; 118877d73ecSAdrian Chadd 119877d73ecSAdrian Chadd struct etherswitch_atu_table { 120877d73ecSAdrian Chadd uint32_t es_nitems; 121877d73ecSAdrian Chadd }; 122877d73ecSAdrian Chadd typedef struct etherswitch_atu_table etherswitch_atu_table_t; 123877d73ecSAdrian Chadd 124877d73ecSAdrian Chadd struct etherswitch_atu_flush_macentry { 125877d73ecSAdrian Chadd uint8_t es_macaddr[ETHER_ADDR_LEN]; 126877d73ecSAdrian Chadd }; 127877d73ecSAdrian Chadd typedef struct etherswitch_atu_flush_macentry etherswitch_atu_flush_macentry_t; 128877d73ecSAdrian Chadd 129a043e8c7SAdrian Chadd #define IOETHERSWITCHGETINFO _IOR('i', 1, etherswitch_info_t) 130a043e8c7SAdrian Chadd #define IOETHERSWITCHGETREG _IOWR('i', 2, etherswitch_reg_t) 131a043e8c7SAdrian Chadd #define IOETHERSWITCHSETREG _IOW('i', 3, etherswitch_reg_t) 132a043e8c7SAdrian Chadd #define IOETHERSWITCHGETPORT _IOWR('i', 4, etherswitch_port_t) 133a043e8c7SAdrian Chadd #define IOETHERSWITCHSETPORT _IOW('i', 5, etherswitch_port_t) 134a043e8c7SAdrian Chadd #define IOETHERSWITCHGETVLANGROUP _IOWR('i', 6, etherswitch_vlangroup_t) 135a043e8c7SAdrian Chadd #define IOETHERSWITCHSETVLANGROUP _IOW('i', 7, etherswitch_vlangroup_t) 136a043e8c7SAdrian Chadd #define IOETHERSWITCHGETPHYREG _IOWR('i', 8, etherswitch_phyreg_t) 137a043e8c7SAdrian Chadd #define IOETHERSWITCHSETPHYREG _IOW('i', 9, etherswitch_phyreg_t) 138a48a9355SAdrian Chadd #define IOETHERSWITCHGETCONF _IOR('i', 10, etherswitch_conf_t) 139a48a9355SAdrian Chadd #define IOETHERSWITCHSETCONF _IOW('i', 11, etherswitch_conf_t) 140877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHALL _IOW('i', 12, etherswitch_portid_t) /* Dummy */ 141877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHPORT _IOW('i', 13, etherswitch_portid_t) 142877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHMAC _IOW('i', 14, etherswitch_atu_flush_macentry_t) 143877d73ecSAdrian Chadd #define IOETHERSWITCHGETTABLE _IOWR('i', 15, etherswitch_atu_table_t) 144877d73ecSAdrian Chadd #define IOETHERSWITCHGETTABLEENTRY _IOWR('i', 16, etherswitch_atu_entry_t) 145a043e8c7SAdrian Chadd 146a043e8c7SAdrian Chadd #endif 147