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