/* Driver for Realtek RTS51xx USB card reader
 *
 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses/>.
 *
 * Author:
 *   wwang (wei_wang@realsil.com.cn)
 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
 * Maintainer:
 *   Edwin Rong (edwin_rong@realsil.com.cn)
 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
 */

#include <linux/blkdev.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>

#include "debug.h"
#include "trace.h"
#include "rts51x.h"
#include "rts51x_transport.h"
#include "rts51x_scsi.h"
#include "rts51x_card.h"
#include "ms.h"

static inline void ms_set_err_code(struct rts51x_chip *chip, u8 err_code)
{
	struct ms_info *ms_card = &(chip->ms_card);

	ms_card->err_code = err_code;
}

static inline int ms_check_err_code(struct rts51x_chip *chip, u8 err_code)
{
	struct ms_info *ms_card = &(chip->ms_card);

	return (ms_card->err_code == err_code);
}

static int ms_parse_err_code(struct rts51x_chip *chip)
{
	TRACE_RET(chip, STATUS_FAIL);
}

static int ms_transfer_tpc(struct rts51x_chip *chip, u8 trans_mode, u8 tpc,
			   u8 cnt, u8 cfg)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	RTS51X_DEBUGP("ms_transfer_tpc: tpc = 0x%x\n", tpc);

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       PINGPONG_BUFFER);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | trans_mode);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	rts51x_add_cmd(chip, READ_REG_CMD, MS_TRANS_CFG, 0, 0);

	retval = rts51x_send_cmd(chip, MODE_CR, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, 2, 5000);
	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		rts51x_clear_ms_error(chip);
		ms_set_err_code(chip, MS_TO_ERROR);
		TRACE_RET(chip, ms_parse_err_code(chip));
	}

	if (!(tpc & 0x08)) {	/* Read Packet */
		/* Check CRC16 & Ready Timeout */
		if (chip->rsp_buf[1] & MS_CRC16_ERR) {
			ms_set_err_code(chip, MS_CRC16_ERROR);
			TRACE_RET(chip, ms_parse_err_code(chip));
		}
	} else { /* Write Packet */
		if (CHK_MSPRO(ms_card) && !(chip->rsp_buf[1] & 0x80)) {
			if (chip->rsp_buf[1] & (MS_INT_ERR | MS_INT_CMDNK)) {
				ms_set_err_code(chip, MS_CMD_NK);
				TRACE_RET(chip, ms_parse_err_code(chip));
			}
		}
	}

	/* Check Timeout of Ready Signal */
	if (chip->rsp_buf[1] & MS_RDY_TIMEOUT) {
		rts51x_clear_ms_error(chip);
		ms_set_err_code(chip, MS_TO_ERROR);
		TRACE_RET(chip, ms_parse_err_code(chip));
	}

	return STATUS_SUCCESS;
}

int ms_transfer_data(struct rts51x_chip *chip, u8 trans_mode, u8 tpc,
		     u16 sec_cnt, u8 cfg, int mode_2k, int use_sg, void *buf,
		     int buf_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 val, err_code = 0, flag = 0;
	enum dma_data_direction dir;
	unsigned int pipe;

	if (!buf || !buf_len)
		TRACE_RET(chip, STATUS_FAIL);

	if (trans_mode == MS_TM_AUTO_READ) {
		pipe = RCV_BULK_PIPE(chip);
		dir = DMA_FROM_DEVICE;
		flag = MODE_CDIR;
		err_code = MS_FLASH_READ_ERROR;
	} else if (trans_mode == MS_TM_AUTO_WRITE) {
		pipe = SND_BULK_PIPE(chip);
		dir = DMA_TO_DEVICE;
		flag = MODE_CDOR;
		err_code = MS_FLASH_WRITE_ERROR;
	} else {
		TRACE_RET(chip, STATUS_FAIL);
	}

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_H, 0xFF,
		       (u8) (sec_cnt >> 8));
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_L, 0xFF,
		       (u8) sec_cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       RING_BUFFER);

	if (mode_2k)
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_CFG, MS_2K_SECTOR_MODE,
			       MS_2K_SECTOR_MODE);
	else
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_CFG, MS_2K_SECTOR_MODE,
			       0);

	trans_dma_enable(dir, chip, sec_cnt * 512, DMA_512);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | trans_mode);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, flag | STAGE_MS_STATUS, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval =
	    rts51x_transfer_data_rcc(chip, pipe, buf, buf_len, use_sg, NULL,
				     15000, flag);
	if (retval != STATUS_SUCCESS) {
		ms_set_err_code(chip, err_code);
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, retval);
	}

	retval = rts51x_get_rsp(chip, 3, 15000);
	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		ms_set_err_code(chip, err_code);
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, STATUS_FAIL);
	}

	ms_card->last_rw_int = val = chip->rsp_buf[1];
	if (val & (MS_INT_CMDNK | MS_INT_ERR | MS_CRC16_ERR | MS_RDY_TIMEOUT))
		TRACE_RET(chip, STATUS_FAIL);

	return STATUS_SUCCESS;
}

int ms_write_bytes(struct rts51x_chip *chip, u8 tpc, u8 cnt, u8 cfg, u8 *data,
		   int data_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;

	if (!data || (data_len < cnt))
		TRACE_RET(chip, STATUS_ERROR);

	rts51x_init_cmd(chip);

	for (i = 0; i < cnt; i++) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2 + i, 0xFF,
			       data[i]);
	}
	if (cnt % 2)
		rts51x_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2 + i,
				0xFF, 0xFF);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       PINGPONG_BUFFER);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_WRITE_BYTES);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, MODE_CR, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, 1, 5000);
	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		u8 val = 0;

		rts51x_ep0_read_register(chip, MS_TRANS_CFG, &val);
		RTS51X_DEBUGP("MS_TRANS_CFG: 0x%02x\n", val);

		rts51x_clear_ms_error(chip);

		if (!(tpc & 0x08)) { /* Read Packet */
			/* Check CRC16 & Ready Timeout */
			if (val & MS_CRC16_ERR) {
				ms_set_err_code(chip, MS_CRC16_ERROR);
				TRACE_RET(chip, ms_parse_err_code(chip));
			}
		} else { /* Write Packet */
			if (CHK_MSPRO(ms_card) && !(val & 0x80)) {
				if (val & (MS_INT_ERR | MS_INT_CMDNK)) {
					ms_set_err_code(chip, MS_CMD_NK);
					TRACE_RET(chip,
						  ms_parse_err_code(chip));
				}
			}
		}

		/* Check Timeout of Ready Signal */
		if (val & MS_RDY_TIMEOUT) {
			ms_set_err_code(chip, MS_TO_ERROR);
			TRACE_RET(chip, ms_parse_err_code(chip));
		}

		ms_set_err_code(chip, MS_TO_ERROR);
		TRACE_RET(chip, ms_parse_err_code(chip));
	}

	return STATUS_SUCCESS;
}

int ms_read_bytes(struct rts51x_chip *chip, u8 tpc, u8 cnt, u8 cfg, u8 *data,
		  int data_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;

	if (!data)
		TRACE_RET(chip, STATUS_ERROR);

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       PINGPONG_BUFFER);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_READ_BYTES);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	for (i = 0; i < data_len - 1; i++)
		rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + i, 0, 0);

	if (data_len % 2)
		rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + data_len, 0,
			       0);
	else
		rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + data_len - 1,
			       0, 0);

	retval = rts51x_send_cmd(chip, MODE_CR, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, data_len + 1, 5000);
	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		u8 val = 0;

		rts51x_ep0_read_register(chip, MS_TRANS_CFG, &val);
		RTS51X_DEBUGP("MS_TRANS_CFG: 0x%02x\n", val);

		rts51x_clear_ms_error(chip);

		if (!(tpc & 0x08)) { /* Read Packet */
			/* Check CRC16 & Ready Timeout */
			if (val & MS_CRC16_ERR) {
				ms_set_err_code(chip, MS_CRC16_ERROR);
				TRACE_RET(chip, ms_parse_err_code(chip));
			}
		} else { /* Write Packet */
			if (CHK_MSPRO(ms_card) && !(val & 0x80)) {
				if (val & (MS_INT_ERR | MS_INT_CMDNK)) {
					ms_set_err_code(chip, MS_CMD_NK);
					TRACE_RET(chip,
						  ms_parse_err_code(chip));
				}
			}
		}

		/* Check Timeout of Ready Signal */
		if (val & MS_RDY_TIMEOUT) {
			ms_set_err_code(chip, MS_TO_ERROR);
			TRACE_RET(chip, ms_parse_err_code(chip));
		}

		ms_set_err_code(chip, MS_TO_ERROR);
		TRACE_RET(chip, ms_parse_err_code(chip));
	}

	rts51x_read_rsp_buf(chip, 1, data, data_len);

	return STATUS_SUCCESS;
}

int ms_set_rw_reg_addr(struct rts51x_chip *chip,
		       u8 read_start, u8 read_cnt, u8 write_start, u8 write_cnt)
{
	int retval, i;
	u8 data[4];

	data[0] = read_start;
	data[1] = read_cnt;
	data[2] = write_start;
	data[3] = write_cnt;

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, SET_RW_REG_ADRS, 4, NO_WAIT_INT, data,
				   4);
		if (retval == STATUS_SUCCESS)
			return STATUS_SUCCESS;
		rts51x_clear_ms_error(chip);
	}

	TRACE_RET(chip, STATUS_FAIL);
}

static int ms_send_cmd(struct rts51x_chip *chip, u8 cmd, u8 cfg)
{
	u8 data[2];

	data[0] = cmd;
	data[1] = 0;

	return ms_write_bytes(chip, PRO_SET_CMD, 1, cfg, data, 1);
}

static int ms_set_cmd(struct rts51x_chip *chip,
		      u8 read_start, u8 read_count,
		      u8 write_start, u8 write_count,
		      u8 cmd, u8 cfg, u8 *data, int data_len, u8 *int_stat)
{
	int retval, i;
	u8 val;

	if (!data || (data_len <= 0) || (data_len > 128)) {
		RTS51X_DEBUGP("ms_set_cmd (data_len = %d)\n", data_len);
		TRACE_RET(chip, STATUS_FAIL);
	}

	retval =
	    ms_set_rw_reg_addr(chip, read_start, read_count, write_start,
			       write_count);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, WRITE_REG, write_count, NO_WAIT_INT,
				   data, data_len);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	ms_set_err_code(chip, MS_NO_ERROR);

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval = ms_send_cmd(chip, cmd, WAIT_INT);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);
	/* GET_INT Register */
	ms_set_err_code(chip, MS_NO_ERROR);
	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (int_stat)
		*int_stat = val;

	return STATUS_SUCCESS;
}

#ifdef MS_SPEEDUP
static int ms_auto_set_cmd(struct rts51x_chip *chip,
			   u8 read_start, u8 read_count,
			   u8 write_start, u8 write_count,
			   u8 cmd, u8 cfg, u8 *data, int data_len,
			   u8 *int_stat)
{
	int retval;
	int i;

	if (!data || (data_len <= 0) || (data_len > 128)) {
		RTS51X_DEBUGP("ms_auto_set_cmd (data_len = %d)\n", data_len);
		TRACE_RET(chip, STATUS_FAIL);
	}

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_READ_START, 0xFF, read_start);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_READ_COUNT, 0xFF, read_count);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_WRITE_START, 0xFF, write_start);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_WRITE_COUNT, 0xFF, write_count);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_COMMAND, 0xFF, cmd);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       PINGPONG_BUFFER);

	for (i = 0; i < data_len; i++) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2 + i, 0xFF,
			       data[i]);
	}

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_SET_CMD);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, MODE_CR | STAGE_MS_STATUS, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, 3, 5000);

	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if (int_stat)
		*int_stat = chip->rsp_buf[2];

	return STATUS_SUCCESS;
}
#endif

static int ms_set_init_para(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	if (CHK_HG8BIT(ms_card)) {
		if (chip->asic_code)
			ms_card->ms_clock = chip->option.asic_ms_hg_clk;
		else
			ms_card->ms_clock = chip->option.fpga_ms_hg_clk;
	} else if (CHK_MSPRO(ms_card) || CHK_MS4BIT(ms_card)) {
		if (chip->asic_code)
			ms_card->ms_clock = chip->option.asic_ms_4bit_clk;
		else
			ms_card->ms_clock = chip->option.fpga_ms_4bit_clk;
	} else {
		if (chip->asic_code)
			ms_card->ms_clock = 38;
		else
			ms_card->ms_clock = CLK_40;
	}

	retval = switch_clock(chip, ms_card->ms_clock);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_select_card(chip, MS_CARD);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}

int ms_switch_clock(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	retval = rts51x_select_card(chip, MS_CARD);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = switch_clock(chip, ms_card->ms_clock);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}

static void ms_pull_ctl_disable(struct rts51x_chip *chip)
{
	if (CHECK_PKG(chip, LQFP48)) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
	} else {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x56);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
	}
}

static void ms_pull_ctl_enable(struct rts51x_chip *chip)
{
	if (CHECK_PKG(chip, LQFP48)) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
	} else {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
	}
}

