diff options
3 files changed, 69 insertions, 43 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h index 1afee9b73..c0374bfdd 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h @@ -14,6 +14,7 @@ #include <linux/phy.h> struct rtl8366_smi_ops; +struct rtl8366_vlan_ops; struct mii_bus; struct rtl8366_smi { @@ -27,13 +28,6 @@ struct rtl8366_smi { struct rtl8366_smi_ops *ops; }; -struct rtl8366_smi_ops { - int (*detect)(struct rtl8366_smi *smi); - - int (*mii_read)(struct mii_bus *bus, int addr, int reg); - int (*mii_write)(struct mii_bus *bus, int addr, int reg, u16 val); -}; - struct rtl8366_vlan_mc { u16 vid; u8 priority; @@ -49,6 +43,24 @@ struct rtl8366_vlan_4k { u8 fid; }; +struct rtl8366_smi_ops { + int (*detect)(struct rtl8366_smi *smi); + + int (*mii_read)(struct mii_bus *bus, int addr, int reg); + int (*mii_write)(struct mii_bus *bus, int addr, int reg, u16 val); + + int (*get_vlan_mc)(struct rtl8366_smi *smi, u32 index, + struct rtl8366_vlan_mc *vlanmc); + int (*set_vlan_mc)(struct rtl8366_smi *smi, u32 index, + const struct rtl8366_vlan_mc *vlanmc); + int (*get_vlan_4k)(struct rtl8366_smi *smi, u32 vid, + struct rtl8366_vlan_4k *vlan4k); + int (*set_vlan_4k)(struct rtl8366_smi *smi, + const struct rtl8366_vlan_4k *vlan4k); + int (*get_mc_index)(struct rtl8366_smi *smi, int port, int *val); + int (*set_mc_index)(struct rtl8366_smi *smi, int port, int index); +}; + 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); diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c index 3edfbc61c..799784373 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c @@ -679,14 +679,14 @@ static int rtl8366rb_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, int i; /* Update the 4K table */ - err = rtl8366rb_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; vlan4k.member = member; vlan4k.untag = untag; vlan4k.fid = fid; - err = rtl8366rb_set_vlan_4k(smi, &vlan4k); + err = smi->ops->set_vlan_4k(smi, &vlan4k); if (err) return err; @@ -694,7 +694,7 @@ static int rtl8366rb_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, for (i = 0; i < RTL8366RB_NUM_VLANS; i++) { struct rtl8366_vlan_mc vlanmc; - err = rtl8366rb_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; @@ -704,7 +704,7 @@ static int rtl8366rb_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, vlanmc.untag = untag; vlanmc.fid = fid; - err = rtl8366rb_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); break; } } @@ -718,11 +718,11 @@ static int rtl8366rb_get_pvid(struct rtl8366_smi *smi, int port, int *val) int err; int index; - err = rtl8366rb_get_mc_index(smi, port, &index); + err = smi->ops->get_mc_index(smi, port, &index); if (err) return err; - err = rtl8366rb_get_vlan_mc(smi, index, &vlanmc); + err = smi->ops->get_vlan_mc(smi, index, &vlanmc); if (err) return err; @@ -740,7 +740,7 @@ static int rtl8366rb_mc_is_used(struct rtl8366_smi *smi, int mc_index, for (i = 0; i < RTL8366RB_NUM_PORTS; i++) { int index = 0; - err = rtl8366rb_get_mc_index(smi, i, &index); + err = smi->ops->get_mc_index(smi, i, &index); if (err) return err; @@ -763,29 +763,29 @@ static int rtl8366rb_set_pvid(struct rtl8366_smi *smi, unsigned port, /* Try to find an existing MC entry for this VID */ for (i = 0; i < RTL8366RB_NUM_VLANS; i++) { - err = rtl8366rb_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; if (vid == vlanmc.vid) { - err = rtl8366rb_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366rb_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } /* We have no MC entry for this VID, try to find an empty one */ for (i = 0; i < RTL8366RB_NUM_VLANS; i++) { - err = rtl8366rb_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; if (vlanmc.vid == 0 && vlanmc.member == 0) { /* Update the entry from the 4K table */ - err = rtl8366rb_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; @@ -793,11 +793,11 @@ static int rtl8366rb_set_pvid(struct rtl8366_smi *smi, unsigned port, vlanmc.member = vlan4k.member; vlanmc.untag = vlan4k.untag; vlanmc.fid = vlan4k.fid; - err = rtl8366rb_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366rb_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } @@ -812,7 +812,7 @@ static int rtl8366rb_set_pvid(struct rtl8366_smi *smi, unsigned port, if (!used) { /* Update the entry from the 4K table */ - err = rtl8366rb_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; @@ -820,11 +820,11 @@ static int rtl8366rb_set_pvid(struct rtl8366_smi *smi, unsigned port, vlanmc.member = vlan4k.member; vlanmc.untag = vlan4k.untag; vlanmc.fid = vlan4k.fid; - err = rtl8366rb_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366rb_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } @@ -862,7 +862,7 @@ static int rtl8366rb_reset_vlan(struct rtl8366_smi *smi) vlanmc.untag = 0; vlanmc.fid = 0; for (i = 0; i < RTL8366RB_NUM_VLANS; i++) { - err = rtl8366rb_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; } @@ -1650,6 +1650,13 @@ static struct rtl8366_smi_ops rtl8366rb_smi_ops = { .detect = rtl8366rb_detect, .mii_read = rtl8366rb_mii_read, .mii_write = rtl8366rb_mii_write, + + .get_vlan_mc = rtl8366rb_get_vlan_mc, + .set_vlan_mc = rtl8366rb_set_vlan_mc, + .get_vlan_4k = rtl8366rb_get_vlan_4k, + .set_vlan_4k = rtl8366rb_set_vlan_4k, + .get_mc_index = rtl8366rb_get_mc_index, + .set_mc_index = rtl8366rb_set_mc_index, }; static int __init rtl8366rb_probe(struct platform_device *pdev) diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c index f37f47877..a8c48a975 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c @@ -669,14 +669,14 @@ static int rtl8366s_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, int i; /* Update the 4K table */ - err = rtl8366s_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; vlan4k.member = member; vlan4k.untag = untag; vlan4k.fid = fid; - err = rtl8366s_set_vlan_4k(smi, &vlan4k); + err = smi->ops->set_vlan_4k(smi, &vlan4k); if (err) return err; @@ -684,7 +684,7 @@ static int rtl8366s_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, for (i = 0; i < RTL8366S_NUM_VLANS; i++) { struct rtl8366_vlan_mc vlanmc; - err = rtl8366s_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; @@ -694,7 +694,7 @@ static int rtl8366s_set_vlan(struct rtl8366_smi *smi, int vid, u32 member, vlanmc.untag = untag; vlanmc.fid = fid; - err = rtl8366s_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); break; } } @@ -708,11 +708,11 @@ static int rtl8366s_get_pvid(struct rtl8366_smi *smi, int port, int *val) int err; int index; - err = rtl8366s_get_mc_index(smi, port, &index); + err = smi->ops->get_mc_index(smi, port, &index); if (err) return err; - err = rtl8366s_get_vlan_mc(smi, index, &vlanmc); + err = smi->ops->get_vlan_mc(smi, index, &vlanmc); if (err) return err; @@ -730,7 +730,7 @@ static int rtl8366s_mc_is_used(struct rtl8366_smi *smi, int mc_index, for (i = 0; i < RTL8366S_NUM_PORTS; i++) { int index = 0; - err = rtl8366s_get_mc_index(smi, i, &index); + err = smi->ops->get_mc_index(smi, i, &index); if (err) return err; @@ -753,29 +753,29 @@ static int rtl8366s_set_pvid(struct rtl8366_smi *smi, unsigned port, /* Try to find an existing MC entry for this VID */ for (i = 0; i < RTL8366S_NUM_VLANS; i++) { - err = rtl8366s_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; if (vid == vlanmc.vid) { - err = rtl8366s_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366s_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } /* We have no MC entry for this VID, try to find an empty one */ for (i = 0; i < RTL8366S_NUM_VLANS; i++) { - err = rtl8366s_get_vlan_mc(smi, i, &vlanmc); + err = smi->ops->get_vlan_mc(smi, i, &vlanmc); if (err) return err; if (vlanmc.vid == 0 && vlanmc.member == 0) { /* Update the entry from the 4K table */ - err = rtl8366s_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; @@ -783,11 +783,11 @@ static int rtl8366s_set_pvid(struct rtl8366_smi *smi, unsigned port, vlanmc.member = vlan4k.member; vlanmc.untag = vlan4k.untag; vlanmc.fid = vlan4k.fid; - err = rtl8366s_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366s_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } @@ -802,7 +802,7 @@ static int rtl8366s_set_pvid(struct rtl8366_smi *smi, unsigned port, if (!used) { /* Update the entry from the 4K table */ - err = rtl8366s_get_vlan_4k(smi, vid, &vlan4k); + err = smi->ops->get_vlan_4k(smi, vid, &vlan4k); if (err) return err; @@ -810,11 +810,11 @@ static int rtl8366s_set_pvid(struct rtl8366_smi *smi, unsigned port, vlanmc.member = vlan4k.member; vlanmc.untag = vlan4k.untag; vlanmc.fid = vlan4k.fid; - err = rtl8366s_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; - err = rtl8366s_set_mc_index(smi, port, i); + err = smi->ops->set_mc_index(smi, port, i); return err; } } @@ -851,7 +851,7 @@ static int rtl8366s_reset_vlan(struct rtl8366_smi *smi) vlanmc.untag = 0; vlanmc.fid = 0; for (i = 0; i < RTL8366S_NUM_VLANS; i++) { - err = rtl8366s_set_vlan_mc(smi, i, &vlanmc); + err = smi->ops->set_vlan_mc(smi, i, &vlanmc); if (err) return err; } @@ -1640,6 +1640,13 @@ static struct rtl8366_smi_ops rtl8366s_smi_ops = { .detect = rtl8366s_detect, .mii_read = rtl8366s_mii_read, .mii_write = rtl8366s_mii_write, + + .get_vlan_mc = rtl8366s_get_vlan_mc, + .set_vlan_mc = rtl8366s_set_vlan_mc, + .get_vlan_4k = rtl8366s_get_vlan_4k, + .set_vlan_4k = rtl8366s_set_vlan_4k, + .get_mc_index = rtl8366s_get_mc_index, + .set_mc_index = rtl8366s_set_mc_index, }; static int __init rtl8366s_probe(struct platform_device *pdev) |