|
19 | 19 | #include "stmmac.h"
|
20 | 20 | #include "dwmac_dma.h"
|
21 | 21 | #include "dwxgmac2.h"
|
| 22 | +#include "dwmac5.h" |
22 | 23 |
|
23 | 24 | #define REG_SPACE_SIZE 0x1060
|
24 | 25 | #define GMAC4_REG_SPACE_SIZE 0x116C
|
@@ -1263,6 +1264,98 @@ static int stmmac_set_tunable(struct net_device *dev,
|
1263 | 1264 | return ret;
|
1264 | 1265 | }
|
1265 | 1266 |
|
| 1267 | +static int stmmac_get_mm(struct net_device *ndev, |
| 1268 | + struct ethtool_mm_state *state) |
| 1269 | +{ |
| 1270 | + struct stmmac_priv *priv = netdev_priv(ndev); |
| 1271 | + unsigned long flags; |
| 1272 | + u32 frag_size; |
| 1273 | + |
| 1274 | + if (!priv->dma_cap.fpesel) |
| 1275 | + return -EOPNOTSUPP; |
| 1276 | + |
| 1277 | + spin_lock_irqsave(&priv->fpe_cfg.lock, flags); |
| 1278 | + |
| 1279 | + state->max_verify_time = STMMAC_FPE_MM_MAX_VERIFY_TIME_MS; |
| 1280 | + state->verify_enabled = priv->fpe_cfg.verify_enabled; |
| 1281 | + state->pmac_enabled = priv->fpe_cfg.pmac_enabled; |
| 1282 | + state->verify_time = priv->fpe_cfg.verify_time; |
| 1283 | + state->tx_enabled = priv->fpe_cfg.tx_enabled; |
| 1284 | + state->verify_status = priv->fpe_cfg.status; |
| 1285 | + state->rx_min_frag_size = ETH_ZLEN; |
| 1286 | + |
| 1287 | + /* FPE active if common tx_enabled and |
| 1288 | + * (verification success or disabled(forced)) |
| 1289 | + */ |
| 1290 | + if (state->tx_enabled && |
| 1291 | + (state->verify_status == ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED || |
| 1292 | + state->verify_status == ETHTOOL_MM_VERIFY_STATUS_DISABLED)) |
| 1293 | + state->tx_active = true; |
| 1294 | + else |
| 1295 | + state->tx_active = false; |
| 1296 | + |
| 1297 | + frag_size = stmmac_fpe_get_add_frag_size(priv, priv->ioaddr); |
| 1298 | + state->tx_min_frag_size = ethtool_mm_frag_size_add_to_min(frag_size); |
| 1299 | + |
| 1300 | + spin_unlock_irqrestore(&priv->fpe_cfg.lock, flags); |
| 1301 | + |
| 1302 | + return 0; |
| 1303 | +} |
| 1304 | + |
| 1305 | +static int stmmac_set_mm(struct net_device *ndev, struct ethtool_mm_cfg *cfg, |
| 1306 | + struct netlink_ext_ack *extack) |
| 1307 | +{ |
| 1308 | + struct stmmac_priv *priv = netdev_priv(ndev); |
| 1309 | + struct stmmac_fpe_cfg *fpe_cfg = &priv->fpe_cfg; |
| 1310 | + unsigned long flags; |
| 1311 | + u32 frag_size; |
| 1312 | + int err; |
| 1313 | + |
| 1314 | + err = ethtool_mm_frag_size_min_to_add(cfg->tx_min_frag_size, |
| 1315 | + &frag_size, extack); |
| 1316 | + if (err) |
| 1317 | + return err; |
| 1318 | + |
| 1319 | + /* Wait for the verification that's currently in progress to finish */ |
| 1320 | + timer_shutdown_sync(&fpe_cfg->verify_timer); |
| 1321 | + |
| 1322 | + spin_lock_irqsave(&fpe_cfg->lock, flags); |
| 1323 | + |
| 1324 | + fpe_cfg->verify_enabled = cfg->verify_enabled; |
| 1325 | + fpe_cfg->pmac_enabled = cfg->pmac_enabled; |
| 1326 | + fpe_cfg->verify_time = cfg->verify_time; |
| 1327 | + fpe_cfg->tx_enabled = cfg->tx_enabled; |
| 1328 | + |
| 1329 | + if (!cfg->verify_enabled) |
| 1330 | + fpe_cfg->status = ETHTOOL_MM_VERIFY_STATUS_DISABLED; |
| 1331 | + |
| 1332 | + stmmac_fpe_set_add_frag_size(priv, priv->ioaddr, frag_size); |
| 1333 | + stmmac_fpe_apply(priv); |
| 1334 | + |
| 1335 | + spin_unlock_irqrestore(&fpe_cfg->lock, flags); |
| 1336 | + |
| 1337 | + return 0; |
| 1338 | +} |
| 1339 | + |
| 1340 | +static void stmmac_get_mm_stats(struct net_device *ndev, |
| 1341 | + struct ethtool_mm_stats *s) |
| 1342 | +{ |
| 1343 | + struct stmmac_priv *priv = netdev_priv(ndev); |
| 1344 | + struct stmmac_counters *mmc = &priv->mmc; |
| 1345 | + |
| 1346 | + if (!priv->dma_cap.rmon) |
| 1347 | + return; |
| 1348 | + |
| 1349 | + stmmac_mmc_read(priv, priv->mmcaddr, mmc); |
| 1350 | + |
| 1351 | + s->MACMergeFrameAssErrorCount = mmc->mmc_rx_packet_assembly_err_cntr; |
| 1352 | + s->MACMergeFrameAssOkCount = mmc->mmc_rx_packet_assembly_ok_cntr; |
| 1353 | + s->MACMergeFrameSmdErrorCount = mmc->mmc_rx_packet_smd_err_cntr; |
| 1354 | + s->MACMergeFragCountRx = mmc->mmc_rx_fpe_fragment_cntr; |
| 1355 | + s->MACMergeFragCountTx = mmc->mmc_tx_fpe_fragment_cntr; |
| 1356 | + s->MACMergeHoldCount = mmc->mmc_tx_hold_req_cntr; |
| 1357 | +} |
| 1358 | + |
1266 | 1359 | static const struct ethtool_ops stmmac_ethtool_ops = {
|
1267 | 1360 | .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
|
1268 | 1361 | ETHTOOL_COALESCE_MAX_FRAMES,
|
@@ -1301,6 +1394,9 @@ static const struct ethtool_ops stmmac_ethtool_ops = {
|
1301 | 1394 | .set_tunable = stmmac_set_tunable,
|
1302 | 1395 | .get_link_ksettings = stmmac_ethtool_get_link_ksettings,
|
1303 | 1396 | .set_link_ksettings = stmmac_ethtool_set_link_ksettings,
|
| 1397 | + .get_mm = stmmac_get_mm, |
| 1398 | + .set_mm = stmmac_set_mm, |
| 1399 | + .get_mm_stats = stmmac_get_mm_stats, |
1304 | 1400 | };
|
1305 | 1401 |
|
1306 | 1402 | void stmmac_set_ethtool_ops(struct net_device *netdev)
|
|
0 commit comments