#include <linux/platform_device.h>
#include <linux/netdevice.h>
#include <linux/phy.h>
#include <linux/phy_fixed.h>
#include <linux/export.h>
#include <linux/ethtool.h>
#include <linux/workqueue.h>
#include <linux/module.h>
#include <linux/if_bridge.h>
#include <linux/dsa/loop.h>
#include <net/dsa.h>
#include "dsa_loop.h"
static struct dsa_loop_mib_entry dsa_loop_mibs[] = …;
static struct phy_device *phydevs[PHY_MAX_ADDR];
enum dsa_loop_devlink_resource_id { … };
static u64 dsa_loop_devlink_vtu_get(void *priv)
{ … }
static int dsa_loop_setup_devlink_resources(struct dsa_switch *ds)
{ … }
static enum dsa_tag_protocol dsa_loop_get_protocol(struct dsa_switch *ds,
int port,
enum dsa_tag_protocol mp)
{ … }
static int dsa_loop_setup(struct dsa_switch *ds)
{ … }
static void dsa_loop_teardown(struct dsa_switch *ds)
{ … }
static int dsa_loop_get_sset_count(struct dsa_switch *ds, int port, int sset)
{ … }
static void dsa_loop_get_strings(struct dsa_switch *ds, int port,
u32 stringset, uint8_t *data)
{ … }
static void dsa_loop_get_ethtool_stats(struct dsa_switch *ds, int port,
uint64_t *data)
{ … }
static int dsa_loop_phy_read(struct dsa_switch *ds, int port, int regnum)
{ … }
static int dsa_loop_phy_write(struct dsa_switch *ds, int port,
int regnum, u16 value)
{ … }
static int dsa_loop_port_bridge_join(struct dsa_switch *ds, int port,
struct dsa_bridge bridge,
bool *tx_fwd_offload,
struct netlink_ext_ack *extack)
{ … }
static void dsa_loop_port_bridge_leave(struct dsa_switch *ds, int port,
struct dsa_bridge bridge)
{ … }
static void dsa_loop_port_stp_state_set(struct dsa_switch *ds, int port,
u8 state)
{ … }
static int dsa_loop_port_vlan_filtering(struct dsa_switch *ds, int port,
bool vlan_filtering,
struct netlink_ext_ack *extack)
{ … }
static int dsa_loop_port_vlan_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack)
{ … }
static int dsa_loop_port_vlan_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan)
{ … }
static int dsa_loop_port_change_mtu(struct dsa_switch *ds, int port,
int new_mtu)
{ … }
static int dsa_loop_port_max_mtu(struct dsa_switch *ds, int port)
{ … }
static void dsa_loop_phylink_get_caps(struct dsa_switch *dsa, int port,
struct phylink_config *config)
{ … }
static const struct dsa_switch_ops dsa_loop_driver = …;
static int dsa_loop_drv_probe(struct mdio_device *mdiodev)
{ … }
static void dsa_loop_drv_remove(struct mdio_device *mdiodev)
{ … }
static void dsa_loop_drv_shutdown(struct mdio_device *mdiodev)
{ … }
static struct mdio_driver dsa_loop_drv = …;
#define NUM_FIXED_PHYS …
static void dsa_loop_phydevs_unregister(void)
{ … }
static int __init dsa_loop_init(void)
{ … }
module_init(…) …;
static void __exit dsa_loop_exit(void)
{ … }
module_exit(dsa_loop_exit);
MODULE_SOFTDEP(…) …;
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;