/*
 * (C) Copyright 2008 - 2009
 * Windriver, <www.windriver.com>
 * Tom Rix <Tom.Rix@windriver.com>
 *
 * Copyright 2011 Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 *
 * Copyright 2014 Linaro, Ltd.
 * Rob Herring <robh@kernel.org>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */
#include <config.h>
#include <common.h>
#include <errno.h>
#include <malloc.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/composite.h>
#include <linux/compiler.h>
#include <version.h>
#include <g_dnl.h>
#include <asm/arch/cpu.h>
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
#include <fb_mmc.h>
#include <fb_storage.h>
#include <fb_fastboot.h>
#include <emmc_partitions.h>
#endif
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
#include <fb_nand.h>
#endif
#include <partition_table.h>
#include <android_image.h>
#include <image.h>
#ifdef CONFIG_AML_ANTIROLLBACK
#include <anti-rollback.h>
#endif
#include <zircon.h>
#include <zircon/hw/gpt.h>
#include <zircon_boot/zircon_boot.h>
#include <efi_loader.h>

#include <fastboot_usb.h>

DECLARE_GLOBAL_DATA_PTR;

#define FASTBOOT_VERSION		"0.4"

#define FASTBOOT_INTERFACE_CLASS	0xff
#define FASTBOOT_INTERFACE_SUB_CLASS	0x42
#define FASTBOOT_INTERFACE_PROTOCOL	0x03

#define ENDPOINT_MAXIMUM_PACKET_SIZE_2_0  (0x0200)

#ifdef CONFIG_DEVICE_PRODUCT
#define DEVICE_PRODUCT	CONFIG_DEVICE_PRODUCT
#endif

#define FB_ERR(fmt ...) printf("[ERR]%sL%d:", __func__, __LINE__),printf(fmt)
#define FB_MSG(fmt ...) printf("[MSG]"fmt)
#define FB_WRN(fmt ...) printf("[WRN]"fmt)
#define FB_DBG(...)
#define FB_HERE()    printf("f(%s)L%d\n", __func__, __LINE__)

extern void f_dwc_otg_pullup(int is_on);

#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
extern int is_partition_logical(const char *parition_name);
#endif

/* The 64 defined bytes plus \0 */

#define EP_BUFFER_SIZE	4096

static inline struct f_fastboot *func_to_fastboot(struct usb_function *f)
{
	return container_of(f, struct f_fastboot, usb_function);
}

static void fastboot_complete(struct usb_ep *ep, struct usb_request *req);
static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);

struct f_fastboot *fastboot_func;
static usb_req_cb in_req_completion_cb = fastboot_complete;
static usb_req_cb out_req_completion_cb = rx_handler_command;

int set_fastboot_usb_completion_cb(usb_req_cb out_req, usb_req_cb in_req) {
	// Disallow if Fastboot function is in operation.
	if (fastboot_func && fastboot_func->in_ep && fastboot_func->out_ep) {
		return -1;
	}
	out_req_completion_cb = out_req;
	in_req_completion_cb = in_req;
	return 0;
}

void reset_fastboot_usb_completion_cb(void) {
	in_req_completion_cb = fastboot_complete;
	out_req_completion_cb = rx_handler_command;
}

static unsigned int download_size;
static unsigned int download_bytes;


static struct usb_endpoint_descriptor ep_in = {
	.bLength            = USB_DT_ENDPOINT_SIZE,
	.bDescriptorType    = USB_DT_ENDPOINT,
	.bEndpointAddress   = USB_DIR_IN,
	.bmAttributes       = USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize     = ENDPOINT_MAXIMUM_PACKET_SIZE_2_0,
	.bInterval          = 0x00,
};

static struct usb_endpoint_descriptor ep_out = {
	.bLength		= USB_DT_ENDPOINT_SIZE,
	.bDescriptorType	= USB_DT_ENDPOINT,
	.bEndpointAddress	= USB_DIR_OUT,
	.bmAttributes		= USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize		= ENDPOINT_MAXIMUM_PACKET_SIZE_2_0,
	.bInterval		= 0x00,
};

static struct usb_interface_descriptor interface_desc = {
	.bLength		= USB_DT_INTERFACE_SIZE,
	.bDescriptorType	= USB_DT_INTERFACE,
	.bInterfaceNumber	= 0x00,
	.bAlternateSetting	= 0x00,
	.bNumEndpoints		= 0x02,
	.bInterfaceClass	= FASTBOOT_INTERFACE_CLASS,
	.bInterfaceSubClass	= FASTBOOT_INTERFACE_SUB_CLASS,
	.bInterfaceProtocol	= FASTBOOT_INTERFACE_PROTOCOL,
};

static struct usb_descriptor_header *fb_runtime_descs[] = {
	(struct usb_descriptor_header *)&interface_desc,
	(struct usb_descriptor_header *)&ep_in,
	(struct usb_descriptor_header *)&ep_out,
	NULL,
};

/*
 * static strings, in UTF-8
 */
static const char fastboot_name[] = "Android Fastboot";

static struct usb_string fastboot_string_defs[] = {
	[0].s = fastboot_name,
	{  }			/* end of list */
};

static struct usb_gadget_strings stringtab_fastboot = {
	.language	= 0x0409,	/* en-us */
	.strings	= fastboot_string_defs,
};

static struct usb_gadget_strings *fastboot_strings[] = {
	&stringtab_fastboot,
	NULL,
};

#define DRAM_UBOOT_RESERVE		0x01000000
unsigned int ddr_size_usable(unsigned int addr_start)
{
	unsigned int ddr_size=0;
	unsigned int free_size = 0;
	int i;

	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
		ddr_size += gd->bd->bi_dram[i].size;

	free_size = (ddr_size - DRAM_UBOOT_RESERVE - addr_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_MEM_TOP_HIDE);
#if defined CONFIG_FASTBOOT_MAX_DOWN_SIZE
	if (free_size > CONFIG_FASTBOOT_MAX_DOWN_SIZE)
		free_size = CONFIG_FASTBOOT_MAX_DOWN_SIZE;
#endif
	return free_size;
}

static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);

static char response_str[RESPONSE_LEN + 1];

void fastboot_fail(const char *s)
{
	strncpy(response_str, "FAIL", 5);
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}

void fastboot_okay(const char *s)
{
	strncpy(response_str, "OKAY", 5);
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}

void fastboot_busy(const char* s)
{
	strncpy(response_str, "INFO", 4 + 1);//add terminated 0
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}
int fastboot_is_busy(void)
{
	return !strncmp("INFO", response_str, strlen("INFO"));
}

