Commit 73517885 authored by David S. Miller's avatar David S. Miller

Merge branch 'dsa_swqitch_ops-const'

Florian Fainelli says:

====================
net: dsa: Make dsa_switch_ops const

This patch series allows us to annotate dsa_switch_ops with a const
qualifier.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1940075b a82f67af
...@@ -712,7 +712,7 @@ static unsigned int b53_get_mib_size(struct b53_device *dev) ...@@ -712,7 +712,7 @@ static unsigned int b53_get_mib_size(struct b53_device *dev)
return B53_MIBS_SIZE; return B53_MIBS_SIZE;
} }
static void b53_get_strings(struct dsa_switch *ds, int port, uint8_t *data) void b53_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
const struct b53_mib_desc *mibs = b53_get_mib(dev); const struct b53_mib_desc *mibs = b53_get_mib(dev);
...@@ -723,9 +723,9 @@ static void b53_get_strings(struct dsa_switch *ds, int port, uint8_t *data) ...@@ -723,9 +723,9 @@ static void b53_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
memcpy(data + i * ETH_GSTRING_LEN, memcpy(data + i * ETH_GSTRING_LEN,
mibs[i].name, ETH_GSTRING_LEN); mibs[i].name, ETH_GSTRING_LEN);
} }
EXPORT_SYMBOL(b53_get_strings);
static void b53_get_ethtool_stats(struct dsa_switch *ds, int port, void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data)
uint64_t *data)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
const struct b53_mib_desc *mibs = b53_get_mib(dev); const struct b53_mib_desc *mibs = b53_get_mib(dev);
...@@ -756,13 +756,15 @@ static void b53_get_ethtool_stats(struct dsa_switch *ds, int port, ...@@ -756,13 +756,15 @@ static void b53_get_ethtool_stats(struct dsa_switch *ds, int port,
mutex_unlock(&dev->stats_mutex); mutex_unlock(&dev->stats_mutex);
} }
EXPORT_SYMBOL(b53_get_ethtool_stats);
static int b53_get_sset_count(struct dsa_switch *ds) int b53_get_sset_count(struct dsa_switch *ds)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
return b53_get_mib_size(dev); return b53_get_mib_size(dev);
} }
EXPORT_SYMBOL(b53_get_sset_count);
static int b53_setup(struct dsa_switch *ds) static int b53_setup(struct dsa_switch *ds)
{ {
...@@ -921,15 +923,15 @@ static void b53_adjust_link(struct dsa_switch *ds, int port, ...@@ -921,15 +923,15 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
} }
} }
static int b53_vlan_filtering(struct dsa_switch *ds, int port, int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering)
bool vlan_filtering)
{ {
return 0; return 0;
} }
EXPORT_SYMBOL(b53_vlan_filtering);
static int b53_vlan_prepare(struct dsa_switch *ds, int port, int b53_vlan_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan, const struct switchdev_obj_port_vlan *vlan,
struct switchdev_trans *trans) struct switchdev_trans *trans)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
...@@ -943,10 +945,11 @@ static int b53_vlan_prepare(struct dsa_switch *ds, int port, ...@@ -943,10 +945,11 @@ static int b53_vlan_prepare(struct dsa_switch *ds, int port,
return 0; return 0;
} }
EXPORT_SYMBOL(b53_vlan_prepare);
static void b53_vlan_add(struct dsa_switch *ds, int port, void b53_vlan_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan, const struct switchdev_obj_port_vlan *vlan,
struct switchdev_trans *trans) struct switchdev_trans *trans)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
...@@ -977,9 +980,10 @@ static void b53_vlan_add(struct dsa_switch *ds, int port, ...@@ -977,9 +980,10 @@ static void b53_vlan_add(struct dsa_switch *ds, int port,
b53_fast_age_vlan(dev, vid); b53_fast_age_vlan(dev, vid);
} }
} }
EXPORT_SYMBOL(b53_vlan_add);
static int b53_vlan_del(struct dsa_switch *ds, int port, int b53_vlan_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan) const struct switchdev_obj_port_vlan *vlan)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
...@@ -1015,10 +1019,11 @@ static int b53_vlan_del(struct dsa_switch *ds, int port, ...@@ -1015,10 +1019,11 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
return 0; return 0;
} }
EXPORT_SYMBOL(b53_vlan_del);
static int b53_vlan_dump(struct dsa_switch *ds, int port, int b53_vlan_dump(struct dsa_switch *ds, int port,
struct switchdev_obj_port_vlan *vlan, struct switchdev_obj_port_vlan *vlan,
int (*cb)(struct switchdev_obj *obj)) int (*cb)(struct switchdev_obj *obj))
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
u16 vid, vid_start = 0, pvid; u16 vid, vid_start = 0, pvid;
...@@ -1057,6 +1062,7 @@ static int b53_vlan_dump(struct dsa_switch *ds, int port, ...@@ -1057,6 +1062,7 @@ static int b53_vlan_dump(struct dsa_switch *ds, int port,
return err; return err;
} }
EXPORT_SYMBOL(b53_vlan_dump);
/* Address Resolution Logic routines */ /* Address Resolution Logic routines */
static int b53_arl_op_wait(struct b53_device *dev) static int b53_arl_op_wait(struct b53_device *dev)
...@@ -1175,9 +1181,9 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, ...@@ -1175,9 +1181,9 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
return b53_arl_rw_op(dev, 0); return b53_arl_rw_op(dev, 0);
} }
static int b53_fdb_prepare(struct dsa_switch *ds, int port, int b53_fdb_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb, const struct switchdev_obj_port_fdb *fdb,
struct switchdev_trans *trans) struct switchdev_trans *trans)
{ {
struct b53_device *priv = ds->priv; struct b53_device *priv = ds->priv;
...@@ -1189,24 +1195,27 @@ static int b53_fdb_prepare(struct dsa_switch *ds, int port, ...@@ -1189,24 +1195,27 @@ static int b53_fdb_prepare(struct dsa_switch *ds, int port,
return 0; return 0;
} }
EXPORT_SYMBOL(b53_fdb_prepare);
static void b53_fdb_add(struct dsa_switch *ds, int port, void b53_fdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb, const struct switchdev_obj_port_fdb *fdb,
struct switchdev_trans *trans) struct switchdev_trans *trans)
{ {
struct b53_device *priv = ds->priv; struct b53_device *priv = ds->priv;
if (b53_arl_op(priv, 0, port, fdb->addr, fdb->vid, true)) if (b53_arl_op(priv, 0, port, fdb->addr, fdb->vid, true))
pr_err("%s: failed to add MAC address\n", __func__); pr_err("%s: failed to add MAC address\n", __func__);
} }
EXPORT_SYMBOL(b53_fdb_add);
static int b53_fdb_del(struct dsa_switch *ds, int port, int b53_fdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb) const struct switchdev_obj_port_fdb *fdb)
{ {
struct b53_device *priv = ds->priv; struct b53_device *priv = ds->priv;
return b53_arl_op(priv, 0, port, fdb->addr, fdb->vid, false); return b53_arl_op(priv, 0, port, fdb->addr, fdb->vid, false);
} }
EXPORT_SYMBOL(b53_fdb_del);
static int b53_arl_search_wait(struct b53_device *dev) static int b53_arl_search_wait(struct b53_device *dev)
{ {
...@@ -1258,9 +1267,9 @@ static int b53_fdb_copy(struct net_device *dev, int port, ...@@ -1258,9 +1267,9 @@ static int b53_fdb_copy(struct net_device *dev, int port,
return cb(&fdb->obj); return cb(&fdb->obj);
} }
static int b53_fdb_dump(struct dsa_switch *ds, int port, int b53_fdb_dump(struct dsa_switch *ds, int port,
struct switchdev_obj_port_fdb *fdb, struct switchdev_obj_port_fdb *fdb,
int (*cb)(struct switchdev_obj *obj)) int (*cb)(struct switchdev_obj *obj))
{ {
struct b53_device *priv = ds->priv; struct b53_device *priv = ds->priv;
struct net_device *dev = ds->ports[port].netdev; struct net_device *dev = ds->ports[port].netdev;
...@@ -1297,9 +1306,9 @@ static int b53_fdb_dump(struct dsa_switch *ds, int port, ...@@ -1297,9 +1306,9 @@ static int b53_fdb_dump(struct dsa_switch *ds, int port,
return 0; return 0;
} }
EXPORT_SYMBOL(b53_fdb_dump);
static int b53_br_join(struct dsa_switch *ds, int port, int b53_br_join(struct dsa_switch *ds, int port, struct net_device *bridge)
struct net_device *bridge)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
s8 cpu_port = ds->dst->cpu_port; s8 cpu_port = ds->dst->cpu_port;
...@@ -1343,8 +1352,9 @@ static int b53_br_join(struct dsa_switch *ds, int port, ...@@ -1343,8 +1352,9 @@ static int b53_br_join(struct dsa_switch *ds, int port,
return 0; return 0;
} }
EXPORT_SYMBOL(b53_br_join);
static void b53_br_leave(struct dsa_switch *ds, int port) void b53_br_leave(struct dsa_switch *ds, int port)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
struct net_device *bridge = dev->ports[port].bridge_dev; struct net_device *bridge = dev->ports[port].bridge_dev;
...@@ -1393,8 +1403,9 @@ static void b53_br_leave(struct dsa_switch *ds, int port) ...@@ -1393,8 +1403,9 @@ static void b53_br_leave(struct dsa_switch *ds, int port)
b53_set_vlan_entry(dev, pvid, vl); b53_set_vlan_entry(dev, pvid, vl);
} }
} }
EXPORT_SYMBOL(b53_br_leave);
static void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state) void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
u8 hw_state; u8 hw_state;
...@@ -1426,21 +1437,23 @@ static void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state) ...@@ -1426,21 +1437,23 @@ static void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state)
reg |= hw_state; reg |= hw_state;
b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), reg); b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), reg);
} }
EXPORT_SYMBOL(b53_br_set_stp_state);
static void b53_br_fast_age(struct dsa_switch *ds, int port) void b53_br_fast_age(struct dsa_switch *ds, int port)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
if (b53_fast_age_port(dev, port)) if (b53_fast_age_port(dev, port))
dev_err(ds->dev, "fast ageing failed\n"); dev_err(ds->dev, "fast ageing failed\n");
} }
EXPORT_SYMBOL(b53_br_fast_age);
static enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds) static enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds)
{ {
return DSA_TAG_PROTO_NONE; return DSA_TAG_PROTO_NONE;
} }
static struct dsa_switch_ops b53_switch_ops = { static const struct dsa_switch_ops b53_switch_ops = {
.get_tag_protocol = b53_get_tag_protocol, .get_tag_protocol = b53_get_tag_protocol,
.setup = b53_setup, .setup = b53_setup,
.get_strings = b53_get_strings, .get_strings = b53_get_strings,
......
...@@ -374,4 +374,37 @@ static inline int b53_switch_get_reset_gpio(struct b53_device *dev) ...@@ -374,4 +374,37 @@ static inline int b53_switch_get_reset_gpio(struct b53_device *dev)
return -ENOENT; return -ENOENT;
} }
#endif #endif
/* Exported functions towards other drivers */
void b53_get_strings(struct dsa_switch *ds, int port, uint8_t *data);
void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
int b53_get_sset_count(struct dsa_switch *ds);
int b53_br_join(struct dsa_switch *ds, int port, struct net_device *bridge);
void b53_br_leave(struct dsa_switch *ds, int port);
void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state);
void b53_br_fast_age(struct dsa_switch *ds, int port);
int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering);
int b53_vlan_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan,
struct switchdev_trans *trans);
void b53_vlan_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan,
struct switchdev_trans *trans);
int b53_vlan_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan);
int b53_vlan_dump(struct dsa_switch *ds, int port,
struct switchdev_obj_port_vlan *vlan,
int (*cb)(struct switchdev_obj *obj));
int b53_fdb_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb,
struct switchdev_trans *trans);
void b53_fdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb,
struct switchdev_trans *trans);
int b53_fdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb);
int b53_fdb_dump(struct dsa_switch *ds, int port,
struct switchdev_obj_port_fdb *fdb,
int (*cb)(struct switchdev_obj *obj));
#endif #endif
...@@ -977,6 +977,38 @@ static struct b53_io_ops bcm_sf2_io_ops = { ...@@ -977,6 +977,38 @@ static struct b53_io_ops bcm_sf2_io_ops = {
.write64 = bcm_sf2_core_write64, .write64 = bcm_sf2_core_write64,
}; };
static const struct dsa_switch_ops bcm_sf2_ops = {
.get_tag_protocol = bcm_sf2_sw_get_tag_protocol,
.setup = bcm_sf2_sw_setup,
.get_strings = b53_get_strings,
.get_ethtool_stats = b53_get_ethtool_stats,
.get_sset_count = b53_get_sset_count,
.get_phy_flags = bcm_sf2_sw_get_phy_flags,
.adjust_link = bcm_sf2_sw_adjust_link,
.fixed_link_update = bcm_sf2_sw_fixed_link_update,
.suspend = bcm_sf2_sw_suspend,
.resume = bcm_sf2_sw_resume,
.get_wol = bcm_sf2_sw_get_wol,
.set_wol = bcm_sf2_sw_set_wol,
.port_enable = bcm_sf2_port_setup,
.port_disable = bcm_sf2_port_disable,
.get_eee = bcm_sf2_sw_get_eee,
.set_eee = bcm_sf2_sw_set_eee,
.port_bridge_join = b53_br_join,
.port_bridge_leave = b53_br_leave,
.port_stp_state_set = b53_br_set_stp_state,
.port_fast_age = b53_br_fast_age,
.port_vlan_filtering = b53_vlan_filtering,
.port_vlan_prepare = b53_vlan_prepare,
.port_vlan_add = b53_vlan_add,
.port_vlan_del = b53_vlan_del,
.port_vlan_dump = b53_vlan_dump,
.port_fdb_prepare = b53_fdb_prepare,
.port_fdb_dump = b53_fdb_dump,
.port_fdb_add = b53_fdb_add,
.port_fdb_del = b53_fdb_del,
};
static int bcm_sf2_sw_probe(struct platform_device *pdev) static int bcm_sf2_sw_probe(struct platform_device *pdev)
{ {
const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME; const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME;
...@@ -1017,28 +1049,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) ...@@ -1017,28 +1049,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
priv->dev = dev; priv->dev = dev;
ds = dev->ds; ds = dev->ds;
ds->ops = &bcm_sf2_ops;
/* Override the parts that are non-standard wrt. normal b53 devices */
memcpy(ops, ds->ops, sizeof(*ops));
ds->ops = ops;
ds->ops->get_tag_protocol = bcm_sf2_sw_get_tag_protocol;
ds->ops->setup = bcm_sf2_sw_setup;
ds->ops->get_phy_flags = bcm_sf2_sw_get_phy_flags;
ds->ops->adjust_link = bcm_sf2_sw_adjust_link;
ds->ops->fixed_link_update = bcm_sf2_sw_fixed_link_update;
ds->ops->suspend = bcm_sf2_sw_suspend;
ds->ops->resume = bcm_sf2_sw_resume;
ds->ops->get_wol = bcm_sf2_sw_get_wol;
ds->ops->set_wol = bcm_sf2_sw_set_wol;
ds->ops->port_enable = bcm_sf2_port_setup;
ds->ops->port_disable = bcm_sf2_port_disable;
ds->ops->get_eee = bcm_sf2_sw_get_eee;
ds->ops->set_eee = bcm_sf2_sw_set_eee;
/* Avoid having DSA free our slave MDIO bus (checking for
* ds->slave_mii_bus and ds->ops->phy_read being non-NULL)
*/
ds->ops->phy_read = NULL;
dev_set_drvdata(&pdev->dev, priv); dev_set_drvdata(&pdev->dev, priv);
......
...@@ -252,7 +252,7 @@ mv88e6060_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val) ...@@ -252,7 +252,7 @@ mv88e6060_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val)
return reg_write(ds, addr, regnum, val); return reg_write(ds, addr, regnum, val);
} }
static struct dsa_switch_ops mv88e6060_switch_ops = { static const struct dsa_switch_ops mv88e6060_switch_ops = {
.get_tag_protocol = mv88e6060_get_tag_protocol, .get_tag_protocol = mv88e6060_get_tag_protocol,
.probe = mv88e6060_drv_probe, .probe = mv88e6060_drv_probe,
.setup = mv88e6060_setup, .setup = mv88e6060_setup,
...@@ -261,16 +261,20 @@ static struct dsa_switch_ops mv88e6060_switch_ops = { ...@@ -261,16 +261,20 @@ static struct dsa_switch_ops mv88e6060_switch_ops = {
.phy_write = mv88e6060_phy_write, .phy_write = mv88e6060_phy_write,
}; };
static struct dsa_switch_driver mv88e6060_switch_drv = {
.ops = &mv88e6060_switch_ops,
};
static int __init mv88e6060_init(void) static int __init mv88e6060_init(void)
{ {
register_switch_driver(&mv88e6060_switch_ops); register_switch_driver(&mv88e6060_switch_drv);
return 0; return 0;
} }
module_init(mv88e6060_init); module_init(mv88e6060_init);
static void __exit mv88e6060_cleanup(void) static void __exit mv88e6060_cleanup(void)
{ {
unregister_switch_driver(&mv88e6060_switch_ops); unregister_switch_driver(&mv88e6060_switch_drv);
} }
module_exit(mv88e6060_cleanup); module_exit(mv88e6060_cleanup);
......
...@@ -4361,7 +4361,7 @@ static int mv88e6xxx_port_mdb_dump(struct dsa_switch *ds, int port, ...@@ -4361,7 +4361,7 @@ static int mv88e6xxx_port_mdb_dump(struct dsa_switch *ds, int port,
return err; return err;
} }
static struct dsa_switch_ops mv88e6xxx_switch_ops = { static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
.probe = mv88e6xxx_drv_probe, .probe = mv88e6xxx_drv_probe,
.get_tag_protocol = mv88e6xxx_get_tag_protocol, .get_tag_protocol = mv88e6xxx_get_tag_protocol,
.setup = mv88e6xxx_setup, .setup = mv88e6xxx_setup,
...@@ -4403,6 +4403,10 @@ static struct dsa_switch_ops mv88e6xxx_switch_ops = { ...@@ -4403,6 +4403,10 @@ static struct dsa_switch_ops mv88e6xxx_switch_ops = {
.port_mdb_dump = mv88e6xxx_port_mdb_dump, .port_mdb_dump = mv88e6xxx_port_mdb_dump,
}; };
static struct dsa_switch_driver mv88e6xxx_switch_drv = {
.ops = &mv88e6xxx_switch_ops,
};
static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip, static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
struct device_node *np) struct device_node *np)
{ {
...@@ -4565,7 +4569,7 @@ static struct mdio_driver mv88e6xxx_driver = { ...@@ -4565,7 +4569,7 @@ static struct mdio_driver mv88e6xxx_driver = {
static int __init mv88e6xxx_init(void) static int __init mv88e6xxx_init(void)
{ {
register_switch_driver(&mv88e6xxx_switch_ops); register_switch_driver(&mv88e6xxx_switch_drv);
return mdio_driver_register(&mv88e6xxx_driver); return mdio_driver_register(&mv88e6xxx_driver);
} }
module_init(mv88e6xxx_init); module_init(mv88e6xxx_init);
...@@ -4573,7 +4577,7 @@ module_init(mv88e6xxx_init); ...@@ -4573,7 +4577,7 @@ module_init(mv88e6xxx_init);
static void __exit mv88e6xxx_cleanup(void) static void __exit mv88e6xxx_cleanup(void)
{ {
mdio_driver_unregister(&mv88e6xxx_driver); mdio_driver_unregister(&mv88e6xxx_driver);
unregister_switch_driver(&mv88e6xxx_switch_ops); unregister_switch_driver(&mv88e6xxx_switch_drv);
} }
module_exit(mv88e6xxx_cleanup); module_exit(mv88e6xxx_cleanup);
......
...@@ -911,7 +911,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds) ...@@ -911,7 +911,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds)
return DSA_TAG_PROTO_QCA; return DSA_TAG_PROTO_QCA;
} }
static struct dsa_switch_ops qca8k_switch_ops = { static const struct dsa_switch_ops qca8k_switch_ops = {
.get_tag_protocol = qca8k_get_tag_protocol, .get_tag_protocol = qca8k_get_tag_protocol,
.setup = qca8k_setup, .setup = qca8k_setup,
.get_strings = qca8k_get_strings, .get_strings = qca8k_get_strings,
......
...@@ -169,7 +169,7 @@ struct dsa_switch { ...@@ -169,7 +169,7 @@ struct dsa_switch {
/* /*
* The switch operations. * The switch operations.
*/ */
struct dsa_switch_ops *ops; const struct dsa_switch_ops *ops;
/* /*
* An array of which element [a] indicates which port on this * An array of which element [a] indicates which port on this
...@@ -240,8 +240,6 @@ struct switchdev_obj_port_mdb; ...@@ -240,8 +240,6 @@ struct switchdev_obj_port_mdb;
struct switchdev_obj_port_vlan; struct switchdev_obj_port_vlan;
struct dsa_switch_ops { struct dsa_switch_ops {
struct list_head list;
/* /*
* Probing and setup. * Probing and setup.
*/ */
...@@ -390,8 +388,13 @@ struct dsa_switch_ops { ...@@ -390,8 +388,13 @@ struct dsa_switch_ops {
int (*cb)(struct switchdev_obj *obj)); int (*cb)(struct switchdev_obj *obj));
}; };
void register_switch_driver(struct dsa_switch_ops *type); struct dsa_switch_driver {
void unregister_switch_driver(struct dsa_switch_ops *type); struct list_head list;
const struct dsa_switch_ops *ops;
};
void register_switch_driver(struct dsa_switch_driver *type);
void unregister_switch_driver(struct dsa_switch_driver *type);
struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev); struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst) static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
......
...@@ -60,27 +60,27 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = { ...@@ -60,27 +60,27 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = {
static DEFINE_MUTEX(dsa_switch_drivers_mutex); static DEFINE_MUTEX(dsa_switch_drivers_mutex);
static LIST_HEAD(dsa_switch_drivers); static LIST_HEAD(dsa_switch_drivers);
void register_switch_driver(struct dsa_switch_ops *ops) void register_switch_driver(struct dsa_switch_driver *drv)
{ {
mutex_lock(&dsa_switch_drivers_mutex); mutex_lock(&dsa_switch_drivers_mutex);
list_add_tail(&ops->list, &dsa_switch_drivers); list_add_tail(&drv->list, &dsa_switch_drivers);
mutex_unlock(&dsa_switch_drivers_mutex); mutex_unlock(&dsa_switch_drivers_mutex);
} }
EXPORT_SYMBOL_GPL(register_switch_driver); EXPORT_SYMBOL_GPL(register_switch_driver);
void unregister_switch_driver(struct dsa_switch_ops *ops) void unregister_switch_driver(struct dsa_switch_driver *drv)
{ {
mutex_lock(&dsa_switch_drivers_mutex); mutex_lock(&dsa_switch_drivers_mutex);
list_del_init(&ops->list); list_del_init(&drv->list);
mutex_unlock(&dsa_switch_drivers_mutex); mutex_unlock(&dsa_switch_drivers_mutex);
} }
EXPORT_SYMBOL_GPL(unregister_switch_driver); EXPORT_SYMBOL_GPL(unregister_switch_driver);
static struct dsa_switch_ops * static const struct dsa_switch_ops *
dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr, dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr,
const char **_name, void **priv) const char **_name, void **priv)
{ {
struct dsa_switch_ops *ret; const struct dsa_switch_ops *ret;
struct list_head *list; struct list_head *list;
const char *name; const char *name;
...@@ -89,9 +89,11 @@ dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr, ...@@ -89,9 +89,11 @@ dsa_switch_probe(struct device *parent, struct device *host_dev, int sw_addr,
mutex_lock(&dsa_switch_drivers_mutex); mutex_lock(&dsa_switch_drivers_mutex);
list_for_each(list, &dsa_switch_drivers) { list_for_each(list, &dsa_switch_drivers) {
struct dsa_switch_ops *ops; const struct dsa_switch_ops *ops;
struct dsa_switch_driver *drv;
ops = list_entry(list, struct dsa_switch_ops, list); drv = list_entry(list, struct dsa_switch_driver, list);
ops = drv->ops;
name = ops->probe(parent, host_dev, sw_addr, priv); name = ops->probe(parent, host_dev, sw_addr, priv);
if (name != NULL) { if (name != NULL) {
...@@ -205,7 +207,7 @@ void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds) ...@@ -205,7 +207,7 @@ void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds)
static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent) static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
{ {
struct dsa_switch_ops *ops = ds->ops; const struct dsa_switch_ops *ops = ds->ops;
struct dsa_switch_tree *dst = ds->dst; struct dsa_switch_tree *dst = ds->dst;
struct dsa_chip_data *cd = ds->cd; struct dsa_chip_data *cd = ds->cd;
bool valid_name_found = false; bool valid_name_found = false;
...@@ -324,7 +326,7 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index, ...@@ -324,7 +326,7 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
struct device *parent, struct device *host_dev) struct device *parent, struct device *host_dev)
{ {
struct dsa_chip_data *cd = dst->pd->chip + index; struct dsa_chip_data *cd = dst->pd->chip + index;
struct dsa_switch_ops *ops; const struct dsa_switch_ops *ops;
struct dsa_switch *ds; struct dsa_switch *ds;
int ret; int ret;
const char *name; const char *name;
......
...@@ -86,7 +86,7 @@ static umode_t dsa_hwmon_attrs_visible(struct kobject *kobj, ...@@ -86,7 +86,7 @@ static umode_t dsa_hwmon_attrs_visible(struct kobject *kobj,
{ {
struct device *dev = container_of(kobj, struct device, kobj); struct device *dev = container_of(kobj, struct device, kobj);
struct dsa_switch *ds = dev_get_drvdata(dev); struct dsa_switch *ds = dev_get_drvdata(dev);
struct dsa_switch_ops *ops = ds->ops; const struct dsa_switch_ops *ops = ds->ops;
umode_t mode = attr->mode; umode_t mode = attr->mode;
if (index == 1) { if (index == 1) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment