bgmac: configure MTU and add support for frames beyond 8192 byte size
authorMurali Krishna Policharla <murali.policharla@broadcom.com>
Fri, 27 Mar 2020 19:55:41 +0000 (21:55 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Mar 2020 23:07:24 +0000 (16:07 -0700)
Change DMA descriptor length to handle jumbo frames beyond 8192 bytes.
Also update jumbo frame max size to include FCS, the DMA packet length
received includes FCS.

Signed-off-by: Murali Krishna Policharla <murali.policharla@broadcom.com>
Reviewed-by: Arun Parameswaran <arun.parameswaran@broadcom.com>
Reviewed-by: Ray Jui <ray.jui@broadcom.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bgmac.c
drivers/net/ethernet/broadcom/bgmac.h

index 1bb07a5..98ec1b8 100644 (file)
@@ -1248,6 +1248,14 @@ static int bgmac_set_mac_address(struct net_device *net_dev, void *addr)
        return 0;
 }
 
+static int bgmac_change_mtu(struct net_device *net_dev, int mtu)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+
+       bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + mtu);
+       return 0;
+}
+
 static const struct net_device_ops bgmac_netdev_ops = {
        .ndo_open               = bgmac_open,
        .ndo_stop               = bgmac_stop,
@@ -1256,6 +1264,7 @@ static const struct net_device_ops bgmac_netdev_ops = {
        .ndo_set_mac_address    = bgmac_set_mac_address,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_do_ioctl           = phy_do_ioctl_running,
+       .ndo_change_mtu         = bgmac_change_mtu,
 };
 
 /**************************************************
@@ -1530,6 +1539,9 @@ int bgmac_enet_probe(struct bgmac *bgmac)
        net_dev->hw_features = net_dev->features;
        net_dev->vlan_features = net_dev->features;
 
+       /* Omit FCS from max MTU size */
+       net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;
+
        err = register_netdev(bgmac->net_dev);
        if (err) {
                dev_err(bgmac->dev, "Cannot register net device\n");
index 40d02fe..351c598 100644 (file)
 #define BGMAC_DESC_CTL0_IOC                    0x20000000      /* IRQ on complete */
 #define BGMAC_DESC_CTL0_EOF                    0x40000000      /* End of frame */
 #define BGMAC_DESC_CTL0_SOF                    0x80000000      /* Start of frame */
-#define BGMAC_DESC_CTL1_LEN                    0x00001FFF
+#define BGMAC_DESC_CTL1_LEN                    0x00003FFF
 
 #define BGMAC_PHY_NOREGS                       BRCM_PSEUDO_PHY_ADDR
 #define BGMAC_PHY_MASK                         0x1F
 #define BGMAC_RX_FRAME_OFFSET                  30              /* There are 2 unused bytes between header and real data */
 #define BGMAC_RX_BUF_OFFSET                    (NET_SKB_PAD + NET_IP_ALIGN - \
                                                 BGMAC_RX_FRAME_OFFSET)
-#define BGMAC_RX_MAX_FRAME_SIZE                        1536            /* Copied from b44/tg3 */
+/* Jumbo frame size with FCS */
+#define BGMAC_RX_MAX_FRAME_SIZE                        9724
 #define BGMAC_RX_BUF_SIZE                      (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
 #define BGMAC_RX_ALLOC_SIZE                    (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE + BGMAC_RX_BUF_OFFSET) + \
                                                 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))