"Coupled-Function",
 };
 
+enum qede_ethtool_tests {
+       QEDE_ETHTOOL_INTERRUPT_TEST,
+       QEDE_ETHTOOL_MEMORY_TEST,
+       QEDE_ETHTOOL_REGISTER_TEST,
+       QEDE_ETHTOOL_CLOCK_TEST,
+       QEDE_ETHTOOL_TEST_MAX
+};
+
+static const char qede_tests_str_arr[QEDE_ETHTOOL_TEST_MAX][ETH_GSTRING_LEN] = {
+       "Interrupt (online)\t",
+       "Memory (online)\t\t",
+       "Register (online)\t",
+       "Clock (online)\t\t",
+};
+
 static void qede_get_strings_stats(struct qede_dev *edev, u8 *buf)
 {
        int i, j, k;
                memcpy(buf, qede_private_arr,
                       ETH_GSTRING_LEN * QEDE_PRI_FLAG_LEN);
                break;
+       case ETH_SS_TEST:
+               memcpy(buf, qede_tests_str_arr,
+                      ETH_GSTRING_LEN * QEDE_ETHTOOL_TEST_MAX);
+               break;
        default:
                DP_VERBOSE(edev, QED_MSG_DEBUG,
                           "Unsupported stringset 0x%08x\n", stringset);
                return num_stats + QEDE_NUM_RQSTATS;
        case ETH_SS_PRIV_FLAGS:
                return QEDE_PRI_FLAG_LEN;
-
+       case ETH_SS_TEST:
+               return QEDE_ETHTOOL_TEST_MAX;
        default:
                DP_VERBOSE(edev, QED_MSG_DEBUG,
                           "Unsupported stringset 0x%08x\n", stringset);
        return 0;
 }
 
+static void qede_self_test(struct net_device *dev,
+                          struct ethtool_test *etest, u64 *buf)
+{
+       struct qede_dev *edev = netdev_priv(dev);
+
+       DP_VERBOSE(edev, QED_MSG_DEBUG,
+                  "Self-test command parameters: offline = %d, external_lb = %d\n",
+                  (etest->flags & ETH_TEST_FL_OFFLINE),
+                  (etest->flags & ETH_TEST_FL_EXTERNAL_LB) >> 2);
+
+       memset(buf, 0, sizeof(u64) * QEDE_ETHTOOL_TEST_MAX);
+
+       if (edev->ops->common->selftest->selftest_interrupt(edev->cdev)) {
+               buf[QEDE_ETHTOOL_INTERRUPT_TEST] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+
+       if (edev->ops->common->selftest->selftest_memory(edev->cdev)) {
+               buf[QEDE_ETHTOOL_MEMORY_TEST] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+
+       if (edev->ops->common->selftest->selftest_register(edev->cdev)) {
+               buf[QEDE_ETHTOOL_REGISTER_TEST] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+
+       if (edev->ops->common->selftest->selftest_clock(edev->cdev)) {
+               buf[QEDE_ETHTOOL_CLOCK_TEST] = 1;
+               etest->flags |= ETH_TEST_FL_FAILED;
+       }
+}
+
 static const struct ethtool_ops qede_ethtool_ops = {
        .get_settings = qede_get_settings,
        .set_settings = qede_set_settings,
        .set_rxfh = qede_set_rxfh,
        .get_channels = qede_get_channels,
        .set_channels = qede_set_channels,
+       .self_test = qede_self_test,
 };
 
 void qede_set_ethtool_ops(struct net_device *dev)