net/qede: set MTU
authorSony Chacko <sony.chacko@qlogic.com>
Thu, 16 Jun 2016 05:47:07 +0000 (22:47 -0700)
committerBruce Richardson <bruce.richardson@intel.com>
Thu, 23 Jun 2016 14:26:48 +0000 (16:26 +0200)
Signed-off-by: Sony Chacko <sony.chacko@qlogic.com>
[NIC overview doc update]
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
doc/guides/nics/overview.rst
drivers/net/qede/qede_ethdev.c

index d28c271..2105b2e 100644 (file)
@@ -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
index 3754454..af16277 100644 (file)
@@ -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)