static int ms_prepare_reset(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	ms_card->ms_type = 0;
	ms_card->check_ms_flow = 0;
	ms_card->switch_8bit_fail = 0;
	ms_card->delay_write.delay_write_flag = 0;

	ms_card->pro_under_formatting = 0;

	rts51x_init_cmd(chip);

	if (chip->asic_code) {
		ms_pull_ctl_enable(chip);
	} else {
		rts51x_add_cmd(chip, WRITE_REG_CMD, FPGA_PULL_CTL,
			       FPGA_MS_PULL_CTL_BIT | 0x20, 0);
	}
	/* Tri-state MS output */
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, 0);

	if (!chip->option.FT2_fast_mode) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, POWER_MASK,
			       POWER_OFF);
	}

	retval = rts51x_send_cmd(chip, MODE_C, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (!chip->option.FT2_fast_mode) {
		wait_timeout(250);

		card_power_on(chip, MS_CARD);
		wait_timeout(150);

#ifdef SUPPORT_OCP
		rts51x_get_card_status(chip, &(chip->card_status));
		/* get OCP status */
		chip->ocp_stat = (chip->card_status >> 4) & 0x03;

		if (chip->ocp_stat & (MS_OCP_NOW | MS_OCP_EVER)) {
			RTS51X_DEBUGP("Over current, OCPSTAT is 0x%x\n",
				       chip->ocp_stat);
			TRACE_RET(chip, STATUS_FAIL);
		}
#endif
	}

	rts51x_init_cmd(chip);

	/* Enable MS Output */
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN,
		       MS_OUTPUT_EN);

	/* Reset Registers */
	if (chip->asic_code)
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_CFG, 0xFF,
			       SAMPLE_TIME_RISING | PUSH_TIME_DEFAULT |
			       NO_EXTEND_TOGGLE | MS_BUS_WIDTH_1);
	else
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_CFG, 0xFF,
			       SAMPLE_TIME_FALLING | PUSH_TIME_DEFAULT |
			       NO_EXTEND_TOGGLE | MS_BUS_WIDTH_1);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF,
		       NO_WAIT_INT | NO_AUTO_READ_INT_REG);

	retval = rts51x_send_cmd(chip, MODE_C, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return ms_set_init_para(chip);
}

static int ms_identify_media_type(struct rts51x_chip *chip, int switch_8bit_bus)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 val;

	retval = ms_set_rw_reg_addr(chip, Pro_StatusReg, 6, SystemParm, 1);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	/* Get Register form MS-PRO card */
	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_transfer_tpc(chip, MS_TM_READ_BYTES, READ_REG, 6,
				    NO_WAIT_INT);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	RTS51X_READ_REG(chip, PPBUF_BASE2 + 2, &val);
	RTS51X_DEBUGP("Type register: 0x%x\n", val);
	if (val != 0x01) {
		if (val != 0x02)
			ms_card->check_ms_flow = 1;
		TRACE_RET(chip, STATUS_FAIL);
	}
	/* Category Register */
	RTS51X_READ_REG(chip, PPBUF_BASE2 + 4, &val);
	RTS51X_DEBUGP("Category register: 0x%x\n", val);
	if (val != 0) {
		ms_card->check_ms_flow = 1;
		TRACE_RET(chip, STATUS_FAIL);
	}
	/* Class Register */
	RTS51X_READ_REG(chip, PPBUF_BASE2 + 5, &val);
	RTS51X_DEBUGP("Class register: 0x%x\n", val);
	if (val == 0) {
		RTS51X_READ_REG(chip, PPBUF_BASE2, &val);
		if (val & WRT_PRTCT)
			chip->card_wp |= MS_CARD;
		else
			chip->card_wp &= ~MS_CARD;
	} else if ((val == 0x01) || (val == 0x02) || (val == 0x03)) {
		chip->card_wp |= MS_CARD;
	} else {
		ms_card->check_ms_flow = 1;
		TRACE_RET(chip, STATUS_FAIL);
	}

	ms_card->ms_type |= TYPE_MSPRO;

	/* Check MSPro-HG Card, use IF Mode Register to distinguish */
	RTS51X_READ_REG(chip, PPBUF_BASE2 + 3, &val);
	RTS51X_DEBUGP("IF Mode register: 0x%x\n", val);
	if (val == 0) {
		ms_card->ms_type &= 0x0F;
	} else if (val == 7) {
		if (switch_8bit_bus)
			ms_card->ms_type |= MS_HG;
		else
			ms_card->ms_type &= 0x0F;
	} else {
		TRACE_RET(chip, STATUS_FAIL);
	}

	/* end Procedure to identify Media Type */
	return STATUS_SUCCESS;
}

static int ms_confirm_cpu_startup(struct rts51x_chip *chip)
{
	int retval, i, k;
	u8 val;

	/* Confirm CPU StartUp */
	k = 0;
	do {
		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST)
			TRACE_RET(chip, STATUS_FAIL);

		for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
			retval =
			    ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val,
					  1);
			if (retval == STATUS_SUCCESS)
				break;
		}
		if (i == MS_MAX_RETRY_COUNT)
			TRACE_RET(chip, STATUS_FAIL);

		if (k > 100)
			TRACE_RET(chip, STATUS_FAIL);
		k++;
		wait_timeout(100);
	} while (!(val & INT_REG_CED));

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	if (val & INT_REG_ERR) {
		if (val & INT_REG_CMDNK) {	/* CMDNK = 1 */
			chip->card_wp |= (MS_CARD);
		} else {	/* CMDNK = 0 */
			TRACE_RET(chip, STATUS_FAIL);
		}
	}
	/*--  end confirm CPU startup */

	return STATUS_SUCCESS;
}

static int ms_switch_parallel_bus(struct rts51x_chip *chip)
{
	int retval, i;
	u8 data[2];

	data[0] = PARALLEL_4BIT_IF;
	data[1] = 0;
	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, WRITE_REG, 1, NO_WAIT_INT, data, 2);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}

static int ms_switch_8bit_bus(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 data[2];

	data[0] = PARALLEL_8BIT_IF;
	data[1] = 0;
	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, WRITE_REG, 1, NO_WAIT_INT, data, 2);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, STATUS_FAIL);

	RTS51X_WRITE_REG(chip, MS_CFG, 0x98,
			 MS_BUS_WIDTH_8 | SAMPLE_TIME_FALLING);
	ms_card->ms_type |= MS_8BIT;

	retval = ms_set_init_para(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT, 1,
				    NO_WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	return STATUS_SUCCESS;
}

static int ms_pro_reset_flow(struct rts51x_chip *chip, int switch_8bit_bus)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;

	for (i = 0; i < 3; i++) {
		retval = ms_prepare_reset(chip);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_identify_media_type(chip, switch_8bit_bus);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_confirm_cpu_startup(chip);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_switch_parallel_bus(chip);
		if (retval != STATUS_SUCCESS) {
			if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST)
				TRACE_RET(chip, STATUS_FAIL);
			continue;
		} else {
			break;
		}
	}

	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_WRITE_REG(chip, MS_CFG, 0x18, MS_BUS_WIDTH_4);

	RTS51X_WRITE_REG(chip, MS_CFG, PUSH_TIME_ODD, PUSH_TIME_ODD);

	retval = ms_set_init_para(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (CHK_MSHG(ms_card) && switch_8bit_bus) {
		retval = ms_switch_8bit_bus(chip);
		if (retval != STATUS_SUCCESS) {
			ms_card->switch_8bit_fail = 1;
			TRACE_RET(chip, retval);
		}
	}

	return STATUS_SUCCESS;
}

#ifdef XC_POWERCLASS
static int msxc_change_power(struct rts51x_chip *chip, u8 mode)
{
	int retval;
	u8 buf[6];

	ms_cleanup_work(chip);

	/* Set Parameter Register */
	retval = ms_set_rw_reg_addr(chip, 0, 0, Pro_DataCount1, 6);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	buf[0] = 0;
	buf[1] = mode;
	buf[2] = 0;
	buf[3] = 0;
	buf[4] = 0;
	buf[5] = 0;

	retval = ms_write_bytes(chip, PRO_WRITE_REG, 6, NO_WAIT_INT, buf, 6);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_send_cmd(chip, XC_CHG_POWER, WAIT_INT);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_READ_REG(chip, MS_TRANS_CFG, buf);
	if (buf[0] & (MS_INT_CMDNK | MS_INT_ERR))
		TRACE_RET(chip, STATUS_FAIL);

	return STATUS_SUCCESS;
}
#endif

static int ms_read_attribute_info(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 val, *buf, class_code, device_type, sub_class, data[16];
	u16 total_blk = 0, blk_size = 0;
#ifdef SUPPORT_MSXC
	u32 xc_total_blk = 0, xc_blk_size = 0;
#endif
	u32 sys_info_addr = 0, sys_info_size;
#ifdef SUPPORT_PCGL_1P18
	u32 model_name_addr = 0, model_name_size;
	int found_sys_info = 0, found_model_name = 0;
#endif

	retval = ms_set_rw_reg_addr(chip, Pro_IntReg, 2, Pro_SystemParm, 7);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (CHK_MS8BIT(ms_card))
		data[0] = PARALLEL_8BIT_IF;
	else
		data[0] = PARALLEL_4BIT_IF;
	data[1] = 0;

	data[2] = 0x40;
	data[3] = 0;
	data[4] = 0;
	data[5] = 0;
	/* Start address 0 */
	data[6] = 0;
	data[7] = 0;

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, PRO_WRITE_REG, 7, NO_WAIT_INT, data,
				   8);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	buf = kmalloc(64 * 512, GFP_KERNEL);
	if (buf == NULL)
		TRACE_RET(chip, STATUS_NOMEM);

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval = ms_send_cmd(chip, PRO_READ_ATRB, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			continue;

		retval = rts51x_read_register(chip, MS_TRANS_CFG, &val);
		if (retval != STATUS_SUCCESS) {
			kfree(buf);
			TRACE_RET(chip, STATUS_FAIL);
		}
		if (!(val & MS_INT_BREQ)) {
			kfree(buf);
			TRACE_RET(chip, STATUS_FAIL);
		}

		retval =
		    ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
				     0x40, WAIT_INT, 0, 0, buf, 64 * 512);
		if (retval == STATUS_SUCCESS)
			break;
		else
			rts51x_clear_ms_error(chip);
	}
	if (retval != STATUS_SUCCESS) {
		kfree(buf);
		TRACE_RET(chip, retval);
	}

	i = 0;
	do {
		retval = rts51x_read_register(chip, MS_TRANS_CFG, &val);
		if (retval != STATUS_SUCCESS) {
			kfree(buf);
			TRACE_RET(chip, retval);
		}

		if ((val & MS_INT_CED) || !(val & MS_INT_BREQ))
			break;

		retval =
		    ms_transfer_tpc(chip, MS_TM_NORMAL_READ, PRO_READ_LONG_DATA,
				    0, WAIT_INT);
		if (retval != STATUS_SUCCESS) {
			kfree(buf);
			TRACE_RET(chip, retval);
		}

		i++;
	} while (i < 1024);

	if (retval != STATUS_SUCCESS) {
		kfree(buf);
		TRACE_RET(chip, retval);
	}

	if ((buf[0] != 0xa5) && (buf[1] != 0xc3)) {
		/* Signature code is wrong */
		kfree(buf);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if ((buf[4] < 1) || (buf[4] > 12)) {
		kfree(buf);
		TRACE_RET(chip, STATUS_FAIL);
	}

	for (i = 0; i < buf[4]; i++) {
		int cur_addr_off = 16 + i * 12;

#ifdef SUPPORT_MSXC
		if ((buf[cur_addr_off + 8] == 0x10)
		    || (buf[cur_addr_off + 8] == 0x13)) {
#else
		if (buf[cur_addr_off + 8] == 0x10) {
#endif
			sys_info_addr = ((u32) buf[cur_addr_off + 0] << 24) |
			    ((u32) buf[cur_addr_off + 1] << 16) |
			    ((u32) buf[cur_addr_off + 2] << 8) |
			    buf[cur_addr_off + 3];
			sys_info_size =
			    ((u32) buf[cur_addr_off + 4] << 24) |
			    ((u32) buf[cur_addr_off + 5] << 16) |
			    ((u32) buf[cur_addr_off + 6] << 8) |
			    buf[cur_addr_off + 7];
			RTS51X_DEBUGP("sys_info_addr = 0x%x,"
					"sys_info_size = 0x%x\n",
						sys_info_addr, sys_info_size);
			if (sys_info_size != 96) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}
			if (sys_info_addr < 0x1A0) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}
			if ((sys_info_size + sys_info_addr) > 0x8000) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}
#ifdef SUPPORT_MSXC
			if (buf[cur_addr_off + 8] == 0x13)
				ms_card->ms_type |= MS_XC;
#endif
#ifdef SUPPORT_PCGL_1P18
			found_sys_info = 1;
#else
			break;
#endif
		}
#ifdef SUPPORT_PCGL_1P18
		if (buf[cur_addr_off + 8] == 0x15) {
			model_name_addr = ((u32) buf[cur_addr_off + 0] << 24) |
			    ((u32) buf[cur_addr_off + 1] << 16) |
			    ((u32) buf[cur_addr_off + 2] << 8) |
			    buf[cur_addr_off + 3];
			model_name_size =
			    ((u32) buf[cur_addr_off + 4] << 24) |
			    ((u32) buf[cur_addr_off + 5] << 16) |
			    ((u32) buf[cur_addr_off + 6] << 8) |
			    buf[cur_addr_off + 7];
			RTS51X_DEBUGP("model_name_addr = 0x%x,"
					"model_name_size = 0x%x\n",
					model_name_addr, model_name_size);
			if (model_name_size != 48) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}
			if (model_name_addr < 0x1A0) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}
			if ((model_name_size + model_name_addr) > 0x8000) {
				kfree(buf);
				TRACE_RET(chip, STATUS_FAIL);
			}

			found_model_name = 1;
		}

		if (found_sys_info && found_model_name)
			break;
#endif
	}

	if (i == buf[4]) {
		kfree(buf);
		TRACE_RET(chip, STATUS_FAIL);
	}

	class_code = buf[sys_info_addr + 0];
	device_type = buf[sys_info_addr + 56];
	sub_class = buf[sys_info_addr + 46];
