# $FreeBSD$

#include <sys/bus.h>

# Needed for ifreq/ifmediareq
#include <sys/socket.h>
#include <net/if.h>

#include <dev/etherswitch/etherswitch.h>

INTERFACE etherswitch;

#
# Default implementation
#
CODE {
	static void
	null_etherswitch_lock(device_t dev)
	{
	}

	static void
	null_etherswitch_unlock(device_t dev)
	{
	}

	static int
	null_etherswitch_getlaggroup(device_t dev, etherswitch_laggroup_t *conf)
	{
		return (EINVAL);
	}

	static int
	null_etherswitch_setlaggroup(device_t dev, etherswitch_laggroup_t *conf)
	{
		return (EINVAL);
	}

	static int
	null_etherswitch_getconf(device_t dev, etherswitch_conf_t *conf)
	{
		return (0);
	}

	static int
	null_etherswitch_setconf(device_t dev, etherswitch_conf_t *conf)
	{
		return (0);
	}

	static ssize_t
	null_etherswitch_getioblksize(device_t dev)
	{
		return (-1);
	}

	static ssize_t
	null_etherswitch_getiosize(device_t dev)
	{
		return (-1);
	}

	static void *
	null_etherswitch_getiobuf(device_t dev)
	{
		return (NULL);
	}

	static int
	null_etherswitch_ioread(device_t dev, off_t off, ssize_t len)
	{
		return (EIO);
	}

	static int
	null_etherswitch_iowrite(device_t dev, off_t off, ssize_t len)
	{
		return (EIO);
	}
};

#
# Return device info
#
METHOD etherswitch_info_t* getinfo {
	device_t	dev;
}

#
# Lock access to switch registers
#
METHOD void lock {
	device_t	dev;
} DEFAULT null_etherswitch_lock;

#
# Unlock access to switch registers
#
METHOD void unlock {
	device_t	dev;
} DEFAULT null_etherswitch_unlock;

#
# Read switch register
#
METHOD int readreg {
	device_t	dev;
	int		reg;
};

#
# Write switch register
#
METHOD int writereg {
	device_t	dev;
	int		reg;
	int		value;
};

#
# Read PHY register
#
METHOD int readphyreg {
	device_t	dev;
	int		phy;
	int		reg;
};

#
# Write PHY register
#
METHOD int writephyreg {
	device_t	dev;
	int		phy;
	int		reg;
	int		value;
};

#
# Get port configuration
#
METHOD int getport {
	device_t	dev;
	etherswitch_port_t *vg;
}

#
# Set port configuration
#
METHOD int setport {
	device_t	dev;
	etherswitch_port_t *vg;
}

#
# Get VLAN group configuration
#
METHOD int getvgroup {
	device_t	dev;
	etherswitch_vlangroup_t *vg;
}

#
# Set VLAN group configuration
#
METHOD int setvgroup {
	device_t	dev;
	etherswitch_vlangroup_t *vg;
}

#
# Get LAGG configuration
#
METHOD int getlaggroup {
	device_t	dev;
	etherswitch_laggroup_t *vg;
} DEFAULT null_etherswitch_getlaggroup;

#
# Set LAGG configuration
#
METHOD int setlaggroup {
	device_t	dev;
	etherswitch_laggroup_t *vg;
} DEFAULT null_etherswitch_setlaggroup;

#
# Get the Switch configuration
#
METHOD int getconf {
	device_t	dev;
	etherswitch_conf_t	*conf;
} DEFAULT null_etherswitch_getconf;

#
# Set the Switch configuration
#
METHOD int setconf {
	device_t	dev;
	etherswitch_conf_t	*conf;
} DEFAULT null_etherswitch_setconf;

#
# Get the IO buffer block size
#
METHOD ssize_t getioblksize {
	device_t	dev;
} DEFAULT null_etherswitch_getioblksize;

#
# Get the IO buffer size
#
METHOD ssize_t getiosize {
	device_t	dev;
} DEFAULT null_etherswitch_getiosize;

#
# Get the IO buffer
#
METHOD void * getiobuf {
	device_t	dev;
} DEFAULT null_etherswitch_getiobuf;

#
# Perform a read operation and save data into IO buffer
#
METHOD int ioread {
	device_t	dev;
	off_t		off;
	ssize_t		len;
} DEFAULT null_etherswitch_ioread;

#
# Perform a write operation (write the data in the IO buffer)
#
METHOD int iowrite {
	device_t	dev;
	off_t		off;
	ssize_t		len;
} DEFAULT null_etherswitch_iowrite;