//cb for bulk in_req->complete
static void fastboot_complete(struct usb_ep *ep, struct usb_request *req)
{
	int status = req->status;

	if ( fastboot_is_busy() && fastboot_func) {
		struct usb_ep* out_ep = fastboot_func->out_ep;
		struct usb_request* out_req = fastboot_func->out_req;
		rx_handler_command(out_ep, out_req);
		return;
	}
	if (!status)
		return;
	printf("status: %d ep '%s' trans: %d\n", status, ep->name, req->actual);
}

static int fastboot_bind(struct usb_configuration *c, struct usb_function *f)
{
	int id;
	struct usb_gadget *gadget = c->cdev->gadget;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	/* DYNAMIC interface numbers assignments */
	id = usb_interface_id(c, f);
	if (id < 0)
		return id;
	interface_desc.bInterfaceNumber = id;

	id = usb_string_id(c->cdev);
	if (id < 0)
		return id;
	fastboot_string_defs[0].id = id;
	interface_desc.iInterface = id;

	f_fb->in_ep = usb_ep_autoconfig(gadget, &ep_in);
	if (!f_fb->in_ep)
		return -ENODEV;
	f_fb->in_ep->driver_data = c->cdev;

	f_fb->out_ep = usb_ep_autoconfig(gadget, &ep_out);
	if (!f_fb->out_ep)
		return -ENODEV;
	f_fb->out_ep->driver_data = c->cdev;

	return 0;
}

static void fastboot_unbind(struct usb_configuration *c, struct usb_function *f)
{
	memset(fastboot_func, 0, sizeof(*fastboot_func));
}

static void fastboot_disable(struct usb_function *f)
{
	struct f_fastboot *f_fb = func_to_fastboot(f);

	usb_ep_disable(f_fb->out_ep);
	usb_ep_disable(f_fb->in_ep);

	if (f_fb->out_req) {
		free(f_fb->out_req->buf);
		usb_ep_free_request(f_fb->out_ep, f_fb->out_req);
		f_fb->out_req = NULL;
	}
	if (f_fb->in_req) {
		free(f_fb->in_req->buf);
		usb_ep_free_request(f_fb->in_ep, f_fb->in_req);
		f_fb->in_req = NULL;
	}
}

static struct usb_request *fastboot_start_ep(struct usb_ep *ep)
{
	struct usb_request *req;

	req = usb_ep_alloc_request(ep, 0);
	if (!req)
		return NULL;

	req->length = EP_BUFFER_SIZE;
	req->buf = memalign(CONFIG_SYS_CACHELINE_SIZE, EP_BUFFER_SIZE);
	if (!req->buf) {
		usb_ep_free_request(ep, req);
		return NULL;
	}

	memset(req->buf, 0, req->length);
	return req;
}

static int fastboot_set_alt(struct usb_function *f,
			    unsigned interface, unsigned alt)
{
	int ret;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	debug("%s: func: %s intf: %d alt: %d\n",
	      __func__, f->name, interface, alt);

	/* make sure we don't enable the ep twice */
	ret = usb_ep_enable(f_fb->out_ep, &ep_out);
	if (ret) {
		puts("failed to enable out ep\n");
		return ret;
	}

	f_fb->out_req = fastboot_start_ep(f_fb->out_ep);
	if (!f_fb->out_req) {
		puts("failed to alloc out req\n");
		ret = -EINVAL;
		goto err;
	}
	f_fb->out_req->complete = out_req_completion_cb;

	ret = usb_ep_enable(f_fb->in_ep, &ep_in);
	if (ret) {
		puts("failed to enable in ep\n");
		goto err;
	}

	f_fb->in_req = fastboot_start_ep(f_fb->in_ep);
	if (!f_fb->in_req) {
		puts("failed alloc req in\n");
		ret = -EINVAL;
		goto err;
	}
	f_fb->in_req->complete = in_req_completion_cb;

	ret = usb_ep_queue(f_fb->out_ep, f_fb->out_req, 0);
	if (ret)
		goto err;

	return 0;
err:
	fastboot_disable(f);
	return ret;
}

static int  fastboot_setup(struct usb_function *f,
	const struct usb_ctrlrequest *ctrl)
{
	int value = -EOPNOTSUPP;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	/* composite driver infrastructure handles everything; interface
	 * activation uses set_alt().
	 */
	if (((ctrl->bRequestType & USB_RECIP_MASK) == USB_RECIP_ENDPOINT)
		&& (ctrl->bRequest == USB_REQ_CLEAR_FEATURE)
		&& (ctrl->wValue== USB_ENDPOINT_HALT)) {
		switch (ctrl->wIndex & 0xfe) {
		case USB_DIR_OUT:
			value = ctrl->wLength;
			usb_ep_clear_halt(f_fb->out_ep);
			break;

		case USB_DIR_IN:
			value = ctrl->wLength;
			usb_ep_clear_halt(f_fb->in_ep);
			break;
		default:
			printf("unknown usb_ctrlrequest\n");
			break;
		}
	}

	return value;
}

static int fastboot_add(struct usb_configuration *c)
{
	struct f_fastboot *f_fb;
	int status;

	if (fastboot_func == NULL) {
		f_fb = memalign(CONFIG_SYS_CACHELINE_SIZE, sizeof(*f_fb));
		if (!f_fb)
			return -ENOMEM;

		fastboot_func = f_fb;
		memset(f_fb, 0, sizeof(*f_fb));
	} else {
		f_fb = fastboot_func;
	}

	f_fb->usb_function.name = "f_fastboot";
	f_fb->usb_function.hs_descriptors = fb_runtime_descs;
	f_fb->usb_function.bind = fastboot_bind;
	f_fb->usb_function.unbind = fastboot_unbind;
	f_fb->usb_function.set_alt = fastboot_set_alt;
	f_fb->usb_function.disable = fastboot_disable;
	f_fb->usb_function.strings = fastboot_strings;
	f_fb->usb_function.setup = fastboot_setup;

	status = usb_add_function(c, &f_fb->usb_function);
	if (status) {
		free(f_fb);
		fastboot_func = NULL;
	}

	return status;
}
DECLARE_GADGET_BIND_CALLBACK(usb_dnl_fastboot, fastboot_add);