#ifdef SUPPORT_MSXC
	if (CHK_MSXC(ms_card)) {
		xc_total_blk = ((u32) buf[sys_info_addr + 6] << 24) |
		    ((u32) buf[sys_info_addr + 7] << 16) |
		    ((u32) buf[sys_info_addr + 8] << 8) |
		    buf[sys_info_addr + 9];
		xc_blk_size = ((u32) buf[sys_info_addr + 32] << 24) |
		    ((u32) buf[sys_info_addr + 33] << 16) |
		    ((u32) buf[sys_info_addr + 34] << 8) |
		    buf[sys_info_addr + 35];
		RTS51X_DEBUGP("xc_total_blk = 0x%x, xc_blk_size = 0x%x\n",
			       xc_total_blk, xc_blk_size);
	} else {
		total_blk =
		    ((u16) buf[sys_info_addr + 6] << 8) | buf[sys_info_addr +
							      7];
		blk_size =
		    ((u16) buf[sys_info_addr + 2] << 8) | buf[sys_info_addr +
							      3];
		RTS51X_DEBUGP("total_blk = 0x%x, blk_size = 0x%x\n", total_blk,
			       blk_size);
	}
#else
	total_blk =
	    ((u16) buf[sys_info_addr + 6] << 8) | buf[sys_info_addr + 7];
	blk_size = ((u16) buf[sys_info_addr + 2] << 8) | buf[sys_info_addr + 3];
	RTS51X_DEBUGP("total_blk = 0x%x, blk_size = 0x%x\n", total_blk,
		       blk_size);
#endif

	RTS51X_DEBUGP("class_code = 0x%x, device_type = 0x%x,"
			"sub_class = 0x%x\n",
				class_code, device_type, sub_class);

	memcpy(ms_card->raw_sys_info, buf + sys_info_addr, 96);
#ifdef SUPPORT_PCGL_1P18
	memcpy(ms_card->raw_model_name, buf + model_name_addr, 48);
#endif

	kfree(buf);

	/* Confirm System Information */
#ifdef SUPPORT_MSXC
	if (CHK_MSXC(ms_card)) {
		if (class_code != 0x03)
			TRACE_RET(chip, STATUS_FAIL);
	} else {
		if (class_code != 0x02)
			TRACE_RET(chip, STATUS_FAIL);
	}
#else
	if (class_code != 0x02)
		TRACE_RET(chip, STATUS_FAIL);
#endif

	if (device_type != 0x00) {
		if ((device_type == 0x01) || (device_type == 0x02)
		    || (device_type == 0x03))
			chip->card_wp |= MS_CARD;
		else
			TRACE_RET(chip, STATUS_FAIL);
	}
	if (sub_class & 0xC0)
		TRACE_RET(chip, STATUS_FAIL);

	RTS51X_DEBUGP("class_code: 0x%x, device_type: 0x%x, sub_class: 0x%x\n",
		       class_code, device_type, sub_class);

#ifdef SUPPORT_MSXC
	if (CHK_MSXC(ms_card)) {
		chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity =
		    xc_total_blk * xc_blk_size;
	} else {
		chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity =
		    total_blk * blk_size;
	}
#else
	chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity =
	    total_blk * blk_size;
#endif

	return STATUS_SUCCESS;
}

#ifdef SUPPORT_MAGIC_GATE
int mg_set_tpc_para_sub(struct rts51x_chip *chip, int type, u8 mg_entry_num);
#endif

static int reset_ms_pro(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
#ifdef XC_POWERCLASS
	u8 change_power_class = 2;
#endif

#ifdef XC_POWERCLASS
Retry:
#endif
	retval = ms_pro_reset_flow(chip, 1);
	if (retval != STATUS_SUCCESS) {
		if (ms_card->switch_8bit_fail) {
			retval = ms_pro_reset_flow(chip, 0);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
		} else {
			TRACE_RET(chip, retval);
		}
	}

	retval = ms_read_attribute_info(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
#ifdef XC_POWERCLASS
	if (CHK_HG8BIT(ms_card))
		change_power_class = 0;

	if (change_power_class && CHK_MSXC(ms_card)) {
		u8 power_class_mode = (ms_card->raw_sys_info[46] & 0x18) >> 3;
		RTS51X_DEBUGP("power_class_mode = 0x%x", power_class_mode);
		if (change_power_class > power_class_mode)
			change_power_class = power_class_mode;
		if (change_power_class) {
			retval = msxc_change_power(chip, change_power_class);
			if (retval != STATUS_SUCCESS) {
				change_power_class--;
				goto Retry;
			}
		}
	}
#endif

#ifdef SUPPORT_MAGIC_GATE
	retval = mg_set_tpc_para_sub(chip, 0, 0);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
#endif

	if (CHK_HG8BIT(ms_card))
		chip->card_bus_width[chip->card2lun[MS_CARD]] = 8;
	else
		chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;

	return STATUS_SUCCESS;
}

static int ms_read_status_reg(struct rts51x_chip *chip)
{
	int retval;
	u8 val[2];

	retval = ms_set_rw_reg_addr(chip, StatusReg0, 2, 0, 0);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_read_bytes(chip, READ_REG, 2, NO_WAIT_INT, val, 2);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	if (val[1] & (STS_UCDT | STS_UCEX | STS_UCFG)) {
		ms_set_err_code(chip, MS_FLASH_READ_ERROR);
		TRACE_RET(chip, STATUS_FAIL);
	}

	return STATUS_SUCCESS;
}

static int ms_check_boot_block(struct rts51x_chip *chip, u16 block_addr)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 extra[MS_EXTRA_SIZE], data[10], val = 0;

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (block_addr >> 8);
	data[3] = (u8) block_addr;
	/* Page Number
	 * Extra data access mode */
	data[4] = 0x40;
	data[5] = 0;

	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_READ, WAIT_INT, data, 6, &val);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (val & INT_REG_CMDNK) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}
	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			retval = ms_read_status_reg(chip);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
			retval =
			    ms_set_rw_reg_addr(chip, OverwriteFlag,
					       MS_EXTRA_SIZE, SystemParm, 6);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
		}
	}

	retval =
	    ms_read_bytes(chip, READ_REG, MS_EXTRA_SIZE, NO_WAIT_INT, extra,
			  MS_EXTRA_SIZE);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (!(extra[0] & BLOCK_OK) || (extra[1] & NOT_BOOT_BLOCK))
		TRACE_RET(chip, STATUS_FAIL);

	return STATUS_SUCCESS;
}

static int ms_read_extra_data(struct rts51x_chip *chip,
			      u16 block_addr, u8 page_num, u8 *buf,
			      int buf_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 val = 0, data[10];

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (block_addr >> 8);
	data[3] = (u8) block_addr;
	/* Page Number
	 * Extra data access mode */
	data[4] = 0x40;
	data[5] = page_num;

#ifdef MS_SPEEDUP
	retval =
	    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_READ, WAIT_INT, data, 6, &val);
#else
	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_READ, WAIT_INT, data, 6, &val);
#endif
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (val & INT_REG_CMDNK) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}
	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			retval = ms_read_status_reg(chip);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
			retval =
			    ms_set_rw_reg_addr(chip, OverwriteFlag,
					       MS_EXTRA_SIZE, SystemParm, 6);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
		}
	}

	retval =
	    ms_read_bytes(chip, READ_REG, MS_EXTRA_SIZE, NO_WAIT_INT, data,
			  MS_EXTRA_SIZE);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (buf && buf_len) {
		if (buf_len > MS_EXTRA_SIZE)
			buf_len = MS_EXTRA_SIZE;
		memcpy(buf, data, buf_len);
	}

	return STATUS_SUCCESS;
}

static int ms_write_extra_data(struct rts51x_chip *chip,
			       u16 block_addr, u8 page_num, u8 *buf,
			       int buf_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 val = 0, data[16];

	if (!buf || (buf_len < MS_EXTRA_SIZE))
		TRACE_RET(chip, STATUS_FAIL);
	/* Write REG */
	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (block_addr >> 8);
	data[3] = (u8) block_addr;
	/* Page Number
	 * Extra data access mode */
	data[4] = 0x40;
	data[5] = page_num;

	for (i = 6; i < MS_EXTRA_SIZE + 6; i++)
		data[i] = buf[i - 6];

#ifdef MS_SPEEDUP
	retval =
	    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			    6 + MS_EXTRA_SIZE, BLOCK_WRITE, WAIT_INT, data, 16,
			    &val);
#else
	retval =
	    ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
		       6 + MS_EXTRA_SIZE, BLOCK_WRITE, WAIT_INT, data, 16,
		       &val);
#endif
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (val & INT_REG_CMDNK) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}
	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	return STATUS_SUCCESS;
}

static int ms_read_page(struct rts51x_chip *chip, u16 block_addr, u8 page_num)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 val = 0, data[6];

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (block_addr >> 8);
	data[3] = (u8) block_addr;
	/* Page Number
	 * Single page access mode */
	data[4] = 0x20;
	data[5] = page_num;

	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_READ, WAIT_INT, data, 6, &val);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (val & INT_REG_CMDNK) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			if (!(val & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
			retval = ms_read_status_reg(chip);
			if (retval != STATUS_SUCCESS)
				ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
		} else {
			if (!(val & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_BREQ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}
	}

	retval =
	    ms_transfer_tpc(chip, MS_TM_NORMAL_READ, READ_PAGE_DATA, 0,
			    NO_WAIT_INT);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR))
		TRACE_RET(chip, STATUS_FAIL);

	return STATUS_SUCCESS;
}

static int ms_set_bad_block(struct rts51x_chip *chip, u16 phy_blk)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 val = 0, data[8], extra[MS_EXTRA_SIZE];

	retval = ms_read_extra_data(chip, phy_blk, 0, extra, MS_EXTRA_SIZE);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_set_err_code(chip, MS_NO_ERROR);

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (phy_blk >> 8);
	data[3] = (u8) phy_blk;
	data[4] = 0x80;
	data[5] = 0;
	data[6] = extra[0] & 0x7F;
	data[7] = 0xFF;

#ifdef MS_SPEEDUP
	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 7,
			    BLOCK_WRITE, WAIT_INT, data, 7, &val);
#else
	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 7,
			    BLOCK_WRITE, WAIT_INT, data, 7, &val);
#endif
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (val & INT_REG_CMDNK) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	return STATUS_SUCCESS;
}

static int ms_erase_block(struct rts51x_chip *chip, u16 phy_blk)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i = 0;
	u8 val = 0, data[6];

	retval =
	    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			       6);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_set_err_code(chip, MS_NO_ERROR);

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (phy_blk >> 8);
	data[3] = (u8) phy_blk;
	data[4] = 0;
	data[5] = 0;

ERASE_RTY:
#ifdef MS_SPEEDUP
	retval =
	    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_ERASE, WAIT_INT, data, 6, &val);
#else
	retval = ms_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_ERASE, WAIT_INT, data, 6, &val);
