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