static void bcm_sf2_sw_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data) { struct bcm_sf2_priv *priv = ds_to_priv(ds); const struct bcm_sf2_hw_stats *s; unsigned int i; u64 val = 0; u32 offset; mutex_lock(&priv->stats_mutex); /* Now fetch the per-port counters */ for (i = 0; i < BCM_SF2_STATS_SIZE; i++) { s = &bcm_sf2_mib[i]; /* Do a latched 64-bit read if needed */ offset = s->reg + CORE_P_MIB_OFFSET(port); if (s->sizeof_stat == 8) val = core_readq(priv, offset); else val = core_readl(priv, offset); data[i] = (u64)val; } mutex_unlock(&priv->stats_mutex); }
static int bcm_sf2_arl_read(struct bcm_sf2_priv *priv, u64 mac, u16 vid, struct bcm_sf2_arl_entry *ent, u8 *idx, bool is_valid) { unsigned int i; int ret; ret = bcm_sf2_arl_op_wait(priv); if (ret) return ret; /* Read the 4 bins */ for (i = 0; i < 4; i++) { u64 mac_vid; u32 fwd_entry; mac_vid = core_readq(priv, CORE_ARLA_MACVID_ENTRY(i)); fwd_entry = core_readl(priv, CORE_ARLA_FWD_ENTRY(i)); bcm_sf2_arl_to_entry(ent, mac_vid, fwd_entry); if (ent->is_valid && is_valid) { *idx = i; return 0; } /* This is the MAC we just deleted */ if (!is_valid && (mac_vid & mac)) return 0; } return -ENOENT; }
static int bcm_sf2_core_read64(struct b53_device *dev, u8 page, u8 reg, u64 *val) { struct bcm_sf2_priv *priv = dev->priv; *val = core_readq(priv, SF2_PAGE_REG_MKADDR(page, reg)); return 0; }
static void bcm_sf2_arl_search_rd(struct bcm_sf2_priv *priv, u8 idx, struct bcm_sf2_arl_entry *ent) { u64 mac_vid; u32 fwd_entry; mac_vid = core_readq(priv, CORE_ARLA_SRCH_RSLT_MACVID(idx)); fwd_entry = core_readl(priv, CORE_ARLA_SRCH_RSLT(idx)); bcm_sf2_arl_to_entry(ent, mac_vid, fwd_entry); }