#endif

	if (val & INT_REG_CMDNK) {
		if (i < 3) {
			i++;
			goto ERASE_RTY;
		}
		ms_set_err_code(chip, MS_CMD_NK);
		ms_set_bad_block(chip, phy_blk);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if (val & INT_REG_CED) {
		if (val & INT_REG_ERR) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	return STATUS_SUCCESS;
}

static void ms_set_page_status(u16 log_blk, u8 type, u8 *extra, int extra_len)
{
	if (!extra || (extra_len < MS_EXTRA_SIZE))
		return;

	memset(extra, 0xFF, MS_EXTRA_SIZE);

	if (type == setPS_NG)
		extra[0] = 0xB8;
	else
		extra[0] = 0x98;

	extra[2] = (u8) (log_blk >> 8);
	extra[3] = (u8) log_blk;
}

static int ms_init_page(struct rts51x_chip *chip, u16 phy_blk, u16 log_blk,
			u8 start_page, u8 end_page)
{
	int retval;
	u8 extra[MS_EXTRA_SIZE], i;

	memset(extra, 0xff, MS_EXTRA_SIZE);

	extra[0] = 0xf8; /* Block, page OK, data erased */
	extra[1] = 0xff;
	extra[2] = (u8) (log_blk >> 8);
	extra[3] = (u8) log_blk;

	for (i = start_page; i < end_page; i++) {
		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST)
			TRACE_RET(chip, STATUS_FAIL);

		retval =
		    ms_write_extra_data(chip, phy_blk, i, extra, MS_EXTRA_SIZE);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	return STATUS_SUCCESS;
}

static int ms_copy_page(struct rts51x_chip *chip, u16 old_blk, u16 new_blk,
			u16 log_blk, u8 start_page, u8 end_page)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, rty_cnt, uncorrect_flag = 0;
	u8 extra[MS_EXTRA_SIZE], val, i, j, data[16];

	RTS51X_DEBUGP("Copy page from 0x%x to 0x%x, logical block is 0x%x\n",
		       old_blk, new_blk, log_blk);
	RTS51X_DEBUGP("start_page = %d, end_page = %d\n", start_page,
		       end_page);

	retval = ms_read_extra_data(chip, new_blk, 0, extra, MS_EXTRA_SIZE);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_read_status_reg(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_READ_REG(chip, PPBUF_BASE2, &val);

	if (val & BUF_FULL) {
		/* Clear Buffer */
		retval = ms_send_cmd(chip, CLEAR_BUF, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
		/* GET_INT Register */
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if (!(val & INT_REG_CED)) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	for (i = start_page; i < end_page; i++) {
		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST)
			TRACE_RET(chip, STATUS_FAIL);

		ms_read_extra_data(chip, old_blk, i, extra, MS_EXTRA_SIZE);

		retval =
		    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
				       SystemParm, 6);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
		/* Write REG */
		ms_set_err_code(chip, MS_NO_ERROR);

		if (CHK_MS4BIT(ms_card)) {
			/* Parallel interface */
			data[0] = 0x88;
		} else {
			/* Serial interface */
			data[0] = 0x80;
		}
		/* Block Address */
		data[1] = 0;
		data[2] = (u8) (old_blk >> 8);
		data[3] = (u8) old_blk;
		data[4] = 0x20;
		data[5] = i;

		retval =
		    ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		ms_set_err_code(chip, MS_NO_ERROR);
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if (val & INT_REG_CMDNK) {
			ms_set_err_code(chip, MS_CMD_NK);
			TRACE_RET(chip, STATUS_FAIL);
		}

		if (val & INT_REG_CED) {
			if (val & INT_REG_ERR) {
				retval = ms_read_status_reg(chip);
				if (retval != STATUS_SUCCESS) {
					uncorrect_flag = 1;
					RTS51X_DEBUGP("Uncorrectable"
								"error\n");
				} else {
					uncorrect_flag = 0;
				}

				retval =
				    ms_transfer_tpc(chip, MS_TM_NORMAL_READ,
					READ_PAGE_DATA, 0, NO_WAIT_INT);
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);
				if (uncorrect_flag) {
					ms_set_page_status(log_blk, setPS_NG,
						extra, MS_EXTRA_SIZE);
					if (i == 0)
						extra[0] &= 0xEF;
					ms_write_extra_data(chip, old_blk, i,
							    extra,
							    MS_EXTRA_SIZE);
					RTS51X_DEBUGP("page %d :"
							"extra[0] = 0x%x\n",
							i, extra[0]);
					MS_SET_BAD_BLOCK_FLG(ms_card);

					ms_set_page_status(log_blk, setPS_Error,
							extra, MS_EXTRA_SIZE);
					ms_write_extra_data(chip, new_blk, i,
						extra, MS_EXTRA_SIZE);
					continue;
				}

				for (rty_cnt = 0; rty_cnt < MS_MAX_RETRY_COUNT;
				     rty_cnt++) {
					retval =
					    ms_transfer_tpc(chip,
							    MS_TM_NORMAL_WRITE,
							    WRITE_PAGE_DATA, 0,
							    NO_WAIT_INT);
					if (retval == STATUS_SUCCESS)
						break;
				}
				if (rty_cnt == MS_MAX_RETRY_COUNT)
					TRACE_RET(chip, STATUS_FAIL);
			}

			if (!(val & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_BREQ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}

		retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
					    MS_EXTRA_SIZE, SystemParm,
					    (6 + MS_EXTRA_SIZE));

		/* Write REG */
		ms_set_err_code(chip, MS_NO_ERROR);

		if (CHK_MS4BIT(ms_card)) {
			/* Parallel interface */
			data[0] = 0x88;
		} else {
			/* Serial interface */
			data[0] = 0x80;
		}
		/* Block Address */
		data[1] = 0;
		data[2] = (u8) (new_blk >> 8);
		data[3] = (u8) new_blk;
		data[4] = 0x20;
		data[5] = i;

		/* for MS check procedure */
		if ((extra[0] & 0x60) != 0x60)
			data[6] = extra[0];
		else
			data[6] = 0xF8;

		data[6 + 1] = 0xFF;
		data[6 + 2] = (u8) (log_blk >> 8);
		data[6 + 3] = (u8) log_blk;

		for (j = 4; j <= MS_EXTRA_SIZE; j++)
			data[6 + j] = 0xFF;

		retval =
		    ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
				   NO_WAIT_INT, data, 16);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
		/* GET_INT Register */
		ms_set_err_code(chip, MS_NO_ERROR);
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if (val & INT_REG_CMDNK) {
			ms_set_err_code(chip, MS_CMD_NK);
			TRACE_RET(chip, STATUS_FAIL);
		}

		if (val & INT_REG_CED) {
			if (val & INT_REG_ERR) {
				ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}

		if (i == 0) {
			retval =
			    ms_set_rw_reg_addr(chip, OverwriteFlag,
					       MS_EXTRA_SIZE, SystemParm, 7);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);

			ms_set_err_code(chip, MS_NO_ERROR);

			if (CHK_MS4BIT(ms_card)) {
				/* Parallel interface */
				data[0] = 0x88;
			} else {
				/* Serial interface */
				data[0] = 0x80;
			}
			/* Block Address */
			data[1] = 0;
			data[2] = (u8) (old_blk >> 8);
			data[3] = (u8) old_blk;
			data[4] = 0x80;
			data[5] = 0;
			data[6] = 0xEF;
			data[7] = 0xFF;

			retval =
			    ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT,
					   data, 8);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);

			retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);

			ms_set_err_code(chip, MS_NO_ERROR);
			retval =
			    ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val,
					  1);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);

			if (val & INT_REG_CMDNK) {
				ms_set_err_code(chip, MS_CMD_NK);
				TRACE_RET(chip, STATUS_FAIL);
			}

			if (val & INT_REG_CED) {
				if (val & INT_REG_ERR) {
					ms_set_err_code(chip,
							MS_FLASH_WRITE_ERROR);
					TRACE_RET(chip, STATUS_FAIL);
				}
			}
		}
	}

	return STATUS_SUCCESS;
}

#ifdef MS_SPEEDUP
static int ms_auto_copy_page(struct rts51x_chip *chip, u16 old_blk, u16 new_blk,
			     u16 log_blk, u8 start_page, u8 end_page)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u8 page_len, bus_width, val = 0;
	u8 extra[MS_EXTRA_SIZE];

	RTS51X_DEBUGP("Auto copy page from 0x%x to 0x%x,"
				"logical block is 0x%x\n",
				old_blk, new_blk, log_blk);
	RTS51X_DEBUGP("start_page = %d, end_page = %d\n", start_page,
		       end_page);

	page_len = end_page - start_page;

	retval = ms_read_extra_data(chip, new_blk, 0, extra, MS_EXTRA_SIZE);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_read_status_reg(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_READ_REG(chip, PPBUF_BASE2, &val);

	if (val & BUF_FULL) {
		retval = ms_send_cmd(chip, CLEAR_BUF, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if (!(val & INT_REG_CED)) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		bus_width = 0x88;
	} else {
		/* Serial interface */
		bus_width = 0x80;
	}

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_OLD_BLOCK_0, 0xFF, (u8) old_blk);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_OLD_BLOCK_1, 0xFF,
		       (u8) (old_blk >> 8));
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_NEW_BLOCK_0, 0xFF, (u8) new_blk);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_NEW_BLOCK_1, 0xFF,
		       (u8) (new_blk >> 8));
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_LOG_BLOCK_0, 0xFF, (u8) log_blk);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_LOG_BLOCK_1, 0xFF,
		       (u8) (log_blk >> 8));
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_PAGE_START, 0xFF, start_page);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_PAGE_LENGTH, 0xFF, page_len);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BUS_WIDTH, 0xFF, bus_width);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_COPY_PAGE);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, MODE_CR, 100);
	if (retval != STATUS_SUCCESS) {
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, retval);
	}

	retval = rts51x_get_rsp(chip, 1, 5000);

	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		rts51x_clear_ms_error(chip);
		if (retval == STATUS_TIMEDOUT)
			TRACE_RET(chip, retval);
		TRACE_GOTO(chip, Fail);
	}

	return STATUS_SUCCESS;

Fail:
	retval = ms_erase_block(chip, new_blk);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval =
	    ms_copy_page(chip, old_blk, new_blk, log_blk, start_page, end_page);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}
#endif

static int reset_ms(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	u16 i, reg_addr, block_size;
	u8 val, j, *ptr;
#ifndef SUPPORT_MAGIC_GATE
	u16 eblock_cnt;
#endif

	retval = ms_prepare_reset(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_card->ms_type |= TYPE_MS;

	retval = ms_send_cmd(chip, MS_RESET, NO_WAIT_INT);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_read_status_reg(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_READ_REG(chip, PPBUF_BASE2, &val);
	if (val & WRT_PRTCT)
		chip->card_wp |= MS_CARD;
	else
		chip->card_wp &= ~MS_CARD;

	i = 0;

RE_SEARCH:
	/* Search For Boot Block */
	while (i < (MAX_DEFECTIVE_BLOCK + 2)) {
		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST)
			TRACE_RET(chip, STATUS_FAIL);

		retval = ms_check_boot_block(chip, i);
		if (retval != STATUS_SUCCESS) {
			i++;
			continue;
		}

		ms_card->boot_block = i;
		break;
	}

	if (i == (MAX_DEFECTIVE_BLOCK + 2)) {
		RTS51X_DEBUGP("No boot block found!");
		TRACE_RET(chip, STATUS_FAIL);
	}
	for (j = 0; j < 3; j++) {
		retval = ms_read_page(chip, ms_card->boot_block, j);
		if (retval != STATUS_SUCCESS) {
			if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR)) {
				i = ms_card->boot_block + 1;
				ms_set_err_code(chip, MS_NO_ERROR);
				goto RE_SEARCH;
			}
		}
	}

	/* Read boot block contents */
	retval = ms_read_page(chip, ms_card->boot_block, 0);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	/* Read MS system information as sys_info */
	retval =
	    rts51x_seq_read_register(chip, PPBUF_BASE2 + 0x1A0, 96,
				     ms_card->raw_sys_info);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	/* Read useful block contents */
	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, READ_REG_CMD, HEADER_ID0, 0, 0);
	rts51x_add_cmd(chip, READ_REG_CMD, HEADER_ID1, 0, 0);

	for (reg_addr = DISABLED_BLOCK0; reg_addr <= DISABLED_BLOCK3;
	     reg_addr++) {
		rts51x_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
	}

	for (reg_addr = BLOCK_SIZE_0; reg_addr <= PAGE_SIZE_1; reg_addr++)
		rts51x_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);

	rts51x_add_cmd(chip, READ_REG_CMD, MS_Device_Type, 0, 0);
	rts51x_add_cmd(chip, READ_REG_CMD, MS_4bit_Support, 0, 0);

	retval = rts51x_send_cmd(chip, MODE_CR, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, 16, 100);

	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ptr = rts51x_get_rsp_data(chip);

	RTS51X_DEBUGP("Boot block data:\n");
	RTS51X_DUMP(ptr, 16);

	if (ptr[0] != 0x00 || ptr[1] != 0x01) {
		i = ms_card->boot_block + 1;
		goto RE_SEARCH;
	}
	if (ptr[12] != 0x02 || ptr[13] != 0x00) {
		i = ms_card->boot_block + 1;
		goto RE_SEARCH;
	}
	if ((ptr[14] == 1) || (ptr[14] == 3))
		chip->card_wp |= MS_CARD;
	block_size = ((u16) ptr[6] << 8) | ptr[7];
	if (block_size == 0x0010) {
		ms_card->block_shift = 5;
		ms_card->page_off = 0x1F;
	} else if (block_size == 0x0008) {
		ms_card->block_shift = 4;
		ms_card->page_off = 0x0F;
	}
	ms_card->total_block = ((u16) ptr[8] << 8) | ptr[9];

#ifdef SUPPORT_MAGIC_GATE
	j = ptr[10];

	if (ms_card->block_shift == 4) {
		if (j < 2)
			ms_card->capacity = 0x1EE0;
		else
			ms_card->capacity = 0x3DE0;
	} else {
		if (j < 5)
			ms_card->capacity = 0x7BC0;
		else if (j < 0xA)
			ms_card->capacity = 0xF7C0;
		else if (j < 0x11)
			ms_card->capacity = 0x1EF80;
		else
			ms_card->capacity = 0x3DF00;
	}
#else
	eblock_cnt = ((u16) ptr[10] << 8) | ptr[11];

	ms_card->capacity = ((u32) eblock_cnt - 2) << ms_card->block_shift;
#endif

	chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;

	if (ptr[15]) {
		retval = ms_set_rw_reg_addr(chip, 0, 0, SystemParm, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, STATUS_FAIL);
		RTS51X_WRITE_REG(chip, PPBUF_BASE2, 0xFF, 0x88);
		RTS51X_WRITE_REG(chip, PPBUF_BASE2 + 1, 0xFF, 0);

		retval =
		    ms_transfer_tpc(chip, MS_TM_WRITE_BYTES, WRITE_REG, 1,
				    NO_WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, STATUS_FAIL);
		RTS51X_WRITE_REG(chip, MS_CFG, 0x58 | MS_NO_CHECK_INT,
				 MS_BUS_WIDTH_4 | PUSH_TIME_ODD |
				 MS_NO_CHECK_INT);

		ms_card->ms_type |= MS_4BIT;
	}

	if (CHK_MS4BIT(ms_card))
		chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
	else
		chip->card_bus_width[chip->card2lun[MS_CARD]] = 1;

	return STATUS_SUCCESS;
}

static int ms_init_l2p_tbl(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int size, i, seg_no, retval;
	u16 defect_block, reg_addr;
	u8 val1, val2;

	ms_card->segment_cnt = ms_card->total_block >> 9;
	RTS51X_DEBUGP("ms_card->segment_cnt = %d\n", ms_card->segment_cnt);

	size = ms_card->segment_cnt * sizeof(struct zone_entry);
	ms_card->segment = vmalloc(size);
	if (ms_card->segment == NULL)
		TRACE_RET(chip, STATUS_FAIL);
	memset(ms_card->segment, 0, size);

	retval = ms_read_page(chip, ms_card->boot_block, 1);
	if (retval != STATUS_SUCCESS)
		TRACE_GOTO(chip, INIT_FAIL);

	reg_addr = PPBUF_BASE2;
	for (i = 0; i < (((ms_card->total_block >> 9) * 10) + 1); i++) {
		retval = rts51x_read_register(chip, reg_addr++, &val1);
		if (retval != STATUS_SUCCESS)
			TRACE_GOTO(chip, INIT_FAIL);
		retval = rts51x_read_register(chip, reg_addr++, &val2);
		if (retval != STATUS_SUCCESS)
			TRACE_GOTO(chip, INIT_FAIL);

		defect_block = ((u16) val1 << 8) | val2;
		if (defect_block == 0xFFFF)
			break;
		seg_no = defect_block / 512;
		ms_card->segment[seg_no].defect_list[ms_card->segment[seg_no].
						     disable_count++] =
		    defect_block;
	}

	for (i = 0; i < ms_card->segment_cnt; i++) {
		ms_card->segment[i].build_flag = 0;
		ms_card->segment[i].l2p_table = NULL;
		ms_card->segment[i].free_table = NULL;
		ms_card->segment[i].get_index = 0;
		ms_card->segment[i].set_index = 0;
		ms_card->segment[i].unused_blk_cnt = 0;

		RTS51X_DEBUGP("defective block count of segment %d is %d\n",
			       i, ms_card->segment[i].disable_count);
	}

	return STATUS_SUCCESS;

INIT_FAIL:
	if (ms_card->segment) {
		vfree(ms_card->segment);
		ms_card->segment = NULL;
	}

	return STATUS_FAIL;
}

