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                {
1129                        sys_info_addr = ((u32)buf[cur_addr_off + 0] << 24) |
1130                                ((u32)buf[cur_addr_off + 1] << 16) |
1131                                ((u32)buf[cur_addr_off + 2] << 8) |
1132                                buf[cur_addr_off + 3];
1133                        sys_info_size = ((u32)buf[cur_addr_off + 4] << 24) |
1134                                ((u32)buf[cur_addr_off + 5] << 16) |
1135                                ((u32)buf[cur_addr_off + 6] << 8) |
1136                                buf[cur_addr_off + 7];
1137                        dev_dbg(rtsx_dev(chip), "sys_info_addr = 0x%x, sys_info_size = 0x%x\n",
1138                                sys_info_addr, sys_info_size);
1139                        if (sys_info_size != 96)  {
1140                                kfree(buf);
1141                                rtsx_trace(chip);
1142                                return STATUS_FAIL;
1143                        }
1144                        if (sys_info_addr < 0x1A0) {
1145                                kfree(buf);
1146                                rtsx_trace(chip);
1147                                return STATUS_FAIL;
1148                        }
1149                        if ((sys_info_size + sys_info_addr) > 0x8000) {
1150                                kfree(buf);
1151                                rtsx_trace(chip);
1152                                return STATUS_FAIL;
1153                        }
1154
1155#ifdef SUPPORT_MSXC
1156                        if (buf[cur_addr_off + 8] == 0x13)
1157                                ms_card->ms_type |= MS_XC;
1158#endif
1159#ifdef SUPPORT_PCGL_1P18
1160                        found_sys_info = 1;
1161#else
1162                        break;
1163#endif
1164                }
1165#ifdef SUPPORT_PCGL_1P18
1166                if (buf[cur_addr_off + 8] == 0x15) {
1167                        model_name_addr = ((u32)buf[cur_addr_off + 0] << 24) |
1168                                ((u32)buf[cur_addr_off + 1] << 16) |
1169                                ((u32)buf[cur_addr_off + 2] << 8) |
1170                                buf[cur_addr_off + 3];
1171                        model_name_size = ((u32)buf[cur_addr_off + 4] << 24) |
1172                                ((u32)buf[cur_addr_off + 5] << 16) |
1173                                ((u32)buf[cur_addr_off + 6] << 8) |
1174                                buf[cur_addr_off + 7];
1175                        dev_dbg(rtsx_dev(chip), "model_name_addr = 0x%x, model_name_size = 0x%x\n",
1176                                model_name_addr, model_name_size);
1177                        if (model_name_size != 48)  {
1178                                kfree(buf);
1179                                rtsx_trace(chip);
1180                                return STATUS_FAIL;
1181                        }
1182                        if (model_name_addr < 0x1A0) {
1183                                kfree(buf);
1184                                rtsx_trace(chip);
1185                                return STATUS_FAIL;
1186                        }
1187                        if ((model_name_size + model_name_addr) > 0x8000) {
1188                                kfree(buf);
1189                                rtsx_trace(chip);
1190                                return STATUS_FAIL;
1191                        }
1192
1193                        found_model_name = 1;
1194                }
1195
1196                if (found_sys_info && found_model_name)
1197                        break;
1198#endif
1199        }
1200
1201        if (i == buf[4]) {
1202                kfree(buf);
1203                rtsx_trace(chip);
1204                return STATUS_FAIL;
1205        }
1206
1207        class_code =  buf[sys_info_addr + 0];
1208        device_type = buf[sys_info_addr + 56];
1209        sub_class = buf[sys_info_addr + 46];
1210#ifdef SUPPORT_MSXC
1211        if (CHK_MSXC(ms_card)) {
1212                xc_total_blk = ((u32)buf[sys_info_addr + 6] << 24) |
1213                                ((u32)buf[sys_info_addr + 7] << 16) |
1214                                ((u32)buf[sys_info_addr + 8] << 8) |
1215                                buf[sys_info_addr + 9];
1216                xc_blk_size = ((u32)buf[sys_info_addr + 32] << 24) |
1217                                ((u32)buf[sys_info_addr + 33] << 16) |
1218                                ((u32)buf[sys_info_addr + 34] << 8) |
1219                                buf[sys_info_addr + 35];
1220                dev_dbg(rtsx_dev(chip), "xc_total_blk = 0x%x, xc_blk_size = 0x%x\n",
1221                        xc_total_blk, xc_blk_size);
1222        } else {
1223                total_blk = ((u16)buf[sys_info_addr + 6] << 8) |
1224                        buf[sys_info_addr + 7];
1225                blk_size = ((u16)buf[sys_info_addr + 2] << 8) |
1226                        buf[sys_info_addr + 3];
1227                dev_dbg(rtsx_dev(chip), "total_blk = 0x%x, blk_size = 0x%x\n",
1228                        total_blk, blk_size);
1229        }
1230#else
1231        total_blk = ((u16)buf[sys_info_addr + 6] << 8) | buf[sys_info_addr + 7];
1232        blk_size = ((u16)buf[sys_info_addr + 2] << 8) | buf[sys_info_addr + 3];
1233        dev_dbg(rtsx_dev(chip), "total_blk = 0x%x, blk_size = 0x%x\n",
1234                total_blk, blk_size);
1235#endif
1236
1237        dev_dbg(rtsx_dev(chip), "class_code = 0x%x, device_type = 0x%x, sub_class = 0x%x\n",
1238                class_code, device_type, sub_class);
1239
1240        memcpy(ms_card->raw_sys_info, buf + sys_info_addr, 96);
1241#ifdef SUPPORT_PCGL_1P18
1242        memcpy(ms_card->raw_model_name, buf + model_name_addr, 48);
1243#endif
1244
1245        kfree(buf);
1246
1247#ifdef SUPPORT_MSXC
1248        if (CHK_MSXC(ms_card)) {
1249                if (class_code != 0x03) {
1250                        rtsx_trace(chip);
1251                        return STATUS_FAIL;
1252                }
1253        } else {
1254                if (class_code != 0x02) {
1255                        rtsx_trace(chip);
1256                        return STATUS_FAIL;
1257                }
1258        }
1259#else
1260        if (class_code != 0x02) {
1261                rtsx_trace(chip);
1262                return STATUS_FAIL;
1263        }
1264#endif
1265
1266        if (device_type != 0x00) {
1267                if ((device_type == 0x01) || (device_type == 0x02) ||
1268                                (device_type == 0x03)) {
1269                        chip->card_wp |= MS_CARD;
1270                } else {
1271                        rtsx_trace(chip);
1272                        return STATUS_FAIL;
1273                }
1274        }
1275
1276        if (sub_class & 0xC0) {
1277                rtsx_trace(chip);
1278                return STATUS_FAIL;
1279        }
1280
1281        dev_dbg(rtsx_dev(chip), "class_code: 0x%x, device_type: 0x%x, sub_class: 0x%x\n",
1282                class_code, device_type, sub_class);
1283
1284#ifdef SUPPORT_MSXC
1285        if (CHK_MSXC(ms_card)) {
1286                chip->capacity[chip->card2lun[MS_CARD]] =
1287                        ms_card->capacity = xc_total_blk * xc_blk_size;
1288        } else {
1289                chip->capacity[chip->card2lun[MS_CARD]] =
1290                        ms_card->capacity = total_blk * blk_size;
1291        }
1292#else
1293        ms_card->capacity = total_blk * blk_size;
1294        chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;
1295#endif
1296
1297        return STATUS_SUCCESS;
1298}
1299
1300#ifdef SUPPORT_MAGIC_GATE
1301static int mg_set_tpc_para_sub(struct rtsx_chip *chip,
1302                        int type, u8 mg_entry_num);
1303#endif
1304
1305static int reset_ms_pro(struct rtsx_chip *chip)
1306{
1307        struct ms_info *ms_card = &(chip->ms_card);
1308        int retval;
1309#ifdef XC_POWERCLASS
1310        u8 change_power_class;
1311
1312        if (chip->ms_power_class_en & 0x02)
1313                change_power_class = 2;
1314        else if (chip->ms_power_class_en & 0x01)
1315                change_power_class = 1;
1316        else
1317                change_power_class = 0;
1318#endif
1319
1320#ifdef XC_POWERCLASS
1321Retry:
1322#endif
1323        retval = ms_pro_reset_flow(chip, 1);
1324        if (retval != STATUS_SUCCESS) {
1325                if (ms_card->switch_8bit_fail) {
1326                        retval = ms_pro_reset_flow(chip, 0);
1327                        if (retval != STATUS_SUCCESS) {
1328                                rtsx_trace(chip);
1329                                return STATUS_FAIL;
1330                        }
1331                } else {
1332                        rtsx_trace(chip);
1333                        return STATUS_FAIL;
1334                }
1335        }
1336
1337        retval = ms_read_attribute_info(chip);
1338        if (retval != STATUS_SUCCESS) {
1339                rtsx_trace(chip);
1340                return STATUS_FAIL;
1341        }
1342
1343#ifdef XC_POWERCLASS
1344        if (CHK_HG8BIT(ms_card))
1345                change_power_class = 0;
1346
1347        if (change_power_class && CHK_MSXC(ms_card)) {
1348                u8 power_class_en = chip->ms_power_class_en;
1349
1350                dev_dbg(rtsx_dev(chip), "power_class_en = 0x%x\n",
1351                        power_class_en);
1352                dev_dbg(rtsx_dev(chip), "change_power_class = %d\n",
1353                        change_power_class);
1354
1355                if (change_power_class)
1356                        power_class_en &= (1 << (change_power_class - 1));
1357                else
1358                        power_class_en = 0;
1359
1360                if (power_class_en) {
1361                        u8 power_class_mode =
1362                                (ms_card->raw_sys_info[46] & 0x18) >> 3;
1363                        dev_dbg(rtsx_dev(chip), "power_class_mode = 0x%x",
1364                                power_class_mode);
1365                        if (change_power_class > power_class_mode)
1366                                change_power_class = power_class_mode;
1367                        if (change_power_class) {
1368                                retval = msxc_change_power(chip,
1369                                                        change_power_class);
1370                                if (retval != STATUS_SUCCESS) {
1371                                        change_power_class--;
1372                                        goto Retry;
1373                                }
1374                        }
1375                }
1376        }
1377#endif
1378
1379#ifdef SUPPORT_MAGIC_GATE
1380        retval = mg_set_tpc_para_sub(chip, 0, 0);
1381        if (retval != STATUS_SUCCESS) {
1382                rtsx_trace(chip);
1383                return STATUS_FAIL;
1384        }
1385#endif
1386
1387        if (CHK_HG8BIT(ms_card))
1388                chip->card_bus_width[chip->card2lun[MS_CARD]] = 8;
1389        else
1390                chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
1391
1392        return STATUS_SUCCESS;
1393}
1394
1395static int ms_read_status_reg(struct rtsx_chip *chip)
1396{
1397        int retval;
1398        u8 val[2];
1399
1400        retval = ms_set_rw_reg_addr(chip, StatusReg0, 2, 0, 0);
1401        if (retval != STATUS_SUCCESS) {
1402                rtsx_trace(chip);
1403                return STATUS_FAIL;
1404        }
1405
1406        retval = ms_read_bytes(chip, READ_REG, 2, NO_WAIT_INT, val, 2);
1407        if (retval != STATUS_SUCCESS) {
1408                rtsx_trace(chip);
1409                return STATUS_FAIL;
1410        }
1411
1412        if (val[1] & (STS_UCDT | STS_UCEX | STS_UCFG)) {
1413                ms_set_err_code(chip, MS_FLASH_READ_ERROR);
1414                rtsx_trace(chip);
1415                return STATUS_FAIL;
1416        }
1417
1418        return STATUS_SUCCESS;
1419}
1420
1421
1422static int ms_read_extra_data(struct rtsx_chip *chip,
1423                u16 block_addr, u8 page_num, u8 *buf, int buf_len)
1424{
1425        struct ms_info *ms_card = &(chip->ms_card);
1426        int retval, i;
1427        u8 val, data[10];
1428
1429        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1430                                SystemParm, 6);
1431        if (retval != STATUS_SUCCESS) {
1432                rtsx_trace(chip);
1433                return STATUS_FAIL;
1434        }
1435
1436        if (CHK_MS4BIT(ms_card)) {
1437                /* Parallel interface */
1438                data[0] = 0x88;
1439        } else {
1440                /* Serial interface */
1441                data[0] = 0x80;
1442        }
1443        data[1] = 0;
1444        data[2] = (u8)(block_addr >> 8);
1445        data[3] = (u8)block_addr;
1446        data[4] = 0x40;
1447        data[5] = page_num;
1448
1449        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
1450                retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
1451                                        data, 6);
1452                if (retval == STATUS_SUCCESS)
1453                        break;
1454        }
1455        if (i == MS_MAX_RETRY_COUNT) {
1456                rtsx_trace(chip);
1457                return STATUS_FAIL;
1458        }
1459
1460        ms_set_err_code(chip, MS_NO_ERROR);
1461
1462        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
1463                retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
1464                if (retval == STATUS_SUCCESS)
1465                        break;
1466        }
1467        if (i == MS_MAX_RETRY_COUNT) {
1468                rtsx_trace(chip);
1469                return STATUS_FAIL;
1470        }
1471
1472        ms_set_err_code(chip, MS_NO_ERROR);
1473        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1474        if (retval != STATUS_SUCCESS) {
1475                rtsx_trace(chip);
1476                return STATUS_FAIL;
1477        }
1478
1479        if (val & INT_REG_CMDNK) {
1480                ms_set_err_code(chip, MS_CMD_NK);
1481                rtsx_trace(chip);
1482                return STATUS_FAIL;
1483        }
1484        if (val & INT_REG_CED) {
1485                if (val & INT_REG_ERR) {
1486                        retval = ms_read_status_reg(chip);
1487                        if (retval != STATUS_SUCCESS) {
1488                                rtsx_trace(chip);
1489                                return STATUS_FAIL;
1490                        }
1491
1492                        retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
1493                                                MS_EXTRA_SIZE, SystemParm, 6);
1494                        if (retval != STATUS_SUCCESS) {
1495                                rtsx_trace(chip);
1496                                return STATUS_FAIL;
1497                        }
1498                }
1499        }
1500
1501        retval = ms_read_bytes(chip, READ_REG, MS_EXTRA_SIZE, NO_WAIT_INT,
1502                        data, MS_EXTRA_SIZE);
1503        if (retval != STATUS_SUCCESS) {
1504                rtsx_trace(chip);
1505                return STATUS_FAIL;
1506        }
1507
1508        if (buf && buf_len) {
1509                if (buf_len > MS_EXTRA_SIZE)
1510                        buf_len = MS_EXTRA_SIZE;
1511                memcpy(buf, data, buf_len);
1512        }
1513
1514        return STATUS_SUCCESS;
1515}
1516
1517static int ms_write_extra_data(struct rtsx_chip *chip,
1518                u16 block_addr, u8 page_num, u8 *buf, int buf_len)
1519{
1520        struct ms_info *ms_card = &(chip->ms_card);
1521        int retval, i;
1522        u8 val, data[16];
1523
1524        if (!buf || (buf_len < MS_EXTRA_SIZE)) {
1525                rtsx_trace(chip);
1526                return STATUS_FAIL;
1527        }
1528
1529        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1530                                SystemParm, 6 + MS_EXTRA_SIZE);
1531        if (retval != STATUS_SUCCESS) {
1532                rtsx_trace(chip);
1533                return STATUS_FAIL;
1534        }
1535
1536        if (CHK_MS4BIT(ms_card))
1537                data[0] = 0x88;
1538        else
1539                data[0] = 0x80;
1540
1541        data[1] = 0;
1542        data[2] = (u8)(block_addr >> 8);
1543        data[3] = (u8)block_addr;
1544        data[4] = 0x40;
1545        data[5] = page_num;
1546
1547        for (i = 6; i < MS_EXTRA_SIZE + 6; i++)
1548                data[i] = buf[i - 6];
1549
1550        retval = ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
1551                                NO_WAIT_INT, data, 16);
1552        if (retval != STATUS_SUCCESS) {
1553                rtsx_trace(chip);
1554                return STATUS_FAIL;
1555        }
1556
1557        retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
1558        if (retval != STATUS_SUCCESS) {
1559                rtsx_trace(chip);
1560                return STATUS_FAIL;
1561        }
1562
1563        ms_set_err_code(chip, MS_NO_ERROR);
1564        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1565        if (retval != STATUS_SUCCESS) {
1566                rtsx_trace(chip);
1567                return STATUS_FAIL;
1568        }
1569
1570        if (val & INT_REG_CMDNK) {
1571                ms_set_err_code(chip, MS_CMD_NK);
1572                rtsx_trace(chip);
1573                return STATUS_FAIL;
1574        }
1575        if (val & INT_REG_CED) {
1576                if (val & INT_REG_ERR) {
1577                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
1578                        rtsx_trace(chip);
1579                        return STATUS_FAIL;
1580                }
1581        }
1582
1583        return STATUS_SUCCESS;
1584}
1585
1586
1587static int ms_read_page(struct rtsx_chip *chip, u16 block_addr, u8 page_num)
1588{
1589        struct ms_info *ms_card = &(chip->ms_card);
1590        int retval;
1591        u8 val, data[6];
1592
1593        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1594                                SystemParm, 6);
1595        if (retval != STATUS_SUCCESS) {
1596                rtsx_trace(chip);
1597                return STATUS_FAIL;
1598        }
1599
1600        if (CHK_MS4BIT(ms_card))
1601                data[0] = 0x88;
1602        else
1603                data[0] = 0x80;
1604
1605        data[1] = 0;
1606        data[2] = (u8)(block_addr >> 8);
1607        data[3] = (u8)block_addr;
1608        data[4] = 0x20;
1609        data[5] = page_num;
1610
1611        retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
1612        if (retval != STATUS_SUCCESS) {
1613                rtsx_trace(chip);
1614                return STATUS_FAIL;
1615        }
1616
1617        retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
1618        if (retval != STATUS_SUCCESS) {
1619                rtsx_trace(chip);
1620                return STATUS_FAIL;
1621        }
1622
1623        ms_set_err_code(chip, MS_NO_ERROR);
1624        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1625        if (retval != STATUS_SUCCESS) {
1626                rtsx_trace(chip);
1627                return STATUS_FAIL;
1628        }
1629
1630        if (val & INT_REG_CMDNK) {
1631                ms_set_err_code(chip, MS_CMD_NK);
1632                rtsx_trace(chip);
1633                return STATUS_FAIL;
1634        }
1635
1636        if (val & INT_REG_CED) {
1637                if (val & INT_REG_ERR) {
1638                        if (!(val & INT_REG_BREQ)) {
1639                                ms_set_err_code(chip,  MS_FLASH_READ_ERROR);
1640                                rtsx_trace(chip);
1641                                return STATUS_FAIL;
1642                        }
1643                        retval = ms_read_status_reg(chip);
1644                        if (retval != STATUS_SUCCESS)
1645                                ms_set_err_code(chip,  MS_FLASH_WRITE_ERROR);
1646
1647                } else {
1648                        if (!(val & INT_REG_BREQ)) {
1649                                ms_set_err_code(chip, MS_BREQ_ERROR);
1650                                rtsx_trace(chip);
1651                                return STATUS_FAIL;
1652                        }
1653                }
1654        }
1655
1656        retval = ms_transfer_tpc(chip, MS_TM_NORMAL_READ, READ_PAGE_DATA,
1657                                0, NO_WAIT_INT);
1658        if (retval != STATUS_SUCCESS) {
1659                rtsx_trace(chip);
1660                return STATUS_FAIL;
1661        }
1662
1663        if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR)) {
1664                rtsx_trace(chip);
1665                return STATUS_FAIL;
1666        }
1667
1668        return STATUS_SUCCESS;
1669}
1670
1671
1672static int ms_set_bad_block(struct rtsx_chip *chip, u16 phy_blk)
1673{
1674        struct ms_info *ms_card = &(chip->ms_card);
1675        int retval;
1676        u8 val, data[8], extra[MS_EXTRA_SIZE];
1677
1678        retval = ms_read_extra_data(chip, phy_blk, 0, extra, MS_EXTRA_SIZE);
1679        if (retval != STATUS_SUCCESS) {
1680                rtsx_trace(chip);
1681                return STATUS_FAIL;
1682        }
1683
1684        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1685                                SystemParm, 7);
1686        if (retval != STATUS_SUCCESS) {
1687                rtsx_trace(chip);
1688                return STATUS_FAIL;
1689        }
1690
1691        ms_set_err_code(chip, MS_NO_ERROR);
1692
1693        if (CHK_MS4BIT(ms_card))
1694                data[0] = 0x88;
1695        else
1696                data[0] = 0x80;
1697
1698        data[1] = 0;
1699        data[2] = (u8)(phy_blk >> 8);
1700        data[3] = (u8)phy_blk;
1701        data[4] = 0x80;
1702        data[5] = 0;
1703        data[6] = extra[0] & 0x7F;
1704        data[7] = 0xFF;
1705
1706        retval = ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT, data, 7);
1707        if (retval != STATUS_SUCCESS) {
1708                rtsx_trace(chip);
1709                return STATUS_FAIL;
1710        }
1711
1712        retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
1713        if (retval != STATUS_SUCCESS) {
1714                rtsx_trace(chip);
1715                return STATUS_FAIL;
1716        }
1717
1718        ms_set_err_code(chip, MS_NO_ERROR);
1719        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1720        if (retval != STATUS_SUCCESS) {
1721                rtsx_trace(chip);
1722                return STATUS_FAIL;
1723        }
1724
1725        if (val & INT_REG_CMDNK) {
1726                ms_set_err_code(chip, MS_CMD_NK);
1727                rtsx_trace(chip);
1728                return STATUS_FAIL;
1729        }
1730
1731        if (val & INT_REG_CED) {
1732                if (val & INT_REG_ERR) {
1733                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
1734                        rtsx_trace(chip);
1735                        return STATUS_FAIL;
1736                }
1737        }
1738
1739        return STATUS_SUCCESS;
1740}
1741
1742
1743static int ms_erase_block(struct rtsx_chip *chip, u16 phy_blk)
1744{
1745        struct ms_info *ms_card = &(chip->ms_card);
1746        int retval, i = 0;
1747        u8 val, data[6];
1748
1749        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
1750                                SystemParm, 6);
1751        if (retval != STATUS_SUCCESS) {
1752                rtsx_trace(chip);
1753                return STATUS_FAIL;
1754        }
1755
1756        ms_set_err_code(chip, MS_NO_ERROR);
1757
1758        if (CHK_MS4BIT(ms_card))
1759                data[0] = 0x88;
1760        else
1761                data[0] = 0x80;
1762
1763        data[1] = 0;
1764        data[2] = (u8)(phy_blk >> 8);
1765        data[3] = (u8)phy_blk;
1766        data[4] = 0;
1767        data[5] = 0;
1768
1769        retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT, data, 6);
1770        if (retval != STATUS_SUCCESS) {
1771                rtsx_trace(chip);
1772                return STATUS_FAIL;
1773        }
1774
1775ERASE_RTY:
1776        retval = ms_send_cmd(chip, BLOCK_ERASE, WAIT_INT);
1777        if (retval != STATUS_SUCCESS) {
1778                rtsx_trace(chip);
1779                return STATUS_FAIL;
1780        }
1781
1782        ms_set_err_code(chip, MS_NO_ERROR);
1783        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1784        if (retval != STATUS_SUCCESS) {
1785                rtsx_trace(chip);
1786                return STATUS_FAIL;
1787        }
1788
1789        if (val & INT_REG_CMDNK) {
1790                if (i < 3) {
1791                        i++;
1792                        goto ERASE_RTY;
1793                }
1794
1795                ms_set_err_code(chip, MS_CMD_NK);
1796                ms_set_bad_block(chip, phy_blk);
1797                rtsx_trace(chip);
1798                return STATUS_FAIL;
1799        }
1800
1801        if (val & INT_REG_CED) {
1802                if (val & INT_REG_ERR) {
1803                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
1804                        rtsx_trace(chip);
1805                        return STATUS_FAIL;
1806                }
1807        }
1808
1809        return STATUS_SUCCESS;
1810}
1811
1812
1813static void ms_set_page_status(u16 log_blk, u8 type, u8 *extra, int extra_len)
1814{
1815        if (!extra || (extra_len < MS_EXTRA_SIZE))
1816                return;
1817
1818        memset(extra, 0xFF, MS_EXTRA_SIZE);
1819
1820        if (type == setPS_NG) {
1821                /* set page status as 1:NG,and block status keep 1:OK */
1822                extra[0] = 0xB8;
1823        } else {
1824                /* set page status as 0:Data Error,and block status keep 1:OK */
1825                extra[0] = 0x98;
1826        }
1827
1828        extra[2] = (u8)(log_blk >> 8);
1829        extra[3] = (u8)log_blk;
1830}
1831
1832static int ms_init_page(struct rtsx_chip *chip, u16 phy_blk, u16 log_blk,
1833                        u8 start_page, u8 end_page)
1834{
1835        int retval;
1836        u8 extra[MS_EXTRA_SIZE], i;
1837
1838        memset(extra, 0xff, MS_EXTRA_SIZE);
1839
1840        extra[0] = 0xf8;        /* Block, page OK, data erased */
1841        extra[1] = 0xff;
1842        extra[2] = (u8)(log_blk >> 8);
1843        extra[3] = (u8)log_blk;
1844
1845        for (i = start_page; i < end_page; i++) {
1846                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
1847                        ms_set_err_code(chip, MS_NO_CARD);
1848                        rtsx_trace(chip);
1849                        return STATUS_FAIL;
1850                }
1851
1852                retval = ms_write_extra_data(chip, phy_blk, i,
1853                                        extra, MS_EXTRA_SIZE);
1854                if (retval != STATUS_SUCCESS) {
1855                        rtsx_trace(chip);
1856                        return STATUS_FAIL;
1857                }
1858        }
1859
1860        return STATUS_SUCCESS;
1861}
1862
1863static int ms_copy_page(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
1864                u16 log_blk, u8 start_page, u8 end_page)
1865{
1866        struct ms_info *ms_card = &(chip->ms_card);
1867        bool uncorrect_flag = false;
1868        int retval, rty_cnt;
1869        u8 extra[MS_EXTRA_SIZE], val, i, j, data[16];
1870
1871        dev_dbg(rtsx_dev(chip), "Copy page from 0x%x to 0x%x, logical block is 0x%x\n",
1872                old_blk, new_blk, log_blk);
1873        dev_dbg(rtsx_dev(chip), "start_page = %d, end_page = %d\n",
1874                start_page, end_page);
1875
1876        retval = ms_read_extra_data(chip, new_blk, 0, extra, MS_EXTRA_SIZE);
1877        if (retval != STATUS_SUCCESS) {
1878                rtsx_trace(chip);
1879                return STATUS_FAIL;
1880        }
1881
1882        retval = ms_read_status_reg(chip);
1883        if (retval != STATUS_SUCCESS) {
1884                rtsx_trace(chip);
1885                return STATUS_FAIL;
1886        }
1887
1888        retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
1889        if (retval) {
1890                rtsx_trace(chip);
1891                return retval;
1892        }
1893
1894        if (val & BUF_FULL) {
1895                retval = ms_send_cmd(chip, CLEAR_BUF, WAIT_INT);
1896                if (retval != STATUS_SUCCESS) {
1897                        rtsx_trace(chip);
1898                        return STATUS_FAIL;
1899                }
1900
1901                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1902                if (retval != STATUS_SUCCESS) {
1903                        rtsx_trace(chip);
1904                        return STATUS_FAIL;
1905                }
1906
1907                if (!(val & INT_REG_CED)) {
1908                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
1909                        rtsx_trace(chip);
1910                        return STATUS_FAIL;
1911                }
1912        }
1913
1914        for (i = start_page; i < end_page; i++) {
1915                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
1916                        ms_set_err_code(chip, MS_NO_CARD);
1917                        rtsx_trace(chip);
1918                        return STATUS_FAIL;
1919                }
1920
1921                ms_read_extra_data(chip, old_blk, i, extra, MS_EXTRA_SIZE);
1922
1923                retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
1924                                        MS_EXTRA_SIZE, SystemParm, 6);
1925                if (retval != STATUS_SUCCESS) {
1926                        rtsx_trace(chip);
1927                        return STATUS_FAIL;
1928                }
1929
1930                ms_set_err_code(chip, MS_NO_ERROR);
1931
1932                if (CHK_MS4BIT(ms_card))
1933                        data[0] = 0x88;
1934                else
1935                        data[0] = 0x80;
1936
1937                data[1] = 0;
1938                data[2] = (u8)(old_blk >> 8);
1939                data[3] = (u8)old_blk;
1940                data[4] = 0x20;
1941                data[5] = i;
1942
1943                retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
1944                                        data, 6);
1945                if (retval != STATUS_SUCCESS) {
1946                        rtsx_trace(chip);
1947                        return STATUS_FAIL;
1948                }
1949
1950                retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
1951                if (retval != STATUS_SUCCESS) {
1952                        rtsx_trace(chip);
1953                        return STATUS_FAIL;
1954                }
1955
1956                ms_set_err_code(chip, MS_NO_ERROR);
1957                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
1958                if (retval != STATUS_SUCCESS) {
1959                        rtsx_trace(chip);
1960                        return STATUS_FAIL;
1961                }
1962
1963                if (val & INT_REG_CMDNK) {
1964                        ms_set_err_code(chip, MS_CMD_NK);
1965                        rtsx_trace(chip);
1966                        return STATUS_FAIL;
1967                }
1968
1969                if (val & INT_REG_CED) {
1970                        if (val & INT_REG_ERR) {
1971                                retval = ms_read_status_reg(chip);
1972                                if (retval != STATUS_SUCCESS) {
1973                                        uncorrect_flag = true;
1974                                        dev_dbg(rtsx_dev(chip), "Uncorrectable error\n");
1975                                } else {
1976                                        uncorrect_flag = false;
1977                                }
1978
1979                                retval = ms_transfer_tpc(chip,
1980                                                        MS_TM_NORMAL_READ,
1981                                                        READ_PAGE_DATA,
1982                                                        0, NO_WAIT_INT);
1983                                if (retval != STATUS_SUCCESS) {
1984                                        rtsx_trace(chip);
1985                                        return STATUS_FAIL;
1986                                }
1987
1988                                if (uncorrect_flag) {
1989                                        ms_set_page_status(log_blk, setPS_NG,
1990                                                        extra, MS_EXTRA_SIZE);
1991                                        if (i == 0)
1992                                                extra[0] &= 0xEF;
1993
1994                                        ms_write_extra_data(chip, old_blk, i,
1995                                                        extra, MS_EXTRA_SIZE);
1996                                        dev_dbg(rtsx_dev(chip), "page %d : extra[0] = 0x%x\n",
1997                                                i, extra[0]);
1998                                        MS_SET_BAD_BLOCK_FLG(ms_card);
1999
2000                                        ms_set_page_status(log_blk, setPS_Error,
2001                                                        extra, MS_EXTRA_SIZE);
2002                                        ms_write_extra_data(chip, new_blk, i,
2003                                                        extra, MS_EXTRA_SIZE);
2004                                        continue;
2005                                }
2006
2007                                for (rty_cnt = 0; rty_cnt < MS_MAX_RETRY_COUNT;
2008                                     rty_cnt++) {
2009                                        retval = ms_transfer_tpc(
2010                                                chip,
2011                                                MS_TM_NORMAL_WRITE,
2012                                                WRITE_PAGE_DATA,
2013                                                0, NO_WAIT_INT);
2014                                        if (retval == STATUS_SUCCESS)
2015                                                break;
2016                                }
2017                                if (rty_cnt == MS_MAX_RETRY_COUNT) {
2018                                        rtsx_trace(chip);
2019                                        return STATUS_FAIL;
2020                                }
2021                        }
2022
2023                        if (!(val & INT_REG_BREQ)) {
2024                                ms_set_err_code(chip, MS_BREQ_ERROR);
2025                                rtsx_trace(chip);
2026                                return STATUS_FAIL;
2027                        }
2028                }
2029
2030                retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
2031                                MS_EXTRA_SIZE, SystemParm, (6 + MS_EXTRA_SIZE));
2032
2033                ms_set_err_code(chip, MS_NO_ERROR);
2034
2035                if (CHK_MS4BIT(ms_card))
2036                        data[0] = 0x88;
2037                else
2038                        data[0] = 0x80;
2039
2040                data[1] = 0;
2041                data[2] = (u8)(new_blk >> 8);
2042                data[3] = (u8)new_blk;
2043                data[4] = 0x20;
2044                data[5] = i;
2045
2046                if ((extra[0] & 0x60) != 0x60)
2047                        data[6] = extra[0];
2048                else
2049                        data[6] = 0xF8;
2050
2051                data[6 + 1] = 0xFF;
2052                data[6 + 2] = (u8)(log_blk >> 8);
2053                data[6 + 3] = (u8)log_blk;
2054
2055                for (j = 4; j <= MS_EXTRA_SIZE; j++)
2056                        data[6 + j] = 0xFF;
2057
2058                retval = ms_write_bytes(chip, WRITE_REG, (6 + MS_EXTRA_SIZE),
2059                                        NO_WAIT_INT, data, 16);
2060                if (retval != STATUS_SUCCESS) {
2061                        rtsx_trace(chip);
2062                        return STATUS_FAIL;
2063                }
2064
2065                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
2066                if (retval != STATUS_SUCCESS) {
2067                        rtsx_trace(chip);
2068                        return STATUS_FAIL;
2069                }
2070
2071                ms_set_err_code(chip, MS_NO_ERROR);
2072                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
2073                if (retval != STATUS_SUCCESS) {
2074                        rtsx_trace(chip);
2075                        return STATUS_FAIL;
2076                }
2077
2078                if (val & INT_REG_CMDNK) {
2079                        ms_set_err_code(chip, MS_CMD_NK);
2080                        rtsx_trace(chip);
2081                        return STATUS_FAIL;
2082                }
2083
2084                if (val & INT_REG_CED) {
2085                        if (val & INT_REG_ERR) {
2086                                ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
2087                                rtsx_trace(chip);
2088                                return STATUS_FAIL;
2089                        }
2090                }
2091
2092                if (i == 0) {
2093                        retval = ms_set_rw_reg_addr(chip, OverwriteFlag,
2094                                                MS_EXTRA_SIZE, SystemParm, 7);
2095                        if (retval != STATUS_SUCCESS) {
2096                                rtsx_trace(chip);
2097                                return STATUS_FAIL;
2098                        }
2099
2100                        ms_set_err_code(chip, MS_NO_ERROR);
2101
2102                        if (CHK_MS4BIT(ms_card))
2103                                data[0] = 0x88;
2104                        else
2105                                data[0] = 0x80;
2106
2107                        data[1] = 0;
2108                        data[2] = (u8)(old_blk >> 8);
2109                        data[3] = (u8)old_blk;
2110                        data[4] = 0x80;
2111                        data[5] = 0;
2112                        data[6] = 0xEF;
2113                        data[7] = 0xFF;
2114
2115                        retval = ms_write_bytes(chip, WRITE_REG, 7,
2116                                                NO_WAIT_INT, data, 8);
2117                        if (retval != STATUS_SUCCESS) {
2118                                rtsx_trace(chip);
2119                                return STATUS_FAIL;
2120                        }
2121
2122                        retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
2123                        if (retval != STATUS_SUCCESS) {
2124                                rtsx_trace(chip);
2125                                return STATUS_FAIL;
2126                        }
2127
2128                        ms_set_err_code(chip, MS_NO_ERROR);
2129                        retval = ms_read_bytes(chip, GET_INT, 1,
2130                                        NO_WAIT_INT, &val, 1);
2131                        if (retval != STATUS_SUCCESS) {
2132                                rtsx_trace(chip);
2133                                return STATUS_FAIL;
2134                        }
2135
2136                        if (val & INT_REG_CMDNK) {
2137                                ms_set_err_code(chip, MS_CMD_NK);
2138                                rtsx_trace(chip);
2139                                return STATUS_FAIL;
2140                        }
2141
2142                        if (val & INT_REG_CED) {
2143                                if (val & INT_REG_ERR) {
2144                                        ms_set_err_code(chip,
2145                                                        MS_FLASH_WRITE_ERROR);
2146                                        rtsx_trace(chip);
2147                                        return STATUS_FAIL;
2148                                }
2149                        }
2150                }
2151        }
2152
2153        return STATUS_SUCCESS;
2154}
2155
2156
2157static int reset_ms(struct rtsx_chip *chip)
2158{
2159        struct ms_info *ms_card = &(chip->ms_card);
2160        int retval;
2161        u16 i, reg_addr, block_size;
2162        u8 val, extra[MS_EXTRA_SIZE], j, *ptr;
2163#ifndef SUPPORT_MAGIC_GATE
2164        u16 eblock_cnt;
2165#endif
2166
2167        retval = ms_prepare_reset(chip);
2168        if (retval != STATUS_SUCCESS) {
2169                rtsx_trace(chip);
2170                return STATUS_FAIL;
2171        }
2172
2173        ms_card->ms_type |= TYPE_MS;
2174
2175        retval = ms_send_cmd(chip, MS_RESET, NO_WAIT_INT);
2176        if (retval != STATUS_SUCCESS) {
2177                rtsx_trace(chip);
2178                return STATUS_FAIL;
2179        }
2180
2181        retval = ms_read_status_reg(chip);
2182        if (retval != STATUS_SUCCESS) {
2183                rtsx_trace(chip);
2184                return STATUS_FAIL;
2185        }
2186
2187        retval = rtsx_read_register(chip, PPBUF_BASE2, &val);
2188        if (retval) {
2189                rtsx_trace(chip);
2190                return retval;
2191        }
2192        if (val & WRT_PRTCT)
2193                chip->card_wp |= MS_CARD;
2194        else
2195                chip->card_wp &= ~MS_CARD;
2196
2197        i = 0;
2198
2199RE_SEARCH:
2200        /* Search Boot Block */
2201        while (i < (MAX_DEFECTIVE_BLOCK + 2)) {
2202                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
2203                        ms_set_err_code(chip, MS_NO_CARD);
2204                        rtsx_trace(chip);
2205                        return STATUS_FAIL;
2206                }
2207
2208                retval = ms_read_extra_data(chip, i, 0, extra, MS_EXTRA_SIZE);
2209                if (retval != STATUS_SUCCESS) {
2210                        i++;
2211                        continue;
2212                }
2213
2214                if (extra[0] & BLOCK_OK) {
2215                        if (!(extra[1] & NOT_BOOT_BLOCK)) {
2216                                ms_card->boot_block = i;
2217                                break;
2218                        }
2219                }
2220                i++;
2221        }
2222
2223        if (i == (MAX_DEFECTIVE_BLOCK + 2)) {
2224                dev_dbg(rtsx_dev(chip), "No boot block found!");
2225                rtsx_trace(chip);
2226                return STATUS_FAIL;
2227        }
2228
2229        for (j = 0; j < 3; j++) {
2230                retval = ms_read_page(chip, ms_card->boot_block, j);
2231                if (retval != STATUS_SUCCESS) {
2232                        if (ms_check_err_code(chip, MS_FLASH_WRITE_ERROR)) {
2233                                i = ms_card->boot_block + 1;
2234                                ms_set_err_code(chip, MS_NO_ERROR);
2235                                goto RE_SEARCH;
2236                        }
2237                }
2238        }
2239
2240        retval = ms_read_page(chip, ms_card->boot_block, 0);
2241        if (retval != STATUS_SUCCESS) {
2242                rtsx_trace(chip);
2243                return STATUS_FAIL;
2244        }
2245
2246        /* Read MS system information as sys_info */
2247        rtsx_init_cmd(chip);
2248
2249        for (i = 0; i < 96; i++)
2250                rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 0x1A0 + i, 0, 0);
2251
2252        retval = rtsx_send_cmd(chip, MS_CARD, 100);
2253        if (retval < 0) {
2254                rtsx_trace(chip);
2255                return STATUS_FAIL;
2256        }
2257
2258        ptr = rtsx_get_cmd_data(chip);
2259        memcpy(ms_card->raw_sys_info, ptr, 96);
2260
2261        /* Read useful block contents */
2262        rtsx_init_cmd(chip);
2263
2264        rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID0, 0, 0);
2265        rtsx_add_cmd(chip, READ_REG_CMD, HEADER_ID1, 0, 0);
2266
2267        for (reg_addr = DISABLED_BLOCK0; reg_addr <= DISABLED_BLOCK3;
2268             reg_addr++)
2269                rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
2270
2271        for (reg_addr = BLOCK_SIZE_0; reg_addr <= PAGE_SIZE_1; reg_addr++)
2272                rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
2273
2274        rtsx_add_cmd(chip, READ_REG_CMD, MS_Device_Type, 0, 0);
2275        rtsx_add_cmd(chip, READ_REG_CMD, MS_4bit_Support, 0, 0);
2276
2277        retval = rtsx_send_cmd(chip, MS_CARD, 100);
2278        if (retval < 0) {
2279                rtsx_trace(chip);
2280                return STATUS_FAIL;
2281        }
2282
2283        ptr = rtsx_get_cmd_data(chip);
2284
2285        dev_dbg(rtsx_dev(chip), "Boot block data:\n");
2286        dev_dbg(rtsx_dev(chip), "%*ph\n", 16, ptr);
2287
2288        /* Block ID error
2289         * HEADER_ID0, HEADER_ID1
2290         */
2291        if (ptr[0] != 0x00 || ptr[1] != 0x01) {
2292                i = ms_card->boot_block + 1;
2293                goto RE_SEARCH;
2294        }
2295
2296        /* Page size error
2297         * PAGE_SIZE_0, PAGE_SIZE_1
2298         */
2299        if (ptr[12] != 0x02 || ptr[13] != 0x00) {
2300                i = ms_card->boot_block + 1;
2301                goto RE_SEARCH;
2302        }
2303
2304        if ((ptr[14] == 1) || (ptr[14] == 3))
2305                chip->card_wp |= MS_CARD;
2306
2307        /* BLOCK_SIZE_0, BLOCK_SIZE_1 */
2308        block_size = ((u16)ptr[6] << 8) | ptr[7];
2309        if (block_size == 0x0010) {
2310                /* Block size 16KB */
2311                ms_card->block_shift = 5;
2312                ms_card->page_off = 0x1F;
2313        } else if (block_size == 0x0008) {
2314                /* Block size 8KB */
2315                ms_card->block_shift = 4;
2316                ms_card->page_off = 0x0F;
2317        }
2318
2319        /* BLOCK_COUNT_0, BLOCK_COUNT_1 */
2320        ms_card->total_block = ((u16)ptr[8] << 8) | ptr[9];
2321
2322#ifdef SUPPORT_MAGIC_GATE
2323        j = ptr[10];
2324
2325        if (ms_card->block_shift == 4)  { /* 4MB or 8MB */
2326                if (j < 2)  { /* Effective block for 4MB: 0x1F0 */
2327                        ms_card->capacity = 0x1EE0;
2328                } else { /* Effective block for 8MB: 0x3E0 */
2329                        ms_card->capacity = 0x3DE0;
2330                }
2331        } else  { /* 16MB, 32MB, 64MB or 128MB */
2332                if (j < 5)  { /* Effective block for 16MB: 0x3E0 */
2333                        ms_card->capacity = 0x7BC0;
2334                } else if (j < 0xA) { /* Effective block for 32MB: 0x7C0 */
2335                        ms_card->capacity = 0xF7C0;
2336                } else if (j < 0x11) { /* Effective block for 64MB: 0xF80 */
2337                        ms_card->capacity = 0x1EF80;
2338                } else { /* Effective block for 128MB: 0x1F00 */
2339                        ms_card->capacity = 0x3DF00;
2340                }
2341        }
2342#else
2343        /* EBLOCK_COUNT_0, EBLOCK_COUNT_1 */
2344        eblock_cnt = ((u16)ptr[10] << 8) | ptr[11];
2345
2346        ms_card->capacity = ((u32)eblock_cnt - 2) << ms_card->block_shift;
2347#endif
2348
2349        chip->capacity[chip->card2lun[MS_CARD]] = ms_card->capacity;
2350
2351        /* Switch I/F Mode */
2352        if (ptr[15]) {
2353                retval = ms_set_rw_reg_addr(chip, 0, 0, SystemParm, 1);
2354                if (retval != STATUS_SUCCESS) {
2355                        rtsx_trace(chip);
2356                        return STATUS_FAIL;
2357                }
2358
2359                retval = rtsx_write_register(chip, PPBUF_BASE2, 0xFF, 0x88);
2360                if (retval) {
2361                        rtsx_trace(chip);
2362                        return retval;
2363                }
2364                retval = rtsx_write_register(chip, PPBUF_BASE2 + 1, 0xFF, 0);
2365                if (retval) {
2366                        rtsx_trace(chip);
2367                        return retval;
2368                }
2369
2370                retval = ms_transfer_tpc(chip, MS_TM_WRITE_BYTES, WRITE_REG, 1,
2371                                        NO_WAIT_INT);
2372                if (retval != STATUS_SUCCESS) {
2373                        rtsx_trace(chip);
2374                        return STATUS_FAIL;
2375                }
2376
2377                retval = rtsx_write_register(chip, MS_CFG,
2378                                             0x58 | MS_NO_CHECK_INT,
2379                                             MS_BUS_WIDTH_4 | PUSH_TIME_ODD | MS_NO_CHECK_INT);
2380                if (retval) {
2381                        rtsx_trace(chip);
2382                        return retval;
2383                }
2384
2385                ms_card->ms_type |= MS_4BIT;
2386        }
2387
2388        if (CHK_MS4BIT(ms_card))
2389                chip->card_bus_width[chip->card2lun[MS_CARD]] = 4;
2390        else
2391                chip->card_bus_width[chip->card2lun[MS_CARD]] = 1;
2392
2393        return STATUS_SUCCESS;
2394}
2395
2396static int ms_init_l2p_tbl(struct rtsx_chip *chip)
2397{
2398        struct ms_info *ms_card = &(chip->ms_card);
2399        int size, i, seg_no, retval;
2400        u16 defect_block, reg_addr;
2401        u8 val1, val2;
2402
2403        ms_card->segment_cnt = ms_card->total_block >> 9;
2404        dev_dbg(rtsx_dev(chip), "ms_card->segment_cnt = %d\n",
2405                ms_card->segment_cnt);
2406
2407        size = ms_card->segment_cnt * sizeof(struct zone_entry);
2408        ms_card->segment = vzalloc(size);
2409        if (ms_card->segment == NULL) {
2410                rtsx_trace(chip);
2411                return STATUS_FAIL;
2412        }
2413
2414        retval = ms_read_page(chip, ms_card->boot_block, 1);
2415        if (retval != STATUS_SUCCESS) {
2416                rtsx_trace(chip);
2417                goto INIT_FAIL;
2418        }
2419
2420        reg_addr = PPBUF_BASE2;
2421        for (i = 0; i < (((ms_card->total_block >> 9) * 10) + 1); i++) {
2422                int block_no;
2423
2424                retval = rtsx_read_register(chip, reg_addr++, &val1);
2425                if (retval != STATUS_SUCCESS) {
2426                        rtsx_trace(chip);
2427                        goto INIT_FAIL;
2428                }
2429
2430                retval = rtsx_read_register(chip, reg_addr++, &val2);
2431                if (retval != STATUS_SUCCESS) {
2432                        rtsx_trace(chip);
2433                        goto INIT_FAIL;
2434                }
2435
2436                defect_block = ((u16)val1 << 8) | val2;
2437                if (defect_block == 0xFFFF)
2438                        break;
2439
2440                seg_no = defect_block / 512;
2441
2442                block_no = ms_card->segment[seg_no].disable_count++;
2443                ms_card->segment[seg_no].defect_list[block_no] = defect_block;
2444        }
2445
2446        for (i = 0; i < ms_card->segment_cnt; i++) {
2447                ms_card->segment[i].build_flag = 0;
2448                ms_card->segment[i].l2p_table = NULL;
2449                ms_card->segment[i].free_table = NULL;
2450                ms_card->segment[i].get_index = 0;
2451                ms_card->segment[i].set_index = 0;
2452                ms_card->segment[i].unused_blk_cnt = 0;
2453
2454                dev_dbg(rtsx_dev(chip), "defective block count of segment %d is %d\n",
2455                        i, ms_card->segment[i].disable_count);
2456        }
2457
2458        return STATUS_SUCCESS;
2459
2460INIT_FAIL:
2461        if (ms_card->segment) {
2462                vfree(ms_card->segment);
2463                ms_card->segment = NULL;
2464        }
2465
2466        return STATUS_FAIL;
2467}
2468
2469static u16 ms_get_l2p_tbl(struct rtsx_chip *chip, int seg_no, u16 log_off)
2470{
2471        struct ms_info *ms_card = &(chip->ms_card);
2472        struct zone_entry *segment;
2473
2474        if (ms_card->segment == NULL)
2475                return 0xFFFF;
2476
2477        segment = &(ms_card->segment[seg_no]);
2478
2479        if (segment->l2p_table)
2480                return segment->l2p_table[log_off];
2481
2482        return 0xFFFF;
2483}
2484
2485static void ms_set_l2p_tbl(struct rtsx_chip *chip,
2486                        int seg_no, u16 log_off, u16 phy_blk)
2487{
2488        struct ms_info *ms_card = &(chip->ms_card);
2489        struct zone_entry *segment;
2490
2491        if (ms_card->segment == NULL)
2492                return;
2493
2494        segment = &(ms_card->segment[seg_no]);
2495        if (segment->l2p_table)
2496                segment->l2p_table[log_off] = phy_blk;
2497}
2498
2499static void ms_set_unused_block(struct rtsx_chip *chip, u16 phy_blk)
2500{
2501        struct ms_info *ms_card = &(chip->ms_card);
2502        struct zone_entry *segment;
2503        int seg_no;
2504
2505        seg_no = (int)phy_blk >> 9;
2506        segment = &(ms_card->segment[seg_no]);
2507
2508        segment->free_table[segment->set_index++] = phy_blk;
2509        if (segment->set_index >= MS_FREE_TABLE_CNT)
2510                segment->set_index = 0;
2511
2512        segment->unused_blk_cnt++;
2513}
2514
2515static u16 ms_get_unused_block(struct rtsx_chip *chip, int seg_no)
2516{
2517        struct ms_info *ms_card = &(chip->ms_card);
2518        struct zone_entry *segment;
2519        u16 phy_blk;
2520
2521        segment = &(ms_card->segment[seg_no]);
2522
2523        if (segment->unused_blk_cnt <= 0)
2524                return 0xFFFF;
2525
2526        phy_blk = segment->free_table[segment->get_index];
2527        segment->free_table[segment->get_index++] = 0xFFFF;
2528        if (segment->get_index >= MS_FREE_TABLE_CNT)
2529                segment->get_index = 0;
2530
2531        segment->unused_blk_cnt--;
2532
2533        return phy_blk;
2534}
2535
2536static const unsigned short ms_start_idx[] = {0, 494, 990, 1486, 1982, 2478,
2537                                              2974, 3470, 3966, 4462, 4958,
2538                                              5454, 5950, 6446, 6942, 7438,
2539                                              7934};
2540
2541static int ms_arbitrate_l2p(struct rtsx_chip *chip, u16 phy_blk,
2542                        u16 log_off, u8 us1, u8 us2)
2543{
2544        struct ms_info *ms_card = &(chip->ms_card);
2545        struct zone_entry *segment;
2546        int seg_no;
2547        u16 tmp_blk;
2548
2549        seg_no = (int)phy_blk >> 9;
2550        segment = &(ms_card->segment[seg_no]);
2551        tmp_blk = segment->l2p_table[log_off];
2552
2553        if (us1 != us2) {
2554                if (us1 == 0) {
2555                        if (!(chip->card_wp & MS_CARD))
2556                                ms_erase_block(chip, tmp_blk);
2557
2558                        ms_set_unused_block(chip, tmp_blk);
2559                        segment->l2p_table[log_off] = phy_blk;
2560                } else {
2561                        if (!(chip->card_wp & MS_CARD))
2562                                ms_erase_block(chip, phy_blk);
2563
2564                        ms_set_unused_block(chip, phy_blk);
2565                }
2566        } else {
2567                if (phy_blk < tmp_blk) {
2568                        if (!(chip->card_wp & MS_CARD))
2569                                ms_erase_block(chip, phy_blk);
2570
2571                        ms_set_unused_block(chip, phy_blk);
2572                } else {
2573                        if (!(chip->card_wp & MS_CARD))
2574                                ms_erase_block(chip, tmp_blk);
2575
2576                        ms_set_unused_block(chip, tmp_blk);
2577                        segment->l2p_table[log_off] = phy_blk;
2578                }
2579        }
2580
2581        return STATUS_SUCCESS;
2582}
2583
2584static int ms_build_l2p_tbl(struct rtsx_chip *chip, int seg_no)
2585{
2586        struct ms_info *ms_card = &(chip->ms_card);
2587        struct zone_entry *segment;
2588        bool defect_flag;
2589        int retval, table_size, disable_cnt, i;
2590        u16 start, end, phy_blk, log_blk, tmp_blk, idx;
2591        u8 extra[MS_EXTRA_SIZE], us1, us2;
2592
2593        dev_dbg(rtsx_dev(chip), "ms_build_l2p_tbl: %d\n", seg_no);
2594
2595        if (ms_card->segment == NULL) {
2596                retval = ms_init_l2p_tbl(chip);
2597                if (retval != STATUS_SUCCESS) {
2598                        rtsx_trace(chip);
2599                        return retval;
2600                }
2601        }
2602
2603        if (ms_card->segment[seg_no].build_flag) {
2604                dev_dbg(rtsx_dev(chip), "l2p table of segment %d has been built\n",
2605                        seg_no);
2606                return STATUS_SUCCESS;
2607        }
2608
2609        if (seg_no == 0)
2610                table_size = 494;
2611        else
2612                table_size = 496;
2613
2614        segment = &(ms_card->segment[seg_no]);
2615
2616        if (segment->l2p_table == NULL) {
2617                segment->l2p_table = vmalloc(table_size * 2);
2618                if (segment->l2p_table == NULL) {
2619                        rtsx_trace(chip);
2620                        goto BUILD_FAIL;
2621                }
2622        }
2623        memset((u8 *)(segment->l2p_table), 0xff, table_size * 2);
2624
2625        if (segment->free_table == NULL) {
2626                segment->free_table = vmalloc(MS_FREE_TABLE_CNT * 2);
2627                if (segment->free_table == NULL) {
2628                        rtsx_trace(chip);
2629                        goto BUILD_FAIL;
2630                }
2631        }
2632        memset((u8 *)(segment->free_table), 0xff, MS_FREE_TABLE_CNT * 2);
2633
2634        start = (u16)seg_no << 9;
2635        end = (u16)(seg_no + 1) << 9;
2636
2637        disable_cnt = segment->disable_count;
2638
2639        segment->get_index = segment->set_index = 0;
2640        segment->unused_blk_cnt = 0;
2641
2642        for (phy_blk = start; phy_blk < end; phy_blk++) {
2643                if (disable_cnt) {
2644                        defect_flag = false;
2645                        for (i = 0; i < segment->disable_count; i++) {
2646                                if (phy_blk == segment->defect_list[i]) {
2647                                        defect_flag = true;
2648                                        break;
2649                                }
2650                        }
2651                        if (defect_flag) {
2652                                disable_cnt--;
2653                                continue;
2654                        }
2655                }
2656
2657                retval = ms_read_extra_data(chip, phy_blk, 0,
2658                                        extra, MS_EXTRA_SIZE);
2659                if (retval != STATUS_SUCCESS) {
2660                        dev_dbg(rtsx_dev(chip), "read extra data fail\n");
2661                        ms_set_bad_block(chip, phy_blk);
2662                        continue;
2663                }
2664
2665                if (seg_no == ms_card->segment_cnt - 1) {
2666                        if (!(extra[1] & NOT_TRANSLATION_TABLE)) {
2667                                if (!(chip->card_wp & MS_CARD)) {
2668                                        retval = ms_erase_block(chip, phy_blk);
2669                                        if (retval != STATUS_SUCCESS)
2670                                                continue;
2671                                        extra[2] = 0xff;
2672                                        extra[3] = 0xff;
2673                                }
2674                        }
2675                }
2676
2677                if (!(extra[0] & BLOCK_OK))
2678                        continue;
2679                if (!(extra[1] & NOT_BOOT_BLOCK))
2680                        continue;
2681                if ((extra[0] & PAGE_OK) != PAGE_OK)
2682                        continue;
2683
2684                log_blk = ((u16)extra[2] << 8) | extra[3];
2685
2686                if (log_blk == 0xFFFF) {
2687                        if (!(chip->card_wp & MS_CARD)) {
2688                                retval = ms_erase_block(chip, phy_blk);
2689                                if (retval != STATUS_SUCCESS)
2690                                        continue;
2691                        }
2692                        ms_set_unused_block(chip, phy_blk);
2693                        continue;
2694                }
2695
2696                if ((log_blk < ms_start_idx[seg_no]) ||
2697                                (log_blk >= ms_start_idx[seg_no+1])) {
2698                        if (!(chip->card_wp & MS_CARD)) {
2699                                retval = ms_erase_block(chip, phy_blk);
2700                                if (retval != STATUS_SUCCESS)
2701                                        continue;
2702                        }
2703                        ms_set_unused_block(chip, phy_blk);
2704                        continue;
2705                }
2706
2707                idx = log_blk - ms_start_idx[seg_no];
2708
2709                if (segment->l2p_table[idx] == 0xFFFF) {
2710                        segment->l2p_table[idx] = phy_blk;
2711                        continue;
2712                }
2713
2714                us1 = extra[0] & 0x10;
2715                tmp_blk = segment->l2p_table[idx];
2716                retval = ms_read_extra_data(chip, tmp_blk, 0,
2717                                        extra, MS_EXTRA_SIZE);
2718                if (retval != STATUS_SUCCESS)
2719                        continue;
2720                us2 = extra[0] & 0x10;
2721
2722                (void)ms_arbitrate_l2p(chip, phy_blk,
2723                                log_blk-ms_start_idx[seg_no], us1, us2);
2724                continue;
2725        }
2726
2727        segment->build_flag = 1;
2728
2729        dev_dbg(rtsx_dev(chip), "unused block count: %d\n",
2730                segment->unused_blk_cnt);
2731
2732        /* Logical Address Confirmation Process */
2733        if (seg_no == ms_card->segment_cnt - 1) {
2734                if (segment->unused_blk_cnt < 2)
2735                        chip->card_wp |= MS_CARD;
2736        } else {
2737                if (segment->unused_blk_cnt < 1)
2738                        chip->card_wp |= MS_CARD;
2739        }
2740
2741        if (chip->card_wp & MS_CARD)
2742                return STATUS_SUCCESS;
2743
2744        for (log_blk = ms_start_idx[seg_no];
2745             log_blk < ms_start_idx[seg_no + 1]; log_blk++) {
2746                idx = log_blk - ms_start_idx[seg_no];
2747                if (segment->l2p_table[idx] == 0xFFFF) {
2748                        phy_blk = ms_get_unused_block(chip, seg_no);
2749                        if (phy_blk == 0xFFFF) {
2750                                chip->card_wp |= MS_CARD;
2751                                return STATUS_SUCCESS;
2752                        }
2753                        retval = ms_init_page(chip, phy_blk, log_blk, 0, 1);
2754                        if (retval != STATUS_SUCCESS) {
2755                                rtsx_trace(chip);
2756                                goto BUILD_FAIL;
2757                        }
2758
2759                        segment->l2p_table[idx] = phy_blk;
2760                        if (seg_no == ms_card->segment_cnt - 1) {
2761                                if (segment->unused_blk_cnt < 2) {
2762                                        chip->card_wp |= MS_CARD;
2763                                        return STATUS_SUCCESS;
2764                                }
2765                        } else {
2766                                if (segment->unused_blk_cnt < 1) {
2767                                        chip->card_wp |= MS_CARD;
2768                                        return STATUS_SUCCESS;
2769                                }
2770                        }
2771                }
2772        }
2773
2774        /* Make boot block be the first normal block */
2775        if (seg_no == 0) {
2776                for (log_blk = 0; log_blk < 494; log_blk++) {
2777                        tmp_blk = segment->l2p_table[log_blk];
2778                        if (tmp_blk < ms_card->boot_block) {
2779                                dev_dbg(rtsx_dev(chip), "Boot block is not the first normal block.\n");
2780
2781                                if (chip->card_wp & MS_CARD)
2782                                        break;
2783
2784                                phy_blk = ms_get_unused_block(chip, 0);
2785                                retval = ms_copy_page(chip, tmp_blk, phy_blk,
2786                                                log_blk, 0, ms_card->page_off + 1);
2787                                if (retval != STATUS_SUCCESS) {
2788                                        rtsx_trace(chip);
2789                                        return STATUS_FAIL;
2790                                }
2791
2792                                segment->l2p_table[log_blk] = phy_blk;
2793
2794                                retval = ms_set_bad_block(chip, tmp_blk);
2795                                if (retval != STATUS_SUCCESS) {
2796                                        rtsx_trace(chip);
2797                                        return STATUS_FAIL;
2798                                }
2799                        }
2800                }
2801        }
2802
2803        return STATUS_SUCCESS;
2804
2805BUILD_FAIL:
2806        segment->build_flag = 0;
2807        if (segment->l2p_table) {
2808                vfree(segment->l2p_table);
2809                segment->l2p_table = NULL;
2810        }
2811        if (segment->free_table) {
2812                vfree(segment->free_table);
2813                segment->free_table = NULL;
2814        }
2815
2816        return STATUS_FAIL;
2817}
2818
2819
2820int reset_ms_card(struct rtsx_chip *chip)
2821{
2822        struct ms_info *ms_card = &(chip->ms_card);
2823        int retval;
2824
2825        memset(ms_card, 0, sizeof(struct ms_info));
2826
2827        retval = enable_card_clock(chip, MS_CARD);
2828        if (retval != STATUS_SUCCESS) {
2829                rtsx_trace(chip);
2830                return STATUS_FAIL;
2831        }
2832
2833        retval = select_card(chip, MS_CARD);
2834        if (retval != STATUS_SUCCESS) {
2835                rtsx_trace(chip);
2836                return STATUS_FAIL;
2837        }
2838
2839        ms_card->ms_type = 0;
2840
2841        retval = reset_ms_pro(chip);
2842        if (retval != STATUS_SUCCESS) {
2843                if (ms_card->check_ms_flow) {
2844                        retval = reset_ms(chip);
2845                        if (retval != STATUS_SUCCESS) {
2846                                rtsx_trace(chip);
2847                                return STATUS_FAIL;
2848                        }
2849                } else {
2850                        rtsx_trace(chip);
2851                        return STATUS_FAIL;
2852                }
2853        }
2854
2855        retval = ms_set_init_para(chip);
2856        if (retval != STATUS_SUCCESS) {
2857                rtsx_trace(chip);
2858                return STATUS_FAIL;
2859        }
2860
2861        if (!CHK_MSPRO(ms_card)) {
2862                /* Build table for the last segment,
2863                 * to check if L2P table block exists, erasing it
2864                 */
2865                retval = ms_build_l2p_tbl(chip, ms_card->total_block / 512 - 1);
2866                if (retval != STATUS_SUCCESS) {
2867                        rtsx_trace(chip);
2868                        return STATUS_FAIL;
2869                }
2870        }
2871
2872        dev_dbg(rtsx_dev(chip), "ms_card->ms_type = 0x%x\n", ms_card->ms_type);
2873
2874        return STATUS_SUCCESS;
2875}
2876
2877static int mspro_set_rw_cmd(struct rtsx_chip *chip,
2878                        u32 start_sec, u16 sec_cnt, u8 cmd)
2879{
2880        int retval, i;
2881        u8 data[8];
2882
2883        data[0] = cmd;
2884        data[1] = (u8)(sec_cnt >> 8);
2885        data[2] = (u8)sec_cnt;
2886        data[3] = (u8)(start_sec >> 24);
2887        data[4] = (u8)(start_sec >> 16);
2888        data[5] = (u8)(start_sec >> 8);
2889        data[6] = (u8)start_sec;
2890        data[7] = 0;
2891
2892        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
2893                retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7,
2894                                        WAIT_INT, data, 8);
2895                if (retval == STATUS_SUCCESS)
2896                        break;
2897        }
2898        if (i == MS_MAX_RETRY_COUNT) {
2899                rtsx_trace(chip);
2900                return STATUS_FAIL;
2901        }
2902
2903        return STATUS_SUCCESS;
2904}
2905
2906
2907void mspro_stop_seq_mode(struct rtsx_chip *chip)
2908{
2909        struct ms_info *ms_card = &(chip->ms_card);
2910        int retval;
2911
2912        if (ms_card->seq_mode) {
2913                retval = ms_switch_clock(chip);
2914                if (retval != STATUS_SUCCESS)
2915                        return;
2916
2917                ms_card->seq_mode = 0;
2918                ms_card->total_sec_cnt = 0;
2919                ms_send_cmd(chip, PRO_STOP, WAIT_INT);
2920
2921                rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
2922        }
2923}
2924
2925static inline int ms_auto_tune_clock(struct rtsx_chip *chip)
2926{
2927        struct ms_info *ms_card = &(chip->ms_card);
2928        int retval;
2929
2930        if (chip->asic_code) {
2931                if (ms_card->ms_clock > 30)
2932                        ms_card->ms_clock -= 20;
2933        } else {
2934                if (ms_card->ms_clock == CLK_80)
2935                        ms_card->ms_clock = CLK_60;
2936                else if (ms_card->ms_clock == CLK_60)
2937                        ms_card->ms_clock = CLK_40;
2938        }
2939
2940        retval = ms_switch_clock(chip);
2941        if (retval != STATUS_SUCCESS) {
2942                rtsx_trace(chip);
2943                return STATUS_FAIL;
2944        }
2945
2946        return STATUS_SUCCESS;
2947}
2948
2949static int mspro_rw_multi_sector(struct scsi_cmnd *srb,
2950                                struct rtsx_chip *chip, u32 start_sector,
2951                                u16 sector_cnt)
2952{
2953        struct ms_info *ms_card = &(chip->ms_card);
2954        bool mode_2k = false;
2955        int retval;
2956        u16 count;
2957        u8 val, trans_mode, rw_tpc, rw_cmd;
2958
2959        ms_set_err_code(chip, MS_NO_ERROR);
2960
2961        ms_card->cleanup_counter = 0;
2962
2963        if (CHK_MSHG(ms_card)) {
2964                if ((start_sector % 4) || (sector_cnt % 4)) {
2965                        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2966                                rw_tpc = PRO_READ_LONG_DATA;
2967                                rw_cmd = PRO_READ_DATA;
2968                        } else {
2969                                rw_tpc = PRO_WRITE_LONG_DATA;
2970                                rw_cmd = PRO_WRITE_DATA;
2971                        }
2972                } else {
2973                        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2974                                rw_tpc = PRO_READ_QUAD_DATA;
2975                                rw_cmd = PRO_READ_2K_DATA;
2976                        } else {
2977                                rw_tpc = PRO_WRITE_QUAD_DATA;
2978                                rw_cmd = PRO_WRITE_2K_DATA;
2979                        }
2980                        mode_2k = true;
2981                }
2982        } else {
2983                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
2984                        rw_tpc = PRO_READ_LONG_DATA;
2985                        rw_cmd = PRO_READ_DATA;
2986                } else {
2987                        rw_tpc = PRO_WRITE_LONG_DATA;
2988                        rw_cmd = PRO_WRITE_DATA;
2989                }
2990        }
2991
2992        retval = ms_switch_clock(chip);
2993        if (retval != STATUS_SUCCESS) {
2994                rtsx_trace(chip);
2995                return STATUS_FAIL;
2996        }
2997
2998        if (srb->sc_data_direction == DMA_FROM_DEVICE)
2999                trans_mode = MS_TM_AUTO_READ;
3000        else
3001                trans_mode = MS_TM_AUTO_WRITE;
3002
3003        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
3004        if (retval) {
3005                rtsx_trace(chip);
3006                return retval;
3007        }
3008
3009        if (ms_card->seq_mode) {
3010                if ((ms_card->pre_dir != srb->sc_data_direction)
3011                                || ((ms_card->pre_sec_addr + ms_card->pre_sec_cnt) != start_sector)
3012                                || (mode_2k && (ms_card->seq_mode & MODE_512_SEQ))
3013                                || (!mode_2k && (ms_card->seq_mode & MODE_2K_SEQ))
3014                                || !(val & MS_INT_BREQ)
3015                                || ((ms_card->total_sec_cnt + sector_cnt) > 0xFE00)) {
3016                        ms_card->seq_mode = 0;
3017                        ms_card->total_sec_cnt = 0;
3018                        if (val & MS_INT_BREQ) {
3019                                retval = ms_send_cmd(chip, PRO_STOP, WAIT_INT);
3020                                if (retval != STATUS_SUCCESS) {
3021                                        rtsx_trace(chip);
3022                                        return STATUS_FAIL;
3023                                }
3024
3025                                rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
3026                        }
3027                }
3028        }
3029
3030        if (!ms_card->seq_mode) {
3031                ms_card->total_sec_cnt = 0;
3032                if (sector_cnt >= SEQ_START_CRITERIA) {
3033                        if ((ms_card->capacity - start_sector) > 0xFE00)
3034                                count = 0xFE00;
3035                        else
3036                                count = (u16)(ms_card->capacity - start_sector);
3037
3038                        if (count > sector_cnt) {
3039                                if (mode_2k)
3040                                        ms_card->seq_mode = MODE_2K_SEQ;
3041                                else
3042                                        ms_card->seq_mode = MODE_512_SEQ;
3043                        }
3044                } else {
3045                        count = sector_cnt;
3046                }
3047                retval = mspro_set_rw_cmd(chip, start_sector, count, rw_cmd);
3048                if (retval != STATUS_SUCCESS) {
3049                        ms_card->seq_mode = 0;
3050                        rtsx_trace(chip);
3051                        return STATUS_FAIL;
3052                }
3053        }
3054
3055        retval = ms_transfer_data(chip, trans_mode, rw_tpc, sector_cnt,
3056                                WAIT_INT, mode_2k, scsi_sg_count(srb),
3057                                scsi_sglist(srb), scsi_bufflen(srb));
3058        if (retval != STATUS_SUCCESS) {
3059                ms_card->seq_mode = 0;
3060                rtsx_read_register(chip, MS_TRANS_CFG, &val);
3061                rtsx_clear_ms_error(chip);
3062
3063                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3064                        chip->rw_need_retry = 0;
3065                        dev_dbg(rtsx_dev(chip), "No card exist, exit mspro_rw_multi_sector\n");
3066                        rtsx_trace(chip);
3067                        return STATUS_FAIL;
3068                }
3069
3070                if (val & MS_INT_BREQ)
3071                        ms_send_cmd(chip, PRO_STOP, WAIT_INT);
3072
3073                if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
3074                        dev_dbg(rtsx_dev(chip), "MSPro CRC error, tune clock!\n");
3075                        chip->rw_need_retry = 1;
3076                        ms_auto_tune_clock(chip);
3077                }
3078
3079                rtsx_trace(chip);
3080                return retval;
3081        }
3082
3083        if (ms_card->seq_mode) {
3084                ms_card->pre_sec_addr = start_sector;
3085                ms_card->pre_sec_cnt = sector_cnt;
3086                ms_card->pre_dir = srb->sc_data_direction;
3087                ms_card->total_sec_cnt += sector_cnt;
3088        }
3089
3090        return STATUS_SUCCESS;
3091}
3092
3093static int mspro_read_format_progress(struct rtsx_chip *chip,
3094                                const int short_data_len)
3095{
3096        struct ms_info *ms_card = &(chip->ms_card);
3097        int retval, i;
3098        u32 total_progress, cur_progress;
3099        u8 cnt, tmp;
3100        u8 data[8];
3101
3102        dev_dbg(rtsx_dev(chip), "mspro_read_format_progress, short_data_len = %d\n",
3103                short_data_len);
3104
3105        retval = ms_switch_clock(chip);
3106        if (retval != STATUS_SUCCESS) {
3107                ms_card->format_status = FORMAT_FAIL;
3108                rtsx_trace(chip);
3109                return STATUS_FAIL;
3110        }
3111
3112        retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
3113        if (retval != STATUS_SUCCESS) {
3114                ms_card->format_status = FORMAT_FAIL;
3115                rtsx_trace(chip);
3116                return STATUS_FAIL;
3117        }
3118
3119        if (!(tmp & MS_INT_BREQ)) {
3120                if ((tmp & (MS_INT_CED | MS_INT_BREQ | MS_INT_CMDNK | MS_INT_ERR)) == MS_INT_CED) {
3121                        ms_card->format_status = FORMAT_SUCCESS;
3122                        return STATUS_SUCCESS;
3123                }
3124                ms_card->format_status = FORMAT_FAIL;
3125                rtsx_trace(chip);
3126                return STATUS_FAIL;
3127        }
3128
3129        if (short_data_len >= 256)
3130                cnt = 0;
3131        else
3132                cnt = (u8)short_data_len;
3133
3134        retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT,
3135                                MS_NO_CHECK_INT);
3136        if (retval != STATUS_SUCCESS) {
3137                ms_card->format_status = FORMAT_FAIL;
3138                rtsx_trace(chip);
3139                return STATUS_FAIL;
3140        }
3141
3142        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, cnt, WAIT_INT,
3143                        data, 8);
3144        if (retval != STATUS_SUCCESS) {
3145                ms_card->format_status = FORMAT_FAIL;
3146                rtsx_trace(chip);
3147                return STATUS_FAIL;
3148        }
3149
3150        total_progress = (data[0] << 24) | (data[1] << 16) |
3151                (data[2] << 8) | data[3];
3152        cur_progress = (data[4] << 24) | (data[5] << 16) |
3153                (data[6] << 8) | data[7];
3154
3155        dev_dbg(rtsx_dev(chip), "total_progress = %d, cur_progress = %d\n",
3156                total_progress, cur_progress);
3157
3158        if (total_progress == 0) {
3159                ms_card->progress = 0;
3160        } else {
3161                u64 ulltmp = (u64)cur_progress * (u64)65535;
3162
3163                do_div(ulltmp, total_progress);
3164                ms_card->progress = (u16)ulltmp;
3165        }
3166        dev_dbg(rtsx_dev(chip), "progress = %d\n", ms_card->progress);
3167
3168        for (i = 0; i < 5000; i++) {
3169                retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
3170                if (retval != STATUS_SUCCESS) {
3171                        ms_card->format_status = FORMAT_FAIL;
3172                        rtsx_trace(chip);
3173                        return STATUS_FAIL;
3174                }
3175                if (tmp & (MS_INT_CED | MS_INT_CMDNK |
3176                                MS_INT_BREQ | MS_INT_ERR))
3177                        break;
3178
3179                wait_timeout(1);
3180        }
3181
3182        retval = rtsx_write_register(chip, MS_CFG, MS_NO_CHECK_INT, 0);
3183        if (retval != STATUS_SUCCESS) {
3184                ms_card->format_status = FORMAT_FAIL;
3185                rtsx_trace(chip);
3186                return STATUS_FAIL;
3187        }
3188
3189        if (i == 5000) {
3190                ms_card->format_status = FORMAT_FAIL;
3191                rtsx_trace(chip);
3192                return STATUS_FAIL;
3193        }
3194
3195        if (tmp & (MS_INT_CMDNK | MS_INT_ERR)) {
3196                ms_card->format_status = FORMAT_FAIL;
3197                rtsx_trace(chip);
3198                return STATUS_FAIL;
3199        }
3200
3201        if (tmp & MS_INT_CED) {
3202                ms_card->format_status = FORMAT_SUCCESS;
3203                ms_card->pro_under_formatting = 0;
3204        } else if (tmp & MS_INT_BREQ) {
3205                ms_card->format_status = FORMAT_IN_PROGRESS;
3206        } else {
3207                ms_card->format_status = FORMAT_FAIL;
3208                ms_card->pro_under_formatting = 0;
3209                rtsx_trace(chip);
3210                return STATUS_FAIL;
3211        }
3212
3213        return STATUS_SUCCESS;
3214}
3215
3216void mspro_polling_format_status(struct rtsx_chip *chip)
3217{
3218        struct ms_info *ms_card = &(chip->ms_card);
3219        int i;
3220
3221        if (ms_card->pro_under_formatting &&
3222                (rtsx_get_stat(chip) != RTSX_STAT_SS)) {
3223                rtsx_set_stat(chip, RTSX_STAT_RUN);
3224
3225                for (i = 0; i < 65535; i++) {
3226                        mspro_read_format_progress(chip, MS_SHORT_DATA_LEN);
3227                        if (ms_card->format_status != FORMAT_IN_PROGRESS)
3228                                break;
3229                }
3230        }
3231}
3232
3233int mspro_format(struct scsi_cmnd *srb, struct rtsx_chip *chip,
3234                int short_data_len, bool quick_format)
3235{
3236        struct ms_info *ms_card = &(chip->ms_card);
3237        int retval, i;
3238        u8 buf[8], tmp;
3239        u16 para;
3240
3241        retval = ms_switch_clock(chip);
3242        if (retval != STATUS_SUCCESS) {
3243                rtsx_trace(chip);
3244                return STATUS_FAIL;
3245        }
3246
3247        retval = ms_set_rw_reg_addr(chip, 0x00, 0x00, Pro_TPCParm, 0x01);
3248        if (retval != STATUS_SUCCESS) {
3249                rtsx_trace(chip);
3250                return STATUS_FAIL;
3251        }
3252
3253        memset(buf, 0, 2);
3254        switch (short_data_len) {
3255        case 32:
3256                buf[0] = 0;
3257                break;
3258        case 64:
3259                buf[0] = 1;
3260                break;
3261        case 128:
3262                buf[0] = 2;
3263                break;
3264        case 256:
3265        default:
3266                buf[0] = 3;
3267                break;
3268        }
3269
3270        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3271                retval = ms_write_bytes(chip, PRO_WRITE_REG, 1,
3272                                        NO_WAIT_INT, buf, 2);
3273                if (retval == STATUS_SUCCESS)
3274                        break;
3275        }
3276        if (i == MS_MAX_RETRY_COUNT) {
3277                rtsx_trace(chip);
3278                return STATUS_FAIL;
3279        }
3280
3281        if (quick_format)
3282                para = 0x0000;
3283        else
3284                para = 0x0001;
3285
3286        retval = mspro_set_rw_cmd(chip, 0, para, PRO_FORMAT);
3287        if (retval != STATUS_SUCCESS) {
3288                rtsx_trace(chip);
3289                return STATUS_FAIL;
3290        }
3291
3292        retval = rtsx_read_register(chip, MS_TRANS_CFG, &tmp);
3293        if (retval) {
3294                rtsx_trace(chip);
3295                return retval;
3296        }
3297
3298        if (tmp & (MS_INT_CMDNK | MS_INT_ERR)) {
3299                rtsx_trace(chip);
3300                return STATUS_FAIL;
3301        }
3302
3303        if ((tmp & (MS_INT_BREQ | MS_INT_CED)) == MS_INT_BREQ) {
3304                ms_card->pro_under_formatting = 1;
3305                ms_card->progress = 0;
3306                ms_card->format_status = FORMAT_IN_PROGRESS;
3307                return STATUS_SUCCESS;
3308        }
3309
3310        if (tmp & MS_INT_CED) {
3311                ms_card->pro_under_formatting = 0;
3312                ms_card->progress = 0;
3313                ms_card->format_status = FORMAT_SUCCESS;
3314                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_NO_SENSE);
3315                return STATUS_SUCCESS;
3316        }
3317
3318        rtsx_trace(chip);
3319        return STATUS_FAIL;
3320}
3321
3322
3323static int ms_read_multiple_pages(struct rtsx_chip *chip, u16 phy_blk,
3324                                u16 log_blk, u8 start_page, u8 end_page,
3325                                u8 *buf, unsigned int *index,
3326                                unsigned int *offset)
3327{
3328        struct ms_info *ms_card = &(chip->ms_card);
3329        int retval, i;
3330        u8 extra[MS_EXTRA_SIZE], page_addr, val, trans_cfg, data[6];
3331        u8 *ptr;
3332
3333        retval = ms_read_extra_data(chip, phy_blk, start_page,
3334                                extra, MS_EXTRA_SIZE);
3335        if (retval == STATUS_SUCCESS) {
3336                if ((extra[1] & 0x30) != 0x30) {
3337                        ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3338                        rtsx_trace(chip);
3339                        return STATUS_FAIL;
3340                }
3341        }
3342
3343        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
3344                                SystemParm, 6);
3345        if (retval != STATUS_SUCCESS) {
3346                rtsx_trace(chip);
3347                return STATUS_FAIL;
3348        }
3349
3350        if (CHK_MS4BIT(ms_card))
3351                data[0] = 0x88;
3352        else
3353                data[0] = 0x80;
3354
3355        data[1] = 0;
3356        data[2] = (u8)(phy_blk >> 8);
3357        data[3] = (u8)phy_blk;
3358        data[4] = 0;
3359        data[5] = start_page;
3360
3361        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3362                retval = ms_write_bytes(chip, WRITE_REG, 6, NO_WAIT_INT,
3363                                        data, 6);
3364                if (retval == STATUS_SUCCESS)
3365                        break;
3366        }
3367        if (i == MS_MAX_RETRY_COUNT) {
3368                rtsx_trace(chip);
3369                return STATUS_FAIL;
3370        }
3371
3372        ms_set_err_code(chip, MS_NO_ERROR);
3373
3374        retval = ms_send_cmd(chip, BLOCK_READ, WAIT_INT);
3375        if (retval != STATUS_SUCCESS) {
3376                rtsx_trace(chip);
3377                return STATUS_FAIL;
3378        }
3379
3380        ptr = buf;
3381
3382        for (page_addr = start_page; page_addr < end_page; page_addr++) {
3383                ms_set_err_code(chip, MS_NO_ERROR);
3384
3385                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3386                        ms_set_err_code(chip, MS_NO_CARD);
3387                        rtsx_trace(chip);
3388                        return STATUS_FAIL;
3389                }
3390
3391                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3392                if (retval != STATUS_SUCCESS) {
3393                        rtsx_trace(chip);
3394                        return STATUS_FAIL;
3395                }
3396
3397                if (val & INT_REG_CMDNK) {
3398                        ms_set_err_code(chip, MS_CMD_NK);
3399                        rtsx_trace(chip);
3400                        return STATUS_FAIL;
3401                }
3402                if (val & INT_REG_ERR) {
3403                        if (val & INT_REG_BREQ) {
3404                                retval = ms_read_status_reg(chip);
3405                                if (retval != STATUS_SUCCESS) {
3406                                        if (!(chip->card_wp & MS_CARD)) {
3407                                                reset_ms(chip);
3408                                                ms_set_page_status(log_blk, setPS_NG, extra, MS_EXTRA_SIZE);
3409                                                ms_write_extra_data(chip, phy_blk,
3410                                                                page_addr, extra, MS_EXTRA_SIZE);
3411                                        }
3412                                        ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3413                                        rtsx_trace(chip);
3414                                        return STATUS_FAIL;
3415                                }
3416                        } else {
3417                                ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3418                                rtsx_trace(chip);
3419                                return STATUS_FAIL;
3420                        }
3421                } else {
3422                        if (!(val & INT_REG_BREQ)) {
3423                                ms_set_err_code(chip, MS_BREQ_ERROR);
3424                                rtsx_trace(chip);
3425                                return STATUS_FAIL;
3426                        }
3427                }
3428
3429                if (page_addr == (end_page - 1)) {
3430                        if (!(val & INT_REG_CED)) {
3431                                retval = ms_send_cmd(chip, BLOCK_END, WAIT_INT);
3432                                if (retval != STATUS_SUCCESS) {
3433                                        rtsx_trace(chip);
3434                                        return STATUS_FAIL;
3435                                }
3436                        }
3437
3438                        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT,
3439                                        &val, 1);
3440                        if (retval != STATUS_SUCCESS) {
3441                                rtsx_trace(chip);
3442                                return STATUS_FAIL;
3443                        }
3444
3445                        if (!(val & INT_REG_CED)) {
3446                                ms_set_err_code(chip, MS_FLASH_READ_ERROR);
3447                                rtsx_trace(chip);
3448                                return STATUS_FAIL;
3449                        }
3450
3451                        trans_cfg = NO_WAIT_INT;
3452                } else {
3453                        trans_cfg = WAIT_INT;
3454                }
3455
3456                rtsx_init_cmd(chip);
3457
3458                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC, 0xFF, READ_PAGE_DATA);
3459                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
3460                        0xFF, trans_cfg);
3461                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
3462                        0x01, RING_BUFFER);
3463
3464                trans_dma_enable(DMA_FROM_DEVICE, chip, 512, DMA_512);
3465
3466                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
3467                                MS_TRANSFER_START |  MS_TM_NORMAL_READ);
3468                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
3469                        MS_TRANSFER_END, MS_TRANSFER_END);
3470
3471                rtsx_send_cmd_no_wait(chip);
3472
3473                retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr,
3474                                                512, scsi_sg_count(chip->srb),
3475                                                index, offset, DMA_FROM_DEVICE,
3476                                                chip->ms_timeout);
3477                if (retval < 0) {
3478                        if (retval == -ETIMEDOUT) {
3479                                ms_set_err_code(chip, MS_TO_ERROR);
3480                                rtsx_clear_ms_error(chip);
3481                                rtsx_trace(chip);
3482                                return STATUS_TIMEDOUT;
3483                        }
3484
3485                        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
3486                        if (retval != STATUS_SUCCESS) {
3487                                ms_set_err_code(chip, MS_TO_ERROR);
3488                                rtsx_clear_ms_error(chip);
3489                                rtsx_trace(chip);
3490                                return STATUS_TIMEDOUT;
3491                        }
3492                        if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
3493                                ms_set_err_code(chip, MS_CRC16_ERROR);
3494                                rtsx_clear_ms_error(chip);
3495                                rtsx_trace(chip);
3496                                return STATUS_FAIL;
3497                        }
3498                }
3499
3500                if (scsi_sg_count(chip->srb) == 0)
3501                        ptr += 512;
3502        }
3503
3504        return STATUS_SUCCESS;
3505}
3506
3507static int ms_write_multiple_pages(struct rtsx_chip *chip, u16 old_blk,
3508                                u16 new_blk, u16 log_blk, u8 start_page,
3509                                u8 end_page, u8 *buf, unsigned int *index,
3510                                unsigned int *offset)
3511{
3512        struct ms_info *ms_card = &(chip->ms_card);
3513        int retval, i;
3514        u8 page_addr, val, data[16];
3515        u8 *ptr;
3516
3517        if (!start_page) {
3518                retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
3519                                        SystemParm, 7);
3520                if (retval != STATUS_SUCCESS) {
3521                        rtsx_trace(chip);
3522                        return STATUS_FAIL;
3523                }
3524
3525                if (CHK_MS4BIT(ms_card))
3526                        data[0] = 0x88;
3527                else
3528                        data[0] = 0x80;
3529
3530                data[1] = 0;
3531                data[2] = (u8)(old_blk >> 8);
3532                data[3] = (u8)old_blk;
3533                data[4] = 0x80;
3534                data[5] = 0;
3535                data[6] = 0xEF;
3536                data[7] = 0xFF;
3537
3538                retval = ms_write_bytes(chip, WRITE_REG, 7, NO_WAIT_INT,
3539                                        data, 8);
3540                if (retval != STATUS_SUCCESS) {
3541                        rtsx_trace(chip);
3542                        return STATUS_FAIL;
3543                }
3544
3545                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
3546                if (retval != STATUS_SUCCESS) {
3547                        rtsx_trace(chip);
3548                        return STATUS_FAIL;
3549                }
3550
3551                ms_set_err_code(chip, MS_NO_ERROR);
3552                retval = ms_transfer_tpc(chip, MS_TM_READ_BYTES, GET_INT, 1,
3553                                        NO_WAIT_INT);
3554                if (retval != STATUS_SUCCESS) {
3555                        rtsx_trace(chip);
3556                        return STATUS_FAIL;
3557                }
3558        }
3559
3560        retval = ms_set_rw_reg_addr(chip, OverwriteFlag, MS_EXTRA_SIZE,
3561                                SystemParm, (6 + MS_EXTRA_SIZE));
3562        if (retval != STATUS_SUCCESS) {
3563                rtsx_trace(chip);
3564                return STATUS_FAIL;
3565        }
3566
3567        ms_set_err_code(chip, MS_NO_ERROR);
3568
3569        if (CHK_MS4BIT(ms_card))
3570                data[0] = 0x88;
3571        else
3572                data[0] = 0x80;
3573
3574        data[1] = 0;
3575        data[2] = (u8)(new_blk >> 8);
3576        data[3] = (u8)new_blk;
3577        if ((end_page - start_page) == 1)
3578                data[4] = 0x20;
3579        else
3580                data[4] = 0;
3581
3582        data[5] = start_page;
3583        data[6] = 0xF8;
3584        data[7] = 0xFF;
3585        data[8] = (u8)(log_blk >> 8);
3586        data[9] = (u8)log_blk;
3587
3588        for (i = 0x0A; i < 0x10; i++)
3589                data[i] = 0xFF;
3590
3591        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3592                retval = ms_write_bytes(chip, WRITE_REG, 6 + MS_EXTRA_SIZE,
3593                                        NO_WAIT_INT, data, 16);
3594                if (retval == STATUS_SUCCESS)
3595                        break;
3596        }
3597        if (i == MS_MAX_RETRY_COUNT) {
3598                rtsx_trace(chip);
3599                return STATUS_FAIL;
3600        }
3601
3602        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
3603                retval = ms_send_cmd(chip, BLOCK_WRITE, WAIT_INT);
3604                if (retval == STATUS_SUCCESS)
3605                        break;
3606        }
3607        if (i == MS_MAX_RETRY_COUNT) {
3608                rtsx_trace(chip);
3609                return STATUS_FAIL;
3610        }
3611
3612        retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3613        if (retval != STATUS_SUCCESS) {
3614                rtsx_trace(chip);
3615                return STATUS_FAIL;
3616        }
3617
3618        ptr = buf;
3619        for (page_addr = start_page; page_addr < end_page; page_addr++) {
3620                ms_set_err_code(chip, MS_NO_ERROR);
3621
3622                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3623                        ms_set_err_code(chip, MS_NO_CARD);
3624                        rtsx_trace(chip);
3625                        return STATUS_FAIL;
3626                }
3627
3628                if (val & INT_REG_CMDNK) {
3629                        ms_set_err_code(chip, MS_CMD_NK);
3630                        rtsx_trace(chip);
3631                        return STATUS_FAIL;
3632                }
3633                if (val & INT_REG_ERR) {
3634                        ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
3635                        rtsx_trace(chip);
3636                        return STATUS_FAIL;
3637                }
3638                if (!(val & INT_REG_BREQ)) {
3639                        ms_set_err_code(chip, MS_BREQ_ERROR);
3640                        rtsx_trace(chip);
3641                        return STATUS_FAIL;
3642                }
3643
3644                udelay(30);
3645
3646                rtsx_init_cmd(chip);
3647
3648                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
3649                        0xFF, WRITE_PAGE_DATA);
3650                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG,
3651                        0xFF, WAIT_INT);
3652                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
3653                        0x01, RING_BUFFER);
3654
3655                trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
3656
3657                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
3658                                MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
3659                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
3660                        MS_TRANSFER_END, MS_TRANSFER_END);
3661
3662                rtsx_send_cmd_no_wait(chip);
3663
3664                retval = rtsx_transfer_data_partial(chip, MS_CARD, ptr,
3665                                                512, scsi_sg_count(chip->srb),
3666                                                index, offset, DMA_TO_DEVICE,
3667                                                chip->ms_timeout);
3668                if (retval < 0) {
3669                        ms_set_err_code(chip, MS_TO_ERROR);
3670                        rtsx_clear_ms_error(chip);
3671
3672                        if (retval == -ETIMEDOUT) {
3673                                rtsx_trace(chip);
3674                                return STATUS_TIMEDOUT;
3675                        }
3676                        rtsx_trace(chip);
3677                        return STATUS_FAIL;
3678                }
3679
3680                retval = ms_read_bytes(chip, GET_INT, 1, NO_WAIT_INT, &val, 1);
3681                if (retval != STATUS_SUCCESS) {
3682                        rtsx_trace(chip);
3683                        return STATUS_FAIL;
3684                }
3685
3686                if ((end_page - start_page) == 1) {
3687                        if (!(val & INT_REG_CED)) {
3688                                ms_set_err_code(chip, MS_FLASH_WRITE_ERROR);
3689                                rtsx_trace(chip);
3690                                return STATUS_FAIL;
3691                        }
3692                } else {
3693                        if (page_addr == (end_page - 1)) {
3694                                if (!(val & INT_REG_CED)) {
3695                                        retval = ms_send_cmd(chip, BLOCK_END,
3696                                                        WAIT_INT);
3697                                        if (retval != STATUS_SUCCESS) {
3698                                                rtsx_trace(chip);
3699                                                return STATUS_FAIL;
3700                                        }
3701                                }
3702
3703                                retval = ms_read_bytes(chip, GET_INT, 1,
3704                                                NO_WAIT_INT, &val, 1);
3705                                if (retval != STATUS_SUCCESS) {
3706                                        rtsx_trace(chip);
3707                                        return STATUS_FAIL;
3708                                }
3709                        }
3710
3711                        if ((page_addr == (end_page - 1)) ||
3712                                (page_addr == ms_card->page_off)) {
3713                                if (!(val & INT_REG_CED)) {
3714                                        ms_set_err_code(chip,
3715                                                        MS_FLASH_WRITE_ERROR);
3716                                        rtsx_trace(chip);
3717                                        return STATUS_FAIL;
3718                                }
3719                        }
3720                }
3721
3722                if (scsi_sg_count(chip->srb) == 0)
3723                        ptr += 512;
3724        }
3725
3726        return STATUS_SUCCESS;
3727}
3728
3729
3730static int ms_finish_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
3731                u16 log_blk, u8 page_off)
3732{
3733        struct ms_info *ms_card = &(chip->ms_card);
3734        int retval, seg_no;
3735
3736        retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
3737                        page_off, ms_card->page_off + 1);
3738        if (retval != STATUS_SUCCESS) {
3739                rtsx_trace(chip);
3740                return STATUS_FAIL;
3741        }
3742
3743        seg_no = old_blk >> 9;
3744
3745        if (MS_TST_BAD_BLOCK_FLG(ms_card)) {
3746                MS_CLR_BAD_BLOCK_FLG(ms_card);
3747                ms_set_bad_block(chip, old_blk);
3748        } else {
3749                retval = ms_erase_block(chip, old_blk);
3750                if (retval == STATUS_SUCCESS)
3751                        ms_set_unused_block(chip, old_blk);
3752        }
3753
3754        ms_set_l2p_tbl(chip, seg_no, log_blk - ms_start_idx[seg_no], new_blk);
3755
3756        return STATUS_SUCCESS;
3757}
3758
3759static int ms_prepare_write(struct rtsx_chip *chip, u16 old_blk, u16 new_blk,
3760                u16 log_blk, u8 start_page)
3761{
3762        int retval;
3763
3764        if (start_page) {
3765                retval = ms_copy_page(chip, old_blk, new_blk, log_blk,
3766                                0, start_page);
3767                if (retval != STATUS_SUCCESS) {
3768                        rtsx_trace(chip);
3769                        return STATUS_FAIL;
3770                }
3771        }
3772
3773        return STATUS_SUCCESS;
3774}
3775
3776#ifdef MS_DELAY_WRITE
3777int ms_delay_write(struct rtsx_chip *chip)
3778{
3779        struct ms_info *ms_card = &(chip->ms_card);
3780        struct ms_delay_write_tag *delay_write = &(ms_card->delay_write);
3781        int retval;
3782
3783        if (delay_write->delay_write_flag) {
3784                retval = ms_set_init_para(chip);
3785                if (retval != STATUS_SUCCESS) {
3786                        rtsx_trace(chip);
3787                        return STATUS_FAIL;
3788                }
3789
3790                delay_write->delay_write_flag = 0;
3791                retval = ms_finish_write(chip,
3792                                        delay_write->old_phyblock,
3793                                        delay_write->new_phyblock,
3794                                        delay_write->logblock,
3795                                        delay_write->pageoff);
3796                if (retval != STATUS_SUCCESS) {
3797                        rtsx_trace(chip);
3798                        return STATUS_FAIL;
3799                }
3800        }
3801
3802        return STATUS_SUCCESS;
3803}
3804#endif
3805
3806static inline void ms_rw_fail(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3807{
3808        if (srb->sc_data_direction == DMA_FROM_DEVICE)
3809                set_sense_type(chip, SCSI_LUN(srb),
3810                        SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3811        else
3812                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
3813}
3814
3815static int ms_rw_multi_sector(struct scsi_cmnd *srb, struct rtsx_chip *chip,
3816                        u32 start_sector, u16 sector_cnt)
3817{
3818        struct ms_info *ms_card = &(chip->ms_card);
3819        unsigned int lun = SCSI_LUN(srb);
3820        int retval, seg_no;
3821        unsigned int index = 0, offset = 0;
3822        u16 old_blk = 0, new_blk = 0, log_blk, total_sec_cnt = sector_cnt;
3823        u8 start_page, end_page = 0, page_cnt;
3824        u8 *ptr;
3825#ifdef MS_DELAY_WRITE
3826        struct ms_delay_write_tag *delay_write = &(ms_card->delay_write);
3827#endif
3828
3829        ms_set_err_code(chip, MS_NO_ERROR);
3830
3831        ms_card->cleanup_counter = 0;
3832
3833        ptr = (u8 *)scsi_sglist(srb);
3834
3835        retval = ms_switch_clock(chip);
3836        if (retval != STATUS_SUCCESS) {
3837                ms_rw_fail(srb, chip);
3838                rtsx_trace(chip);
3839                return STATUS_FAIL;
3840        }
3841
3842        log_blk = (u16)(start_sector >> ms_card->block_shift);
3843        start_page = (u8)(start_sector & ms_card->page_off);
3844
3845        for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1; seg_no++) {
3846                if (log_blk < ms_start_idx[seg_no+1])
3847                        break;
3848        }
3849
3850        if (ms_card->segment[seg_no].build_flag == 0) {
3851                retval = ms_build_l2p_tbl(chip, seg_no);
3852                if (retval != STATUS_SUCCESS) {
3853                        chip->card_fail |= MS_CARD;
3854                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3855                        rtsx_trace(chip);
3856                        return STATUS_FAIL;
3857                }
3858        }
3859
3860        if (srb->sc_data_direction == DMA_TO_DEVICE) {
3861#ifdef MS_DELAY_WRITE
3862                if (delay_write->delay_write_flag &&
3863                                (delay_write->logblock == log_blk) &&
3864                                (start_page > delay_write->pageoff)) {
3865                        delay_write->delay_write_flag = 0;
3866                        retval = ms_copy_page(chip,
3867                                delay_write->old_phyblock,
3868                                delay_write->new_phyblock, log_blk,
3869                                delay_write->pageoff, start_page);
3870                        if (retval != STATUS_SUCCESS) {
3871                                set_sense_type(chip, lun,
3872                                        SENSE_TYPE_MEDIA_WRITE_ERR);
3873                                rtsx_trace(chip);
3874                                return STATUS_FAIL;
3875                        }
3876                        old_blk = delay_write->old_phyblock;
3877                        new_blk = delay_write->new_phyblock;
3878                } else if (delay_write->delay_write_flag &&
3879                                (delay_write->logblock == log_blk) &&
3880                                (start_page == delay_write->pageoff)) {
3881                        delay_write->delay_write_flag = 0;
3882                        old_blk = delay_write->old_phyblock;
3883                        new_blk = delay_write->new_phyblock;
3884                } else {
3885                        retval = ms_delay_write(chip);
3886                        if (retval != STATUS_SUCCESS) {
3887                                set_sense_type(chip, lun,
3888                                        SENSE_TYPE_MEDIA_WRITE_ERR);
3889                                rtsx_trace(chip);
3890                                return STATUS_FAIL;
3891                        }
3892#endif
3893                        old_blk = ms_get_l2p_tbl(chip, seg_no,
3894                                                log_blk - ms_start_idx[seg_no]);
3895                        new_blk  = ms_get_unused_block(chip, seg_no);
3896                        if ((old_blk == 0xFFFF) || (new_blk == 0xFFFF)) {
3897                                set_sense_type(chip, lun,
3898                                        SENSE_TYPE_MEDIA_WRITE_ERR);
3899                                rtsx_trace(chip);
3900                                return STATUS_FAIL;
3901                        }
3902
3903                        retval = ms_prepare_write(chip, old_blk, new_blk,
3904                                                log_blk, start_page);
3905                        if (retval != STATUS_SUCCESS) {
3906                                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3907                                        set_sense_type(chip, lun,
3908                                                SENSE_TYPE_MEDIA_NOT_PRESENT);
3909                                        rtsx_trace(chip);
3910                                        return STATUS_FAIL;
3911                                }
3912                                set_sense_type(chip, lun,
3913                                        SENSE_TYPE_MEDIA_WRITE_ERR);
3914                                rtsx_trace(chip);
3915                                return STATUS_FAIL;
3916                        }
3917#ifdef MS_DELAY_WRITE
3918                }
3919#endif
3920        } else {
3921#ifdef MS_DELAY_WRITE
3922                retval = ms_delay_write(chip);
3923                if (retval != STATUS_SUCCESS) {
3924                        if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3925                                set_sense_type(chip, lun,
3926                                        SENSE_TYPE_MEDIA_NOT_PRESENT);
3927                                rtsx_trace(chip);
3928                                return STATUS_FAIL;
3929                        }
3930                        set_sense_type(chip, lun,
3931                                SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3932                        rtsx_trace(chip);
3933                        return STATUS_FAIL;
3934                }
3935#endif
3936                old_blk = ms_get_l2p_tbl(chip, seg_no,
3937                                        log_blk - ms_start_idx[seg_no]);
3938                if (old_blk == 0xFFFF) {
3939                        set_sense_type(chip, lun,
3940                                SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
3941                        rtsx_trace(chip);
3942                        return STATUS_FAIL;
3943                }
3944        }
3945
3946        dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
3947                seg_no, old_blk, new_blk);
3948
3949        while (total_sec_cnt) {
3950                if ((start_page + total_sec_cnt) > (ms_card->page_off + 1))
3951                        end_page = ms_card->page_off + 1;
3952                else
3953                        end_page = start_page + (u8)total_sec_cnt;
3954
3955                page_cnt = end_page - start_page;
3956
3957                dev_dbg(rtsx_dev(chip), "start_page = %d, end_page = %d, page_cnt = %d\n",
3958                        start_page, end_page, page_cnt);
3959
3960                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3961                        retval = ms_read_multiple_pages(chip,
3962                                old_blk, log_blk, start_page, end_page,
3963                                ptr, &index, &offset);
3964                } else {
3965                        retval = ms_write_multiple_pages(chip, old_blk,
3966                                new_blk, log_blk, start_page, end_page,
3967                                ptr, &index, &offset);
3968                }
3969
3970                if (retval != STATUS_SUCCESS) {
3971                        toggle_gpio(chip, 1);
3972                        if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
3973                                set_sense_type(chip, lun,
3974                                        SENSE_TYPE_MEDIA_NOT_PRESENT);
3975                                rtsx_trace(chip);
3976                                return STATUS_FAIL;
3977                        }
3978                        ms_rw_fail(srb, chip);
3979                        rtsx_trace(chip);
3980                        return STATUS_FAIL;
3981                }
3982
3983                if (srb->sc_data_direction == DMA_TO_DEVICE) {
3984                        if (end_page == (ms_card->page_off + 1)) {
3985                                retval = ms_erase_block(chip, old_blk);
3986                                if (retval == STATUS_SUCCESS)
3987                                        ms_set_unused_block(chip, old_blk);
3988
3989                                ms_set_l2p_tbl(chip, seg_no,
3990                                        log_blk - ms_start_idx[seg_no],
3991                                        new_blk);
3992                        }
3993                }
3994
3995                total_sec_cnt -= page_cnt;
3996                if (scsi_sg_count(srb) == 0)
3997                        ptr += page_cnt * 512;
3998
3999                if (total_sec_cnt == 0)
4000                        break;
4001
4002                log_blk++;
4003
4004                for (seg_no = 0; seg_no < ARRAY_SIZE(ms_start_idx) - 1;
4005                                seg_no++) {
4006                        if (log_blk < ms_start_idx[seg_no+1])
4007                                break;
4008                }
4009
4010                if (ms_card->segment[seg_no].build_flag == 0) {
4011                        retval = ms_build_l2p_tbl(chip, seg_no);
4012                        if (retval != STATUS_SUCCESS) {
4013                                chip->card_fail |= MS_CARD;
4014                                set_sense_type(chip, lun,
4015                                        SENSE_TYPE_MEDIA_NOT_PRESENT);
4016                                rtsx_trace(chip);
4017                                return STATUS_FAIL;
4018                        }
4019                }
4020
4021                old_blk = ms_get_l2p_tbl(chip, seg_no,
4022                                        log_blk - ms_start_idx[seg_no]);
4023                if (old_blk == 0xFFFF) {
4024                        ms_rw_fail(srb, chip);
4025                        rtsx_trace(chip);
4026                        return STATUS_FAIL;
4027                }
4028
4029                if (srb->sc_data_direction == DMA_TO_DEVICE) {
4030                        new_blk = ms_get_unused_block(chip, seg_no);
4031                        if (new_blk == 0xFFFF) {
4032                                ms_rw_fail(srb, chip);
4033                                rtsx_trace(chip);
4034                                return STATUS_FAIL;
4035                        }
4036                }
4037
4038                dev_dbg(rtsx_dev(chip), "seg_no = %d, old_blk = 0x%x, new_blk = 0x%x\n",
4039                        seg_no, old_blk, new_blk);
4040
4041                start_page = 0;
4042        }
4043
4044        if (srb->sc_data_direction == DMA_TO_DEVICE) {
4045                if (end_page < (ms_card->page_off + 1)) {
4046#ifdef MS_DELAY_WRITE
4047                        delay_write->delay_write_flag = 1;
4048                        delay_write->old_phyblock = old_blk;
4049                        delay_write->new_phyblock = new_blk;
4050                        delay_write->logblock = log_blk;
4051                        delay_write->pageoff = end_page;
4052#else
4053                        retval = ms_finish_write(chip, old_blk, new_blk,
4054                                                log_blk, end_page);
4055                        if (retval != STATUS_SUCCESS) {
4056                                if (detect_card_cd(chip, MS_CARD) != STATUS_SUCCESS) {
4057                                        set_sense_type(chip, lun,
4058                                                SENSE_TYPE_MEDIA_NOT_PRESENT);
4059                                        rtsx_trace(chip);
4060                                        return STATUS_FAIL;
4061                                }
4062
4063                                ms_rw_fail(srb, chip);
4064                                rtsx_trace(chip);
4065                                return STATUS_FAIL;
4066                        }
4067#endif
4068                }
4069        }
4070
4071        scsi_set_resid(srb, 0);
4072
4073        return STATUS_SUCCESS;
4074}
4075
4076int ms_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip,
4077        u32 start_sector, u16 sector_cnt)
4078{
4079        struct ms_info *ms_card = &(chip->ms_card);
4080        int retval;
4081
4082        if (CHK_MSPRO(ms_card))
4083                retval = mspro_rw_multi_sector(srb, chip, start_sector,
4084                                        sector_cnt);
4085        else
4086                retval = ms_rw_multi_sector(srb, chip, start_sector,
4087                                        sector_cnt);
4088
4089        return retval;
4090}
4091
4092
4093void ms_free_l2p_tbl(struct rtsx_chip *chip)
4094{
4095        struct ms_info *ms_card = &(chip->ms_card);
4096        int i = 0;
4097
4098        if (ms_card->segment != NULL) {
4099                for (i = 0; i < ms_card->segment_cnt; i++) {
4100                        if (ms_card->segment[i].l2p_table != NULL) {
4101                                vfree(ms_card->segment[i].l2p_table);
4102                                ms_card->segment[i].l2p_table = NULL;
4103                        }
4104                        if (ms_card->segment[i].free_table != NULL) {
4105                                vfree(ms_card->segment[i].free_table);
4106                                ms_card->segment[i].free_table = NULL;
4107                        }
4108                }
4109                vfree(ms_card->segment);
4110                ms_card->segment = NULL;
4111        }
4112}
4113
4114#ifdef SUPPORT_MAGIC_GATE
4115
4116#ifdef READ_BYTES_WAIT_INT
4117static int ms_poll_int(struct rtsx_chip *chip)
4118{
4119        int retval;
4120        u8 val;
4121
4122        rtsx_init_cmd(chip);
4123
4124        rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANS_CFG, MS_INT_CED, MS_INT_CED);
4125
4126        retval = rtsx_send_cmd(chip, MS_CARD, 5000);
4127        if (retval != STATUS_SUCCESS) {
4128                rtsx_trace(chip);
4129                return STATUS_FAIL;
4130        }
4131
4132        val = *rtsx_get_cmd_data(chip);
4133        if (val & MS_INT_ERR) {
4134                rtsx_trace(chip);
4135                return STATUS_FAIL;
4136        }
4137
4138        return STATUS_SUCCESS;
4139}
4140#endif
4141
4142#ifdef MS_SAMPLE_INT_ERR
4143static int check_ms_err(struct rtsx_chip *chip)
4144{
4145        int retval;
4146        u8 val;
4147
4148        retval = rtsx_read_register(chip, MS_TRANSFER, &val);
4149        if (retval != STATUS_SUCCESS)
4150                return 1;
4151        if (val & MS_TRANSFER_ERR)
4152                return 1;
4153
4154        retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
4155        if (retval != STATUS_SUCCESS)
4156                return 1;
4157
4158        if (val & (MS_INT_ERR | MS_INT_CMDNK))
4159                return 1;
4160
4161        return 0;
4162}
4163#else
4164static int check_ms_err(struct rtsx_chip *chip)
4165{
4166        int retval;
4167        u8 val;
4168
4169        retval = rtsx_read_register(chip, MS_TRANSFER, &val);
4170        if (retval != STATUS_SUCCESS)
4171                return 1;
4172        if (val & MS_TRANSFER_ERR)
4173                return 1;
4174
4175        return 0;
4176}
4177#endif
4178
4179static int mg_send_ex_cmd(struct rtsx_chip *chip, u8 cmd, u8 entry_num)
4180{
4181        int retval, i;
4182        u8 data[8];
4183
4184        data[0] = cmd;
4185        data[1] = 0;
4186        data[2] = 0;
4187        data[3] = 0;
4188        data[4] = 0;
4189        data[5] = 0;
4190        data[6] = entry_num;
4191        data[7] = 0;
4192
4193        for (i = 0; i < MS_MAX_RETRY_COUNT; i++) {
4194                retval = ms_write_bytes(chip, PRO_EX_SET_CMD, 7, WAIT_INT,
4195                                        data, 8);
4196                if (retval == STATUS_SUCCESS)
4197                        break;
4198        }
4199        if (i == MS_MAX_RETRY_COUNT) {
4200                rtsx_trace(chip);
4201                return STATUS_FAIL;
4202        }
4203
4204        if (check_ms_err(chip)) {
4205                rtsx_clear_ms_error(chip);
4206                rtsx_trace(chip);
4207                return STATUS_FAIL;
4208        }
4209
4210        return STATUS_SUCCESS;
4211}
4212
4213static int mg_set_tpc_para_sub(struct rtsx_chip *chip, int type,
4214                        u8 mg_entry_num)
4215{
4216        int retval;
4217        u8 buf[6];
4218
4219        if (type == 0)
4220                retval = ms_set_rw_reg_addr(chip, 0, 0, Pro_TPCParm, 1);
4221        else
4222                retval = ms_set_rw_reg_addr(chip, 0, 0, Pro_DataCount1, 6);
4223
4224        if (retval != STATUS_SUCCESS) {
4225                rtsx_trace(chip);
4226                return STATUS_FAIL;
4227        }
4228
4229        buf[0] = 0;
4230        buf[1] = 0;
4231        if (type == 1) {
4232                buf[2] = 0;
4233                buf[3] = 0;
4234                buf[4] = 0;
4235                buf[5] = mg_entry_num;
4236        }
4237        retval = ms_write_bytes(chip, PRO_WRITE_REG, (type == 0) ? 1 : 6,
4238                                NO_WAIT_INT, buf, 6);
4239        if (retval != STATUS_SUCCESS) {
4240                rtsx_trace(chip);
4241                return STATUS_FAIL;
4242        }
4243
4244        return STATUS_SUCCESS;
4245}
4246
4247int mg_set_leaf_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4248{
4249        int retval;
4250        int i;
4251        unsigned int lun = SCSI_LUN(srb);
4252        u8 buf1[32], buf2[12];
4253
4254        if (scsi_bufflen(srb) < 12) {
4255                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4256                rtsx_trace(chip);
4257                return STATUS_FAIL;
4258        }
4259
4260        ms_cleanup_work(chip);
4261
4262        retval = ms_switch_clock(chip);
4263        if (retval != STATUS_SUCCESS) {
4264                rtsx_trace(chip);
4265                return STATUS_FAIL;
4266        }
4267
4268        retval = mg_send_ex_cmd(chip, MG_SET_LID, 0);
4269        if (retval != STATUS_SUCCESS) {
4270                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4271                rtsx_trace(chip);
4272                return STATUS_FAIL;
4273        }
4274
4275        memset(buf1, 0, 32);
4276        rtsx_stor_get_xfer_buf(buf2, min_t(int, 12, scsi_bufflen(srb)), srb);
4277        for (i = 0; i < 8; i++)
4278                buf1[8+i] = buf2[4+i];
4279
4280        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
4281                                buf1, 32);
4282        if (retval != STATUS_SUCCESS) {
4283                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4284                rtsx_trace(chip);
4285                return STATUS_FAIL;
4286        }
4287        if (check_ms_err(chip)) {
4288                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4289                rtsx_clear_ms_error(chip);
4290                rtsx_trace(chip);
4291                return STATUS_FAIL;
4292        }
4293
4294        return STATUS_SUCCESS;
4295}
4296
4297int mg_get_local_EKB(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4298{
4299        int retval = STATUS_FAIL;
4300        int bufflen;
4301        unsigned int lun = SCSI_LUN(srb);
4302        u8 *buf = NULL;
4303
4304        ms_cleanup_work(chip);
4305
4306        retval = ms_switch_clock(chip);
4307        if (retval != STATUS_SUCCESS) {
4308                rtsx_trace(chip);
4309                return STATUS_FAIL;
4310        }
4311
4312        buf = kmalloc(1540, GFP_KERNEL);
4313        if (!buf) {
4314                rtsx_trace(chip);
4315                return STATUS_ERROR;
4316        }
4317
4318        buf[0] = 0x04;
4319        buf[1] = 0x1A;
4320        buf[2] = 0x00;
4321        buf[3] = 0x00;
4322
4323        retval = mg_send_ex_cmd(chip, MG_GET_LEKB, 0);
4324        if (retval != STATUS_SUCCESS) {
4325                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4326                rtsx_trace(chip);
4327                goto GetEKBFinish;
4328        }
4329
4330        retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
4331                                3, WAIT_INT, 0, 0, buf + 4, 1536);
4332        if (retval != STATUS_SUCCESS) {
4333                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4334                rtsx_clear_ms_error(chip);
4335                rtsx_trace(chip);
4336                goto GetEKBFinish;
4337        }
4338        if (check_ms_err(chip)) {
4339                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4340                rtsx_clear_ms_error(chip);
4341                rtsx_trace(chip);
4342                return STATUS_FAIL;
4343        }
4344
4345        bufflen = min_t(int, 1052, scsi_bufflen(srb));
4346        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
4347
4348GetEKBFinish:
4349        kfree(buf);
4350        return retval;
4351}
4352
4353int mg_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4354{
4355        struct ms_info *ms_card = &(chip->ms_card);
4356        int retval;
4357        int bufflen;
4358        int i;
4359        unsigned int lun = SCSI_LUN(srb);
4360        u8 buf[32];
4361
4362        ms_cleanup_work(chip);
4363
4364        retval = ms_switch_clock(chip);
4365        if (retval != STATUS_SUCCESS) {
4366                rtsx_trace(chip);
4367                return STATUS_FAIL;
4368        }
4369
4370        retval = mg_send_ex_cmd(chip, MG_GET_ID, 0);
4371        if (retval != STATUS_SUCCESS) {
4372                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4373                rtsx_trace(chip);
4374                return STATUS_FAIL;
4375        }
4376
4377        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
4378                        buf, 32);
4379        if (retval != STATUS_SUCCESS) {
4380                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4381                rtsx_trace(chip);
4382                return STATUS_FAIL;
4383        }
4384        if (check_ms_err(chip)) {
4385                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4386                rtsx_clear_ms_error(chip);
4387                rtsx_trace(chip);
4388                return STATUS_FAIL;
4389        }
4390
4391        memcpy(ms_card->magic_gate_id, buf, 16);
4392
4393#ifdef READ_BYTES_WAIT_INT
4394        retval = ms_poll_int(chip);
4395        if (retval != STATUS_SUCCESS) {
4396                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4397                rtsx_trace(chip);
4398                return STATUS_FAIL;
4399        }
4400#endif
4401
4402        retval = mg_send_ex_cmd(chip, MG_SET_RD, 0);
4403        if (retval != STATUS_SUCCESS) {
4404                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4405                rtsx_trace(chip);
4406                return STATUS_FAIL;
4407        }
4408
4409        bufflen = min_t(int, 12, scsi_bufflen(srb));
4410        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
4411
4412        for (i = 0; i < 8; i++)
4413                buf[i] = buf[4+i];
4414
4415        for (i = 0; i < 24; i++)
4416                buf[8+i] = 0;
4417
4418        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA,
4419                                32, WAIT_INT, buf, 32);
4420        if (retval != STATUS_SUCCESS) {
4421                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4422                rtsx_trace(chip);
4423                return STATUS_FAIL;
4424        }
4425        if (check_ms_err(chip)) {
4426                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
4427                rtsx_clear_ms_error(chip);
4428                rtsx_trace(chip);
4429                return STATUS_FAIL;
4430        }
4431
4432        ms_card->mg_auth = 0;
4433
4434        return STATUS_SUCCESS;
4435}
4436
4437int mg_get_rsp_chg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4438{
4439        struct ms_info *ms_card = &(chip->ms_card);
4440        int retval;
4441        int bufflen;
4442        unsigned int lun = SCSI_LUN(srb);
4443        u8 buf1[32], buf2[36];
4444
4445        ms_cleanup_work(chip);
4446
4447        retval = ms_switch_clock(chip);
4448        if (retval != STATUS_SUCCESS) {
4449                rtsx_trace(chip);
4450                return STATUS_FAIL;
4451        }
4452
4453        retval = mg_send_ex_cmd(chip, MG_MAKE_RMS, 0);
4454        if (retval != STATUS_SUCCESS) {
4455                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4456                rtsx_trace(chip);
4457                return STATUS_FAIL;
4458        }
4459
4460        retval = ms_read_bytes(chip, PRO_READ_SHORT_DATA, 32, WAIT_INT,
4461                        buf1, 32);
4462        if (retval != STATUS_SUCCESS) {
4463                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4464                rtsx_trace(chip);
4465                return STATUS_FAIL;
4466        }
4467        if (check_ms_err(chip)) {
4468                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4469                rtsx_clear_ms_error(chip);
4470                rtsx_trace(chip);
4471                return STATUS_FAIL;
4472        }
4473
4474        buf2[0] = 0x00;
4475        buf2[1] = 0x22;
4476        buf2[2] = 0x00;
4477        buf2[3] = 0x00;
4478
4479        memcpy(buf2 + 4, ms_card->magic_gate_id, 16);
4480        memcpy(buf2 + 20, buf1, 16);
4481
4482        bufflen = min_t(int, 36, scsi_bufflen(srb));
4483        rtsx_stor_set_xfer_buf(buf2, bufflen, srb);
4484
4485#ifdef READ_BYTES_WAIT_INT
4486        retval = ms_poll_int(chip);
4487        if (retval != STATUS_SUCCESS) {
4488                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4489                rtsx_trace(chip);
4490                return STATUS_FAIL;
4491        }
4492#endif
4493
4494        return STATUS_SUCCESS;
4495}
4496
4497int mg_rsp(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4498{
4499        struct ms_info *ms_card = &(chip->ms_card);
4500        int retval;
4501        int i;
4502        int bufflen;
4503        unsigned int lun = SCSI_LUN(srb);
4504        u8 buf[32];
4505
4506        ms_cleanup_work(chip);
4507
4508        retval = ms_switch_clock(chip);
4509        if (retval != STATUS_SUCCESS) {
4510                rtsx_trace(chip);
4511                return STATUS_FAIL;
4512        }
4513
4514        retval = mg_send_ex_cmd(chip, MG_MAKE_KSE, 0);
4515        if (retval != STATUS_SUCCESS) {
4516                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4517                rtsx_trace(chip);
4518                return STATUS_FAIL;
4519        }
4520
4521        bufflen = min_t(int, 12, scsi_bufflen(srb));
4522        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
4523
4524        for (i = 0; i < 8; i++)
4525                buf[i] = buf[4+i];
4526
4527        for (i = 0; i < 24; i++)
4528                buf[8+i] = 0;
4529
4530        retval = ms_write_bytes(chip, PRO_WRITE_SHORT_DATA, 32, WAIT_INT,
4531                                buf, 32);
4532        if (retval != STATUS_SUCCESS) {
4533                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4534                rtsx_trace(chip);
4535                return STATUS_FAIL;
4536        }
4537        if (check_ms_err(chip)) {
4538                set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN);
4539                rtsx_clear_ms_error(chip);
4540                rtsx_trace(chip);
4541                return STATUS_FAIL;
4542        }
4543
4544        ms_card->mg_auth = 1;
4545
4546        return STATUS_SUCCESS;
4547}
4548
4549int mg_get_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4550{
4551        struct ms_info *ms_card = &(chip->ms_card);
4552        int retval;
4553        int bufflen;
4554        unsigned int lun = SCSI_LUN(srb);
4555        u8 *buf = NULL;
4556
4557        ms_cleanup_work(chip);
4558
4559        retval = ms_switch_clock(chip);
4560        if (retval != STATUS_SUCCESS) {
4561                rtsx_trace(chip);
4562                return STATUS_FAIL;
4563        }
4564
4565        buf = kmalloc(1028, GFP_KERNEL);
4566        if (!buf) {
4567                rtsx_trace(chip);
4568                return STATUS_ERROR;
4569        }
4570
4571        buf[0] = 0x04;
4572        buf[1] = 0x02;
4573        buf[2] = 0x00;
4574        buf[3] = 0x00;
4575
4576        retval = mg_send_ex_cmd(chip, MG_GET_IBD, ms_card->mg_entry_num);
4577        if (retval != STATUS_SUCCESS) {
4578                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4579                rtsx_trace(chip);
4580                goto GetICVFinish;
4581        }
4582
4583        retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
4584                                2, WAIT_INT, 0, 0, buf + 4, 1024);
4585        if (retval != STATUS_SUCCESS) {
4586                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4587                rtsx_clear_ms_error(chip);
4588                rtsx_trace(chip);
4589                goto GetICVFinish;
4590        }
4591        if (check_ms_err(chip)) {
4592                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4593                rtsx_clear_ms_error(chip);
4594                rtsx_trace(chip);
4595                return STATUS_FAIL;
4596        }
4597
4598        bufflen = min_t(int, 1028, scsi_bufflen(srb));
4599        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
4600
4601GetICVFinish:
4602        kfree(buf);
4603        return retval;
4604}
4605
4606int mg_set_ICV(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4607{
4608        struct ms_info *ms_card = &(chip->ms_card);
4609        int retval;
4610        int bufflen;
4611#ifdef MG_SET_ICV_SLOW
4612        int i;
4613#endif
4614        unsigned int lun = SCSI_LUN(srb);
4615        u8 *buf = NULL;
4616
4617        ms_cleanup_work(chip);
4618
4619        retval = ms_switch_clock(chip);
4620        if (retval != STATUS_SUCCESS) {
4621                rtsx_trace(chip);
4622                return STATUS_FAIL;
4623        }
4624
4625        buf = kmalloc(1028, GFP_KERNEL);
4626        if (!buf) {
4627                rtsx_trace(chip);
4628                return STATUS_ERROR;
4629        }
4630
4631        bufflen = min_t(int, 1028, scsi_bufflen(srb));
4632        rtsx_stor_get_xfer_buf(buf, bufflen, srb);
4633
4634        retval = mg_send_ex_cmd(chip, MG_SET_IBD, ms_card->mg_entry_num);
4635        if (retval != STATUS_SUCCESS) {
4636                if (ms_card->mg_auth == 0) {
4637                        if ((buf[5] & 0xC0) != 0)
4638                                set_sense_type(chip, lun,
4639                                        SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4640                        else
4641                                set_sense_type(chip, lun,
4642                                        SENSE_TYPE_MG_WRITE_ERR);
4643                } else {
4644                        set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
4645                }
4646                rtsx_trace(chip);
4647                goto SetICVFinish;
4648        }
4649
4650#ifdef MG_SET_ICV_SLOW
4651        for (i = 0; i < 2; i++) {
4652                udelay(50);
4653
4654                rtsx_init_cmd(chip);
4655
4656                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TPC,
4657                        0xFF, PRO_WRITE_LONG_DATA);
4658                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, WAIT_INT);
4659                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
4660                        0x01, RING_BUFFER);
4661
4662                trans_dma_enable(DMA_TO_DEVICE, chip, 512, DMA_512);
4663
4664                rtsx_add_cmd(chip, WRITE_REG_CMD, MS_TRANSFER, 0xFF,
4665                                MS_TRANSFER_START |  MS_TM_NORMAL_WRITE);
4666                rtsx_add_cmd(chip, CHECK_REG_CMD, MS_TRANSFER,
4667                        MS_TRANSFER_END, MS_TRANSFER_END);
4668
4669                rtsx_send_cmd_no_wait(chip);
4670
4671                retval = rtsx_transfer_data(chip, MS_CARD, buf + 4 + i*512,
4672                                        512, 0, DMA_TO_DEVICE, 3000);
4673                if ((retval < 0) || check_ms_err(chip)) {
4674                        rtsx_clear_ms_error(chip);
4675                        if (ms_card->mg_auth == 0) {
4676                                if ((buf[5] & 0xC0) != 0)
4677                                        set_sense_type(chip, lun, SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4678                                else
4679                                        set_sense_type(chip, lun,
4680                                                SENSE_TYPE_MG_WRITE_ERR);
4681                        } else {
4682                                set_sense_type(chip, lun,
4683                                        SENSE_TYPE_MG_WRITE_ERR);
4684                        }
4685                        retval = STATUS_FAIL;
4686                        rtsx_trace(chip);
4687                        goto SetICVFinish;
4688                }
4689        }
4690#else
4691        retval = ms_transfer_data(chip, MS_TM_AUTO_WRITE, PRO_WRITE_LONG_DATA,
4692                                2, WAIT_INT, 0, 0, buf + 4, 1024);
4693        if ((retval != STATUS_SUCCESS) || check_ms_err(chip)) {
4694                rtsx_clear_ms_error(chip);
4695                if (ms_card->mg_auth == 0) {
4696                        if ((buf[5] & 0xC0) != 0)
4697                                set_sense_type(chip, lun,
4698                                        SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB);
4699                        else
4700                                set_sense_type(chip, lun,
4701                                        SENSE_TYPE_MG_WRITE_ERR);
4702                } else {
4703                        set_sense_type(chip, lun, SENSE_TYPE_MG_WRITE_ERR);
4704                }
4705                rtsx_trace(chip);
4706                goto SetICVFinish;
4707        }
4708#endif
4709
4710SetICVFinish:
4711        kfree(buf);
4712        return retval;
4713}
4714
4715#endif /* SUPPORT_MAGIC_GATE */
4716
4717void ms_cleanup_work(struct rtsx_chip *chip)
4718{
4719        struct ms_info *ms_card = &(chip->ms_card);
4720
4721        if (CHK_MSPRO(ms_card)) {
4722                if (ms_card->seq_mode) {
4723                        dev_dbg(rtsx_dev(chip), "MS Pro: stop transmission\n");
4724                        mspro_stop_seq_mode(chip);
4725                        ms_card->cleanup_counter = 0;
4726                }
4727                if (CHK_MSHG(ms_card)) {
4728                        rtsx_write_register(chip, MS_CFG,
4729                                MS_2K_SECTOR_MODE, 0x00);
4730                }
4731        }
4732#ifdef MS_DELAY_WRITE
4733        else if ((!CHK_MSPRO(ms_card)) && ms_card->delay_write.delay_write_flag) {
4734                dev_dbg(rtsx_dev(chip), "MS: delay write\n");
4735                ms_delay_write(chip);
4736                ms_card->cleanup_counter = 0;
4737        }
4738#endif
4739}
4740
4741int ms_power_off_card3v3(struct rtsx_chip *chip)
4742{
4743        int retval;
4744
4745        retval = disable_card_clock(chip, MS_CARD);
4746        if (retval != STATUS_SUCCESS) {
4747                rtsx_trace(chip);
4748                return STATUS_FAIL;
4749        }
4750
4751        if (chip->asic_code) {
4752                retval = ms_pull_ctl_disable(chip);
4753                if (retval != STATUS_SUCCESS) {
4754                        rtsx_trace(chip);
4755                        return STATUS_FAIL;
4756                }
4757        } else {
4758                retval = rtsx_write_register(chip, FPGA_PULL_CTL,
4759                                             FPGA_MS_PULL_CTL_BIT | 0x20,
4760                                             FPGA_MS_PULL_CTL_BIT);
4761                if (retval) {
4762                        rtsx_trace(chip);
4763                        return retval;
4764                }
4765        }
4766        retval = rtsx_write_register(chip, CARD_OE, MS_OUTPUT_EN, 0);
4767        if (retval) {
4768                rtsx_trace(chip);
4769                return retval;
4770        }
4771        if (!chip->ft2_fast_mode) {
4772                retval = card_power_off(chip, MS_CARD);
4773                if (retval != STATUS_SUCCESS) {
4774                        rtsx_trace(chip);
4775                        return STATUS_FAIL;
4776                }
4777        }
4778
4779        return STATUS_SUCCESS;
4780}
4781
4782int release_ms_card(struct rtsx_chip *chip)
4783{
4784        struct ms_info *ms_card = &(chip->ms_card);
4785        int retval;
4786
4787#ifdef MS_DELAY_WRITE
4788        ms_card->delay_write.delay_write_flag = 0;
4789#endif
4790        ms_card->pro_under_formatting = 0;
4791
4792        chip->card_ready &= ~MS_CARD;
4793        chip->card_fail &= ~MS_CARD;
4794        chip->card_wp &= ~MS_CARD;
4795
4796        ms_free_l2p_tbl(chip);
4797
4798        memset(ms_card->raw_sys_info, 0, 96);
4799#ifdef SUPPORT_PCGL_1P18
4800        memset(ms_card->raw_model_name, 0, 48);
4801#endif
4802
4803        retval = ms_power_off_card3v3(chip);
4804        if (retval != STATUS_SUCCESS) {
4805                rtsx_trace(chip);
4806                return STATUS_FAIL;
4807        }
4808
4809        return STATUS_SUCCESS;
4810}
4811