From 200645ac79092415e0bd4a1a85fe376b0406ca92 Mon Sep 17 00:00:00 2001 From: Sony Chacko Date: Wed, 15 Jun 2016 22:47:07 -0700 Subject: [PATCH] net/qede: set MTU Signed-off-by: Sony Chacko [NIC overview doc update] Signed-off-by: Bruce Richardson --- doc/guides/nics/overview.rst | 2 +- drivers/net/qede/qede_ethdev.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/overview.rst b/doc/guides/nics/overview.rst index d28c271e80..2105b2eb0e 100644 --- a/doc/guides/nics/overview.rst +++ b/doc/guides/nics/overview.rst @@ -92,7 +92,7 @@ Most of these differences are summarized below. Queue status event Y Rx interrupt Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Queue start/stop Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - MTU update Y Y Y Y Y Y Y Y Y Y Y + MTU update Y Y Y Y Y Y Y Y Y Y Y Y Y Jumbo frame Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Scattered Rx Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y LRO Y Y Y Y diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 37544546a2..af162772e2 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -885,6 +885,38 @@ int qede_rss_reta_query(struct rte_eth_dev *eth_dev, return 0; } +int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) +{ + uint32_t frame_size; + struct qede_dev *qdev = dev->data->dev_private; + struct rte_eth_dev_info dev_info = {0}; + + qede_dev_info_get(dev, &dev_info); + + /* VLAN_TAG = 4 */ + frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + 4; + + if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) + return -EINVAL; + + if (!dev->data->scattered_rx && + frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) + return -EINVAL; + + if (frame_size > ETHER_MAX_LEN) + dev->data->dev_conf.rxmode.jumbo_frame = 1; + else + dev->data->dev_conf.rxmode.jumbo_frame = 0; + + /* update max frame size */ + dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size; + qdev->mtu = mtu; + qede_dev_stop(dev); + qede_dev_start(dev); + + return 0; +} + static const struct eth_dev_ops qede_eth_dev_ops = { .dev_configure = qede_dev_configure, .dev_infos_get = qede_dev_info_get, @@ -916,6 +948,7 @@ static const struct eth_dev_ops qede_eth_dev_ops = { .rss_hash_conf_get = qede_rss_hash_conf_get, .reta_update = qede_rss_reta_update, .reta_query = qede_rss_reta_query, + .mtu_set = qede_set_mtu, }; static const struct eth_dev_ops qede_eth_vf_dev_ops = { @@ -944,6 +977,7 @@ static const struct eth_dev_ops qede_eth_vf_dev_ops = { .rss_hash_conf_get = qede_rss_hash_conf_get, .reta_update = qede_rss_reta_update, .reta_query = qede_rss_reta_query, + .mtu_set = qede_set_mtu, }; static void qede_update_pf_params(struct ecore_dev *edev) -- 2.20.1