static u16 ms_get_l2p_tbl(struct rts51x_chip *chip, int seg_no, u16 log_off)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;

	if (ms_card->segment == NULL)
		return 0xFFFF;

	segment = &(ms_card->segment[seg_no]);

	if (segment->l2p_table)
		return segment->l2p_table[log_off];

	return 0xFFFF;
}

static void ms_set_l2p_tbl(struct rts51x_chip *chip, int seg_no, u16 log_off,
			   u16 phy_blk)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;

	if (ms_card->segment == NULL)
		return;

	segment = &(ms_card->segment[seg_no]);
	if (segment->l2p_table)
		segment->l2p_table[log_off] = phy_blk;
}

static void ms_set_unused_block(struct rts51x_chip *chip, u16 phy_blk)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;
	int seg_no;

	seg_no = (int)phy_blk >> 9;
	segment = &(ms_card->segment[seg_no]);

	segment->free_table[segment->set_index++] = phy_blk;
	if (segment->set_index >= MS_FREE_TABLE_CNT)
		segment->set_index = 0;
	segment->unused_blk_cnt++;
}

static u16 ms_get_unused_block(struct rts51x_chip *chip, int seg_no)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;
	u16 phy_blk;

	segment = &(ms_card->segment[seg_no]);

	if (segment->unused_blk_cnt <= 0)
		return 0xFFFF;

	phy_blk = segment->free_table[segment->get_index];
	segment->free_table[segment->get_index++] = 0xFFFF;
	if (segment->get_index >= MS_FREE_TABLE_CNT)
		segment->get_index = 0;
	segment->unused_blk_cnt--;

	return phy_blk;
}

static const unsigned short ms_start_idx[] = {
	0, 494, 990, 1486, 1982, 2478, 2974, 3470,
	3966, 4462, 4958, 5454, 5950, 6446, 6942, 7438, 7934
};

static int ms_arbitrate_l2p(struct rts51x_chip *chip, u16 phy_blk, u16 log_off,
			    u8 us1, u8 us2)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;
	int seg_no;
	u16 tmp_blk;

	seg_no = (int)phy_blk >> 9;
	segment = &(ms_card->segment[seg_no]);
	tmp_blk = segment->l2p_table[log_off];

	if (us1 != us2) {
		if (us1 == 0) {
			if (!(chip->card_wp & MS_CARD))
				ms_erase_block(chip, tmp_blk);
			ms_set_unused_block(chip, tmp_blk);
			segment->l2p_table[log_off] = phy_blk;
		} else {
			if (!(chip->card_wp & MS_CARD))
				ms_erase_block(chip, phy_blk);
			ms_set_unused_block(chip, phy_blk);
		}
	} else {
		if (phy_blk < tmp_blk) {
			if (!(chip->card_wp & MS_CARD))
				ms_erase_block(chip, phy_blk);
			ms_set_unused_block(chip, phy_blk);
		} else {
			if (!(chip->card_wp & MS_CARD))
				ms_erase_block(chip, tmp_blk);
			ms_set_unused_block(chip, tmp_blk);
			segment->l2p_table[log_off] = phy_blk;
		}
	}

	return STATUS_SUCCESS;
}

static int ms_build_l2p_tbl(struct rts51x_chip *chip, int seg_no)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct zone_entry *segment;
	int retval, table_size, disable_cnt, defect_flag, i;
	u16 start, end, phy_blk, log_blk, tmp_blk;
	u8 extra[MS_EXTRA_SIZE], us1, us2;

	RTS51X_DEBUGP("ms_build_l2p_tbl: %d\n", seg_no);

	if (ms_card->segment == NULL) {
		retval = ms_init_l2p_tbl(chip);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	if (ms_card->segment[seg_no].build_flag) {
		RTS51X_DEBUGP("l2p table of segment %d has been built\n",
			       seg_no);
		return STATUS_SUCCESS;
	}

	if (seg_no == 0)
		table_size = 494;
	else
		table_size = 496;

	segment = &(ms_card->segment[seg_no]);

	if (segment->l2p_table == NULL) {
		segment->l2p_table = vmalloc(table_size * 2);
		if (segment->l2p_table == NULL)
			TRACE_GOTO(chip, BUILD_FAIL);
	}
	memset((u8 *) (segment->l2p_table), 0xff, table_size * 2);

	if (segment->free_table == NULL) {
		segment->free_table = vmalloc(MS_FREE_TABLE_CNT * 2);
		if (segment->free_table == NULL)
			TRACE_GOTO(chip, BUILD_FAIL);
	}
	memset((u8 *) (segment->free_table), 0xff, MS_FREE_TABLE_CNT * 2);

	start = (u16) seg_no << 9;
	end = (u16) (seg_no + 1) << 9;

	disable_cnt = segment->disable_count;

	segment->get_index = segment->set_index = 0;
	segment->unused_blk_cnt = 0;

	for (phy_blk = start; phy_blk < end; phy_blk++) {
		if (disable_cnt) {
			defect_flag = 0;
			for (i = 0; i < segment->disable_count; i++) {
				if (phy_blk == segment->defect_list[i]) {
					defect_flag = 1;
					break;
				}
			}
			if (defect_flag) {
				disable_cnt--;
				continue;
			}
		}

		retval =
		    ms_read_extra_data(chip, phy_blk, 0, extra, MS_EXTRA_SIZE);
		if (retval != STATUS_SUCCESS) {
			RTS51X_DEBUGP("read extra data fail\n");
			ms_set_bad_block(chip, phy_blk);
			continue;
		}

		if (seg_no == ms_card->segment_cnt - 1) {
			if (!(extra[1] & NOT_TRANSLATION_TABLE)) {
				if (!(chip->card_wp & MS_CARD)) {
					retval = ms_erase_block(chip, phy_blk);
					if (retval != STATUS_SUCCESS)
						continue;
					extra[2] = 0xff;
					extra[3] = 0xff;
				}
			}
		}

		if (!(extra[0] & BLOCK_OK))
			continue;
		if (!(extra[1] & NOT_BOOT_BLOCK))
			continue;
		if ((extra[0] & PAGE_OK) != PAGE_OK)
			continue;

		log_blk = ((u16) extra[2] << 8) | extra[3];

		if (log_blk == 0xFFFF) {
			if (!(chip->card_wp & MS_CARD)) {
				retval = ms_erase_block(chip, phy_blk);
				if (retval != STATUS_SUCCESS)
					continue;
			}
			ms_set_unused_block(chip, phy_blk);
			continue;
		}

		if ((log_blk < ms_start_idx[seg_no]) ||
		    (log_blk >= ms_start_idx[seg_no + 1])) {
			if (!(chip->card_wp & MS_CARD)) {
				retval = ms_erase_block(chip, phy_blk);
				if (retval != STATUS_SUCCESS)
					continue;
			}
			ms_set_unused_block(chip, phy_blk);
			continue;
		}

		if (segment->l2p_table[log_blk - ms_start_idx[seg_no]] ==
		    0xFFFF) {
			segment->l2p_table[log_blk - ms_start_idx[seg_no]] =
			    phy_blk;
			continue;
		}

		us1 = extra[0] & 0x10;
		tmp_blk = segment->l2p_table[log_blk - ms_start_idx[seg_no]];
		retval =
		    ms_read_extra_data(chip, tmp_blk, 0, extra, MS_EXTRA_SIZE);
		if (retval != STATUS_SUCCESS)
			continue;
		us2 = extra[0] & 0x10;

		(void)ms_arbitrate_l2p(chip, phy_blk,
				       log_blk - ms_start_idx[seg_no], us1,
				       us2);
		continue;
	}

	segment->build_flag = 1;

	RTS51X_DEBUGP("unused block count: %d\n", segment->unused_blk_cnt);

	if (seg_no == ms_card->segment_cnt - 1) {
		if (segment->unused_blk_cnt < 2)
			chip->card_wp |= MS_CARD;
	} else {
		if (segment->unused_blk_cnt < 1)
			chip->card_wp |= MS_CARD;
	}

	if (chip->card_wp & MS_CARD)
		return STATUS_SUCCESS;

	for (log_blk = ms_start_idx[seg_no]; log_blk < ms_start_idx[seg_no + 1];
	     log_blk++) {
		if (segment->l2p_table[log_blk - ms_start_idx[seg_no]] ==
		    0xFFFF) {
			phy_blk = ms_get_unused_block(chip, seg_no);
			if (phy_blk == 0xFFFF) {
				chip->card_wp |= MS_CARD;
				return STATUS_SUCCESS;
			}
			retval = ms_init_page(chip, phy_blk, log_blk, 0, 1);
			if (retval != STATUS_SUCCESS)
				TRACE_GOTO(chip, BUILD_FAIL);
			segment->l2p_table[log_blk - ms_start_idx[seg_no]] =
			    phy_blk;
			if (seg_no == ms_card->segment_cnt - 1) {
				if (segment->unused_blk_cnt < 2) {
					chip->card_wp |= MS_CARD;
					return STATUS_SUCCESS;
				}
			} else {
				if (segment->unused_blk_cnt < 1) {
					chip->card_wp |= MS_CARD;
					return STATUS_SUCCESS;
				}
			}
		}
	}

	if (seg_no == 0) {
		for (log_blk = 0; log_blk < 494; log_blk++) {
			tmp_blk = segment->l2p_table[log_blk];
			if (tmp_blk < ms_card->boot_block) {
				RTS51X_DEBUGP("Boot block is not the first"
							"normal block.\n");

				if (chip->card_wp & MS_CARD)
					break;

				phy_blk = ms_get_unused_block(chip, 0);
#ifdef MS_SPEEDUP
				retval =
				    ms_auto_copy_page(chip, tmp_blk, phy_blk,
						      log_blk, 0,
						      ms_card->page_off + 1);
#else
				retval = ms_copy_page(chip, tmp_blk, phy_blk,
						      log_blk, 0,
						      ms_card->page_off + 1);
#endif
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);

				segment->l2p_table[log_blk] = phy_blk;

				retval = ms_set_bad_block(chip, tmp_blk);
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);
			}
		}
	}

	return STATUS_SUCCESS;

BUILD_FAIL:
	segment->build_flag = 0;
	if (segment->l2p_table) {
		vfree(segment->l2p_table);
		segment->l2p_table = NULL;
	}
	if (segment->free_table) {
		vfree(segment->free_table);
		segment->free_table = NULL;
	}

	return STATUS_FAIL;
}

