cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ms.c (102159B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Driver for Realtek PCI-Express card reader
      4 *
      5 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
      6 *
      7 * Author:
      8 *   Wei WANG (wei_wang@realsil.com.cn)
      9 *   Micky Ching (micky_ching@realsil.com.cn)
     10 */
     11
     12#include <linux/blkdev.h>
     13#include <linux/kthread.h>
     14#include <linux/sched.h>
     15#include <linux/vmalloc.h>
     16
     17#include "rtsx.h"
     18#include "ms.h"
     19
     20static inline void ms_set_err_code(struct rtsx_chip *chip, u8 err_code)
     21{
     22	struct ms_info *ms_card = &chip->ms_card;
     23
     24	ms_card->err_code = err_code;
     25}
     26
     27static inline int ms_check_err_code(struct rtsx_chip *chip, u8 err_code)
     28{
     29	struct ms_info *ms_card = &chip->ms_card;
     30
     31	return (ms_card->err_code == err_code);
     32}
     33
     34static int ms_parse_err_code(struct rtsx_chip *chip)
     35{
     36	return STATUS_FAIL;
     37}
     38
     39static int ms_transfer_tpc(struct rtsx_chip *chip, u8 trans_mode,
     40			   u8 tpc, u8 cnt, u8 cfg)
     41{
     42	struct ms_info *ms_card = &chip->ms_card;
     43	int retval;
     44	u8 *ptr;
     45
     46	dev_dbg(rtsx_dev(chip), "%s: tpc = 0x%x\n", __func__, tpc);
     47
     48	rtsx_init_cmd(chip);
     49
     50	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
     51	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
     52	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
     53	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
     54		     0x01, PINGPONG_BUFFER);
     55
     56	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER,
     57		     0xFF, MS_TRANSFER_START | trans_mode);
     58	rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
     59		     MS_TRANSFER_END, MS_TRANSFER_END);
     60
     61	rtsx_add_cmd(chip, READ_REG_CMD, MS_TRANS_CFG, 0, 0);
     62
     63	retval = rtsx_send_cmd(chip, MS_CARD, 5000);
     64	if (retval < 0) {
     65		rtsx_clear_ms_error(chip);
     66		ms_set_err_code(chip, MS_TO_ERROR);
     67		return ms_parse_err_code(chip);
     68	}
     69
     70	ptr = rtsx_get_cmd_data(chip) + 1;
     71
     72	if (!(tpc & 0x08)) {		/* Read Packet */
     73		if (*ptr & MS_CRC16_ERR) {
     74			ms_set_err_code(chip, MS_CRC16_ERROR);
     75			return ms_parse_err_code(chip);
     76		}
     77	} else {			/* Write Packet */
     78		if (CHK_MSPRO(ms_card) && !(*ptr & 0x80)) {
     79			if (*ptr & (MS_INT_ERR | MS_INT_CMDNK)) {
     80				ms_set_err_code(chip, MS_CMD_NK);
     81				return ms_parse_err_code(chip);
     82			}
     83		}
     84	}
     85
     86	if (*ptr & MS_RDY_TIMEOUT) {
     87		rtsx_clear_ms_error(chip);
     88		ms_set_err_code(chip, MS_TO_ERROR);
     89		return ms_parse_err_code(chip);
     90	}
     91
     92	return STATUS_SUCCESS;
     93}
     94
     95static int ms_transfer_data(struct rtsx_chip *chip, u8 trans_mode,
     96			    u8 tpc, u16 sec_cnt, u8 cfg, bool mode_2k,
     97			    int use_sg, void *buf, int buf_len)
     98{
     99	int retval;
    100	u8 val, err_code = 0;
    101	enum dma_data_direction dir;
    102
    103	if (!buf || !buf_len)
    104		return STATUS_FAIL;
    105
    106	if (trans_mode == MS_TM_AUTO_READ) {
    107		dir = DMA_FROM_DEVICE;
    108		err_code = MS_FLASH_READ_ERROR;
    109	} else if (trans_mode == MS_TM_AUTO_WRITE) {
    110		dir = DMA_TO_DEVICE;
    111		err_code = MS_FLASH_WRITE_ERROR;
    112	} else {
    113		return STATUS_FAIL;
    114	}
    115
    116	rtsx_init_cmd(chip);
    117
    118	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
    119	rtsx_add_cmd(chip, WRITE_REG_CMD,
    120		     MS_SECTOR_CNT_H, 0xFF, (u8)(sec_cnt >> 8));
    121	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_SECTOR_CNT_L, 0xFF, (u8)sec_cnt);
    122	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
    123
    124	if (mode_2k) {
    125		rtsx_add_cmd(chip, WRITE_REG_CMD,
    126			     MS_CFG, MS_2K_SECTOR_MODE, MS_2K_SECTOR_MODE);
    127	} else {
    128		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_CFG, MS_2K_SECTOR_MODE, 0);
    129	}
    130
    131	trans_dma_enable(dir, chip, sec_cnt * 512, DMA_512);
    132
    133	rtsx_add_cmd(chip, WRITE_REG_CMD,
    134		     MS_TRANSFER, 0xFF, MS_TRANSFER_START | trans_mode);
    135	rtsx_add_cmd(chip, CHECK_REG_CMD,
    136		     MS_TRANSFER, MS_TRANSFER_END, MS_TRANSFER_END);
    137
    138	rtsx_send_cmd_no_wait(chip);
    139
    140	retval = rtsx_transfer_data(chip, MS_CARD, buf, buf_len,
    141				    use_sg, dir, chip->mspro_timeout);
    142	if (retval < 0) {
    143		ms_set_err_code(chip, err_code);
    144		if (retval == -ETIMEDOUT)
    145			retval = STATUS_TIMEDOUT;
    146		else
    147			retval = STATUS_FAIL;
    148
    149		return retval;
    150	}
    151
    152	retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
    153	if (retval)
    154		return retval;
    155
    156	if (val & (MS_INT_CMDNK | MS_INT_ERR | MS_CRC16_ERR | MS_RDY_TIMEOUT))
    157		return STATUS_FAIL;
    158
    159	return STATUS_SUCCESS;
    160}
    161
    162static int ms_write_bytes(struct rtsx_chip *chip,
    163			  u8 tpc, u8 cnt, u8 cfg, u8 *data, int data_len)
    164{
    165	struct ms_info *ms_card = &chip->ms_card;
    166	int retval, i;
    167
    168	if (!data || data_len < cnt)
    169		return STATUS_ERROR;
    170
    171	rtsx_init_cmd(chip);
    172
    173	for (i = 0; i < cnt; i++) {
    174		rtsx_add_cmd(chip, WRITE_REG_CMD,
    175			     PPBUF_BASE2 + i, 0xFF, data[i]);
    176	}
    177	if (cnt % 2)
    178		rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2 + i, 0xFF, 0xFF);
    179
    180	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
    181	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
    182	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
    183	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
    184		     0x01, PINGPONG_BUFFER);
    185
    186	rtsx_add_cmd(chip, WRITE_REG_CMD,
    187		     MS_TRANSFER, 0xFF, MS_TRANSFER_START | MS_TM_WRITE_BYTES);
    188	rtsx_add_cmd(chip, CHECK_REG_CMD,
    189		     MS_TRANSFER, MS_TRANSFER_END, MS_TRANSFER_END);
    190
    191	retval = rtsx_send_cmd(chip, MS_CARD, 5000);
    192	if (retval < 0) {
    193		u8 val = 0;
    194
    195		rtsx_read_register(chip, MS_TRANS_CFG, &val);
    196		dev_dbg(rtsx_dev(chip), "MS_TRANS_CFG: 0x%02x\n", val);
    197
    198		rtsx_clear_ms_error(chip);
    199
    200		if (!(tpc & 0x08)) {
    201			if (val & MS_CRC16_ERR) {
    202				ms_set_err_code(chip, MS_CRC16_ERROR);
    203				return ms_parse_err_code(chip);
    204			}
    205		} else {
    206			if (CHK_MSPRO(ms_card) && !(val & 0x80)) {
    207				if (val & (MS_INT_ERR | MS_INT_CMDNK)) {
    208					ms_set_err_code(chip, MS_CMD_NK);
    209					return ms_parse_err_code(chip);
    210				}
    211			}
    212		}
    213
    214		if (val & MS_RDY_TIMEOUT) {
    215			ms_set_err_code(chip, MS_TO_ERROR);
    216			return ms_parse_err_code(chip);
    217		}
    218
    219		ms_set_err_code(chip, MS_TO_ERROR);
    220		return ms_parse_err_code(chip);
    221	}
    222
    223	return STATUS_SUCCESS;
    224}
    225
    226static int ms_read_bytes(struct rtsx_chip *chip,
    227			 u8 tpc, u8 cnt, u8 cfg, u8 *data, int data_len)
    228{
    229	struct ms_info *ms_card = &chip->ms_card;
    230	int retval, i;
    231	u8 *ptr;
    232
    233	if (!data)
    234		return STATUS_ERROR;
    235
    236	rtsx_init_cmd(chip);
    237
    238	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
    239	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
    240	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
    241	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
    242		     0x01, PINGPONG_BUFFER);
    243
    244	rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
    245		     MS_TRANSFER_START | MS_TM_READ_BYTES);
    246	rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
    247		     MS_TRANSFER_END, MS_TRANSFER_END);
    248
    249	for (i = 0; i < data_len - 1; i++)
    250		rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + i, 0, 0);
    251
    252	if (data_len % 2)
    253		rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + data_len, 0, 0);
    254	else
    255		rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + data_len - 1,
    256			     0, 0);
    257
    258	retval = rtsx_send_cmd(chip, MS_CARD, 5000);
    259	if (retval < 0) {
    260		u8 val = 0;
    261
    262		rtsx_read_register(chip, MS_TRANS_CFG, &val);
    263		rtsx_clear_ms_error(chip);
    264
    265		if (!(tpc & 0x08)) {
    266			if (val & MS_CRC16_ERR) {
    267				ms_set_err_code(chip, MS_CRC16_ERROR);
    268				return ms_parse_err_code(chip);
    269			}
    270		} else {
    271			if (CHK_MSPRO(ms_card) && !(val & 0x80)) {
    272				if (val & (MS_INT_ERR | MS_INT_CMDNK)) {
    273					ms_set_err_code(chip, MS_CMD_NK);
    274					return ms_parse_err_code(chip);
    275				}
    276			}
    277		}
    278
    279		if (val & MS_RDY_TIMEOUT) {
    280			ms_set_err_code(chip, MS_TO_ERROR);
    281			return ms_parse_err_code(chip);
    282		}
    283
    284		ms_set_err_code(chip, MS_TO_ERROR);
    285		return ms_parse_err_code(chip);
    286	}
    287
    288	ptr = rtsx_get_cmd_data(chip) + 1;
    289
    290	for (i = 0; i < data_len; i++)
    291		data[i] = ptr[i];
    292
    293	if (tpc == PRO_READ_SHORT_DATA && data_len == 8) {
    294		dev_dbg(rtsx_dev(chip), "Read format progress:\n");
    295		print_hex_dump_bytes(KBUILD_MODNAME ": ", DUMP_PREFIX_NONE, ptr,
    296				     cnt);
    297	}
    298
    299	return STATUS_SUCCESS;
    300}
    301
    302static int ms_set_rw_reg_addr(struct rtsx_chip *chip, u8 read_start,
    303			      u8 read_cnt, u8 write_start, u8 write_cnt)
    304{
    305	int retval, i;
    306	u8 data[4];
    307
    308	data[0] = read_start;
    309	data[1] = read_cnt;
    310	data[2] = write_start;
    311	data[3] = write_cnt;
    312
    313	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    314		retval = ms_write_bytes(chip, SET_RW_REG_ADRS, 4,
    315					NO_WAIT_INT, data, 4);
    316		if (retval == STATUS_SUCCESS)
    317			return STATUS_SUCCESS;
    318		rtsx_clear_ms_error(chip);
    319	}
    320
    321	return STATUS_FAIL;
    322}
    323
    324static int ms_send_cmd(struct rtsx_chip *chip, u8 cmd, u8 cfg)
    325{
    326	u8 data[2];
    327
    328	data[0] = cmd;
    329	data[1] = 0;
    330
    331	return ms_write_bytes(chip, PRO_SET_CMD, 1, cfg, data, 1);
    332}
    333
    334static int ms_set_init_para(struct rtsx_chip *chip)
    335{
    336	struct ms_info *ms_card = &chip->ms_card;
    337	int retval;
    338
    339	if (CHK_HG8BIT(ms_card)) {
    340		if (chip->asic_code)
    341			ms_card->ms_clock = chip->asic_ms_hg_clk;
    342		else
    343			ms_card->ms_clock = chip->fpga_ms_hg_clk;
    344
    345	} else if (CHK_MSPRO(ms_card) || CHK_MS4BIT(ms_card)) {
    346		if (chip->asic_code)
    347			ms_card->ms_clock = chip->asic_ms_4bit_clk;
    348		else
    349			ms_card->ms_clock = chip->fpga_ms_4bit_clk;
    350
    351	} else {
    352		if (chip->asic_code)
    353			ms_card->ms_clock = chip->asic_ms_1bit_clk;
    354		else
    355			ms_card->ms_clock = chip->fpga_ms_1bit_clk;
    356	}
    357
    358	retval = switch_clock(chip, ms_card->ms_clock);
    359	if (retval != STATUS_SUCCESS)
    360		return STATUS_FAIL;
    361
    362	retval = select_card(chip, MS_CARD);
    363	if (retval != STATUS_SUCCESS)
    364		return STATUS_FAIL;
    365
    366	return STATUS_SUCCESS;
    367}
    368
    369static int ms_switch_clock(struct rtsx_chip *chip)
    370{
    371	struct ms_info *ms_card = &chip->ms_card;
    372	int retval;
    373
    374	retval = select_card(chip, MS_CARD);
    375	if (retval != STATUS_SUCCESS)
    376		return STATUS_FAIL;
    377
    378	retval = switch_clock(chip, ms_card->ms_clock);
    379	if (retval != STATUS_SUCCESS)
    380		return STATUS_FAIL;
    381
    382	return STATUS_SUCCESS;
    383}
    384
    385static int ms_pull_ctl_disable(struct rtsx_chip *chip)
    386{
    387	int retval;
    388
    389	if (CHECK_PID(chip, 0x5208)) {
    390		retval = rtsx_write_register(chip, CARD_PULL_CTL1, 0xFF,
    391					     MS_D1_PD | MS_D2_PD | MS_CLK_PD |
    392					     MS_D6_PD);
    393		if (retval)
    394			return retval;
    395
    396		retval = rtsx_write_register(chip, CARD_PULL_CTL2, 0xFF,
    397					     MS_D3_PD | MS_D0_PD | MS_BS_PD |
    398					     XD_D4_PD);
    399		if (retval)
    400			return retval;
    401
    402		retval = rtsx_write_register(chip, CARD_PULL_CTL3, 0xFF,
    403					     MS_D7_PD | XD_CE_PD | XD_CLE_PD |
    404					     XD_CD_PU);
    405		if (retval)
    406			return retval;
    407
    408		retval = rtsx_write_register(chip, CARD_PULL_CTL4, 0xFF,
    409					     XD_RDY_PD | SD_D3_PD | SD_D2_PD |
    410					     XD_ALE_PD);
    411		if (retval)
    412			return retval;
    413
    414		retval = rtsx_write_register(chip, CARD_PULL_CTL5, 0xFF,
    415					     MS_INS_PU | SD_WP_PD | SD_CD_PU |
    416					     SD_CMD_PD);
    417		if (retval)
    418			return retval;
    419
    420		retval = rtsx_write_register(chip, CARD_PULL_CTL6, 0xFF,
    421					     MS_D5_PD | MS_D4_PD);
    422		if (retval)
    423			return retval;
    424
    425	} else if (CHECK_PID(chip, 0x5288)) {
    426		if (CHECK_BARO_PKG(chip, QFN)) {
    427			retval = rtsx_write_register(chip, CARD_PULL_CTL1,
    428						     0xFF, 0x55);
    429			if (retval)
    430				return retval;
    431
    432			retval = rtsx_write_register(chip, CARD_PULL_CTL2,
    433						     0xFF, 0x55);
    434			if (retval)
    435				return retval;
    436
    437			retval = rtsx_write_register(chip, CARD_PULL_CTL3,
    438						     0xFF, 0x4B);
    439			if (retval)
    440				return retval;
    441
    442			retval = rtsx_write_register(chip, CARD_PULL_CTL4,
    443						     0xFF, 0x69);
    444			if (retval)
    445				return retval;
    446		}
    447	}
    448
    449	return STATUS_SUCCESS;
    450}
    451
    452static int ms_pull_ctl_enable(struct rtsx_chip *chip)
    453{
    454	int retval;
    455
    456	rtsx_init_cmd(chip);
    457
    458	if (CHECK_PID(chip, 0x5208)) {
    459		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF,
    460			     MS_D1_PD | MS_D2_PD | MS_CLK_NP | MS_D6_PD);
    461		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF,
    462			     MS_D3_PD | MS_D0_PD | MS_BS_NP | XD_D4_PD);
    463		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF,
    464			     MS_D7_PD | XD_CE_PD | XD_CLE_PD | XD_CD_PU);
    465		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF,
    466			     XD_RDY_PD | SD_D3_PD | SD_D2_PD | XD_ALE_PD);
    467		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF,
    468			     MS_INS_PU | SD_WP_PD | SD_CD_PU | SD_CMD_PD);
    469		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF,
    470			     MS_D5_PD | MS_D4_PD);
    471	} else if (CHECK_PID(chip, 0x5288)) {
    472		if (CHECK_BARO_PKG(chip, QFN)) {
    473			rtsx_add_cmd(chip, WRITE_REG_CMD,
    474				     CARD_PULL_CTL1, 0xFF, 0x55);
    475			rtsx_add_cmd(chip, WRITE_REG_CMD,
    476				     CARD_PULL_CTL2, 0xFF, 0x45);
    477			rtsx_add_cmd(chip, WRITE_REG_CMD,
    478				     CARD_PULL_CTL3, 0xFF, 0x4B);
    479			rtsx_add_cmd(chip, WRITE_REG_CMD,
    480				     CARD_PULL_CTL4, 0xFF, 0x29);
    481		}
    482	}
    483
    484	retval = rtsx_send_cmd(chip, MS_CARD, 100);
    485	if (retval < 0)
    486		return STATUS_FAIL;
    487
    488	return STATUS_SUCCESS;
    489}
    490
    491static int ms_prepare_reset(struct rtsx_chip *chip)
    492{
    493	struct ms_info *ms_card = &chip->ms_card;
    494	int retval;
    495	u8 oc_mask = 0;
    496
    497	ms_card->ms_type = 0;
    498	ms_card->check_ms_flow = 0;
    499	ms_card->switch_8bit_fail = 0;
    500	ms_card->delay_write.delay_write_flag = 0;
    501
    502	ms_card->pro_under_formatting = 0;
    503
    504	retval = ms_power_off_card3v3(chip);
    505	if (retval != STATUS_SUCCESS)
    506		return STATUS_FAIL;
    507
    508	if (!chip->ft2_fast_mode)
    509		wait_timeout(250);
    510
    511	retval = enable_card_clock(chip, MS_CARD);
    512	if (retval != STATUS_SUCCESS)
    513		return STATUS_FAIL;
    514
    515	if (chip->asic_code) {
    516		retval = ms_pull_ctl_enable(chip);
    517		if (retval != STATUS_SUCCESS)
    518			return STATUS_FAIL;
    519	} else {
    520		retval = rtsx_write_register(chip, FPGA_PULL_CTL,
    521					     FPGA_MS_PULL_CTL_BIT | 0x20, 0);
    522		if (retval)
    523			return retval;
    524	}
    525
    526	if (!chip->ft2_fast_mode) {
    527		retval = card_power_on(chip, MS_CARD);
    528		if (retval != STATUS_SUCCESS)
    529			return STATUS_FAIL;
    530
    531		wait_timeout(150);
    532
    533#ifdef SUPPORT_OCP
    534		if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
    535			oc_mask = MS_OC_NOW | MS_OC_EVER;
    536		else
    537			oc_mask = SD_OC_NOW | SD_OC_EVER;
    538
    539		if (chip->ocp_stat & oc_mask) {
    540			dev_dbg(rtsx_dev(chip), "Over current, OCPSTAT is 0x%x\n",
    541				chip->ocp_stat);
    542			return STATUS_FAIL;
    543		}
    544#endif
    545	}
    546
    547	retval = rtsx_write_register(chip, CARD_OE, MS_OUTPUT_EN,
    548				     MS_OUTPUT_EN);
    549	if (retval)
    550		return retval;
    551
    552	if (chip->asic_code) {
    553		retval = rtsx_write_register(chip, MS_CFG, 0xFF,
    554					     SAMPLE_TIME_RISING |
    555					     PUSH_TIME_DEFAULT |
    556					     NO_EXTEND_TOGGLE |
    557					     MS_BUS_WIDTH_1);
    558		if (retval)
    559			return retval;
    560
    561	} else {
    562		retval = rtsx_write_register(chip, MS_CFG, 0xFF,
    563					     SAMPLE_TIME_FALLING |
    564					     PUSH_TIME_DEFAULT |
    565					     NO_EXTEND_TOGGLE |
    566					     MS_BUS_WIDTH_1);
    567		if (retval)
    568			return retval;
    569	}
    570	retval = rtsx_write_register(chip, MS_TRANS_CFG, 0xFF,
    571				     NO_WAIT_INT | NO_AUTO_READ_INT_REG);
    572	if (retval)
    573		return retval;
    574
    575	retval = rtsx_write_register(chip, CARD_STOP, MS_STOP | MS_CLR_ERR,
    576				     MS_STOP | MS_CLR_ERR);
    577	if (retval)
    578		return retval;
    579
    580	retval = ms_set_init_para(chip);
    581	if (retval != STATUS_SUCCESS)
    582		return STATUS_FAIL;
    583
    584	return STATUS_SUCCESS;
    585}
    586
    587static int ms_identify_media_type(struct rtsx_chip *chip, int switch_8bit_bus)
    588{
    589	struct ms_info *ms_card = &chip->ms_card;
    590	int retval, i;
    591	u8 val;
    592
    593	retval = ms_set_rw_reg_addr(chip, PRO_STATUS_REG, 6, SYSTEM_PARAM, 1);
    594	if (retval != STATUS_SUCCESS)
    595		return STATUS_FAIL;
    596
    597	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    598		retval = ms_transfer_tpc(chip, MS_TM_READ_BYTES, READ_REG,
    599					 6, NO_WAIT_INT);
    600		if (retval == STATUS_SUCCESS)
    601			break;
    602	}
    603	if (i == MS_MAX_RETRY_COUNT)
    604		return STATUS_FAIL;
    605
    606	retval = rtsx_read_register(chip, PPBUF_BASE2 + 2, &val);
    607	if (retval)
    608		return retval;
    609
    610	dev_dbg(rtsx_dev(chip), "Type register: 0x%x\n", val);
    611	if (val != 0x01) {
    612		if (val != 0x02)
    613			ms_card->check_ms_flow = 1;
    614
    615		return STATUS_FAIL;
    616	}
    617
    618	retval = rtsx_read_register(chip, PPBUF_BASE2 + 4, &val);
    619	if (retval)
    620		return retval;
    621
    622	dev_dbg(rtsx_dev(chip), "Category register: 0x%x\n", val);
    623	if (val != 0) {
    624		ms_card->check_ms_flow = 1;
    625		return STATUS_FAIL;
    626	}
    627
    628	retval = rtsx_read_register(chip, PPBUF_BASE2 + 5, &val);
    629	if (retval)
    630		return retval;
    631
    632	dev_dbg(rtsx_dev(chip), "Class register: 0x%x\n", val);
    633	if (val == 0) {
    634		retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
    635		if (retval)
    636			return retval;
    637
    638		if (val & WRT_PRTCT)
    639			chip->card_wp |= MS_CARD;
    640		else
    641			chip->card_wp &= ~MS_CARD;
    642
    643	} else if ((val == 0x01) || (val == 0x02) || (val == 0x03)) {
    644		chip->card_wp |= MS_CARD;
    645	} else {
    646		ms_card->check_ms_flow = 1;
    647		return STATUS_FAIL;
    648	}
    649
    650	ms_card->ms_type |= TYPE_MSPRO;
    651
    652	retval = rtsx_read_register(chip, PPBUF_BASE2 + 3, &val);
    653	if (retval)
    654		return retval;
    655
    656	dev_dbg(rtsx_dev(chip), "IF Mode register: 0x%x\n", val);
    657	if (val == 0) {
    658		ms_card->ms_type &= 0x0F;
    659	} else if (val == 7) {
    660		if (switch_8bit_bus)
    661			ms_card->ms_type |= MS_HG;
    662		else
    663			ms_card->ms_type &= 0x0F;
    664
    665	} else {
    666		return STATUS_FAIL;
    667	}
    668
    669	return STATUS_SUCCESS;
    670}
    671
    672static int ms_confirm_cpu_startup(struct rtsx_chip *chip)
    673{
    674	int retval, i, k;
    675	u8 val;
    676
    677	/* Confirm CPU StartUp */
    678	k = 0;
    679	do {
    680		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
    681			ms_set_err_code(chip, MS_NO_CARD);
    682			return STATUS_FAIL;
    683		}
    684
    685		for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    686			retval = ms_read_bytes(chip, GET_INT, 1,
    687					       NO_WAIT_INT, &val, 1);
    688			if (retval == STATUS_SUCCESS)
    689				break;
    690		}
    691		if (i == MS_MAX_RETRY_COUNT)
    692			return STATUS_FAIL;
    693
    694		if (k > 100)
    695			return STATUS_FAIL;
    696
    697		k++;
    698		wait_timeout(100);
    699	} while (!(val & INT_REG_CED));
    700
    701	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    702		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
    703		if (retval == STATUS_SUCCESS)
    704			break;
    705	}
    706	if (i == MS_MAX_RETRY_COUNT)
    707		return STATUS_FAIL;
    708
    709	if (val & INT_REG_ERR) {
    710		if (val & INT_REG_CMDNK)
    711			chip->card_wp |= (MS_CARD);
    712		else
    713			return STATUS_FAIL;
    714	}
    715	/* --  end confirm CPU startup */
    716
    717	return STATUS_SUCCESS;
    718}
    719
    720static int ms_switch_parallel_bus(struct rtsx_chip *chip)
    721{
    722	int retval, i;
    723	u8 data[2];
    724
    725	data[0] = PARALLEL_4BIT_IF;
    726	data[1] = 0;
    727	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    728		retval = ms_write_bytes(chip, WRITE_REG, 1, NO_WAIT_INT,
    729					data, 2);
    730		if (retval == STATUS_SUCCESS)
    731			break;
    732	}
    733	if (retval != STATUS_SUCCESS)
    734		return STATUS_FAIL;
    735
    736	return STATUS_SUCCESS;
    737}
    738
    739static int ms_switch_8bit_bus(struct rtsx_chip *chip)
    740{
    741	struct ms_info *ms_card = &chip->ms_card;
    742	int retval, i;
    743	u8 data[2];
    744
    745	data[0] = PARALLEL_8BIT_IF;
    746	data[1] = 0;
    747	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    748		retval = ms_write_bytes(chip, WRITE_REG, 1,
    749					NO_WAIT_INT, data, 2);
    750		if (retval == STATUS_SUCCESS)
    751			break;
    752	}
    753	if (retval != STATUS_SUCCESS)
    754		return STATUS_FAIL;
    755
    756	retval = rtsx_write_register(chip, MS_CFG, 0x98,
    757				     MS_BUS_WIDTH_8 | SAMPLE_TIME_FALLING);
    758	if (retval)
    759		return retval;
    760
    761	ms_card->ms_type |= MS_8BIT;
    762	retval = ms_set_init_para(chip);
    763	if (retval != STATUS_SUCCESS)
    764		return STATUS_FAIL;
    765
    766	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    767		retval = ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT,
    768					 1, NO_WAIT_INT);
    769		if (retval != STATUS_SUCCESS)
    770			return STATUS_FAIL;
    771	}
    772
    773	return STATUS_SUCCESS;
    774}
    775
    776static int ms_pro_reset_flow(struct rtsx_chip *chip, int switch_8bit_bus)
    777{
    778	struct ms_info *ms_card = &chip->ms_card;
    779	int retval, i;
    780
    781	for (i = 0; i < 3; i++) {
    782		retval = ms_prepare_reset(chip);
    783		if (retval != STATUS_SUCCESS)
    784			return STATUS_FAIL;
    785
    786		retval = ms_identify_media_type(chip, switch_8bit_bus);
    787		if (retval != STATUS_SUCCESS)
    788			return STATUS_FAIL;
    789
    790		retval = ms_confirm_cpu_startup(chip);
    791		if (retval != STATUS_SUCCESS)
    792			return STATUS_FAIL;
    793
    794		retval = ms_switch_parallel_bus(chip);
    795		if (retval != STATUS_SUCCESS) {
    796			if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
    797				ms_set_err_code(chip, MS_NO_CARD);
    798				return STATUS_FAIL;
    799			}
    800			continue;
    801		} else {
    802			break;
    803		}
    804	}
    805
    806	if (retval != STATUS_SUCCESS)
    807		return STATUS_FAIL;
    808
    809	/* Switch MS-PRO into Parallel mode */
    810	retval = rtsx_write_register(chip, MS_CFG, 0x18, MS_BUS_WIDTH_4);
    811	if (retval)
    812		return retval;
    813
    814	retval = rtsx_write_register(chip, MS_CFG, PUSH_TIME_ODD,
    815				     PUSH_TIME_ODD);
    816	if (retval)
    817		return retval;
    818
    819	retval = ms_set_init_para(chip);
    820	if (retval != STATUS_SUCCESS)
    821		return STATUS_FAIL;
    822
    823	/* If MSPro HG Card, We shall try to switch to 8-bit bus */
    824	if (CHK_MSHG(ms_card) && chip->support_ms_8bit && switch_8bit_bus) {
    825		retval = ms_switch_8bit_bus(chip);
    826		if (retval != STATUS_SUCCESS) {
    827			ms_card->switch_8bit_fail = 1;
    828			return STATUS_FAIL;
    829		}
    830	}
    831
    832	return STATUS_SUCCESS;
    833}
    834
    835#ifdef XC_POWERCLASS
    836static int msxc_change_power(struct rtsx_chip *chip, u8 mode)
    837{
    838	int retval;
    839	u8 buf[6];
    840
    841	ms_cleanup_work(chip);
    842
    843	retval = ms_set_rw_reg_addr(chip, 0, 0, PRO_DATA_COUNT1, 6);
    844	if (retval != STATUS_SUCCESS)
    845		return STATUS_FAIL;
    846
    847	buf[0] = 0;
    848	buf[1] = mode;
    849	buf[2] = 0;
    850	buf[3] = 0;
    851	buf[4] = 0;
    852	buf[5] = 0;
    853
    854	retval = ms_write_bytes(chip, PRO_WRITE_REG, 6, NO_WAIT_INT, buf, 6);
    855	if (retval != STATUS_SUCCESS)
    856		return STATUS_FAIL;
    857
    858	retval = ms_send_cmd(chip, XC_CHG_POWER, WAIT_INT);
    859	if (retval != STATUS_SUCCESS)
    860		return STATUS_FAIL;
    861
    862	retval = rtsx_read_register(chip, MS_TRANS_CFG, buf);
    863	if (retval)
    864		return retval;
    865
    866	if (buf[0] & (MS_INT_CMDNK | MS_INT_ERR))
    867		return STATUS_FAIL;
    868
    869	return STATUS_SUCCESS;
    870}
    871#endif
    872
    873static int ms_read_attribute_info(struct rtsx_chip *chip)
    874{
    875	struct ms_info *ms_card = &chip->ms_card;
    876	int retval, i;
    877	u8 val, *buf, class_code, device_type, sub_class, data[16];
    878	u16 total_blk = 0, blk_size = 0;
    879#ifdef SUPPORT_MSXC
    880	u32 xc_total_blk = 0, xc_blk_size = 0;
    881#endif
    882	u32 sys_info_addr = 0, sys_info_size;
    883#ifdef SUPPORT_PCGL_1P18
    884	u32 model_name_addr = 0, model_name_size;
    885	int found_sys_info = 0, found_model_name = 0;
    886#endif
    887
    888	retval = ms_set_rw_reg_addr(chip, PRO_INT_REG, 2, PRO_SYSTEM_PARAM, 7);
    889	if (retval != STATUS_SUCCESS)
    890		return STATUS_FAIL;
    891
    892	if (CHK_MS8BIT(ms_card))
    893		data[0] = PARALLEL_8BIT_IF;
    894	else
    895		data[0] = PARALLEL_4BIT_IF;
    896
    897	data[1] = 0;
    898
    899	data[2] = 0x40;
    900	data[3] = 0;
    901	data[4] = 0;
    902	data[5] = 0;
    903	data[6] = 0;
    904	data[7] = 0;
    905
    906	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    907		retval = ms_write_bytes(chip, PRO_WRITE_REG, 7, NO_WAIT_INT,
    908					data, 8);
    909		if (retval == STATUS_SUCCESS)
    910			break;
    911	}
    912	if (retval != STATUS_SUCCESS)
    913		return STATUS_FAIL;
    914
    915	buf = kmalloc(64 * 512, GFP_KERNEL);
    916	if (!buf)
    917		return STATUS_ERROR;
    918
    919	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
    920		retval = ms_send_cmd(chip, PRO_READ_ATRB, WAIT_INT);
    921		if (retval != STATUS_SUCCESS)
    922			continue;
    923
    924		retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
    925		if (retval != STATUS_SUCCESS) {
    926			kfree(buf);
    927			return STATUS_FAIL;
    928		}
    929		if (!(val & MS_INT_BREQ)) {
    930			kfree(buf);
    931			return STATUS_FAIL;
    932		}
    933		retval = ms_transfer_data(chip, MS_TM_AUTO_READ,
    934					  PRO_READ_LONG_DATA, 0x40, WAIT_INT,
    935					  0, 0, buf, 64 * 512);
    936		if (retval == STATUS_SUCCESS)
    937			break;
    938
    939		rtsx_clear_ms_error(chip);
    940	}
    941	if (retval != STATUS_SUCCESS) {
    942		kfree(buf);
    943		return STATUS_FAIL;
    944	}
    945
    946	i = 0;
    947	do {
    948		retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
    949		if (retval != STATUS_SUCCESS) {
    950			kfree(buf);
    951			return STATUS_FAIL;
    952		}
    953
    954		if ((val & MS_INT_CED) || !(val & MS_INT_BREQ))
    955			break;
    956
    957		retval = ms_transfer_tpc(chip, MS_TM_NORMAL_READ,
    958					 PRO_READ_LONG_DATA, 0, WAIT_INT);
    959		if (retval != STATUS_SUCCESS) {
    960			kfree(buf);
    961			return STATUS_FAIL;
    962		}
    963
    964		i++;
    965	} while (i < 1024);
    966
    967	if (buf[0] != 0xa5 && buf[1] != 0xc3) {
    968		/* Signature code is wrong */
    969		kfree(buf);
    970		return STATUS_FAIL;
    971	}
    972
    973	if (buf[4] < 1 || buf[4] > 12) {
    974		kfree(buf);
    975		return STATUS_FAIL;
    976	}
    977
    978	for (i = 0; i < buf[4]; i++) {
    979		int cur_addr_off = 16 + i * 12;
    980
    981#ifdef SUPPORT_MSXC
    982		if (buf[cur_addr_off + 8] == 0x10 ||
    983		    buf[cur_addr_off + 8] == 0x13) {
    984#else
    985		if (buf[cur_addr_off + 8] == 0x10) {
    986#endif
    987			sys_info_addr = ((u32)buf[cur_addr_off + 0] << 24) |
    988				((u32)buf[cur_addr_off + 1] << 16) |
    989				((u32)buf[cur_addr_off + 2] << 8) |
    990				buf[cur_addr_off + 3];
    991			sys_info_size = ((u32)buf[cur_addr_off + 4] << 24) |
    992				((u32)buf[cur_addr_off + 5] << 16) |
    993				((u32)buf[cur_addr_off + 6] << 8) |
    994				buf[cur_addr_off + 7];
    995			dev_dbg(rtsx_dev(chip), "sys_info_addr = 0x%x, sys_info_size = 0x%x\n",
    996				sys_info_addr, sys_info_size);
    997			if (sys_info_size != 96)  {
    998				kfree(buf);
    999				return STATUS_FAIL;
   1000			}
   1001			if (sys_info_addr < 0x1A0) {
   1002				kfree(buf);
   1003				return STATUS_FAIL;
   1004			}
   1005			if ((sys_info_size + sys_info_addr) > 0x8000) {
   1006				kfree(buf);
   1007				return STATUS_FAIL;
   1008			}
   1009
   1010#ifdef SUPPORT_MSXC
   1011			if (buf[cur_addr_off + 8] == 0x13)
   1012				ms_card->ms_type |= MS_XC;
   1013#endif
   1014#ifdef SUPPORT_PCGL_1P18
   1015			found_sys_info = 1;
   1016#else
   1017			break;
   1018#endif
   1019		}
   1020#ifdef SUPPORT_PCGL_1P18
   1021		if (buf[cur_addr_off + 8] == 0x15) {
   1022			model_name_addr = ((u32)buf[cur_addr_off + 0] << 24) |
   1023				((u32)buf[cur_addr_off + 1] << 16) |
   1024				((u32)buf[cur_addr_off + 2] << 8) |
   1025				buf[cur_addr_off + 3];
   1026			model_name_size = ((u32)buf[cur_addr_off + 4] << 24) |
   1027				((u32)buf[cur_addr_off + 5] << 16) |
   1028				((u32)buf[cur_addr_off + 6] << 8) |
   1029				buf[cur_addr_off + 7];
   1030			dev_dbg(rtsx_dev(chip), "model_name_addr = 0x%x, model_name_size = 0x%x\n",
   1031				model_name_addr, model_name_size);
   1032			if (model_name_size != 48)  {
   1033				kfree(buf);
   1034				return STATUS_FAIL;
   1035			}
   1036			if (model_name_addr < 0x1A0) {
   1037				kfree(buf);
   1038				return STATUS_FAIL;
   1039			}
   1040			if ((model_name_size + model_name_addr) > 0x8000) {
   1041				kfree(buf);
   1042				return STATUS_FAIL;
   1043			}
   1044
   1045			found_model_name = 1;
   1046		}
   1047
   1048		if (found_sys_info && found_model_name)
   1049			break;
   1050#endif
   1051	}
   1052
   1053	if (i == buf[4]) {
   1054		kfree(buf);
   1055		return STATUS_FAIL;
   1056	}
   1057
   1058	class_code =  buf[sys_info_addr + 0];
   1059	device_type = buf[sys_info_addr + 56];
   1060	sub_class = buf[sys_info_addr + 46];
   1061#ifdef SUPPORT_MSXC
   1062	if (CHK_MSXC(ms_card)) {
   1063		xc_total_blk = ((u32)buf[sys_info_addr + 6] << 24) |
   1064				((u32)buf[sys_info_addr + 7] << 16) |
   1065				((u32)buf[sys_info_addr + 8] << 8) |
   1066				buf[sys_info_addr + 9];
   1067		xc_blk_size = ((u32)buf[sys_info_addr + 32] << 24) |
   1068				((u32)buf[sys_info_addr + 33] << 16) |
   1069				((u32)buf[sys_info_addr + 34] << 8) |
   1070				buf[sys_info_addr + 35];
   1071		dev_dbg(rtsx_dev(chip), "xc_total_blk = 0x%x, xc_blk_size = 0x%x\n",
   1072			xc_total_blk, xc_blk_size);
   1073	} else {
   1074		total_blk = ((u16)buf[sys_info_addr + 6] << 8) |
   1075			buf[sys_info_addr + 7];
   1076		blk_size = ((u16)buf[sys_info_addr + 2] << 8) |
   1077			buf[sys_info_addr + 3];
   1078		dev_dbg(rtsx_dev(chip), "total_blk = 0x%x, blk_size = 0x%x\n",
   1079			total_blk, blk_size);
   1080	}
   1081#else
   1082	total_blk = ((u16)buf[sys_info_addr + 6] << 8) | buf[sys_info_addr + 7];
   1083	blk_size = ((u16)buf[sys_info_addr + 2] << 8) | buf[sys_info_addr + 3];
   1084	dev_dbg(rtsx_dev(chip), "total_blk = 0x%x, blk_size = 0x%x\n",
   1085		total_blk, blk_size);
   1086#endif
   1087
   1088	dev_dbg(rtsx_dev(chip), "class_code = 0x%x, device_type = 0x%x, sub_class = 0x%x\n",
   1089		class_code, device_type, sub_class);
   1090
   1091	memcpy(ms_card->raw_sys_info, buf + sys_info_addr, 96);
   1092#ifdef SUPPORT_PCGL_1P18
   1093	memcpy(ms_card->raw_model_name, buf + model_name_addr, 48);
   1094#endif
   1095
   1096	kfree(buf);
   1097
   1098#ifdef SUPPORT_MSXC
   1099	if (CHK_MSXC(ms_card)) {
   1100		if (class_code != 0x03)
   1101			return STATUS_FAIL;
   1102	} else {
   1103		if (class_code != 0x02)
   1104			return STATUS_FAIL;
   1105	}
   1106#else
   1107	if (class_code != 0x02)
   1108		return STATUS_FAIL;
   1109#endif
   1110
   1111	if (device_type != 0x00) {
   1112		if (device_type == 0x01 || device_type == 0x02 ||
   1113		    device_type == 0x03) {
   1114			chip->card_wp |= MS_CARD;
   1115		} else {
   1116			return STATUS_FAIL;
   1117		}
   1118	}
   1119
   1120	if (sub_class & 0xC0)
   1121		return STATUS_FAIL;
   1122
   1123	dev_dbg(rtsx_dev(chip), "class_code: 0x%x, device_type: 0x%x, sub_class: 0x%x\n",
   1124		class_code, device_type, sub_class);
   1125
   1126#ifdef SUPPORT_MSXC
   1127	if (CHK_MSXC(ms_card)) {
   1128		chip->capacity[chip->card2lun[MS_CARD]] =
   1129			ms_card->capacity = xc_total_blk * xc_blk_size;
   1130	} else {
   1131		chip->capacity[chip->card2lun[MS_CARD]] =
   1132			ms_card->capacity = total_blk * blk_size;
   1133	}
   1134#else
   1135	ms_card->capacity = total_blk * blk_size;
   1136	chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;
   1137#endif
   1138
   1139	return STATUS_SUCCESS;
   1140}
   1141
   1142#ifdef SUPPORT_MAGIC_GATE
   1143static int mg_set_tpc_para_sub(struct rtsx_chip *chip,
   1144			       int type, u8 mg_entry_num);
   1145#endif
   1146
   1147static int reset_ms_pro(struct rtsx_chip *chip)
   1148{
   1149	struct ms_info *ms_card = &chip->ms_card;
   1150	int retval;
   1151#ifdef XC_POWERCLASS
   1152	u8 change_power_class;
   1153
   1154	if (chip->ms_power_class_en & 0x02)
   1155		change_power_class = 2;
   1156	else if (chip->ms_power_class_en & 0x01)
   1157		change_power_class = 1;
   1158	else
   1159		change_power_class = 0;
   1160#endif
   1161
   1162#ifdef XC_POWERCLASS
   1163retry:
   1164#endif
   1165	retval = ms_pro_reset_flow(chip, 1);
   1166	if (retval != STATUS_SUCCESS) {
   1167		if (ms_card->switch_8bit_fail) {
   1168			retval = ms_pro_reset_flow(chip, 0);
   1169			if (retval != STATUS_SUCCESS)
   1170				return STATUS_FAIL;
   1171		} else {
   1172			return STATUS_FAIL;
   1173		}
   1174	}
   1175
   1176	retval = ms_read_attribute_info(chip);
   1177	if (retval != STATUS_SUCCESS)
   1178		return STATUS_FAIL;
   1179
   1180#ifdef XC_POWERCLASS
   1181	if (CHK_HG8BIT(ms_card))
   1182		change_power_class = 0;
   1183
   1184	if (change_power_class && CHK_MSXC(ms_card)) {
   1185		u8 power_class_en = chip->ms_power_class_en;
   1186
   1187		dev_dbg(rtsx_dev(chip), "power_class_en = 0x%x\n",
   1188			power_class_en);
   1189		dev_dbg(rtsx_dev(chip), "change_power_class = %d\n",
   1190			change_power_class);
   1191
   1192		if (change_power_class)
   1193			power_class_en &= (1 << (change_power_class - 1));
   1194		else
   1195			power_class_en = 0;
   1196
   1197		if (power_class_en) {
   1198			u8 power_class_mode =
   1199				(ms_card->raw_sys_info[46] & 0x18) >> 3;
   1200			dev_dbg(rtsx_dev(chip), "power_class_mode = 0x%x",
   1201				power_class_mode);
   1202			if (change_power_class > power_class_mode)
   1203				change_power_class = power_class_mode;
   1204			if (change_power_class) {
   1205				retval = msxc_change_power(chip,
   1206							   change_power_class);
   1207				if (retval != STATUS_SUCCESS) {
   1208					change_power_class--;
   1209					goto retry;
   1210				}
   1211			}
   1212		}
   1213	}
   1214#endif
   1215
   1216#ifdef SUPPORT_MAGIC_GATE
   1217	retval = mg_set_tpc_para_sub(chip, 0, 0);
   1218	if (retval != STATUS_SUCCESS)
   1219		return STATUS_FAIL;
   1220#endif
   1221
   1222	if (CHK_HG8BIT(ms_card))
   1223		chip->card_bus_width[chip->card2lun[MS_CARD]] = 8;
   1224	else
   1225		chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
   1226
   1227	return STATUS_SUCCESS;
   1228}
   1229
   1230static int ms_read_status_reg(struct rtsx_chip *chip)
   1231{
   1232	int retval;
   1233	u8 val[2];
   1234
   1235	retval = ms_set_rw_reg_addr(chip, STATUS_REG0, 2, 0, 0);
   1236	if (retval != STATUS_SUCCESS)
   1237		return STATUS_FAIL;
   1238
   1239	retval = ms_read_bytes(chip, READ_REG, 2, NO_WAIT_INT, val, 2);
   1240	if (retval != STATUS_SUCCESS)
   1241		return STATUS_FAIL;
   1242
   1243	if (val[1] & (STS_UCDT | STS_UCEX | STS_UCFG)) {
   1244		ms_set_err_code(chip, MS_FLASH_READ_ERROR);
   1245		return STATUS_FAIL;
   1246	}
   1247
   1248	return STATUS_SUCCESS;
   1249}
   1250
   1251static int ms_read_extra_data(struct rtsx_chip *chip,
   1252			      u16 block_addr, u8 page_num, u8 *buf, int buf_len)
   1253{
   1254	struct ms_info *ms_card = &chip->ms_card;
   1255	int retval, i;
   1256	u8 val, data[10];
   1257
   1258	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1259				    SYSTEM_PARAM, 6);
   1260	if (retval != STATUS_SUCCESS)
   1261		return STATUS_FAIL;
   1262
   1263	if (CHK_MS4BIT(ms_card)) {
   1264		/* Parallel interface */
   1265		data[0] = 0x88;
   1266	} else {
   1267		/* Serial interface */
   1268		data[0] = 0x80;
   1269	}
   1270	data[1] = 0;
   1271	data[2] = (u8)(block_addr >> 8);
   1272	data[3] = (u8)block_addr;
   1273	data[4] = 0x40;
   1274	data[5] = page_num;
   1275
   1276	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   1277		retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
   1278					data, 6);
   1279		if (retval == STATUS_SUCCESS)
   1280			break;
   1281	}
   1282	if (i == MS_MAX_RETRY_COUNT)
   1283		return STATUS_FAIL;
   1284
   1285	ms_set_err_code(chip, MS_NO_ERROR);
   1286
   1287	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   1288		retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
   1289		if (retval == STATUS_SUCCESS)
   1290			break;
   1291	}
   1292	if (i == MS_MAX_RETRY_COUNT)
   1293		return STATUS_FAIL;
   1294
   1295	ms_set_err_code(chip, MS_NO_ERROR);
   1296	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1297	if (retval != STATUS_SUCCESS)
   1298		return STATUS_FAIL;
   1299
   1300	if (val & INT_REG_CMDNK) {
   1301		ms_set_err_code(chip, MS_CMD_NK);
   1302		return STATUS_FAIL;
   1303	}
   1304	if (val & INT_REG_CED) {
   1305		if (val & INT_REG_ERR) {
   1306			retval = ms_read_status_reg(chip);
   1307			if (retval != STATUS_SUCCESS)
   1308				return STATUS_FAIL;
   1309
   1310			retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG,
   1311						    MS_EXTRA_SIZE, SYSTEM_PARAM,
   1312						    6);
   1313			if (retval != STATUS_SUCCESS)
   1314				return STATUS_FAIL;
   1315		}
   1316	}
   1317
   1318	retval = ms_read_bytes(chip, READ_REG, MS_EXTRA_SIZE, NO_WAIT_INT,
   1319			       data, MS_EXTRA_SIZE);
   1320	if (retval != STATUS_SUCCESS)
   1321		return STATUS_FAIL;
   1322
   1323	if (buf && buf_len) {
   1324		if (buf_len > MS_EXTRA_SIZE)
   1325			buf_len = MS_EXTRA_SIZE;
   1326		memcpy(buf, data, buf_len);
   1327	}
   1328
   1329	return STATUS_SUCCESS;
   1330}
   1331
   1332static int ms_write_extra_data(struct rtsx_chip *chip, u16 block_addr,
   1333			       u8 page_num, u8 *buf, int buf_len)
   1334{
   1335	struct ms_info *ms_card = &chip->ms_card;
   1336	int retval, i;
   1337	u8 val, data[16];
   1338
   1339	if (!buf || buf_len < MS_EXTRA_SIZE)
   1340		return STATUS_FAIL;
   1341
   1342	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1343				    SYSTEM_PARAM, 6 + MS_EXTRA_SIZE);
   1344	if (retval != STATUS_SUCCESS)
   1345		return STATUS_FAIL;
   1346
   1347	if (CHK_MS4BIT(ms_card))
   1348		data[0] = 0x88;
   1349	else
   1350		data[0] = 0x80;
   1351
   1352	data[1] = 0;
   1353	data[2] = (u8)(block_addr >> 8);
   1354	data[3] = (u8)block_addr;
   1355	data[4] = 0x40;
   1356	data[5] = page_num;
   1357
   1358	for (i = 6; i < MS_EXTRA_SIZE + 6; i++)
   1359		data[i] = buf[i - 6];
   1360
   1361	retval = ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
   1362				NO_WAIT_INT, data, 16);
   1363	if (retval != STATUS_SUCCESS)
   1364		return STATUS_FAIL;
   1365
   1366	retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   1367	if (retval != STATUS_SUCCESS)
   1368		return STATUS_FAIL;
   1369
   1370	ms_set_err_code(chip, MS_NO_ERROR);
   1371	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1372	if (retval != STATUS_SUCCESS)
   1373		return STATUS_FAIL;
   1374
   1375	if (val & INT_REG_CMDNK) {
   1376		ms_set_err_code(chip, MS_CMD_NK);
   1377		return STATUS_FAIL;
   1378	}
   1379	if (val & INT_REG_CED) {
   1380		if (val & INT_REG_ERR) {
   1381			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   1382			return STATUS_FAIL;
   1383		}
   1384	}
   1385
   1386	return STATUS_SUCCESS;
   1387}
   1388
   1389static int ms_read_page(struct rtsx_chip *chip, u16 block_addr, u8 page_num)
   1390{
   1391	struct ms_info *ms_card = &chip->ms_card;
   1392	int retval;
   1393	u8 val, data[6];
   1394
   1395	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1396				    SYSTEM_PARAM, 6);
   1397	if (retval != STATUS_SUCCESS)
   1398		return STATUS_FAIL;
   1399
   1400	if (CHK_MS4BIT(ms_card))
   1401		data[0] = 0x88;
   1402	else
   1403		data[0] = 0x80;
   1404
   1405	data[1] = 0;
   1406	data[2] = (u8)(block_addr >> 8);
   1407	data[3] = (u8)block_addr;
   1408	data[4] = 0x20;
   1409	data[5] = page_num;
   1410
   1411	retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
   1412	if (retval != STATUS_SUCCESS)
   1413		return STATUS_FAIL;
   1414
   1415	retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
   1416	if (retval != STATUS_SUCCESS)
   1417		return STATUS_FAIL;
   1418
   1419	ms_set_err_code(chip, MS_NO_ERROR);
   1420	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1421	if (retval != STATUS_SUCCESS)
   1422		return STATUS_FAIL;
   1423
   1424	if (val & INT_REG_CMDNK) {
   1425		ms_set_err_code(chip, MS_CMD_NK);
   1426		return STATUS_FAIL;
   1427	}
   1428
   1429	if (val & INT_REG_CED) {
   1430		if (val & INT_REG_ERR) {
   1431			if (!(val & INT_REG_BREQ)) {
   1432				ms_set_err_code(chip,  MS_FLASH_READ_ERROR);
   1433				return STATUS_FAIL;
   1434			}
   1435			retval = ms_read_status_reg(chip);
   1436			if (retval != STATUS_SUCCESS)
   1437				ms_set_err_code(chip,  MS_FLASH_WRITE_ERROR);
   1438
   1439		} else {
   1440			if (!(val & INT_REG_BREQ)) {
   1441				ms_set_err_code(chip, MS_BREQ_ERROR);
   1442				return STATUS_FAIL;
   1443			}
   1444		}
   1445	}
   1446
   1447	retval = ms_transfer_tpc(chip, MS_TM_NORMAL_READ, READ_PAGE_DATA,
   1448				 0, NO_WAIT_INT);
   1449	if (retval != STATUS_SUCCESS)
   1450		return STATUS_FAIL;
   1451
   1452	if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR))
   1453		return STATUS_FAIL;
   1454
   1455	return STATUS_SUCCESS;
   1456}
   1457
   1458static int ms_set_bad_block(struct rtsx_chip *chip, u16 phy_blk)
   1459{
   1460	struct ms_info *ms_card = &chip->ms_card;
   1461	int retval;
   1462	u8 val, data[8], extra[MS_EXTRA_SIZE];
   1463
   1464	retval = ms_read_extra_data(chip, phy_blk, 0, extra, MS_EXTRA_SIZE);
   1465	if (retval != STATUS_SUCCESS)
   1466		return STATUS_FAIL;
   1467
   1468	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1469				    SYSTEM_PARAM, 7);
   1470	if (retval != STATUS_SUCCESS)
   1471		return STATUS_FAIL;
   1472
   1473	ms_set_err_code(chip, MS_NO_ERROR);
   1474
   1475	if (CHK_MS4BIT(ms_card))
   1476		data[0] = 0x88;
   1477	else
   1478		data[0] = 0x80;
   1479
   1480	data[1] = 0;
   1481	data[2] = (u8)(phy_blk >> 8);
   1482	data[3] = (u8)phy_blk;
   1483	data[4] = 0x80;
   1484	data[5] = 0;
   1485	data[6] = extra[0] & 0x7F;
   1486	data[7] = 0xFF;
   1487
   1488	retval = ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT, data, 7);
   1489	if (retval != STATUS_SUCCESS)
   1490		return STATUS_FAIL;
   1491
   1492	retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   1493	if (retval != STATUS_SUCCESS)
   1494		return STATUS_FAIL;
   1495
   1496	ms_set_err_code(chip, MS_NO_ERROR);
   1497	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1498	if (retval != STATUS_SUCCESS)
   1499		return STATUS_FAIL;
   1500
   1501	if (val & INT_REG_CMDNK) {
   1502		ms_set_err_code(chip, MS_CMD_NK);
   1503		return STATUS_FAIL;
   1504	}
   1505
   1506	if (val & INT_REG_CED) {
   1507		if (val & INT_REG_ERR) {
   1508			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   1509			return STATUS_FAIL;
   1510		}
   1511	}
   1512
   1513	return STATUS_SUCCESS;
   1514}
   1515
   1516static int ms_erase_block(struct rtsx_chip *chip, u16 phy_blk)
   1517{
   1518	struct ms_info *ms_card = &chip->ms_card;
   1519	int retval, i = 0;
   1520	u8 val, data[6];
   1521
   1522	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1523				    SYSTEM_PARAM, 6);
   1524	if (retval != STATUS_SUCCESS)
   1525		return STATUS_FAIL;
   1526
   1527	ms_set_err_code(chip, MS_NO_ERROR);
   1528
   1529	if (CHK_MS4BIT(ms_card))
   1530		data[0] = 0x88;
   1531	else
   1532		data[0] = 0x80;
   1533
   1534	data[1] = 0;
   1535	data[2] = (u8)(phy_blk >> 8);
   1536	data[3] = (u8)phy_blk;
   1537	data[4] = 0;
   1538	data[5] = 0;
   1539
   1540	retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
   1541	if (retval != STATUS_SUCCESS)
   1542		return STATUS_FAIL;
   1543
   1544ERASE_RTY:
   1545	retval = ms_send_cmd(chip, BLOCK_ERASE, WAIT_INT);
   1546	if (retval != STATUS_SUCCESS)
   1547		return STATUS_FAIL;
   1548
   1549	ms_set_err_code(chip, MS_NO_ERROR);
   1550	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1551	if (retval != STATUS_SUCCESS)
   1552		return STATUS_FAIL;
   1553
   1554	if (val & INT_REG_CMDNK) {
   1555		if (i < 3) {
   1556			i++;
   1557			goto ERASE_RTY;
   1558		}
   1559
   1560		ms_set_err_code(chip, MS_CMD_NK);
   1561		ms_set_bad_block(chip, phy_blk);
   1562		return STATUS_FAIL;
   1563	}
   1564
   1565	if (val & INT_REG_CED) {
   1566		if (val & INT_REG_ERR) {
   1567			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   1568			return STATUS_FAIL;
   1569		}
   1570	}
   1571
   1572	return STATUS_SUCCESS;
   1573}
   1574
   1575static void ms_set_page_status(u16 log_blk, u8 type, u8 *extra, int extra_len)
   1576{
   1577	if (!extra || extra_len < MS_EXTRA_SIZE)
   1578		return;
   1579
   1580	memset(extra, 0xFF, MS_EXTRA_SIZE);
   1581
   1582	if (type == set_PS_NG) {
   1583		/* set page status as 1:NG,and block status keep 1:OK */
   1584		extra[0] = 0xB8;
   1585	} else {
   1586		/* set page status as 0:Data Error,and block status keep 1:OK */
   1587		extra[0] = 0x98;
   1588	}
   1589
   1590	extra[2] = (u8)(log_blk >> 8);
   1591	extra[3] = (u8)log_blk;
   1592}
   1593
   1594static int ms_init_page(struct rtsx_chip *chip, u16 phy_blk, u16 log_blk,
   1595			u8 start_page, u8 end_page)
   1596{
   1597	int retval;
   1598	u8 extra[MS_EXTRA_SIZE], i;
   1599
   1600	memset(extra, 0xff, MS_EXTRA_SIZE);
   1601
   1602	extra[0] = 0xf8;	/* Block, page OK, data erased */
   1603	extra[1] = 0xff;
   1604	extra[2] = (u8)(log_blk >> 8);
   1605	extra[3] = (u8)log_blk;
   1606
   1607	for (i = start_page; i < end_page; i++) {
   1608		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   1609			ms_set_err_code(chip, MS_NO_CARD);
   1610			return STATUS_FAIL;
   1611		}
   1612
   1613		retval = ms_write_extra_data(chip, phy_blk, i,
   1614					     extra, MS_EXTRA_SIZE);
   1615		if (retval != STATUS_SUCCESS)
   1616			return STATUS_FAIL;
   1617	}
   1618
   1619	return STATUS_SUCCESS;
   1620}
   1621
   1622static int ms_copy_page(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
   1623			u16 log_blk, u8 start_page, u8 end_page)
   1624{
   1625	struct ms_info *ms_card = &chip->ms_card;
   1626	bool uncorrect_flag = false;
   1627	int retval, rty_cnt;
   1628	u8 extra[MS_EXTRA_SIZE], val, i, j, data[16];
   1629
   1630	dev_dbg(rtsx_dev(chip), "Copy page from 0x%x to 0x%x, logical block is 0x%x\n",
   1631		old_blk, new_blk, log_blk);
   1632	dev_dbg(rtsx_dev(chip), "start_page = %d, end_page = %d\n",
   1633		start_page, end_page);
   1634
   1635	retval = ms_read_extra_data(chip, new_blk, 0, extra, MS_EXTRA_SIZE);
   1636	if (retval != STATUS_SUCCESS)
   1637		return STATUS_FAIL;
   1638
   1639	retval = ms_read_status_reg(chip);
   1640	if (retval != STATUS_SUCCESS)
   1641		return STATUS_FAIL;
   1642
   1643	retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
   1644	if (retval)
   1645		return retval;
   1646
   1647	if (val & BUF_FULL) {
   1648		retval = ms_send_cmd(chip, CLEAR_BUF, WAIT_INT);
   1649		if (retval != STATUS_SUCCESS)
   1650			return STATUS_FAIL;
   1651
   1652		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1653		if (retval != STATUS_SUCCESS)
   1654			return STATUS_FAIL;
   1655
   1656		if (!(val & INT_REG_CED)) {
   1657			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   1658			return STATUS_FAIL;
   1659		}
   1660	}
   1661
   1662	for (i = start_page; i < end_page; i++) {
   1663		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   1664			ms_set_err_code(chip, MS_NO_CARD);
   1665			return STATUS_FAIL;
   1666		}
   1667
   1668		retval = ms_read_extra_data(chip, old_blk, i, extra,
   1669					    MS_EXTRA_SIZE);
   1670		if (retval != STATUS_SUCCESS)
   1671			return STATUS_FAIL;
   1672
   1673		retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG,
   1674					    MS_EXTRA_SIZE, SYSTEM_PARAM, 6);
   1675		if (retval != STATUS_SUCCESS)
   1676			return STATUS_FAIL;
   1677
   1678		ms_set_err_code(chip, MS_NO_ERROR);
   1679
   1680		if (CHK_MS4BIT(ms_card))
   1681			data[0] = 0x88;
   1682		else
   1683			data[0] = 0x80;
   1684
   1685		data[1] = 0;
   1686		data[2] = (u8)(old_blk >> 8);
   1687		data[3] = (u8)old_blk;
   1688		data[4] = 0x20;
   1689		data[5] = i;
   1690
   1691		retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
   1692					data, 6);
   1693		if (retval != STATUS_SUCCESS)
   1694			return STATUS_FAIL;
   1695
   1696		retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
   1697		if (retval != STATUS_SUCCESS)
   1698			return STATUS_FAIL;
   1699
   1700		ms_set_err_code(chip, MS_NO_ERROR);
   1701		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1702		if (retval != STATUS_SUCCESS)
   1703			return STATUS_FAIL;
   1704
   1705		if (val & INT_REG_CMDNK) {
   1706			ms_set_err_code(chip, MS_CMD_NK);
   1707			return STATUS_FAIL;
   1708		}
   1709
   1710		if (val & INT_REG_CED) {
   1711			if (val & INT_REG_ERR) {
   1712				retval = ms_read_status_reg(chip);
   1713				if (retval != STATUS_SUCCESS) {
   1714					uncorrect_flag = true;
   1715					dev_dbg(rtsx_dev(chip), "Uncorrectable error\n");
   1716				} else {
   1717					uncorrect_flag = false;
   1718				}
   1719
   1720				retval = ms_transfer_tpc(chip,
   1721							 MS_TM_NORMAL_READ,
   1722							 READ_PAGE_DATA,
   1723							 0, NO_WAIT_INT);
   1724				if (retval != STATUS_SUCCESS)
   1725					return STATUS_FAIL;
   1726
   1727				if (uncorrect_flag) {
   1728					ms_set_page_status(log_blk, set_PS_NG,
   1729							   extra,
   1730							   MS_EXTRA_SIZE);
   1731					if (i == 0)
   1732						extra[0] &= 0xEF;
   1733
   1734					ms_write_extra_data(chip, old_blk, i,
   1735							    extra,
   1736							    MS_EXTRA_SIZE);
   1737					dev_dbg(rtsx_dev(chip), "page %d : extra[0] = 0x%x\n",
   1738						i, extra[0]);
   1739					MS_SET_BAD_BLOCK_FLG(ms_card);
   1740
   1741					ms_set_page_status(log_blk,
   1742							   set_PS_error, extra,
   1743							   MS_EXTRA_SIZE);
   1744					ms_write_extra_data(chip, new_blk, i,
   1745							    extra,
   1746							    MS_EXTRA_SIZE);
   1747					continue;
   1748				}
   1749
   1750				for (rty_cnt = 0; rty_cnt < MS_MAX_RETRY_COUNT;
   1751				     rty_cnt++) {
   1752					retval = ms_transfer_tpc(chip,
   1753								 MS_TM_NORMAL_WRITE,
   1754								 WRITE_PAGE_DATA,
   1755								 0, NO_WAIT_INT);
   1756					if (retval == STATUS_SUCCESS)
   1757						break;
   1758				}
   1759				if (rty_cnt == MS_MAX_RETRY_COUNT)
   1760					return STATUS_FAIL;
   1761			}
   1762
   1763			if (!(val & INT_REG_BREQ)) {
   1764				ms_set_err_code(chip, MS_BREQ_ERROR);
   1765				return STATUS_FAIL;
   1766			}
   1767		}
   1768
   1769		retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   1770					    SYSTEM_PARAM, (6 + MS_EXTRA_SIZE));
   1771
   1772		ms_set_err_code(chip, MS_NO_ERROR);
   1773
   1774		if (CHK_MS4BIT(ms_card))
   1775			data[0] = 0x88;
   1776		else
   1777			data[0] = 0x80;
   1778
   1779		data[1] = 0;
   1780		data[2] = (u8)(new_blk >> 8);
   1781		data[3] = (u8)new_blk;
   1782		data[4] = 0x20;
   1783		data[5] = i;
   1784
   1785		if ((extra[0] & 0x60) != 0x60)
   1786			data[6] = extra[0];
   1787		else
   1788			data[6] = 0xF8;
   1789
   1790		data[6 + 1] = 0xFF;
   1791		data[6 + 2] = (u8)(log_blk >> 8);
   1792		data[6 + 3] = (u8)log_blk;
   1793
   1794		for (j = 4; j <= MS_EXTRA_SIZE; j++)
   1795			data[6 + j] = 0xFF;
   1796
   1797		retval = ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
   1798					NO_WAIT_INT, data, 16);
   1799		if (retval != STATUS_SUCCESS)
   1800			return STATUS_FAIL;
   1801
   1802		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   1803		if (retval != STATUS_SUCCESS)
   1804			return STATUS_FAIL;
   1805
   1806		ms_set_err_code(chip, MS_NO_ERROR);
   1807		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   1808		if (retval != STATUS_SUCCESS)
   1809			return STATUS_FAIL;
   1810
   1811		if (val & INT_REG_CMDNK) {
   1812			ms_set_err_code(chip, MS_CMD_NK);
   1813			return STATUS_FAIL;
   1814		}
   1815
   1816		if (val & INT_REG_CED) {
   1817			if (val & INT_REG_ERR) {
   1818				ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   1819				return STATUS_FAIL;
   1820			}
   1821		}
   1822
   1823		if (i == 0) {
   1824			retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG,
   1825						    MS_EXTRA_SIZE, SYSTEM_PARAM,
   1826						    7);
   1827			if (retval != STATUS_SUCCESS)
   1828				return STATUS_FAIL;
   1829
   1830			ms_set_err_code(chip, MS_NO_ERROR);
   1831
   1832			if (CHK_MS4BIT(ms_card))
   1833				data[0] = 0x88;
   1834			else
   1835				data[0] = 0x80;
   1836
   1837			data[1] = 0;
   1838			data[2] = (u8)(old_blk >> 8);
   1839			data[3] = (u8)old_blk;
   1840			data[4] = 0x80;
   1841			data[5] = 0;
   1842			data[6] = 0xEF;
   1843			data[7] = 0xFF;
   1844
   1845			retval = ms_write_bytes(chip, WRITE_REG, 7,
   1846						NO_WAIT_INT, data, 8);
   1847			if (retval != STATUS_SUCCESS)
   1848				return STATUS_FAIL;
   1849
   1850			retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   1851			if (retval != STATUS_SUCCESS)
   1852				return STATUS_FAIL;
   1853
   1854			ms_set_err_code(chip, MS_NO_ERROR);
   1855			retval = ms_read_bytes(chip, GET_INT, 1,
   1856					       NO_WAIT_INT, &val, 1);
   1857			if (retval != STATUS_SUCCESS)
   1858				return STATUS_FAIL;
   1859
   1860			if (val & INT_REG_CMDNK) {
   1861				ms_set_err_code(chip, MS_CMD_NK);
   1862				return STATUS_FAIL;
   1863			}
   1864
   1865			if (val & INT_REG_CED) {
   1866				if (val & INT_REG_ERR) {
   1867					ms_set_err_code(chip,
   1868							MS_FLASH_WRITE_ERROR);
   1869					return STATUS_FAIL;
   1870				}
   1871			}
   1872		}
   1873	}
   1874
   1875	return STATUS_SUCCESS;
   1876}
   1877
   1878static int reset_ms(struct rtsx_chip *chip)
   1879{
   1880	struct ms_info *ms_card = &chip->ms_card;
   1881	int retval;
   1882	u16 i, reg_addr, block_size;
   1883	u8 val, extra[MS_EXTRA_SIZE], j, *ptr;
   1884#ifndef SUPPORT_MAGIC_GATE
   1885	u16 eblock_cnt;
   1886#endif
   1887
   1888	retval = ms_prepare_reset(chip);
   1889	if (retval != STATUS_SUCCESS)
   1890		return STATUS_FAIL;
   1891
   1892	ms_card->ms_type |= TYPE_MS;
   1893
   1894	retval = ms_send_cmd(chip, MS_RESET, NO_WAIT_INT);
   1895	if (retval != STATUS_SUCCESS)
   1896		return STATUS_FAIL;
   1897
   1898	retval = ms_read_status_reg(chip);
   1899	if (retval != STATUS_SUCCESS)
   1900		return STATUS_FAIL;
   1901
   1902	retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
   1903	if (retval)
   1904		return retval;
   1905
   1906	if (val & WRT_PRTCT)
   1907		chip->card_wp |= MS_CARD;
   1908	else
   1909		chip->card_wp &= ~MS_CARD;
   1910
   1911	i = 0;
   1912
   1913RE_SEARCH:
   1914	/* Search Boot Block */
   1915	while (i < (MAX_DEFECTIVE_BLOCK + 2)) {
   1916		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   1917			ms_set_err_code(chip, MS_NO_CARD);
   1918			return STATUS_FAIL;
   1919		}
   1920
   1921		retval = ms_read_extra_data(chip, i, 0, extra, MS_EXTRA_SIZE);
   1922		if (retval != STATUS_SUCCESS) {
   1923			i++;
   1924			continue;
   1925		}
   1926
   1927		if (extra[0] & BLOCK_OK) {
   1928			if (!(extra[1] & NOT_BOOT_BLOCK)) {
   1929				ms_card->boot_block = i;
   1930				break;
   1931			}
   1932		}
   1933		i++;
   1934	}
   1935
   1936	if (i == (MAX_DEFECTIVE_BLOCK + 2)) {
   1937		dev_dbg(rtsx_dev(chip), "No boot block found!");
   1938		return STATUS_FAIL;
   1939	}
   1940
   1941	for (j = 0; j < 3; j++) {
   1942		retval = ms_read_page(chip, ms_card->boot_block, j);
   1943		if (retval != STATUS_SUCCESS) {
   1944			if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR)) {
   1945				i = ms_card->boot_block + 1;
   1946				ms_set_err_code(chip, MS_NO_ERROR);
   1947				goto RE_SEARCH;
   1948			}
   1949		}
   1950	}
   1951
   1952	retval = ms_read_page(chip, ms_card->boot_block, 0);
   1953	if (retval != STATUS_SUCCESS)
   1954		return STATUS_FAIL;
   1955
   1956	/* Read MS system information as sys_info */
   1957	rtsx_init_cmd(chip);
   1958
   1959	for (i = 0; i < 96; i++)
   1960		rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 0x1A0 + i, 0, 0);
   1961
   1962	retval = rtsx_send_cmd(chip, MS_CARD, 100);
   1963	if (retval < 0)
   1964		return STATUS_FAIL;
   1965
   1966	ptr = rtsx_get_cmd_data(chip);
   1967	memcpy(ms_card->raw_sys_info, ptr, 96);
   1968
   1969	/* Read useful block contents */
   1970	rtsx_init_cmd(chip);
   1971
   1972	rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID0, 0, 0);
   1973	rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID1, 0, 0);
   1974
   1975	for (reg_addr = DISABLED_BLOCK0; reg_addr <= DISABLED_BLOCK3;
   1976	     reg_addr++)
   1977		rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
   1978
   1979	for (reg_addr = BLOCK_SIZE_0; reg_addr <= PAGE_SIZE_1; reg_addr++)
   1980		rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
   1981
   1982	rtsx_add_cmd(chip, READ_REG_CMD, MS_device_type, 0, 0);
   1983	rtsx_add_cmd(chip, READ_REG_CMD, MS_4bit_support, 0, 0);
   1984
   1985	retval = rtsx_send_cmd(chip, MS_CARD, 100);
   1986	if (retval < 0)
   1987		return STATUS_FAIL;
   1988
   1989	ptr = rtsx_get_cmd_data(chip);
   1990
   1991	dev_dbg(rtsx_dev(chip), "Boot block data:\n");
   1992	dev_dbg(rtsx_dev(chip), "%*ph\n", 16, ptr);
   1993
   1994	/* Block ID error
   1995	 * HEADER_ID0, HEADER_ID1
   1996	 */
   1997	if (ptr[0] != 0x00 || ptr[1] != 0x01) {
   1998		i = ms_card->boot_block + 1;
   1999		goto RE_SEARCH;
   2000	}
   2001
   2002	/* Page size error
   2003	 * PAGE_SIZE_0, PAGE_SIZE_1
   2004	 */
   2005	if (ptr[12] != 0x02 || ptr[13] != 0x00) {
   2006		i = ms_card->boot_block + 1;
   2007		goto RE_SEARCH;
   2008	}
   2009
   2010	if (ptr[14] == 1 || ptr[14] == 3)
   2011		chip->card_wp |= MS_CARD;
   2012
   2013	/* BLOCK_SIZE_0, BLOCK_SIZE_1 */
   2014	block_size = ((u16)ptr[6] << 8) | ptr[7];
   2015	if (block_size == 0x0010) {
   2016		/* Block size 16KB */
   2017		ms_card->block_shift = 5;
   2018		ms_card->page_off = 0x1F;
   2019	} else if (block_size == 0x0008) {
   2020		/* Block size 8KB */
   2021		ms_card->block_shift = 4;
   2022		ms_card->page_off = 0x0F;
   2023	}
   2024
   2025	/* BLOCK_COUNT_0, BLOCK_COUNT_1 */
   2026	ms_card->total_block = ((u16)ptr[8] << 8) | ptr[9];
   2027
   2028#ifdef SUPPORT_MAGIC_GATE
   2029	j = ptr[10];
   2030
   2031	if (ms_card->block_shift == 4)  { /* 4MB or 8MB */
   2032		if (j < 2)  { /* Effective block for 4MB: 0x1F0 */
   2033			ms_card->capacity = 0x1EE0;
   2034		} else { /* Effective block for 8MB: 0x3E0 */
   2035			ms_card->capacity = 0x3DE0;
   2036		}
   2037	} else  { /* 16MB, 32MB, 64MB or 128MB */
   2038		if (j < 5)  { /* Effective block for 16MB: 0x3E0 */
   2039			ms_card->capacity = 0x7BC0;
   2040		} else if (j < 0xA) { /* Effective block for 32MB: 0x7C0 */
   2041			ms_card->capacity = 0xF7C0;
   2042		} else if (j < 0x11) { /* Effective block for 64MB: 0xF80 */
   2043			ms_card->capacity = 0x1EF80;
   2044		} else { /* Effective block for 128MB: 0x1F00 */
   2045			ms_card->capacity = 0x3DF00;
   2046		}
   2047	}
   2048#else
   2049	/* EBLOCK_COUNT_0, EBLOCK_COUNT_1 */
   2050	eblock_cnt = ((u16)ptr[10] << 8) | ptr[11];
   2051
   2052	ms_card->capacity = ((u32)eblock_cnt - 2) << ms_card->block_shift;
   2053#endif
   2054
   2055	chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;
   2056
   2057	/* Switch I/F Mode */
   2058	if (ptr[15]) {
   2059		retval = ms_set_rw_reg_addr(chip, 0, 0, SYSTEM_PARAM, 1);
   2060		if (retval != STATUS_SUCCESS)
   2061			return STATUS_FAIL;
   2062
   2063		retval = rtsx_write_register(chip, PPBUF_BASE2, 0xFF, 0x88);
   2064		if (retval)
   2065			return retval;
   2066
   2067		retval = rtsx_write_register(chip, PPBUF_BASE2 + 1, 0xFF, 0);
   2068		if (retval)
   2069			return retval;
   2070
   2071		retval = ms_transfer_tpc(chip, MS_TM_WRITE_BYTES, WRITE_REG, 1,
   2072					 NO_WAIT_INT);
   2073		if (retval != STATUS_SUCCESS)
   2074			return STATUS_FAIL;
   2075
   2076		retval = rtsx_write_register(chip, MS_CFG,
   2077					     0x58 | MS_NO_CHECK_INT,
   2078					     MS_BUS_WIDTH_4 |
   2079					     PUSH_TIME_ODD |
   2080					     MS_NO_CHECK_INT);
   2081		if (retval)
   2082			return retval;
   2083
   2084		ms_card->ms_type |= MS_4BIT;
   2085	}
   2086
   2087	if (CHK_MS4BIT(ms_card))
   2088		chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
   2089	else
   2090		chip->card_bus_width[chip->card2lun[MS_CARD]] = 1;
   2091
   2092	return STATUS_SUCCESS;
   2093}
   2094
   2095static int ms_init_l2p_tbl(struct rtsx_chip *chip)
   2096{
   2097	struct ms_info *ms_card = &chip->ms_card;
   2098	int size, i, seg_no, retval;
   2099	u16 defect_block, reg_addr;
   2100	u8 val1, val2;
   2101
   2102	ms_card->segment_cnt = ms_card->total_block >> 9;
   2103	dev_dbg(rtsx_dev(chip), "ms_card->segment_cnt = %d\n",
   2104		ms_card->segment_cnt);
   2105
   2106	size = ms_card->segment_cnt * sizeof(struct zone_entry);
   2107	ms_card->segment = vzalloc(size);
   2108	if (!ms_card->segment)
   2109		return STATUS_FAIL;
   2110
   2111	retval = ms_read_page(chip, ms_card->boot_block, 1);
   2112	if (retval != STATUS_SUCCESS)
   2113		goto INIT_FAIL;
   2114
   2115	reg_addr = PPBUF_BASE2;
   2116	for (i = 0; i < (((ms_card->total_block >> 9) * 10) + 1); i++) {
   2117		int block_no;
   2118
   2119		retval = rtsx_read_register(chip, reg_addr++, &val1);
   2120		if (retval != STATUS_SUCCESS)
   2121			goto INIT_FAIL;
   2122
   2123		retval = rtsx_read_register(chip, reg_addr++, &val2);
   2124		if (retval != STATUS_SUCCESS)
   2125			goto INIT_FAIL;
   2126
   2127		defect_block = ((u16)val1 << 8) | val2;
   2128		if (defect_block == 0xFFFF)
   2129			break;
   2130
   2131		seg_no = defect_block / 512;
   2132
   2133		block_no = ms_card->segment[seg_no].disable_count++;
   2134		ms_card->segment[seg_no].defect_list[block_no] = defect_block;
   2135	}
   2136
   2137	for (i = 0; i < ms_card->segment_cnt; i++) {
   2138		ms_card->segment[i].build_flag = 0;
   2139		ms_card->segment[i].l2p_table = NULL;
   2140		ms_card->segment[i].free_table = NULL;
   2141		ms_card->segment[i].get_index = 0;
   2142		ms_card->segment[i].set_index = 0;
   2143		ms_card->segment[i].unused_blk_cnt = 0;
   2144
   2145		dev_dbg(rtsx_dev(chip), "defective block count of segment %d is %d\n",
   2146			i, ms_card->segment[i].disable_count);
   2147	}
   2148
   2149	return STATUS_SUCCESS;
   2150
   2151INIT_FAIL:
   2152	vfree(ms_card->segment);
   2153	ms_card->segment = NULL;
   2154
   2155	return STATUS_FAIL;
   2156}
   2157
   2158static u16 ms_get_l2p_tbl(struct rtsx_chip *chip, int seg_no, u16 log_off)
   2159{
   2160	struct ms_info *ms_card = &chip->ms_card;
   2161	struct zone_entry *segment;
   2162
   2163	if (!ms_card->segment)
   2164		return 0xFFFF;
   2165
   2166	segment = &ms_card->segment[seg_no];
   2167
   2168	if (segment->l2p_table)
   2169		return segment->l2p_table[log_off];
   2170
   2171	return 0xFFFF;
   2172}
   2173
   2174static void ms_set_l2p_tbl(struct rtsx_chip *chip,
   2175			   int seg_no, u16 log_off, u16 phy_blk)
   2176{
   2177	struct ms_info *ms_card = &chip->ms_card;
   2178	struct zone_entry *segment;
   2179
   2180	if (!ms_card->segment)
   2181		return;
   2182
   2183	segment = &ms_card->segment[seg_no];
   2184	if (segment->l2p_table)
   2185		segment->l2p_table[log_off] = phy_blk;
   2186}
   2187
   2188static void ms_set_unused_block(struct rtsx_chip *chip, u16 phy_blk)
   2189{
   2190	struct ms_info *ms_card = &chip->ms_card;
   2191	struct zone_entry *segment;
   2192	int seg_no;
   2193
   2194	seg_no = (int)phy_blk >> 9;
   2195	segment = &ms_card->segment[seg_no];
   2196
   2197	segment->free_table[segment->set_index++] = phy_blk;
   2198	if (segment->set_index >= MS_FREE_TABLE_CNT)
   2199		segment->set_index = 0;
   2200
   2201	segment->unused_blk_cnt++;
   2202}
   2203
   2204static u16 ms_get_unused_block(struct rtsx_chip *chip, int seg_no)
   2205{
   2206	struct ms_info *ms_card = &chip->ms_card;
   2207	struct zone_entry *segment;
   2208	u16 phy_blk;
   2209
   2210	segment = &ms_card->segment[seg_no];
   2211
   2212	if (segment->unused_blk_cnt <= 0)
   2213		return 0xFFFF;
   2214
   2215	phy_blk = segment->free_table[segment->get_index];
   2216	segment->free_table[segment->get_index++] = 0xFFFF;
   2217	if (segment->get_index >= MS_FREE_TABLE_CNT)
   2218		segment->get_index = 0;
   2219
   2220	segment->unused_blk_cnt--;
   2221
   2222	return phy_blk;
   2223}
   2224
   2225static const unsigned short ms_start_idx[] = {0, 494, 990, 1486, 1982, 2478,
   2226					      2974, 3470, 3966, 4462, 4958,
   2227					      5454, 5950, 6446, 6942, 7438,
   2228					      7934};
   2229
   2230static int ms_arbitrate_l2p(struct rtsx_chip *chip, u16 phy_blk,
   2231			    u16 log_off, u8 us1, u8 us2)
   2232{
   2233	struct ms_info *ms_card = &chip->ms_card;
   2234	struct zone_entry *segment;
   2235	int seg_no;
   2236	u16 tmp_blk;
   2237
   2238	seg_no = (int)phy_blk >> 9;
   2239	segment = &ms_card->segment[seg_no];
   2240	tmp_blk = segment->l2p_table[log_off];
   2241
   2242	if (us1 != us2) {
   2243		if (us1 == 0) {
   2244			if (!(chip->card_wp & MS_CARD))
   2245				ms_erase_block(chip, tmp_blk);
   2246
   2247			ms_set_unused_block(chip, tmp_blk);
   2248			segment->l2p_table[log_off] = phy_blk;
   2249		} else {
   2250			if (!(chip->card_wp & MS_CARD))
   2251				ms_erase_block(chip, phy_blk);
   2252
   2253			ms_set_unused_block(chip, phy_blk);
   2254		}
   2255	} else {
   2256		if (phy_blk < tmp_blk) {
   2257			if (!(chip->card_wp & MS_CARD))
   2258				ms_erase_block(chip, phy_blk);
   2259
   2260			ms_set_unused_block(chip, phy_blk);
   2261		} else {
   2262			if (!(chip->card_wp & MS_CARD))
   2263				ms_erase_block(chip, tmp_blk);
   2264
   2265			ms_set_unused_block(chip, tmp_blk);
   2266			segment->l2p_table[log_off] = phy_blk;
   2267		}
   2268	}
   2269
   2270	return STATUS_SUCCESS;
   2271}
   2272
   2273static int ms_build_l2p_tbl(struct rtsx_chip *chip, int seg_no)
   2274{
   2275	struct ms_info *ms_card = &chip->ms_card;
   2276	struct zone_entry *segment;
   2277	bool defect_flag;
   2278	int retval, table_size, disable_cnt, i;
   2279	u16 start, end, phy_blk, log_blk, tmp_blk, idx;
   2280	u8 extra[MS_EXTRA_SIZE], us1, us2;
   2281
   2282	dev_dbg(rtsx_dev(chip), "%s: %d\n", __func__, seg_no);
   2283
   2284	if (!ms_card->segment) {
   2285		retval = ms_init_l2p_tbl(chip);
   2286		if (retval != STATUS_SUCCESS)
   2287			return retval;
   2288	}
   2289
   2290	if (ms_card->segment[seg_no].build_flag) {
   2291		dev_dbg(rtsx_dev(chip), "l2p table of segment %d has been built\n",
   2292			seg_no);
   2293		return STATUS_SUCCESS;
   2294	}
   2295
   2296	if (seg_no == 0)
   2297		table_size = 494;
   2298	else
   2299		table_size = 496;
   2300
   2301	segment = &ms_card->segment[seg_no];
   2302
   2303	if (!segment->l2p_table) {
   2304		segment->l2p_table = vmalloc(array_size(table_size, 2));
   2305		if (!segment->l2p_table)
   2306			goto BUILD_FAIL;
   2307	}
   2308	memset((u8 *)(segment->l2p_table), 0xff, array_size(table_size, 2));
   2309
   2310	if (!segment->free_table) {
   2311		segment->free_table = vmalloc(array_size(MS_FREE_TABLE_CNT, 2));
   2312		if (!segment->free_table)
   2313			goto BUILD_FAIL;
   2314	}
   2315	memset((u8 *)(segment->free_table), 0xff, array_size(MS_FREE_TABLE_CNT, 2));
   2316
   2317	start = (u16)seg_no << 9;
   2318	end = (u16)(seg_no + 1) << 9;
   2319
   2320	disable_cnt = segment->disable_count;
   2321
   2322	segment->get_index = 0;
   2323	segment->set_index = 0;
   2324	segment->unused_blk_cnt = 0;
   2325
   2326	for (phy_blk = start; phy_blk < end; phy_blk++) {
   2327		if (disable_cnt) {
   2328			defect_flag = false;
   2329			for (i = 0; i < segment->disable_count; i++) {
   2330				if (phy_blk == segment->defect_list[i]) {
   2331					defect_flag = true;
   2332					break;
   2333				}
   2334			}
   2335			if (defect_flag) {
   2336				disable_cnt--;
   2337				continue;
   2338			}
   2339		}
   2340
   2341		retval = ms_read_extra_data(chip, phy_blk, 0,
   2342					    extra, MS_EXTRA_SIZE);
   2343		if (retval != STATUS_SUCCESS) {
   2344			dev_dbg(rtsx_dev(chip), "read extra data fail\n");
   2345			ms_set_bad_block(chip, phy_blk);
   2346			continue;
   2347		}
   2348
   2349		if (seg_no == ms_card->segment_cnt - 1) {
   2350			if (!(extra[1] & NOT_TRANSLATION_TABLE)) {
   2351				if (!(chip->card_wp & MS_CARD)) {
   2352					retval = ms_erase_block(chip, phy_blk);
   2353					if (retval != STATUS_SUCCESS)
   2354						continue;
   2355					extra[2] = 0xff;
   2356					extra[3] = 0xff;
   2357				}
   2358			}
   2359		}
   2360
   2361		if (!(extra[0] & BLOCK_OK))
   2362			continue;
   2363		if (!(extra[1] & NOT_BOOT_BLOCK))
   2364			continue;
   2365		if ((extra[0] & PAGE_OK) != PAGE_OK)
   2366			continue;
   2367
   2368		log_blk = ((u16)extra[2] << 8) | extra[3];
   2369
   2370		if (log_blk == 0xFFFF) {
   2371			if (!(chip->card_wp & MS_CARD)) {
   2372				retval = ms_erase_block(chip, phy_blk);
   2373				if (retval != STATUS_SUCCESS)
   2374					continue;
   2375			}
   2376			ms_set_unused_block(chip, phy_blk);
   2377			continue;
   2378		}
   2379
   2380		if (log_blk < ms_start_idx[seg_no] ||
   2381		    log_blk >= ms_start_idx[seg_no + 1]) {
   2382			if (!(chip->card_wp & MS_CARD)) {
   2383				retval = ms_erase_block(chip, phy_blk);
   2384				if (retval != STATUS_SUCCESS)
   2385					continue;
   2386			}
   2387			ms_set_unused_block(chip, phy_blk);
   2388			continue;
   2389		}
   2390
   2391		idx = log_blk - ms_start_idx[seg_no];
   2392
   2393		if (segment->l2p_table[idx] == 0xFFFF) {
   2394			segment->l2p_table[idx] = phy_blk;
   2395			continue;
   2396		}
   2397
   2398		us1 = extra[0] & 0x10;
   2399		tmp_blk = segment->l2p_table[idx];
   2400		retval = ms_read_extra_data(chip, tmp_blk, 0,
   2401					    extra, MS_EXTRA_SIZE);
   2402		if (retval != STATUS_SUCCESS)
   2403			continue;
   2404		us2 = extra[0] & 0x10;
   2405
   2406		(void)ms_arbitrate_l2p(chip, phy_blk,
   2407				log_blk - ms_start_idx[seg_no], us1, us2);
   2408	}
   2409
   2410	segment->build_flag = 1;
   2411
   2412	dev_dbg(rtsx_dev(chip), "unused block count: %d\n",
   2413		segment->unused_blk_cnt);
   2414
   2415	/* Logical Address Confirmation Process */
   2416	if (seg_no == ms_card->segment_cnt - 1) {
   2417		if (segment->unused_blk_cnt < 2)
   2418			chip->card_wp |= MS_CARD;
   2419	} else {
   2420		if (segment->unused_blk_cnt < 1)
   2421			chip->card_wp |= MS_CARD;
   2422	}
   2423
   2424	if (chip->card_wp & MS_CARD)
   2425		return STATUS_SUCCESS;
   2426
   2427	for (log_blk = ms_start_idx[seg_no];
   2428	     log_blk < ms_start_idx[seg_no + 1]; log_blk++) {
   2429		idx = log_blk - ms_start_idx[seg_no];
   2430		if (segment->l2p_table[idx] == 0xFFFF) {
   2431			phy_blk = ms_get_unused_block(chip, seg_no);
   2432			if (phy_blk == 0xFFFF) {
   2433				chip->card_wp |= MS_CARD;
   2434				return STATUS_SUCCESS;
   2435			}
   2436			retval = ms_init_page(chip, phy_blk, log_blk, 0, 1);
   2437			if (retval != STATUS_SUCCESS)
   2438				goto BUILD_FAIL;
   2439
   2440			segment->l2p_table[idx] = phy_blk;
   2441			if (seg_no == ms_card->segment_cnt - 1) {
   2442				if (segment->unused_blk_cnt < 2) {
   2443					chip->card_wp |= MS_CARD;
   2444					return STATUS_SUCCESS;
   2445				}
   2446			} else {
   2447				if (segment->unused_blk_cnt < 1) {
   2448					chip->card_wp |= MS_CARD;
   2449					return STATUS_SUCCESS;
   2450				}
   2451			}
   2452		}
   2453	}
   2454
   2455	/* Make boot block be the first normal block */
   2456	if (seg_no == 0) {
   2457		for (log_blk = 0; log_blk < 494; log_blk++) {
   2458			tmp_blk = segment->l2p_table[log_blk];
   2459			if (tmp_blk < ms_card->boot_block) {
   2460				dev_dbg(rtsx_dev(chip), "Boot block is not the first normal block.\n");
   2461
   2462				if (chip->card_wp & MS_CARD)
   2463					break;
   2464
   2465				phy_blk = ms_get_unused_block(chip, 0);
   2466				retval = ms_copy_page(chip, tmp_blk, phy_blk,
   2467						      log_blk, 0,
   2468						      ms_card->page_off + 1);
   2469				if (retval != STATUS_SUCCESS)
   2470					return STATUS_FAIL;
   2471
   2472				segment->l2p_table[log_blk] = phy_blk;
   2473
   2474				retval = ms_set_bad_block(chip, tmp_blk);
   2475				if (retval != STATUS_SUCCESS)
   2476					return STATUS_FAIL;
   2477			}
   2478		}
   2479	}
   2480
   2481	return STATUS_SUCCESS;
   2482
   2483BUILD_FAIL:
   2484	segment->build_flag = 0;
   2485	vfree(segment->l2p_table);
   2486	segment->l2p_table = NULL;
   2487	vfree(segment->free_table);
   2488	segment->free_table = NULL;
   2489
   2490	return STATUS_FAIL;
   2491}
   2492
   2493int reset_ms_card(struct rtsx_chip *chip)
   2494{
   2495	struct ms_info *ms_card = &chip->ms_card;
   2496	int seg_no = ms_card->total_block / 512 - 1;
   2497	int retval;
   2498
   2499	memset(ms_card, 0, sizeof(struct ms_info));
   2500
   2501	retval = enable_card_clock(chip, MS_CARD);
   2502	if (retval != STATUS_SUCCESS)
   2503		return STATUS_FAIL;
   2504
   2505	retval = select_card(chip, MS_CARD);
   2506	if (retval != STATUS_SUCCESS)
   2507		return STATUS_FAIL;
   2508
   2509	ms_card->ms_type = 0;
   2510
   2511	retval = reset_ms_pro(chip);
   2512	if (retval != STATUS_SUCCESS) {
   2513		if (ms_card->check_ms_flow) {
   2514			retval = reset_ms(chip);
   2515			if (retval != STATUS_SUCCESS)
   2516				return STATUS_FAIL;
   2517		} else {
   2518			return STATUS_FAIL;
   2519		}
   2520	}
   2521
   2522	retval = ms_set_init_para(chip);
   2523	if (retval != STATUS_SUCCESS)
   2524		return STATUS_FAIL;
   2525
   2526	if (!CHK_MSPRO(ms_card)) {
   2527		/* Build table for the last segment,
   2528		 * to check if L2P table block exists, erasing it
   2529		 */
   2530		retval = ms_build_l2p_tbl(chip, seg_no);
   2531		if (retval != STATUS_SUCCESS)
   2532			return STATUS_FAIL;
   2533	}
   2534
   2535	dev_dbg(rtsx_dev(chip), "ms_card->ms_type = 0x%x\n", ms_card->ms_type);
   2536
   2537	return STATUS_SUCCESS;
   2538}
   2539
   2540static int mspro_set_rw_cmd(struct rtsx_chip *chip,
   2541			    u32 start_sec, u16 sec_cnt, u8 cmd)
   2542{
   2543	int retval, i;
   2544	u8 data[8];
   2545
   2546	data[0] = cmd;
   2547	data[1] = (u8)(sec_cnt >> 8);
   2548	data[2] = (u8)sec_cnt;
   2549	data[3] = (u8)(start_sec >> 24);
   2550	data[4] = (u8)(start_sec >> 16);
   2551	data[5] = (u8)(start_sec >> 8);
   2552	data[6] = (u8)start_sec;
   2553	data[7] = 0;
   2554
   2555	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   2556		retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7,
   2557					WAIT_INT, data, 8);
   2558		if (retval == STATUS_SUCCESS)
   2559			break;
   2560	}
   2561	if (i == MS_MAX_RETRY_COUNT)
   2562		return STATUS_FAIL;
   2563
   2564	return STATUS_SUCCESS;
   2565}
   2566
   2567void mspro_stop_seq_mode(struct rtsx_chip *chip)
   2568{
   2569	struct ms_info *ms_card = &chip->ms_card;
   2570	int retval;
   2571
   2572	if (ms_card->seq_mode) {
   2573		retval = ms_switch_clock(chip);
   2574		if (retval != STATUS_SUCCESS)
   2575			return;
   2576
   2577		ms_card->seq_mode = 0;
   2578		ms_card->total_sec_cnt = 0;
   2579		ms_send_cmd(chip, PRO_STOP, WAIT_INT);
   2580
   2581		rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
   2582	}
   2583}
   2584
   2585static inline int ms_auto_tune_clock(struct rtsx_chip *chip)
   2586{
   2587	struct ms_info *ms_card = &chip->ms_card;
   2588	int retval;
   2589
   2590	if (chip->asic_code) {
   2591		if (ms_card->ms_clock > 30)
   2592			ms_card->ms_clock -= 20;
   2593	} else {
   2594		if (ms_card->ms_clock == CLK_80)
   2595			ms_card->ms_clock = CLK_60;
   2596		else if (ms_card->ms_clock == CLK_60)
   2597			ms_card->ms_clock = CLK_40;
   2598	}
   2599
   2600	retval = ms_switch_clock(chip);
   2601	if (retval != STATUS_SUCCESS)
   2602		return STATUS_FAIL;
   2603
   2604	return STATUS_SUCCESS;
   2605}
   2606
   2607static int mspro_rw_multi_sector(struct scsi_cmnd *srb,
   2608				 struct rtsx_chip *chip, u32 start_sector,
   2609				 u16 sector_cnt)
   2610{
   2611	struct ms_info *ms_card = &chip->ms_card;
   2612	bool mode_2k = false;
   2613	int retval;
   2614	u16 count;
   2615	u8 val, trans_mode, rw_tpc, rw_cmd;
   2616
   2617	ms_set_err_code(chip, MS_NO_ERROR);
   2618
   2619	ms_card->cleanup_counter = 0;
   2620
   2621	if (CHK_MSHG(ms_card)) {
   2622		if ((start_sector % 4) || (sector_cnt % 4)) {
   2623			if (srb->sc_data_direction == DMA_FROM_DEVICE) {
   2624				rw_tpc = PRO_READ_LONG_DATA;
   2625				rw_cmd = PRO_READ_DATA;
   2626			} else {
   2627				rw_tpc = PRO_WRITE_LONG_DATA;
   2628				rw_cmd = PRO_WRITE_DATA;
   2629			}
   2630		} else {
   2631			if (srb->sc_data_direction == DMA_FROM_DEVICE) {
   2632				rw_tpc = PRO_READ_QUAD_DATA;
   2633				rw_cmd = PRO_READ_2K_DATA;
   2634			} else {
   2635				rw_tpc = PRO_WRITE_QUAD_DATA;
   2636				rw_cmd = PRO_WRITE_2K_DATA;
   2637			}
   2638			mode_2k = true;
   2639		}
   2640	} else {
   2641		if (srb->sc_data_direction == DMA_FROM_DEVICE) {
   2642			rw_tpc = PRO_READ_LONG_DATA;
   2643			rw_cmd = PRO_READ_DATA;
   2644		} else {
   2645			rw_tpc = PRO_WRITE_LONG_DATA;
   2646			rw_cmd = PRO_WRITE_DATA;
   2647		}
   2648	}
   2649
   2650	retval = ms_switch_clock(chip);
   2651	if (retval != STATUS_SUCCESS)
   2652		return STATUS_FAIL;
   2653
   2654	if (srb->sc_data_direction == DMA_FROM_DEVICE)
   2655		trans_mode = MS_TM_AUTO_READ;
   2656	else
   2657		trans_mode = MS_TM_AUTO_WRITE;
   2658
   2659	retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
   2660	if (retval)
   2661		return retval;
   2662
   2663	if (ms_card->seq_mode) {
   2664		if (ms_card->pre_dir != srb->sc_data_direction ||
   2665		    ((ms_card->pre_sec_addr + ms_card->pre_sec_cnt) !=
   2666		     start_sector) ||
   2667		    (mode_2k && (ms_card->seq_mode & MODE_512_SEQ)) ||
   2668		    (!mode_2k && (ms_card->seq_mode & MODE_2K_SEQ)) ||
   2669		    !(val & MS_INT_BREQ) ||
   2670		    ((ms_card->total_sec_cnt + sector_cnt) > 0xFE00)) {
   2671			ms_card->seq_mode = 0;
   2672			ms_card->total_sec_cnt = 0;
   2673			if (val & MS_INT_BREQ) {
   2674				retval = ms_send_cmd(chip, PRO_STOP, WAIT_INT);
   2675				if (retval != STATUS_SUCCESS)
   2676					return STATUS_FAIL;
   2677
   2678				rtsx_write_register(chip, RBCTL, RB_FLUSH,
   2679						    RB_FLUSH);
   2680			}
   2681		}
   2682	}
   2683
   2684	if (!ms_card->seq_mode) {
   2685		ms_card->total_sec_cnt = 0;
   2686		if (sector_cnt >= SEQ_START_CRITERIA) {
   2687			if ((ms_card->capacity - start_sector) > 0xFE00)
   2688				count = 0xFE00;
   2689			else
   2690				count = (u16)(ms_card->capacity - start_sector);
   2691
   2692			if (count > sector_cnt) {
   2693				if (mode_2k)
   2694					ms_card->seq_mode = MODE_2K_SEQ;
   2695				else
   2696					ms_card->seq_mode = MODE_512_SEQ;
   2697			}
   2698		} else {
   2699			count = sector_cnt;
   2700		}
   2701		retval = mspro_set_rw_cmd(chip, start_sector, count, rw_cmd);
   2702		if (retval != STATUS_SUCCESS) {
   2703			ms_card->seq_mode = 0;
   2704			return STATUS_FAIL;
   2705		}
   2706	}
   2707
   2708	retval = ms_transfer_data(chip, trans_mode, rw_tpc, sector_cnt,
   2709				  WAIT_INT, mode_2k, scsi_sg_count(srb),
   2710				  scsi_sglist(srb), scsi_bufflen(srb));
   2711	if (retval != STATUS_SUCCESS) {
   2712		ms_card->seq_mode = 0;
   2713		rtsx_read_register(chip, MS_TRANS_CFG, &val);
   2714		rtsx_clear_ms_error(chip);
   2715
   2716		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   2717			chip->rw_need_retry = 0;
   2718			dev_dbg(rtsx_dev(chip), "No card exist, exit %s\n",
   2719				__func__);
   2720			return STATUS_FAIL;
   2721		}
   2722
   2723		if (val & MS_INT_BREQ)
   2724			ms_send_cmd(chip, PRO_STOP, WAIT_INT);
   2725
   2726		if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
   2727			dev_dbg(rtsx_dev(chip), "MSPro CRC error, tune clock!\n");
   2728			chip->rw_need_retry = 1;
   2729			ms_auto_tune_clock(chip);
   2730		}
   2731
   2732		return retval;
   2733	}
   2734
   2735	if (ms_card->seq_mode) {
   2736		ms_card->pre_sec_addr = start_sector;
   2737		ms_card->pre_sec_cnt = sector_cnt;
   2738		ms_card->pre_dir = srb->sc_data_direction;
   2739		ms_card->total_sec_cnt += sector_cnt;
   2740	}
   2741
   2742	return STATUS_SUCCESS;
   2743}
   2744
   2745static int mspro_read_format_progress(struct rtsx_chip *chip,
   2746				      const int short_data_len)
   2747{
   2748	struct ms_info *ms_card = &chip->ms_card;
   2749	int retval, i;
   2750	u32 total_progress, cur_progress;
   2751	u8 cnt, tmp;
   2752	u8 data[8];
   2753
   2754	dev_dbg(rtsx_dev(chip), "%s, short_data_len = %d\n", __func__,
   2755		short_data_len);
   2756
   2757	retval = ms_switch_clock(chip);
   2758	if (retval != STATUS_SUCCESS) {
   2759		ms_card->format_status = FORMAT_FAIL;
   2760		return STATUS_FAIL;
   2761	}
   2762
   2763	retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
   2764	if (retval != STATUS_SUCCESS) {
   2765		ms_card->format_status = FORMAT_FAIL;
   2766		return STATUS_FAIL;
   2767	}
   2768
   2769	if (!(tmp & MS_INT_BREQ)) {
   2770		if ((tmp & (MS_INT_CED | MS_INT_BREQ | MS_INT_CMDNK |
   2771			    MS_INT_ERR)) == MS_INT_CED) {
   2772			ms_card->format_status = FORMAT_SUCCESS;
   2773			return STATUS_SUCCESS;
   2774		}
   2775		ms_card->format_status = FORMAT_FAIL;
   2776		return STATUS_FAIL;
   2777	}
   2778
   2779	if (short_data_len >= 256)
   2780		cnt = 0;
   2781	else
   2782		cnt = (u8)short_data_len;
   2783
   2784	retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT,
   2785				     MS_NO_CHECK_INT);
   2786	if (retval != STATUS_SUCCESS) {
   2787		ms_card->format_status = FORMAT_FAIL;
   2788		return STATUS_FAIL;
   2789	}
   2790
   2791	retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, cnt, WAIT_INT,
   2792			       data, 8);
   2793	if (retval != STATUS_SUCCESS) {
   2794		ms_card->format_status = FORMAT_FAIL;
   2795		return STATUS_FAIL;
   2796	}
   2797
   2798	total_progress = (data[0] << 24) | (data[1] << 16) |
   2799		(data[2] << 8) | data[3];
   2800	cur_progress = (data[4] << 24) | (data[5] << 16) |
   2801		(data[6] << 8) | data[7];
   2802
   2803	dev_dbg(rtsx_dev(chip), "total_progress = %d, cur_progress = %d\n",
   2804		total_progress, cur_progress);
   2805
   2806	if (total_progress == 0) {
   2807		ms_card->progress = 0;
   2808	} else {
   2809		u64 ulltmp = (u64)cur_progress * (u64)65535;
   2810
   2811		do_div(ulltmp, total_progress);
   2812		ms_card->progress = (u16)ulltmp;
   2813	}
   2814	dev_dbg(rtsx_dev(chip), "progress = %d\n", ms_card->progress);
   2815
   2816	for (i = 0; i < 5000; i++) {
   2817		retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
   2818		if (retval != STATUS_SUCCESS) {
   2819			ms_card->format_status = FORMAT_FAIL;
   2820			return STATUS_FAIL;
   2821		}
   2822		if (tmp & (MS_INT_CED | MS_INT_CMDNK |
   2823				MS_INT_BREQ | MS_INT_ERR))
   2824			break;
   2825
   2826		wait_timeout(1);
   2827	}
   2828
   2829	retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT, 0);
   2830	if (retval != STATUS_SUCCESS) {
   2831		ms_card->format_status = FORMAT_FAIL;
   2832		return STATUS_FAIL;
   2833	}
   2834
   2835	if (i == 5000) {
   2836		ms_card->format_status = FORMAT_FAIL;
   2837		return STATUS_FAIL;
   2838	}
   2839
   2840	if (tmp & (MS_INT_CMDNK | MS_INT_ERR)) {
   2841		ms_card->format_status = FORMAT_FAIL;
   2842		return STATUS_FAIL;
   2843	}
   2844
   2845	if (tmp & MS_INT_CED) {
   2846		ms_card->format_status = FORMAT_SUCCESS;
   2847		ms_card->pro_under_formatting = 0;
   2848	} else if (tmp & MS_INT_BREQ) {
   2849		ms_card->format_status = FORMAT_IN_PROGRESS;
   2850	} else {
   2851		ms_card->format_status = FORMAT_FAIL;
   2852		ms_card->pro_under_formatting = 0;
   2853		return STATUS_FAIL;
   2854	}
   2855
   2856	return STATUS_SUCCESS;
   2857}
   2858
   2859void mspro_polling_format_status(struct rtsx_chip *chip)
   2860{
   2861	struct ms_info *ms_card = &chip->ms_card;
   2862	int i;
   2863
   2864	if (ms_card->pro_under_formatting &&
   2865	    (rtsx_get_stat(chip) != RTSX_STAT_SS)) {
   2866		rtsx_set_stat(chip, RTSX_STAT_RUN);
   2867
   2868		for (i = 0; i < 65535; i++) {
   2869			mspro_read_format_progress(chip, MS_SHORT_DATA_LEN);
   2870			if (ms_card->format_status != FORMAT_IN_PROGRESS)
   2871				break;
   2872		}
   2873	}
   2874}
   2875
   2876int mspro_format(struct scsi_cmnd *srb, struct rtsx_chip *chip,
   2877		 int short_data_len, bool quick_format)
   2878{
   2879	struct ms_info *ms_card = &chip->ms_card;
   2880	int retval, i;
   2881	u8 buf[8], tmp;
   2882	u16 para;
   2883
   2884	retval = ms_switch_clock(chip);
   2885	if (retval != STATUS_SUCCESS)
   2886		return STATUS_FAIL;
   2887
   2888	retval = ms_set_rw_reg_addr(chip, 0x00, 0x00, PRO_TPC_PARM, 0x01);
   2889	if (retval != STATUS_SUCCESS)
   2890		return STATUS_FAIL;
   2891
   2892	memset(buf, 0, 2);
   2893	switch (short_data_len) {
   2894	case 32:
   2895		buf[0] = 0;
   2896		break;
   2897	case 64:
   2898		buf[0] = 1;
   2899		break;
   2900	case 128:
   2901		buf[0] = 2;
   2902		break;
   2903	case 256:
   2904	default:
   2905		buf[0] = 3;
   2906		break;
   2907	}
   2908
   2909	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   2910		retval = ms_write_bytes(chip, PRO_WRITE_REG, 1,
   2911					NO_WAIT_INT, buf, 2);
   2912		if (retval == STATUS_SUCCESS)
   2913			break;
   2914	}
   2915	if (i == MS_MAX_RETRY_COUNT)
   2916		return STATUS_FAIL;
   2917
   2918	if (quick_format)
   2919		para = 0x0000;
   2920	else
   2921		para = 0x0001;
   2922
   2923	retval = mspro_set_rw_cmd(chip, 0, para, PRO_FORMAT);
   2924	if (retval != STATUS_SUCCESS)
   2925		return STATUS_FAIL;
   2926
   2927	retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
   2928	if (retval)
   2929		return retval;
   2930
   2931	if (tmp & (MS_INT_CMDNK | MS_INT_ERR))
   2932		return STATUS_FAIL;
   2933
   2934	if ((tmp & (MS_INT_BREQ | MS_INT_CED)) == MS_INT_BREQ) {
   2935		ms_card->pro_under_formatting = 1;
   2936		ms_card->progress = 0;
   2937		ms_card->format_status = FORMAT_IN_PROGRESS;
   2938		return STATUS_SUCCESS;
   2939	}
   2940
   2941	if (tmp & MS_INT_CED) {
   2942		ms_card->pro_under_formatting = 0;
   2943		ms_card->progress = 0;
   2944		ms_card->format_status = FORMAT_SUCCESS;
   2945		set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_NO_SENSE);
   2946		return STATUS_SUCCESS;
   2947	}
   2948
   2949	return STATUS_FAIL;
   2950}
   2951
   2952static int ms_read_multiple_pages(struct rtsx_chip *chip, u16 phy_blk,
   2953				  u16 log_blk, u8 start_page, u8 end_page,
   2954				  u8 *buf, unsigned int *index,
   2955				  unsigned int *offset)
   2956{
   2957	struct ms_info *ms_card = &chip->ms_card;
   2958	int retval, i;
   2959	u8 extra[MS_EXTRA_SIZE], page_addr, val, trans_cfg, data[6];
   2960	u8 *ptr;
   2961
   2962	retval = ms_read_extra_data(chip, phy_blk, start_page,
   2963				    extra, MS_EXTRA_SIZE);
   2964	if (retval == STATUS_SUCCESS) {
   2965		if ((extra[1] & 0x30) != 0x30) {
   2966			ms_set_err_code(chip, MS_FLASH_READ_ERROR);
   2967			return STATUS_FAIL;
   2968		}
   2969	}
   2970
   2971	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   2972				    SYSTEM_PARAM, 6);
   2973	if (retval != STATUS_SUCCESS)
   2974		return STATUS_FAIL;
   2975
   2976	if (CHK_MS4BIT(ms_card))
   2977		data[0] = 0x88;
   2978	else
   2979		data[0] = 0x80;
   2980
   2981	data[1] = 0;
   2982	data[2] = (u8)(phy_blk >> 8);
   2983	data[3] = (u8)phy_blk;
   2984	data[4] = 0;
   2985	data[5] = start_page;
   2986
   2987	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   2988		retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
   2989					data, 6);
   2990		if (retval == STATUS_SUCCESS)
   2991			break;
   2992	}
   2993	if (i == MS_MAX_RETRY_COUNT)
   2994		return STATUS_FAIL;
   2995
   2996	ms_set_err_code(chip, MS_NO_ERROR);
   2997
   2998	retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
   2999	if (retval != STATUS_SUCCESS)
   3000		return STATUS_FAIL;
   3001
   3002	ptr = buf;
   3003
   3004	for (page_addr = start_page; page_addr < end_page; page_addr++) {
   3005		ms_set_err_code(chip, MS_NO_ERROR);
   3006
   3007		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   3008			ms_set_err_code(chip, MS_NO_CARD);
   3009			return STATUS_FAIL;
   3010		}
   3011
   3012		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   3013		if (retval != STATUS_SUCCESS)
   3014			return STATUS_FAIL;
   3015
   3016		if (val & INT_REG_CMDNK) {
   3017			ms_set_err_code(chip, MS_CMD_NK);
   3018			return STATUS_FAIL;
   3019		}
   3020		if (val & INT_REG_ERR) {
   3021			if (val & INT_REG_BREQ) {
   3022				retval = ms_read_status_reg(chip);
   3023				if (retval != STATUS_SUCCESS) {
   3024					if (!(chip->card_wp & MS_CARD)) {
   3025						reset_ms(chip);
   3026						ms_set_page_status
   3027							(log_blk, set_PS_NG,
   3028							 extra,
   3029							 MS_EXTRA_SIZE);
   3030						ms_write_extra_data
   3031							(chip, phy_blk,
   3032							 page_addr, extra,
   3033							 MS_EXTRA_SIZE);
   3034					}
   3035					ms_set_err_code(chip,
   3036							MS_FLASH_READ_ERROR);
   3037					return STATUS_FAIL;
   3038				}
   3039			} else {
   3040				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
   3041				return STATUS_FAIL;
   3042			}
   3043		} else {
   3044			if (!(val & INT_REG_BREQ)) {
   3045				ms_set_err_code(chip, MS_BREQ_ERROR);
   3046				return STATUS_FAIL;
   3047			}
   3048		}
   3049
   3050		if (page_addr == (end_page - 1)) {
   3051			if (!(val & INT_REG_CED)) {
   3052				retval = ms_send_cmd(chip, BLOCK_END, WAIT_INT);
   3053				if (retval != STATUS_SUCCESS)
   3054					return STATUS_FAIL;
   3055			}
   3056
   3057			retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT,
   3058					       &val, 1);
   3059			if (retval != STATUS_SUCCESS)
   3060				return STATUS_FAIL;
   3061
   3062			if (!(val & INT_REG_CED)) {
   3063				ms_set_err_code(chip, MS_FLASH_READ_ERROR);
   3064				return STATUS_FAIL;
   3065			}
   3066
   3067			trans_cfg = NO_WAIT_INT;
   3068		} else {
   3069			trans_cfg = WAIT_INT;
   3070		}
   3071
   3072		rtsx_init_cmd(chip);
   3073
   3074		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, READ_PAGE_DATA);
   3075		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
   3076			     0xFF, trans_cfg);
   3077		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
   3078			     0x01, RING_BUFFER);
   3079
   3080		trans_dma_enable(DMA_FROM_DEVICE, chip, 512, DMA_512);
   3081
   3082		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
   3083			     MS_TRANSFER_START |  MS_TM_NORMAL_READ);
   3084		rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
   3085			     MS_TRANSFER_END, MS_TRANSFER_END);
   3086
   3087		rtsx_send_cmd_no_wait(chip);
   3088
   3089		retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr, 512,
   3090						    scsi_sg_count(chip->srb),
   3091						    index, offset,
   3092						    DMA_FROM_DEVICE,
   3093						    chip->ms_timeout);
   3094		if (retval < 0) {
   3095			if (retval == -ETIMEDOUT) {
   3096				ms_set_err_code(chip, MS_TO_ERROR);
   3097				rtsx_clear_ms_error(chip);
   3098				return STATUS_TIMEDOUT;
   3099			}
   3100
   3101			retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
   3102			if (retval != STATUS_SUCCESS) {
   3103				ms_set_err_code(chip, MS_TO_ERROR);
   3104				rtsx_clear_ms_error(chip);
   3105				return STATUS_TIMEDOUT;
   3106			}
   3107			if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
   3108				ms_set_err_code(chip, MS_CRC16_ERROR);
   3109				rtsx_clear_ms_error(chip);
   3110				return STATUS_FAIL;
   3111			}
   3112		}
   3113
   3114		if (scsi_sg_count(chip->srb) == 0)
   3115			ptr += 512;
   3116	}
   3117
   3118	return STATUS_SUCCESS;
   3119}
   3120
   3121static int ms_write_multiple_pages(struct rtsx_chip *chip, u16 old_blk,
   3122				   u16 new_blk, u16 log_blk, u8 start_page,
   3123				u8 end_page, u8 *buf, unsigned int *index,
   3124				unsigned int *offset)
   3125{
   3126	struct ms_info *ms_card = &chip->ms_card;
   3127	int retval, i;
   3128	u8 page_addr, val, data[16];
   3129	u8 *ptr;
   3130
   3131	if (!start_page) {
   3132		retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   3133					    SYSTEM_PARAM, 7);
   3134		if (retval != STATUS_SUCCESS)
   3135			return STATUS_FAIL;
   3136
   3137		if (CHK_MS4BIT(ms_card))
   3138			data[0] = 0x88;
   3139		else
   3140			data[0] = 0x80;
   3141
   3142		data[1] = 0;
   3143		data[2] = (u8)(old_blk >> 8);
   3144		data[3] = (u8)old_blk;
   3145		data[4] = 0x80;
   3146		data[5] = 0;
   3147		data[6] = 0xEF;
   3148		data[7] = 0xFF;
   3149
   3150		retval = ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT,
   3151					data, 8);
   3152		if (retval != STATUS_SUCCESS)
   3153			return STATUS_FAIL;
   3154
   3155		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   3156		if (retval != STATUS_SUCCESS)
   3157			return STATUS_FAIL;
   3158
   3159		ms_set_err_code(chip, MS_NO_ERROR);
   3160		retval = ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT, 1,
   3161					 NO_WAIT_INT);
   3162		if (retval != STATUS_SUCCESS)
   3163			return STATUS_FAIL;
   3164	}
   3165
   3166	retval = ms_set_rw_reg_addr(chip, OVERWRITE_FLAG, MS_EXTRA_SIZE,
   3167				    SYSTEM_PARAM, (6 + MS_EXTRA_SIZE));
   3168	if (retval != STATUS_SUCCESS)
   3169		return STATUS_FAIL;
   3170
   3171	ms_set_err_code(chip, MS_NO_ERROR);
   3172
   3173	if (CHK_MS4BIT(ms_card))
   3174		data[0] = 0x88;
   3175	else
   3176		data[0] = 0x80;
   3177
   3178	data[1] = 0;
   3179	data[2] = (u8)(new_blk >> 8);
   3180	data[3] = (u8)new_blk;
   3181	if ((end_page - start_page) == 1)
   3182		data[4] = 0x20;
   3183	else
   3184		data[4] = 0;
   3185
   3186	data[5] = start_page;
   3187	data[6] = 0xF8;
   3188	data[7] = 0xFF;
   3189	data[8] = (u8)(log_blk >> 8);
   3190	data[9] = (u8)log_blk;
   3191
   3192	for (i = 0x0A; i < 0x10; i++)
   3193		data[i] = 0xFF;
   3194
   3195	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   3196		retval = ms_write_bytes(chip, WRITE_REG, 6 + MS_EXTRA_SIZE,
   3197					NO_WAIT_INT, data, 16);
   3198		if (retval == STATUS_SUCCESS)
   3199			break;
   3200	}
   3201	if (i == MS_MAX_RETRY_COUNT)
   3202		return STATUS_FAIL;
   3203
   3204	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   3205		retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
   3206		if (retval == STATUS_SUCCESS)
   3207			break;
   3208	}
   3209	if (i == MS_MAX_RETRY_COUNT)
   3210		return STATUS_FAIL;
   3211
   3212	retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   3213	if (retval != STATUS_SUCCESS)
   3214		return STATUS_FAIL;
   3215
   3216	ptr = buf;
   3217	for (page_addr = start_page; page_addr < end_page; page_addr++) {
   3218		ms_set_err_code(chip, MS_NO_ERROR);
   3219
   3220		if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   3221			ms_set_err_code(chip, MS_NO_CARD);
   3222			return STATUS_FAIL;
   3223		}
   3224
   3225		if (val & INT_REG_CMDNK) {
   3226			ms_set_err_code(chip, MS_CMD_NK);
   3227			return STATUS_FAIL;
   3228		}
   3229		if (val & INT_REG_ERR) {
   3230			ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   3231			return STATUS_FAIL;
   3232		}
   3233		if (!(val & INT_REG_BREQ)) {
   3234			ms_set_err_code(chip, MS_BREQ_ERROR);
   3235			return STATUS_FAIL;
   3236		}
   3237
   3238		udelay(30);
   3239
   3240		rtsx_init_cmd(chip);
   3241
   3242		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
   3243			     0xFF, WRITE_PAGE_DATA);
   3244		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
   3245			     0xFF, WAIT_INT);
   3246		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
   3247			     0x01, RING_BUFFER);
   3248
   3249		trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
   3250
   3251		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
   3252			     MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
   3253		rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
   3254			     MS_TRANSFER_END, MS_TRANSFER_END);
   3255
   3256		rtsx_send_cmd_no_wait(chip);
   3257
   3258		retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr,	512,
   3259						    scsi_sg_count(chip->srb),
   3260						    index, offset,
   3261						    DMA_TO_DEVICE,
   3262						    chip->ms_timeout);
   3263		if (retval < 0) {
   3264			ms_set_err_code(chip, MS_TO_ERROR);
   3265			rtsx_clear_ms_error(chip);
   3266
   3267			if (retval == -ETIMEDOUT)
   3268				return STATUS_TIMEDOUT;
   3269			return STATUS_FAIL;
   3270		}
   3271
   3272		retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
   3273		if (retval != STATUS_SUCCESS)
   3274			return STATUS_FAIL;
   3275
   3276		if ((end_page - start_page) == 1) {
   3277			if (!(val & INT_REG_CED)) {
   3278				ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
   3279				return STATUS_FAIL;
   3280			}
   3281		} else {
   3282			if (page_addr == (end_page - 1)) {
   3283				if (!(val & INT_REG_CED)) {
   3284					retval = ms_send_cmd(chip, BLOCK_END,
   3285							     WAIT_INT);
   3286					if (retval != STATUS_SUCCESS)
   3287						return STATUS_FAIL;
   3288				}
   3289
   3290				retval = ms_read_bytes(chip, GET_INT, 1,
   3291						       NO_WAIT_INT, &val, 1);
   3292				if (retval != STATUS_SUCCESS)
   3293					return STATUS_FAIL;
   3294			}
   3295
   3296			if (page_addr == (end_page - 1) ||
   3297			    page_addr == ms_card->page_off) {
   3298				if (!(val & INT_REG_CED)) {
   3299					ms_set_err_code(chip,
   3300							MS_FLASH_WRITE_ERROR);
   3301					return STATUS_FAIL;
   3302				}
   3303			}
   3304		}
   3305
   3306		if (scsi_sg_count(chip->srb) == 0)
   3307			ptr += 512;
   3308	}
   3309
   3310	return STATUS_SUCCESS;
   3311}
   3312
   3313static int ms_finish_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
   3314			   u16 log_blk, u8 page_off)
   3315{
   3316	struct ms_info *ms_card = &chip->ms_card;
   3317	int retval, seg_no;
   3318
   3319	retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
   3320			      page_off, ms_card->page_off + 1);
   3321	if (retval != STATUS_SUCCESS)
   3322		return STATUS_FAIL;
   3323
   3324	seg_no = old_blk >> 9;
   3325
   3326	if (MS_TST_BAD_BLOCK_FLG(ms_card)) {
   3327		MS_CLR_BAD_BLOCK_FLG(ms_card);
   3328		ms_set_bad_block(chip, old_blk);
   3329	} else {
   3330		retval = ms_erase_block(chip, old_blk);
   3331		if (retval == STATUS_SUCCESS)
   3332			ms_set_unused_block(chip, old_blk);
   3333	}
   3334
   3335	ms_set_l2p_tbl(chip, seg_no, log_blk - ms_start_idx[seg_no], new_blk);
   3336
   3337	return STATUS_SUCCESS;
   3338}
   3339
   3340static int ms_prepare_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
   3341			    u16 log_blk, u8 start_page)
   3342{
   3343	int retval;
   3344
   3345	if (start_page) {
   3346		retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
   3347				      0, start_page);
   3348		if (retval != STATUS_SUCCESS)
   3349			return STATUS_FAIL;
   3350	}
   3351
   3352	return STATUS_SUCCESS;
   3353}
   3354
   3355#ifdef MS_DELAY_WRITE
   3356int ms_delay_write(struct rtsx_chip *chip)
   3357{
   3358	struct ms_info *ms_card = &chip->ms_card;
   3359	struct ms_delay_write_tag *delay_write = &ms_card->delay_write;
   3360	int retval;
   3361
   3362	if (delay_write->delay_write_flag) {
   3363		retval = ms_set_init_para(chip);
   3364		if (retval != STATUS_SUCCESS)
   3365			return STATUS_FAIL;
   3366
   3367		delay_write->delay_write_flag = 0;
   3368		retval = ms_finish_write(chip,
   3369					 delay_write->old_phyblock,
   3370					delay_write->new_phyblock,
   3371					delay_write->logblock,
   3372					delay_write->pageoff);
   3373		if (retval != STATUS_SUCCESS)
   3374			return STATUS_FAIL;
   3375	}
   3376
   3377	return STATUS_SUCCESS;
   3378}
   3379#endif
   3380
   3381static inline void ms_rw_fail(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   3382{
   3383	if (srb->sc_data_direction == DMA_FROM_DEVICE)
   3384		set_sense_type(chip, SCSI_LUN(srb),
   3385			       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   3386	else
   3387		set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
   3388}
   3389
   3390static int ms_rw_multi_sector(struct scsi_cmnd *srb, struct rtsx_chip *chip,
   3391			      u32 start_sector, u16 sector_cnt)
   3392{
   3393	struct ms_info *ms_card = &chip->ms_card;
   3394	unsigned int lun = SCSI_LUN(srb);
   3395	int retval, seg_no;
   3396	unsigned int index = 0, offset = 0;
   3397	u16 old_blk = 0, new_blk = 0, log_blk, total_sec_cnt = sector_cnt;
   3398	u8 start_page, end_page = 0, page_cnt;
   3399	u8 *ptr;
   3400#ifdef MS_DELAY_WRITE
   3401	struct ms_delay_write_tag *delay_write = &ms_card->delay_write;
   3402#endif
   3403
   3404	ms_set_err_code(chip, MS_NO_ERROR);
   3405
   3406	ms_card->cleanup_counter = 0;
   3407
   3408	ptr = (u8 *)scsi_sglist(srb);
   3409
   3410	retval = ms_switch_clock(chip);
   3411	if (retval != STATUS_SUCCESS) {
   3412		ms_rw_fail(srb, chip);
   3413		return STATUS_FAIL;
   3414	}
   3415
   3416	log_blk = (u16)(start_sector >> ms_card->block_shift);
   3417	start_page = (u8)(start_sector & ms_card->page_off);
   3418
   3419	for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1; seg_no++) {
   3420		if (log_blk < ms_start_idx[seg_no + 1])
   3421			break;
   3422	}
   3423
   3424	if (ms_card->segment[seg_no].build_flag == 0) {
   3425		retval = ms_build_l2p_tbl(chip, seg_no);
   3426		if (retval != STATUS_SUCCESS) {
   3427			chip->card_fail |= MS_CARD;
   3428			set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
   3429			return STATUS_FAIL;
   3430		}
   3431	}
   3432
   3433	if (srb->sc_data_direction == DMA_TO_DEVICE) {
   3434#ifdef MS_DELAY_WRITE
   3435		if (delay_write->delay_write_flag &&
   3436		    delay_write->logblock == log_blk &&
   3437		    start_page > delay_write->pageoff) {
   3438			delay_write->delay_write_flag = 0;
   3439			retval = ms_copy_page(chip,
   3440					      delay_write->old_phyblock,
   3441					      delay_write->new_phyblock,
   3442					      log_blk,
   3443					      delay_write->pageoff, start_page);
   3444			if (retval != STATUS_SUCCESS) {
   3445				set_sense_type(chip, lun,
   3446					       SENSE_TYPE_MEDIA_WRITE_ERR);
   3447				return STATUS_FAIL;
   3448			}
   3449			old_blk = delay_write->old_phyblock;
   3450			new_blk = delay_write->new_phyblock;
   3451		} else if (delay_write->delay_write_flag &&
   3452				(delay_write->logblock == log_blk) &&
   3453				(start_page == delay_write->pageoff)) {
   3454			delay_write->delay_write_flag = 0;
   3455			old_blk = delay_write->old_phyblock;
   3456			new_blk = delay_write->new_phyblock;
   3457		} else {
   3458			retval = ms_delay_write(chip);
   3459			if (retval != STATUS_SUCCESS) {
   3460				set_sense_type(chip, lun,
   3461					       SENSE_TYPE_MEDIA_WRITE_ERR);
   3462				return STATUS_FAIL;
   3463			}
   3464#endif
   3465			old_blk = ms_get_l2p_tbl
   3466					(chip, seg_no,
   3467					 log_blk - ms_start_idx[seg_no]);
   3468			new_blk  = ms_get_unused_block(chip, seg_no);
   3469			if (old_blk == 0xFFFF || new_blk == 0xFFFF) {
   3470				set_sense_type(chip, lun,
   3471					       SENSE_TYPE_MEDIA_WRITE_ERR);
   3472				return STATUS_FAIL;
   3473			}
   3474
   3475			retval = ms_prepare_write(chip, old_blk, new_blk,
   3476						  log_blk, start_page);
   3477			if (retval != STATUS_SUCCESS) {
   3478				if (detect_card_cd(chip, MS_CARD) !=
   3479				    STATUS_SUCCESS) {
   3480					set_sense_type
   3481						(chip, lun,
   3482						SENSE_TYPE_MEDIA_NOT_PRESENT);
   3483					return STATUS_FAIL;
   3484				}
   3485				set_sense_type(chip, lun,
   3486					       SENSE_TYPE_MEDIA_WRITE_ERR);
   3487				return STATUS_FAIL;
   3488			}
   3489#ifdef MS_DELAY_WRITE
   3490		}
   3491#endif
   3492	} else {
   3493#ifdef MS_DELAY_WRITE
   3494		retval = ms_delay_write(chip);
   3495		if (retval != STATUS_SUCCESS) {
   3496			if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   3497				set_sense_type(chip, lun,
   3498					       SENSE_TYPE_MEDIA_NOT_PRESENT);
   3499				return STATUS_FAIL;
   3500			}
   3501			set_sense_type(chip, lun,
   3502				       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   3503			return STATUS_FAIL;
   3504		}
   3505#endif
   3506		old_blk = ms_get_l2p_tbl(chip, seg_no,
   3507					 log_blk - ms_start_idx[seg_no]);
   3508		if (old_blk == 0xFFFF) {
   3509			set_sense_type(chip, lun,
   3510				       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   3511			return STATUS_FAIL;
   3512		}
   3513	}
   3514
   3515	dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
   3516		seg_no, old_blk, new_blk);
   3517
   3518	while (total_sec_cnt) {
   3519		if ((start_page + total_sec_cnt) > (ms_card->page_off + 1))
   3520			end_page = ms_card->page_off + 1;
   3521		else
   3522			end_page = start_page + (u8)total_sec_cnt;
   3523
   3524		page_cnt = end_page - start_page;
   3525
   3526		dev_dbg(rtsx_dev(chip), "start_page = %d, end_page = %d, page_cnt = %d\n",
   3527			start_page, end_page, page_cnt);
   3528
   3529		if (srb->sc_data_direction == DMA_FROM_DEVICE) {
   3530			retval = ms_read_multiple_pages(chip,
   3531							old_blk, log_blk,
   3532							start_page, end_page,
   3533							ptr, &index, &offset);
   3534		} else {
   3535			retval = ms_write_multiple_pages(chip, old_blk, new_blk,
   3536							 log_blk, start_page,
   3537							 end_page, ptr, &index,
   3538							 &offset);
   3539		}
   3540
   3541		if (retval != STATUS_SUCCESS) {
   3542			toggle_gpio(chip, 1);
   3543			if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
   3544				set_sense_type(chip, lun,
   3545					       SENSE_TYPE_MEDIA_NOT_PRESENT);
   3546				return STATUS_FAIL;
   3547			}
   3548			ms_rw_fail(srb, chip);
   3549			return STATUS_FAIL;
   3550		}
   3551
   3552		if (srb->sc_data_direction == DMA_TO_DEVICE) {
   3553			if (end_page == (ms_card->page_off + 1)) {
   3554				retval = ms_erase_block(chip, old_blk);
   3555				if (retval == STATUS_SUCCESS)
   3556					ms_set_unused_block(chip, old_blk);
   3557
   3558				ms_set_l2p_tbl(chip, seg_no,
   3559					       log_blk - ms_start_idx[seg_no],
   3560					       new_blk);
   3561			}
   3562		}
   3563
   3564		total_sec_cnt -= page_cnt;
   3565		if (scsi_sg_count(srb) == 0)
   3566			ptr += page_cnt * 512;
   3567
   3568		if (total_sec_cnt == 0)
   3569			break;
   3570
   3571		log_blk++;
   3572
   3573		for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1;
   3574				seg_no++) {
   3575			if (log_blk < ms_start_idx[seg_no + 1])
   3576				break;
   3577		}
   3578
   3579		if (ms_card->segment[seg_no].build_flag == 0) {
   3580			retval = ms_build_l2p_tbl(chip, seg_no);
   3581			if (retval != STATUS_SUCCESS) {
   3582				chip->card_fail |= MS_CARD;
   3583				set_sense_type(chip, lun,
   3584					       SENSE_TYPE_MEDIA_NOT_PRESENT);
   3585				return STATUS_FAIL;
   3586			}
   3587		}
   3588
   3589		old_blk = ms_get_l2p_tbl(chip, seg_no,
   3590					 log_blk - ms_start_idx[seg_no]);
   3591		if (old_blk == 0xFFFF) {
   3592			ms_rw_fail(srb, chip);
   3593			return STATUS_FAIL;
   3594		}
   3595
   3596		if (srb->sc_data_direction == DMA_TO_DEVICE) {
   3597			new_blk = ms_get_unused_block(chip, seg_no);
   3598			if (new_blk == 0xFFFF) {
   3599				ms_rw_fail(srb, chip);
   3600				return STATUS_FAIL;
   3601			}
   3602		}
   3603
   3604		dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
   3605			seg_no, old_blk, new_blk);
   3606
   3607		start_page = 0;
   3608	}
   3609
   3610	if (srb->sc_data_direction == DMA_TO_DEVICE) {
   3611		if (end_page < (ms_card->page_off + 1)) {
   3612#ifdef MS_DELAY_WRITE
   3613			delay_write->delay_write_flag = 1;
   3614			delay_write->old_phyblock = old_blk;
   3615			delay_write->new_phyblock = new_blk;
   3616			delay_write->logblock = log_blk;
   3617			delay_write->pageoff = end_page;
   3618#else
   3619			retval = ms_finish_write(chip, old_blk, new_blk,
   3620						 log_blk, end_page);
   3621			if (retval != STATUS_SUCCESS) {
   3622				if (detect_card_cd(chip, MS_CARD) !=
   3623				    STATUS_SUCCESS) {
   3624					set_sense_type
   3625						(chip, lun,
   3626						SENSE_TYPE_MEDIA_NOT_PRESENT);
   3627					return STATUS_FAIL;
   3628				}
   3629
   3630				ms_rw_fail(srb, chip);
   3631				return STATUS_FAIL;
   3632			}
   3633#endif
   3634		}
   3635	}
   3636
   3637	scsi_set_resid(srb, 0);
   3638
   3639	return STATUS_SUCCESS;
   3640}
   3641
   3642int ms_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip,
   3643	  u32 start_sector, u16 sector_cnt)
   3644{
   3645	struct ms_info *ms_card = &chip->ms_card;
   3646	int retval;
   3647
   3648	if (CHK_MSPRO(ms_card))
   3649		retval = mspro_rw_multi_sector(srb, chip, start_sector,
   3650					       sector_cnt);
   3651	else
   3652		retval = ms_rw_multi_sector(srb, chip, start_sector,
   3653					    sector_cnt);
   3654
   3655	return retval;
   3656}
   3657
   3658void ms_free_l2p_tbl(struct rtsx_chip *chip)
   3659{
   3660	struct ms_info *ms_card = &chip->ms_card;
   3661	int i = 0;
   3662
   3663	if (ms_card->segment) {
   3664		for (i = 0; i < ms_card->segment_cnt; i++) {
   3665			vfree(ms_card->segment[i].l2p_table);
   3666			ms_card->segment[i].l2p_table = NULL;
   3667			vfree(ms_card->segment[i].free_table);
   3668			ms_card->segment[i].free_table = NULL;
   3669		}
   3670		vfree(ms_card->segment);
   3671		ms_card->segment = NULL;
   3672	}
   3673}
   3674
   3675#ifdef SUPPORT_MAGIC_GATE
   3676
   3677#ifdef READ_BYTES_WAIT_INT
   3678static int ms_poll_int(struct rtsx_chip *chip)
   3679{
   3680	int retval;
   3681	u8 val;
   3682
   3683	rtsx_init_cmd(chip);
   3684
   3685	rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANS_CFG, MS_INT_CED, MS_INT_CED);
   3686
   3687	retval = rtsx_send_cmd(chip, MS_CARD, 5000);
   3688	if (retval != STATUS_SUCCESS)
   3689		return STATUS_FAIL;
   3690
   3691	val = *rtsx_get_cmd_data(chip);
   3692	if (val & MS_INT_ERR)
   3693		return STATUS_FAIL;
   3694
   3695	return STATUS_SUCCESS;
   3696}
   3697#endif
   3698
   3699#ifdef MS_SAMPLE_INT_ERR
   3700static int check_ms_err(struct rtsx_chip *chip)
   3701{
   3702	int retval;
   3703	u8 val;
   3704
   3705	retval = rtsx_read_register(chip, MS_TRANSFER, &val);
   3706	if (retval != STATUS_SUCCESS)
   3707		return 1;
   3708	if (val & MS_TRANSFER_ERR)
   3709		return 1;
   3710
   3711	retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
   3712	if (retval != STATUS_SUCCESS)
   3713		return 1;
   3714
   3715	if (val & (MS_INT_ERR | MS_INT_CMDNK))
   3716		return 1;
   3717
   3718	return 0;
   3719}
   3720#else
   3721static int check_ms_err(struct rtsx_chip *chip)
   3722{
   3723	int retval;
   3724	u8 val;
   3725
   3726	retval = rtsx_read_register(chip, MS_TRANSFER, &val);
   3727	if (retval != STATUS_SUCCESS)
   3728		return 1;
   3729	if (val & MS_TRANSFER_ERR)
   3730		return 1;
   3731
   3732	return 0;
   3733}
   3734#endif
   3735
   3736static int mg_send_ex_cmd(struct rtsx_chip *chip, u8 cmd, u8 entry_num)
   3737{
   3738	int retval, i;
   3739	u8 data[8];
   3740
   3741	data[0] = cmd;
   3742	data[1] = 0;
   3743	data[2] = 0;
   3744	data[3] = 0;
   3745	data[4] = 0;
   3746	data[5] = 0;
   3747	data[6] = entry_num;
   3748	data[7] = 0;
   3749
   3750	for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
   3751		retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7, WAIT_INT,
   3752					data, 8);
   3753		if (retval == STATUS_SUCCESS)
   3754			break;
   3755	}
   3756	if (i == MS_MAX_RETRY_COUNT)
   3757		return STATUS_FAIL;
   3758
   3759	if (check_ms_err(chip)) {
   3760		rtsx_clear_ms_error(chip);
   3761		return STATUS_FAIL;
   3762	}
   3763
   3764	return STATUS_SUCCESS;
   3765}
   3766
   3767static int mg_set_tpc_para_sub(struct rtsx_chip *chip, int type,
   3768			       u8 mg_entry_num)
   3769{
   3770	int retval;
   3771	u8 buf[6];
   3772
   3773	if (type == 0)
   3774		retval = ms_set_rw_reg_addr(chip, 0, 0, PRO_TPC_PARM, 1);
   3775	else
   3776		retval = ms_set_rw_reg_addr(chip, 0, 0, PRO_DATA_COUNT1, 6);
   3777
   3778	if (retval != STATUS_SUCCESS)
   3779		return STATUS_FAIL;
   3780
   3781	buf[0] = 0;
   3782	buf[1] = 0;
   3783	if (type == 1) {
   3784		buf[2] = 0;
   3785		buf[3] = 0;
   3786		buf[4] = 0;
   3787		buf[5] = mg_entry_num;
   3788	}
   3789	retval = ms_write_bytes(chip, PRO_WRITE_REG, (type == 0) ? 1 : 6,
   3790				NO_WAIT_INT, buf, 6);
   3791	if (retval != STATUS_SUCCESS)
   3792		return STATUS_FAIL;
   3793
   3794	return STATUS_SUCCESS;
   3795}
   3796
   3797int mg_set_leaf_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   3798{
   3799	int retval;
   3800	int i;
   3801	unsigned int lun = SCSI_LUN(srb);
   3802	u8 buf1[32], buf2[12];
   3803
   3804	if (scsi_bufflen(srb) < 12) {
   3805		set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
   3806		return STATUS_FAIL;
   3807	}
   3808
   3809	ms_cleanup_work(chip);
   3810
   3811	retval = ms_switch_clock(chip);
   3812	if (retval != STATUS_SUCCESS)
   3813		return STATUS_FAIL;
   3814
   3815	retval = mg_send_ex_cmd(chip, MG_SET_LID, 0);
   3816	if (retval != STATUS_SUCCESS) {
   3817		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   3818		return STATUS_FAIL;
   3819	}
   3820
   3821	memset(buf1, 0, 32);
   3822	rtsx_stor_get_xfer_buf(buf2, min_t(int, 12, scsi_bufflen(srb)), srb);
   3823	for (i = 0; i < 8; i++)
   3824		buf1[8 + i] = buf2[4 + i];
   3825
   3826	retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
   3827				buf1, 32);
   3828	if (retval != STATUS_SUCCESS) {
   3829		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   3830		return STATUS_FAIL;
   3831	}
   3832	if (check_ms_err(chip)) {
   3833		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   3834		rtsx_clear_ms_error(chip);
   3835		return STATUS_FAIL;
   3836	}
   3837
   3838	return STATUS_SUCCESS;
   3839}
   3840
   3841int mg_get_local_EKB(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   3842{
   3843	int retval;
   3844	int bufflen;
   3845	unsigned int lun = SCSI_LUN(srb);
   3846	u8 *buf = NULL;
   3847
   3848	ms_cleanup_work(chip);
   3849
   3850	retval = ms_switch_clock(chip);
   3851	if (retval != STATUS_SUCCESS)
   3852		return STATUS_FAIL;
   3853
   3854	buf = kmalloc(1540, GFP_KERNEL);
   3855	if (!buf)
   3856		return STATUS_ERROR;
   3857
   3858	buf[0] = 0x04;
   3859	buf[1] = 0x1A;
   3860	buf[2] = 0x00;
   3861	buf[3] = 0x00;
   3862
   3863	retval = mg_send_ex_cmd(chip, MG_GET_LEKB, 0);
   3864	if (retval != STATUS_SUCCESS) {
   3865		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3866		goto free_buffer;
   3867	}
   3868
   3869	retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
   3870				  3, WAIT_INT, 0, 0, buf + 4, 1536);
   3871	if (retval != STATUS_SUCCESS) {
   3872		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3873		rtsx_clear_ms_error(chip);
   3874		goto free_buffer;
   3875	}
   3876	if (check_ms_err(chip)) {
   3877		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3878		rtsx_clear_ms_error(chip);
   3879		retval = STATUS_FAIL;
   3880		goto free_buffer;
   3881	}
   3882
   3883	bufflen = min_t(int, 1052, scsi_bufflen(srb));
   3884	rtsx_stor_set_xfer_buf(buf, bufflen, srb);
   3885
   3886free_buffer:
   3887	kfree(buf);
   3888	return retval;
   3889}
   3890
   3891int mg_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   3892{
   3893	struct ms_info *ms_card = &chip->ms_card;
   3894	int retval;
   3895	int bufflen;
   3896	int i;
   3897	unsigned int lun = SCSI_LUN(srb);
   3898	u8 buf[32];
   3899
   3900	ms_cleanup_work(chip);
   3901
   3902	retval = ms_switch_clock(chip);
   3903	if (retval != STATUS_SUCCESS)
   3904		return STATUS_FAIL;
   3905
   3906	retval = mg_send_ex_cmd(chip, MG_GET_ID, 0);
   3907	if (retval != STATUS_SUCCESS) {
   3908		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3909		return STATUS_FAIL;
   3910	}
   3911
   3912	retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
   3913			       buf, 32);
   3914	if (retval != STATUS_SUCCESS) {
   3915		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3916		return STATUS_FAIL;
   3917	}
   3918	if (check_ms_err(chip)) {
   3919		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3920		rtsx_clear_ms_error(chip);
   3921		return STATUS_FAIL;
   3922	}
   3923
   3924	memcpy(ms_card->magic_gate_id, buf, 16);
   3925
   3926#ifdef READ_BYTES_WAIT_INT
   3927	retval = ms_poll_int(chip);
   3928	if (retval != STATUS_SUCCESS) {
   3929		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3930		return STATUS_FAIL;
   3931	}
   3932#endif
   3933
   3934	retval = mg_send_ex_cmd(chip, MG_SET_RD, 0);
   3935	if (retval != STATUS_SUCCESS) {
   3936		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3937		return STATUS_FAIL;
   3938	}
   3939
   3940	bufflen = min_t(int, 12, scsi_bufflen(srb));
   3941	rtsx_stor_get_xfer_buf(buf, bufflen, srb);
   3942
   3943	for (i = 0; i < 8; i++)
   3944		buf[i] = buf[4 + i];
   3945
   3946	for (i = 0; i < 24; i++)
   3947		buf[8 + i] = 0;
   3948
   3949	retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA,
   3950				32, WAIT_INT, buf, 32);
   3951	if (retval != STATUS_SUCCESS) {
   3952		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3953		return STATUS_FAIL;
   3954	}
   3955	if (check_ms_err(chip)) {
   3956		set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
   3957		rtsx_clear_ms_error(chip);
   3958		return STATUS_FAIL;
   3959	}
   3960
   3961	ms_card->mg_auth = 0;
   3962
   3963	return STATUS_SUCCESS;
   3964}
   3965
   3966int mg_get_rsp_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   3967{
   3968	struct ms_info *ms_card = &chip->ms_card;
   3969	int retval;
   3970	int bufflen;
   3971	unsigned int lun = SCSI_LUN(srb);
   3972	u8 buf1[32], buf2[36];
   3973
   3974	ms_cleanup_work(chip);
   3975
   3976	retval = ms_switch_clock(chip);
   3977	if (retval != STATUS_SUCCESS)
   3978		return STATUS_FAIL;
   3979
   3980	retval = mg_send_ex_cmd(chip, MG_MAKE_RMS, 0);
   3981	if (retval != STATUS_SUCCESS) {
   3982		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3983		return STATUS_FAIL;
   3984	}
   3985
   3986	retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
   3987			       buf1, 32);
   3988	if (retval != STATUS_SUCCESS) {
   3989		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3990		return STATUS_FAIL;
   3991	}
   3992	if (check_ms_err(chip)) {
   3993		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   3994		rtsx_clear_ms_error(chip);
   3995		return STATUS_FAIL;
   3996	}
   3997
   3998	buf2[0] = 0x00;
   3999	buf2[1] = 0x22;
   4000	buf2[2] = 0x00;
   4001	buf2[3] = 0x00;
   4002
   4003	memcpy(buf2 + 4, ms_card->magic_gate_id, 16);
   4004	memcpy(buf2 + 20, buf1, 16);
   4005
   4006	bufflen = min_t(int, 36, scsi_bufflen(srb));
   4007	rtsx_stor_set_xfer_buf(buf2, bufflen, srb);
   4008
   4009#ifdef READ_BYTES_WAIT_INT
   4010	retval = ms_poll_int(chip);
   4011	if (retval != STATUS_SUCCESS) {
   4012		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   4013		return STATUS_FAIL;
   4014	}
   4015#endif
   4016
   4017	return STATUS_SUCCESS;
   4018}
   4019
   4020int mg_rsp(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   4021{
   4022	struct ms_info *ms_card = &chip->ms_card;
   4023	int retval;
   4024	int i;
   4025	int bufflen;
   4026	unsigned int lun = SCSI_LUN(srb);
   4027	u8 buf[32];
   4028
   4029	ms_cleanup_work(chip);
   4030
   4031	retval = ms_switch_clock(chip);
   4032	if (retval != STATUS_SUCCESS)
   4033		return STATUS_FAIL;
   4034
   4035	retval = mg_send_ex_cmd(chip, MG_MAKE_KSE, 0);
   4036	if (retval != STATUS_SUCCESS) {
   4037		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   4038		return STATUS_FAIL;
   4039	}
   4040
   4041	bufflen = min_t(int, 12, scsi_bufflen(srb));
   4042	rtsx_stor_get_xfer_buf(buf, bufflen, srb);
   4043
   4044	for (i = 0; i < 8; i++)
   4045		buf[i] = buf[4 + i];
   4046
   4047	for (i = 0; i < 24; i++)
   4048		buf[8 + i] = 0;
   4049
   4050	retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
   4051				buf, 32);
   4052	if (retval != STATUS_SUCCESS) {
   4053		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   4054		return STATUS_FAIL;
   4055	}
   4056	if (check_ms_err(chip)) {
   4057		set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
   4058		rtsx_clear_ms_error(chip);
   4059		return STATUS_FAIL;
   4060	}
   4061
   4062	ms_card->mg_auth = 1;
   4063
   4064	return STATUS_SUCCESS;
   4065}
   4066
   4067int mg_get_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   4068{
   4069	struct ms_info *ms_card = &chip->ms_card;
   4070	int retval;
   4071	int bufflen;
   4072	unsigned int lun = SCSI_LUN(srb);
   4073	u8 *buf = NULL;
   4074
   4075	ms_cleanup_work(chip);
   4076
   4077	retval = ms_switch_clock(chip);
   4078	if (retval != STATUS_SUCCESS)
   4079		return STATUS_FAIL;
   4080
   4081	buf = kmalloc(1028, GFP_KERNEL);
   4082	if (!buf)
   4083		return STATUS_ERROR;
   4084
   4085	buf[0] = 0x04;
   4086	buf[1] = 0x02;
   4087	buf[2] = 0x00;
   4088	buf[3] = 0x00;
   4089
   4090	retval = mg_send_ex_cmd(chip, MG_GET_IBD, ms_card->mg_entry_num);
   4091	if (retval != STATUS_SUCCESS) {
   4092		set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   4093		goto free_buffer;
   4094	}
   4095
   4096	retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
   4097				  2, WAIT_INT, 0, 0, buf + 4, 1024);
   4098	if (retval != STATUS_SUCCESS) {
   4099		set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   4100		rtsx_clear_ms_error(chip);
   4101		goto free_buffer;
   4102	}
   4103	if (check_ms_err(chip)) {
   4104		set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
   4105		rtsx_clear_ms_error(chip);
   4106		retval = STATUS_FAIL;
   4107		goto free_buffer;
   4108	}
   4109
   4110	bufflen = min_t(int, 1028, scsi_bufflen(srb));
   4111	rtsx_stor_set_xfer_buf(buf, bufflen, srb);
   4112
   4113free_buffer:
   4114	kfree(buf);
   4115	return retval;
   4116}
   4117
   4118int mg_set_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
   4119{
   4120	struct ms_info *ms_card = &chip->ms_card;
   4121	int retval;
   4122	int bufflen;
   4123#ifdef MG_SET_ICV_SLOW
   4124	int i;
   4125#endif
   4126	unsigned int lun = SCSI_LUN(srb);
   4127	u8 *buf = NULL;
   4128
   4129	ms_cleanup_work(chip);
   4130
   4131	retval = ms_switch_clock(chip);
   4132	if (retval != STATUS_SUCCESS)
   4133		return STATUS_FAIL;
   4134
   4135	buf = kmalloc(1028, GFP_KERNEL);
   4136	if (!buf)
   4137		return STATUS_ERROR;
   4138
   4139	bufflen = min_t(int, 1028, scsi_bufflen(srb));
   4140	rtsx_stor_get_xfer_buf(buf, bufflen, srb);
   4141
   4142	retval = mg_send_ex_cmd(chip, MG_SET_IBD, ms_card->mg_entry_num);
   4143	if (retval != STATUS_SUCCESS) {
   4144		if (ms_card->mg_auth == 0) {
   4145			if ((buf[5] & 0xC0) != 0)
   4146				set_sense_type
   4147					(chip, lun,
   4148					SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   4149			else
   4150				set_sense_type(chip, lun,
   4151					       SENSE_TYPE_MG_WRITE_ERR);
   4152		} else {
   4153			set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
   4154		}
   4155		goto set_ICV_finish;
   4156	}
   4157
   4158#ifdef MG_SET_ICV_SLOW
   4159	for (i = 0; i < 2; i++) {
   4160		udelay(50);
   4161
   4162		rtsx_init_cmd(chip);
   4163
   4164		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
   4165			     0xFF, PRO_WRITE_LONG_DATA);
   4166		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, WAIT_INT);
   4167		rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
   4168			     0x01, RING_BUFFER);
   4169
   4170		trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
   4171
   4172		rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
   4173			     MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
   4174		rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
   4175			     MS_TRANSFER_END, MS_TRANSFER_END);
   4176
   4177		rtsx_send_cmd_no_wait(chip);
   4178
   4179		retval = rtsx_transfer_data(chip, MS_CARD, buf + 4 + i * 512,
   4180					    512, 0, DMA_TO_DEVICE, 3000);
   4181		if (retval < 0 || check_ms_err(chip)) {
   4182			rtsx_clear_ms_error(chip);
   4183			if (ms_card->mg_auth == 0) {
   4184				if ((buf[5] & 0xC0) != 0)
   4185					set_sense_type
   4186					    (chip, lun,
   4187					     SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   4188				else
   4189					set_sense_type(chip, lun,
   4190						       SENSE_TYPE_MG_WRITE_ERR);
   4191			} else {
   4192				set_sense_type(chip, lun,
   4193					       SENSE_TYPE_MG_WRITE_ERR);
   4194			}
   4195			retval = STATUS_FAIL;
   4196			goto set_ICV_finish;
   4197		}
   4198	}
   4199#else
   4200	retval = ms_transfer_data(chip, MS_TM_AUTO_WRITE, PRO_WRITE_LONG_DATA,
   4201				  2, WAIT_INT, 0, 0, buf + 4, 1024);
   4202	if (retval != STATUS_SUCCESS || check_ms_err(chip)) {
   4203		rtsx_clear_ms_error(chip);
   4204		if (ms_card->mg_auth == 0) {
   4205			if ((buf[5] & 0xC0) != 0)
   4206				set_sense_type
   4207				    (chip, lun,
   4208				     SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
   4209			else
   4210				set_sense_type(chip, lun,
   4211					       SENSE_TYPE_MG_WRITE_ERR);
   4212		} else {
   4213			set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
   4214		}
   4215		goto set_ICV_finish;
   4216	}
   4217#endif
   4218
   4219set_ICV_finish:
   4220	kfree(buf);
   4221	return retval;
   4222}
   4223
   4224#endif /* SUPPORT_MAGIC_GATE */
   4225
   4226void ms_cleanup_work(struct rtsx_chip *chip)
   4227{
   4228	struct ms_info *ms_card = &chip->ms_card;
   4229
   4230	if (CHK_MSPRO(ms_card)) {
   4231		if (ms_card->seq_mode) {
   4232			dev_dbg(rtsx_dev(chip), "MS Pro: stop transmission\n");
   4233			mspro_stop_seq_mode(chip);
   4234			ms_card->cleanup_counter = 0;
   4235		}
   4236		if (CHK_MSHG(ms_card)) {
   4237			rtsx_write_register(chip, MS_CFG,
   4238					    MS_2K_SECTOR_MODE, 0x00);
   4239		}
   4240	}
   4241#ifdef MS_DELAY_WRITE
   4242	else if ((!CHK_MSPRO(ms_card)) &&
   4243		 ms_card->delay_write.delay_write_flag) {
   4244		dev_dbg(rtsx_dev(chip), "MS: delay write\n");
   4245		ms_delay_write(chip);
   4246		ms_card->cleanup_counter = 0;
   4247	}
   4248#endif
   4249}
   4250
   4251int ms_power_off_card3v3(struct rtsx_chip *chip)
   4252{
   4253	int retval;
   4254
   4255	retval = disable_card_clock(chip, MS_CARD);
   4256	if (retval != STATUS_SUCCESS)
   4257		return STATUS_FAIL;
   4258
   4259	if (chip->asic_code) {
   4260		retval = ms_pull_ctl_disable(chip);
   4261		if (retval != STATUS_SUCCESS)
   4262			return STATUS_FAIL;
   4263	} else {
   4264		retval = rtsx_write_register(chip, FPGA_PULL_CTL,
   4265					     FPGA_MS_PULL_CTL_BIT | 0x20,
   4266					     FPGA_MS_PULL_CTL_BIT);
   4267		if (retval)
   4268			return retval;
   4269	}
   4270	retval = rtsx_write_register(chip, CARD_OE, MS_OUTPUT_EN, 0);
   4271	if (retval)
   4272		return retval;
   4273
   4274	if (!chip->ft2_fast_mode) {
   4275		retval = card_power_off(chip, MS_CARD);
   4276		if (retval != STATUS_SUCCESS)
   4277			return STATUS_FAIL;
   4278	}
   4279
   4280	return STATUS_SUCCESS;
   4281}
   4282
   4283int release_ms_card(struct rtsx_chip *chip)
   4284{
   4285	struct ms_info *ms_card = &chip->ms_card;
   4286	int retval;
   4287
   4288#ifdef MS_DELAY_WRITE
   4289	ms_card->delay_write.delay_write_flag = 0;
   4290#endif
   4291	ms_card->pro_under_formatting = 0;
   4292
   4293	chip->card_ready &= ~MS_CARD;
   4294	chip->card_fail &= ~MS_CARD;
   4295	chip->card_wp &= ~MS_CARD;
   4296
   4297	ms_free_l2p_tbl(chip);
   4298
   4299	memset(ms_card->raw_sys_info, 0, 96);
   4300#ifdef SUPPORT_PCGL_1P18
   4301	memset(ms_card->raw_model_name, 0, 48);
   4302#endif
   4303
   4304	retval = ms_power_off_card3v3(chip);
   4305	if (retval != STATUS_SUCCESS)
   4306		return STATUS_FAIL;
   4307
   4308	return STATUS_SUCCESS;
   4309}