static int fastboot_tx_write(const char *buffer, unsigned int buffer_size)
{
	struct usb_request *in_req = fastboot_func->in_req;
	int ret;

	memcpy(in_req->buf, buffer, buffer_size);
	in_req->length = buffer_size;
	ret = usb_ep_queue(fastboot_func->in_ep, in_req, 0);
	if (ret)
		printf("Error %d on queue\n", ret);
	return 0;
}

static int fastboot_tx_write_str(const char *buffer)
{
	return fastboot_tx_write(buffer, strlen(buffer));
}

static void compl_do_reboot(struct usb_ep *ep, struct usb_request *req)
{
	run_command("reboot", 0);
}

static void compl_do_reboot_bootloader(struct usb_ep *ep, struct usb_request *req)
{
	if (dynamic_partition)
		run_command("reboot bootloader", 0);
	else
		run_command("reboot fastboot", 0);
}

static void compl_do_reboot_recovery(struct usb_ep *ep,
				       struct usb_request *req)
{
	run_command("reboot recovery", 0);
}

static int strcmp_l1(const char *s1, const char *s2)
{
	if (!s1 || !s2) {
		return -1;
	}
	return strncmp(s1, s2, strlen(s1));
}

enum fastboot_locked_access {
	NONE = 0,
	WRITE = 1 << 0,
	ERASE = 1 << 1,
};

struct partition_info_t {
	const char *name;
	const char *alias; // Partition alias or NULL for none.
	uint8_t access; // Fastboot access level when locked.
};

static const struct partition_info_t partition_info[] = {
	// clang-format off
	{ GUID_BOOTLOADER_NAME,		NULL,		WRITE | ERASE },
	{ GPT_ZIRCON_A_NAME,		"boot_a",	WRITE | ERASE },
	{ GPT_ZIRCON_B_NAME,		"boot_b",	WRITE | ERASE },
	{ GPT_ZIRCON_R_NAME,		"boot_r",	WRITE | ERASE },
	{ GPT_VBMETA_A_NAME,		NULL,		WRITE | ERASE },
	{ GPT_VBMETA_B_NAME,		NULL,		WRITE | ERASE },
	{ GPT_VBMETA_R_NAME,		NULL,		WRITE | ERASE },
	// For Fuchsia the super partition doesn't use Android super format
	// but is just the FVM.
	{ GPT_FVM_NAME,			"super",	WRITE | ERASE },
	{ GPT_DURABLE_BOOT_NAME,	"misc",		ERASE },
	// `fastboot -w` flag triggers `erase userdata`; functionally this doesn't
	// apply for Fuchsia since userdata is stored in the FVM and we can't wipe
	// it separately, so for now we accept `erase userdata` but it's just a
	// no-op.
	{ "userdata",			NULL,		ERASE },
	// Upstream also aliases dts -> dtb, but we don't need this at the moment.
	// clang-format on
};

static uint8_t get_fastboot_lock_access(const char *part)
{
	for (size_t i = 0; i < ARRAY_SIZE(partition_info); i++) {
		if (strcmp(part, partition_info[i].name) == 0) {
			return partition_info[i].access;
		}
	}
	return NONE;
}

// Returns the real partition name for the given alias.
//
// We sometimes want to support flashing tools that have different expectations
// around partition names. This maps all supported partition names and aliases
// into the actual partition name.
//
// Returns NULL if the partition does not exist either in the GPT or the
// known partition list.
static const char *get_real_part_name(char *part)
{
	// If the partition exists in the GPT, it's the real name.
	if (find_mmc_partition_by_name(part)) {
		return part;
	}

	// Otherwise, try to find it in the known partition list.
	//
	// If a partition exists in the list we always allow it without checking
	// the GPT. This is to support virtual partitions e.g. "bootloader"
	// which aren't actually in the GPT, but it's still up to the caller to
	// handle the resulting partition properly.
	for (size_t i = 0; i < ARRAY_SIZE(partition_info); i++) {
		const struct partition_info_t *info = &partition_info[i];

		if (strcmp(info->name, part) == 0) {
			return part;
		}

		if (info->alias && strcmp(part, info->alias) == 0) {
			printf("Partition alias: %s -> %s\n", part, info->name);
			return info->name;
		}
	}

	return NULL;
}

// Returns true if `c` is a valid slot character (a, b, r).
static bool is_slot_char(char c)
{
	return c == 'a' || c == 'b' || c == 'r';
}

// Parses a partition name out of a fastboot command.
//
// On input `cmd` should be the command and partition name, e.g. "flash:foo".
// This string will be modified in-place, but the returned string may or may
// not point to this buffer.
//
// The returned string:
// * skips the leading command and colon
// * removes any partition double-slotting
// * calls `get_real_part_name()` to resolve aliases
//
// Double-slotted partitions (e.g. `zircon_a_a`) will drop the latter slot. This
// can happen when Fuchsia tooling explicitly provides a slot to fastboot via
// `fastboot flash <part>_a`, because fastboot itself will then query whether
// the partition is slotted and append another slot suffix if so.
//
// We may at some point want to fix fastboot to not append a suffix if the
// partition is already slotted, but working around it here is easier for now.
//
// On failure, this updates the fastboot TX buffer with a failure message and
// returns NULL.
static const char *parse_fb_cmd_partition(char *cmd)
{
	strsep(&cmd, ":");
	if (cmd == NULL) {
		fastboot_tx_write_str("FAILmissing partition name");
		return NULL;
	}

	// Check for a double-slotted partition. In this case we want to drop
	// the fastboot-appended suffix in favor of the suffix explicitly given
	// by the user.
	int part_len = strlen(cmd);
	if (part_len > 4) {
		char *suffix = &cmd[part_len - 4];
		if (suffix[0] == '_' && is_slot_char(suffix[1]) &&
		    suffix[2] == '_' && is_slot_char(suffix[3])) {
			printf("Partition slot fix: %s -> ", cmd);
			suffix[2] = '\0';
			printf("%s\n", cmd);
		}
	}

	const char *part = get_real_part_name(cmd);
	if (part == NULL) {
		fastboot_tx_write_str("FAILunknown partition");
		return NULL;
	}

	return part;
}

