* DPDK callback to change the MTU. * * Setting the MTU affects hardware MRU (packets larger than the MRU * will be dropped). * * @param dev * Pointer to Ethernet device structure. * @param mtu * New MTU. * * @return * 0 on success, negative error value otherwise. */
| 551 | * 0 on success, negative error value otherwise. |
| 552 | */ |
| 553 | static int |
| 554 | mrvl_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) |
| 555 | { |
| 556 | struct mrvl_priv *priv = dev->data->dev_private; |
| 557 | uint16_t mru; |
| 558 | uint16_t mbuf_data_size = 0; /* SW buffer size */ |
| 559 | int ret; |
| 560 | |
| 561 | mru = MRVL_PP2_MTU_TO_MRU(mtu); |
| 562 | /* |
| 563 | * min_rx_buf_size is equal to mbuf data size |
| 564 | * if pmd didn't set it differently |
| 565 | */ |
| 566 | mbuf_data_size = dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM; |
| 567 | /* Prevent PMD from: |
| 568 | * - setting mru greater than the mbuf size resulting in |
| 569 | * hw and sw buffer size mismatch |
| 570 | * - setting mtu that requires the support of scattered packets |
| 571 | * when this feature has not been enabled/supported so far |
| 572 | * (TODO check scattered_rx flag here once scattered RX is supported). |
| 573 | */ |
| 574 | if (mru - RTE_ETHER_CRC_LEN + MRVL_PKT_OFFS > mbuf_data_size) { |
| 575 | mru = mbuf_data_size + RTE_ETHER_CRC_LEN - MRVL_PKT_OFFS; |
| 576 | mtu = MRVL_PP2_MRU_TO_MTU(mru); |
| 577 | MRVL_LOG(WARNING, "MTU too big, max MTU possible limited " |
| 578 | "by current mbuf size: %u. Set MTU to %u, MRU to %u", |
| 579 | mbuf_data_size, mtu, mru); |
| 580 | } |
| 581 | |
| 582 | if (mtu < RTE_ETHER_MIN_MTU || mru > MRVL_PKT_SIZE_MAX) { |
| 583 | MRVL_LOG(ERR, "Invalid MTU [%u] or MRU [%u]", mtu, mru); |
| 584 | return -EINVAL; |
| 585 | } |
| 586 | |
| 587 | if (!priv->ppio) |
| 588 | return 0; |
| 589 | |
| 590 | ret = pp2_ppio_set_mru(priv->ppio, mru); |
| 591 | if (ret) { |
| 592 | MRVL_LOG(ERR, "Failed to change MRU"); |
| 593 | return ret; |
| 594 | } |
| 595 | |
| 596 | ret = pp2_ppio_set_mtu(priv->ppio, mtu); |
| 597 | if (ret) { |
| 598 | MRVL_LOG(ERR, "Failed to change MTU"); |
| 599 | return ret; |
| 600 | } |
| 601 | |
| 602 | return 0; |
| 603 | } |
| 604 | |
| 605 | /** |
| 606 | * DPDK callback to bring the link up. |
no outgoing calls
no test coverage detected