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