static void cb_reboot(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	if (!strcmp("reboot", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-bootloader", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot_bootloader;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-recovery", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot_recovery;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-fastboot", cmd)) {
		// TODO(b/285184591) support userspace flashing for "super"?
		fastboot_tx_write_str("FAILuserspace fastboot unsupported");
	} else {
		fastboot_tx_write_str("FAILunknown reboot command");
	}
}

void dump_lock_info(LockData_t* info)
{
	printf("info->version_major = %d\n", info->version_major);
	printf("info->version_minor = %d\n", info->version_minor);
	printf("info->lock_state = %d\n", info->lock_state);
	printf("info->lock_critical_state = %d\n", info->lock_critical_state);
	printf("info->lock_bootloader = %d\n", info->lock_bootloader);
}


static int check_lock(void)
{
	char *lock_s;
	LockData_t* info;

	lock_s = getenv("lock");
	if (!lock_s) {
		printf("lock state is NULL \n");
		lock_s = "10000000";
		setenv("lock", "10000000");
		run_command("defenv_reserv; saveenv;", 0);
	}
	FB_DBG("lock state: %s\n", lock_s);

	info = malloc(sizeof(struct LockData));
	if (info) {
		memset(info,0,LOCK_DATA_SIZE);
		info->version_major = (int)(lock_s[0] - '0');
		info->version_minor = (int)(lock_s[1] - '0');
		info->lock_state = (int)(lock_s[4] - '0');
		info->lock_critical_state = (int)(lock_s[5] - '0');
		info->lock_bootloader = (int)(lock_s[6] - '0');

		dump_lock_info(info);
	} else
		return 0;

	if ((info->lock_state == 1 ) || ( info->lock_critical_state == 1 )) {
		free (info);
		return 1;
	}
	else {
		free (info);
		return 0;
	}
}

static const char* getvar_list[] = {
	"version-baseband", "version-bootloader", "version", "hw-revision", "max-download-size",
	"serialno", "product", "off-mode-charge", "variant", "battery-soc-ok",
	"battery-voltage", "partition-type:boot", "partition-size:boot",
	"partition-type:system", "partition-size:system", "partition-type:vendor", "partition-size:vendor",
	"partition-type:odm", "partition-size:odm", "partition-type:data", "partition-size:data",
	"erase-block-size", "logical-block-size", "secure", "unlocked",
};

static const char* getvar_list_dynamic[] = {
	"hw-revision", "battery-voltage", "is-userspace", "is-logical:data",
	"is-logical:metadata", "is-logical:misc", "is-logical:super", "is-logical:boot",
	"is-logical:system", "is-logical:vendor", "is-logical:product", "is-logical:odm",
	"slot-count", "max-download-size", "serialno", "product", "unlocked", "has-slot:data",
	"has-slot:metadata", "has-slot:misc", "has-slot:super", "has-slot:boot",
	"has-slot:system", "has-slot:vendor", "has-slot:product", "has-slot:odm",
	"secure", "super-partition-name", "version-baseband", "version-bootloader",
	"partition-size:boot", "partition-size:metadata", "partition-size:misc",
	"partition-size:super", "partition-size:data", "version",
};

static const char *getvar_list_ab[] = {
	"current-slot",
	"has-slot:" GPT_DURABLE_BOOT_NAME,
	"has-slot:" GPT_FVM_NAME,
	// `has-slot` queries the generic base name without any slot suffix.
	"has-slot:vbmeta",
	"has-slot:zircon",
	"hw-revision",
	"is-userspace",
	"max-download-size",
	"partition-size:" GPT_DURABLE_BOOT_NAME,
	"partition-size:" GPT_FVM_NAME,
	"partition-size:" GPT_VBMETA_A_NAME,
	"partition-size:" GPT_VBMETA_B_NAME,
	"partition-size:" GPT_VBMETA_R_NAME,
	"partition-size:" GPT_ZIRCON_A_NAME,
	"partition-size:" GPT_ZIRCON_B_NAME,
	"partition-size:" GPT_ZIRCON_R_NAME,
	"product",
	"serialno",
	"slot-count",
	"slot-last-set-active",
	"slot-retry-count:a",
	"slot-retry-count:b",
	"slot-successful:a",
	"slot-successful:b",
	"slot-suffixes",
	"slot-unbootable:a",
	"slot-unbootable:b",
	"version",
	"version-bootloader",
	"vx-locked",
	"vx-unlockable",
};

extern ZirconBootOps zb_ops;

// Returns slot info for the given slot string "a" or "b", or NULL on failure.
// The returned struct is only valid until the next call to this function.
static AbrSlotInfo* get_slot_info(const char *suffix)
{
	AbrSlotIndex slot_index;
	if (strcmp(suffix, "a") == 0) {
		slot_index = kAbrSlotIndexA;
	} else if (strcmp(suffix, "b") == 0) {
		slot_index = kAbrSlotIndexB;
	} else {
		return NULL;
	}

	static AbrSlotInfo slot_info;
	AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
	if (AbrGetSlotInfo(&ops, slot_index, &slot_info) != kAbrResultOk) {
		return NULL;
	}

	return &slot_info;
}

static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char cmdBuf[RESPONSE_LEN];
	char* response = response_str;
	char *s1;
	size_t chars_left;

	strcpy(response, "OKAY");
	chars_left = sizeof(response_str) - strlen(response) - 1;

	memcpy(cmdBuf, cmd, strnlen(cmd, RESPONSE_LEN-1)+1);
	cmd = cmdBuf;
	strsep(&cmd, ":");
	FB_DBG("cb_getvar: %s\n", cmd);
	if (!cmd) {
		error("missing variable\n");
		fastboot_tx_write_str("FAILmissing var");
		return;
	}
	if (!strncmp(cmd, "all", 3)) {
		static int cmdIndex = 0;
		int getvar_num = 0;
		if (has_boot_slot == 1 && strlen(getvar_list_ab[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list_ab[cmdIndex]);
			getvar_num = (sizeof(getvar_list_ab) / sizeof(getvar_list_ab[0]));
		} else if (dynamic_partition && strlen(getvar_list_dynamic[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list_dynamic[cmdIndex]);//only support no-arg cmd
			getvar_num = (sizeof(getvar_list_dynamic) / sizeof(getvar_list_dynamic[0]));
		} else if (strlen(getvar_list[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list[cmdIndex]);//only support no-arg cmd
			getvar_num = (sizeof(getvar_list) / sizeof(getvar_list[0]));
		}
		FB_DBG("getvar_num: %d\n", getvar_num);
		if (++cmdIndex > getvar_num) {
			// Reset the index for the next `getvar all` and return
			// the final empty OKAY response to end the transaction.
			cmdIndex = 0;
			fastboot_tx_write_str(response);
			return;
		}
		fastboot_busy(NULL);
		FB_DBG("all cmd:%s\n", cmd);
		strncat(response, cmd, chars_left);
		strncat(response, ": ", 2);
		chars_left -= strlen(cmd) + 1;
	}

	if (!strcmp_l1("version-baseband", cmd)) {
		strncat(response, "N/A", chars_left);
	} else if (!strcmp_l1("version-bootloader", cmd) ||
		   !strcmp_l1("bootloader-version", cmd)) {
		strncat(response, U_BOOT_VERSION, chars_left);
	} else if (!strcmp_l1("hw-revision", cmd)) {
		strncat(response, "vim3", chars_left);
	} else if (!strcmp_l1("version", cmd)) {
		strncat(response, FASTBOOT_VERSION, chars_left);
	} else if (!strcmp_l1("off-mode-charge", cmd)) {
		strncat(response, "0", chars_left);
	} else if (!strcmp_l1("variant", cmd)) {
		strncat(response, "US", chars_left);
	} else if (!strcmp_l1("battery-soc-ok", cmd)) {
		strncat(response, "yes", chars_left);
	} else if (!strcmp_l1("battery-voltage", cmd)) {
		strncat(response, "4", chars_left);
	} else if (!strcmp_l1("is-userspace", cmd)) {
		strncat(response, "no", chars_left);
	} else if (!strcmp_l1("is-logical", cmd)) {
		strsep(&cmd, ":");
		printf("partition is %s\n", cmd);
		if (!dynamic_partition) {
			strncat(response, "no", chars_left);
		} else {
#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
			if (is_partition_logical(cmd) == 0) {
				error("%s is logic partition\n", cmd);
				strncat(response, "yes", chars_left);
			} else {
				strncat(response, "no", chars_left);
			}
#else
			strncat(response, "no", chars_left);
#endif
		}
	} else if (!strcmp_l1("super-partition-name", cmd)) {
		char *slot_name;
		slot_name = getenv("slot-suffixes");
		if (has_boot_slot == 0) {
			strncat(response, "super", chars_left);
		} else {
			printf("slot-suffixes: %s\n", slot_name);
			if (strcmp(slot_name, "0") == 0) {
				printf("active_slot is %s\n", "a");
				strncat(response, "super_a", chars_left);
			} else if (strcmp(slot_name, "1") == 0) {
				printf("active_slot is %s\n", "b");
				strncat(response, "super_b", chars_left);
			}
		}
	} else if (!strcmp_l1("downloadsize", cmd) ||
		!strcmp_l1("max-download-size", cmd)) {
		char str_num[12];

		sprintf(str_num, "0x%08x", ddr_size_usable(CONFIG_USB_FASTBOOT_BUF_ADDR));
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("serialno", cmd)) {
		// The reported serialno must be the same as what was registered
		// in the USB descriptor iSerial field, since that's how
		// fastboot discovers devices.
		strncat(response, g_dnl_get_serialnumber(), chars_left);
	} else if (!strcmp_l1("product", cmd)) {
#ifdef DEVICE_PRODUCT
		s1 = DEVICE_PRODUCT;
		FB_DBG("DEVICE_PRODUCT: %s\n", s1);
#else
		s1 = getenv("device_product");
		FB_DBG("device_product: %s\n", s1);
#endif
		strncat(response, s1, chars_left);
	} else if (!strcmp_l1("slot-count", cmd)) {
		strncat(response, "2", chars_left);
	} else if (!strcmp_l1("slot-suffixes", cmd)) {
		strncat(response, "a,b", chars_left);
	} else if (!strcmp_l1("current-slot", cmd)) {
		AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
		const char *slot =
			AbrGetSlotSuffix(AbrGetBootSlot(&ops, false, NULL));
		if (slot) {
			strncat(response, slot + 1, chars_left);
			FB_DBG("current-slot: %s\n", slot);
		}
	} else if (!strcmp_l1("slot-last-set-active", cmd)) {
		AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
		AbrSlotIndex slot_index;
		if (AbrGetSlotLastMarkedActive(&ops, &slot_index) !=
		    kAbrResultOk) {
			fastboot_fail("Failed to fetch last active slot");
		} else {
			const char *slot = AbrGetSlotSuffix(slot_index);
			strncat(response, slot + 1, chars_left);
		}
	} else if (!strcmp_l1("has-slot:", cmd)) {
		// Can't use `parse_fb_cmd_partition()` here because the
		// given name is unslotted which might not exist, e.g
		// "zircon" as opposed to "zircon_a".
		strsep(&cmd, ":");
		if (!cmd) {
			fastboot_tx_write_str("FAILmissing partition name");
			return;
		}

		char slotted_part[36];
		snprintf(slotted_part, sizeof(slotted_part), "%s_a", cmd);
		if (get_real_part_name(slotted_part)) {
			// If <part>_a exists then <part> supports slots.
			strncat(response, "yes", chars_left);
		} else if (get_real_part_name(cmd)) {
			// If only <part> exists it does not support slots.
			strncat(response, "no", chars_left);
		} else {
			// If neither exists it's an unknown partition.
			fastboot_tx_write_str("FAILunknown partition");
			return;
		}
	} else if (!strncmp("partition-size", cmd, strlen("partition-size"))) {
		char str_num[20];
		struct partitions *pPartition;
		uint64_t sz;

		const char *part = parse_fb_cmd_partition(cmd);
		if (!part) {
			return;
		}

		if (!strncmp("mbr", part, strlen("mbr"))) {
			strcpy(response, "FAILVariable not implemented");
		} else {
			if (!strcmp("bootloader", part)) {
				// boot0 and boot1 have the same size.
				mmc_boot_size("boot0", &sz);
				FB_DBG("size:%016llx\n", sz);
				sprintf(str_num, "%016llx", sz);
			} else {
				pPartition = find_mmc_partition_by_name(part);
				if (pPartition) {
					FB_DBG("size:%016llx\n", pPartition->size);
					if (strcmp(part, "data") == 0) {
						FB_DBG("reserve 0x4000 for fde data\n");
						sz = pPartition->size - 0x4000;
						FB_DBG("data size :%016llx\n", sz);
						sprintf(str_num, "%016llx", sz);
					} else {
						sprintf(str_num, "%016llx", pPartition->size);
					}
				} else {
					FB_DBG("find_mmc_partition_by_name fail\n");
					fastboot_tx_write_str(
						"FAILpartition does not exist");
					return;
				}
			}
			strncat(response, str_num, chars_left);
		}
	} else if (!strcmp_l1("partition-type:cache", cmd)) {
		if (has_boot_slot == 0) {
			strncat(response, "ext4", chars_left);
		}
	} else if (!strcmp_l1("partition-type:system", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:vendor", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:odm", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:tee", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:param", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:product", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:metadata", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strncmp("partition-type", cmd, strlen("partition-type"))) {
		strncat(response, "raw", chars_left);
	} else if (!strcmp_l1("erase-block-size", cmd) ||
		   !strcmp_l1("logical-block-size", cmd)) {
		strncat(response, "2000", chars_left);
	} else if (!strcmp_l1("secure", cmd)) {
		if (check_lock()) {
			strncat(response, "yes", chars_left);
		} else {
			strncat(response, "no", chars_left);
		}
	} else if (!strcmp_l1("unlocked", cmd)) {
		if (check_lock()) {
			strncat(response, "no", chars_left);
		} else {
			strncat(response, "yes", chars_left);
		}
	} else if (!strcmp_l1("slot-successful", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			strncat(response,
				slot_info->is_marked_successful ? "yes" : "no",
				chars_left);
		}
	} else if (!strcmp_l1("slot-unbootable", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			strncat(response, slot_info->is_bootable ? "no" : "yes",
				chars_left);
		}
	} else if (!strcmp_l1("slot-retry-count", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			char buf[4];
			sprintf(buf, "%d", slot_info->num_tries_remaining);
			strncat(response, buf, chars_left);
		}
	} else if (!strcmp_l1("vx-locked", cmd)) {
		// VIM3 is dev only. We don't consider any lock/unlock feature for now.
		strncat(response, "yes", chars_left);
	} else if (!strcmp_l1("bootloader-variant", cmd)) {
		strncat(response, "dev", chars_left);
	} else if (!strcmp_l1("vx-unlockable", cmd)) {
		strncat(response, "no", chars_left);
	} else {
		error("unknown variable: %s\n", cmd);
		strcpy(response, "FAILVariable not implemented");
	}

	fastboot_tx_write_str(response);
}

static unsigned int rx_bytes_expected(void)
{
	int rx_remain = download_size - download_bytes;
	if (rx_remain < 0)
		return 0;
	if (rx_remain > EP_BUFFER_SIZE)
		return EP_BUFFER_SIZE;
	return rx_remain;
}

#define BYTES_PER_DOT	0x20000
static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN];
	unsigned int transfer_size = download_size - download_bytes;
	const unsigned char *buffer = req->buf;
	unsigned int buffer_size = req->actual;
	unsigned int pre_dot_num, now_dot_num;

	if (req->status != 0) {
		printf("Bad status: %d\n", req->status);
		return;
	}

	if (buffer_size < transfer_size)
		transfer_size = buffer_size;

	memcpy((void *)CONFIG_USB_FASTBOOT_BUF_ADDR + download_bytes,
	       buffer, transfer_size);

	pre_dot_num = download_bytes / BYTES_PER_DOT;
	download_bytes += transfer_size;
	now_dot_num = download_bytes / BYTES_PER_DOT;

	if (pre_dot_num != now_dot_num) {
		putc('.');
		if (!(now_dot_num % 74))
			putc('\n');
	}

	/* Check if transfer is done */
	if (download_bytes >= download_size) {
		/*
		 * Reset global transfer variable, keep download_bytes because
		 * it will be used in the next possible flashing command
		 */
		download_size = 0;
		req->complete = rx_handler_command;
		req->length = EP_BUFFER_SIZE;

		sprintf(response, "OKAY");
		fastboot_tx_write_str(response);

		printf("\ndownloading of %u bytes finished\n", download_bytes);
	} else {
		req->length = rx_bytes_expected();
		if (req->length < ep->maxpacket)
			req->length = ep->maxpacket;
	}

	req->actual = 0;
	usb_ep_queue(ep, req, 0);
}

static void cb_download(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char response[RESPONSE_LEN];

	printf("cmd cb_download is %s\n", cmd);

	strsep(&cmd, ":");
	download_size = simple_strtoul(cmd, NULL, 16);
	download_bytes = 0;

	printf("Starting download of %u bytes\n", download_size);

	if (0 == download_size) {
		sprintf(response, "FAILdata invalid size");
	} else if (download_size > ddr_size_usable(CONFIG_USB_FASTBOOT_BUF_ADDR)) {
		download_size = 0;
		sprintf(response, "FAILdata too large");
	} else {
		sprintf(response, "DATA%08x", download_size);
		req->complete = rx_handler_dl_image;
		req->length = rx_bytes_expected();
		if (req->length < ep->maxpacket)
			req->length = ep->maxpacket;
	}
	fastboot_tx_write_str(response);
}

typedef struct andr_img_hdr boot_img_hdr;

static void do_bootm_on_complete(struct usb_ep *ep, struct usb_request *req)
{
	// Performs a full USB reset to remove the fastboot interface descriptor
	run_command("usb reset", 0);

	zircon_ram_boot();

	/* This only happens if image is somehow faulty so we start over */
	printf("Failed to boot RAM image; rebooting\n");
	do_reset(NULL, 0, 0, NULL);
}

static void cb_boot(struct usb_ep *ep, struct usb_request *req)
{
	if (zircon_ram_load((const void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
			    download_bytes) != 0) {
		fastboot_tx_write_str("FAILFailed to verify boot image");
		return;
	}

	fastboot_func->in_req->complete = do_bootm_on_complete;
	fastboot_tx_write_str("OKAY");
}

static void do_exit_on_complete(struct usb_ep *ep, struct usb_request *req)
{
	// Performs a full USB reset to remove the fastboot interface descriptor
	run_command("usb reset", 0);

	puts("Booting kernel..\n");
	run_command("run storeboot", 0);

	/* This only happens if image is somehow faulty so we start over */
	do_reset(NULL, 0, 0, NULL);
}


static void cb_continue(struct usb_ep *ep, struct usb_request *req)
{
	fastboot_func->in_req->complete = do_exit_on_complete;
	fastboot_tx_write_str("OKAY");
}

static void cb_flashing(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd;
	char* response = response_str;
	char* lock_s;
	LockData_t* info;
	size_t chars_left;
	char lock_d[LOCK_DATA_SIZE];

	lock_s = getenv("lock");
	if (!lock_s) {
		printf("lock state is NULL \n");
		strcpy(lock_d, "10000000");
		lock_s = "10000000";
		setenv("lock", "10000000");
		run_command("defenv_reserv; saveenv;", 0);
	} else {
		printf("lock state: %s\n", lock_s);
		if (strlen(lock_s) > 15)
			strncpy(lock_d, lock_s, 15);
		else
			strncpy(lock_d, lock_s, strlen(lock_s));
	}

	info = malloc(sizeof(struct LockData));
	if (!info) {
		error("malloc error\n");
		fastboot_tx_write_str("FAILmalloc error");
		return;
	}
	memset(info,0,LOCK_DATA_SIZE);
	info->version_major = (int)(lock_d[0] - '0');
	info->version_minor = (int)(lock_d[1] - '0');
	info->lock_state = (int)(lock_d[4] - '0');
	info->lock_critical_state = (int)(lock_d[5] - '0');
	info->lock_bootloader = (int)(lock_d[6] - '0');
	dump_lock_info(info);

	strcpy(response, "OKAY");
	chars_left = sizeof(response_str) - strlen(response) - 1;
	cmd = req->buf;
	strsep(&cmd, " ");
	printf("cb_flashing: %s\n", cmd);
	if (!cmd) {
		error("missing variable\n");
		fastboot_tx_write_str("FAILmissing var");
		free(info);
		return;
	}

	if (!strcmp_l1("unlock_critical", cmd)) {
		info->lock_critical_state = 0;
	} else if (!strcmp_l1("lock_critical", cmd)) {
		info->lock_critical_state = 1;
	} else if (!strcmp_l1("get_unlock_ability", cmd)) {
		char str_num[8];
		sprintf(str_num, "%d", info->lock_state);
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("get_unlock_bootloader_nonce", cmd)) {
		char str_num[8];
		sprintf(str_num, "%d", info->lock_critical_state);
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("unlock_bootloader", cmd)) {
		strncat(response, "please run flashing unlock & flashing unlock_critical before write", chars_left);
	} else if (!strcmp_l1("lock_bootloader", cmd)) {
		info->lock_bootloader = 1;
	} else if (!strcmp_l1("unlock", cmd)) {
		if (info->lock_state == 1 ) {
			char *avb_s;
			avb_s = getenv("avb2");
			if (avb_s == NULL) {
				run_command("get_avb_mode;", 0);
				avb_s = getenv("avb2");
			}
			printf("avb2: %s\n", avb_s);
			if (strcmp(avb_s, "1") == 0) {
#ifdef CONFIG_AML_ANTIROLLBACK
				if (avb_unlock()) {
					printf("unlocking device.  Erasing userdata partition!\n");
					run_command("store erase partition data", 0);
				} else {
					printf("unlock failed!\n");
				}
#else
				printf("unlocking device.  Erasing userdata partition!\n");
				run_command("store erase partition data", 0);
#endif
			}
		}
		info->lock_state = 0;
	} else if (!strcmp_l1("lock", cmd)) {
		if (info->lock_state == 0 ) {
			char *avb_s;
			avb_s = getenv("avb2");
			if (avb_s == NULL) {
				run_command("get_avb_mode;", 0);
				avb_s = getenv("avb2");
			}
			printf("avb2: %s\n", avb_s);
			if (strcmp(avb_s, "1") == 0) {
#ifdef CONFIG_AML_ANTIROLLBACK
				if (avb_lock()) {
					printf("lock failed!\n");
				} else {
					printf("locking device.  Erasing userdata partition!\n");
					run_command("store erase partition data", 0);
				}
#else
				printf("locking device.  Erasing userdata partition!\n");
				run_command("store erase partition data", 0);
#endif
			}
		}
		info->lock_state = 1;
	} else {
		error("unknown variable: %s\n", cmd);
		strcpy(response, "FAILVariable not implemented");
	}

	dump_lock_info(info);
	sprintf(lock_d, "%d%d00%d%d%d0", info->version_major, info->version_minor, info->lock_state, info->lock_critical_state, info->lock_bootloader);
	FB_DBG("lock_d state: %s\n", lock_d);
	setenv("lock", lock_d);
	run_command("defenv_reserv; saveenv;", 0);
	FB_DBG("response: %s\n", response);
	free(info);
	fastboot_tx_write_str(response);
}

#ifdef CONFIG_FASTBOOT_FLASH
static void cb_flash(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char* response = response_str;

	printf("cmd cb_flash is %s\n", cmd);
	const char *part = parse_fb_cmd_partition(cmd);
	if (!part) {
		return;
	}

	if (check_lock() && (get_fastboot_lock_access(part) & WRITE) == 0) {
		error("Cannot flash %s while locked\n", part);
		fastboot_tx_write_str("FAILlocked partition");
		return;
	}

#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
	if (dynamic_partition) {
		if (is_partition_logical(part) == 0) {
			error("%s is logic partition, can not write here.......\n",
			      part);
			fastboot_tx_write_str("FAILlogic partition");
			return;
		}
	}
#endif

	//strcpy(response, "FAILno flash device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_flash_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				   download_bytes);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_flash_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				    download_bytes);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}
#endif

static void cb_set_active(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	int ret = 0;

	printf("cmd cb_set_active is %s\n", cmd);
	strsep(&cmd, ":");
	if (!cmd) {
		error("missing slot name\n");
		fastboot_tx_write_str("FAILmissing slot name");
		return;
	}

	AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
	AbrSlotIndex slot;
	if (strcmp(cmd, "a") == 0) {
		slot = kAbrSlotIndexA;
	} else if (strcmp(cmd, "b") == 0) {
		slot = kAbrSlotIndexB;
	} else {
		printf("Cannot set slot %s active.\n", cmd);
		fastboot_tx_write_str("FAILunsupported slot");
		return;
	}

	AbrResult abr_res = AbrMarkSlotActive(&ops, slot);
	printf("abr_res = %d\n", ret);
	if (abr_res == kAbrResultOk)
		fastboot_tx_write_str("OKAY");
	else
		fastboot_tx_write_str("FAILset slot error");
}

static void cb_flashall(struct usb_ep *ep, struct usb_request *req)
{
	char* response = response_str;
	char *cmd = req->buf;

	printf("cmd cb_flashall is %s\n", cmd);

	if (check_lock()) {
		error("device is locked, can not run this cmd.Please flashing unlock & flashing unlock_critical\n");
		fastboot_tx_write_str("FAILlocked device");
		return;
	}

	//strcpy(response, "FAILno flash device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_flash_write(cmd, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				   download_bytes);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_flash_write(cmd, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
					download_bytes);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}

static void cb_erase(struct usb_ep *ep, struct usb_request *req)
{
	char* response = response_str;
	char *cmd = req->buf;

	// Set `send_okay` when we've previously sent an INFO response and just want
	// to finish the command with OKAY.
	//
	// Do this first, since in this case we've already parsed the command string
	// and would fail to find the partition name if we try to do it again here.
	static int send_okay = 0;
	if (send_okay) {
		send_okay = 0;
		fastboot_okay(NULL);
		fastboot_tx_write_str(response_str);
		return;
	}

	printf("cmd cb_erase is %s\n", cmd);
	const char *part = parse_fb_cmd_partition(cmd);
	if (!part) {
		return;
	}

	if (check_lock() && (get_fastboot_lock_access(part) & ERASE) == 0) {
		error("Cannot erase %s while locked\n", part);
		fastboot_tx_write_str("FAILlocked partition");
		return;
	}

	// Special case for "userdata" partition, we just ignore requests to erase
	// so that `fastboot -w` doesn't error out (b/322897225). In our case
	// flashing FVM/super automatically wipes userdata.
	if (strcmp(part, "userdata") == 0) {
		// This is a bit non-standard so send an INFO message first to alert
		// users that we're not actually erasing userdata here.
		fastboot_busy(
			"erase userdata is a no-op; flash super to wipe userdata");
		fastboot_tx_write_str(response_str);
		send_okay = 1;
		return;
	}

	//strcpy(response, "FAILno erase device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_erase_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_erase(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}

static void cb_devices(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN];
	char *cmd = req->buf;

	printf("cmd is %s\n", cmd);

	strcpy(response, "AMLOGIC");

	fastboot_tx_write_str(response);
}

static void cb_oem_cmd(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN/2 + 1];
	char* cmd = req->buf;
	printf("oem cmd[%s]\n", cmd);

	memcpy(response, cmd, strnlen(cmd, RESPONSE_LEN/2)+1);//+1 to terminate str
	cmd = response;
	strsep(&cmd, " ");
	FB_MSG("To run cmd[%s]\n", cmd);
	run_command(cmd, 0);

	fastboot_okay(response);
	fastboot_tx_write_str(response_str);
	return ;
}

static void cb_staged_bootloader_file(struct usb_ep *ep,
				      struct usb_request *req)
{
	char *name = req->buf;

	// skip past "oem add-staged-bootloader-file"
	if (!(strsep(&name, " ") && strsep(&name, " ") && name)) {
		fastboot_fail("No file name given");
		fastboot_tx_write_str(response_str);
		return;
	}

	if (download_bytes == 0) {
		fastboot_fail("Nothing staged");
		fastboot_tx_write_str(response_str);
		return;
	}

	if (AddBootloaderFiles(name, (const void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
			       download_bytes) != ZBI_RESULT_OK) {
		fastboot_fail("Failed to add ZBI file item");
		fastboot_tx_write_str(response_str);
		return;
	}

	fastboot_okay("");
	fastboot_tx_write_str(response_str);
}

static void compl_do_run_staged_efi(struct usb_ep *ep, struct usb_request *req)
{
	char cmd[128];
	snprintf(cmd, sizeof(cmd), "bootefi 0x%x:0x%x ${dtb_mem_addr}",
		 CONFIG_USB_FASTBOOT_BUF_ADDR, download_bytes);
	run_command(cmd, 0);
	// We expect the EFI app to take over the device and not return. Resets if
	// it does.
	panic("EFI app returns");
}

static void cb_run_staged_efi(struct usb_ep *ep, struct usb_request *req)
{
	// TODO(313510811): Figure out security verification for the binary, i.e.
	// using EFI secure boot.
	if (efi_check_pe((void *)CONFIG_USB_FASTBOOT_BUF_ADDR, download_bytes,
			 NULL) != EFI_SUCCESS) {
		fastboot_tx_write_str("FAILNo valid EFI image staged");
		return;
	}

	fastboot_func->in_req->complete = compl_do_run_staged_efi;
	fastboot_okay("");
	fastboot_tx_write_str(response_str);
}

struct cmd_dispatch_info {
	char *cmd;
	void (*cb)(struct usb_ep *ep, struct usb_request *req);
};

static const struct cmd_dispatch_info cmd_dispatch_info[] = {
	{
		// Due to command prefix matching, this catches all the
		// reboot* commands.
		.cmd = "reboot",
		.cb = cb_reboot,
	},
	{
		.cmd = "getvar:",
		.cb = cb_getvar,
	},
	{
		.cmd = "download:",
		.cb = cb_download,
	},
	{
		.cmd = "boot",
		.cb = cb_boot,
	},
	{
		.cmd = "continue",
		.cb = cb_continue,
	},
	{
		.cmd = "flashing",
		.cb = cb_flashing,
	},
#ifdef CONFIG_FASTBOOT_FLASH
	{
		.cmd = "flash",
		.cb = cb_flash,
	},
#endif
	{
		.cmd = "update",
		.cb = cb_download,
	},
	{
		.cmd = "flashall",
		.cb = cb_flashall,
	},
	{
		.cmd = "erase",
		.cb = cb_erase,
	},
	{
		.cmd = "devices",
		.cb = cb_devices,
	},
	{
		.cmd = "set_active",
		.cb = cb_set_active,
	},
	{
		.cmd = "oem add-staged-bootloader-file",
		.cb = cb_staged_bootloader_file,
	},
	{
		.cmd = "oem run-staged-efi",
		.cb = cb_run_staged_efi,
	},
	{
		.cmd = "oem",
		.cb = cb_oem_cmd,
	}
};

//cb for out_req->complete
static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
{
	char *cmdbuf = req->buf;
	void (*func_cb)(struct usb_ep *ep, struct usb_request *req) = NULL;
	int i;

	for (i = 0; i < ARRAY_SIZE(cmd_dispatch_info); i++) {
		if (!strcmp_l1(cmd_dispatch_info[i].cmd, cmdbuf)) {
			func_cb = cmd_dispatch_info[i].cb;
			break;
		}
	}

	if (!func_cb) {
		error("unknown command: %s\n", cmdbuf);
		fastboot_tx_write_str("FAILunknown command");
	} else {
		if (req->actual < req->length) {
			u8 *buf = (u8 *)req->buf;
			buf[req->actual] = 0;
			func_cb(ep, req);
		} else {
			error("buffer overflow\n");
			fastboot_tx_write_str("FAILbuffer overflow");
		}
	}

	if (req->status == 0 && !fastboot_is_busy()) {
		*cmdbuf = '\0';
		req->actual = 0;
		usb_ep_queue(ep, req, 0);
	}
}