int reset_ms_card(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	memset(ms_card, 0, sizeof(struct ms_info));

	enable_card_clock(chip, MS_CARD);

	retval = rts51x_select_card(chip, MS_CARD);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_card->ms_type = 0;
	ms_card->last_rw_int = 0;

	retval = reset_ms_pro(chip);
	if (retval != STATUS_SUCCESS) {
		if (ms_card->check_ms_flow) {
			retval = reset_ms(chip);
			if (retval != STATUS_SUCCESS) {
				if (chip->option.reset_or_rw_fail_set_pad_drive) {
					rts51x_write_register(chip,
						CARD_DRIVE_SEL, SD20_DRIVE_MASK,
						DRIVE_8mA);
				}
				TRACE_RET(chip, retval);
			}
		} else {
			if (chip->option.reset_or_rw_fail_set_pad_drive) {
				rts51x_write_register(chip, CARD_DRIVE_SEL,
						      SD20_DRIVE_MASK,
						      DRIVE_8mA);
			}
			TRACE_RET(chip, retval);
		}
	}

	retval = ms_set_init_para(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (!CHK_MSPRO(ms_card)) {
		retval = ms_build_l2p_tbl(chip, ms_card->total_block / 512 - 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	RTS51X_DEBUGP("ms_card->ms_type = 0x%x\n", ms_card->ms_type);

	return STATUS_SUCCESS;
}

static int mspro_set_rw_cmd(struct rts51x_chip *chip, u32 start_sec,
			    u16 sec_cnt, u8 cmd)
{
	int retval, i;
	u8 data[8];

	data[0] = cmd;
	data[1] = (u8) (sec_cnt >> 8);
	data[2] = (u8) sec_cnt;
	data[3] = (u8) (start_sec >> 24);
	data[4] = (u8) (start_sec >> 16);
	data[5] = (u8) (start_sec >> 8);
	data[6] = (u8) start_sec;
	data[7] = 0;

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, PRO_EX_SET_CMD, 7, WAIT_INT, data, 8);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	return STATUS_SUCCESS;
}

static void mspro_stop_seq_mode(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	if (ms_card->seq_mode) {
		retval = ms_switch_clock(chip);
		if (retval != STATUS_SUCCESS)
			return;

		ms_card->seq_mode = 0;
		ms_card->total_sec_cnt = 0;
		ms_card->last_rw_int = 0;
		ms_send_cmd(chip, PRO_STOP, WAIT_INT);

		rts51x_ep0_write_register(chip, MC_FIFO_CTL, FIFO_FLUSH,
					  FIFO_FLUSH);
	}
}

static inline int ms_auto_tune_clock(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	if (chip->asic_code) {
		if (ms_card->ms_clock > 30)
			ms_card->ms_clock -= 20;
	} else {
		if (ms_card->ms_clock == CLK_80)
			ms_card->ms_clock = CLK_60;
		else if (ms_card->ms_clock == CLK_60)
			ms_card->ms_clock = CLK_40;
	}

	retval = ms_switch_clock(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}

static int mspro_rw_multi_sector(struct scsi_cmnd *srb,
				 struct rts51x_chip *chip, u32 start_sector,
				 u16 sector_cnt)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, mode_2k = 0;
	u16 count;
	u8 val, trans_mode, rw_tpc, rw_cmd;

	ms_set_err_code(chip, MS_NO_ERROR);

	ms_card->counter = 0;

	if (CHK_MSHG(ms_card)) {
		if ((start_sector % 4) || (sector_cnt % 4)) {
			if (srb->sc_data_direction == DMA_FROM_DEVICE) {
				rw_tpc = PRO_READ_LONG_DATA;
				rw_cmd = PRO_READ_DATA;
			} else {
				rw_tpc = PRO_WRITE_LONG_DATA;
				rw_cmd = PRO_WRITE_DATA;
			}
		} else {
			if (srb->sc_data_direction == DMA_FROM_DEVICE) {
				rw_tpc = PRO_READ_QUAD_DATA;
				rw_cmd = PRO_READ_2K_DATA;
			} else {
				rw_tpc = PRO_WRITE_QUAD_DATA;
				rw_cmd = PRO_WRITE_2K_DATA;
			}
			mode_2k = 1;
		}
	} else {
		if (srb->sc_data_direction == DMA_FROM_DEVICE) {
			rw_tpc = PRO_READ_LONG_DATA;
			rw_cmd = PRO_READ_DATA;
		} else {
			rw_tpc = PRO_WRITE_LONG_DATA;
			rw_cmd = PRO_WRITE_DATA;
		}
	}

	retval = ms_switch_clock(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	if (srb->sc_data_direction == DMA_FROM_DEVICE)
		trans_mode = MS_TM_AUTO_READ;
	else
		trans_mode = MS_TM_AUTO_WRITE;

	val = ms_card->last_rw_int;

	if (ms_card->seq_mode) {
		if ((ms_card->pre_dir != srb->sc_data_direction)
		    || ((ms_card->pre_sec_addr + ms_card->pre_sec_cnt) !=
			start_sector)
		    || (mode_2k && (ms_card->seq_mode & MODE_512_SEQ))
		    || (!mode_2k && (ms_card->seq_mode & MODE_2K_SEQ))
		    || !(val & MS_INT_BREQ)
		    || ((ms_card->total_sec_cnt + sector_cnt) > 0xFE00)) {
			ms_card->seq_mode = 0;
			ms_card->total_sec_cnt = 0;
			ms_card->last_rw_int = 0;
			if (val & MS_INT_BREQ) {
				retval = ms_send_cmd(chip, PRO_STOP, WAIT_INT);
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);

				rts51x_ep0_write_register(chip, MC_FIFO_CTL,
					FIFO_FLUSH, FIFO_FLUSH);
			}
		}
	}

	if (!ms_card->seq_mode) {
		ms_card->total_sec_cnt = 0;
		if (sector_cnt >= 0x80) {
			if ((ms_card->capacity - start_sector) > 0xFE00)
				count = 0xFE00;
			else
				count =
				    (u16) (ms_card->capacity - start_sector);
			if (count > sector_cnt) {
				if (mode_2k)
					ms_card->seq_mode |= MODE_2K_SEQ;
				else
					ms_card->seq_mode |= MODE_512_SEQ;
			}
		} else {
			count = sector_cnt;
		}
		retval = mspro_set_rw_cmd(chip, start_sector, count, rw_cmd);
		if (retval != STATUS_SUCCESS) {
			ms_card->seq_mode = 0;
			TRACE_RET(chip, retval);
		}
	}

	retval =
	    ms_transfer_data(chip, trans_mode, rw_tpc, sector_cnt, WAIT_INT,
			     mode_2k, scsi_sg_count(srb), scsi_sglist(srb),
			     scsi_bufflen(srb));
	if (retval != STATUS_SUCCESS) {
		ms_card->seq_mode = 0;
		rts51x_ep0_read_register(chip, MS_TRANS_CFG, &val);
		rts51x_clear_ms_error(chip);
		if (val & MS_INT_BREQ)
			ms_send_cmd(chip, PRO_STOP, WAIT_INT);
		if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
			RTS51X_DEBUGP("MSPro CRC error, tune clock!\n");
			ms_auto_tune_clock(chip);
		}

		TRACE_RET(chip, retval);
	}

	ms_card->pre_sec_addr = start_sector;
	ms_card->pre_sec_cnt = sector_cnt;
	ms_card->pre_dir = srb->sc_data_direction;
	ms_card->total_sec_cnt += sector_cnt;

	return STATUS_SUCCESS;
}

static int mspro_read_format_progress(struct rts51x_chip *chip,
				      const int short_data_len)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u32 total_progress, cur_progress;
	u8 cnt, tmp;
	u8 data[8];

	ms_card->format_status = FORMAT_FAIL;

	retval = ms_switch_clock(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	RTS51X_READ_REG(chip, MS_TRANS_CFG, &tmp);

	if ((tmp & (MS_INT_CED | MS_INT_CMDNK | MS_INT_ERR)) == MS_INT_CED) {
		ms_card->format_status = FORMAT_SUCCESS;
		ms_card->pro_under_formatting = 0;
		return STATUS_SUCCESS;
	}
	if (!
	    ((tmp & (MS_INT_BREQ | MS_INT_CED | MS_INT_CMDNK | MS_INT_ERR)) ==
	     MS_INT_BREQ)) {
		ms_card->pro_under_formatting = 0;
		TRACE_RET(chip, STATUS_FAIL);
	}

	if (short_data_len >= 256)
		cnt = 0;
	else
		cnt = (u8) short_data_len;

	retval =
	    ms_read_bytes(chip, PRO_READ_SHORT_DATA, cnt, WAIT_INT, data, 8);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	total_progress =
	    (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
	cur_progress =
	    (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];

	RTS51X_DEBUGP("total_progress = %d, cur_progress = %d\n",
		       total_progress, cur_progress);

	if (total_progress == 0) {
		ms_card->progress = 0;
	} else {
		u64 ulltmp = (u64) cur_progress * (u64) 65535;
		do_div(ulltmp, total_progress);
		ms_card->progress = (u16) ulltmp;
	}
	RTS51X_DEBUGP("progress = %d\n", ms_card->progress);

	for (i = 0; i < 2500; i++) {
		RTS51X_READ_REG(chip, MS_TRANS_CFG, &tmp);
		if (tmp &
		    (MS_INT_CED | MS_INT_CMDNK | MS_INT_BREQ | MS_INT_ERR))
			break;

		wait_timeout(1);
	}

	if (i == 2500)
		TRACE_RET(chip, STATUS_FAIL);

	RTS51X_DEBUGP("MSPro format tmp:%d\n", tmp);

	if (tmp & (MS_INT_CMDNK | MS_INT_ERR))
		TRACE_RET(chip, STATUS_FAIL);
	if (tmp & MS_INT_CED) {
		ms_card->format_status = FORMAT_SUCCESS;
		ms_card->pro_under_formatting = 0;
	} else if (tmp & MS_INT_BREQ) {
		ms_card->format_status = FORMAT_IN_PROGRESS;
	} else {
		ms_card->format_status = FORMAT_FAIL;
		ms_card->pro_under_formatting = 0;
		TRACE_RET(chip, STATUS_FAIL);
	}

	RTS51X_DEBUGP("MSPro format format_status:%d\n",
		       ms_card->format_status);

	return STATUS_SUCCESS;
}

void mspro_polling_format_status(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int i;

	if (ms_card->pro_under_formatting) {
		for (i = 0; i < 65535; i++) {
			mspro_read_format_progress(chip, MS_SHORT_DATA_LEN);
			if (ms_card->format_status != FORMAT_IN_PROGRESS)
				break;
		}
	}

	return;
}

void mspro_format_sense(struct rts51x_chip *chip, unsigned int lun)
{
	struct ms_info *ms_card = &(chip->ms_card);

	if (CHK_FORMAT_STATUS(ms_card, FORMAT_SUCCESS)) {
		set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
		ms_card->pro_under_formatting = 0;
		ms_card->progress = 0;
	} else if (CHK_FORMAT_STATUS(ms_card, FORMAT_IN_PROGRESS)) {
		set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
			       0, (u16) (ms_card->progress));
	} else {
		set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
		ms_card->pro_under_formatting = 0;
		ms_card->progress = 0;
	}
}

int mspro_format(struct scsi_cmnd *srb, struct rts51x_chip *chip,
		 int short_data_len, int quick_format)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 buf[8], tmp;
	u16 para;

	retval = ms_switch_clock(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = ms_set_rw_reg_addr(chip, 0x00, 0x00, Pro_TPCParm, 0x01);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	memset(buf, 0, 2);
	switch (short_data_len) {
	case 32:
		buf[0] = 0;
		break;
	case 64:
		buf[0] = 1;
		break;
	case 128:
		buf[0] = 2;
		break;
	case 256:
	default:
		buf[0] = 3;
		break;
	}

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, PRO_WRITE_REG, 1, NO_WAIT_INT, buf, 2);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);
	/* Format command */
	if (quick_format)
		para = 0x0000;
	else
		para = 0x0001;
	retval = mspro_set_rw_cmd(chip, 0, para, PRO_FORMAT);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	/* Check INT */
	RTS51X_READ_REG(chip, MS_TRANS_CFG, &tmp);
	if (tmp & (MS_INT_CMDNK | MS_INT_ERR))
		TRACE_RET(chip, STATUS_FAIL);

	if ((tmp & (MS_INT_BREQ | MS_INT_CED)) == MS_INT_BREQ) {
		ms_card->pro_under_formatting = 1;
		ms_card->progress = 0;
		ms_card->format_status = FORMAT_IN_PROGRESS;
		return STATUS_SUCCESS;
	}

	if (tmp & MS_INT_CED) {
		ms_card->pro_under_formatting = 0;
		ms_card->progress = 0;
		ms_card->format_status = FORMAT_SUCCESS;
		set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_NO_SENSE);
		return STATUS_SUCCESS;
	}

	TRACE_RET(chip, STATUS_FAIL);
}

#ifdef MS_SPEEDUP
static int ms_read_multiple_pages(struct rts51x_chip *chip, u16 phy_blk,
				  u16 log_blk, u8 start_page, u8 end_page,
				  u8 *buf, void **ptr, unsigned int *offset)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;
	int send_blkend;
	u8 extra[MS_EXTRA_SIZE], val1, val2, data[6];
	u8 page_cnt = end_page - start_page, page_addr, sec_cnt;

	if (end_page != (ms_card->page_off + 1))
		send_blkend = 1;
	else
		send_blkend = 0;

	retval =
	    ms_read_extra_data(chip, phy_blk, start_page, extra, MS_EXTRA_SIZE);
	if (retval == STATUS_SUCCESS) {
		if ((extra[1] & 0x30) != 0x30) {
			ms_set_err_code(chip, MS_FLASH_READ_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (phy_blk >> 8);
	data[3] = (u8) phy_blk;
	/* Page Number
	 * Extra data access mode */
	data[4] = 0;
	data[5] = start_page;

	retval =
	    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm, 6,
			    BLOCK_READ, WAIT_INT, data, 6, &val1);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	rts51x_init_cmd(chip);

	if (send_blkend)
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BLKEND, SET_BLKEND,
			       SET_BLKEND);
	else
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BLKEND, SET_BLKEND, 0);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, WAIT_INT,
		       NO_WAIT_INT);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_L, 0xFF,
		       (u8) page_cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_H, 0xFF, 0);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, READ_PAGE_DATA);

	trans_dma_enable(DMA_FROM_DEVICE, chip, 512 * page_cnt, DMA_512);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_MULTI_READ);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, MODE_CDIR | STAGE_MS_STATUS, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval =
	    rts51x_transfer_data_partial(chip, RCV_BULK_PIPE(chip), (void *)buf,
					 ptr, offset, 512 * page_cnt,
					 scsi_sg_count(chip->srb), NULL, 2000);
	if (retval != STATUS_SUCCESS) {
		rts51x_clear_ms_error(chip);
		if (retval == STATUS_TIMEDOUT)
			TRACE_RET(chip, retval);
		TRACE_GOTO(chip, Fail);
	}
	retval = rts51x_get_rsp(chip, 3, 200);
	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		rts51x_clear_ms_error(chip);
		if (retval == STATUS_TIMEDOUT)
			TRACE_RET(chip, retval);
		TRACE_GOTO(chip, Fail);
	}

	return STATUS_SUCCESS;

