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