}
 
 /* Uses synchronous mcc */
-int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size)
+int be_cmd_get_fat_dump_len(struct be_adapter *adapter, u32 *dump_size)
 {
-       struct be_mcc_wrb *wrb;
+       struct be_mcc_wrb wrb = {0};
        struct be_cmd_req_get_fat *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
-
-       wrb = wrb_from_mccq(adapter);
-       if (!wrb) {
-               status = -EBUSY;
-               goto err;
-       }
-       req = embedded_payload(wrb);
+       req = embedded_payload(&wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_MANAGE_FAT, sizeof(*req), wrb,
-                              NULL);
+                              OPCODE_COMMON_MANAGE_FAT, sizeof(*req),
+                              &wrb, NULL);
        req->fat_operation = cpu_to_le32(QUERY_FAT);
-       status = be_mcc_notify_wait(adapter);
+       status = be_cmd_notify_wait(adapter, &wrb);
        if (!status) {
-               struct be_cmd_resp_get_fat *resp = embedded_payload(wrb);
+               struct be_cmd_resp_get_fat *resp = embedded_payload(&wrb);
 
-               if (log_size && resp->log_size)
-                       *log_size = le32_to_cpu(resp->log_size) -
+               if (dump_size && resp->log_size)
+                       *dump_size = le32_to_cpu(resp->log_size) -
                                        sizeof(u32);
        }
-err:
-       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
-int be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
+int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
 {
        struct be_dma_mem get_fat_cmd;
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_get_fat *req;
        u32 offset = 0, total_size, buf_size,
                                log_offset = sizeof(u32), payload_len;
-       int status = 0;
+       int status;
 
        if (buf_len == 0)
-               return -EIO;
+               return 0;
 
        total_size = buf_len;
 
        get_fat_cmd.va = dma_zalloc_coherent(&adapter->pdev->dev,
                                             get_fat_cmd.size,
                                             &get_fat_cmd.dma, GFP_ATOMIC);
-       if (!get_fat_cmd.va) {
-               dev_err(&adapter->pdev->dev,
-                       "Memory allocation failure while reading FAT data\n");
+       if (!get_fat_cmd.va)
                return -ENOMEM;
-       }
 
        spin_lock_bh(&adapter->mcc_lock);
 
 
 void be_detect_error(struct be_adapter *adapter);
 int be_cmd_get_die_temperature(struct be_adapter *adapter);
 int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
+int be_cmd_get_fat_dump_len(struct be_adapter *adapter, u32 *dump_size);
+int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf);
 int be_cmd_req_native_mode(struct be_adapter *adapter);
-int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
-int be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
 int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
                             u32 domain);
 int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
 
        return data_read;
 }
 
+static int be_get_dump_len(struct be_adapter *adapter)
+{
+       u32 dump_size = 0;
+
+       if (lancer_chip(adapter))
+               dump_size = lancer_cmd_get_file_len(adapter,
+                                                   LANCER_FW_DUMP_FILE);
+       else
+               dump_size = adapter->fat_dump_len;
+
+       return dump_size;
+}
+
 static int lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name,
                                u32 buf_len, void *buf)
 {
        return status;
 }
 
-static int be_get_reg_len(struct net_device *netdev)
+static int be_read_dump_data(struct be_adapter *adapter, u32 dump_len,
+                            void *buf)
 {
-       struct be_adapter *adapter = netdev_priv(netdev);
-       u32 log_size = 0;
-
-       if (!check_privilege(adapter, MAX_PRIVILEGES))
-               return 0;
-
-       if (be_physfn(adapter)) {
-               if (lancer_chip(adapter))
-                       log_size = lancer_cmd_get_file_len(adapter,
-                                                          LANCER_FW_DUMP_FILE);
-               else
-                       be_cmd_get_reg_len(adapter, &log_size);
-       }
-       return log_size;
-}
+       int status = 0;
 
-static void
-be_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buf)
-{
-       struct be_adapter *adapter = netdev_priv(netdev);
+       if (lancer_chip(adapter))
+               status = lancer_cmd_read_file(adapter, LANCER_FW_DUMP_FILE,
+                                             dump_len, buf);
+       else
+               status = be_cmd_get_fat_dump(adapter, dump_len, buf);
 
-       if (be_physfn(adapter)) {
-               memset(buf, 0, regs->len);
-               if (lancer_chip(adapter))
-                       lancer_cmd_read_file(adapter, LANCER_FW_DUMP_FILE,
-                                            regs->len, buf);
-               else
-                       be_cmd_get_regs(adapter, regs->len, buf);
-       }
+       return status;
 }
 
 static int be_get_coalesce(struct net_device *netdev,
        return be_load_fw(adapter, efl->data);
 }
 
+static int
+be_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump)
+{
+       struct be_adapter *adapter = netdev_priv(netdev);
+
+       if (!check_privilege(adapter, MAX_PRIVILEGES))
+               return -EOPNOTSUPP;
+
+       dump->len = be_get_dump_len(adapter);
+       dump->version = 1;
+       dump->flag = 0x1;       /* FW dump is enabled */
+       return 0;
+}
+
+static int
+be_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
+                void *buf)
+{
+       struct be_adapter *adapter = netdev_priv(netdev);
+       int status;
+
+       if (!check_privilege(adapter, MAX_PRIVILEGES))
+               return -EOPNOTSUPP;
+
+       status = be_read_dump_data(adapter, dump->len, buf);
+       return be_cmd_status(status);
+}
+
 static int be_get_eeprom_len(struct net_device *netdev)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
        .set_msglevel = be_set_msg_level,
        .get_sset_count = be_get_sset_count,
        .get_ethtool_stats = be_get_ethtool_stats,
-       .get_regs_len = be_get_reg_len,
-       .get_regs = be_get_regs,
        .flash_device = be_do_flash,
        .self_test = be_self_test,
        .get_rxnfc = be_get_rxnfc,
        .get_rxfh_key_size = be_get_rxfh_key_size,
        .get_rxfh = be_get_rxfh,
        .set_rxfh = be_set_rxfh,
+       .get_dump_flag = be_get_dump_flag,
+       .get_dump_data = be_get_dump_data,
        .get_channels = be_get_channels,
        .set_channels = be_set_channels,
        .get_module_info = be_get_module_info,