-int
-ar8xxx_sw_get_port_stats(struct switch_dev *dev, int port,
- struct switch_port_stats *stats)
-{
- struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev);
- u64 *mib_stats;
- int ret;
- int mib_txb_id, mib_rxb_id;
-
- if (!ar8xxx_has_mib_counters(priv))
- return -EOPNOTSUPP;
-
- if (port >= dev->ports)
- return -EINVAL;
-
- switch (priv->chip_ver) {
- case AR8XXX_VER_AR8216:
- mib_txb_id = AR8216_MIB_TXB_ID;
- mib_rxb_id = AR8216_MIB_RXB_ID;
- break;
- case AR8XXX_VER_AR8236:
- case AR8XXX_VER_AR8316:
- case AR8XXX_VER_AR8327:
- case AR8XXX_VER_AR8337:
- mib_txb_id = AR8236_MIB_TXB_ID;
- mib_rxb_id = AR8236_MIB_RXB_ID;
- break;
- default:
- return -EOPNOTSUPP;
- }
-
- mutex_lock(&priv->mib_lock);
- ret = ar8xxx_mib_capture(priv);
- if (ret)
- goto unlock;
-
- ar8xxx_mib_fetch_port_stat(priv, port, false);
-
- mib_stats = &priv->mib_stats[port * priv->chip->num_mibs];
-
- stats->tx_bytes = mib_stats[mib_txb_id];
- stats->rx_bytes = mib_stats[mib_rxb_id];
-
- ret = 0;
-
-unlock:
- mutex_unlock(&priv->mib_lock);
- return ret;
-}
-