ionic: get MTU from lif identity
authorShannon Nelson <snelson@pensando.io>
Tue, 21 Jul 2020 20:34:04 +0000 (13:34 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jul 2020 01:36:34 +0000 (18:36 -0700)
Change from using hardcoded MTU limits and instead use the
firmware defined limits. The value from the LIF attributes is
the frame size, so we take off the header size to convert to
MTU size.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_dev.h
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_lif.h

index 525434f10025a603e02f8cdaa1d4c008b4198928..d5cba502abca0f5b7153960cbfd2c1e7369f8846 100644 (file)
@@ -10,8 +10,6 @@
 #include "ionic_if.h"
 #include "ionic_regs.h"
 
-#define IONIC_MIN_MTU                  ETH_MIN_MTU
-#define IONIC_MAX_MTU                  9194
 #define IONIC_MAX_TX_DESC              8192
 #define IONIC_MAX_RX_DESC              16384
 #define IONIC_MIN_TXRX_DESC            16
index f49486b6d04d263d02af3f20620314d2faeaca60..cfcef41b7b236e5e1b646a231e59630efb1d88d7 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/dynamic_debug.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/if_vlan.h>
 #include <linux/rtnetlink.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
@@ -2022,11 +2023,16 @@ reset_out:
 static struct ionic_lif *ionic_lif_alloc(struct ionic *ionic, unsigned int index)
 {
        struct device *dev = ionic->dev;
+       union ionic_lif_identity *lid;
        struct net_device *netdev;
        struct ionic_lif *lif;
        int tbl_sz;
        int err;
 
+       lid = kzalloc(sizeof(*lid), GFP_KERNEL);
+       if (!lid)
+               return ERR_PTR(-ENOMEM);
+
        netdev = alloc_etherdev_mqs(sizeof(*lif),
                                    ionic->ntxqs_per_lif, ionic->ntxqs_per_lif);
        if (!netdev) {
@@ -2045,8 +2051,12 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic *ionic, unsigned int index
        netdev->watchdog_timeo = 2 * HZ;
        netif_carrier_off(netdev);
 
-       netdev->min_mtu = IONIC_MIN_MTU;
-       netdev->max_mtu = IONIC_MAX_MTU;
+       lif->identity = lid;
+       lif->lif_type = IONIC_LIF_TYPE_CLASSIC;
+       ionic_lif_identify(ionic, lif->lif_type, lif->identity);
+       lif->netdev->min_mtu = le32_to_cpu(lif->identity->eth.min_frame_size);
+       lif->netdev->max_mtu =
+               le32_to_cpu(lif->identity->eth.max_frame_size) - ETH_HLEN - VLAN_HLEN;
 
        lif->neqs = ionic->neqs_per_lif;
        lif->nxqs = ionic->ntxqs_per_lif;
@@ -2113,6 +2123,7 @@ err_out_free_lif_info:
 err_out_free_netdev:
        free_netdev(lif->netdev);
        lif = NULL;
+       kfree(lid);
 
        return ERR_PTR(err);
 }
@@ -2132,7 +2143,6 @@ int ionic_lifs_alloc(struct ionic *ionic)
                return -ENOMEM;
        }
 
-       lif->lif_type = IONIC_LIF_TYPE_CLASSIC;
        ionic_lif_queue_identify(lif);
 
        return 0;
@@ -2243,6 +2253,7 @@ static void ionic_lif_free(struct ionic_lif *lif)
                ionic_lif_reset(lif);
 
        /* free lif info */
+       kfree(lif->identity);
        dma_free_coherent(dev, lif->info_sz, lif->info, lif->info_pa);
        lif->info = NULL;
        lif->info_pa = 0;
index ed126dd74e01fdcc43785318f63e0f5e480dafa2..949f96dc9cd8eabf9c508f213b2cf2e264f5329a 100644 (file)
@@ -184,6 +184,7 @@ struct ionic_lif {
        u16 lif_type;
        unsigned int nucast;
 
+       union ionic_lif_identity *identity;
        struct ionic_lif_info *info;
        dma_addr_t info_pa;
        u32 info_sz;