Fail:
	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, READ_REG_CMD, MS_SECTOR_CNT_L, 0, 0);

	retval = rts51x_send_cmd(chip, MODE_CR | STAGE_MS_STATUS, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval = rts51x_get_rsp(chip, 3, 200);

	if (CHECK_MS_TRANS_FAIL(chip, retval))
		TRACE_RET(chip, STATUS_FAIL);

	sec_cnt = chip->rsp_buf[0];
	RTS51X_DEBUGP("%d pages need be transferred, %d pages remained\n",
		       (int)page_cnt, (int)sec_cnt);
	page_addr = start_page + (page_cnt - sec_cnt);

	if (CHK_MS4BIT(ms_card)) {
		val1 = chip->rsp_buf[1];
		RTS51X_DEBUGP("MS_TRANS_CFG: 0x%x\n", val1);
	} else {
		val1 = 0;
	}

	val2 = chip->rsp_buf[2];
	RTS51X_DEBUGP("GET_INT: 0x%x\n", val2);

	if ((val1 & INT_CMDNK) || (val2 & INT_REG_CMDNK)) {
		ms_set_err_code(chip, MS_CMD_NK);
		TRACE_RET(chip, STATUS_FAIL);
	}

	if ((val1 & INT_ERR) || (val2 & INT_REG_ERR)) {
		if ((val1 & INT_BREQ) || (val2 & INT_REG_BREQ)) {
			retval = ms_read_status_reg(chip);
			if (retval != STATUS_SUCCESS) {
				if (!(chip->card_wp & MS_CARD)) {
					reset_ms(chip);
					ms_set_page_status(log_blk, setPS_NG,
						extra, MS_EXTRA_SIZE);
					ms_write_extra_data(chip, phy_blk,
						page_addr, extra,
						MS_EXTRA_SIZE);
				}
				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		} else {
			ms_set_err_code(chip, MS_FLASH_READ_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	} else {
		if (CHK_MS4BIT(ms_card)) {
			if (!(val1 & INT_BREQ) && !(val2 & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_BREQ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		} else {
			if (!(val2 & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_BREQ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}
	}

	TRACE_RET(chip, STATUS_FAIL);
}

static int ms_write_multiple_pages(struct rts51x_chip *chip, u16 old_blk,
				   u16 new_blk, u16 log_blk, u8 start_page,
				   u8 end_page, u8 *buf, void **ptr,
				   unsigned int *offset)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	int send_blkend;
	u8 val, data[16];
	u8 page_cnt = end_page - start_page;

	if ((end_page == (ms_card->page_off + 1)) || (page_cnt == 1))
		send_blkend = 0;
	else
		send_blkend = 1;

	if (!start_page) {
		if (CHK_MS4BIT(ms_card)) {
			/* Parallel interface */
			data[0] = 0x88;
		} else {
			/* Serial interface */
			data[0] = 0x80;
		}
		/* Block Address */
		data[1] = 0;
		data[2] = (u8) (old_blk >> 8);
		data[3] = (u8) old_blk;
		data[4] = 0x80;
		data[5] = 0;
		data[6] = 0xEF;
		data[7] = 0xFF;

		retval =
		    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE,
				    SystemParm, 7, BLOCK_WRITE, WAIT_INT, data,
				    7, &val);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	retval =
	    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			       (6 + MS_EXTRA_SIZE));
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_set_err_code(chip, MS_NO_ERROR);

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (new_blk >> 8);
	data[3] = (u8) new_blk;
	/* Page Number
	 * Extra data access mode */
	if (page_cnt == 1) {
		/* Single page access mode */
		data[4] = 0x20;
	} else {
		/* Block access mode */
		data[4] = 0;
	}
	data[5] = start_page;
	data[6] = 0xF8;
	data[7] = 0xFF;
	data[8] = (u8) (log_blk >> 8);
	data[9] = (u8) log_blk;

	for (i = 0x0A; i < 0x10; i++) {
		/* ECC */
		data[i] = 0xFF;
	}

	retval =
	    ms_auto_set_cmd(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			    (6 + MS_EXTRA_SIZE), BLOCK_WRITE, WAIT_INT, data,
			    16, &val);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	rts51x_init_cmd(chip);

	if (send_blkend)
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BLKEND, SET_BLKEND,
			       SET_BLKEND);
	else
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_BLKEND, SET_BLKEND, 0);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, WAIT_INT,
		       NO_WAIT_INT);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_L, 0xFF,
		       (u8) page_cnt);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_H, 0xFF, 0);
	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, WRITE_PAGE_DATA);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
		       RING_BUFFER);

	trans_dma_enable(DMA_TO_DEVICE, chip, 512 * page_cnt, DMA_512);

	rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
		       MS_TRANSFER_START | MS_TM_MULTI_WRITE);
	rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER, MS_TRANSFER_END,
		       MS_TRANSFER_END);

	retval = rts51x_send_cmd(chip, MODE_CDOR | STAGE_MS_STATUS, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	retval =
	    rts51x_transfer_data_partial(chip, SND_BULK_PIPE(chip), (void *)buf,
					 ptr, offset, 512 * page_cnt,
					 scsi_sg_count(chip->srb), NULL, 2000);
	if (retval != STATUS_SUCCESS) {
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, retval);
	}

	retval = rts51x_get_rsp(chip, 3, 2000);


	if (CHECK_MS_TRANS_FAIL(chip, retval)) {
		rts51x_clear_ms_error(chip);
		TRACE_RET(chip, STATUS_FAIL);
	}

	return STATUS_SUCCESS;
}

#else

static int ms_read_multiple_pages(struct rts51x_chip *chip, u16 phy_blk,
				  u16 log_blk, u8 start_page, u8 end_page,
				  u8 *buf, void **ptr, unsigned int *offset)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 extra[MS_EXTRA_SIZE], page_addr, val, trans_cfg, data[6];

	retval =
	    ms_read_extra_data(chip, phy_blk, start_page, extra, MS_EXTRA_SIZE);
	if (retval == STATUS_SUCCESS) {
		if ((extra[1] & 0x30) != 0x30) {
			ms_set_err_code(chip, MS_FLASH_READ_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	retval =
	    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			       6);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);
	/* Write REG */
	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (phy_blk >> 8);
	data[3] = (u8) phy_blk;
	/* Page Number
	 * Extra data access mode */
	data[4] = 0;
	data[5] = start_page;

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	ms_set_err_code(chip, MS_NO_ERROR);

	retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	for (page_addr = start_page; page_addr < end_page; page_addr++) {
		ms_set_err_code(chip, MS_NO_ERROR);

		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST) {
			ms_set_err_code(chip, MS_NO_CARD);
			chip->card_exist &= ~MS_CARD;
			chip->card_ready &= ~MS_CARD;
			TRACE_RET(chip, STATUS_FAIL);
		}
		/* GET_INT Register */
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
		if (val & INT_REG_CMDNK) {
			ms_set_err_code(chip, MS_CMD_NK);
			TRACE_RET(chip, STATUS_FAIL);
		}
		if (val & INT_REG_ERR) {
			if (val & INT_REG_BREQ) {
				retval = ms_read_status_reg(chip);
				if (retval != STATUS_SUCCESS) {
					if (!(chip->card_wp & MS_CARD)) {
						reset_ms(chip);
						ms_set_page_status(log_blk,
							setPS_NG, extra,
							MS_EXTRA_SIZE);
						ms_write_extra_data(chip,
							phy_blk, page_addr,
							extra, MS_EXTRA_SIZE);
					}
					ms_set_err_code(chip,
							MS_FLASH_READ_ERROR);
					TRACE_RET(chip, STATUS_FAIL);
				}
			} else {
				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		} else {
			if (!(val & INT_REG_BREQ)) {
				ms_set_err_code(chip, MS_BREQ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}

		if (page_addr == (end_page - 1)) {
			if (!(val & INT_REG_CED)) {
				retval = ms_send_cmd(chip, BLOCK_END, WAIT_INT);
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);
			}
			retval =
			    ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val,
					  1);
			if (retval != STATUS_SUCCESS)
				TRACE_RET(chip, retval);
			if (!(val & INT_REG_CED)) {
				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}

			trans_cfg = NO_WAIT_INT;
		} else {
			trans_cfg = WAIT_INT;
		}

		rts51x_init_cmd(chip);

		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF,
			       READ_PAGE_DATA);
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF,
			       trans_cfg);

		trans_dma_enable(DMA_FROM_DEVICE, chip, 512, DMA_512);

		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
			       MS_TRANSFER_START | MS_TM_NORMAL_READ);
		rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
			       MS_TRANSFER_END, MS_TRANSFER_END);

		retval = rts51x_send_cmd(chip, MODE_CDIR, 100);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval =
		    rts51x_transfer_data_partial(chip, RCV_BULK_PIPE(chip),
						 (void *)buf, ptr, offset, 512,
						 scsi_sg_count(chip->srb), NULL,
						 2000);
		if (retval != STATUS_SUCCESS) {
			if (retval == STATUS_TIMEDOUT) {
				ms_set_err_code(chip, MS_TO_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, retval);
			}

			retval =
			    rts51x_ep0_read_register(chip, MS_TRANS_CFG, &val);
			if (retval != STATUS_SUCCESS) {
				ms_set_err_code(chip, MS_TO_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, STATUS_FAIL);
			}
			if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
				ms_set_err_code(chip, MS_CRC16_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}

		retval = rts51x_get_rsp(chip, 1, 2000);
		if (CHECK_MS_TRANS_FAIL(chip, retval)) {
			if (retval == STATUS_TIMEDOUT) {
				ms_set_err_code(chip, MS_TO_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, retval);
			}

			retval =
			    rts51x_ep0_read_register(chip, MS_TRANS_CFG, &val);
			if (retval != STATUS_SUCCESS) {
				ms_set_err_code(chip, MS_TO_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, retval);
			}
			if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
				ms_set_err_code(chip, MS_CRC16_ERROR);
				rts51x_clear_ms_error(chip);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}
	}

	return STATUS_SUCCESS;
}

static int ms_write_multiple_pages(struct rts51x_chip *chip, u16 old_blk,
				   u16 new_blk, u16 log_blk, u8 start_page,
				   u8 end_page, u8 *buf, void **ptr,
				   unsigned int *offset)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, i;
	u8 page_addr, val, data[16];

	if (!start_page) {
		retval =
		    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
				       SystemParm, 7);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if (CHK_MS4BIT(ms_card)) {
			/* Parallel interface */
			data[0] = 0x88;
		} else {
			/* Serial interface */
			data[0] = 0x80;
		}
		/* Block Address */
		data[1] = 0;
		data[2] = (u8) (old_blk >> 8);
		data[3] = (u8) old_blk;
		data[4] = 0x80;
		data[5] = 0;
		data[6] = 0xEF;
		data[7] = 0xFF;

		retval =
		    ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT, data, 8);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
		/* GET_INT Register */
		ms_set_err_code(chip, MS_NO_ERROR);
		retval =
		    ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT, 1,
				    NO_WAIT_INT);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	retval =
	    ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE, SystemParm,
			       (6 + MS_EXTRA_SIZE));
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	ms_set_err_code(chip, MS_NO_ERROR);

	if (CHK_MS4BIT(ms_card)) {
		/* Parallel interface */
		data[0] = 0x88;
	} else {
		/* Serial interface */
		data[0] = 0x80;
	}
	/* Block Address */
	data[1] = 0;
	data[2] = (u8) (new_blk >> 8);
	data[3] = (u8) new_blk;
	/* Page Number
	 * Extra data access mode */
	if ((end_page - start_page) == 1) {
		/* Single page access mode */
		data[4] = 0x20;
	} else {
		/* Block access mode */
		data[4] = 0;
	}
	data[5] = start_page;
	data[6] = 0xF8;
	data[7] = 0xFF;
	data[8] = (u8) (log_blk >> 8);
	data[9] = (u8) log_blk;

	for (i = 0x0A; i < 0x10; i++) {
		/* ECC */
		data[i] = 0xFF;
	}

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval =
		    ms_write_bytes(chip, WRITE_REG, 6 + MS_EXTRA_SIZE,
				   NO_WAIT_INT, data, 16);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);

	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
		if (retval == STATUS_SUCCESS)
			break;
	}
	if (i == MS_MAX_RETRY_COUNT)
		TRACE_RET(chip, STATUS_FAIL);
	/* GET_INT Register */
	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	for (page_addr = start_page; page_addr < end_page; page_addr++) {
		ms_set_err_code(chip, MS_NO_ERROR);

		if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST) {
			ms_set_err_code(chip, MS_NO_CARD);
			TRACE_RET(chip, STATUS_FAIL);
		}

		if (val & INT_REG_CMDNK) {
			ms_set_err_code(chip, MS_CMD_NK);
			TRACE_RET(chip, STATUS_FAIL);
		}
		if (val & INT_REG_ERR) {
			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}
		if (!(val & INT_REG_BREQ)) {
			ms_set_err_code(chip, MS_BREQ_ERROR);
			TRACE_RET(chip, STATUS_FAIL);
		}

		udelay(30);

		rts51x_init_cmd(chip);

		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF,
			       WRITE_PAGE_DATA);
		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF,
			       WAIT_INT);

		trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);

		rts51x_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
			       MS_TRANSFER_START | MS_TM_NORMAL_WRITE);
		rts51x_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
			       MS_TRANSFER_END, MS_TRANSFER_END);

		retval = rts51x_send_cmd(chip, MODE_CDOR, 100);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		retval =
		    rts51x_transfer_data_partial(chip, SND_BULK_PIPE(chip),
						 (void *)buf, ptr, offset, 512,
						 scsi_sg_count(chip->srb), NULL,
						 2000);
		if (retval != STATUS_SUCCESS) {
			ms_set_err_code(chip, MS_TO_ERROR);
			rts51x_clear_ms_error(chip);

			if (retval == STATUS_TIMEDOUT)
				TRACE_RET(chip, STATUS_TIMEDOUT);
			else
				TRACE_RET(chip, STATUS_FAIL);
		}

		retval = rts51x_get_rsp(chip, 1, 2000);
		if (CHECK_MS_TRANS_FAIL(chip, retval)) {
			ms_set_err_code(chip, MS_TO_ERROR);
			rts51x_clear_ms_error(chip);

			if (retval == STATUS_TIMEDOUT)
				TRACE_RET(chip, STATUS_TIMEDOUT);
			else
				TRACE_RET(chip, STATUS_FAIL);
		}
		/* GET_INT Register */
		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		if ((end_page - start_page) == 1) {
			if (!(val & INT_REG_CED)) {
				/* Command can not be executed */
				ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
				TRACE_RET(chip, STATUS_FAIL);
			}
		} else {
			if (page_addr == (end_page - 1)) {
				if (!(val & INT_REG_CED)) {
					retval =
					    ms_send_cmd(chip, BLOCK_END,
							WAIT_INT);
					if (retval != STATUS_SUCCESS)
						TRACE_RET(chip, retval);
				}
				/* GET_INT Register */
				retval =
				    ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT,
						  &val, 1);
				if (retval != STATUS_SUCCESS)
					TRACE_RET(chip, retval);
			}

			if ((page_addr == (end_page - 1))
			    || (page_addr == ms_card->page_off)) {
				if (!(val & INT_REG_CED)) {
					ms_set_err_code(chip,
							MS_FLASH_WRITE_ERROR);
					TRACE_RET(chip, STATUS_FAIL);
				}
			}
		}
	}

	return STATUS_SUCCESS;
}
#endif

