int (*mii_write)(struct mii_bus *bus, int addr, int reg, u16 val);
};
+struct rtl8366_vlan_mc {
+ u16 vid;
+ u8 priority;
+ u8 untag;
+ u8 member;
+ u8 fid;
+};
+
int rtl8366_smi_init(struct rtl8366_smi *smi);
void rtl8366_smi_cleanup(struct rtl8366_smi *smi);
int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data);
}
static int rtl8366rb_get_vlan_mc(struct rtl8366rb *rtl, u32 index,
- struct rtl8366rb_vlan_mc *vlanmc)
+ struct rtl8366_vlan_mc *vlanmc)
{
struct rtl8366_smi *smi = &rtl->smi;
+ struct rtl8366rb_vlan_mc vlanmc_priv;
int err;
u32 addr;
u32 data;
u16 *tableaddr;
- memset(vlanmc, '\0', sizeof(struct rtl8366rb_vlan_mc));
+ memset(vlanmc, '\0', sizeof(struct rtl8366_vlan_mc));
if (index >= RTL8366_NUM_VLANS)
return -EINVAL;
- tableaddr = (u16 *)vlanmc;
+ tableaddr = (u16 *)&vlanmc_priv;
addr = RTL8366S_VLAN_MEMCONF_BASE + (index * 3);
err = rtl8366_smi_read_reg(smi, addr, &data);
*tableaddr = data;
+ vlanmc->vid = vlanmc_priv.vid;
+ vlanmc->priority = vlanmc_priv.priority;
+ vlanmc->untag = vlanmc_priv.untag;
+ vlanmc->member = vlanmc_priv.member;
+ vlanmc->fid = vlanmc_priv.fid;
+
return 0;
}
static int rtl8366rb_set_vlan_mc(struct rtl8366rb *rtl, u32 index,
- const struct rtl8366rb_vlan_mc *vlanmc)
+ const struct rtl8366_vlan_mc *vlanmc)
{
struct rtl8366_smi *smi = &rtl->smi;
+ struct rtl8366rb_vlan_mc vlanmc_priv;
int err;
u32 addr;
u32 data;
vlanmc->fid > RTL8366S_FIDMAX)
return -EINVAL;
+ vlanmc_priv.vid = vlanmc->vid;
+ vlanmc_priv.priority = vlanmc->priority;
+ vlanmc_priv.untag = vlanmc->untag;
+ vlanmc_priv.member = vlanmc->member;
+ vlanmc_priv.stag_mbr = 0;
+ vlanmc_priv.stag_idx = 0;
+ vlanmc_priv.fid = vlanmc->fid;
+
addr = RTL8366S_VLAN_MEMCONF_BASE + (index * 3);
- tableaddr = (u16 *)vlanmc;
+ tableaddr = (u16 *)&vlanmc_priv;
data = *tableaddr;
err = rtl8366_smi_write_reg(smi, addr, data);
static int rtl8366rb_get_vlan_port_pvid(struct rtl8366rb *rtl, int port,
int *val)
{
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
int err;
int index;
static int rtl8366rb_set_vlan_port_pvid(struct rtl8366rb *rtl, int port, int val)
{
int i;
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366rb_vlan_4k vlan4k;
if (port >= RTL8366_NUM_PORTS || val >= RTL8366_NUM_VIDS)
static int rtl8366rb_reset_vlan(struct rtl8366rb *rtl)
{
struct rtl8366rb_vlan_4k vlan4k;
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
int err;
int i;
"\tports\n");
for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
rtl8366rb_get_vlan_mc(rtl, i, &vlanmc);
{
int i;
u32 len = 0;
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366rb_vlan_4k vlan4k;
struct rtl8366rb *rtl = sw_to_rtl8366rb(dev);
char *buf = rtl->buf;
static int rtl8366rb_sw_get_vlan_ports(struct switch_dev *dev,
struct switch_val *val)
{
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366rb *rtl = sw_to_rtl8366rb(dev);
struct switch_port *port;
int i;
static int rtl8366rb_sw_set_vlan_ports(struct switch_dev *dev,
struct switch_val *val)
{
- struct rtl8366rb_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366rb_vlan_4k vlan4k;
struct rtl8366rb *rtl = sw_to_rtl8366rb(dev);
struct switch_port *port;
}
static int rtl8366s_get_vlan_mc(struct rtl8366s *rtl, u32 index,
- struct rtl8366s_vlan_mc *vlanmc)
+ struct rtl8366_vlan_mc *vlanmc)
{
struct rtl8366_smi *smi = &rtl->smi;
+ struct rtl8366s_vlan_mc vlanmc_priv;
int err;
u32 addr;
u32 data;
u16 *tableaddr;
- memset(vlanmc, '\0', sizeof(struct rtl8366s_vlan_mc));
+ memset(vlanmc, '\0', sizeof(struct rtl8366_vlan_mc));
if (index >= RTL8366_NUM_VLANS)
return -EINVAL;
- tableaddr = (u16 *)vlanmc;
+ tableaddr = (u16 *)&vlanmc_priv;
addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
err = rtl8366_smi_read_reg(smi, addr, &data);
*tableaddr = data;
+ vlanmc->vid = vlanmc_priv.vid;
+ vlanmc->priority = vlanmc_priv.priority;
+ vlanmc->untag = vlanmc_priv.untag;
+ vlanmc->member = vlanmc_priv.member;
+ vlanmc->fid = vlanmc_priv.fid;
+
return 0;
}
static int rtl8366s_set_vlan_mc(struct rtl8366s *rtl, u32 index,
- const struct rtl8366s_vlan_mc *vlanmc)
+ const struct rtl8366_vlan_mc *vlanmc)
{
struct rtl8366_smi *smi = &rtl->smi;
+ struct rtl8366s_vlan_mc vlanmc_priv;
int err;
u32 addr;
u32 data;
vlanmc->fid > RTL8366S_FIDMAX)
return -EINVAL;
+ vlanmc_priv.vid = vlanmc->vid;
+ vlanmc_priv.priority = vlanmc->priority;
+ vlanmc_priv.untag = vlanmc->untag;
+ vlanmc_priv.member = vlanmc->member;
+ vlanmc_priv.fid = vlanmc->fid;
+
addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
- tableaddr = (u16 *)vlanmc;
+ tableaddr = (u16 *)&vlanmc_priv;
data = *tableaddr;
err = rtl8366_smi_write_reg(smi, addr, data);
static int rtl8366s_get_vlan_port_pvid(struct rtl8366s *rtl, int port,
int *val)
{
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
int err;
int index;
static int rtl8366s_set_vlan_port_pvid(struct rtl8366s *rtl, int port, int val)
{
int i;
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366s_vlan_4k vlan4k;
if (port >= RTL8366_NUM_PORTS || val >= RTL8366_NUM_VIDS)
static int rtl8366s_reset_vlan(struct rtl8366s *rtl)
{
struct rtl8366s_vlan_4k vlan4k;
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
int err;
int i;
"\tports\n");
for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
rtl8366s_get_vlan_mc(rtl, i, &vlanmc);
{
int i;
u32 len = 0;
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366s_vlan_4k vlan4k;
struct rtl8366s *rtl = sw_to_rtl8366s(dev);
char *buf = rtl->buf;
static int rtl8366s_sw_get_vlan_ports(struct switch_dev *dev,
struct switch_val *val)
{
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366s *rtl = sw_to_rtl8366s(dev);
struct switch_port *port;
int i;
static int rtl8366s_sw_set_vlan_ports(struct switch_dev *dev,
struct switch_val *val)
{
- struct rtl8366s_vlan_mc vlanmc;
+ struct rtl8366_vlan_mc vlanmc;
struct rtl8366s_vlan_4k vlan4k;
struct rtl8366s *rtl = sw_to_rtl8366s(dev);
struct switch_port *port;