#include <linux/dsa/ocelot.h>
#include <linux/if_bridge.h>
#include <linux/of_net.h>
#include <linux/phy/phy.h>
#include <net/pkt_cls.h>
#include "ocelot.h"
#include "ocelot_police.h"
#include "ocelot_vcap.h"
#include "ocelot_fdma.h"
#define OCELOT_MAC_QUIRKS …
struct ocelot_dump_ctx { … };
static bool ocelot_netdevice_dev_check(const struct net_device *dev);
static struct ocelot *devlink_port_to_ocelot(struct devlink_port *dlp)
{ … }
static int devlink_port_to_port(struct devlink_port *dlp)
{ … }
static int ocelot_devlink_sb_pool_get(struct devlink *dl,
unsigned int sb_index, u16 pool_index,
struct devlink_sb_pool_info *pool_info)
{ … }
static int ocelot_devlink_sb_pool_set(struct devlink *dl, unsigned int sb_index,
u16 pool_index, u32 size,
enum devlink_sb_threshold_type threshold_type,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_devlink_sb_port_pool_get(struct devlink_port *dlp,
unsigned int sb_index, u16 pool_index,
u32 *p_threshold)
{ … }
static int ocelot_devlink_sb_port_pool_set(struct devlink_port *dlp,
unsigned int sb_index, u16 pool_index,
u32 threshold,
struct netlink_ext_ack *extack)
{ … }
static int
ocelot_devlink_sb_tc_pool_bind_get(struct devlink_port *dlp,
unsigned int sb_index, u16 tc_index,
enum devlink_sb_pool_type pool_type,
u16 *p_pool_index, u32 *p_threshold)
{ … }
static int
ocelot_devlink_sb_tc_pool_bind_set(struct devlink_port *dlp,
unsigned int sb_index, u16 tc_index,
enum devlink_sb_pool_type pool_type,
u16 pool_index, u32 threshold,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_devlink_sb_occ_snapshot(struct devlink *dl,
unsigned int sb_index)
{ … }
static int ocelot_devlink_sb_occ_max_clear(struct devlink *dl,
unsigned int sb_index)
{ … }
static int ocelot_devlink_sb_occ_port_pool_get(struct devlink_port *dlp,
unsigned int sb_index,
u16 pool_index, u32 *p_cur,
u32 *p_max)
{ … }
static int
ocelot_devlink_sb_occ_tc_port_bind_get(struct devlink_port *dlp,
unsigned int sb_index, u16 tc_index,
enum devlink_sb_pool_type pool_type,
u32 *p_cur, u32 *p_max)
{ … }
const struct devlink_ops ocelot_devlink_ops = …;
int ocelot_port_devlink_init(struct ocelot *ocelot, int port,
enum devlink_port_flavour flavour)
{ … }
void ocelot_port_devlink_teardown(struct ocelot *ocelot, int port)
{ … }
int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv,
struct flow_cls_offload *f,
bool ingress)
{ … }
static int ocelot_setup_tc_cls_matchall_police(struct ocelot_port_private *priv,
struct tc_cls_matchall_offload *f,
bool ingress,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_setup_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
struct tc_cls_matchall_offload *f,
bool ingress,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_del_tc_cls_matchall_police(struct ocelot_port_private *priv,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_del_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
bool ingress,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
struct tc_cls_matchall_offload *f,
bool ingress)
{ … }
static int ocelot_setup_tc_block_cb(enum tc_setup_type type,
void *type_data,
void *cb_priv, bool ingress)
{ … }
static int ocelot_setup_tc_block_cb_ig(enum tc_setup_type type,
void *type_data,
void *cb_priv)
{ … }
static int ocelot_setup_tc_block_cb_eg(enum tc_setup_type type,
void *type_data,
void *cb_priv)
{ … }
static LIST_HEAD(ocelot_block_cb_list);
static int ocelot_setup_tc_block(struct ocelot_port_private *priv,
struct flow_block_offload *f)
{ … }
static int ocelot_setup_tc(struct net_device *dev, enum tc_setup_type type,
void *type_data)
{ … }
static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid,
bool untagged)
{ … }
static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid)
{ … }
static int ocelot_port_open(struct net_device *dev)
{ … }
static int ocelot_port_stop(struct net_device *dev)
{ … }
static netdev_tx_t ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev)
{ … }
enum ocelot_action_type { … };
struct ocelot_mact_work_ctx { … };
#define ocelot_work_to_ctx(x) …
static void ocelot_mact_work(struct work_struct *work)
{ … }
static int ocelot_enqueue_mact_action(struct ocelot *ocelot,
const struct ocelot_mact_work_ctx *ctx)
{ … }
static int ocelot_mc_unsync(struct net_device *dev, const unsigned char *addr)
{ … }
static int ocelot_mc_sync(struct net_device *dev, const unsigned char *addr)
{ … }
static void ocelot_set_rx_mode(struct net_device *dev)
{ … }
static int ocelot_port_set_mac_address(struct net_device *dev, void *p)
{ … }
static void ocelot_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats)
{ … }
static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
const unsigned char *addr,
u16 vid, u16 flags,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
const unsigned char *addr, u16 vid,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_port_fdb_do_dump(const unsigned char *addr, u16 vid,
bool is_static, void *data)
{ … }
static int ocelot_port_fdb_dump(struct sk_buff *skb,
struct netlink_callback *cb,
struct net_device *dev,
struct net_device *filter_dev, int *idx)
{ … }
static int ocelot_vlan_rx_add_vid(struct net_device *dev, __be16 proto,
u16 vid)
{ … }
static int ocelot_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
u16 vid)
{ … }
static void ocelot_vlan_mode(struct ocelot *ocelot, int port,
netdev_features_t features)
{ … }
static int ocelot_set_features(struct net_device *dev,
netdev_features_t features)
{ … }
static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{ … }
static int ocelot_change_mtu(struct net_device *dev, int new_mtu)
{ … }
static const struct net_device_ops ocelot_port_netdev_ops = …;
struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port)
{ … }
static bool ocelot_netdevice_dev_check(const struct net_device *dev)
{ … }
int ocelot_netdev_to_port(struct net_device *dev)
{ … }
static void ocelot_port_get_strings(struct net_device *netdev, u32 sset,
u8 *data)
{ … }
static void ocelot_port_get_ethtool_stats(struct net_device *dev,
struct ethtool_stats *stats,
u64 *data)
{ … }
static int ocelot_port_get_sset_count(struct net_device *dev, int sset)
{ … }
static int ocelot_port_get_ts_info(struct net_device *dev,
struct kernel_ethtool_ts_info *info)
{ … }
static const struct ethtool_ops ocelot_ethtool_ops = …;
static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port,
u8 state)
{ … }
static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port,
unsigned long ageing_clock_t)
{ … }
static void ocelot_port_attr_mc_set(struct ocelot *ocelot, int port, bool mc)
{ … }
static int ocelot_port_attr_set(struct net_device *dev, const void *ctx,
const struct switchdev_attr *attr,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_vlan_vid_prepare(struct net_device *dev, u16 vid, bool pvid,
bool untagged, struct netlink_ext_ack *extack)
{ … }
static int ocelot_port_obj_add_vlan(struct net_device *dev,
const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_port_obj_add_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb)
{ … }
static int ocelot_port_obj_del_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb)
{ … }
static int ocelot_port_obj_mrp_add(struct net_device *dev,
const struct switchdev_obj_mrp *mrp)
{ … }
static int ocelot_port_obj_mrp_del(struct net_device *dev,
const struct switchdev_obj_mrp *mrp)
{ … }
static int
ocelot_port_obj_mrp_add_ring_role(struct net_device *dev,
const struct switchdev_obj_ring_role_mrp *mrp)
{ … }
static int
ocelot_port_obj_mrp_del_ring_role(struct net_device *dev,
const struct switchdev_obj_ring_role_mrp *mrp)
{ … }
static int ocelot_port_obj_add(struct net_device *dev, const void *ctx,
const struct switchdev_obj *obj,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_port_obj_del(struct net_device *dev, const void *ctx,
const struct switchdev_obj *obj)
{ … }
static void ocelot_inherit_brport_flags(struct ocelot *ocelot, int port,
struct net_device *brport_dev)
{ … }
static void ocelot_clear_brport_flags(struct ocelot *ocelot, int port)
{ … }
static int ocelot_switchdev_sync(struct ocelot *ocelot, int port,
struct net_device *brport_dev,
struct net_device *bridge_dev,
struct netlink_ext_ack *extack)
{ … }
static int ocelot_switchdev_unsync(struct ocelot *ocelot, int port)
{ … }
static int ocelot_bridge_num_get(struct ocelot *ocelot,
const struct net_device *bridge_dev)
{ … }
static void ocelot_bridge_num_put(struct ocelot *ocelot,
const struct net_device *bridge_dev,
int bridge_num)
{ … }
static int ocelot_netdevice_bridge_join(struct net_device *dev,
struct net_device *brport_dev,
struct net_device *bridge,
struct netlink_ext_ack *extack)
{ … }
static void ocelot_netdevice_pre_bridge_leave(struct net_device *dev,
struct net_device *brport_dev)
{ … }
static int ocelot_netdevice_bridge_leave(struct net_device *dev,
struct net_device *brport_dev,
struct net_device *bridge)
{ … }
static int ocelot_netdevice_lag_join(struct net_device *dev,
struct net_device *bond,
struct netdev_lag_upper_info *info,
struct netlink_ext_ack *extack)
{ … }
static void ocelot_netdevice_pre_lag_leave(struct net_device *dev,
struct net_device *bond)
{ … }
static int ocelot_netdevice_lag_leave(struct net_device *dev,
struct net_device *bond)
{ … }
static int ocelot_netdevice_changeupper(struct net_device *dev,
struct net_device *brport_dev,
struct netdev_notifier_changeupper_info *info)
{ … }
static int
ocelot_netdevice_lag_changeupper(struct net_device *dev,
struct netdev_notifier_changeupper_info *info)
{ … }
static int
ocelot_netdevice_prechangeupper(struct net_device *dev,
struct net_device *brport_dev,
struct netdev_notifier_changeupper_info *info)
{ … }
static int
ocelot_netdevice_lag_prechangeupper(struct net_device *dev,
struct netdev_notifier_changeupper_info *info)
{ … }
static int
ocelot_netdevice_changelowerstate(struct net_device *dev,
struct netdev_lag_lower_state_info *info)
{ … }
static int ocelot_netdevice_event(struct notifier_block *unused,
unsigned long event, void *ptr)
{ … }
struct notifier_block ocelot_netdevice_nb __read_mostly = …;
static int ocelot_switchdev_event(struct notifier_block *unused,
unsigned long event, void *ptr)
{ … }
struct notifier_block ocelot_switchdev_nb __read_mostly = …;
static int ocelot_switchdev_blocking_event(struct notifier_block *unused,
unsigned long event, void *ptr)
{ … }
struct notifier_block ocelot_switchdev_blocking_nb __read_mostly = …;
static void vsc7514_phylink_mac_config(struct phylink_config *config,
unsigned int link_an_mode,
const struct phylink_link_state *state)
{ … }
static void vsc7514_phylink_mac_link_down(struct phylink_config *config,
unsigned int link_an_mode,
phy_interface_t interface)
{ … }
static void vsc7514_phylink_mac_link_up(struct phylink_config *config,
struct phy_device *phydev,
unsigned int link_an_mode,
phy_interface_t interface,
int speed, int duplex,
bool tx_pause, bool rx_pause)
{ … }
static const struct phylink_mac_ops ocelot_phylink_ops = …;
static int ocelot_port_phylink_create(struct ocelot *ocelot, int port,
struct device_node *portnp)
{ … }
int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
struct device_node *portnp)
{ … }
void ocelot_release_port(struct ocelot_port *ocelot_port)
{ … }