linux/drivers/staging/rts5208/ms.c
<<
>>
Prefs
   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_StatusReg, 6, SystemParm, 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_DataCount1, 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_IntReg, 2, Pro_SystemParm, 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, StatusReg0, 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, OverwriteFlag, MS_EXTRA_SIZE,
1259                                    SystemParm, 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, OverwriteFlag,
1311                                                    MS_EXTRA_SIZE, SystemParm,
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, OverwriteFlag, MS_EXTRA_SIZE,
1343                                    SystemParm, 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, OverwriteFlag, MS_EXTRA_SIZE,
1396                                    SystemParm, 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, OverwriteFlag, MS_EXTRA_SIZE,
1469                                    SystemParm, 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, OverwriteFlag, MS_EXTRA_SIZE,
1523                                    SystemParm, 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 == setPS_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, OverwriteFlag,
1674                                            MS_EXTRA_SIZE, SystemParm, 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, setPS_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, setPS_Error,
1742                                                           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(
1753                                                chip,
1754                                                MS_TM_NORMAL_WRITE,
1755                                                WRITE_PAGE_DATA,
1756                                                0, NO_WAIT_INT);
1757                                        if (retval == STATUS_SUCCESS)
1758                                                break;
1759                                }
1760                                if (rty_cnt == MS_MAX_RETRY_COUNT)
1761                                        return STATUS_FAIL;
1762                        }
1763
1764                        if (!(val & INT_REG_BREQ)) {
1765                                ms_set_err_code(chip, MS_BREQ_ERROR);
1766                                return STATUS_FAIL;
1767                        }
1768                }
1769
1770                retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1771                                            SystemParm, (6 + MS_EXTRA_SIZE));
1772
1773                ms_set_err_code(chip, MS_NO_ERROR);
1774
1775                if (CHK_MS4BIT(ms_card))
1776                        data[0] = 0x88;
1777                else
1778                        data[0] = 0x80;
1779
1780                data[1] = 0;
1781                data[2] = (u8)(new_blk >> 8);
1782                data[3] = (u8)new_blk;
1783                data[4] = 0x20;
1784                data[5] = i;
1785
1786                if ((extra[0] & 0x60) != 0x60)
1787                        data[6] = extra[0];
1788                else
1789                        data[6] = 0xF8;
1790
1791                data[6 + 1] = 0xFF;
1792                data[6 + 2] = (u8)(log_blk >> 8);
1793                data[6 + 3] = (u8)log_blk;
1794
1795                for (j = 4; j <= MS_EXTRA_SIZE; j++)
1796                        data[6 + j] = 0xFF;
1797
1798                retval = ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
1799                                        NO_WAIT_INT, data, 16);
1800                if (retval != STATUS_SUCCESS)
1801                        return STATUS_FAIL;
1802
1803                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
1804                if (retval != STATUS_SUCCESS)
1805                        return STATUS_FAIL;
1806
1807                ms_set_err_code(chip, MS_NO_ERROR);
1808                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1809                if (retval != STATUS_SUCCESS)
1810                        return STATUS_FAIL;
1811
1812                if (val & INT_REG_CMDNK) {
1813                        ms_set_err_code(chip, MS_CMD_NK);
1814                        return STATUS_FAIL;
1815                }
1816
1817                if (val & INT_REG_CED) {
1818                        if (val & INT_REG_ERR) {
1819                                ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
1820                                return STATUS_FAIL;
1821                        }
1822                }
1823
1824                if (i == 0) {
1825                        retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
1826                                                    MS_EXTRA_SIZE, SystemParm,
1827                                                    7);
1828                        if (retval != STATUS_SUCCESS)
1829                                return STATUS_FAIL;
1830
1831                        ms_set_err_code(chip, MS_NO_ERROR);
1832
1833                        if (CHK_MS4BIT(ms_card))
1834                                data[0] = 0x88;
1835                        else
1836                                data[0] = 0x80;
1837
1838                        data[1] = 0;
1839                        data[2] = (u8)(old_blk >> 8);
1840                        data[3] = (u8)old_blk;
1841                        data[4] = 0x80;
1842                        data[5] = 0;
1843                        data[6] = 0xEF;
1844                        data[7] = 0xFF;
1845
1846                        retval = ms_write_bytes(chip, WRITE_REG, 7,
1847                                                NO_WAIT_INT, data, 8);
1848                        if (retval != STATUS_SUCCESS)
1849                                return STATUS_FAIL;
1850
1851                        retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
1852                        if (retval != STATUS_SUCCESS)
1853                                return STATUS_FAIL;
1854
1855                        ms_set_err_code(chip, MS_NO_ERROR);
1856                        retval = ms_read_bytes(chip, GET_INT, 1,
1857                                               NO_WAIT_INT, &val, 1);
1858                        if (retval != STATUS_SUCCESS)
1859                                return STATUS_FAIL;
1860
1861                        if (val & INT_REG_CMDNK) {
1862                                ms_set_err_code(chip, MS_CMD_NK);
1863                                return STATUS_FAIL;
1864                        }
1865
1866                        if (val & INT_REG_CED) {
1867                                if (val & INT_REG_ERR) {
1868                                        ms_set_err_code(chip,
1869                                                        MS_FLASH_WRITE_ERROR);
1870                                        return STATUS_FAIL;
1871                                }
1872                        }
1873                }
1874        }
1875
1876        return STATUS_SUCCESS;
1877}
1878
1879static int reset_ms(struct rtsx_chip *chip)
1880{
1881        struct ms_info *ms_card = &chip->ms_card;
1882        int retval;
1883        u16 i, reg_addr, block_size;
1884        u8 val, extra[MS_EXTRA_SIZE], j, *ptr;
1885#ifndef SUPPORT_MAGIC_GATE
1886        u16 eblock_cnt;
1887#endif
1888
1889        retval = ms_prepare_reset(chip);
1890        if (retval != STATUS_SUCCESS)
1891                return STATUS_FAIL;
1892
1893        ms_card->ms_type |= TYPE_MS;
1894
1895        retval = ms_send_cmd(chip, MS_RESET, NO_WAIT_INT);
1896        if (retval != STATUS_SUCCESS)
1897                return STATUS_FAIL;
1898
1899        retval = ms_read_status_reg(chip);
1900        if (retval != STATUS_SUCCESS)
1901                return STATUS_FAIL;
1902
1903        retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
1904        if (retval)
1905                return retval;
1906
1907        if (val & WRT_PRTCT)
1908                chip->card_wp |= MS_CARD;
1909        else
1910                chip->card_wp &= ~MS_CARD;
1911
1912        i = 0;
1913
1914RE_SEARCH:
1915        /* Search Boot Block */
1916        while (i < (MAX_DEFECTIVE_BLOCK + 2)) {
1917                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
1918                        ms_set_err_code(chip, MS_NO_CARD);
1919                        return STATUS_FAIL;
1920                }
1921
1922                retval = ms_read_extra_data(chip, i, 0, extra, MS_EXTRA_SIZE);
1923                if (retval != STATUS_SUCCESS) {
1924                        i++;
1925                        continue;
1926                }
1927
1928                if (extra[0] & BLOCK_OK) {
1929                        if (!(extra[1] & NOT_BOOT_BLOCK)) {
1930                                ms_card->boot_block = i;
1931                                break;
1932                        }
1933                }
1934                i++;
1935        }
1936
1937        if (i == (MAX_DEFECTIVE_BLOCK + 2)) {
1938                dev_dbg(rtsx_dev(chip), "No boot block found!");
1939                return STATUS_FAIL;
1940        }
1941
1942        for (j = 0; j < 3; j++) {
1943                retval = ms_read_page(chip, ms_card->boot_block, j);
1944                if (retval != STATUS_SUCCESS) {
1945                        if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR)) {
1946                                i = ms_card->boot_block + 1;
1947                                ms_set_err_code(chip, MS_NO_ERROR);
1948                                goto RE_SEARCH;
1949                        }
1950                }
1951        }
1952
1953        retval = ms_read_page(chip, ms_card->boot_block, 0);
1954        if (retval != STATUS_SUCCESS)
1955                return STATUS_FAIL;
1956
1957        /* Read MS system information as sys_info */
1958        rtsx_init_cmd(chip);
1959
1960        for (i = 0; i < 96; i++)
1961                rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 0x1A0 + i, 0, 0);
1962
1963        retval = rtsx_send_cmd(chip, MS_CARD, 100);
1964        if (retval < 0)
1965                return STATUS_FAIL;
1966
1967        ptr = rtsx_get_cmd_data(chip);
1968        memcpy(ms_card->raw_sys_info, ptr, 96);
1969
1970        /* Read useful block contents */
1971        rtsx_init_cmd(chip);
1972
1973        rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID0, 0, 0);
1974        rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID1, 0, 0);
1975
1976        for (reg_addr = DISABLED_BLOCK0; reg_addr <= DISABLED_BLOCK3;
1977             reg_addr++)
1978                rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
1979
1980        for (reg_addr = BLOCK_SIZE_0; reg_addr <= PAGE_SIZE_1; reg_addr++)
1981                rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
1982
1983        rtsx_add_cmd(chip, READ_REG_CMD, MS_Device_Type, 0, 0);
1984        rtsx_add_cmd(chip, READ_REG_CMD, MS_4bit_Support, 0, 0);
1985
1986        retval = rtsx_send_cmd(chip, MS_CARD, 100);
1987        if (retval < 0)
1988                return STATUS_FAIL;
1989
1990        ptr = rtsx_get_cmd_data(chip);
1991
1992        dev_dbg(rtsx_dev(chip), "Boot block data:\n");
1993        dev_dbg(rtsx_dev(chip), "%*ph\n", 16, ptr);
1994
1995        /* Block ID error
1996         * HEADER_ID0, HEADER_ID1
1997         */
1998        if (ptr[0] != 0x00 || ptr[1] != 0x01) {
1999                i = ms_card->boot_block + 1;
2000                goto RE_SEARCH;
2001        }
2002
2003        /* Page size error
2004         * PAGE_SIZE_0, PAGE_SIZE_1
2005         */
2006        if (ptr[12] != 0x02 || ptr[13] != 0x00) {
2007                i = ms_card->boot_block + 1;
2008                goto RE_SEARCH;
2009        }
2010
2011        if ((ptr[14] == 1) || (ptr[14] == 3))
2012                chip->card_wp |= MS_CARD;
2013
2014        /* BLOCK_SIZE_0, BLOCK_SIZE_1 */
2015        block_size = ((u16)ptr[6] << 8) | ptr[7];
2016        if (block_size == 0x0010) {
2017                /* Block size 16KB */
2018                ms_card->block_shift = 5;
2019                ms_card->page_off = 0x1F;
2020        } else if (block_size == 0x0008) {
2021                /* Block size 8KB */
2022                ms_card->block_shift = 4;
2023                ms_card->page_off = 0x0F;
2024        }
2025
2026        /* BLOCK_COUNT_0, BLOCK_COUNT_1 */
2027        ms_card->total_block = ((u16)ptr[8] << 8) | ptr[9];
2028
2029#ifdef SUPPORT_MAGIC_GATE
2030        j = ptr[10];
2031
2032        if (ms_card->block_shift == 4)  { /* 4MB or 8MB */
2033                if (j < 2)  { /* Effective block for 4MB: 0x1F0 */
2034                        ms_card->capacity = 0x1EE0;
2035                } else { /* Effective block for 8MB: 0x3E0 */
2036                        ms_card->capacity = 0x3DE0;
2037                }
2038        } else  { /* 16MB, 32MB, 64MB or 128MB */
2039                if (j < 5)  { /* Effective block for 16MB: 0x3E0 */
2040                        ms_card->capacity = 0x7BC0;
2041                } else if (j < 0xA) { /* Effective block for 32MB: 0x7C0 */
2042                        ms_card->capacity = 0xF7C0;
2043                } else if (j < 0x11) { /* Effective block for 64MB: 0xF80 */
2044                        ms_card->capacity = 0x1EF80;
2045                } else { /* Effective block for 128MB: 0x1F00 */
2046                        ms_card->capacity = 0x3DF00;
2047                }
2048        }
2049#else
2050        /* EBLOCK_COUNT_0, EBLOCK_COUNT_1 */
2051        eblock_cnt = ((u16)ptr[10] << 8) | ptr[11];
2052
2053        ms_card->capacity = ((u32)eblock_cnt - 2) << ms_card->block_shift;
2054#endif
2055
2056        chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;
2057
2058        /* Switch I/F Mode */
2059        if (ptr[15]) {
2060                retval = ms_set_rw_reg_addr(chip, 0, 0, SystemParm, 1);
2061                if (retval != STATUS_SUCCESS)
2062                        return STATUS_FAIL;
2063
2064                retval = rtsx_write_register(chip, PPBUF_BASE2, 0xFF, 0x88);
2065                if (retval)
2066                        return retval;
2067
2068                retval = rtsx_write_register(chip, PPBUF_BASE2 + 1, 0xFF, 0);
2069                if (retval)
2070                        return retval;
2071
2072                retval = ms_transfer_tpc(chip, MS_TM_WRITE_BYTES, WRITE_REG, 1,
2073                                         NO_WAIT_INT);
2074                if (retval != STATUS_SUCCESS)
2075                        return STATUS_FAIL;
2076
2077                retval = rtsx_write_register(chip, MS_CFG,
2078                                             0x58 | MS_NO_CHECK_INT,
2079                                             MS_BUS_WIDTH_4 |
2080                                             PUSH_TIME_ODD |
2081                                             MS_NO_CHECK_INT);
2082                if (retval)
2083                        return retval;
2084
2085                ms_card->ms_type |= MS_4BIT;
2086        }
2087
2088        if (CHK_MS4BIT(ms_card))
2089                chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
2090        else
2091                chip->card_bus_width[chip->card2lun[MS_CARD]] = 1;
2092
2093        return STATUS_SUCCESS;
2094}
2095
2096static int ms_init_l2p_tbl(struct rtsx_chip *chip)
2097{
2098        struct ms_info *ms_card = &chip->ms_card;
2099        int size, i, seg_no, retval;
2100        u16 defect_block, reg_addr;
2101        u8 val1, val2;
2102
2103        ms_card->segment_cnt = ms_card->total_block >> 9;
2104        dev_dbg(rtsx_dev(chip), "ms_card->segment_cnt = %d\n",
2105                ms_card->segment_cnt);
2106
2107        size = ms_card->segment_cnt * sizeof(struct zone_entry);
2108        ms_card->segment = vzalloc(size);
2109        if (!ms_card->segment)
2110                return STATUS_FAIL;
2111
2112        retval = ms_read_page(chip, ms_card->boot_block, 1);
2113        if (retval != STATUS_SUCCESS)
2114                goto INIT_FAIL;
2115
2116        reg_addr = PPBUF_BASE2;
2117        for (i = 0; i < (((ms_card->total_block >> 9) * 10) + 1); i++) {
2118                int block_no;
2119
2120                retval = rtsx_read_register(chip, reg_addr++, &val1);
2121                if (retval != STATUS_SUCCESS)
2122                        goto INIT_FAIL;
2123
2124                retval = rtsx_read_register(chip, reg_addr++, &val2);
2125                if (retval != STATUS_SUCCESS)
2126                        goto INIT_FAIL;
2127
2128                defect_block = ((u16)val1 << 8) | val2;
2129                if (defect_block == 0xFFFF)
2130                        break;
2131
2132                seg_no = defect_block / 512;
2133
2134                block_no = ms_card->segment[seg_no].disable_count++;
2135                ms_card->segment[seg_no].defect_list[block_no] = defect_block;
2136        }
2137
2138        for (i = 0; i < ms_card->segment_cnt; i++) {
2139                ms_card->segment[i].build_flag = 0;
2140                ms_card->segment[i].l2p_table = NULL;
2141                ms_card->segment[i].free_table = NULL;
2142                ms_card->segment[i].get_index = 0;
2143                ms_card->segment[i].set_index = 0;
2144                ms_card->segment[i].unused_blk_cnt = 0;
2145
2146                dev_dbg(rtsx_dev(chip), "defective block count of segment %d is %d\n",
2147                        i, ms_card->segment[i].disable_count);
2148        }
2149
2150        return STATUS_SUCCESS;
2151
2152INIT_FAIL:
2153        vfree(ms_card->segment);
2154        ms_card->segment = NULL;
2155
2156        return STATUS_FAIL;
2157}
2158
2159static u16 ms_get_l2p_tbl(struct rtsx_chip *chip, int seg_no, u16 log_off)
2160{
2161        struct ms_info *ms_card = &chip->ms_card;
2162        struct zone_entry *segment;
2163
2164        if (!ms_card->segment)
2165                return 0xFFFF;
2166
2167        segment = &ms_card->segment[seg_no];
2168
2169        if (segment->l2p_table)
2170                return segment->l2p_table[log_off];
2171
2172        return 0xFFFF;
2173}
2174
2175static void ms_set_l2p_tbl(struct rtsx_chip *chip,
2176                           int seg_no, u16 log_off, u16 phy_blk)
2177{
2178        struct ms_info *ms_card = &chip->ms_card;
2179        struct zone_entry *segment;
2180
2181        if (!ms_card->segment)
2182                return;
2183
2184        segment = &ms_card->segment[seg_no];
2185        if (segment->l2p_table)
2186                segment->l2p_table[log_off] = phy_blk;
2187}
2188
2189static void ms_set_unused_block(struct rtsx_chip *chip, u16 phy_blk)
2190{
2191        struct ms_info *ms_card = &chip->ms_card;
2192        struct zone_entry *segment;
2193        int seg_no;
2194
2195        seg_no = (int)phy_blk >> 9;
2196        segment = &ms_card->segment[seg_no];
2197
2198        segment->free_table[segment->set_index++] = phy_blk;
2199        if (segment->set_index >= MS_FREE_TABLE_CNT)
2200                segment->set_index = 0;
2201
2202        segment->unused_blk_cnt++;
2203}
2204
2205static u16 ms_get_unused_block(struct rtsx_chip *chip, int seg_no)
2206{
2207        struct ms_info *ms_card = &chip->ms_card;
2208        struct zone_entry *segment;
2209        u16 phy_blk;
2210
2211        segment = &ms_card->segment[seg_no];
2212
2213        if (segment->unused_blk_cnt <= 0)
2214                return 0xFFFF;
2215
2216        phy_blk = segment->free_table[segment->get_index];
2217        segment->free_table[segment->get_index++] = 0xFFFF;
2218        if (segment->get_index >= MS_FREE_TABLE_CNT)
2219                segment->get_index = 0;
2220
2221        segment->unused_blk_cnt--;
2222
2223        return phy_blk;
2224}
2225
2226static const unsigned short ms_start_idx[] = {0, 494, 990, 1486, 1982, 2478,
2227                                              2974, 3470, 3966, 4462, 4958,
2228                                              5454, 5950, 6446, 6942, 7438,
2229                                              7934};
2230
2231static int ms_arbitrate_l2p(struct rtsx_chip *chip, u16 phy_blk,
2232                            u16 log_off, u8 us1, u8 us2)
2233{
2234        struct ms_info *ms_card = &chip->ms_card;
2235        struct zone_entry *segment;
2236        int seg_no;
2237        u16 tmp_blk;
2238
2239        seg_no = (int)phy_blk >> 9;
2240        segment = &ms_card->segment[seg_no];
2241        tmp_blk = segment->l2p_table[log_off];
2242
2243        if (us1 != us2) {
2244                if (us1 == 0) {
2245                        if (!(chip->card_wp & MS_CARD))
2246                                ms_erase_block(chip, tmp_blk);
2247
2248                        ms_set_unused_block(chip, tmp_blk);
2249                        segment->l2p_table[log_off] = phy_blk;
2250                } else {
2251                        if (!(chip->card_wp & MS_CARD))
2252                                ms_erase_block(chip, phy_blk);
2253
2254                        ms_set_unused_block(chip, phy_blk);
2255                }
2256        } else {
2257                if (phy_blk < tmp_blk) {
2258                        if (!(chip->card_wp & MS_CARD))
2259                                ms_erase_block(chip, phy_blk);
2260
2261                        ms_set_unused_block(chip, phy_blk);
2262                } else {
2263                        if (!(chip->card_wp & MS_CARD))
2264                                ms_erase_block(chip, tmp_blk);
2265
2266                        ms_set_unused_block(chip, tmp_blk);
2267                        segment->l2p_table[log_off] = phy_blk;
2268                }
2269        }
2270
2271        return STATUS_SUCCESS;
2272}
2273
2274static int ms_build_l2p_tbl(struct rtsx_chip *chip, int seg_no)
2275{
2276        struct ms_info *ms_card = &chip->ms_card;
2277        struct zone_entry *segment;
2278        bool defect_flag;
2279        int retval, table_size, disable_cnt, i;
2280        u16 start, end, phy_blk, log_blk, tmp_blk, idx;
2281        u8 extra[MS_EXTRA_SIZE], us1, us2;
2282
2283        dev_dbg(rtsx_dev(chip), "%s: %d\n", __func__, seg_no);
2284
2285        if (!ms_card->segment) {
2286                retval = ms_init_l2p_tbl(chip);
2287                if (retval != STATUS_SUCCESS)
2288                        return retval;
2289        }
2290
2291        if (ms_card->segment[seg_no].build_flag) {
2292                dev_dbg(rtsx_dev(chip), "l2p table of segment %d has been built\n",
2293                        seg_no);
2294                return STATUS_SUCCESS;
2295        }
2296
2297        if (seg_no == 0)
2298                table_size = 494;
2299        else
2300                table_size = 496;
2301
2302        segment = &ms_card->segment[seg_no];
2303
2304        if (!segment->l2p_table) {
2305                segment->l2p_table = vmalloc(array_size(table_size, 2));
2306                if (!segment->l2p_table)
2307                        goto BUILD_FAIL;
2308        }
2309        memset((u8 *)(segment->l2p_table), 0xff, table_size * 2);
2310
2311        if (!segment->free_table) {
2312                segment->free_table = vmalloc(MS_FREE_TABLE_CNT * 2);
2313                if (!segment->free_table)
2314                        goto BUILD_FAIL;
2315        }
2316        memset((u8 *)(segment->free_table), 0xff, MS_FREE_TABLE_CNT * 2);
2317
2318        start = (u16)seg_no << 9;
2319        end = (u16)(seg_no + 1) << 9;
2320
2321        disable_cnt = segment->disable_count;
2322
2323        segment->get_index = 0;
2324        segment->set_index = 0;
2325        segment->unused_blk_cnt = 0;
2326
2327        for (phy_blk = start; phy_blk < end; phy_blk++) {
2328                if (disable_cnt) {
2329                        defect_flag = false;
2330                        for (i = 0; i < segment->disable_count; i++) {
2331                                if (phy_blk == segment->defect_list[i]) {
2332                                        defect_flag = true;
2333                                        break;
2334                                }
2335                        }
2336                        if (defect_flag) {
2337                                disable_cnt--;
2338                                continue;
2339                        }
2340                }
2341
2342                retval = ms_read_extra_data(chip, phy_blk, 0,
2343                                            extra, MS_EXTRA_SIZE);
2344                if (retval != STATUS_SUCCESS) {
2345                        dev_dbg(rtsx_dev(chip), "read extra data fail\n");
2346                        ms_set_bad_block(chip, phy_blk);
2347                        continue;
2348                }
2349
2350                if (seg_no == ms_card->segment_cnt - 1) {
2351                        if (!(extra[1] & NOT_TRANSLATION_TABLE)) {
2352                                if (!(chip->card_wp & MS_CARD)) {
2353                                        retval = ms_erase_block(chip, phy_blk);
2354                                        if (retval != STATUS_SUCCESS)
2355                                                continue;
2356                                        extra[2] = 0xff;
2357                                        extra[3] = 0xff;
2358                                }
2359                        }
2360                }
2361
2362                if (!(extra[0] & BLOCK_OK))
2363                        continue;
2364                if (!(extra[1] & NOT_BOOT_BLOCK))
2365                        continue;
2366                if ((extra[0] & PAGE_OK) != PAGE_OK)
2367                        continue;
2368
2369                log_blk = ((u16)extra[2] << 8) | extra[3];
2370
2371                if (log_blk == 0xFFFF) {
2372                        if (!(chip->card_wp & MS_CARD)) {
2373                                retval = ms_erase_block(chip, phy_blk);
2374                                if (retval != STATUS_SUCCESS)
2375                                        continue;
2376                        }
2377                        ms_set_unused_block(chip, phy_blk);
2378                        continue;
2379                }
2380
2381                if ((log_blk < ms_start_idx[seg_no]) ||
2382                    (log_blk >= ms_start_idx[seg_no + 1])) {
2383                        if (!(chip->card_wp & MS_CARD)) {
2384                                retval = ms_erase_block(chip, phy_blk);
2385                                if (retval != STATUS_SUCCESS)
2386                                        continue;
2387                        }
2388                        ms_set_unused_block(chip, phy_blk);
2389                        continue;
2390                }
2391
2392                idx = log_blk - ms_start_idx[seg_no];
2393
2394                if (segment->l2p_table[idx] == 0xFFFF) {
2395                        segment->l2p_table[idx] = phy_blk;
2396                        continue;
2397                }
2398
2399                us1 = extra[0] & 0x10;
2400                tmp_blk = segment->l2p_table[idx];
2401                retval = ms_read_extra_data(chip, tmp_blk, 0,
2402                                            extra, MS_EXTRA_SIZE);
2403                if (retval != STATUS_SUCCESS)
2404                        continue;
2405                us2 = extra[0] & 0x10;
2406
2407                (void)ms_arbitrate_l2p(chip, phy_blk,
2408                                log_blk - ms_start_idx[seg_no], us1, us2);
2409                continue;
2410        }
2411
2412        segment->build_flag = 1;
2413
2414        dev_dbg(rtsx_dev(chip), "unused block count: %d\n",
2415                segment->unused_blk_cnt);
2416
2417        /* Logical Address Confirmation Process */
2418        if (seg_no == ms_card->segment_cnt - 1) {
2419                if (segment->unused_blk_cnt < 2)
2420                        chip->card_wp |= MS_CARD;
2421        } else {
2422                if (segment->unused_blk_cnt < 1)
2423                        chip->card_wp |= MS_CARD;
2424        }
2425
2426        if (chip->card_wp & MS_CARD)
2427                return STATUS_SUCCESS;
2428
2429        for (log_blk = ms_start_idx[seg_no];
2430             log_blk < ms_start_idx[seg_no + 1]; log_blk++) {
2431                idx = log_blk - ms_start_idx[seg_no];
2432                if (segment->l2p_table[idx] == 0xFFFF) {
2433                        phy_blk = ms_get_unused_block(chip, seg_no);
2434                        if (phy_blk == 0xFFFF) {
2435                                chip->card_wp |= MS_CARD;
2436                                return STATUS_SUCCESS;
2437                        }
2438                        retval = ms_init_page(chip, phy_blk, log_blk, 0, 1);
2439                        if (retval != STATUS_SUCCESS)
2440                                goto BUILD_FAIL;
2441
2442                        segment->l2p_table[idx] = phy_blk;
2443                        if (seg_no == ms_card->segment_cnt - 1) {
2444                                if (segment->unused_blk_cnt < 2) {
2445                                        chip->card_wp |= MS_CARD;
2446                                        return STATUS_SUCCESS;
2447                                }
2448                        } else {
2449                                if (segment->unused_blk_cnt < 1) {
2450                                        chip->card_wp |= MS_CARD;
2451                                        return STATUS_SUCCESS;
2452                                }
2453                        }
2454                }
2455        }
2456
2457        /* Make boot block be the first normal block */
2458        if (seg_no == 0) {
2459                for (log_blk = 0; log_blk < 494; log_blk++) {
2460                        tmp_blk = segment->l2p_table[log_blk];
2461                        if (tmp_blk < ms_card->boot_block) {
2462                                dev_dbg(rtsx_dev(chip), "Boot block is not the first normal block.\n");
2463
2464                                if (chip->card_wp & MS_CARD)
2465                                        break;
2466
2467                                phy_blk = ms_get_unused_block(chip, 0);
2468                                retval = ms_copy_page(chip, tmp_blk, phy_blk,
2469                                                      log_blk, 0,
2470                                                      ms_card->page_off + 1);
2471                                if (retval != STATUS_SUCCESS)
2472                                        return STATUS_FAIL;
2473
2474                                segment->l2p_table[log_blk] = phy_blk;
2475
2476                                retval = ms_set_bad_block(chip, tmp_blk);
2477                                if (retval != STATUS_SUCCESS)
2478                                        return STATUS_FAIL;
2479                        }
2480                }
2481        }
2482
2483        return STATUS_SUCCESS;
2484
2485BUILD_FAIL:
2486        segment->build_flag = 0;
2487        vfree(segment->l2p_table);
2488        segment->l2p_table = NULL;
2489        vfree(segment->free_table);
2490        segment->free_table = NULL;
2491
2492        return STATUS_FAIL;
2493}
2494
2495int reset_ms_card(struct rtsx_chip *chip)
2496{
2497        struct ms_info *ms_card = &chip->ms_card;
2498        int seg_no = ms_card->total_block / 512 - 1;
2499        int retval;
2500
2501        memset(ms_card, 0, sizeof(struct ms_info));
2502
2503        retval = enable_card_clock(chip, MS_CARD);
2504        if (retval != STATUS_SUCCESS)
2505                return STATUS_FAIL;
2506
2507        retval = select_card(chip, MS_CARD);
2508        if (retval != STATUS_SUCCESS)
2509                return STATUS_FAIL;
2510
2511        ms_card->ms_type = 0;
2512
2513        retval = reset_ms_pro(chip);
2514        if (retval != STATUS_SUCCESS) {
2515                if (ms_card->check_ms_flow) {
2516                        retval = reset_ms(chip);
2517                        if (retval != STATUS_SUCCESS)
2518                                return STATUS_FAIL;
2519                } else {
2520                        return STATUS_FAIL;
2521                }
2522        }
2523
2524        retval = ms_set_init_para(chip);
2525        if (retval != STATUS_SUCCESS)
2526                return STATUS_FAIL;
2527
2528        if (!CHK_MSPRO(ms_card)) {
2529                /* Build table for the last segment,
2530                 * to check if L2P table block exists, erasing it
2531                 */
2532                retval = ms_build_l2p_tbl(chip, seg_no);
2533                if (retval != STATUS_SUCCESS)
2534                        return STATUS_FAIL;
2535        }
2536
2537        dev_dbg(rtsx_dev(chip), "ms_card->ms_type = 0x%x\n", ms_card->ms_type);
2538
2539        return STATUS_SUCCESS;
2540}
2541
2542static int mspro_set_rw_cmd(struct rtsx_chip *chip,
2543                            u32 start_sec, u16 sec_cnt, u8 cmd)
2544{
2545        int retval, i;
2546        u8 data[8];
2547
2548        data[0] = cmd;
2549        data[1] = (u8)(sec_cnt >> 8);
2550        data[2] = (u8)sec_cnt;
2551        data[3] = (u8)(start_sec >> 24);
2552        data[4] = (u8)(start_sec >> 16);
2553        data[5] = (u8)(start_sec >> 8);
2554        data[6] = (u8)start_sec;
2555        data[7] = 0;
2556
2557        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
2558                retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7,
2559                                        WAIT_INT, data, 8);
2560                if (retval == STATUS_SUCCESS)
2561                        break;
2562        }
2563        if (i == MS_MAX_RETRY_COUNT)
2564                return STATUS_FAIL;
2565
2566        return STATUS_SUCCESS;
2567}
2568
2569void mspro_stop_seq_mode(struct rtsx_chip *chip)
2570{
2571        struct ms_info *ms_card = &chip->ms_card;
2572        int retval;
2573
2574        if (ms_card->seq_mode) {
2575                retval = ms_switch_clock(chip);
2576                if (retval != STATUS_SUCCESS)
2577                        return;
2578
2579                ms_card->seq_mode = 0;
2580                ms_card->total_sec_cnt = 0;
2581                ms_send_cmd(chip, PRO_STOP, WAIT_INT);
2582
2583                rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
2584        }
2585}
2586
2587static inline int ms_auto_tune_clock(struct rtsx_chip *chip)
2588{
2589        struct ms_info *ms_card = &chip->ms_card;
2590        int retval;
2591
2592        if (chip->asic_code) {
2593                if (ms_card->ms_clock > 30)
2594                        ms_card->ms_clock -= 20;
2595        } else {
2596                if (ms_card->ms_clock == CLK_80)
2597                        ms_card->ms_clock = CLK_60;
2598                else if (ms_card->ms_clock == CLK_60)
2599                        ms_card->ms_clock = CLK_40;
2600        }
2601
2602        retval = ms_switch_clock(chip);
2603        if (retval != STATUS_SUCCESS)
2604                return STATUS_FAIL;
2605
2606        return STATUS_SUCCESS;
2607}
2608
2609static int mspro_rw_multi_sector(struct scsi_cmnd *srb,
2610                                 struct rtsx_chip *chip, u32 start_sector,
2611                                 u16 sector_cnt)
2612{
2613        struct ms_info *ms_card = &chip->ms_card;
2614        bool mode_2k = false;
2615        int retval;
2616        u16 count;
2617        u8 val, trans_mode, rw_tpc, rw_cmd;
2618
2619        ms_set_err_code(chip, MS_NO_ERROR);
2620
2621        ms_card->cleanup_counter = 0;
2622
2623        if (CHK_MSHG(ms_card)) {
2624                if ((start_sector % 4) || (sector_cnt % 4)) {
2625                        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2626                                rw_tpc = PRO_READ_LONG_DATA;
2627                                rw_cmd = PRO_READ_DATA;
2628                        } else {
2629                                rw_tpc = PRO_WRITE_LONG_DATA;
2630                                rw_cmd = PRO_WRITE_DATA;
2631                        }
2632                } else {
2633                        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2634                                rw_tpc = PRO_READ_QUAD_DATA;
2635                                rw_cmd = PRO_READ_2K_DATA;
2636                        } else {
2637                                rw_tpc = PRO_WRITE_QUAD_DATA;
2638                                rw_cmd = PRO_WRITE_2K_DATA;
2639                        }
2640                        mode_2k = true;
2641                }
2642        } else {
2643                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2644                        rw_tpc = PRO_READ_LONG_DATA;
2645                        rw_cmd = PRO_READ_DATA;
2646                } else {
2647                        rw_tpc = PRO_WRITE_LONG_DATA;
2648                        rw_cmd = PRO_WRITE_DATA;
2649                }
2650        }
2651
2652        retval = ms_switch_clock(chip);
2653        if (retval != STATUS_SUCCESS)
2654                return STATUS_FAIL;
2655
2656        if (srb->sc_data_direction == DMA_FROM_DEVICE)
2657                trans_mode = MS_TM_AUTO_READ;
2658        else
2659                trans_mode = MS_TM_AUTO_WRITE;
2660
2661        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
2662        if (retval)
2663                return retval;
2664
2665        if (ms_card->seq_mode) {
2666                if ((ms_card->pre_dir != srb->sc_data_direction) ||
2667                    ((ms_card->pre_sec_addr + ms_card->pre_sec_cnt) !=
2668                     start_sector) ||
2669                    (mode_2k && (ms_card->seq_mode & MODE_512_SEQ)) ||
2670                    (!mode_2k && (ms_card->seq_mode & MODE_2K_SEQ)) ||
2671                    !(val & MS_INT_BREQ) ||
2672                    ((ms_card->total_sec_cnt + sector_cnt) > 0xFE00)) {
2673                        ms_card->seq_mode = 0;
2674                        ms_card->total_sec_cnt = 0;
2675                        if (val & MS_INT_BREQ) {
2676                                retval = ms_send_cmd(chip, PRO_STOP, WAIT_INT);
2677                                if (retval != STATUS_SUCCESS)
2678                                        return STATUS_FAIL;
2679
2680                                rtsx_write_register(chip, RBCTL, RB_FLUSH,
2681                                                    RB_FLUSH);
2682                        }
2683                }
2684        }
2685
2686        if (!ms_card->seq_mode) {
2687                ms_card->total_sec_cnt = 0;
2688                if (sector_cnt >= SEQ_START_CRITERIA) {
2689                        if ((ms_card->capacity - start_sector) > 0xFE00)
2690                                count = 0xFE00;
2691                        else
2692                                count = (u16)(ms_card->capacity - start_sector);
2693
2694                        if (count > sector_cnt) {
2695                                if (mode_2k)
2696                                        ms_card->seq_mode = MODE_2K_SEQ;
2697                                else
2698                                        ms_card->seq_mode = MODE_512_SEQ;
2699                        }
2700                } else {
2701                        count = sector_cnt;
2702                }
2703                retval = mspro_set_rw_cmd(chip, start_sector, count, rw_cmd);
2704                if (retval != STATUS_SUCCESS) {
2705                        ms_card->seq_mode = 0;
2706                        return STATUS_FAIL;
2707                }
2708        }
2709
2710        retval = ms_transfer_data(chip, trans_mode, rw_tpc, sector_cnt,
2711                                  WAIT_INT, mode_2k, scsi_sg_count(srb),
2712                                  scsi_sglist(srb), scsi_bufflen(srb));
2713        if (retval != STATUS_SUCCESS) {
2714                ms_card->seq_mode = 0;
2715                rtsx_read_register(chip, MS_TRANS_CFG, &val);
2716                rtsx_clear_ms_error(chip);
2717
2718                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
2719                        chip->rw_need_retry = 0;
2720                        dev_dbg(rtsx_dev(chip), "No card exist, exit %s\n",
2721                                __func__);
2722                        return STATUS_FAIL;
2723                }
2724
2725                if (val & MS_INT_BREQ)
2726                        ms_send_cmd(chip, PRO_STOP, WAIT_INT);
2727
2728                if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
2729                        dev_dbg(rtsx_dev(chip), "MSPro CRC error, tune clock!\n");
2730                        chip->rw_need_retry = 1;
2731                        ms_auto_tune_clock(chip);
2732                }
2733
2734                return retval;
2735        }
2736
2737        if (ms_card->seq_mode) {
2738                ms_card->pre_sec_addr = start_sector;
2739                ms_card->pre_sec_cnt = sector_cnt;
2740                ms_card->pre_dir = srb->sc_data_direction;
2741                ms_card->total_sec_cnt += sector_cnt;
2742        }
2743
2744        return STATUS_SUCCESS;
2745}
2746
2747static int mspro_read_format_progress(struct rtsx_chip *chip,
2748                                      const int short_data_len)
2749{
2750        struct ms_info *ms_card = &chip->ms_card;
2751        int retval, i;
2752        u32 total_progress, cur_progress;
2753        u8 cnt, tmp;
2754        u8 data[8];
2755
2756        dev_dbg(rtsx_dev(chip), "%s, short_data_len = %d\n", __func__,
2757                short_data_len);
2758
2759        retval = ms_switch_clock(chip);
2760        if (retval != STATUS_SUCCESS) {
2761                ms_card->format_status = FORMAT_FAIL;
2762                return STATUS_FAIL;
2763        }
2764
2765        retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
2766        if (retval != STATUS_SUCCESS) {
2767                ms_card->format_status = FORMAT_FAIL;
2768                return STATUS_FAIL;
2769        }
2770
2771        if (!(tmp & MS_INT_BREQ)) {
2772                if ((tmp & (MS_INT_CED | MS_INT_BREQ | MS_INT_CMDNK |
2773                            MS_INT_ERR)) == MS_INT_CED) {
2774                        ms_card->format_status = FORMAT_SUCCESS;
2775                        return STATUS_SUCCESS;
2776                }
2777                ms_card->format_status = FORMAT_FAIL;
2778                return STATUS_FAIL;
2779        }
2780
2781        if (short_data_len >= 256)
2782                cnt = 0;
2783        else
2784                cnt = (u8)short_data_len;
2785
2786        retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT,
2787                                     MS_NO_CHECK_INT);
2788        if (retval != STATUS_SUCCESS) {
2789                ms_card->format_status = FORMAT_FAIL;
2790                return STATUS_FAIL;
2791        }
2792
2793        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, cnt, WAIT_INT,
2794                               data, 8);
2795        if (retval != STATUS_SUCCESS) {
2796                ms_card->format_status = FORMAT_FAIL;
2797                return STATUS_FAIL;
2798        }
2799
2800        total_progress = (data[0] << 24) | (data[1] << 16) |
2801                (data[2] << 8) | data[3];
2802        cur_progress = (data[4] << 24) | (data[5] << 16) |
2803                (data[6] << 8) | data[7];
2804
2805        dev_dbg(rtsx_dev(chip), "total_progress = %d, cur_progress = %d\n",
2806                total_progress, cur_progress);
2807
2808        if (total_progress == 0) {
2809                ms_card->progress = 0;
2810        } else {
2811                u64 ulltmp = (u64)cur_progress * (u64)65535;
2812
2813                do_div(ulltmp, total_progress);
2814                ms_card->progress = (u16)ulltmp;
2815        }
2816        dev_dbg(rtsx_dev(chip), "progress = %d\n", ms_card->progress);
2817
2818        for (i = 0; i < 5000; i++) {
2819                retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
2820                if (retval != STATUS_SUCCESS) {
2821                        ms_card->format_status = FORMAT_FAIL;
2822                        return STATUS_FAIL;
2823                }
2824                if (tmp & (MS_INT_CED | MS_INT_CMDNK |
2825                                MS_INT_BREQ | MS_INT_ERR))
2826                        break;
2827
2828                wait_timeout(1);
2829        }
2830
2831        retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT, 0);
2832        if (retval != STATUS_SUCCESS) {
2833                ms_card->format_status = FORMAT_FAIL;
2834                return STATUS_FAIL;
2835        }
2836
2837        if (i == 5000) {
2838                ms_card->format_status = FORMAT_FAIL;
2839                return STATUS_FAIL;
2840        }
2841
2842        if (tmp & (MS_INT_CMDNK | MS_INT_ERR)) {
2843                ms_card->format_status = FORMAT_FAIL;
2844                return STATUS_FAIL;
2845        }
2846
2847        if (tmp & MS_INT_CED) {
2848                ms_card->format_status = FORMAT_SUCCESS;
2849                ms_card->pro_under_formatting = 0;
2850        } else if (tmp & MS_INT_BREQ) {
2851                ms_card->format_status = FORMAT_IN_PROGRESS;
2852        } else {
2853                ms_card->format_status = FORMAT_FAIL;
2854                ms_card->pro_under_formatting = 0;
2855                return STATUS_FAIL;
2856        }
2857
2858        return STATUS_SUCCESS;
2859}
2860
2861void mspro_polling_format_status(struct rtsx_chip *chip)
2862{
2863        struct ms_info *ms_card = &chip->ms_card;
2864        int i;
2865
2866        if (ms_card->pro_under_formatting &&
2867            (rtsx_get_stat(chip) != RTSX_STAT_SS)) {
2868                rtsx_set_stat(chip, RTSX_STAT_RUN);
2869
2870                for (i = 0; i < 65535; i++) {
2871                        mspro_read_format_progress(chip, MS_SHORT_DATA_LEN);
2872                        if (ms_card->format_status != FORMAT_IN_PROGRESS)
2873                                break;
2874                }
2875        }
2876}
2877
2878int mspro_format(struct scsi_cmnd *srb, struct rtsx_chip *chip,
2879                 int short_data_len, bool quick_format)
2880{
2881        struct ms_info *ms_card = &chip->ms_card;
2882        int retval, i;
2883        u8 buf[8], tmp;
2884        u16 para;
2885
2886        retval = ms_switch_clock(chip);
2887        if (retval != STATUS_SUCCESS)
2888                return STATUS_FAIL;
2889
2890        retval = ms_set_rw_reg_addr(chip, 0x00, 0x00, Pro_TPCParm, 0x01);
2891        if (retval != STATUS_SUCCESS)
2892                return STATUS_FAIL;
2893
2894        memset(buf, 0, 2);
2895        switch (short_data_len) {
2896        case 32:
2897                buf[0] = 0;
2898                break;
2899        case 64:
2900                buf[0] = 1;
2901                break;
2902        case 128:
2903                buf[0] = 2;
2904                break;
2905        case 256:
2906        default:
2907                buf[0] = 3;
2908                break;
2909        }
2910
2911        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
2912                retval = ms_write_bytes(chip, PRO_WRITE_REG, 1,
2913                                        NO_WAIT_INT, buf, 2);
2914                if (retval == STATUS_SUCCESS)
2915                        break;
2916        }
2917        if (i == MS_MAX_RETRY_COUNT)
2918                return STATUS_FAIL;
2919
2920        if (quick_format)
2921                para = 0x0000;
2922        else
2923                para = 0x0001;
2924
2925        retval = mspro_set_rw_cmd(chip, 0, para, PRO_FORMAT);
2926        if (retval != STATUS_SUCCESS)
2927                return STATUS_FAIL;
2928
2929        retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
2930        if (retval)
2931                return retval;
2932
2933        if (tmp & (MS_INT_CMDNK | MS_INT_ERR))
2934                return STATUS_FAIL;
2935
2936        if ((tmp & (MS_INT_BREQ | MS_INT_CED)) == MS_INT_BREQ) {
2937                ms_card->pro_under_formatting = 1;
2938                ms_card->progress = 0;
2939                ms_card->format_status = FORMAT_IN_PROGRESS;
2940                return STATUS_SUCCESS;
2941        }
2942
2943        if (tmp & MS_INT_CED) {
2944                ms_card->pro_under_formatting = 0;
2945                ms_card->progress = 0;
2946                ms_card->format_status = FORMAT_SUCCESS;
2947                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_NO_SENSE);
2948                return STATUS_SUCCESS;
2949        }
2950
2951        return STATUS_FAIL;
2952}
2953
2954static int ms_read_multiple_pages(struct rtsx_chip *chip, u16 phy_blk,
2955                                  u16 log_blk, u8 start_page, u8 end_page,
2956                                  u8 *buf, unsigned int *index,
2957                                  unsigned int *offset)
2958{
2959        struct ms_info *ms_card = &chip->ms_card;
2960        int retval, i;
2961        u8 extra[MS_EXTRA_SIZE], page_addr, val, trans_cfg, data[6];
2962        u8 *ptr;
2963
2964        retval = ms_read_extra_data(chip, phy_blk, start_page,
2965                                    extra, MS_EXTRA_SIZE);
2966        if (retval == STATUS_SUCCESS) {
2967                if ((extra[1] & 0x30) != 0x30) {
2968                        ms_set_err_code(chip, MS_FLASH_READ_ERROR);
2969                        return STATUS_FAIL;
2970                }
2971        }
2972
2973        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
2974                                    SystemParm, 6);
2975        if (retval != STATUS_SUCCESS)
2976                return STATUS_FAIL;
2977
2978        if (CHK_MS4BIT(ms_card))
2979                data[0] = 0x88;
2980        else
2981                data[0] = 0x80;
2982
2983        data[1] = 0;
2984        data[2] = (u8)(phy_blk >> 8);
2985        data[3] = (u8)phy_blk;
2986        data[4] = 0;
2987        data[5] = start_page;
2988
2989        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
2990                retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
2991                                        data, 6);
2992                if (retval == STATUS_SUCCESS)
2993                        break;
2994        }
2995        if (i == MS_MAX_RETRY_COUNT)
2996                return STATUS_FAIL;
2997
2998        ms_set_err_code(chip, MS_NO_ERROR);
2999
3000        retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
3001        if (retval != STATUS_SUCCESS)
3002                return STATUS_FAIL;
3003
3004        ptr = buf;
3005
3006        for (page_addr = start_page; page_addr < end_page; page_addr++) {
3007                ms_set_err_code(chip, MS_NO_ERROR);
3008
3009                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3010                        ms_set_err_code(chip, MS_NO_CARD);
3011                        return STATUS_FAIL;
3012                }
3013
3014                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3015                if (retval != STATUS_SUCCESS)
3016                        return STATUS_FAIL;
3017
3018                if (val & INT_REG_CMDNK) {
3019                        ms_set_err_code(chip, MS_CMD_NK);
3020                        return STATUS_FAIL;
3021                }
3022                if (val & INT_REG_ERR) {
3023                        if (val & INT_REG_BREQ) {
3024                                retval = ms_read_status_reg(chip);
3025                                if (retval != STATUS_SUCCESS) {
3026                                        if (!(chip->card_wp & MS_CARD)) {
3027                                                reset_ms(chip);
3028                                                ms_set_page_status
3029                                                        (log_blk, setPS_NG,
3030                                                         extra,
3031                                                         MS_EXTRA_SIZE);
3032                                                ms_write_extra_data
3033                                                        (chip, phy_blk,
3034                                                         page_addr, extra,
3035                                                         MS_EXTRA_SIZE);
3036                                        }
3037                                        ms_set_err_code(chip,
3038                                                        MS_FLASH_READ_ERROR);
3039                                        return STATUS_FAIL;
3040                                }
3041                        } else {
3042                                ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3043                                return STATUS_FAIL;
3044                        }
3045                } else {
3046                        if (!(val & INT_REG_BREQ)) {
3047                                ms_set_err_code(chip, MS_BREQ_ERROR);
3048                                return STATUS_FAIL;
3049                        }
3050                }
3051
3052                if (page_addr == (end_page - 1)) {
3053                        if (!(val & INT_REG_CED)) {
3054                                retval = ms_send_cmd(chip, BLOCK_END, WAIT_INT);
3055                                if (retval != STATUS_SUCCESS)
3056                                        return STATUS_FAIL;
3057                        }
3058
3059                        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT,
3060                                               &val, 1);
3061                        if (retval != STATUS_SUCCESS)
3062                                return STATUS_FAIL;
3063
3064                        if (!(val & INT_REG_CED)) {
3065                                ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3066                                return STATUS_FAIL;
3067                        }
3068
3069                        trans_cfg = NO_WAIT_INT;
3070                } else {
3071                        trans_cfg = WAIT_INT;
3072                }
3073
3074                rtsx_init_cmd(chip);
3075
3076                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, READ_PAGE_DATA);
3077                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
3078                             0xFF, trans_cfg);
3079                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
3080                             0x01, RING_BUFFER);
3081
3082                trans_dma_enable(DMA_FROM_DEVICE, chip, 512, DMA_512);
3083
3084                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
3085                             MS_TRANSFER_START |  MS_TM_NORMAL_READ);
3086                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
3087                             MS_TRANSFER_END, MS_TRANSFER_END);
3088
3089                rtsx_send_cmd_no_wait(chip);
3090
3091                retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr, 512,
3092                                                    scsi_sg_count(chip->srb),
3093                                                    index, offset,
3094                                                    DMA_FROM_DEVICE,
3095                                                    chip->ms_timeout);
3096                if (retval < 0) {
3097                        if (retval == -ETIMEDOUT) {
3098                                ms_set_err_code(chip, MS_TO_ERROR);
3099                                rtsx_clear_ms_error(chip);
3100                                return STATUS_TIMEDOUT;
3101                        }
3102
3103                        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
3104                        if (retval != STATUS_SUCCESS) {
3105                                ms_set_err_code(chip, MS_TO_ERROR);
3106                                rtsx_clear_ms_error(chip);
3107                                return STATUS_TIMEDOUT;
3108                        }
3109                        if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
3110                                ms_set_err_code(chip, MS_CRC16_ERROR);
3111                                rtsx_clear_ms_error(chip);
3112                                return STATUS_FAIL;
3113                        }
3114                }
3115
3116                if (scsi_sg_count(chip->srb) == 0)
3117                        ptr += 512;
3118        }
3119
3120        return STATUS_SUCCESS;
3121}
3122
3123static int ms_write_multiple_pages(struct rtsx_chip *chip, u16 old_blk,
3124                                   u16 new_blk, u16 log_blk, u8 start_page,
3125                                u8 end_page, u8 *buf, unsigned int *index,
3126                                unsigned int *offset)
3127{
3128        struct ms_info *ms_card = &chip->ms_card;
3129        int retval, i;
3130        u8 page_addr, val, data[16];
3131        u8 *ptr;
3132
3133        if (!start_page) {
3134                retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
3135                                            SystemParm, 7);
3136                if (retval != STATUS_SUCCESS)
3137                        return STATUS_FAIL;
3138
3139                if (CHK_MS4BIT(ms_card))
3140                        data[0] = 0x88;
3141                else
3142                        data[0] = 0x80;
3143
3144                data[1] = 0;
3145                data[2] = (u8)(old_blk >> 8);
3146                data[3] = (u8)old_blk;
3147                data[4] = 0x80;
3148                data[5] = 0;
3149                data[6] = 0xEF;
3150                data[7] = 0xFF;
3151
3152                retval = ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT,
3153                                        data, 8);
3154                if (retval != STATUS_SUCCESS)
3155                        return STATUS_FAIL;
3156
3157                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
3158                if (retval != STATUS_SUCCESS)
3159                        return STATUS_FAIL;
3160
3161                ms_set_err_code(chip, MS_NO_ERROR);
3162                retval = ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT, 1,
3163                                         NO_WAIT_INT);
3164                if (retval != STATUS_SUCCESS)
3165                        return STATUS_FAIL;
3166        }
3167
3168        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
3169                                    SystemParm, (6 + MS_EXTRA_SIZE));
3170        if (retval != STATUS_SUCCESS)
3171                return STATUS_FAIL;
3172
3173        ms_set_err_code(chip, MS_NO_ERROR);
3174
3175        if (CHK_MS4BIT(ms_card))
3176                data[0] = 0x88;
3177        else
3178                data[0] = 0x80;
3179
3180        data[1] = 0;
3181        data[2] = (u8)(new_blk >> 8);
3182        data[3] = (u8)new_blk;
3183        if ((end_page - start_page) == 1)
3184                data[4] = 0x20;
3185        else
3186                data[4] = 0;
3187
3188        data[5] = start_page;
3189        data[6] = 0xF8;
3190        data[7] = 0xFF;
3191        data[8] = (u8)(log_blk >> 8);
3192        data[9] = (u8)log_blk;
3193
3194        for (i = 0x0A; i < 0x10; i++)
3195                data[i] = 0xFF;
3196
3197        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3198                retval = ms_write_bytes(chip, WRITE_REG, 6 + MS_EXTRA_SIZE,
3199                                        NO_WAIT_INT, data, 16);
3200                if (retval == STATUS_SUCCESS)
3201                        break;
3202        }
3203        if (i == MS_MAX_RETRY_COUNT)
3204                return STATUS_FAIL;
3205
3206        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3207                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
3208                if (retval == STATUS_SUCCESS)
3209                        break;
3210        }
3211        if (i == MS_MAX_RETRY_COUNT)
3212                return STATUS_FAIL;
3213
3214        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3215        if (retval != STATUS_SUCCESS)
3216                return STATUS_FAIL;
3217
3218        ptr = buf;
3219        for (page_addr = start_page; page_addr < end_page; page_addr++) {
3220                ms_set_err_code(chip, MS_NO_ERROR);
3221
3222                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3223                        ms_set_err_code(chip, MS_NO_CARD);
3224                        return STATUS_FAIL;
3225                }
3226
3227                if (val & INT_REG_CMDNK) {
3228                        ms_set_err_code(chip, MS_CMD_NK);
3229                        return STATUS_FAIL;
3230                }
3231                if (val & INT_REG_ERR) {
3232                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
3233                        return STATUS_FAIL;
3234                }
3235                if (!(val & INT_REG_BREQ)) {
3236                        ms_set_err_code(chip, MS_BREQ_ERROR);
3237                        return STATUS_FAIL;
3238                }
3239
3240                udelay(30);
3241
3242                rtsx_init_cmd(chip);
3243
3244                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
3245                             0xFF, WRITE_PAGE_DATA);
3246                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
3247                             0xFF, WAIT_INT);
3248                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
3249                             0x01, RING_BUFFER);
3250
3251                trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
3252
3253                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
3254                             MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
3255                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
3256                             MS_TRANSFER_END, MS_TRANSFER_END);
3257
3258                rtsx_send_cmd_no_wait(chip);
3259
3260                retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr, 512,
3261                                                    scsi_sg_count(chip->srb),
3262                                                    index, offset,
3263                                                    DMA_TO_DEVICE,
3264                                                    chip->ms_timeout);
3265                if (retval < 0) {
3266                        ms_set_err_code(chip, MS_TO_ERROR);
3267                        rtsx_clear_ms_error(chip);
3268
3269                        if (retval == -ETIMEDOUT)
3270                                return STATUS_TIMEDOUT;
3271                        return STATUS_FAIL;
3272                }
3273
3274                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3275                if (retval != STATUS_SUCCESS)
3276                        return STATUS_FAIL;
3277
3278                if ((end_page - start_page) == 1) {
3279                        if (!(val & INT_REG_CED)) {
3280                                ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
3281                                return STATUS_FAIL;
3282                        }
3283                } else {
3284                        if (page_addr == (end_page - 1)) {
3285                                if (!(val & INT_REG_CED)) {
3286                                        retval = ms_send_cmd(chip, BLOCK_END,
3287                                                             WAIT_INT);
3288                                        if (retval != STATUS_SUCCESS)
3289                                                return STATUS_FAIL;
3290                                }
3291
3292                                retval = ms_read_bytes(chip, GET_INT, 1,
3293                                                       NO_WAIT_INT, &val, 1);
3294                                if (retval != STATUS_SUCCESS)
3295                                        return STATUS_FAIL;
3296                        }
3297
3298                        if ((page_addr == (end_page - 1)) ||
3299                            (page_addr == ms_card->page_off)) {
3300                                if (!(val & INT_REG_CED)) {
3301                                        ms_set_err_code(chip,
3302                                                        MS_FLASH_WRITE_ERROR);
3303                                        return STATUS_FAIL;
3304                                }
3305                        }
3306                }
3307
3308                if (scsi_sg_count(chip->srb) == 0)
3309                        ptr += 512;
3310        }
3311
3312        return STATUS_SUCCESS;
3313}
3314
3315static int ms_finish_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
3316                           u16 log_blk, u8 page_off)
3317{
3318        struct ms_info *ms_card = &chip->ms_card;
3319        int retval, seg_no;
3320
3321        retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
3322                              page_off, ms_card->page_off + 1);
3323        if (retval != STATUS_SUCCESS)
3324                return STATUS_FAIL;
3325
3326        seg_no = old_blk >> 9;
3327
3328        if (MS_TST_BAD_BLOCK_FLG(ms_card)) {
3329                MS_CLR_BAD_BLOCK_FLG(ms_card);
3330                ms_set_bad_block(chip, old_blk);
3331        } else {
3332                retval = ms_erase_block(chip, old_blk);
3333                if (retval == STATUS_SUCCESS)
3334                        ms_set_unused_block(chip, old_blk);
3335        }
3336
3337        ms_set_l2p_tbl(chip, seg_no, log_blk - ms_start_idx[seg_no], new_blk);
3338
3339        return STATUS_SUCCESS;
3340}
3341
3342static int ms_prepare_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
3343                            u16 log_blk, u8 start_page)
3344{
3345        int retval;
3346
3347        if (start_page) {
3348                retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
3349                                      0, start_page);
3350                if (retval != STATUS_SUCCESS)
3351                        return STATUS_FAIL;
3352        }
3353
3354        return STATUS_SUCCESS;
3355}
3356
3357#ifdef MS_DELAY_WRITE
3358int ms_delay_write(struct rtsx_chip *chip)
3359{
3360        struct ms_info *ms_card = &chip->ms_card;
3361        struct ms_delay_write_tag *delay_write = &ms_card->delay_write;
3362        int retval;
3363
3364        if (delay_write->delay_write_flag) {
3365                retval = ms_set_init_para(chip);
3366                if (retval != STATUS_SUCCESS)
3367                        return STATUS_FAIL;
3368
3369                delay_write->delay_write_flag = 0;
3370                retval = ms_finish_write(chip,
3371                                         delay_write->old_phyblock,
3372                                        delay_write->new_phyblock,
3373                                        delay_write->logblock,
3374                                        delay_write->pageoff);
3375                if (retval != STATUS_SUCCESS)
3376                        return STATUS_FAIL;
3377        }
3378
3379        return STATUS_SUCCESS;
3380}
3381#endif
3382
3383static inline void ms_rw_fail(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3384{
3385        if (srb->sc_data_direction == DMA_FROM_DEVICE)
3386                set_sense_type(chip, SCSI_LUN(srb),
3387                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3388        else
3389                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
3390}
3391
3392static int ms_rw_multi_sector(struct scsi_cmnd *srb, struct rtsx_chip *chip,
3393                              u32 start_sector, u16 sector_cnt)
3394{
3395        struct ms_info *ms_card = &chip->ms_card;
3396        unsigned int lun = SCSI_LUN(srb);
3397        int retval, seg_no;
3398        unsigned int index = 0, offset = 0;
3399        u16 old_blk = 0, new_blk = 0, log_blk, total_sec_cnt = sector_cnt;
3400        u8 start_page, end_page = 0, page_cnt;
3401        u8 *ptr;
3402#ifdef MS_DELAY_WRITE
3403        struct ms_delay_write_tag *delay_write = &ms_card->delay_write;
3404#endif
3405
3406        ms_set_err_code(chip, MS_NO_ERROR);
3407
3408        ms_card->cleanup_counter = 0;
3409
3410        ptr = (u8 *)scsi_sglist(srb);
3411
3412        retval = ms_switch_clock(chip);
3413        if (retval != STATUS_SUCCESS) {
3414                ms_rw_fail(srb, chip);
3415                return STATUS_FAIL;
3416        }
3417
3418        log_blk = (u16)(start_sector >> ms_card->block_shift);
3419        start_page = (u8)(start_sector & ms_card->page_off);
3420
3421        for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1; seg_no++) {
3422                if (log_blk < ms_start_idx[seg_no + 1])
3423                        break;
3424        }
3425
3426        if (ms_card->segment[seg_no].build_flag == 0) {
3427                retval = ms_build_l2p_tbl(chip, seg_no);
3428                if (retval != STATUS_SUCCESS) {
3429                        chip->card_fail |= MS_CARD;
3430                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3431                        return STATUS_FAIL;
3432                }
3433        }
3434
3435        if (srb->sc_data_direction == DMA_TO_DEVICE) {
3436#ifdef MS_DELAY_WRITE
3437                if (delay_write->delay_write_flag &&
3438                    (delay_write->logblock == log_blk) &&
3439                    (start_page > delay_write->pageoff)) {
3440                        delay_write->delay_write_flag = 0;
3441                        retval = ms_copy_page(chip,
3442                                              delay_write->old_phyblock,
3443                                              delay_write->new_phyblock,
3444                                              log_blk,
3445                                              delay_write->pageoff, start_page);
3446                        if (retval != STATUS_SUCCESS) {
3447                                set_sense_type(chip, lun,
3448                                               SENSE_TYPE_MEDIA_WRITE_ERR);
3449                                return STATUS_FAIL;
3450                        }
3451                        old_blk = delay_write->old_phyblock;
3452                        new_blk = delay_write->new_phyblock;
3453                } else if (delay_write->delay_write_flag &&
3454                                (delay_write->logblock == log_blk) &&
3455                                (start_page == delay_write->pageoff)) {
3456                        delay_write->delay_write_flag = 0;
3457                        old_blk = delay_write->old_phyblock;
3458                        new_blk = delay_write->new_phyblock;
3459                } else {
3460                        retval = ms_delay_write(chip);
3461                        if (retval != STATUS_SUCCESS) {
3462                                set_sense_type(chip, lun,
3463                                               SENSE_TYPE_MEDIA_WRITE_ERR);
3464                                return STATUS_FAIL;
3465                        }
3466#endif
3467                        old_blk = ms_get_l2p_tbl
3468                                        (chip, seg_no,
3469                                         log_blk - ms_start_idx[seg_no]);
3470                        new_blk  = ms_get_unused_block(chip, seg_no);
3471                        if ((old_blk == 0xFFFF) || (new_blk == 0xFFFF)) {
3472                                set_sense_type(chip, lun,
3473                                               SENSE_TYPE_MEDIA_WRITE_ERR);
3474                                return STATUS_FAIL;
3475                        }
3476
3477                        retval = ms_prepare_write(chip, old_blk, new_blk,
3478                                                  log_blk, start_page);
3479                        if (retval != STATUS_SUCCESS) {
3480                                if (detect_card_cd(chip, MS_CARD) !=
3481                                    STATUS_SUCCESS) {
3482                                        set_sense_type
3483                                                (chip, lun,
3484                                                SENSE_TYPE_MEDIA_NOT_PRESENT);
3485                                        return STATUS_FAIL;
3486                                }
3487                                set_sense_type(chip, lun,
3488                                               SENSE_TYPE_MEDIA_WRITE_ERR);
3489                                return STATUS_FAIL;
3490                        }
3491#ifdef MS_DELAY_WRITE
3492                }
3493#endif
3494        } else {
3495#ifdef MS_DELAY_WRITE
3496                retval = ms_delay_write(chip);
3497                if (retval != STATUS_SUCCESS) {
3498                        if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3499                                set_sense_type(chip, lun,
3500                                               SENSE_TYPE_MEDIA_NOT_PRESENT);
3501                                return STATUS_FAIL;
3502                        }
3503                        set_sense_type(chip, lun,
3504                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3505                        return STATUS_FAIL;
3506                }
3507#endif
3508                old_blk = ms_get_l2p_tbl(chip, seg_no,
3509                                         log_blk - ms_start_idx[seg_no]);
3510                if (old_blk == 0xFFFF) {
3511                        set_sense_type(chip, lun,
3512                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3513                        return STATUS_FAIL;
3514                }
3515        }
3516
3517        dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
3518                seg_no, old_blk, new_blk);
3519
3520        while (total_sec_cnt) {
3521                if ((start_page + total_sec_cnt) > (ms_card->page_off + 1))
3522                        end_page = ms_card->page_off + 1;
3523                else
3524                        end_page = start_page + (u8)total_sec_cnt;
3525
3526                page_cnt = end_page - start_page;
3527
3528                dev_dbg(rtsx_dev(chip), "start_page = %d, end_page = %d, page_cnt = %d\n",
3529                        start_page, end_page, page_cnt);
3530
3531                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3532                        retval = ms_read_multiple_pages(chip,
3533                                                        old_blk, log_blk,
3534                                                        start_page, end_page,
3535                                                        ptr, &index, &offset);
3536                } else {
3537                        retval = ms_write_multiple_pages(chip, old_blk, new_blk,
3538                                                         log_blk, start_page,
3539                                                         end_page, ptr, &index,
3540                                                         &offset);
3541                }
3542
3543                if (retval != STATUS_SUCCESS) {
3544                        toggle_gpio(chip, 1);
3545                        if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3546                                set_sense_type(chip, lun,
3547                                               SENSE_TYPE_MEDIA_NOT_PRESENT);
3548                                return STATUS_FAIL;
3549                        }
3550                        ms_rw_fail(srb, chip);
3551                        return STATUS_FAIL;
3552                }
3553
3554                if (srb->sc_data_direction == DMA_TO_DEVICE) {
3555                        if (end_page == (ms_card->page_off + 1)) {
3556                                retval = ms_erase_block(chip, old_blk);
3557                                if (retval == STATUS_SUCCESS)
3558                                        ms_set_unused_block(chip, old_blk);
3559
3560                                ms_set_l2p_tbl(chip, seg_no,
3561                                               log_blk - ms_start_idx[seg_no],
3562                                               new_blk);
3563                        }
3564                }
3565
3566                total_sec_cnt -= page_cnt;
3567                if (scsi_sg_count(srb) == 0)
3568                        ptr += page_cnt * 512;
3569
3570                if (total_sec_cnt == 0)
3571                        break;
3572
3573                log_blk++;
3574
3575                for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1;
3576                                seg_no++) {
3577                        if (log_blk < ms_start_idx[seg_no + 1])
3578                                break;
3579                }
3580
3581                if (ms_card->segment[seg_no].build_flag == 0) {
3582                        retval = ms_build_l2p_tbl(chip, seg_no);
3583                        if (retval != STATUS_SUCCESS) {
3584                                chip->card_fail |= MS_CARD;
3585                                set_sense_type(chip, lun,
3586                                               SENSE_TYPE_MEDIA_NOT_PRESENT);
3587                                return STATUS_FAIL;
3588                        }
3589                }
3590
3591                old_blk = ms_get_l2p_tbl(chip, seg_no,
3592                                         log_blk - ms_start_idx[seg_no]);
3593                if (old_blk == 0xFFFF) {
3594                        ms_rw_fail(srb, chip);
3595                        return STATUS_FAIL;
3596                }
3597
3598                if (srb->sc_data_direction == DMA_TO_DEVICE) {
3599                        new_blk = ms_get_unused_block(chip, seg_no);
3600                        if (new_blk == 0xFFFF) {
3601                                ms_rw_fail(srb, chip);
3602                                return STATUS_FAIL;
3603                        }
3604                }
3605
3606                dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
3607                        seg_no, old_blk, new_blk);
3608
3609                start_page = 0;
3610        }
3611
3612        if (srb->sc_data_direction == DMA_TO_DEVICE) {
3613                if (end_page < (ms_card->page_off + 1)) {
3614#ifdef MS_DELAY_WRITE
3615                        delay_write->delay_write_flag = 1;
3616                        delay_write->old_phyblock = old_blk;
3617                        delay_write->new_phyblock = new_blk;
3618                        delay_write->logblock = log_blk;
3619                        delay_write->pageoff = end_page;
3620#else
3621                        retval = ms_finish_write(chip, old_blk, new_blk,
3622                                                 log_blk, end_page);
3623                        if (retval != STATUS_SUCCESS) {
3624                                if (detect_card_cd(chip, MS_CARD) !=
3625                                    STATUS_SUCCESS) {
3626                                        set_sense_type
3627                                                (chip, lun,
3628                                                SENSE_TYPE_MEDIA_NOT_PRESENT);
3629                                        return STATUS_FAIL;
3630                                }
3631
3632                                ms_rw_fail(srb, chip);
3633                                return STATUS_FAIL;
3634                        }
3635#endif
3636                }
3637        }
3638
3639        scsi_set_resid(srb, 0);
3640
3641        return STATUS_SUCCESS;
3642}
3643
3644int ms_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip,
3645          u32 start_sector, u16 sector_cnt)
3646{
3647        struct ms_info *ms_card = &chip->ms_card;
3648        int retval;
3649
3650        if (CHK_MSPRO(ms_card))
3651                retval = mspro_rw_multi_sector(srb, chip, start_sector,
3652                                               sector_cnt);
3653        else
3654                retval = ms_rw_multi_sector(srb, chip, start_sector,
3655                                            sector_cnt);
3656
3657        return retval;
3658}
3659
3660void ms_free_l2p_tbl(struct rtsx_chip *chip)
3661{
3662        struct ms_info *ms_card = &chip->ms_card;
3663        int i = 0;
3664
3665        if (ms_card->segment) {
3666                for (i = 0; i < ms_card->segment_cnt; i++) {
3667                        vfree(ms_card->segment[i].l2p_table);
3668                        ms_card->segment[i].l2p_table = NULL;
3669                        vfree(ms_card->segment[i].free_table);
3670                        ms_card->segment[i].free_table = NULL;
3671                }
3672                vfree(ms_card->segment);
3673                ms_card->segment = NULL;
3674        }
3675}
3676
3677#ifdef SUPPORT_MAGIC_GATE
3678
3679#ifdef READ_BYTES_WAIT_INT
3680static int ms_poll_int(struct rtsx_chip *chip)
3681{
3682        int retval;
3683        u8 val;
3684
3685        rtsx_init_cmd(chip);
3686
3687        rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANS_CFG, MS_INT_CED, MS_INT_CED);
3688
3689        retval = rtsx_send_cmd(chip, MS_CARD, 5000);
3690        if (retval != STATUS_SUCCESS)
3691                return STATUS_FAIL;
3692
3693        val = *rtsx_get_cmd_data(chip);
3694        if (val & MS_INT_ERR)
3695                return STATUS_FAIL;
3696
3697        return STATUS_SUCCESS;
3698}
3699#endif
3700
3701#ifdef MS_SAMPLE_INT_ERR
3702static int check_ms_err(struct rtsx_chip *chip)
3703{
3704        int retval;
3705        u8 val;
3706
3707        retval = rtsx_read_register(chip, MS_TRANSFER, &val);
3708        if (retval != STATUS_SUCCESS)
3709                return 1;
3710        if (val & MS_TRANSFER_ERR)
3711                return 1;
3712
3713        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
3714        if (retval != STATUS_SUCCESS)
3715                return 1;
3716
3717        if (val & (MS_INT_ERR | MS_INT_CMDNK))
3718                return 1;
3719
3720        return 0;
3721}
3722#else
3723static int check_ms_err(struct rtsx_chip *chip)
3724{
3725        int retval;
3726        u8 val;
3727
3728        retval = rtsx_read_register(chip, MS_TRANSFER, &val);
3729        if (retval != STATUS_SUCCESS)
3730                return 1;
3731        if (val & MS_TRANSFER_ERR)
3732                return 1;
3733
3734        return 0;
3735}
3736#endif
3737
3738static int mg_send_ex_cmd(struct rtsx_chip *chip, u8 cmd, u8 entry_num)
3739{
3740        int retval, i;
3741        u8 data[8];
3742
3743        data[0] = cmd;
3744        data[1] = 0;
3745        data[2] = 0;
3746        data[3] = 0;
3747        data[4] = 0;
3748        data[5] = 0;
3749        data[6] = entry_num;
3750        data[7] = 0;
3751
3752        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3753                retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7, WAIT_INT,
3754                                        data, 8);
3755                if (retval == STATUS_SUCCESS)
3756                        break;
3757        }
3758        if (i == MS_MAX_RETRY_COUNT)
3759                return STATUS_FAIL;
3760
3761        if (check_ms_err(chip)) {
3762                rtsx_clear_ms_error(chip);
3763                return STATUS_FAIL;
3764        }
3765
3766        return STATUS_SUCCESS;
3767}
3768
3769static int mg_set_tpc_para_sub(struct rtsx_chip *chip, int type,
3770                               u8 mg_entry_num)
3771{
3772        int retval;
3773        u8 buf[6];
3774
3775        if (type == 0)
3776                retval = ms_set_rw_reg_addr(chip, 0, 0, Pro_TPCParm, 1);
3777        else
3778                retval = ms_set_rw_reg_addr(chip, 0, 0, Pro_DataCount1, 6);
3779
3780        if (retval != STATUS_SUCCESS)
3781                return STATUS_FAIL;
3782
3783        buf[0] = 0;
3784        buf[1] = 0;
3785        if (type == 1) {
3786                buf[2] = 0;
3787                buf[3] = 0;
3788                buf[4] = 0;
3789                buf[5] = mg_entry_num;
3790        }
3791        retval = ms_write_bytes(chip, PRO_WRITE_REG, (type == 0) ? 1 : 6,
3792                                NO_WAIT_INT, buf, 6);
3793        if (retval != STATUS_SUCCESS)
3794                return STATUS_FAIL;
3795
3796        return STATUS_SUCCESS;
3797}
3798
3799int mg_set_leaf_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3800{
3801        int retval;
3802        int i;
3803        unsigned int lun = SCSI_LUN(srb);
3804        u8 buf1[32], buf2[12];
3805
3806        if (scsi_bufflen(srb) < 12) {
3807                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3808                return STATUS_FAIL;
3809        }
3810
3811        ms_cleanup_work(chip);
3812
3813        retval = ms_switch_clock(chip);
3814        if (retval != STATUS_SUCCESS)
3815                return STATUS_FAIL;
3816
3817        retval = mg_send_ex_cmd(chip, MG_SET_LID, 0);
3818        if (retval != STATUS_SUCCESS) {
3819                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
3820                return STATUS_FAIL;
3821        }
3822
3823        memset(buf1, 0, 32);
3824        rtsx_stor_get_xfer_buf(buf2, min_t(int, 12, scsi_bufflen(srb)), srb);
3825        for (i = 0; i < 8; i++)
3826                buf1[8 + i] = buf2[4 + i];
3827
3828        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
3829                                buf1, 32);
3830        if (retval != STATUS_SUCCESS) {
3831                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
3832                return STATUS_FAIL;
3833        }
3834        if (check_ms_err(chip)) {
3835                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
3836                rtsx_clear_ms_error(chip);
3837                return STATUS_FAIL;
3838        }
3839
3840        return STATUS_SUCCESS;
3841}
3842
3843int mg_get_local_EKB(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3844{
3845        int retval = STATUS_FAIL;
3846        int bufflen;
3847        unsigned int lun = SCSI_LUN(srb);
3848        u8 *buf = NULL;
3849
3850        ms_cleanup_work(chip);
3851
3852        retval = ms_switch_clock(chip);
3853        if (retval != STATUS_SUCCESS)
3854                return STATUS_FAIL;
3855
3856        buf = kmalloc(1540, GFP_KERNEL);
3857        if (!buf)
3858                return STATUS_ERROR;
3859
3860        buf[0] = 0x04;
3861        buf[1] = 0x1A;
3862        buf[2] = 0x00;
3863        buf[3] = 0x00;
3864
3865        retval = mg_send_ex_cmd(chip, MG_GET_LEKB, 0);
3866        if (retval != STATUS_SUCCESS) {
3867                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3868                goto free_buffer;
3869        }
3870
3871        retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
3872                                  3, WAIT_INT, 0, 0, buf + 4, 1536);
3873        if (retval != STATUS_SUCCESS) {
3874                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3875                rtsx_clear_ms_error(chip);
3876                goto free_buffer;
3877        }
3878        if (check_ms_err(chip)) {
3879                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3880                rtsx_clear_ms_error(chip);
3881                retval = STATUS_FAIL;
3882                goto free_buffer;
3883        }
3884
3885        bufflen = min_t(int, 1052, scsi_bufflen(srb));
3886        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
3887
3888free_buffer:
3889        kfree(buf);
3890        return retval;
3891}
3892
3893int mg_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3894{
3895        struct ms_info *ms_card = &chip->ms_card;
3896        int retval;
3897        int bufflen;
3898        int i;
3899        unsigned int lun = SCSI_LUN(srb);
3900        u8 buf[32];
3901
3902        ms_cleanup_work(chip);
3903
3904        retval = ms_switch_clock(chip);
3905        if (retval != STATUS_SUCCESS)
3906                return STATUS_FAIL;
3907
3908        retval = mg_send_ex_cmd(chip, MG_GET_ID, 0);
3909        if (retval != STATUS_SUCCESS) {
3910                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3911                return STATUS_FAIL;
3912        }
3913
3914        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
3915                               buf, 32);
3916        if (retval != STATUS_SUCCESS) {
3917                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3918                return STATUS_FAIL;
3919        }
3920        if (check_ms_err(chip)) {
3921                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3922                rtsx_clear_ms_error(chip);
3923                return STATUS_FAIL;
3924        }
3925
3926        memcpy(ms_card->magic_gate_id, buf, 16);
3927
3928#ifdef READ_BYTES_WAIT_INT
3929        retval = ms_poll_int(chip);
3930        if (retval != STATUS_SUCCESS) {
3931                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3932                return STATUS_FAIL;
3933        }
3934#endif
3935
3936        retval = mg_send_ex_cmd(chip, MG_SET_RD, 0);
3937        if (retval != STATUS_SUCCESS) {
3938                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3939                return STATUS_FAIL;
3940        }
3941
3942        bufflen = min_t(int, 12, scsi_bufflen(srb));
3943        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
3944
3945        for (i = 0; i < 8; i++)
3946                buf[i] = buf[4 + i];
3947
3948        for (i = 0; i < 24; i++)
3949                buf[8 + i] = 0;
3950
3951        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA,
3952                                32, WAIT_INT, buf, 32);
3953        if (retval != STATUS_SUCCESS) {
3954                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3955                return STATUS_FAIL;
3956        }
3957        if (check_ms_err(chip)) {
3958                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3959                rtsx_clear_ms_error(chip);
3960                return STATUS_FAIL;
3961        }
3962
3963        ms_card->mg_auth = 0;
3964
3965        return STATUS_SUCCESS;
3966}
3967
3968int mg_get_rsp_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3969{
3970        struct ms_info *ms_card = &chip->ms_card;
3971        int retval;
3972        int bufflen;
3973        unsigned int lun = SCSI_LUN(srb);
3974        u8 buf1[32], buf2[36];
3975
3976        ms_cleanup_work(chip);
3977
3978        retval = ms_switch_clock(chip);
3979        if (retval != STATUS_SUCCESS)
3980                return STATUS_FAIL;
3981
3982        retval = mg_send_ex_cmd(chip, MG_MAKE_RMS, 0);
3983        if (retval != STATUS_SUCCESS) {
3984                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3985                return STATUS_FAIL;
3986        }
3987
3988        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
3989                               buf1, 32);
3990        if (retval != STATUS_SUCCESS) {
3991                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3992                return STATUS_FAIL;
3993        }
3994        if (check_ms_err(chip)) {
3995                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
3996                rtsx_clear_ms_error(chip);
3997                return STATUS_FAIL;
3998        }
3999
4000        buf2[0] = 0x00;
4001        buf2[1] = 0x22;
4002        buf2[2] = 0x00;
4003        buf2[3] = 0x00;
4004
4005        memcpy(buf2 + 4, ms_card->magic_gate_id, 16);
4006        memcpy(buf2 + 20, buf1, 16);
4007
4008        bufflen = min_t(int, 36, scsi_bufflen(srb));
4009        rtsx_stor_set_xfer_buf(buf2, bufflen, srb);
4010
4011#ifdef READ_BYTES_WAIT_INT
4012        retval = ms_poll_int(chip);
4013        if (retval != STATUS_SUCCESS) {
4014                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4015                return STATUS_FAIL;
4016        }
4017#endif
4018
4019        return STATUS_SUCCESS;
4020}
4021
4022int mg_rsp(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4023{
4024        struct ms_info *ms_card = &chip->ms_card;
4025        int retval;
4026        int i;
4027        int bufflen;
4028        unsigned int lun = SCSI_LUN(srb);
4029        u8 buf[32];
4030
4031        ms_cleanup_work(chip);
4032
4033        retval = ms_switch_clock(chip);
4034        if (retval != STATUS_SUCCESS)
4035                return STATUS_FAIL;
4036
4037        retval = mg_send_ex_cmd(chip, MG_MAKE_KSE, 0);
4038        if (retval != STATUS_SUCCESS) {
4039                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4040                return STATUS_FAIL;
4041        }
4042
4043        bufflen = min_t(int, 12, scsi_bufflen(srb));
4044        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
4045
4046        for (i = 0; i < 8; i++)
4047                buf[i] = buf[4 + i];
4048
4049        for (i = 0; i < 24; i++)
4050                buf[8 + i] = 0;
4051
4052        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
4053                                buf, 32);
4054        if (retval != STATUS_SUCCESS) {
4055                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4056                return STATUS_FAIL;
4057        }
4058        if (check_ms_err(chip)) {
4059                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4060                rtsx_clear_ms_error(chip);
4061                return STATUS_FAIL;
4062        }
4063
4064        ms_card->mg_auth = 1;
4065
4066        return STATUS_SUCCESS;
4067}
4068
4069int mg_get_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4070{
4071        struct ms_info *ms_card = &chip->ms_card;
4072        int retval;
4073        int bufflen;
4074        unsigned int lun = SCSI_LUN(srb);
4075        u8 *buf = NULL;
4076
4077        ms_cleanup_work(chip);
4078
4079        retval = ms_switch_clock(chip);
4080        if (retval != STATUS_SUCCESS)
4081                return STATUS_FAIL;
4082
4083        buf = kmalloc(1028, GFP_KERNEL);
4084        if (!buf)
4085                return STATUS_ERROR;
4086
4087        buf[0] = 0x04;
4088        buf[1] = 0x02;
4089        buf[2] = 0x00;
4090        buf[3] = 0x00;
4091
4092        retval = mg_send_ex_cmd(chip, MG_GET_IBD, ms_card->mg_entry_num);
4093        if (retval != STATUS_SUCCESS) {
4094                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4095                goto free_buffer;
4096        }
4097
4098        retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
4099                                  2, WAIT_INT, 0, 0, buf + 4, 1024);
4100        if (retval != STATUS_SUCCESS) {
4101                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4102                rtsx_clear_ms_error(chip);
4103                goto free_buffer;
4104        }
4105        if (check_ms_err(chip)) {
4106                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4107                rtsx_clear_ms_error(chip);
4108                retval = STATUS_FAIL;
4109                goto free_buffer;
4110        }
4111
4112        bufflen = min_t(int, 1028, scsi_bufflen(srb));
4113        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
4114
4115free_buffer:
4116        kfree(buf);
4117        return retval;
4118}
4119
4120int mg_set_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4121{
4122        struct ms_info *ms_card = &chip->ms_card;
4123        int retval;
4124        int bufflen;
4125#ifdef MG_SET_ICV_SLOW
4126        int i;
4127#endif
4128        unsigned int lun = SCSI_LUN(srb);
4129        u8 *buf = NULL;
4130
4131        ms_cleanup_work(chip);
4132
4133        retval = ms_switch_clock(chip);
4134        if (retval != STATUS_SUCCESS)
4135                return STATUS_FAIL;
4136
4137        buf = kmalloc(1028, GFP_KERNEL);
4138        if (!buf)
4139                return STATUS_ERROR;
4140
4141        bufflen = min_t(int, 1028, scsi_bufflen(srb));
4142        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
4143
4144        retval = mg_send_ex_cmd(chip, MG_SET_IBD, ms_card->mg_entry_num);
4145        if (retval != STATUS_SUCCESS) {
4146                if (ms_card->mg_auth == 0) {
4147                        if ((buf[5] & 0xC0) != 0)
4148                                set_sense_type
4149                                        (chip, lun,
4150                                        SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4151                        else
4152                                set_sense_type(chip, lun,
4153                                               SENSE_TYPE_MG_WRITE_ERR);
4154                } else {
4155                        set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
4156                }
4157                goto SetICVFinish;
4158        }
4159
4160#ifdef MG_SET_ICV_SLOW
4161        for (i = 0; i < 2; i++) {
4162                udelay(50);
4163
4164                rtsx_init_cmd(chip);
4165
4166                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
4167                             0xFF, PRO_WRITE_LONG_DATA);
4168                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, WAIT_INT);
4169                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
4170                             0x01, RING_BUFFER);
4171
4172                trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
4173
4174                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
4175                             MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
4176                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
4177                             MS_TRANSFER_END, MS_TRANSFER_END);
4178
4179                rtsx_send_cmd_no_wait(chip);
4180
4181                retval = rtsx_transfer_data(chip, MS_CARD, buf + 4 + i * 512,
4182                                            512, 0, DMA_TO_DEVICE, 3000);
4183                if ((retval < 0) || check_ms_err(chip)) {
4184                        rtsx_clear_ms_error(chip);
4185                        if (ms_card->mg_auth == 0) {
4186                                if ((buf[5] & 0xC0) != 0)
4187                                        set_sense_type
4188                                            (chip, lun,
4189                                             SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4190                                else
4191                                        set_sense_type(chip, lun,
4192                                                       SENSE_TYPE_MG_WRITE_ERR);
4193                        } else {
4194                                set_sense_type(chip, lun,
4195                                               SENSE_TYPE_MG_WRITE_ERR);
4196                        }
4197                        retval = STATUS_FAIL;
4198                        goto SetICVFinish;
4199                }
4200        }
4201#else
4202        retval = ms_transfer_data(chip, MS_TM_AUTO_WRITE, PRO_WRITE_LONG_DATA,
4203                                  2, WAIT_INT, 0, 0, buf + 4, 1024);
4204        if ((retval != STATUS_SUCCESS) || check_ms_err(chip)) {
4205                rtsx_clear_ms_error(chip);
4206                if (ms_card->mg_auth == 0) {
4207                        if ((buf[5] & 0xC0) != 0)
4208                                set_sense_type
4209                                    (chip, lun,
4210                                     SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4211                        else
4212                                set_sense_type(chip, lun,
4213                                               SENSE_TYPE_MG_WRITE_ERR);
4214                } else {
4215                        set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
4216                }
4217                goto SetICVFinish;
4218        }
4219#endif
4220
4221SetICVFinish:
4222        kfree(buf);
4223        return retval;
4224}
4225
4226#endif /* SUPPORT_MAGIC_GATE */
4227
4228void ms_cleanup_work(struct rtsx_chip *chip)
4229{
4230        struct ms_info *ms_card = &chip->ms_card;
4231
4232        if (CHK_MSPRO(ms_card)) {
4233                if (ms_card->seq_mode) {
4234                        dev_dbg(rtsx_dev(chip), "MS Pro: stop transmission\n");
4235                        mspro_stop_seq_mode(chip);
4236                        ms_card->cleanup_counter = 0;
4237                }
4238                if (CHK_MSHG(ms_card)) {
4239                        rtsx_write_register(chip, MS_CFG,
4240                                            MS_2K_SECTOR_MODE, 0x00);
4241                }
4242        }
4243#ifdef MS_DELAY_WRITE
4244        else if ((!CHK_MSPRO(ms_card)) &&
4245                 ms_card->delay_write.delay_write_flag) {
4246                dev_dbg(rtsx_dev(chip), "MS: delay write\n");
4247                ms_delay_write(chip);
4248                ms_card->cleanup_counter = 0;
4249        }
4250#endif
4251}
4252
4253int ms_power_off_card3v3(struct rtsx_chip *chip)
4254{
4255        int retval;
4256
4257        retval = disable_card_clock(chip, MS_CARD);
4258        if (retval != STATUS_SUCCESS)
4259                return STATUS_FAIL;
4260
4261        if (chip->asic_code) {
4262                retval = ms_pull_ctl_disable(chip);
4263                if (retval != STATUS_SUCCESS)
4264                        return STATUS_FAIL;
4265        } else {
4266                retval = rtsx_write_register(chip, FPGA_PULL_CTL,
4267                                             FPGA_MS_PULL_CTL_BIT | 0x20,
4268                                             FPGA_MS_PULL_CTL_BIT);
4269                if (retval)
4270                        return retval;
4271        }
4272        retval = rtsx_write_register(chip, CARD_OE, MS_OUTPUT_EN, 0);
4273        if (retval)
4274                return retval;
4275
4276        if (!chip->ft2_fast_mode) {
4277                retval = card_power_off(chip, MS_CARD);
4278                if (retval != STATUS_SUCCESS)
4279                        return STATUS_FAIL;
4280        }
4281
4282        return STATUS_SUCCESS;
4283}
4284
4285int release_ms_card(struct rtsx_chip *chip)
4286{
4287        struct ms_info *ms_card = &chip->ms_card;
4288        int retval;
4289
4290#ifdef MS_DELAY_WRITE
4291        ms_card->delay_write.delay_write_flag = 0;
4292#endif
4293        ms_card->pro_under_formatting = 0;
4294
4295        chip->card_ready &= ~MS_CARD;
4296        chip->card_fail &= ~MS_CARD;
4297        chip->card_wp &= ~MS_CARD;
4298
4299        ms_free_l2p_tbl(chip);
4300
4301        memset(ms_card->raw_sys_info, 0, 96);
4302#ifdef SUPPORT_PCGL_1P18
4303        memset(ms_card->raw_model_name, 0, 48);
4304#endif
4305
4306        retval = ms_power_off_card3v3(chip);
4307        if (retval != STATUS_SUCCESS)
4308                return STATUS_FAIL;
4309
4310        return STATUS_SUCCESS;
4311}
4312