static int ms_finish_write(struct rts51x_chip *chip, u16 old_blk, u16 new_blk,
			   u16 log_blk, u8 page_off)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval, seg_no;

#ifdef MS_SPEEDUP
	retval = ms_auto_copy_page(chip, old_blk, new_blk, log_blk,
				   page_off, ms_card->page_off + 1);
#else
	retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
			      page_off, ms_card->page_off + 1);
#endif
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	seg_no = old_blk >> 9;

	if (MS_TST_BAD_BLOCK_FLG(ms_card)) {
		MS_CLR_BAD_BLOCK_FLG(ms_card);
		ms_set_bad_block(chip, old_blk);
	} else {
		retval = ms_erase_block(chip, old_blk);
		if (retval == STATUS_SUCCESS)
			ms_set_unused_block(chip, old_blk);
	}

	ms_set_l2p_tbl(chip, seg_no, log_blk - ms_start_idx[seg_no], new_blk);

	return STATUS_SUCCESS;
}

static int ms_prepare_write(struct rts51x_chip *chip, u16 old_blk, u16 new_blk,
			    u16 log_blk, u8 start_page)
{
	int retval;

	if (start_page) {
#ifdef MS_SPEEDUP
		retval =
		    ms_auto_copy_page(chip, old_blk, new_blk, log_blk, 0,
				      start_page);
#else
		retval =
		    ms_copy_page(chip, old_blk, new_blk, log_blk, 0,
				 start_page);
#endif
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	return STATUS_SUCCESS;
}

int ms_delay_write(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	struct ms_delay_write_tag *delay_write = &(ms_card->delay_write);
	int retval;

	if (delay_write->delay_write_flag) {
		retval = ms_set_init_para(chip);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);

		delay_write->delay_write_flag = 0;
		retval = ms_finish_write(chip,
					 delay_write->old_phyblock,
					 delay_write->new_phyblock,
					 delay_write->logblock,
					 delay_write->pageoff);
		if (retval != STATUS_SUCCESS)
			TRACE_RET(chip, retval);
	}

	return STATUS_SUCCESS;
}

static inline void ms_rw_fail(struct scsi_cmnd *srb, struct rts51x_chip *chip)
{
	if (srb->sc_data_direction == DMA_FROM_DEVICE)
		set_sense_type(chip, SCSI_LUN(srb),
			       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
	else
		set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
}

static int ms_rw_multi_sector(struct scsi_cmnd *srb, struct rts51x_chip *chip,
			      u32 start_sector, u16 sector_cnt)
{
	struct ms_info *ms_card = &(chip->ms_card);
	unsigned int lun = SCSI_LUN(srb);
	int retval, seg_no;
	unsigned int offset = 0;
	u16 old_blk = 0, new_blk = 0, log_blk, total_sec_cnt = sector_cnt;
	u8 start_page, end_page = 0, page_cnt;
	u8 *buf;
	void *ptr = NULL;
	struct ms_delay_write_tag *delay_write = &(ms_card->delay_write);

	ms_set_err_code(chip, MS_NO_ERROR);

	ms_card->counter = 0;

	buf = (u8 *) scsi_sglist(srb);

	retval = ms_switch_clock(chip);
	if (retval != STATUS_SUCCESS) {
		ms_rw_fail(srb, chip);
		TRACE_RET(chip, retval);
	}

	log_blk = (u16) (start_sector >> ms_card->block_shift);
	start_page = (u8) (start_sector & ms_card->page_off);

	for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1; seg_no++) {
		if (log_blk < ms_start_idx[seg_no + 1])
			break;
	}

	if (ms_card->segment[seg_no].build_flag == 0) {
		retval = ms_build_l2p_tbl(chip, seg_no);
		if (retval != STATUS_SUCCESS) {
			chip->card_fail |= MS_CARD;
			set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
			TRACE_RET(chip, retval);
		}
	}

	if (srb->sc_data_direction == DMA_TO_DEVICE) {
		if (delay_write->delay_write_flag &&
		    (delay_write->logblock == log_blk) &&
		    (start_page > delay_write->pageoff)) {
			delay_write->delay_write_flag = 0;
#ifdef MS_SPEEDUP
			retval = ms_auto_copy_page(chip,
						   delay_write->old_phyblock,
						   delay_write->new_phyblock,
						   log_blk,
						   delay_write->pageoff,
						   start_page);
#else
			retval = ms_copy_page(chip,
					      delay_write->old_phyblock,
					      delay_write->new_phyblock,
					      log_blk, delay_write->pageoff,
					      start_page);
#endif
			if (retval != STATUS_SUCCESS) {
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_WRITE_ERR);
				TRACE_RET(chip, retval);
			}
			old_blk = delay_write->old_phyblock;
			new_blk = delay_write->new_phyblock;
		} else if (delay_write->delay_write_flag &&
			   (delay_write->logblock == log_blk) &&
			   (start_page == delay_write->pageoff)) {
			delay_write->delay_write_flag = 0;
			old_blk = delay_write->old_phyblock;
			new_blk = delay_write->new_phyblock;
		} else {
			retval = ms_delay_write(chip);
			if (retval != STATUS_SUCCESS) {
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_WRITE_ERR);
				TRACE_RET(chip, retval);
			}
			old_blk =
			    ms_get_l2p_tbl(chip, seg_no,
					   log_blk - ms_start_idx[seg_no]);
			new_blk = ms_get_unused_block(chip, seg_no);
			if ((old_blk == 0xFFFF) || (new_blk == 0xFFFF)) {
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_WRITE_ERR);
				TRACE_RET(chip, STATUS_FAIL);
			}

			retval =
			    ms_prepare_write(chip, old_blk, new_blk, log_blk,
					     start_page);
			if (retval != STATUS_SUCCESS) {
				if (monitor_card_cd(chip, MS_CARD) ==
				    CD_NOT_EXIST) {
					set_sense_type(chip, lun,
						SENSE_TYPE_MEDIA_NOT_PRESENT);
					TRACE_RET(chip, STATUS_FAIL);
				}

				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_WRITE_ERR);
				TRACE_RET(chip, retval);
			}
		}
	} else {
		retval = ms_delay_write(chip);
		if (retval != STATUS_SUCCESS) {
			if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST) {
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_NOT_PRESENT);
				TRACE_RET(chip, STATUS_FAIL);
			}

			set_sense_type(chip, lun,
				       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
			TRACE_RET(chip, retval);
		}
		old_blk =
		    ms_get_l2p_tbl(chip, seg_no,
				   log_blk - ms_start_idx[seg_no]);
		if (old_blk == 0xFFFF) {
			set_sense_type(chip, lun,
				       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
			TRACE_RET(chip, STATUS_FAIL);
		}
	}

	RTS51X_DEBUGP("seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n", seg_no,
		       old_blk, new_blk);

	while (total_sec_cnt) {
		if ((start_page + total_sec_cnt) > (ms_card->page_off + 1))
			end_page = ms_card->page_off + 1;
		else
			end_page = start_page + (u8) total_sec_cnt;
		page_cnt = end_page - start_page;

		RTS51X_DEBUGP("start_page = %d, end_page = %d,"
					"page_cnt = %d\n",
					start_page, end_page, page_cnt);

		if (srb->sc_data_direction == DMA_FROM_DEVICE)
			retval = ms_read_multiple_pages(chip,
							old_blk, log_blk,
							start_page, end_page,
							buf, &ptr, &offset);
		else
			retval = ms_write_multiple_pages(chip, old_blk,
							 new_blk, log_blk,
							 start_page, end_page,
							 buf, &ptr, &offset);

		if (retval != STATUS_SUCCESS) {
			if (monitor_card_cd(chip, MS_CARD) == CD_NOT_EXIST) {
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_NOT_PRESENT);
				TRACE_RET(chip, STATUS_FAIL);
			}

			ms_rw_fail(srb, chip);
			TRACE_RET(chip, retval);
		}
		/* Update L2P table if need */
		if (srb->sc_data_direction == DMA_TO_DEVICE) {
			if (end_page == (ms_card->page_off + 1)) {
				retval = ms_erase_block(chip, old_blk);
				if (retval == STATUS_SUCCESS)
					ms_set_unused_block(chip, old_blk);
				ms_set_l2p_tbl(chip, seg_no,
					       log_blk - ms_start_idx[seg_no],
					       new_blk);
			}
		}

		total_sec_cnt -= page_cnt;

		if (total_sec_cnt == 0)
			break;

		log_blk++;

		for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1;
				seg_no++) {
			if (log_blk < ms_start_idx[seg_no + 1])
				break;
		}

		if (ms_card->segment[seg_no].build_flag == 0) {
			retval = ms_build_l2p_tbl(chip, seg_no);
			if (retval != STATUS_SUCCESS) {
				chip->card_fail |= MS_CARD;
				set_sense_type(chip, lun,
					       SENSE_TYPE_MEDIA_NOT_PRESENT);
				TRACE_RET(chip, retval);
			}
		}

		old_blk =
		    ms_get_l2p_tbl(chip, seg_no,
				   log_blk - ms_start_idx[seg_no]);
		if (old_blk == 0xFFFF) {
			ms_rw_fail(srb, chip);
			TRACE_RET(chip, STATUS_FAIL);
		}

		if (srb->sc_data_direction == DMA_TO_DEVICE) {
			new_blk = ms_get_unused_block(chip, seg_no);
			if (new_blk == 0xFFFF) {
				ms_rw_fail(srb, chip);
				TRACE_RET(chip, STATUS_FAIL);
			}
		}

		RTS51X_DEBUGP("seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
			       seg_no, old_blk, new_blk);

		start_page = 0;
	}

	if (srb->sc_data_direction == DMA_TO_DEVICE) {
		if (end_page < (ms_card->page_off + 1)) {
			delay_write->delay_write_flag = 1;
			delay_write->old_phyblock = old_blk;
			delay_write->new_phyblock = new_blk;
			delay_write->logblock = log_blk;
			delay_write->pageoff = end_page;
		}
	}

	scsi_set_resid(srb, 0);

	return STATUS_SUCCESS;
}

int ms_rw(struct scsi_cmnd *srb, struct rts51x_chip *chip, u32 start_sector,
	  u16 sector_cnt)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	if (CHK_MSPRO(ms_card))
		retval =
		    mspro_rw_multi_sector(srb, chip, start_sector, sector_cnt);
	else
		retval =
		    ms_rw_multi_sector(srb, chip, start_sector, sector_cnt);

	return retval;
}

void ms_free_l2p_tbl(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int i = 0;

	if (ms_card->segment != NULL) {
		for (i = 0; i < ms_card->segment_cnt; i++) {
			if (ms_card->segment[i].l2p_table != NULL) {
				vfree(ms_card->segment[i].l2p_table);
				ms_card->segment[i].l2p_table = NULL;
			}
			if (ms_card->segment[i].free_table != NULL) {
				vfree(ms_card->segment[i].free_table);
				ms_card->segment[i].free_table = NULL;
			}
		}
		vfree(ms_card->segment);
		ms_card->segment = NULL;
	}
}

void ms_cleanup_work(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);

	if (CHK_MSPRO(ms_card)) {
		if (ms_card->seq_mode) {
			RTS51X_DEBUGP("MS Pro: stop transmission\n");
			mspro_stop_seq_mode(chip);
			ms_card->counter = 0;
		}
		if (CHK_MSHG(ms_card)) {
			u8 value;
			rts51x_read_register(chip, MS_CFG, &value);
			if (value & MS_2K_SECTOR_MODE)
				rts51x_write_register(chip, MS_CFG,
						      MS_2K_SECTOR_MODE, 0x00);
		}
	} else if ((!CHK_MSPRO(ms_card))
		   && ms_card->delay_write.delay_write_flag) {
		RTS51X_DEBUGP("MS: delay write\n");
		ms_delay_write(chip);
		ms_card->counter = 0;
	}
}

static int ms_power_off_card3v3(struct rts51x_chip *chip)
{
	int retval;

	rts51x_init_cmd(chip);

	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_EN, MS_CLK_EN, 0);
	if (chip->asic_code)
		ms_pull_ctl_disable(chip);
	else
		rts51x_add_cmd(chip, WRITE_REG_CMD, FPGA_PULL_CTL,
			       FPGA_MS_PULL_CTL_BIT | 0x20,
			       FPGA_MS_PULL_CTL_BIT);
	rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, 0);
	if (!chip->option.FT2_fast_mode) {
		rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, POWER_MASK,
			       POWER_OFF);
	}

	retval = rts51x_send_cmd(chip, MODE_C, 100);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}

int release_ms_card(struct rts51x_chip *chip)
{
	struct ms_info *ms_card = &(chip->ms_card);
	int retval;

	RTS51X_DEBUGP("release_ms_card\n");

	ms_card->delay_write.delay_write_flag = 0;
	ms_card->pro_under_formatting = 0;

	chip->card_ready &= ~MS_CARD;
	chip->card_fail &= ~MS_CARD;
	chip->card_wp &= ~MS_CARD;

	ms_free_l2p_tbl(chip);

	rts51x_write_register(chip, SFSM_ED, HW_CMD_STOP, HW_CMD_STOP);

	memset(ms_card->raw_sys_info, 0, 96);
#ifdef SUPPORT_PCGL_1P18
	memset(ms_card->raw_model_name, 0, 48);
#endif

	retval = ms_power_off_card3v3(chip);
	if (retval != STATUS_SUCCESS)
		TRACE_RET(chip, retval);

	return STATUS_SUCCESS;
}
