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 { 17*c8645751SAdrian Chadd uint32_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) 5115bd1a86SAdrian 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 */ 5615bd1a86SAdrian 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) 674e4cedb0SLuiz Otavio O Souza #define ETHERSWITCH_PORT_DROPTAGGED (1 << 7) 68a48a9355SAdrian Chadd #define ETHERSWITCH_PORT_FLAGS_BITS \ 694e4cedb0SLuiz Otavio O Souza "\020\1CPUPORT\2STRIPTAG\3ADDTAG\4FIRSTLOCK\5DROPUNTAGGED\6QinQ\7INGRESS" \ 704e4cedb0SLuiz Otavio O Souza "\10DROPTAGGED" 71a48a9355SAdrian Chadd 72c94dc808SAdrian Chadd #define ETHERSWITCH_PORT_MAX_LEDS 3 73c94dc808SAdrian Chadd 74c94dc808SAdrian Chadd enum etherswitch_port_led { 75c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_DEFAULT, 76c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_ON, 77c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_OFF, 78c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_BLINK, 79c94dc808SAdrian Chadd ETHERSWITCH_PORT_LED_MAX 80c94dc808SAdrian Chadd }; 81c94dc808SAdrian Chadd typedef enum etherswitch_port_led etherswitch_port_led_t; 82c94dc808SAdrian Chadd 83a043e8c7SAdrian Chadd struct etherswitch_port { 84a043e8c7SAdrian Chadd int es_port; 85a3219359SAdrian Chadd int es_pvid; 86c94dc808SAdrian Chadd int es_nleds; 87a48a9355SAdrian Chadd uint32_t es_flags; 88c94dc808SAdrian Chadd etherswitch_port_led_t es_led[ETHERSWITCH_PORT_MAX_LEDS]; 89a043e8c7SAdrian Chadd union { 90a043e8c7SAdrian Chadd struct ifreq es_uifr; 91a043e8c7SAdrian Chadd struct ifmediareq es_uifmr; 92a043e8c7SAdrian Chadd } es_ifu; 93a043e8c7SAdrian Chadd #define es_ifr es_ifu.es_uifr 94a043e8c7SAdrian Chadd #define es_ifmr es_ifu.es_uifmr 95a043e8c7SAdrian Chadd }; 96a043e8c7SAdrian Chadd typedef struct etherswitch_port etherswitch_port_t; 97a043e8c7SAdrian Chadd 98a043e8c7SAdrian Chadd struct etherswitch_vlangroup { 99a043e8c7SAdrian Chadd int es_vlangroup; 100a043e8c7SAdrian Chadd int es_vid; 101a043e8c7SAdrian Chadd int es_member_ports; 102a043e8c7SAdrian Chadd int es_untagged_ports; 103a043e8c7SAdrian Chadd int es_fid; 104a043e8c7SAdrian Chadd }; 105a043e8c7SAdrian Chadd typedef struct etherswitch_vlangroup etherswitch_vlangroup_t; 106a043e8c7SAdrian Chadd 107a043e8c7SAdrian Chadd #define ETHERSWITCH_PORTMASK(_port) (1 << (_port)) 108a043e8c7SAdrian Chadd 109877d73ecSAdrian Chadd struct etherswitch_portid { 110877d73ecSAdrian Chadd int es_port; 111877d73ecSAdrian Chadd }; 112877d73ecSAdrian Chadd typedef struct etherswitch_portid etherswitch_portid_t; 113877d73ecSAdrian Chadd 114877d73ecSAdrian Chadd struct etherswitch_atu_entry { 115877d73ecSAdrian Chadd int id; 116877d73ecSAdrian Chadd int es_portmask; 117877d73ecSAdrian Chadd uint8_t es_macaddr[ETHER_ADDR_LEN]; 118877d73ecSAdrian Chadd }; 119877d73ecSAdrian Chadd typedef struct etherswitch_atu_entry etherswitch_atu_entry_t; 120877d73ecSAdrian Chadd 121877d73ecSAdrian Chadd struct etherswitch_atu_table { 122877d73ecSAdrian Chadd uint32_t es_nitems; 123877d73ecSAdrian Chadd }; 124877d73ecSAdrian Chadd typedef struct etherswitch_atu_table etherswitch_atu_table_t; 125877d73ecSAdrian Chadd 126877d73ecSAdrian Chadd struct etherswitch_atu_flush_macentry { 127877d73ecSAdrian Chadd uint8_t es_macaddr[ETHER_ADDR_LEN]; 128877d73ecSAdrian Chadd }; 129877d73ecSAdrian Chadd typedef struct etherswitch_atu_flush_macentry etherswitch_atu_flush_macentry_t; 130877d73ecSAdrian Chadd 131a043e8c7SAdrian Chadd #define IOETHERSWITCHGETINFO _IOR('i', 1, etherswitch_info_t) 132a043e8c7SAdrian Chadd #define IOETHERSWITCHGETREG _IOWR('i', 2, etherswitch_reg_t) 133a043e8c7SAdrian Chadd #define IOETHERSWITCHSETREG _IOW('i', 3, etherswitch_reg_t) 134a043e8c7SAdrian Chadd #define IOETHERSWITCHGETPORT _IOWR('i', 4, etherswitch_port_t) 135a043e8c7SAdrian Chadd #define IOETHERSWITCHSETPORT _IOW('i', 5, etherswitch_port_t) 136a043e8c7SAdrian Chadd #define IOETHERSWITCHGETVLANGROUP _IOWR('i', 6, etherswitch_vlangroup_t) 137a043e8c7SAdrian Chadd #define IOETHERSWITCHSETVLANGROUP _IOW('i', 7, etherswitch_vlangroup_t) 138a043e8c7SAdrian Chadd #define IOETHERSWITCHGETPHYREG _IOWR('i', 8, etherswitch_phyreg_t) 139a043e8c7SAdrian Chadd #define IOETHERSWITCHSETPHYREG _IOW('i', 9, etherswitch_phyreg_t) 140a48a9355SAdrian Chadd #define IOETHERSWITCHGETCONF _IOR('i', 10, etherswitch_conf_t) 141a48a9355SAdrian Chadd #define IOETHERSWITCHSETCONF _IOW('i', 11, etherswitch_conf_t) 142877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHALL _IOW('i', 12, etherswitch_portid_t) /* Dummy */ 143877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHPORT _IOW('i', 13, etherswitch_portid_t) 144877d73ecSAdrian Chadd #define IOETHERSWITCHFLUSHMAC _IOW('i', 14, etherswitch_atu_flush_macentry_t) 145877d73ecSAdrian Chadd #define IOETHERSWITCHGETTABLE _IOWR('i', 15, etherswitch_atu_table_t) 146877d73ecSAdrian Chadd #define IOETHERSWITCHGETTABLEENTRY _IOWR('i', 16, etherswitch_atu_entry_t) 147a043e8c7SAdrian Chadd 148a043e8c7SAdrian Chadd #endif 149