#include <linux/netdevice.h>
#include <net/dsa.h>
#include <linux/if_bridge.h>
#include "qca8k.h"
#define MIB_DESC(_s, _o, _n) …
const struct qca8k_mib_desc ar8327_mib[] = …;
int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val)
{ … }
int qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val)
{ … }
int qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val)
{ … }
static const struct regmap_range qca8k_readable_ranges[] = …;
const struct regmap_access_table qca8k_readable_table = …;
static int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask)
{ … }
static int qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb)
{ … }
static void qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask,
const u8 *mac, u8 aging)
{ … }
static int qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd,
int port)
{ … }
static int qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb,
int port)
{ … }
static int qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac,
u16 port_mask, u16 vid, u8 aging)
{ … }
static int qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac,
u16 port_mask, u16 vid)
{ … }
void qca8k_fdb_flush(struct qca8k_priv *priv)
{ … }
static int qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask,
const u8 *mac, u16 vid, u8 aging)
{ … }
static int qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask,
const u8 *mac, u16 vid)
{ … }
static int qca8k_vlan_access(struct qca8k_priv *priv,
enum qca8k_vlan_cmd cmd, u16 vid)
{ … }
static int qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid,
bool untagged)
{ … }
static int qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid)
{ … }
int qca8k_mib_init(struct qca8k_priv *priv)
{ … }
void qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable)
{ … }
void qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset,
uint8_t *data)
{ … }
void qca8k_get_ethtool_stats(struct dsa_switch *ds, int port,
uint64_t *data)
{ … }
int qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset)
{ … }
int qca8k_set_mac_eee(struct dsa_switch *ds, int port,
struct ethtool_keee *eee)
{ … }
int qca8k_get_mac_eee(struct dsa_switch *ds, int port,
struct ethtool_keee *e)
{ … }
static int qca8k_port_configure_learning(struct dsa_switch *ds, int port,
bool learning)
{ … }
void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
{ … }
static int qca8k_update_port_member(struct qca8k_priv *priv, int port,
const struct net_device *bridge_dev,
bool join)
{ … }
int qca8k_port_pre_bridge_flags(struct dsa_switch *ds, int port,
struct switchdev_brport_flags flags,
struct netlink_ext_ack *extack)
{ … }
int qca8k_port_bridge_flags(struct dsa_switch *ds, int port,
struct switchdev_brport_flags flags,
struct netlink_ext_ack *extack)
{ … }
int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
struct dsa_bridge bridge,
bool *tx_fwd_offload,
struct netlink_ext_ack *extack)
{ … }
void qca8k_port_bridge_leave(struct dsa_switch *ds, int port,
struct dsa_bridge bridge)
{ … }
void qca8k_port_fast_age(struct dsa_switch *ds, int port)
{ … }
int qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
{ … }
int qca8k_port_enable(struct dsa_switch *ds, int port,
struct phy_device *phy)
{ … }
void qca8k_port_disable(struct dsa_switch *ds, int port)
{ … }
int qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
{ … }
int qca8k_port_max_mtu(struct dsa_switch *ds, int port)
{ … }
int qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr,
u16 port_mask, u16 vid)
{ … }
int qca8k_port_fdb_add(struct dsa_switch *ds, int port,
const unsigned char *addr, u16 vid,
struct dsa_db db)
{ … }
int qca8k_port_fdb_del(struct dsa_switch *ds, int port,
const unsigned char *addr, u16 vid,
struct dsa_db db)
{ … }
int qca8k_port_fdb_dump(struct dsa_switch *ds, int port,
dsa_fdb_dump_cb_t *cb, void *data)
{ … }
int qca8k_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb,
struct dsa_db db)
{ … }
int qca8k_port_mdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb,
struct dsa_db db)
{ … }
int qca8k_port_mirror_add(struct dsa_switch *ds, int port,
struct dsa_mall_mirror_tc_entry *mirror,
bool ingress, struct netlink_ext_ack *extack)
{ … }
void qca8k_port_mirror_del(struct dsa_switch *ds, int port,
struct dsa_mall_mirror_tc_entry *mirror)
{ … }
int qca8k_port_vlan_filtering(struct dsa_switch *ds, int port,
bool vlan_filtering,
struct netlink_ext_ack *extack)
{ … }
int qca8k_port_vlan_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack)
{ … }
int qca8k_port_vlan_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan)
{ … }
static bool qca8k_lag_can_offload(struct dsa_switch *ds,
struct dsa_lag lag,
struct netdev_lag_upper_info *info,
struct netlink_ext_ack *extack)
{ … }
static int qca8k_lag_setup_hash(struct dsa_switch *ds,
struct dsa_lag lag,
struct netdev_lag_upper_info *info)
{ … }
static int qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port,
struct dsa_lag lag, bool delete)
{ … }
int qca8k_port_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag,
struct netdev_lag_upper_info *info,
struct netlink_ext_ack *extack)
{ … }
int qca8k_port_lag_leave(struct dsa_switch *ds, int port,
struct dsa_lag lag)
{ … }
int qca8k_read_switch_id(struct qca8k_priv *priv)
{ … }