#define _QLCNIC_LINUX_MAJOR 5
 #define _QLCNIC_LINUX_MINOR 0
-#define _QLCNIC_LINUX_SUBVERSION 19
-#define QLCNIC_LINUX_VERSIONID  "5.0.19"
+#define _QLCNIC_LINUX_SUBVERSION 20
+#define QLCNIC_LINUX_VERSIONID  "5.0.20"
 #define QLCNIC_DRV_IDC_VER  0x01
 #define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
                 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
 #define QLCNIC_IP_DOWN         3
 
 #define QLCNIC_ILB_MODE                0x1
+#define QLCNIC_ELB_MODE                0x2
 
 #define QLCNIC_LINKEVENT       0x1
 #define QLCNIC_LB_RESPONSE     0x2
 
        "Register_Test_on_offline",
        "Link_Test_on_offline",
        "Interrupt_Test_offline",
-       "Loopback_Test_offline"
+       "Internal_Loopback_offline",
+       "External_Loopback_offline"
 };
 
 #define QLCNIC_TEST_LEN        ARRAY_SIZE(qlcnic_gstrings_test)
        return memcmp(data, buff, QLCNIC_ILB_PKT_SIZE);
 }
 
-static int qlcnic_do_ilb_test(struct qlcnic_adapter *adapter)
+static int qlcnic_do_lb_test(struct qlcnic_adapter *adapter)
 {
        struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
        struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0];
                dev_kfree_skb_any(skb);
 
                if (!adapter->diag_cnt)
-                       dev_warn(&adapter->pdev->dev, "ILB Test: %dth packet"
+                       dev_warn(&adapter->pdev->dev, "LB Test: %dth packet"
                                " not recevied\n", i + 1);
                else
                        cnt++;
        }
        if (cnt != i) {
-               dev_warn(&adapter->pdev->dev, "ILB Test failed\n");
+               dev_warn(&adapter->pdev->dev, "LB Test failed\n");
                return -1;
        }
        return 0;
 }
 
-static int qlcnic_iloopback_test(struct net_device *netdev)
+static int qlcnic_loopback_test(struct net_device *netdev, u8 mode)
 {
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
        int max_sds_rings = adapter->max_sds_rings;
        int loop = 0;
        int ret;
 
-       netdev_info(netdev, "%s:  in progress\n", __func__);
+       netdev_info(netdev, "%s loopback test in progress\n",
+                  mode == QLCNIC_ILB_MODE ? "internal" : "external");
        if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
                netdev_warn(netdev, "Loopback test not supported for non "
                                "privilege function\n");
 
        sds_ring = &adapter->recv_ctx->sds_rings[0];
 
-       ret = qlcnic_set_lb_mode(adapter, QLCNIC_ILB_MODE);
+       ret = qlcnic_set_lb_mode(adapter, mode);
        if (ret)
                goto free_res;
 
                goto free_res;
        }
 
-       ret = qlcnic_do_ilb_test(adapter);
+       ret = qlcnic_do_lb_test(adapter);
 
        qlcnic_clear_lb_mode(adapter);
 
                if (data[2])
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
-               data[3] = qlcnic_iloopback_test(dev);
+               data[3] = qlcnic_loopback_test(dev, QLCNIC_ILB_MODE);
                if (data[3])
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
+               if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) {
+                       data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE);
+                       if (data[4])
+                               eth_test->flags |= ETH_TEST_FL_FAILED;
+                       eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
+               }
        }
 }