linux/drivers/staging/rts5208/sd.c
<<
>>
Prefs
   1/* Driver for Realtek PCI-Express card reader
   2 *
   3 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License as published by the
   7 * Free Software Foundation; either version 2, or (at your option) any
   8 * later version.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program; if not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * Author:
  19 *   Wei WANG (wei_wang@realsil.com.cn)
  20 *   Micky Ching (micky_ching@realsil.com.cn)
  21 */
  22
  23#include <linux/blkdev.h>
  24#include <linux/kthread.h>
  25#include <linux/sched.h>
  26
  27#include "rtsx.h"
  28#include "sd.h"
  29
  30#define SD_MAX_RETRY_COUNT      3
  31
  32static u16 REG_SD_CFG1;
  33static u16 REG_SD_CFG2;
  34static u16 REG_SD_CFG3;
  35static u16 REG_SD_STAT1;
  36static u16 REG_SD_STAT2;
  37static u16 REG_SD_BUS_STAT;
  38static u16 REG_SD_PAD_CTL;
  39static u16 REG_SD_SAMPLE_POINT_CTL;
  40static u16 REG_SD_PUSH_POINT_CTL;
  41static u16 REG_SD_CMD0;
  42static u16 REG_SD_CMD1;
  43static u16 REG_SD_CMD2;
  44static u16 REG_SD_CMD3;
  45static u16 REG_SD_CMD4;
  46static u16 REG_SD_CMD5;
  47static u16 REG_SD_BYTE_CNT_L;
  48static u16 REG_SD_BYTE_CNT_H;
  49static u16 REG_SD_BLOCK_CNT_L;
  50static u16 REG_SD_BLOCK_CNT_H;
  51static u16 REG_SD_TRANSFER;
  52static u16 REG_SD_VPCLK0_CTL;
  53static u16 REG_SD_VPCLK1_CTL;
  54static u16 REG_SD_DCMPS0_CTL;
  55static u16 REG_SD_DCMPS1_CTL;
  56
  57static inline void sd_set_err_code(struct rtsx_chip *chip, u8 err_code)
  58{
  59        struct sd_info *sd_card = &chip->sd_card;
  60
  61        sd_card->err_code |= err_code;
  62}
  63
  64static inline void sd_clr_err_code(struct rtsx_chip *chip)
  65{
  66        struct sd_info *sd_card = &chip->sd_card;
  67
  68        sd_card->err_code = 0;
  69}
  70
  71static inline int sd_check_err_code(struct rtsx_chip *chip, u8 err_code)
  72{
  73        struct sd_info *sd_card = &chip->sd_card;
  74
  75        return sd_card->err_code & err_code;
  76}
  77
  78static void sd_init_reg_addr(struct rtsx_chip *chip)
  79{
  80        REG_SD_CFG1 = 0xFD31;
  81        REG_SD_CFG2 = 0xFD33;
  82        REG_SD_CFG3 = 0xFD3E;
  83        REG_SD_STAT1 = 0xFD30;
  84        REG_SD_STAT2 = 0;
  85        REG_SD_BUS_STAT = 0;
  86        REG_SD_PAD_CTL = 0;
  87        REG_SD_SAMPLE_POINT_CTL = 0;
  88        REG_SD_PUSH_POINT_CTL = 0;
  89        REG_SD_CMD0 = 0xFD34;
  90        REG_SD_CMD1 = 0xFD35;
  91        REG_SD_CMD2 = 0xFD36;
  92        REG_SD_CMD3 = 0xFD37;
  93        REG_SD_CMD4 = 0xFD38;
  94        REG_SD_CMD5 = 0xFD5A;
  95        REG_SD_BYTE_CNT_L = 0xFD39;
  96        REG_SD_BYTE_CNT_H = 0xFD3A;
  97        REG_SD_BLOCK_CNT_L = 0xFD3B;
  98        REG_SD_BLOCK_CNT_H = 0xFD3C;
  99        REG_SD_TRANSFER = 0xFD32;
 100        REG_SD_VPCLK0_CTL = 0;
 101        REG_SD_VPCLK1_CTL = 0;
 102        REG_SD_DCMPS0_CTL = 0;
 103        REG_SD_DCMPS1_CTL = 0;
 104}
 105
 106static int sd_check_data0_status(struct rtsx_chip *chip)
 107{
 108        int retval;
 109        u8 stat;
 110
 111        retval = rtsx_read_register(chip, REG_SD_STAT1, &stat);
 112        if (retval) {
 113                rtsx_trace(chip);
 114                return retval;
 115        }
 116
 117        if (!(stat & SD_DAT0_STATUS)) {
 118                sd_set_err_code(chip, SD_BUSY);
 119                rtsx_trace(chip);
 120                return STATUS_FAIL;
 121        }
 122
 123        return STATUS_SUCCESS;
 124}
 125
 126static int sd_send_cmd_get_rsp(struct rtsx_chip *chip, u8 cmd_idx,
 127                               u32 arg, u8 rsp_type, u8 *rsp, int rsp_len)
 128{
 129        struct sd_info *sd_card = &chip->sd_card;
 130        int retval;
 131        int timeout = 100;
 132        u16 reg_addr;
 133        u8 *ptr;
 134        int stat_idx = 0;
 135        int rty_cnt = 0;
 136
 137        sd_clr_err_code(chip);
 138
 139        dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d, arg = 0x%08x\n", cmd_idx, arg);
 140
 141        if (rsp_type == SD_RSP_TYPE_R1b)
 142                timeout = 3000;
 143
 144RTY_SEND_CMD:
 145
 146        rtsx_init_cmd(chip);
 147
 148        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | cmd_idx);
 149        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, (u8)(arg >> 24));
 150        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, (u8)(arg >> 16));
 151        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, (u8)(arg >> 8));
 152        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, (u8)arg);
 153
 154        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
 155        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
 156                     0x01, PINGPONG_BUFFER);
 157        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
 158                     0xFF, SD_TM_CMD_RSP | SD_TRANSFER_START);
 159        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
 160                     SD_TRANSFER_END | SD_STAT_IDLE, SD_TRANSFER_END |
 161                     SD_STAT_IDLE);
 162
 163        if (rsp_type == SD_RSP_TYPE_R2) {
 164                for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16;
 165                     reg_addr++)
 166                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
 167
 168                stat_idx = 16;
 169        } else if (rsp_type != SD_RSP_TYPE_R0) {
 170                for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4;
 171                     reg_addr++)
 172                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
 173
 174                stat_idx = 5;
 175        }
 176
 177        rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_STAT1, 0, 0);
 178
 179        retval = rtsx_send_cmd(chip, SD_CARD, timeout);
 180        if (retval < 0) {
 181                u8 val;
 182
 183                rtsx_read_register(chip, REG_SD_STAT1, &val);
 184                dev_dbg(rtsx_dev(chip), "SD_STAT1: 0x%x\n", val);
 185
 186                rtsx_read_register(chip, REG_SD_CFG3, &val);
 187                dev_dbg(rtsx_dev(chip), "SD_CFG3: 0x%x\n", val);
 188
 189                if (retval == -ETIMEDOUT) {
 190                        if (rsp_type & SD_WAIT_BUSY_END) {
 191                                retval = sd_check_data0_status(chip);
 192                                if (retval != STATUS_SUCCESS) {
 193                                        rtsx_clear_sd_error(chip);
 194                                        rtsx_trace(chip);
 195                                        return retval;
 196                                }
 197                        } else {
 198                                sd_set_err_code(chip, SD_TO_ERR);
 199                        }
 200                        retval = STATUS_TIMEDOUT;
 201                } else {
 202                        retval = STATUS_FAIL;
 203                }
 204                rtsx_clear_sd_error(chip);
 205
 206                rtsx_trace(chip);
 207                return retval;
 208        }
 209
 210        if (rsp_type == SD_RSP_TYPE_R0)
 211                return STATUS_SUCCESS;
 212
 213        ptr = rtsx_get_cmd_data(chip) + 1;
 214
 215        if ((ptr[0] & 0xC0) != 0) {
 216                sd_set_err_code(chip, SD_STS_ERR);
 217                rtsx_trace(chip);
 218                return STATUS_FAIL;
 219        }
 220
 221        if (!(rsp_type & SD_NO_CHECK_CRC7)) {
 222                if (ptr[stat_idx] & SD_CRC7_ERR) {
 223                        if (cmd_idx == WRITE_MULTIPLE_BLOCK) {
 224                                sd_set_err_code(chip, SD_CRC_ERR);
 225                                rtsx_trace(chip);
 226                                return STATUS_FAIL;
 227                        }
 228                        if (rty_cnt < SD_MAX_RETRY_COUNT) {
 229                                wait_timeout(20);
 230                                rty_cnt++;
 231                                goto RTY_SEND_CMD;
 232                        } else {
 233                                sd_set_err_code(chip, SD_CRC_ERR);
 234                                rtsx_trace(chip);
 235                                return STATUS_FAIL;
 236                        }
 237                }
 238        }
 239
 240        if ((rsp_type == SD_RSP_TYPE_R1) || (rsp_type == SD_RSP_TYPE_R1b)) {
 241                if ((cmd_idx != SEND_RELATIVE_ADDR) &&
 242                    (cmd_idx != SEND_IF_COND)) {
 243                        if (cmd_idx != STOP_TRANSMISSION) {
 244                                if (ptr[1] & 0x80) {
 245                                        rtsx_trace(chip);
 246                                        return STATUS_FAIL;
 247                                }
 248                        }
 249#ifdef SUPPORT_SD_LOCK
 250                        if (ptr[1] & 0x7D) {
 251#else
 252                        if (ptr[1] & 0x7F) {
 253#endif
 254                                dev_dbg(rtsx_dev(chip), "ptr[1]: 0x%02x\n",
 255                                        ptr[1]);
 256                                rtsx_trace(chip);
 257                                return STATUS_FAIL;
 258                        }
 259                        if (ptr[2] & 0xFF) {
 260                                dev_dbg(rtsx_dev(chip), "ptr[2]: 0x%02x\n",
 261                                        ptr[2]);
 262                                rtsx_trace(chip);
 263                                return STATUS_FAIL;
 264                        }
 265                        if (ptr[3] & 0x80) {
 266                                dev_dbg(rtsx_dev(chip), "ptr[3]: 0x%02x\n",
 267                                        ptr[3]);
 268                                rtsx_trace(chip);
 269                                return STATUS_FAIL;
 270                        }
 271                        if (ptr[3] & 0x01)
 272                                sd_card->sd_data_buf_ready = 1;
 273                        else
 274                                sd_card->sd_data_buf_ready = 0;
 275                }
 276        }
 277
 278        if (rsp && rsp_len)
 279                memcpy(rsp, ptr, rsp_len);
 280
 281        return STATUS_SUCCESS;
 282}
 283
 284static int sd_read_data(struct rtsx_chip *chip,
 285                        u8 trans_mode, u8 *cmd, int cmd_len, u16 byte_cnt,
 286                        u16 blk_cnt, u8 bus_width, u8 *buf, int buf_len,
 287                        int timeout)
 288{
 289        struct sd_info *sd_card = &chip->sd_card;
 290        int retval;
 291        int i;
 292
 293        sd_clr_err_code(chip);
 294
 295        if (!buf)
 296                buf_len = 0;
 297
 298        if (buf_len > 512) {
 299                rtsx_trace(chip);
 300                return STATUS_FAIL;
 301        }
 302
 303        rtsx_init_cmd(chip);
 304
 305        if (cmd_len) {
 306                dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d\n", cmd[0] - 0x40);
 307                for (i = 0; i < (min(cmd_len, 6)); i++)
 308                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0 + i,
 309                                     0xFF, cmd[i]);
 310        }
 311        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF,
 312                     (u8)byte_cnt);
 313        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF,
 314                     (u8)(byte_cnt >> 8));
 315        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF,
 316                     (u8)blk_cnt);
 317        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF,
 318                     (u8)(blk_cnt >> 8));
 319
 320        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
 321
 322        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
 323                     SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
 324                     SD_CHECK_CRC7 | SD_RSP_LEN_6);
 325        if (trans_mode != SD_TM_AUTO_TUNING)
 326                rtsx_add_cmd(chip, WRITE_REG_CMD,
 327                             CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
 328
 329        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
 330                     trans_mode | SD_TRANSFER_START);
 331        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END,
 332                     SD_TRANSFER_END);
 333
 334        retval = rtsx_send_cmd(chip, SD_CARD, timeout);
 335        if (retval < 0) {
 336                if (retval == -ETIMEDOUT) {
 337                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 338                                            SD_RSP_TYPE_R1, NULL, 0);
 339                }
 340
 341                rtsx_trace(chip);
 342                return STATUS_FAIL;
 343        }
 344
 345        if (buf && buf_len) {
 346                retval = rtsx_read_ppbuf(chip, buf, buf_len);
 347                if (retval != STATUS_SUCCESS) {
 348                        rtsx_trace(chip);
 349                        return STATUS_FAIL;
 350                }
 351        }
 352
 353        return STATUS_SUCCESS;
 354}
 355
 356static int sd_write_data(struct rtsx_chip *chip, u8 trans_mode,
 357                         u8 *cmd, int cmd_len, u16 byte_cnt, u16 blk_cnt,
 358                         u8 bus_width, u8 *buf, int buf_len, int timeout)
 359{
 360        struct sd_info *sd_card = &chip->sd_card;
 361        int retval;
 362        int i;
 363
 364        sd_clr_err_code(chip);
 365
 366        if (!buf)
 367                buf_len = 0;
 368
 369        if (buf_len > 512) {
 370                /* This function can't write data more than one page */
 371                rtsx_trace(chip);
 372                return STATUS_FAIL;
 373        }
 374
 375        if (buf && buf_len) {
 376                retval = rtsx_write_ppbuf(chip, buf, buf_len);
 377                if (retval != STATUS_SUCCESS) {
 378                        rtsx_trace(chip);
 379                        return STATUS_FAIL;
 380                }
 381        }
 382
 383        rtsx_init_cmd(chip);
 384
 385        if (cmd_len) {
 386                dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d\n", cmd[0] - 0x40);
 387                for (i = 0; i < (min(cmd_len, 6)); i++) {
 388                        rtsx_add_cmd(chip, WRITE_REG_CMD,
 389                                     REG_SD_CMD0 + i, 0xFF, cmd[i]);
 390                }
 391        }
 392        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF,
 393                     (u8)byte_cnt);
 394        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF,
 395                     (u8)(byte_cnt >> 8));
 396        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF,
 397                     (u8)blk_cnt);
 398        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF,
 399                     (u8)(blk_cnt >> 8));
 400
 401        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
 402
 403        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
 404                     SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
 405                     SD_CHECK_CRC7 | SD_RSP_LEN_6);
 406
 407        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
 408                     trans_mode | SD_TRANSFER_START);
 409        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END,
 410                     SD_TRANSFER_END);
 411
 412        retval = rtsx_send_cmd(chip, SD_CARD, timeout);
 413        if (retval < 0) {
 414                if (retval == -ETIMEDOUT) {
 415                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 416                                            SD_RSP_TYPE_R1, NULL, 0);
 417                }
 418
 419                rtsx_trace(chip);
 420                return STATUS_FAIL;
 421        }
 422
 423        return STATUS_SUCCESS;
 424}
 425
 426static int sd_check_csd(struct rtsx_chip *chip, char check_wp)
 427{
 428        struct sd_info *sd_card = &chip->sd_card;
 429        int retval;
 430        int i;
 431        u8 csd_ver, trans_speed;
 432        u8 rsp[16];
 433
 434        for (i = 0; i < 6; i++) {
 435                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
 436                        sd_set_err_code(chip, SD_NO_CARD);
 437                        rtsx_trace(chip);
 438                        return STATUS_FAIL;
 439                }
 440
 441                retval = sd_send_cmd_get_rsp(chip, SEND_CSD, sd_card->sd_addr,
 442                                             SD_RSP_TYPE_R2, rsp, 16);
 443                if (retval == STATUS_SUCCESS)
 444                        break;
 445        }
 446
 447        if (i == 6) {
 448                rtsx_trace(chip);
 449                return STATUS_FAIL;
 450        }
 451
 452        memcpy(sd_card->raw_csd, rsp + 1, 15);
 453
 454        dev_dbg(rtsx_dev(chip), "CSD Response:\n");
 455        dev_dbg(rtsx_dev(chip), "%*ph\n", 16, sd_card->raw_csd);
 456
 457        csd_ver = (rsp[1] & 0xc0) >> 6;
 458        dev_dbg(rtsx_dev(chip), "csd_ver = %d\n", csd_ver);
 459
 460        trans_speed = rsp[4];
 461        if ((trans_speed & 0x07) == 0x02) {
 462                if ((trans_speed & 0xf8) >= 0x30) {
 463                        if (chip->asic_code)
 464                                sd_card->sd_clock = 47;
 465                        else
 466                                sd_card->sd_clock = CLK_50;
 467
 468                } else if ((trans_speed & 0xf8) == 0x28) {
 469                        if (chip->asic_code)
 470                                sd_card->sd_clock = 39;
 471                        else
 472                                sd_card->sd_clock = CLK_40;
 473
 474                } else if ((trans_speed & 0xf8) == 0x20) {
 475                        if (chip->asic_code)
 476                                sd_card->sd_clock = 29;
 477                        else
 478                                sd_card->sd_clock = CLK_30;
 479
 480                } else if ((trans_speed & 0xf8) >= 0x10) {
 481                        if (chip->asic_code)
 482                                sd_card->sd_clock = 23;
 483                        else
 484                                sd_card->sd_clock = CLK_20;
 485
 486                } else if ((trans_speed & 0x08) >= 0x08) {
 487                        if (chip->asic_code)
 488                                sd_card->sd_clock = 19;
 489                        else
 490                                sd_card->sd_clock = CLK_20;
 491                } else {
 492                        rtsx_trace(chip);
 493                        return STATUS_FAIL;
 494                }
 495        } else {
 496                rtsx_trace(chip);
 497                return STATUS_FAIL;
 498        }
 499
 500        if (CHK_MMC_SECTOR_MODE(sd_card)) {
 501                sd_card->capacity = 0;
 502        } else {
 503                if ((!CHK_SD_HCXC(sd_card)) || (csd_ver == 0)) {
 504                        u8 blk_size, c_size_mult;
 505                        u16 c_size;
 506
 507                        blk_size = rsp[6] & 0x0F;
 508                        c_size =  ((u16)(rsp[7] & 0x03) << 10)
 509                                        + ((u16)rsp[8] << 2)
 510                                        + ((u16)(rsp[9] & 0xC0) >> 6);
 511                        c_size_mult = (u8)((rsp[10] & 0x03) << 1);
 512                        c_size_mult += (rsp[11] & 0x80) >> 7;
 513                        sd_card->capacity = (((u32)(c_size + 1)) *
 514                                        (1 << (c_size_mult + 2)))
 515                                << (blk_size - 9);
 516                } else {
 517                        u32 total_sector = 0;
 518
 519                        total_sector = (((u32)rsp[8] & 0x3f) << 16) |
 520                                ((u32)rsp[9] << 8) | (u32)rsp[10];
 521                        sd_card->capacity = (total_sector + 1) << 10;
 522                }
 523        }
 524
 525        if (check_wp) {
 526                if (rsp[15] & 0x30)
 527                        chip->card_wp |= SD_CARD;
 528
 529                dev_dbg(rtsx_dev(chip), "CSD WP Status: 0x%x\n", rsp[15]);
 530        }
 531
 532        return STATUS_SUCCESS;
 533}
 534
 535static int sd_set_sample_push_timing(struct rtsx_chip *chip)
 536{
 537        int retval;
 538        struct sd_info *sd_card = &chip->sd_card;
 539        u8 val = 0;
 540
 541        if ((chip->sd_ctl & SD_PUSH_POINT_CTL_MASK) == SD_PUSH_POINT_DELAY)
 542                val |= 0x10;
 543
 544        if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) == SD_SAMPLE_POINT_AUTO) {
 545                if (chip->asic_code) {
 546                        if (CHK_SD_HS(sd_card) || CHK_MMC_52M(sd_card)) {
 547                                if (val & 0x10)
 548                                        val |= 0x04;
 549                                else
 550                                        val |= 0x08;
 551                        }
 552                } else {
 553                        if (val & 0x10)
 554                                val |= 0x04;
 555                        else
 556                                val |= 0x08;
 557                }
 558        } else if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) ==
 559                SD_SAMPLE_POINT_DELAY) {
 560                if (val & 0x10)
 561                        val |= 0x04;
 562                else
 563                        val |= 0x08;
 564        }
 565
 566        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x1C, val);
 567        if (retval) {
 568                rtsx_trace(chip);
 569                return retval;
 570        }
 571
 572        return STATUS_SUCCESS;
 573}
 574
 575static void sd_choose_proper_clock(struct rtsx_chip *chip)
 576{
 577        struct sd_info *sd_card = &chip->sd_card;
 578
 579        if (CHK_SD_SDR104(sd_card)) {
 580                if (chip->asic_code)
 581                        sd_card->sd_clock = chip->asic_sd_sdr104_clk;
 582                else
 583                        sd_card->sd_clock = chip->fpga_sd_sdr104_clk;
 584
 585        } else if (CHK_SD_DDR50(sd_card)) {
 586                if (chip->asic_code)
 587                        sd_card->sd_clock = chip->asic_sd_ddr50_clk;
 588                else
 589                        sd_card->sd_clock = chip->fpga_sd_ddr50_clk;
 590
 591        } else if (CHK_SD_SDR50(sd_card)) {
 592                if (chip->asic_code)
 593                        sd_card->sd_clock = chip->asic_sd_sdr50_clk;
 594                else
 595                        sd_card->sd_clock = chip->fpga_sd_sdr50_clk;
 596
 597        } else if (CHK_SD_HS(sd_card)) {
 598                if (chip->asic_code)
 599                        sd_card->sd_clock = chip->asic_sd_hs_clk;
 600                else
 601                        sd_card->sd_clock = chip->fpga_sd_hs_clk;
 602
 603        } else if (CHK_MMC_52M(sd_card) || CHK_MMC_DDR52(sd_card)) {
 604                if (chip->asic_code)
 605                        sd_card->sd_clock = chip->asic_mmc_52m_clk;
 606                else
 607                        sd_card->sd_clock = chip->fpga_mmc_52m_clk;
 608
 609        } else if (CHK_MMC_26M(sd_card)) {
 610                if (chip->asic_code)
 611                        sd_card->sd_clock = 48;
 612                else
 613                        sd_card->sd_clock = CLK_50;
 614        }
 615}
 616
 617static int sd_set_clock_divider(struct rtsx_chip *chip, u8 clk_div)
 618{
 619        int retval;
 620        u8 mask = 0, val = 0;
 621
 622        mask = 0x60;
 623        if (clk_div == SD_CLK_DIVIDE_0)
 624                val = 0x00;
 625        else if (clk_div == SD_CLK_DIVIDE_128)
 626                val = 0x40;
 627        else if (clk_div == SD_CLK_DIVIDE_256)
 628                val = 0x20;
 629
 630        retval = rtsx_write_register(chip, REG_SD_CFG1, mask, val);
 631        if (retval) {
 632                rtsx_trace(chip);
 633                return retval;
 634        }
 635
 636        return STATUS_SUCCESS;
 637}
 638
 639static int sd_set_init_para(struct rtsx_chip *chip)
 640{
 641        struct sd_info *sd_card = &chip->sd_card;
 642        int retval;
 643
 644        retval = sd_set_sample_push_timing(chip);
 645        if (retval != STATUS_SUCCESS) {
 646                rtsx_trace(chip);
 647                return STATUS_FAIL;
 648        }
 649
 650        sd_choose_proper_clock(chip);
 651
 652        retval = switch_clock(chip, sd_card->sd_clock);
 653        if (retval != STATUS_SUCCESS) {
 654                rtsx_trace(chip);
 655                return STATUS_FAIL;
 656        }
 657
 658        return STATUS_SUCCESS;
 659}
 660
 661int sd_select_card(struct rtsx_chip *chip, int select)
 662{
 663        struct sd_info *sd_card = &chip->sd_card;
 664        int retval;
 665        u8 cmd_idx, cmd_type;
 666        u32 addr;
 667
 668        if (select) {
 669                cmd_idx = SELECT_CARD;
 670                cmd_type = SD_RSP_TYPE_R1;
 671                addr = sd_card->sd_addr;
 672        } else {
 673                cmd_idx = DESELECT_CARD;
 674                cmd_type = SD_RSP_TYPE_R0;
 675                addr = 0;
 676        }
 677
 678        retval = sd_send_cmd_get_rsp(chip, cmd_idx, addr, cmd_type, NULL, 0);
 679        if (retval != STATUS_SUCCESS) {
 680                rtsx_trace(chip);
 681                return STATUS_FAIL;
 682        }
 683
 684        return STATUS_SUCCESS;
 685}
 686
 687#ifdef SUPPORT_SD_LOCK
 688static int sd_update_lock_status(struct rtsx_chip *chip)
 689{
 690        struct sd_info *sd_card = &chip->sd_card;
 691        int retval;
 692        u8 rsp[5];
 693
 694        retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 695                                     SD_RSP_TYPE_R1, rsp, 5);
 696        if (retval != STATUS_SUCCESS) {
 697                rtsx_trace(chip);
 698                return STATUS_FAIL;
 699        }
 700
 701        if (rsp[1] & 0x02)
 702                sd_card->sd_lock_status |= SD_LOCKED;
 703        else
 704                sd_card->sd_lock_status &= ~SD_LOCKED;
 705
 706        dev_dbg(rtsx_dev(chip), "sd_card->sd_lock_status = 0x%x\n",
 707                sd_card->sd_lock_status);
 708
 709        if (rsp[1] & 0x01) {
 710                rtsx_trace(chip);
 711                return STATUS_FAIL;
 712        }
 713
 714        return STATUS_SUCCESS;
 715}
 716#endif
 717
 718static int sd_wait_state_data_ready(struct rtsx_chip *chip, u8 state,
 719                                    u8 data_ready, int polling_cnt)
 720{
 721        struct sd_info *sd_card = &chip->sd_card;
 722        int retval, i;
 723        u8 rsp[5];
 724
 725        for (i = 0; i < polling_cnt; i++) {
 726                retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
 727                                             sd_card->sd_addr, SD_RSP_TYPE_R1,
 728                                             rsp, 5);
 729                if (retval != STATUS_SUCCESS) {
 730                        rtsx_trace(chip);
 731                        return STATUS_FAIL;
 732                }
 733
 734                if (((rsp[3] & 0x1E) == state) &&
 735                    ((rsp[3] & 0x01) == data_ready))
 736                        return STATUS_SUCCESS;
 737        }
 738
 739        rtsx_trace(chip);
 740        return STATUS_FAIL;
 741}
 742
 743static int sd_change_bank_voltage(struct rtsx_chip *chip, u8 voltage)
 744{
 745        int retval;
 746
 747        if (voltage == SD_IO_3V3) {
 748                if (chip->asic_code) {
 749                        retval = rtsx_write_phy_register(chip, 0x08,
 750                                                         0x4FC0 |
 751                                                         chip->phy_voltage);
 752                        if (retval != STATUS_SUCCESS) {
 753                                rtsx_trace(chip);
 754                                return STATUS_FAIL;
 755                        }
 756                } else {
 757                        retval = rtsx_write_register(chip, SD_PAD_CTL,
 758                                                     SD_IO_USING_1V8, 0);
 759                        if (retval) {
 760                                rtsx_trace(chip);
 761                                return retval;
 762                        }
 763                }
 764        } else if (voltage == SD_IO_1V8) {
 765                if (chip->asic_code) {
 766                        retval = rtsx_write_phy_register(chip, 0x08,
 767                                                         0x4C40 |
 768                                                         chip->phy_voltage);
 769                        if (retval != STATUS_SUCCESS) {
 770                                rtsx_trace(chip);
 771                                return STATUS_FAIL;
 772                        }
 773                } else {
 774                        retval = rtsx_write_register(chip, SD_PAD_CTL,
 775                                                     SD_IO_USING_1V8,
 776                                                     SD_IO_USING_1V8);
 777                        if (retval) {
 778                                rtsx_trace(chip);
 779                                return retval;
 780                        }
 781                }
 782        } else {
 783                rtsx_trace(chip);
 784                return STATUS_FAIL;
 785        }
 786
 787        return STATUS_SUCCESS;
 788}
 789
 790static int sd_voltage_switch(struct rtsx_chip *chip)
 791{
 792        int retval;
 793        u8 stat;
 794
 795        retval = rtsx_write_register(chip, SD_BUS_STAT,
 796                                     SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP,
 797                                     SD_CLK_TOGGLE_EN);
 798        if (retval) {
 799                rtsx_trace(chip);
 800                return retval;
 801        }
 802
 803        retval = sd_send_cmd_get_rsp(chip, VOLTAGE_SWITCH, 0, SD_RSP_TYPE_R1,
 804                                     NULL, 0);
 805        if (retval != STATUS_SUCCESS) {
 806                rtsx_trace(chip);
 807                return STATUS_FAIL;
 808        }
 809
 810        udelay(chip->sd_voltage_switch_delay);
 811
 812        retval = rtsx_read_register(chip, SD_BUS_STAT, &stat);
 813        if (retval) {
 814                rtsx_trace(chip);
 815                return retval;
 816        }
 817        if (stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 818                                SD_DAT1_STATUS | SD_DAT0_STATUS)) {
 819                rtsx_trace(chip);
 820                return STATUS_FAIL;
 821        }
 822
 823        retval = rtsx_write_register(chip, SD_BUS_STAT, 0xFF,
 824                                     SD_CLK_FORCE_STOP);
 825        if (retval) {
 826                rtsx_trace(chip);
 827                return retval;
 828        }
 829        retval = sd_change_bank_voltage(chip, SD_IO_1V8);
 830        if (retval != STATUS_SUCCESS) {
 831                rtsx_trace(chip);
 832                return STATUS_FAIL;
 833        }
 834
 835        wait_timeout(50);
 836
 837        retval = rtsx_write_register(chip, SD_BUS_STAT, 0xFF,
 838                                     SD_CLK_TOGGLE_EN);
 839        if (retval) {
 840                rtsx_trace(chip);
 841                return retval;
 842        }
 843        wait_timeout(10);
 844
 845        retval = rtsx_read_register(chip, SD_BUS_STAT, &stat);
 846        if (retval) {
 847                rtsx_trace(chip);
 848                return retval;
 849        }
 850        if ((stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 851                                SD_DAT1_STATUS | SD_DAT0_STATUS)) !=
 852                        (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 853                                SD_DAT1_STATUS | SD_DAT0_STATUS)) {
 854                dev_dbg(rtsx_dev(chip), "SD_BUS_STAT: 0x%x\n", stat);
 855                rtsx_write_register(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN |
 856                                    SD_CLK_FORCE_STOP, 0);
 857                rtsx_write_register(chip, CARD_CLK_EN, 0xFF, 0);
 858                rtsx_trace(chip);
 859                return STATUS_FAIL;
 860        }
 861
 862        retval = rtsx_write_register(chip, SD_BUS_STAT,
 863                                     SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
 864        if (retval) {
 865                rtsx_trace(chip);
 866                return retval;
 867        }
 868
 869        return STATUS_SUCCESS;
 870}
 871
 872static int sd_reset_dcm(struct rtsx_chip *chip, u8 tune_dir)
 873{
 874        int retval;
 875
 876        if (tune_dir == TUNE_RX) {
 877                retval = rtsx_write_register(chip, DCM_DRP_CTL, 0xFF,
 878                                             DCM_RESET | DCM_RX);
 879                if (retval) {
 880                        rtsx_trace(chip);
 881                        return retval;
 882                }
 883                retval = rtsx_write_register(chip, DCM_DRP_CTL, 0xFF, DCM_RX);
 884                if (retval) {
 885                        rtsx_trace(chip);
 886                        return retval;
 887                }
 888        } else {
 889                retval = rtsx_write_register(chip, DCM_DRP_CTL, 0xFF,
 890                                             DCM_RESET | DCM_TX);
 891                if (retval) {
 892                        rtsx_trace(chip);
 893                        return retval;
 894                }
 895                retval = rtsx_write_register(chip, DCM_DRP_CTL, 0xFF, DCM_TX);
 896                if (retval) {
 897                        rtsx_trace(chip);
 898                        return retval;
 899                }
 900        }
 901
 902        return STATUS_SUCCESS;
 903}
 904
 905static int sd_change_phase(struct rtsx_chip *chip, u8 sample_point, u8 tune_dir)
 906{
 907        struct sd_info *sd_card = &chip->sd_card;
 908        u16 SD_VP_CTL, SD_DCMPS_CTL;
 909        u8 val;
 910        int retval;
 911        bool ddr_rx = false;
 912
 913        dev_dbg(rtsx_dev(chip), "%s (sample_point = %d, tune_dir = %d)\n",
 914                __func__, sample_point, tune_dir);
 915
 916        if (tune_dir == TUNE_RX) {
 917                SD_VP_CTL = SD_VPRX_CTL;
 918                SD_DCMPS_CTL = SD_DCMPS_RX_CTL;
 919                if (CHK_SD_DDR50(sd_card))
 920                        ddr_rx = true;
 921        } else {
 922                SD_VP_CTL = SD_VPTX_CTL;
 923                SD_DCMPS_CTL = SD_DCMPS_TX_CTL;
 924        }
 925
 926        if (chip->asic_code) {
 927                retval = rtsx_write_register(chip, CLK_CTL, CHANGE_CLK,
 928                                             CHANGE_CLK);
 929                if (retval) {
 930                        rtsx_trace(chip);
 931                        return retval;
 932                }
 933                retval = rtsx_write_register(chip, SD_VP_CTL, 0x1F,
 934                                             sample_point);
 935                if (retval) {
 936                        rtsx_trace(chip);
 937                        return retval;
 938                }
 939                retval = rtsx_write_register(chip, SD_VPCLK0_CTL,
 940                                             PHASE_NOT_RESET, 0);
 941                if (retval) {
 942                        rtsx_trace(chip);
 943                        return retval;
 944                }
 945                retval = rtsx_write_register(chip, SD_VPCLK0_CTL,
 946                                             PHASE_NOT_RESET, PHASE_NOT_RESET);
 947                if (retval) {
 948                        rtsx_trace(chip);
 949                        return retval;
 950                }
 951                retval = rtsx_write_register(chip, CLK_CTL, CHANGE_CLK, 0);
 952                if (retval) {
 953                        rtsx_trace(chip);
 954                        return retval;
 955                }
 956        } else {
 957                rtsx_read_register(chip, SD_VP_CTL, &val);
 958                dev_dbg(rtsx_dev(chip), "SD_VP_CTL: 0x%x\n", val);
 959                rtsx_read_register(chip, SD_DCMPS_CTL, &val);
 960                dev_dbg(rtsx_dev(chip), "SD_DCMPS_CTL: 0x%x\n", val);
 961
 962                if (ddr_rx) {
 963                        retval = rtsx_write_register(chip, SD_VP_CTL,
 964                                                     PHASE_CHANGE,
 965                                                     PHASE_CHANGE);
 966                        if (retval) {
 967                                rtsx_trace(chip);
 968                                return retval;
 969                        }
 970                        udelay(50);
 971                        retval = rtsx_write_register(chip, SD_VP_CTL, 0xFF,
 972                                                     PHASE_CHANGE |
 973                                                     PHASE_NOT_RESET |
 974                                                     sample_point);
 975                        if (retval) {
 976                                rtsx_trace(chip);
 977                                return retval;
 978                        }
 979                } else {
 980                        retval = rtsx_write_register(chip, CLK_CTL,
 981                                                     CHANGE_CLK, CHANGE_CLK);
 982                        if (retval) {
 983                                rtsx_trace(chip);
 984                                return retval;
 985                        }
 986                        udelay(50);
 987                        retval = rtsx_write_register(chip, SD_VP_CTL, 0xFF,
 988                                                     PHASE_NOT_RESET |
 989                                                     sample_point);
 990                        if (retval) {
 991                                rtsx_trace(chip);
 992                                return retval;
 993                        }
 994                }
 995                udelay(100);
 996
 997                rtsx_init_cmd(chip);
 998                rtsx_add_cmd(chip, WRITE_REG_CMD, SD_DCMPS_CTL, DCMPS_CHANGE,
 999                             DCMPS_CHANGE);
1000                rtsx_add_cmd(chip, CHECK_REG_CMD, SD_DCMPS_CTL,
1001                             DCMPS_CHANGE_DONE, DCMPS_CHANGE_DONE);
1002                retval = rtsx_send_cmd(chip, SD_CARD, 100);
1003                if (retval != STATUS_SUCCESS) {
1004                        rtsx_trace(chip);
1005                        goto fail;
1006                }
1007
1008                val = *rtsx_get_cmd_data(chip);
1009                if (val & DCMPS_ERROR) {
1010                        rtsx_trace(chip);
1011                        goto fail;
1012                }
1013
1014                if ((val & DCMPS_CURRENT_PHASE) != sample_point) {
1015                        rtsx_trace(chip);
1016                        goto fail;
1017                }
1018
1019                retval = rtsx_write_register(chip, SD_DCMPS_CTL,
1020                                             DCMPS_CHANGE, 0);
1021                if (retval) {
1022                        rtsx_trace(chip);
1023                        return retval;
1024                }
1025                if (ddr_rx) {
1026                        retval = rtsx_write_register(chip, SD_VP_CTL,
1027                                                     PHASE_CHANGE, 0);
1028                        if (retval) {
1029                                rtsx_trace(chip);
1030                                return retval;
1031                        }
1032                } else {
1033                        retval = rtsx_write_register(chip, CLK_CTL,
1034                                                     CHANGE_CLK, 0);
1035                        if (retval) {
1036                                rtsx_trace(chip);
1037                                return retval;
1038                        }
1039                }
1040
1041                udelay(50);
1042        }
1043
1044        retval = rtsx_write_register(chip, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0);
1045        if (retval) {
1046                rtsx_trace(chip);
1047                return retval;
1048        }
1049
1050        return STATUS_SUCCESS;
1051
1052fail:
1053        rtsx_read_register(chip, SD_VP_CTL, &val);
1054        dev_dbg(rtsx_dev(chip), "SD_VP_CTL: 0x%x\n", val);
1055        rtsx_read_register(chip, SD_DCMPS_CTL, &val);
1056        dev_dbg(rtsx_dev(chip), "SD_DCMPS_CTL: 0x%x\n", val);
1057
1058        rtsx_write_register(chip, SD_DCMPS_CTL, DCMPS_CHANGE, 0);
1059        rtsx_write_register(chip, SD_VP_CTL, PHASE_CHANGE, 0);
1060        mdelay(10);
1061        sd_reset_dcm(chip, tune_dir);
1062        return STATUS_FAIL;
1063}
1064
1065static int sd_check_spec(struct rtsx_chip *chip, u8 bus_width)
1066{
1067        struct sd_info *sd_card = &chip->sd_card;
1068        int retval;
1069        u8 cmd[5], buf[8];
1070
1071        retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
1072                                     SD_RSP_TYPE_R1, NULL, 0);
1073        if (retval != STATUS_SUCCESS) {
1074                rtsx_trace(chip);
1075                return STATUS_FAIL;
1076        }
1077
1078        cmd[0] = 0x40 | SEND_SCR;
1079        cmd[1] = 0;
1080        cmd[2] = 0;
1081        cmd[3] = 0;
1082        cmd[4] = 0;
1083
1084        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 8, 1, bus_width,
1085                              buf, 8, 250);
1086        if (retval != STATUS_SUCCESS) {
1087                rtsx_clear_sd_error(chip);
1088                rtsx_trace(chip);
1089                return STATUS_FAIL;
1090        }
1091
1092        memcpy(sd_card->raw_scr, buf, 8);
1093
1094        if ((buf[0] & 0x0F) == 0) {
1095                rtsx_trace(chip);
1096                return STATUS_FAIL;
1097        }
1098
1099        return STATUS_SUCCESS;
1100}
1101
1102static int sd_query_switch_result(struct rtsx_chip *chip, u8 func_group,
1103                                  u8 func_to_switch, u8 *buf, int buf_len)
1104{
1105        u8 support_mask = 0, query_switch = 0, switch_busy = 0;
1106        int support_offset = 0, query_switch_offset = 0, check_busy_offset = 0;
1107
1108        if (func_group == SD_FUNC_GROUP_1) {
1109                support_offset = FUNCTION_GROUP1_SUPPORT_OFFSET;
1110                query_switch_offset = FUNCTION_GROUP1_QUERY_SWITCH_OFFSET;
1111                check_busy_offset = FUNCTION_GROUP1_CHECK_BUSY_OFFSET;
1112
1113                switch (func_to_switch) {
1114                case HS_SUPPORT:
1115                        support_mask = HS_SUPPORT_MASK;
1116                        query_switch = HS_QUERY_SWITCH_OK;
1117                        switch_busy = HS_SWITCH_BUSY;
1118                        break;
1119
1120                case SDR50_SUPPORT:
1121                        support_mask = SDR50_SUPPORT_MASK;
1122                        query_switch = SDR50_QUERY_SWITCH_OK;
1123                        switch_busy = SDR50_SWITCH_BUSY;
1124                        break;
1125
1126                case SDR104_SUPPORT:
1127                        support_mask = SDR104_SUPPORT_MASK;
1128                        query_switch = SDR104_QUERY_SWITCH_OK;
1129                        switch_busy = SDR104_SWITCH_BUSY;
1130                        break;
1131
1132                case DDR50_SUPPORT:
1133                        support_mask = DDR50_SUPPORT_MASK;
1134                        query_switch = DDR50_QUERY_SWITCH_OK;
1135                        switch_busy = DDR50_SWITCH_BUSY;
1136                        break;
1137
1138                default:
1139                        rtsx_trace(chip);
1140                        return STATUS_FAIL;
1141                }
1142        } else if (func_group == SD_FUNC_GROUP_3) {
1143                support_offset = FUNCTION_GROUP3_SUPPORT_OFFSET;
1144                query_switch_offset = FUNCTION_GROUP3_QUERY_SWITCH_OFFSET;
1145                check_busy_offset = FUNCTION_GROUP3_CHECK_BUSY_OFFSET;
1146
1147                switch (func_to_switch) {
1148                case DRIVING_TYPE_A:
1149                        support_mask = DRIVING_TYPE_A_MASK;
1150                        query_switch = TYPE_A_QUERY_SWITCH_OK;
1151                        switch_busy = TYPE_A_SWITCH_BUSY;
1152                        break;
1153
1154                case DRIVING_TYPE_C:
1155                        support_mask = DRIVING_TYPE_C_MASK;
1156                        query_switch = TYPE_C_QUERY_SWITCH_OK;
1157                        switch_busy = TYPE_C_SWITCH_BUSY;
1158                        break;
1159
1160                case DRIVING_TYPE_D:
1161                        support_mask = DRIVING_TYPE_D_MASK;
1162                        query_switch = TYPE_D_QUERY_SWITCH_OK;
1163                        switch_busy = TYPE_D_SWITCH_BUSY;
1164                        break;
1165
1166                default:
1167                        rtsx_trace(chip);
1168                        return STATUS_FAIL;
1169                }
1170        } else if (func_group == SD_FUNC_GROUP_4) {
1171                support_offset = FUNCTION_GROUP4_SUPPORT_OFFSET;
1172                query_switch_offset = FUNCTION_GROUP4_QUERY_SWITCH_OFFSET;
1173                check_busy_offset = FUNCTION_GROUP4_CHECK_BUSY_OFFSET;
1174
1175                switch (func_to_switch) {
1176                case CURRENT_LIMIT_400:
1177                        support_mask = CURRENT_LIMIT_400_MASK;
1178                        query_switch = CURRENT_LIMIT_400_QUERY_SWITCH_OK;
1179                        switch_busy = CURRENT_LIMIT_400_SWITCH_BUSY;
1180                        break;
1181
1182                case CURRENT_LIMIT_600:
1183                        support_mask = CURRENT_LIMIT_600_MASK;
1184                        query_switch = CURRENT_LIMIT_600_QUERY_SWITCH_OK;
1185                        switch_busy = CURRENT_LIMIT_600_SWITCH_BUSY;
1186                        break;
1187
1188                case CURRENT_LIMIT_800:
1189                        support_mask = CURRENT_LIMIT_800_MASK;
1190                        query_switch = CURRENT_LIMIT_800_QUERY_SWITCH_OK;
1191                        switch_busy = CURRENT_LIMIT_800_SWITCH_BUSY;
1192                        break;
1193
1194                default:
1195                        rtsx_trace(chip);
1196                        return STATUS_FAIL;
1197                }
1198        } else {
1199                rtsx_trace(chip);
1200                return STATUS_FAIL;
1201        }
1202
1203        if (func_group == SD_FUNC_GROUP_1) {
1204                if (!(buf[support_offset] & support_mask) ||
1205                    ((buf[query_switch_offset] & 0x0F) != query_switch)) {
1206                        rtsx_trace(chip);
1207                        return STATUS_FAIL;
1208                }
1209        }
1210
1211        /* Check 'Busy Status' */
1212        if ((buf[DATA_STRUCTURE_VER_OFFSET] == 0x01) &&
1213            ((buf[check_busy_offset] & switch_busy) == switch_busy)) {
1214                rtsx_trace(chip);
1215                return STATUS_FAIL;
1216        }
1217
1218        return STATUS_SUCCESS;
1219}
1220
1221static int sd_check_switch_mode(struct rtsx_chip *chip, u8 mode, u8 func_group,
1222                                u8 func_to_switch, u8 bus_width)
1223{
1224        struct sd_info *sd_card = &chip->sd_card;
1225        int retval;
1226        u8 cmd[5], buf[64];
1227
1228        dev_dbg(rtsx_dev(chip), "%s (mode = %d, func_group = %d, func_to_switch = %d)\n",
1229                __func__, mode, func_group, func_to_switch);
1230
1231        cmd[0] = 0x40 | SWITCH;
1232        cmd[1] = mode;
1233
1234        if (func_group == SD_FUNC_GROUP_1) {
1235                cmd[2] = 0xFF;
1236                cmd[3] = 0xFF;
1237                cmd[4] = 0xF0 + func_to_switch;
1238        } else if (func_group == SD_FUNC_GROUP_3) {
1239                cmd[2] = 0xFF;
1240                cmd[3] = 0xF0 + func_to_switch;
1241                cmd[4] = 0xFF;
1242        } else if (func_group == SD_FUNC_GROUP_4) {
1243                cmd[2] = 0xFF;
1244                cmd[3] = 0x0F + (func_to_switch << 4);
1245                cmd[4] = 0xFF;
1246        } else {
1247                cmd[1] = SD_CHECK_MODE;
1248                cmd[2] = 0xFF;
1249                cmd[3] = 0xFF;
1250                cmd[4] = 0xFF;
1251        }
1252
1253        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1, bus_width,
1254                              buf, 64, 250);
1255        if (retval != STATUS_SUCCESS) {
1256                rtsx_clear_sd_error(chip);
1257                rtsx_trace(chip);
1258                return STATUS_FAIL;
1259        }
1260
1261        dev_dbg(rtsx_dev(chip), "%*ph\n", 64, buf);
1262
1263        if (func_group == NO_ARGUMENT) {
1264                sd_card->func_group1_mask = buf[0x0D];
1265                sd_card->func_group2_mask = buf[0x0B];
1266                sd_card->func_group3_mask = buf[0x09];
1267                sd_card->func_group4_mask = buf[0x07];
1268
1269                dev_dbg(rtsx_dev(chip), "func_group1_mask = 0x%02x\n",
1270                        buf[0x0D]);
1271                dev_dbg(rtsx_dev(chip), "func_group2_mask = 0x%02x\n",
1272                        buf[0x0B]);
1273                dev_dbg(rtsx_dev(chip), "func_group3_mask = 0x%02x\n",
1274                        buf[0x09]);
1275                dev_dbg(rtsx_dev(chip), "func_group4_mask = 0x%02x\n",
1276                        buf[0x07]);
1277        } else {
1278                /* Maximum current consumption, check whether current is
1279                 * acceptable; bit[511:496] = 0x0000 means some error happened.
1280                 */
1281                u16 cc = ((u16)buf[0] << 8) | buf[1];
1282
1283                dev_dbg(rtsx_dev(chip), "Maximum current consumption: %dmA\n",
1284                        cc);
1285                if ((cc == 0) || (cc > 800)) {
1286                        rtsx_trace(chip);
1287                        return STATUS_FAIL;
1288                }
1289
1290                retval = sd_query_switch_result(chip, func_group,
1291                                                func_to_switch, buf, 64);
1292                if (retval != STATUS_SUCCESS) {
1293                        rtsx_trace(chip);
1294                        return STATUS_FAIL;
1295                }
1296
1297                if ((cc > 400) || (func_to_switch > CURRENT_LIMIT_400)) {
1298                        retval = rtsx_write_register(chip, OCPPARA2,
1299                                                     SD_OCP_THD_MASK,
1300                                                     chip->sd_800mA_ocp_thd);
1301                        if (retval) {
1302                                rtsx_trace(chip);
1303                                return retval;
1304                        }
1305                        retval = rtsx_write_register(chip, CARD_PWR_CTL,
1306                                                     PMOS_STRG_MASK,
1307                                                     PMOS_STRG_800mA);
1308                        if (retval) {
1309                                rtsx_trace(chip);
1310                                return retval;
1311                        }
1312                }
1313        }
1314
1315        return STATUS_SUCCESS;
1316}
1317
1318static u8 downgrade_switch_mode(u8 func_group, u8 func_to_switch)
1319{
1320        if (func_group == SD_FUNC_GROUP_1) {
1321                if (func_to_switch > HS_SUPPORT)
1322                        func_to_switch--;
1323
1324        } else if (func_group == SD_FUNC_GROUP_4) {
1325                if (func_to_switch > CURRENT_LIMIT_200)
1326                        func_to_switch--;
1327        }
1328
1329        return func_to_switch;
1330}
1331
1332static int sd_check_switch(struct rtsx_chip *chip,
1333                           u8 func_group, u8 func_to_switch, u8 bus_width)
1334{
1335        int retval;
1336        int i;
1337        bool switch_good = false;
1338
1339        for (i = 0; i < 3; i++) {
1340                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1341                        sd_set_err_code(chip, SD_NO_CARD);
1342                        rtsx_trace(chip);
1343                        return STATUS_FAIL;
1344                }
1345
1346                retval = sd_check_switch_mode(chip, SD_CHECK_MODE, func_group,
1347                                              func_to_switch, bus_width);
1348                if (retval == STATUS_SUCCESS) {
1349                        u8 stat;
1350
1351                        retval = sd_check_switch_mode(chip, SD_SWITCH_MODE,
1352                                                      func_group,
1353                                                      func_to_switch,
1354                                                      bus_width);
1355                        if (retval == STATUS_SUCCESS) {
1356                                switch_good = true;
1357                                break;
1358                        }
1359
1360                        retval = rtsx_read_register(chip, SD_STAT1, &stat);
1361                        if (retval) {
1362                                rtsx_trace(chip);
1363                                return retval;
1364                        }
1365                        if (stat & SD_CRC16_ERR) {
1366                                dev_dbg(rtsx_dev(chip), "SD CRC16 error when switching mode\n");
1367                                rtsx_trace(chip);
1368                                return STATUS_FAIL;
1369                        }
1370                }
1371
1372                func_to_switch = downgrade_switch_mode(func_group,
1373                                                       func_to_switch);
1374
1375                wait_timeout(20);
1376        }
1377
1378        if (!switch_good) {
1379                rtsx_trace(chip);
1380                return STATUS_FAIL;
1381        }
1382
1383        return STATUS_SUCCESS;
1384}
1385
1386static int sd_switch_function(struct rtsx_chip *chip, u8 bus_width)
1387{
1388        struct sd_info *sd_card = &chip->sd_card;
1389        int retval;
1390        int i;
1391        u8 func_to_switch = 0;
1392
1393        /* Get supported functions */
1394        retval = sd_check_switch_mode(chip, SD_CHECK_MODE, NO_ARGUMENT,
1395                                      NO_ARGUMENT, bus_width);
1396        if (retval != STATUS_SUCCESS) {
1397                rtsx_trace(chip);
1398                return STATUS_FAIL;
1399        }
1400
1401        sd_card->func_group1_mask &= ~(sd_card->sd_switch_fail);
1402
1403        /* Function Group 1: Access Mode */
1404        for (i = 0; i < 4; i++) {
1405                switch ((u8)(chip->sd_speed_prior >> (i * 8))) {
1406                case SDR104_SUPPORT:
1407                        if ((sd_card->func_group1_mask & SDR104_SUPPORT_MASK) &&
1408                            chip->sdr104_en) {
1409                                func_to_switch = SDR104_SUPPORT;
1410                        }
1411                        break;
1412
1413                case DDR50_SUPPORT:
1414                        if ((sd_card->func_group1_mask & DDR50_SUPPORT_MASK) &&
1415                            chip->ddr50_en) {
1416                                func_to_switch = DDR50_SUPPORT;
1417                        }
1418                        break;
1419
1420                case SDR50_SUPPORT:
1421                        if ((sd_card->func_group1_mask & SDR50_SUPPORT_MASK) &&
1422                            chip->sdr50_en) {
1423                                func_to_switch = SDR50_SUPPORT;
1424                        }
1425                        break;
1426
1427                case HS_SUPPORT:
1428                        if (sd_card->func_group1_mask & HS_SUPPORT_MASK)
1429                                func_to_switch = HS_SUPPORT;
1430
1431                        break;
1432
1433                default:
1434                        continue;
1435                }
1436
1437                if (func_to_switch)
1438                        break;
1439        }
1440        dev_dbg(rtsx_dev(chip), "SD_FUNC_GROUP_1: func_to_switch = 0x%02x",
1441                func_to_switch);
1442
1443#ifdef SUPPORT_SD_LOCK
1444        if ((sd_card->sd_lock_status & SD_SDR_RST) &&
1445            (func_to_switch == DDR50_SUPPORT) &&
1446            (sd_card->func_group1_mask & SDR50_SUPPORT_MASK)) {
1447                func_to_switch = SDR50_SUPPORT;
1448                dev_dbg(rtsx_dev(chip), "Using SDR50 instead of DDR50 for SD Lock\n");
1449        }
1450#endif
1451
1452        if (func_to_switch) {
1453                retval = sd_check_switch(chip, SD_FUNC_GROUP_1, func_to_switch,
1454                                         bus_width);
1455                if (retval != STATUS_SUCCESS) {
1456                        if (func_to_switch == SDR104_SUPPORT) {
1457                                sd_card->sd_switch_fail = SDR104_SUPPORT_MASK;
1458                        } else if (func_to_switch == DDR50_SUPPORT) {
1459                                sd_card->sd_switch_fail = SDR104_SUPPORT_MASK |
1460                                        DDR50_SUPPORT_MASK;
1461                        } else if (func_to_switch == SDR50_SUPPORT) {
1462                                sd_card->sd_switch_fail = SDR104_SUPPORT_MASK |
1463                                        DDR50_SUPPORT_MASK | SDR50_SUPPORT_MASK;
1464                        }
1465                        rtsx_trace(chip);
1466                        return STATUS_FAIL;
1467                }
1468
1469                if (func_to_switch == SDR104_SUPPORT)
1470                        SET_SD_SDR104(sd_card);
1471                else if (func_to_switch == DDR50_SUPPORT)
1472                        SET_SD_DDR50(sd_card);
1473                else if (func_to_switch == SDR50_SUPPORT)
1474                        SET_SD_SDR50(sd_card);
1475                else
1476                        SET_SD_HS(sd_card);
1477        }
1478
1479        if (CHK_SD_DDR50(sd_card)) {
1480                retval = rtsx_write_register(chip, SD_PUSH_POINT_CTL, 0x06,
1481                                             0x04);
1482                if (retval) {
1483                        rtsx_trace(chip);
1484                        return retval;
1485                }
1486                retval = sd_set_sample_push_timing(chip);
1487                if (retval != STATUS_SUCCESS) {
1488                        rtsx_trace(chip);
1489                        return STATUS_FAIL;
1490                }
1491        }
1492
1493        if (!func_to_switch || (func_to_switch == HS_SUPPORT)) {
1494                /* Do not try to switch current limit if the card doesn't
1495                 * support UHS mode or we don't want it to support UHS mode
1496                 */
1497                return STATUS_SUCCESS;
1498        }
1499
1500        /* Function Group 4: Current Limit */
1501        func_to_switch = 0xFF;
1502
1503        for (i = 0; i < 4; i++) {
1504                switch ((u8)(chip->sd_current_prior >> (i * 8))) {
1505                case CURRENT_LIMIT_800:
1506                        if (sd_card->func_group4_mask & CURRENT_LIMIT_800_MASK)
1507                                func_to_switch = CURRENT_LIMIT_800;
1508
1509                        break;
1510
1511                case CURRENT_LIMIT_600:
1512                        if (sd_card->func_group4_mask & CURRENT_LIMIT_600_MASK)
1513                                func_to_switch = CURRENT_LIMIT_600;
1514
1515                        break;
1516
1517                case CURRENT_LIMIT_400:
1518                        if (sd_card->func_group4_mask & CURRENT_LIMIT_400_MASK)
1519                                func_to_switch = CURRENT_LIMIT_400;
1520
1521                        break;
1522
1523                case CURRENT_LIMIT_200:
1524                        if (sd_card->func_group4_mask & CURRENT_LIMIT_200_MASK)
1525                                func_to_switch = CURRENT_LIMIT_200;
1526
1527                        break;
1528
1529                default:
1530                        continue;
1531                }
1532
1533                if (func_to_switch != 0xFF)
1534                        break;
1535        }
1536
1537        dev_dbg(rtsx_dev(chip), "SD_FUNC_GROUP_4: func_to_switch = 0x%02x",
1538                func_to_switch);
1539
1540        if (func_to_switch <= CURRENT_LIMIT_800) {
1541                retval = sd_check_switch(chip, SD_FUNC_GROUP_4, func_to_switch,
1542                                         bus_width);
1543                if (retval != STATUS_SUCCESS) {
1544                        if (sd_check_err_code(chip, SD_NO_CARD)) {
1545                                rtsx_trace(chip);
1546                                return STATUS_FAIL;
1547                        }
1548                }
1549                dev_dbg(rtsx_dev(chip), "Switch current limit finished! (%d)\n",
1550                        retval);
1551        }
1552
1553        if (CHK_SD_DDR50(sd_card)) {
1554                retval = rtsx_write_register(chip, SD_PUSH_POINT_CTL, 0x06, 0);
1555                if (retval) {
1556                        rtsx_trace(chip);
1557                        return retval;
1558                }
1559        }
1560
1561        return STATUS_SUCCESS;
1562}
1563
1564static int sd_wait_data_idle(struct rtsx_chip *chip)
1565{
1566        int retval = STATUS_TIMEDOUT;
1567        int i;
1568        u8 val = 0;
1569
1570        for (i = 0; i < 100; i++) {
1571                retval = rtsx_read_register(chip, SD_DATA_STATE, &val);
1572                if (retval) {
1573                        rtsx_trace(chip);
1574                        return retval;
1575                }
1576                if (val & SD_DATA_IDLE) {
1577                        retval = STATUS_SUCCESS;
1578                        break;
1579                }
1580                udelay(100);
1581        }
1582        dev_dbg(rtsx_dev(chip), "SD_DATA_STATE: 0x%02x\n", val);
1583
1584        return retval;
1585}
1586
1587static int sd_sdr_tuning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1588{
1589        int retval;
1590        u8 cmd[5];
1591
1592        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1593        if (retval != STATUS_SUCCESS) {
1594                rtsx_trace(chip);
1595                return STATUS_FAIL;
1596        }
1597
1598        cmd[0] = 0x40 | SEND_TUNING_PATTERN;
1599        cmd[1] = 0;
1600        cmd[2] = 0;
1601        cmd[3] = 0;
1602        cmd[4] = 0;
1603
1604        retval = sd_read_data(chip, SD_TM_AUTO_TUNING, cmd, 5, 0x40, 1,
1605                              SD_BUS_WIDTH_4, NULL, 0, 100);
1606        if (retval != STATUS_SUCCESS) {
1607                (void)sd_wait_data_idle(chip);
1608
1609                rtsx_clear_sd_error(chip);
1610                rtsx_trace(chip);
1611                return STATUS_FAIL;
1612        }
1613
1614        return STATUS_SUCCESS;
1615}
1616
1617static int sd_ddr_tuning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1618{
1619        struct sd_info *sd_card = &chip->sd_card;
1620        int retval;
1621        u8 cmd[5];
1622
1623        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1624        if (retval != STATUS_SUCCESS) {
1625                rtsx_trace(chip);
1626                return STATUS_FAIL;
1627        }
1628
1629        dev_dbg(rtsx_dev(chip), "sd ddr tuning rx\n");
1630
1631        retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
1632                                     SD_RSP_TYPE_R1, NULL, 0);
1633        if (retval != STATUS_SUCCESS) {
1634                rtsx_trace(chip);
1635                return STATUS_FAIL;
1636        }
1637
1638        cmd[0] = 0x40 | SD_STATUS;
1639        cmd[1] = 0;
1640        cmd[2] = 0;
1641        cmd[3] = 0;
1642        cmd[4] = 0;
1643
1644        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1,
1645                              SD_BUS_WIDTH_4, NULL, 0, 100);
1646        if (retval != STATUS_SUCCESS) {
1647                (void)sd_wait_data_idle(chip);
1648
1649                rtsx_clear_sd_error(chip);
1650                rtsx_trace(chip);
1651                return STATUS_FAIL;
1652        }
1653
1654        return STATUS_SUCCESS;
1655}
1656
1657static int mmc_ddr_tuning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1658{
1659        struct sd_info *sd_card = &chip->sd_card;
1660        int retval;
1661        u8 cmd[5], bus_width;
1662
1663        if (CHK_MMC_8BIT(sd_card))
1664                bus_width = SD_BUS_WIDTH_8;
1665        else if (CHK_MMC_4BIT(sd_card))
1666                bus_width = SD_BUS_WIDTH_4;
1667        else
1668                bus_width = SD_BUS_WIDTH_1;
1669
1670        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1671        if (retval != STATUS_SUCCESS) {
1672                rtsx_trace(chip);
1673                return STATUS_FAIL;
1674        }
1675
1676        dev_dbg(rtsx_dev(chip), "mmc ddr tuning rx\n");
1677
1678        cmd[0] = 0x40 | SEND_EXT_CSD;
1679        cmd[1] = 0;
1680        cmd[2] = 0;
1681        cmd[3] = 0;
1682        cmd[4] = 0;
1683
1684        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 0x200, 1,
1685                              bus_width, NULL, 0, 100);
1686        if (retval != STATUS_SUCCESS) {
1687                (void)sd_wait_data_idle(chip);
1688
1689                rtsx_clear_sd_error(chip);
1690                rtsx_trace(chip);
1691                return STATUS_FAIL;
1692        }
1693
1694        return STATUS_SUCCESS;
1695}
1696
1697static int sd_sdr_tuning_tx_cmd(struct rtsx_chip *chip, u8 sample_point)
1698{
1699        struct sd_info *sd_card = &chip->sd_card;
1700        int retval;
1701
1702        retval = sd_change_phase(chip, sample_point, TUNE_TX);
1703        if (retval != STATUS_SUCCESS) {
1704                rtsx_trace(chip);
1705                return STATUS_FAIL;
1706        }
1707
1708        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1709                                     SD_RSP_80CLK_TIMEOUT_EN);
1710        if (retval) {
1711                rtsx_trace(chip);
1712                return retval;
1713        }
1714
1715        retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
1716                                     SD_RSP_TYPE_R1, NULL, 0);
1717        if (retval != STATUS_SUCCESS) {
1718                if (sd_check_err_code(chip, SD_RSP_TIMEOUT)) {
1719                        rtsx_write_register(chip, SD_CFG3,
1720                                            SD_RSP_80CLK_TIMEOUT_EN, 0);
1721                        rtsx_trace(chip);
1722                        return STATUS_FAIL;
1723                }
1724        }
1725
1726        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1727                                     0);
1728        if (retval) {
1729                rtsx_trace(chip);
1730                return retval;
1731        }
1732
1733        return STATUS_SUCCESS;
1734}
1735
1736static int sd_ddr_tuning_tx_cmd(struct rtsx_chip *chip, u8 sample_point)
1737{
1738        struct sd_info *sd_card = &chip->sd_card;
1739        int retval;
1740        u8 cmd[5], bus_width;
1741
1742        retval = sd_change_phase(chip, sample_point, TUNE_TX);
1743        if (retval != STATUS_SUCCESS) {
1744                rtsx_trace(chip);
1745                return STATUS_FAIL;
1746        }
1747
1748        if (CHK_SD(sd_card)) {
1749                bus_width = SD_BUS_WIDTH_4;
1750        } else {
1751                if (CHK_MMC_8BIT(sd_card))
1752                        bus_width = SD_BUS_WIDTH_8;
1753                else if (CHK_MMC_4BIT(sd_card))
1754                        bus_width = SD_BUS_WIDTH_4;
1755                else
1756                        bus_width = SD_BUS_WIDTH_1;
1757        }
1758
1759        retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
1760        if (retval != STATUS_SUCCESS) {
1761                rtsx_trace(chip);
1762                return STATUS_FAIL;
1763        }
1764
1765        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1766                                     SD_RSP_80CLK_TIMEOUT_EN);
1767        if (retval) {
1768                rtsx_trace(chip);
1769                return retval;
1770        }
1771
1772        cmd[0] = 0x40 | PROGRAM_CSD;
1773        cmd[1] = 0;
1774        cmd[2] = 0;
1775        cmd[3] = 0;
1776        cmd[4] = 0;
1777
1778        retval = sd_write_data(chip, SD_TM_AUTO_WRITE_2, cmd, 5, 16, 1,
1779                               bus_width, sd_card->raw_csd, 16, 100);
1780        if (retval != STATUS_SUCCESS) {
1781                rtsx_clear_sd_error(chip);
1782                rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1783                rtsx_trace(chip);
1784                return STATUS_FAIL;
1785        }
1786
1787        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1788                                     0);
1789        if (retval) {
1790                rtsx_trace(chip);
1791                return retval;
1792        }
1793
1794        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1,
1795                            NULL, 0);
1796
1797        return STATUS_SUCCESS;
1798}
1799
1800static u8 sd_search_final_phase(struct rtsx_chip *chip, u32 phase_map,
1801                                u8 tune_dir)
1802{
1803        struct sd_info *sd_card = &chip->sd_card;
1804        struct timing_phase_path path[MAX_PHASE + 1];
1805        int i, j, cont_path_cnt;
1806        bool new_block;
1807        int max_len, final_path_idx;
1808        u8 final_phase = 0xFF;
1809
1810        if (phase_map == 0xFFFFFFFF) {
1811                if (tune_dir == TUNE_RX)
1812                        final_phase = (u8)chip->sd_default_rx_phase;
1813                else
1814                        final_phase = (u8)chip->sd_default_tx_phase;
1815
1816                goto search_finish;
1817        }
1818
1819        cont_path_cnt = 0;
1820        new_block = true;
1821        j = 0;
1822        for (i = 0; i < MAX_PHASE + 1; i++) {
1823                if (phase_map & (1 << i)) {
1824                        if (new_block) {
1825                                new_block = false;
1826                                j = cont_path_cnt++;
1827                                path[j].start = i;
1828                                path[j].end = i;
1829                        } else {
1830                                path[j].end = i;
1831                        }
1832                } else {
1833                        new_block = true;
1834                        if (cont_path_cnt) {
1835                                int idx = cont_path_cnt - 1;
1836
1837                                path[idx].len = path[idx].end -
1838                                        path[idx].start + 1;
1839                                path[idx].mid = path[idx].start +
1840                                        path[idx].len / 2;
1841                        }
1842                }
1843        }
1844
1845        if (cont_path_cnt == 0) {
1846                dev_dbg(rtsx_dev(chip), "No continuous phase path\n");
1847                goto search_finish;
1848        } else {
1849                int idx = cont_path_cnt - 1;
1850
1851                path[idx].len = path[idx].end - path[idx].start + 1;
1852                path[idx].mid = path[idx].start + path[idx].len / 2;
1853        }
1854
1855        if ((path[0].start == 0) &&
1856            (path[cont_path_cnt - 1].end == MAX_PHASE)) {
1857                path[0].start = path[cont_path_cnt - 1].start - MAX_PHASE - 1;
1858                path[0].len += path[cont_path_cnt - 1].len;
1859                path[0].mid = path[0].start + path[0].len / 2;
1860                if (path[0].mid < 0)
1861                        path[0].mid += MAX_PHASE + 1;
1862
1863                cont_path_cnt--;
1864        }
1865
1866        max_len = 0;
1867        final_phase = 0;
1868        final_path_idx = 0;
1869        for (i = 0; i < cont_path_cnt; i++) {
1870                if (path[i].len > max_len) {
1871                        max_len = path[i].len;
1872                        final_phase = (u8)path[i].mid;
1873                        final_path_idx = i;
1874                }
1875
1876                dev_dbg(rtsx_dev(chip), "path[%d].start = %d\n",
1877                        i, path[i].start);
1878                dev_dbg(rtsx_dev(chip), "path[%d].end = %d\n", i, path[i].end);
1879                dev_dbg(rtsx_dev(chip), "path[%d].len = %d\n", i, path[i].len);
1880                dev_dbg(rtsx_dev(chip), "path[%d].mid = %d\n", i, path[i].mid);
1881                dev_dbg(rtsx_dev(chip), "\n");
1882        }
1883
1884        if (tune_dir == TUNE_TX) {
1885                if (CHK_SD_SDR104(sd_card)) {
1886                        if (max_len > 15) {
1887                                int temp_mid = (max_len - 16) / 2;
1888                                int temp_final_phase =
1889                                        path[final_path_idx].end -
1890                                        (max_len - (6 + temp_mid));
1891
1892                                if (temp_final_phase < 0)
1893                                        final_phase = (u8)(temp_final_phase +
1894                                                        MAX_PHASE + 1);
1895                                else
1896                                        final_phase = (u8)temp_final_phase;
1897                        }
1898                } else if (CHK_SD_SDR50(sd_card)) {
1899                        if (max_len > 12) {
1900                                int temp_mid = (max_len - 13) / 2;
1901                                int temp_final_phase =
1902                                        path[final_path_idx].end -
1903                                        (max_len - (3 + temp_mid));
1904
1905                                if (temp_final_phase < 0)
1906                                        final_phase = (u8)(temp_final_phase +
1907                                                        MAX_PHASE + 1);
1908                                else
1909                                        final_phase = (u8)temp_final_phase;
1910                        }
1911                }
1912        }
1913
1914search_finish:
1915        dev_dbg(rtsx_dev(chip), "Final chosen phase: %d\n", final_phase);
1916        return final_phase;
1917}
1918
1919static int sd_tuning_rx(struct rtsx_chip *chip)
1920{
1921        struct sd_info *sd_card = &chip->sd_card;
1922        int retval;
1923        int i, j;
1924        u32 raw_phase_map[3], phase_map;
1925        u8 final_phase;
1926        int (*tuning_cmd)(struct rtsx_chip *chip, u8 sample_point);
1927
1928        if (CHK_SD(sd_card)) {
1929                if (CHK_SD_DDR50(sd_card))
1930                        tuning_cmd = sd_ddr_tuning_rx_cmd;
1931                else
1932                        tuning_cmd = sd_sdr_tuning_rx_cmd;
1933
1934        } else {
1935                if (CHK_MMC_DDR52(sd_card)) {
1936                        tuning_cmd = mmc_ddr_tuning_rx_cmd;
1937                } else {
1938                        rtsx_trace(chip);
1939                        return STATUS_FAIL;
1940                }
1941        }
1942
1943        for (i = 0; i < 3; i++) {
1944                raw_phase_map[i] = 0;
1945                for (j = MAX_PHASE; j >= 0; j--) {
1946                        if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1947                                sd_set_err_code(chip, SD_NO_CARD);
1948                                rtsx_trace(chip);
1949                                return STATUS_FAIL;
1950                        }
1951
1952                        retval = tuning_cmd(chip, (u8)j);
1953                        if (retval == STATUS_SUCCESS)
1954                                raw_phase_map[i] |= 1 << j;
1955                }
1956        }
1957
1958        phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
1959        for (i = 0; i < 3; i++)
1960                dev_dbg(rtsx_dev(chip), "RX raw_phase_map[%d] = 0x%08x\n",
1961                        i, raw_phase_map[i]);
1962
1963        dev_dbg(rtsx_dev(chip), "RX phase_map = 0x%08x\n", phase_map);
1964
1965        final_phase = sd_search_final_phase(chip, phase_map, TUNE_RX);
1966        if (final_phase == 0xFF) {
1967                rtsx_trace(chip);
1968                return STATUS_FAIL;
1969        }
1970
1971        retval = sd_change_phase(chip, final_phase, TUNE_RX);
1972        if (retval != STATUS_SUCCESS) {
1973                rtsx_trace(chip);
1974                return STATUS_FAIL;
1975        }
1976
1977        return STATUS_SUCCESS;
1978}
1979
1980static int sd_ddr_pre_tuning_tx(struct rtsx_chip *chip)
1981{
1982        struct sd_info *sd_card = &chip->sd_card;
1983        int retval;
1984        int i;
1985        u32 phase_map;
1986        u8 final_phase;
1987
1988        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1989                                     SD_RSP_80CLK_TIMEOUT_EN);
1990        if (retval) {
1991                rtsx_trace(chip);
1992                return retval;
1993        }
1994
1995        phase_map = 0;
1996        for (i = MAX_PHASE; i >= 0; i--) {
1997                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1998                        sd_set_err_code(chip, SD_NO_CARD);
1999                        rtsx_write_register(chip, SD_CFG3,
2000                                            SD_RSP_80CLK_TIMEOUT_EN, 0);
2001                        rtsx_trace(chip);
2002                        return STATUS_FAIL;
2003                }
2004
2005                retval = sd_change_phase(chip, (u8)i, TUNE_TX);
2006                if (retval != STATUS_SUCCESS)
2007                        continue;
2008
2009                retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
2010                                             sd_card->sd_addr, SD_RSP_TYPE_R1,
2011                                             NULL, 0);
2012                if ((retval == STATUS_SUCCESS) ||
2013                    !sd_check_err_code(chip, SD_RSP_TIMEOUT))
2014                        phase_map |= 1 << i;
2015        }
2016
2017        retval = rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
2018                                     0);
2019        if (retval) {
2020                rtsx_trace(chip);
2021                return retval;
2022        }
2023
2024        dev_dbg(rtsx_dev(chip), "DDR TX pre tune phase_map = 0x%08x\n",
2025                phase_map);
2026
2027        final_phase = sd_search_final_phase(chip, phase_map, TUNE_TX);
2028        if (final_phase == 0xFF) {
2029                rtsx_trace(chip);
2030                return STATUS_FAIL;
2031        }
2032
2033        retval = sd_change_phase(chip, final_phase, TUNE_TX);
2034        if (retval != STATUS_SUCCESS) {
2035                rtsx_trace(chip);
2036                return STATUS_FAIL;
2037        }
2038
2039        dev_dbg(rtsx_dev(chip), "DDR TX pre tune phase: %d\n",
2040                (int)final_phase);
2041
2042        return STATUS_SUCCESS;
2043}
2044
2045static int sd_tuning_tx(struct rtsx_chip *chip)
2046{
2047        struct sd_info *sd_card = &chip->sd_card;
2048        int retval;
2049        int i, j;
2050        u32 raw_phase_map[3], phase_map;
2051        u8 final_phase;
2052        int (*tuning_cmd)(struct rtsx_chip *chip, u8 sample_point);
2053
2054        if (CHK_SD(sd_card)) {
2055                if (CHK_SD_DDR50(sd_card))
2056                        tuning_cmd = sd_ddr_tuning_tx_cmd;
2057                else
2058                        tuning_cmd = sd_sdr_tuning_tx_cmd;
2059
2060        } else {
2061                if (CHK_MMC_DDR52(sd_card)) {
2062                        tuning_cmd = sd_ddr_tuning_tx_cmd;
2063                } else {
2064                        rtsx_trace(chip);
2065                        return STATUS_FAIL;
2066                }
2067        }
2068
2069        for (i = 0; i < 3; i++) {
2070                raw_phase_map[i] = 0;
2071                for (j = MAX_PHASE; j >= 0; j--) {
2072                        if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2073                                sd_set_err_code(chip, SD_NO_CARD);
2074                                rtsx_write_register(chip, SD_CFG3,
2075                                                    SD_RSP_80CLK_TIMEOUT_EN, 0);
2076                                rtsx_trace(chip);
2077                                return STATUS_FAIL;
2078                        }
2079
2080                        retval = tuning_cmd(chip, (u8)j);
2081                        if (retval == STATUS_SUCCESS)
2082                                raw_phase_map[i] |= 1 << j;
2083                }
2084        }
2085
2086        phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
2087        for (i = 0; i < 3; i++)
2088                dev_dbg(rtsx_dev(chip), "TX raw_phase_map[%d] = 0x%08x\n",
2089                        i, raw_phase_map[i]);
2090
2091        dev_dbg(rtsx_dev(chip), "TX phase_map = 0x%08x\n", phase_map);
2092
2093        final_phase = sd_search_final_phase(chip, phase_map, TUNE_TX);
2094        if (final_phase == 0xFF) {
2095                rtsx_trace(chip);
2096                return STATUS_FAIL;
2097        }
2098
2099        retval = sd_change_phase(chip, final_phase, TUNE_TX);
2100        if (retval != STATUS_SUCCESS) {
2101                rtsx_trace(chip);
2102                return STATUS_FAIL;
2103        }
2104
2105        return STATUS_SUCCESS;
2106}
2107
2108static int sd_sdr_tuning(struct rtsx_chip *chip)
2109{
2110        int retval;
2111
2112        retval = sd_tuning_tx(chip);
2113        if (retval != STATUS_SUCCESS) {
2114                rtsx_trace(chip);
2115                return STATUS_FAIL;
2116        }
2117
2118        retval = sd_tuning_rx(chip);
2119        if (retval != STATUS_SUCCESS) {
2120                rtsx_trace(chip);
2121                return STATUS_FAIL;
2122        }
2123
2124        return STATUS_SUCCESS;
2125}
2126
2127static int sd_ddr_tuning(struct rtsx_chip *chip)
2128{
2129        int retval;
2130
2131        if (!(chip->sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
2132                retval = sd_ddr_pre_tuning_tx(chip);
2133                if (retval != STATUS_SUCCESS) {
2134                        rtsx_trace(chip);
2135                        return STATUS_FAIL;
2136                }
2137        } else {
2138                retval = sd_change_phase(chip, (u8)chip->sd_ddr_tx_phase,
2139                                         TUNE_TX);
2140                if (retval != STATUS_SUCCESS) {
2141                        rtsx_trace(chip);
2142                        return STATUS_FAIL;
2143                }
2144        }
2145
2146        retval = sd_tuning_rx(chip);
2147        if (retval != STATUS_SUCCESS) {
2148                rtsx_trace(chip);
2149                return STATUS_FAIL;
2150        }
2151
2152        if (!(chip->sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
2153                retval = sd_tuning_tx(chip);
2154                if (retval != STATUS_SUCCESS) {
2155                        rtsx_trace(chip);
2156                        return STATUS_FAIL;
2157                }
2158        }
2159
2160        return STATUS_SUCCESS;
2161}
2162
2163static int mmc_ddr_tuning(struct rtsx_chip *chip)
2164{
2165        int retval;
2166
2167        if (!(chip->sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
2168                retval = sd_ddr_pre_tuning_tx(chip);
2169                if (retval != STATUS_SUCCESS) {
2170                        rtsx_trace(chip);
2171                        return STATUS_FAIL;
2172                }
2173        } else {
2174                retval = sd_change_phase(chip, (u8)chip->mmc_ddr_tx_phase,
2175                                         TUNE_TX);
2176                if (retval != STATUS_SUCCESS) {
2177                        rtsx_trace(chip);
2178                        return STATUS_FAIL;
2179                }
2180        }
2181
2182        retval = sd_tuning_rx(chip);
2183        if (retval != STATUS_SUCCESS) {
2184                rtsx_trace(chip);
2185                return STATUS_FAIL;
2186        }
2187
2188        if (!(chip->sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
2189                retval = sd_tuning_tx(chip);
2190                if (retval != STATUS_SUCCESS) {
2191                        rtsx_trace(chip);
2192                        return STATUS_FAIL;
2193                }
2194        }
2195
2196        return STATUS_SUCCESS;
2197}
2198
2199int sd_switch_clock(struct rtsx_chip *chip)
2200{
2201        struct sd_info *sd_card = &chip->sd_card;
2202        int retval;
2203        int re_tuning = 0;
2204
2205        retval = select_card(chip, SD_CARD);
2206        if (retval != STATUS_SUCCESS) {
2207                rtsx_trace(chip);
2208                return STATUS_FAIL;
2209        }
2210
2211        retval = switch_clock(chip, sd_card->sd_clock);
2212        if (retval != STATUS_SUCCESS) {
2213                rtsx_trace(chip);
2214                return STATUS_FAIL;
2215        }
2216
2217        if (re_tuning) {
2218                if (CHK_SD(sd_card)) {
2219                        if (CHK_SD_DDR50(sd_card))
2220                                retval = sd_ddr_tuning(chip);
2221                        else
2222                                retval = sd_sdr_tuning(chip);
2223                } else {
2224                        if (CHK_MMC_DDR52(sd_card))
2225                                retval = mmc_ddr_tuning(chip);
2226                }
2227
2228                if (retval != STATUS_SUCCESS) {
2229                        rtsx_trace(chip);
2230                        return STATUS_FAIL;
2231                }
2232        }
2233
2234        return STATUS_SUCCESS;
2235}
2236
2237static int sd_prepare_reset(struct rtsx_chip *chip)
2238{
2239        struct sd_info *sd_card = &chip->sd_card;
2240        int retval;
2241
2242        if (chip->asic_code)
2243                sd_card->sd_clock = 29;
2244        else
2245                sd_card->sd_clock = CLK_30;
2246
2247        sd_card->sd_type = 0;
2248        sd_card->seq_mode = 0;
2249        sd_card->sd_data_buf_ready = 0;
2250        sd_card->capacity = 0;
2251
2252#ifdef SUPPORT_SD_LOCK
2253        sd_card->sd_lock_status = 0;
2254        sd_card->sd_erase_status = 0;
2255#endif
2256
2257        chip->capacity[chip->card2lun[SD_CARD]] = 0;
2258        chip->sd_io = 0;
2259
2260        retval = sd_set_init_para(chip);
2261        if (retval != STATUS_SUCCESS) {
2262                rtsx_trace(chip);
2263                return retval;
2264        }
2265
2266        retval = rtsx_write_register(chip, REG_SD_CFG1, 0xFF, 0x40);
2267        if (retval) {
2268                rtsx_trace(chip);
2269                return retval;
2270        }
2271
2272        retval = rtsx_write_register(chip, CARD_STOP, SD_STOP | SD_CLR_ERR,
2273                                     SD_STOP | SD_CLR_ERR);
2274        if (retval) {
2275                rtsx_trace(chip);
2276                return retval;
2277        }
2278
2279        retval = select_card(chip, SD_CARD);
2280        if (retval != STATUS_SUCCESS) {
2281                rtsx_trace(chip);
2282                return STATUS_FAIL;
2283        }
2284
2285        return STATUS_SUCCESS;
2286}
2287
2288static int sd_pull_ctl_disable(struct rtsx_chip *chip)
2289{
2290        int retval;
2291
2292        if (CHECK_PID(chip, 0x5208)) {
2293                retval = rtsx_write_register(chip, CARD_PULL_CTL1, 0xFF,
2294                                             XD_D3_PD | SD_D7_PD | SD_CLK_PD |
2295                                             SD_D5_PD);
2296                if (retval) {
2297                        rtsx_trace(chip);
2298                        return retval;
2299                }
2300                retval = rtsx_write_register(chip, CARD_PULL_CTL2, 0xFF,
2301                                             SD_D6_PD | SD_D0_PD | SD_D1_PD |
2302                                             XD_D5_PD);
2303                if (retval) {
2304                        rtsx_trace(chip);
2305                        return retval;
2306                }
2307                retval = rtsx_write_register(chip, CARD_PULL_CTL3, 0xFF,
2308                                             SD_D4_PD | XD_CE_PD | XD_CLE_PD |
2309                                             XD_CD_PU);
2310                if (retval) {
2311                        rtsx_trace(chip);
2312                        return retval;
2313                }
2314                retval = rtsx_write_register(chip, CARD_PULL_CTL4, 0xFF,
2315                                             XD_RDY_PD | SD_D3_PD | SD_D2_PD |
2316                                             XD_ALE_PD);
2317                if (retval) {
2318                        rtsx_trace(chip);
2319                        return retval;
2320                }
2321                retval = rtsx_write_register(chip, CARD_PULL_CTL5, 0xFF,
2322                                             MS_INS_PU | SD_WP_PD | SD_CD_PU |
2323                                             SD_CMD_PD);
2324                if (retval) {
2325                        rtsx_trace(chip);
2326                        return retval;
2327                }
2328                retval = rtsx_write_register(chip, CARD_PULL_CTL6, 0xFF,
2329                                             MS_D5_PD | MS_D4_PD);
2330                if (retval) {
2331                        rtsx_trace(chip);
2332                        return retval;
2333                }
2334        } else if (CHECK_PID(chip, 0x5288)) {
2335                if (CHECK_BARO_PKG(chip, QFN)) {
2336                        retval = rtsx_write_register(chip, CARD_PULL_CTL1,
2337                                                     0xFF, 0x55);
2338                        if (retval) {
2339                                rtsx_trace(chip);
2340                                return retval;
2341                        }
2342                        retval = rtsx_write_register(chip, CARD_PULL_CTL2,
2343                                                     0xFF, 0x55);
2344                        if (retval) {
2345                                rtsx_trace(chip);
2346                                return retval;
2347                        }
2348                        retval = rtsx_write_register(chip, CARD_PULL_CTL3,
2349                                                     0xFF, 0x4B);
2350                        if (retval) {
2351                                rtsx_trace(chip);
2352                                return retval;
2353                        }
2354                        retval = rtsx_write_register(chip, CARD_PULL_CTL4,
2355                                                     0xFF, 0x69);
2356                        if (retval) {
2357                                rtsx_trace(chip);
2358                                return retval;
2359                        }
2360                }
2361        }
2362
2363        return STATUS_SUCCESS;
2364}
2365
2366int sd_pull_ctl_enable(struct rtsx_chip *chip)
2367{
2368        int retval;
2369
2370        rtsx_init_cmd(chip);
2371
2372        if (CHECK_PID(chip, 0x5208)) {
2373                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF,
2374                             XD_D3_PD | SD_DAT7_PU | SD_CLK_NP | SD_D5_PU);
2375                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF,
2376                             SD_D6_PU | SD_D0_PU | SD_D1_PU | XD_D5_PD);
2377                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF,
2378                             SD_D4_PU | XD_CE_PD | XD_CLE_PD | XD_CD_PU);
2379                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF,
2380                             XD_RDY_PD | SD_D3_PU | SD_D2_PU | XD_ALE_PD);
2381                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF,
2382                             MS_INS_PU | SD_WP_PU | SD_CD_PU | SD_CMD_PU);
2383                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF,
2384                             MS_D5_PD | MS_D4_PD);
2385        } else if (CHECK_PID(chip, 0x5288)) {
2386                if (CHECK_BARO_PKG(chip, QFN)) {
2387                        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF,
2388                                     0xA8);
2389                        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF,
2390                                     0x5A);
2391                        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF,
2392                                     0x95);
2393                        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF,
2394                                     0xAA);
2395                }
2396        }
2397
2398        retval = rtsx_send_cmd(chip, SD_CARD, 100);
2399        if (retval < 0) {
2400                rtsx_trace(chip);
2401                return STATUS_FAIL;
2402        }
2403
2404        return STATUS_SUCCESS;
2405}
2406
2407static int sd_init_power(struct rtsx_chip *chip)
2408{
2409        int retval;
2410
2411        retval = sd_power_off_card3v3(chip);
2412        if (retval != STATUS_SUCCESS) {
2413                rtsx_trace(chip);
2414                return STATUS_FAIL;
2415        }
2416
2417        if (!chip->ft2_fast_mode)
2418                wait_timeout(250);
2419
2420        retval = enable_card_clock(chip, SD_CARD);
2421        if (retval != STATUS_SUCCESS) {
2422                rtsx_trace(chip);
2423                return STATUS_FAIL;
2424        }
2425
2426        if (chip->asic_code) {
2427                retval = sd_pull_ctl_enable(chip);
2428                if (retval != STATUS_SUCCESS) {
2429                        rtsx_trace(chip);
2430                        return STATUS_FAIL;
2431                }
2432        } else {
2433                retval = rtsx_write_register(chip, FPGA_PULL_CTL,
2434                                             FPGA_SD_PULL_CTL_BIT | 0x20, 0);
2435                if (retval) {
2436                        rtsx_trace(chip);
2437                        return retval;
2438                }
2439        }
2440
2441        if (!chip->ft2_fast_mode) {
2442                retval = card_power_on(chip, SD_CARD);
2443                if (retval != STATUS_SUCCESS) {
2444                        rtsx_trace(chip);
2445                        return STATUS_FAIL;
2446                }
2447
2448                wait_timeout(260);
2449
2450#ifdef SUPPORT_OCP
2451                if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) {
2452                        dev_dbg(rtsx_dev(chip), "Over current, OCPSTAT is 0x%x\n",
2453                                chip->ocp_stat);
2454                        rtsx_trace(chip);
2455                        return STATUS_FAIL;
2456                }
2457#endif
2458        }
2459
2460        retval = rtsx_write_register(chip, CARD_OE, SD_OUTPUT_EN,
2461                                     SD_OUTPUT_EN);
2462        if (retval) {
2463                rtsx_trace(chip);
2464                return retval;
2465        }
2466
2467        return STATUS_SUCCESS;
2468}
2469
2470static int sd_dummy_clock(struct rtsx_chip *chip)
2471{
2472        int retval;
2473
2474        retval = rtsx_write_register(chip, REG_SD_CFG3, 0x01, 0x01);
2475        if (retval) {
2476                rtsx_trace(chip);
2477                return retval;
2478        }
2479        wait_timeout(5);
2480        retval = rtsx_write_register(chip, REG_SD_CFG3, 0x01, 0);
2481        if (retval) {
2482                rtsx_trace(chip);
2483                return retval;
2484        }
2485
2486        return STATUS_SUCCESS;
2487}
2488
2489static int sd_read_lba0(struct rtsx_chip *chip)
2490{
2491        struct sd_info *sd_card = &chip->sd_card;
2492        int retval;
2493        u8 cmd[5], bus_width;
2494
2495        cmd[0] = 0x40 | READ_SINGLE_BLOCK;
2496        cmd[1] = 0;
2497        cmd[2] = 0;
2498        cmd[3] = 0;
2499        cmd[4] = 0;
2500
2501        if (CHK_SD(sd_card)) {
2502                bus_width = SD_BUS_WIDTH_4;
2503        } else {
2504                if (CHK_MMC_8BIT(sd_card))
2505                        bus_width = SD_BUS_WIDTH_8;
2506                else if (CHK_MMC_4BIT(sd_card))
2507                        bus_width = SD_BUS_WIDTH_4;
2508                else
2509                        bus_width = SD_BUS_WIDTH_1;
2510        }
2511
2512        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 512, 1,
2513                              bus_width, NULL, 0, 100);
2514        if (retval != STATUS_SUCCESS) {
2515                rtsx_clear_sd_error(chip);
2516                rtsx_trace(chip);
2517                return STATUS_FAIL;
2518        }
2519
2520        return STATUS_SUCCESS;
2521}
2522
2523static int sd_check_wp_state(struct rtsx_chip *chip)
2524{
2525        struct sd_info *sd_card = &chip->sd_card;
2526        int retval;
2527        u32 val;
2528        u16 sd_card_type;
2529        u8 cmd[5], buf[64];
2530
2531        retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2532                                     SD_RSP_TYPE_R1, NULL, 0);
2533        if (retval != STATUS_SUCCESS) {
2534                rtsx_trace(chip);
2535                return STATUS_FAIL;
2536        }
2537
2538        cmd[0] = 0x40 | SD_STATUS;
2539        cmd[1] = 0;
2540        cmd[2] = 0;
2541        cmd[3] = 0;
2542        cmd[4] = 0;
2543
2544        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1,
2545                              SD_BUS_WIDTH_4, buf, 64, 250);
2546        if (retval != STATUS_SUCCESS) {
2547                rtsx_clear_sd_error(chip);
2548
2549                sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2550                                    SD_RSP_TYPE_R1, NULL, 0);
2551                rtsx_trace(chip);
2552                return STATUS_FAIL;
2553        }
2554
2555        dev_dbg(rtsx_dev(chip), "ACMD13:\n");
2556        dev_dbg(rtsx_dev(chip), "%*ph\n", 64, buf);
2557
2558        sd_card_type = ((u16)buf[2] << 8) | buf[3];
2559        dev_dbg(rtsx_dev(chip), "sd_card_type = 0x%04x\n", sd_card_type);
2560        if ((sd_card_type == 0x0001) || (sd_card_type == 0x0002)) {
2561                /* ROM card or OTP */
2562                chip->card_wp |= SD_CARD;
2563        }
2564
2565        /* Check SD Machanical Write-Protect Switch */
2566        val = rtsx_readl(chip, RTSX_BIPR);
2567        if (val & SD_WRITE_PROTECT)
2568                chip->card_wp |= SD_CARD;
2569
2570        return STATUS_SUCCESS;
2571}
2572
2573static int reset_sd(struct rtsx_chip *chip)
2574{
2575        struct sd_info *sd_card = &chip->sd_card;
2576        bool hi_cap_flow = false;
2577        int retval, i = 0, j = 0, k = 0;
2578        bool sd_dont_switch = false;
2579        bool support_1v8 = false;
2580        bool try_sdio = true;
2581        u8 rsp[16];
2582        u8 switch_bus_width;
2583        u32 voltage = 0;
2584        bool sd20_mode = false;
2585
2586        SET_SD(sd_card);
2587
2588switch_fail:
2589
2590        i = 0;
2591        j = 0;
2592        k = 0;
2593        hi_cap_flow = false;
2594
2595#ifdef SUPPORT_SD_LOCK
2596        if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON)
2597                goto SD_UNLOCK_ENTRY;
2598#endif
2599
2600        retval = sd_prepare_reset(chip);
2601        if (retval != STATUS_SUCCESS)
2602                goto status_fail;
2603
2604        retval = sd_dummy_clock(chip);
2605        if (retval != STATUS_SUCCESS)
2606                goto status_fail;
2607
2608        if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip) && try_sdio) {
2609                int rty_cnt = 0;
2610
2611                for (; rty_cnt < chip->sdio_retry_cnt; rty_cnt++) {
2612                        if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2613                                sd_set_err_code(chip, SD_NO_CARD);
2614                                goto status_fail;
2615                        }
2616
2617                        retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0,
2618                                                     SD_RSP_TYPE_R4, rsp, 5);
2619                        if (retval == STATUS_SUCCESS) {
2620                                int func_num = (rsp[1] >> 4) & 0x07;
2621
2622                                if (func_num) {
2623                                        dev_dbg(rtsx_dev(chip), "SD_IO card (Function number: %d)!\n",
2624                                                func_num);
2625                                        chip->sd_io = 1;
2626                                        goto status_fail;
2627                                }
2628
2629                                break;
2630                        }
2631
2632                        sd_init_power(chip);
2633
2634                        sd_dummy_clock(chip);
2635                }
2636
2637                dev_dbg(rtsx_dev(chip), "Normal card!\n");
2638        }
2639
2640        /* Start Initialization Process of SD Card */
2641RTY_SD_RST:
2642        retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0,
2643                                     NULL, 0);
2644        if (retval != STATUS_SUCCESS)
2645                goto status_fail;
2646
2647        wait_timeout(20);
2648
2649        retval = sd_send_cmd_get_rsp(chip, SEND_IF_COND, 0x000001AA,
2650                                     SD_RSP_TYPE_R7, rsp, 5);
2651        if (retval == STATUS_SUCCESS) {
2652                if ((rsp[4] == 0xAA) && ((rsp[3] & 0x0f) == 0x01)) {
2653                        hi_cap_flow = true;
2654                        voltage = SUPPORT_VOLTAGE | 0x40000000;
2655                }
2656        }
2657
2658        if (!hi_cap_flow) {
2659                voltage = SUPPORT_VOLTAGE;
2660
2661                retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0,
2662                                             SD_RSP_TYPE_R0, NULL, 0);
2663                if (retval != STATUS_SUCCESS)
2664                        goto status_fail;
2665
2666                wait_timeout(20);
2667        }
2668
2669        do {
2670                retval = sd_send_cmd_get_rsp(chip, APP_CMD, 0, SD_RSP_TYPE_R1,
2671                                             NULL, 0);
2672                if (retval != STATUS_SUCCESS) {
2673                        if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2674                                sd_set_err_code(chip, SD_NO_CARD);
2675                                goto status_fail;
2676                        }
2677
2678                        j++;
2679                        if (j < 3)
2680                                goto RTY_SD_RST;
2681                        else
2682                                goto status_fail;
2683                }
2684
2685                retval = sd_send_cmd_get_rsp(chip, SD_APP_OP_COND, voltage,
2686                                             SD_RSP_TYPE_R3, rsp, 5);
2687                if (retval != STATUS_SUCCESS) {
2688                        k++;
2689                        if (k < 3)
2690                                goto RTY_SD_RST;
2691                        else
2692                                goto status_fail;
2693                }
2694
2695                i++;
2696                wait_timeout(20);
2697        } while (!(rsp[1] & 0x80) && (i < 255));
2698
2699        if (i == 255)
2700                goto status_fail;
2701
2702        if (hi_cap_flow) {
2703                if (rsp[1] & 0x40)
2704                        SET_SD_HCXC(sd_card);
2705                else
2706                        CLR_SD_HCXC(sd_card);
2707
2708                support_1v8 = false;
2709        } else {
2710                CLR_SD_HCXC(sd_card);
2711                support_1v8 = false;
2712        }
2713        dev_dbg(rtsx_dev(chip), "support_1v8 = %d\n", support_1v8);
2714
2715        if (support_1v8) {
2716                retval = sd_voltage_switch(chip);
2717                if (retval != STATUS_SUCCESS)
2718                        goto status_fail;
2719        }
2720
2721        retval = sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2,
2722                                     NULL, 0);
2723        if (retval != STATUS_SUCCESS)
2724                goto status_fail;
2725
2726        for (i = 0; i < 3; i++) {
2727                retval = sd_send_cmd_get_rsp(chip, SEND_RELATIVE_ADDR, 0,
2728                                             SD_RSP_TYPE_R6, rsp, 5);
2729                if (retval != STATUS_SUCCESS)
2730                        goto status_fail;
2731
2732                sd_card->sd_addr = (u32)rsp[1] << 24;
2733                sd_card->sd_addr += (u32)rsp[2] << 16;
2734
2735                if (sd_card->sd_addr)
2736                        break;
2737        }
2738
2739        retval = sd_check_csd(chip, 1);
2740        if (retval != STATUS_SUCCESS)
2741                goto status_fail;
2742
2743        retval = sd_select_card(chip, 1);
2744        if (retval != STATUS_SUCCESS)
2745                goto status_fail;
2746
2747#ifdef SUPPORT_SD_LOCK
2748SD_UNLOCK_ENTRY:
2749        retval = sd_update_lock_status(chip);
2750        if (retval != STATUS_SUCCESS)
2751                goto status_fail;
2752
2753        if (sd_card->sd_lock_status & SD_LOCKED) {
2754                sd_card->sd_lock_status |= (SD_LOCK_1BIT_MODE | SD_PWD_EXIST);
2755                return STATUS_SUCCESS;
2756        } else if (!(sd_card->sd_lock_status & SD_UNLOCK_POW_ON)) {
2757                sd_card->sd_lock_status &= ~SD_PWD_EXIST;
2758        }
2759#endif
2760
2761        retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2762                                     SD_RSP_TYPE_R1, NULL, 0);
2763        if (retval != STATUS_SUCCESS)
2764                goto status_fail;
2765
2766        retval = sd_send_cmd_get_rsp(chip, SET_CLR_CARD_DETECT, 0,
2767                                     SD_RSP_TYPE_R1, NULL, 0);
2768        if (retval != STATUS_SUCCESS)
2769                goto status_fail;
2770
2771        if (support_1v8) {
2772                retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2773                                             SD_RSP_TYPE_R1, NULL, 0);
2774                if (retval != STATUS_SUCCESS)
2775                        goto status_fail;
2776
2777                retval = sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2,
2778                                             SD_RSP_TYPE_R1, NULL, 0);
2779                if (retval != STATUS_SUCCESS)
2780                        goto status_fail;
2781
2782                switch_bus_width = SD_BUS_WIDTH_4;
2783        } else {
2784                switch_bus_width = SD_BUS_WIDTH_1;
2785        }
2786
2787        retval = sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200, SD_RSP_TYPE_R1,
2788                                     NULL, 0);
2789        if (retval != STATUS_SUCCESS)
2790                goto status_fail;
2791
2792        retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
2793        if (retval != STATUS_SUCCESS)
2794                goto status_fail;
2795
2796        if (!(sd_card->raw_csd[4] & 0x40))
2797                sd_dont_switch = true;
2798
2799        if (!sd_dont_switch) {
2800                if (sd20_mode) {
2801                        /* Set sd_switch_fail here, because we needn't
2802                         * switch to UHS mode
2803                         */
2804                        sd_card->sd_switch_fail = SDR104_SUPPORT_MASK |
2805                                DDR50_SUPPORT_MASK | SDR50_SUPPORT_MASK;
2806                }
2807
2808                /* Check the card whether follow SD1.1 spec or higher */
2809                retval = sd_check_spec(chip, switch_bus_width);
2810                if (retval == STATUS_SUCCESS) {
2811                        retval = sd_switch_function(chip, switch_bus_width);
2812                        if (retval != STATUS_SUCCESS) {
2813                                sd_init_power(chip);
2814                                sd_dont_switch = true;
2815                                try_sdio = false;
2816
2817                                goto switch_fail;
2818                        }
2819                } else {
2820                        if (support_1v8) {
2821                                sd_init_power(chip);
2822                                sd_dont_switch = true;
2823                                try_sdio = false;
2824
2825                                goto switch_fail;
2826                        }
2827                }
2828        }
2829
2830        if (!support_1v8) {
2831                retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2832                                             SD_RSP_TYPE_R1, NULL, 0);
2833                if (retval != STATUS_SUCCESS)
2834                        goto status_fail;
2835
2836                retval = sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2,
2837                                             SD_RSP_TYPE_R1, NULL, 0);
2838                if (retval != STATUS_SUCCESS)
2839                        goto status_fail;
2840        }
2841
2842#ifdef SUPPORT_SD_LOCK
2843        sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
2844#endif
2845
2846        if (!sd20_mode && CHK_SD30_SPEED(sd_card)) {
2847                int read_lba0 = 1;
2848
2849                retval = rtsx_write_register(chip, SD30_DRIVE_SEL, 0x07,
2850                                             chip->sd30_drive_sel_1v8);
2851                if (retval) {
2852                        rtsx_trace(chip);
2853                        return retval;
2854                }
2855
2856                retval = sd_set_init_para(chip);
2857                if (retval != STATUS_SUCCESS)
2858                        goto status_fail;
2859
2860                if (CHK_SD_DDR50(sd_card))
2861                        retval = sd_ddr_tuning(chip);
2862                else
2863                        retval = sd_sdr_tuning(chip);
2864
2865                if (retval != STATUS_SUCCESS) {
2866                        if (sd20_mode) {
2867                                goto status_fail;
2868                        } else {
2869                                retval = sd_init_power(chip);
2870                                if (retval != STATUS_SUCCESS)
2871                                        goto status_fail;
2872
2873                                try_sdio = false;
2874                                sd20_mode = true;
2875                                goto switch_fail;
2876                        }
2877                }
2878
2879                sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2880                                    SD_RSP_TYPE_R1, NULL, 0);
2881
2882                if (CHK_SD_DDR50(sd_card)) {
2883                        retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
2884                        if (retval != STATUS_SUCCESS)
2885                                read_lba0 = 0;
2886                }
2887
2888                if (read_lba0) {
2889                        retval = sd_read_lba0(chip);
2890                        if (retval != STATUS_SUCCESS) {
2891                                if (sd20_mode) {
2892                                        goto status_fail;
2893                                } else {
2894                                        retval = sd_init_power(chip);
2895                                        if (retval != STATUS_SUCCESS)
2896                                                goto status_fail;
2897
2898                                        try_sdio = false;
2899                                        sd20_mode = true;
2900                                        goto switch_fail;
2901                                }
2902                        }
2903                }
2904        }
2905
2906        retval = sd_check_wp_state(chip);
2907        if (retval != STATUS_SUCCESS)
2908                goto status_fail;
2909
2910        chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
2911
2912#ifdef SUPPORT_SD_LOCK
2913        if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON) {
2914                retval = rtsx_write_register(chip, REG_SD_BLOCK_CNT_H, 0xFF,
2915                                             0x02);
2916                if (retval) {
2917                        rtsx_trace(chip);
2918                        return retval;
2919                }
2920                retval = rtsx_write_register(chip, REG_SD_BLOCK_CNT_L, 0xFF,
2921                                             0x00);
2922                if (retval) {
2923                        rtsx_trace(chip);
2924                        return retval;
2925                }
2926        }
2927#endif
2928
2929        return STATUS_SUCCESS;
2930
2931status_fail:
2932        rtsx_trace(chip);
2933        return STATUS_FAIL;
2934}
2935
2936static int mmc_test_switch_bus(struct rtsx_chip *chip, u8 width)
2937{
2938        struct sd_info *sd_card = &chip->sd_card;
2939        int retval;
2940        u8 buf[8] = {0}, bus_width, *ptr;
2941        u16 byte_cnt;
2942        int len;
2943
2944        retval = sd_send_cmd_get_rsp(chip, BUSTEST_W, 0, SD_RSP_TYPE_R1, NULL,
2945                                     0);
2946        if (retval != STATUS_SUCCESS) {
2947                rtsx_trace(chip);
2948                return SWITCH_FAIL;
2949        }
2950
2951        if (width == MMC_8BIT_BUS) {
2952                buf[0] = 0x55;
2953                buf[1] = 0xAA;
2954                len = 8;
2955                byte_cnt = 8;
2956                bus_width = SD_BUS_WIDTH_8;
2957        } else {
2958                buf[0] = 0x5A;
2959                len = 4;
2960                byte_cnt = 4;
2961                bus_width = SD_BUS_WIDTH_4;
2962        }
2963
2964        retval = rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0x02);
2965        if (retval != STATUS_SUCCESS) {
2966                rtsx_trace(chip);
2967                return SWITCH_ERR;
2968        }
2969
2970        retval = sd_write_data(chip, SD_TM_AUTO_WRITE_3, NULL, 0, byte_cnt, 1,
2971                               bus_width, buf, len, 100);
2972        if (retval != STATUS_SUCCESS) {
2973                rtsx_clear_sd_error(chip);
2974                rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0);
2975                rtsx_trace(chip);
2976                return SWITCH_ERR;
2977        }
2978
2979        retval = rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0);
2980        if (retval != STATUS_SUCCESS) {
2981                rtsx_trace(chip);
2982                return SWITCH_ERR;
2983        }
2984
2985        dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d\n", BUSTEST_R);
2986
2987        rtsx_init_cmd(chip);
2988
2989        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | BUSTEST_R);
2990
2991        if (width == MMC_8BIT_BUS)
2992                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L,
2993                             0xFF, 0x08);
2994        else
2995                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L,
2996                             0xFF, 0x04);
2997
2998        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, 1);
2999        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, 0);
3000
3001        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, SD_CALCULATE_CRC7 |
3002                     SD_NO_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
3003                     SD_CHECK_CRC7 | SD_RSP_LEN_6);
3004        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
3005                     PINGPONG_BUFFER);
3006        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3007                     SD_TM_NORMAL_READ | SD_TRANSFER_START);
3008        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END,
3009                     SD_TRANSFER_END);
3010
3011        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2, 0, 0);
3012        if (width == MMC_8BIT_BUS)
3013                rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 1, 0, 0);
3014
3015        retval = rtsx_send_cmd(chip, SD_CARD, 100);
3016        if (retval < 0) {
3017                rtsx_clear_sd_error(chip);
3018                rtsx_trace(chip);
3019                return SWITCH_ERR;
3020        }
3021
3022        ptr = rtsx_get_cmd_data(chip) + 1;
3023
3024        if (width == MMC_8BIT_BUS) {
3025                dev_dbg(rtsx_dev(chip), "BUSTEST_R [8bits]: 0x%02x 0x%02x\n",
3026                        ptr[0], ptr[1]);
3027                if ((ptr[0] == 0xAA) && (ptr[1] == 0x55)) {
3028                        u8 rsp[5];
3029                        u32 arg;
3030
3031                        if (CHK_MMC_DDR52(sd_card))
3032                                arg = 0x03B70600;
3033                        else
3034                                arg = 0x03B70200;
3035
3036                        retval = sd_send_cmd_get_rsp(chip, SWITCH, arg,
3037                                                     SD_RSP_TYPE_R1b, rsp, 5);
3038                        if ((retval == STATUS_SUCCESS) &&
3039                            !(rsp[4] & MMC_SWITCH_ERR))
3040                                return SWITCH_SUCCESS;
3041                }
3042        } else {
3043                dev_dbg(rtsx_dev(chip), "BUSTEST_R [4bits]: 0x%02x\n", ptr[0]);
3044                if (ptr[0] == 0xA5) {
3045                        u8 rsp[5];
3046                        u32 arg;
3047
3048                        if (CHK_MMC_DDR52(sd_card))
3049                                arg = 0x03B70500;
3050                        else
3051                                arg = 0x03B70100;
3052
3053                        retval = sd_send_cmd_get_rsp(chip, SWITCH, arg,
3054                                                     SD_RSP_TYPE_R1b, rsp, 5);
3055                        if ((retval == STATUS_SUCCESS) &&
3056                            !(rsp[4] & MMC_SWITCH_ERR))
3057                                return SWITCH_SUCCESS;
3058                }
3059        }
3060
3061        rtsx_trace(chip);
3062        return SWITCH_FAIL;
3063}
3064
3065static int mmc_switch_timing_bus(struct rtsx_chip *chip, bool switch_ddr)
3066{
3067        struct sd_info *sd_card = &chip->sd_card;
3068        int retval;
3069        u8 *ptr, card_type, card_type_mask = 0;
3070
3071        CLR_MMC_HS(sd_card);
3072
3073        dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d\n", SEND_EXT_CSD);
3074
3075        rtsx_init_cmd(chip);
3076
3077        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF,
3078                     0x40 | SEND_EXT_CSD);
3079        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, 0);
3080        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, 0);
3081        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, 0);
3082        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, 0);
3083
3084        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0);
3085        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 2);
3086        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, 1);
3087        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, 0);
3088
3089        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
3090                     SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
3091                     SD_CHECK_CRC7 | SD_RSP_LEN_6);
3092        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
3093                     PINGPONG_BUFFER);
3094        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3095                     SD_TM_NORMAL_READ | SD_TRANSFER_START);
3096        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END,
3097                     SD_TRANSFER_END);
3098
3099        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 196, 0xFF, 0);
3100        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 212, 0xFF, 0);
3101        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 213, 0xFF, 0);
3102        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 214, 0xFF, 0);
3103        rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 215, 0xFF, 0);
3104
3105        retval = rtsx_send_cmd(chip, SD_CARD, 1000);
3106        if (retval < 0) {
3107                if (retval == -ETIMEDOUT) {
3108                        rtsx_clear_sd_error(chip);
3109                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
3110                                            SD_RSP_TYPE_R1, NULL, 0);
3111                }
3112                rtsx_trace(chip);
3113                return STATUS_FAIL;
3114        }
3115
3116        ptr = rtsx_get_cmd_data(chip);
3117        if (ptr[0] & SD_TRANSFER_ERR) {
3118                sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
3119                                    SD_RSP_TYPE_R1, NULL, 0);
3120                rtsx_trace(chip);
3121                return STATUS_FAIL;
3122        }
3123
3124        if (CHK_MMC_SECTOR_MODE(sd_card)) {
3125                sd_card->capacity = ((u32)ptr[5] << 24) | ((u32)ptr[4] << 16) |
3126                        ((u32)ptr[3] << 8) | ((u32)ptr[2]);
3127        }
3128
3129        card_type_mask = 0x03;
3130        card_type = ptr[1] & card_type_mask;
3131        if (card_type) {
3132                u8 rsp[5];
3133
3134                if (card_type & 0x04) {
3135                        if (switch_ddr)
3136                                SET_MMC_DDR52(sd_card);
3137                        else
3138                                SET_MMC_52M(sd_card);
3139                } else if (card_type & 0x02) {
3140                        SET_MMC_52M(sd_card);
3141                } else {
3142                        SET_MMC_26M(sd_card);
3143                }
3144
3145                retval = sd_send_cmd_get_rsp(chip, SWITCH, 0x03B90100,
3146                                             SD_RSP_TYPE_R1b, rsp, 5);
3147                if ((retval != STATUS_SUCCESS) || (rsp[4] & MMC_SWITCH_ERR))
3148                        CLR_MMC_HS(sd_card);
3149        }
3150
3151        sd_choose_proper_clock(chip);
3152        retval = switch_clock(chip, sd_card->sd_clock);
3153        if (retval != STATUS_SUCCESS) {
3154                rtsx_trace(chip);
3155                return STATUS_FAIL;
3156        }
3157
3158        /* Test Bus Procedure */
3159        retval = mmc_test_switch_bus(chip, MMC_8BIT_BUS);
3160        if (retval == SWITCH_SUCCESS) {
3161                SET_MMC_8BIT(sd_card);
3162                chip->card_bus_width[chip->card2lun[SD_CARD]] = 8;
3163#ifdef SUPPORT_SD_LOCK
3164                sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
3165#endif
3166        } else if (retval == SWITCH_FAIL) {
3167                retval = mmc_test_switch_bus(chip, MMC_4BIT_BUS);
3168                if (retval == SWITCH_SUCCESS) {
3169                        SET_MMC_4BIT(sd_card);
3170                        chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
3171#ifdef SUPPORT_SD_LOCK
3172                        sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
3173#endif
3174                } else if (retval == SWITCH_FAIL) {
3175                        CLR_MMC_8BIT(sd_card);
3176                        CLR_MMC_4BIT(sd_card);
3177                } else {
3178                        rtsx_trace(chip);
3179                        return STATUS_FAIL;
3180                }
3181        } else {
3182                rtsx_trace(chip);
3183                return STATUS_FAIL;
3184        }
3185
3186        return STATUS_SUCCESS;
3187}
3188
3189static int reset_mmc(struct rtsx_chip *chip)
3190{
3191        struct sd_info *sd_card = &chip->sd_card;
3192        int retval, i = 0, j = 0, k = 0;
3193        bool switch_ddr = true;
3194        u8 rsp[16];
3195        u8 spec_ver = 0;
3196        u32 temp;
3197
3198#ifdef SUPPORT_SD_LOCK
3199        if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON)
3200                goto MMC_UNLOCK_ENTRY;
3201#endif
3202
3203switch_fail:
3204        retval = sd_prepare_reset(chip);
3205        if (retval != STATUS_SUCCESS) {
3206                rtsx_trace(chip);
3207                return retval;
3208        }
3209
3210        SET_MMC(sd_card);
3211
3212RTY_MMC_RST:
3213        retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0,
3214                                     NULL, 0);
3215        if (retval != STATUS_SUCCESS) {
3216                rtsx_trace(chip);
3217                return STATUS_FAIL;
3218        }
3219
3220        do {
3221                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3222                        sd_set_err_code(chip, SD_NO_CARD);
3223                        rtsx_trace(chip);
3224                        return STATUS_FAIL;
3225                }
3226
3227                retval = sd_send_cmd_get_rsp(chip, SEND_OP_COND,
3228                                             (SUPPORT_VOLTAGE | 0x40000000),
3229                                             SD_RSP_TYPE_R3, rsp, 5);
3230                if (retval != STATUS_SUCCESS) {
3231                        if (sd_check_err_code(chip, SD_BUSY) ||
3232                            sd_check_err_code(chip, SD_TO_ERR)) {
3233                                k++;
3234                                if (k < 20) {
3235                                        sd_clr_err_code(chip);
3236                                        goto RTY_MMC_RST;
3237                                } else {
3238                                        rtsx_trace(chip);
3239                                        return STATUS_FAIL;
3240                                }
3241                        } else {
3242                                j++;
3243                                if (j < 100) {
3244                                        sd_clr_err_code(chip);
3245                                        goto RTY_MMC_RST;
3246                                } else {
3247                                        rtsx_trace(chip);
3248                                        return STATUS_FAIL;
3249                                }
3250                        }
3251                }
3252
3253                wait_timeout(20);
3254                i++;
3255        } while (!(rsp[1] & 0x80) && (i < 255));
3256
3257        if (i == 255) {
3258                rtsx_trace(chip);
3259                return STATUS_FAIL;
3260        }
3261
3262        if ((rsp[1] & 0x60) == 0x40)
3263                SET_MMC_SECTOR_MODE(sd_card);
3264        else
3265                CLR_MMC_SECTOR_MODE(sd_card);
3266
3267        retval = sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2,
3268                                     NULL, 0);
3269        if (retval != STATUS_SUCCESS) {
3270                rtsx_trace(chip);
3271                return STATUS_FAIL;
3272        }
3273
3274        sd_card->sd_addr = 0x00100000;
3275        retval = sd_send_cmd_get_rsp(chip, SET_RELATIVE_ADDR, sd_card->sd_addr,
3276                                     SD_RSP_TYPE_R6, rsp, 5);
3277        if (retval != STATUS_SUCCESS) {
3278                rtsx_trace(chip);
3279                return STATUS_FAIL;
3280        }
3281
3282        retval = sd_check_csd(chip, 1);
3283        if (retval != STATUS_SUCCESS) {
3284                rtsx_trace(chip);
3285                return STATUS_FAIL;
3286        }
3287
3288        spec_ver = (sd_card->raw_csd[0] & 0x3C) >> 2;
3289
3290        retval = sd_select_card(chip, 1);
3291        if (retval != STATUS_SUCCESS) {
3292                rtsx_trace(chip);
3293                return STATUS_FAIL;
3294        }
3295
3296        retval = sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200, SD_RSP_TYPE_R1,
3297                                     NULL, 0);
3298        if (retval != STATUS_SUCCESS) {
3299                rtsx_trace(chip);
3300                return STATUS_FAIL;
3301        }
3302
3303#ifdef SUPPORT_SD_LOCK
3304MMC_UNLOCK_ENTRY:
3305        retval = sd_update_lock_status(chip);
3306        if (retval != STATUS_SUCCESS) {
3307                rtsx_trace(chip);
3308                return STATUS_FAIL;
3309        }
3310#endif
3311
3312        retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
3313        if (retval != STATUS_SUCCESS) {
3314                rtsx_trace(chip);
3315                return STATUS_FAIL;
3316        }
3317
3318        chip->card_bus_width[chip->card2lun[SD_CARD]] = 1;
3319
3320        if (!sd_card->mmc_dont_switch_bus) {
3321                if (spec_ver == 4) {
3322                        /* MMC 4.x Cards */
3323                        retval = mmc_switch_timing_bus(chip, switch_ddr);
3324                        if (retval != STATUS_SUCCESS) {
3325                                retval = sd_init_power(chip);
3326                                if (retval != STATUS_SUCCESS) {
3327                                        rtsx_trace(chip);
3328                                        return STATUS_FAIL;
3329                                }
3330                                sd_card->mmc_dont_switch_bus = 1;
3331                                rtsx_trace(chip);
3332                                goto switch_fail;
3333                        }
3334                }
3335
3336                if (CHK_MMC_SECTOR_MODE(sd_card) && (sd_card->capacity == 0)) {
3337                        rtsx_trace(chip);
3338                        return STATUS_FAIL;
3339                }
3340
3341                if (switch_ddr && CHK_MMC_DDR52(sd_card)) {
3342                        retval = sd_set_init_para(chip);
3343                        if (retval != STATUS_SUCCESS) {
3344                                rtsx_trace(chip);
3345                                return STATUS_FAIL;
3346                        }
3347
3348                        retval = mmc_ddr_tuning(chip);
3349                        if (retval != STATUS_SUCCESS) {
3350                                retval = sd_init_power(chip);
3351                                if (retval != STATUS_SUCCESS) {
3352                                        rtsx_trace(chip);
3353                                        return STATUS_FAIL;
3354                                }
3355
3356                                switch_ddr = false;
3357                                rtsx_trace(chip);
3358                                goto switch_fail;
3359                        }
3360
3361                        retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
3362                        if (retval == STATUS_SUCCESS) {
3363                                retval = sd_read_lba0(chip);
3364                                if (retval != STATUS_SUCCESS) {
3365                                        retval = sd_init_power(chip);
3366                                        if (retval != STATUS_SUCCESS) {
3367                                                rtsx_trace(chip);
3368                                                return STATUS_FAIL;
3369                                        }
3370
3371                                        switch_ddr = false;
3372                                        rtsx_trace(chip);
3373                                        goto switch_fail;
3374                                }
3375                        }
3376                }
3377        }
3378
3379#ifdef SUPPORT_SD_LOCK
3380        if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON) {
3381                retval = rtsx_write_register(chip, REG_SD_BLOCK_CNT_H, 0xFF,
3382                                             0x02);
3383                if (retval) {
3384                        rtsx_trace(chip);
3385                        return retval;
3386                }
3387                retval = rtsx_write_register(chip, REG_SD_BLOCK_CNT_L, 0xFF,
3388                                             0x00);
3389                if (retval) {
3390                        rtsx_trace(chip);
3391                        return retval;
3392                }
3393        }
3394#endif
3395
3396        temp = rtsx_readl(chip, RTSX_BIPR);
3397        if (temp & SD_WRITE_PROTECT)
3398                chip->card_wp |= SD_CARD;
3399
3400        return STATUS_SUCCESS;
3401}
3402
3403int reset_sd_card(struct rtsx_chip *chip)
3404{
3405        struct sd_info *sd_card = &chip->sd_card;
3406        int retval;
3407
3408        sd_init_reg_addr(chip);
3409
3410        memset(sd_card, 0, sizeof(struct sd_info));
3411        chip->capacity[chip->card2lun[SD_CARD]] = 0;
3412
3413        retval = enable_card_clock(chip, SD_CARD);
3414        if (retval != STATUS_SUCCESS) {
3415                rtsx_trace(chip);
3416                return STATUS_FAIL;
3417        }
3418
3419        if (chip->ignore_sd && CHK_SDIO_EXIST(chip) &&
3420            !CHK_SDIO_IGNORED(chip)) {
3421                if (chip->asic_code) {
3422                        retval = sd_pull_ctl_enable(chip);
3423                        if (retval != STATUS_SUCCESS) {
3424                                rtsx_trace(chip);
3425                                return STATUS_FAIL;
3426                        }
3427                } else {
3428                        retval = rtsx_write_register(chip, FPGA_PULL_CTL,
3429                                                     FPGA_SD_PULL_CTL_BIT |
3430                                                     0x20, 0);
3431                        if (retval != STATUS_SUCCESS) {
3432                                rtsx_trace(chip);
3433                                return STATUS_FAIL;
3434                        }
3435                }
3436                retval = card_share_mode(chip, SD_CARD);
3437                if (retval != STATUS_SUCCESS) {
3438                        rtsx_trace(chip);
3439                        return STATUS_FAIL;
3440                }
3441
3442                chip->sd_io = 1;
3443                rtsx_trace(chip);
3444                return STATUS_FAIL;
3445        }
3446
3447        retval = sd_init_power(chip);
3448        if (retval != STATUS_SUCCESS) {
3449                rtsx_trace(chip);
3450                return STATUS_FAIL;
3451        }
3452
3453        if (chip->sd_ctl & RESET_MMC_FIRST) {
3454                retval = reset_mmc(chip);
3455                if (retval != STATUS_SUCCESS) {
3456                        if (sd_check_err_code(chip, SD_NO_CARD)) {
3457                                rtsx_trace(chip);
3458                                return STATUS_FAIL;
3459                        }
3460
3461                        retval = reset_sd(chip);
3462                        if (retval != STATUS_SUCCESS) {
3463                                rtsx_trace(chip);
3464                                return STATUS_FAIL;
3465                        }
3466                }
3467        } else {
3468                retval = reset_sd(chip);
3469                if (retval != STATUS_SUCCESS) {
3470                        if (sd_check_err_code(chip, SD_NO_CARD)) {
3471                                rtsx_trace(chip);
3472                                return STATUS_FAIL;
3473                        }
3474
3475                        if (chip->sd_io) {
3476                                rtsx_trace(chip);
3477                                return STATUS_FAIL;
3478                        }
3479                        retval = reset_mmc(chip);
3480                        if (retval != STATUS_SUCCESS) {
3481                                rtsx_trace(chip);
3482                                return STATUS_FAIL;
3483                        }
3484                }
3485        }
3486
3487        retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
3488        if (retval != STATUS_SUCCESS) {
3489                rtsx_trace(chip);
3490                return STATUS_FAIL;
3491        }
3492
3493        retval = rtsx_write_register(chip, REG_SD_BYTE_CNT_L, 0xFF, 0);
3494        if (retval) {
3495                rtsx_trace(chip);
3496                return retval;
3497        }
3498        retval = rtsx_write_register(chip, REG_SD_BYTE_CNT_H, 0xFF, 2);
3499        if (retval) {
3500                rtsx_trace(chip);
3501                return retval;
3502        }
3503
3504        chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity;
3505
3506        retval = sd_set_init_para(chip);
3507        if (retval != STATUS_SUCCESS) {
3508                rtsx_trace(chip);
3509                return STATUS_FAIL;
3510        }
3511
3512        dev_dbg(rtsx_dev(chip), "sd_card->sd_type = 0x%x\n", sd_card->sd_type);
3513
3514        return STATUS_SUCCESS;
3515}
3516
3517static int reset_mmc_only(struct rtsx_chip *chip)
3518{
3519        struct sd_info *sd_card = &chip->sd_card;
3520        int retval;
3521
3522        sd_card->sd_type = 0;
3523        sd_card->seq_mode = 0;
3524        sd_card->sd_data_buf_ready = 0;
3525        sd_card->capacity = 0;
3526        sd_card->sd_switch_fail = 0;
3527
3528#ifdef SUPPORT_SD_LOCK
3529        sd_card->sd_lock_status = 0;
3530        sd_card->sd_erase_status = 0;
3531#endif
3532
3533        chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity = 0;
3534
3535        retval = enable_card_clock(chip, SD_CARD);
3536        if (retval != STATUS_SUCCESS) {
3537                rtsx_trace(chip);
3538                return STATUS_FAIL;
3539        }
3540
3541        retval = sd_init_power(chip);
3542        if (retval != STATUS_SUCCESS) {
3543                rtsx_trace(chip);
3544                return STATUS_FAIL;
3545        }
3546
3547        retval = reset_mmc(chip);
3548        if (retval != STATUS_SUCCESS) {
3549                rtsx_trace(chip);
3550                return STATUS_FAIL;
3551        }
3552
3553        retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
3554        if (retval != STATUS_SUCCESS) {
3555                rtsx_trace(chip);
3556                return STATUS_FAIL;
3557        }
3558
3559        retval = rtsx_write_register(chip, REG_SD_BYTE_CNT_L, 0xFF, 0);
3560        if (retval) {
3561                rtsx_trace(chip);
3562                return retval;
3563        }
3564        retval = rtsx_write_register(chip, REG_SD_BYTE_CNT_H, 0xFF, 2);
3565        if (retval) {
3566                rtsx_trace(chip);
3567                return retval;
3568        }
3569
3570        chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity;
3571
3572        retval = sd_set_init_para(chip);
3573        if (retval != STATUS_SUCCESS) {
3574                rtsx_trace(chip);
3575                return STATUS_FAIL;
3576        }
3577
3578        dev_dbg(rtsx_dev(chip), "In %s, sd_card->sd_type = 0x%x\n",
3579                __func__, sd_card->sd_type);
3580
3581        return STATUS_SUCCESS;
3582}
3583
3584#define WAIT_DATA_READY_RTY_CNT         255
3585
3586static int wait_data_buf_ready(struct rtsx_chip *chip)
3587{
3588        struct sd_info *sd_card = &chip->sd_card;
3589        int i, retval;
3590
3591        for (i = 0; i < WAIT_DATA_READY_RTY_CNT; i++) {
3592                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3593                        sd_set_err_code(chip, SD_NO_CARD);
3594                        rtsx_trace(chip);
3595                        return STATUS_FAIL;
3596                }
3597
3598                sd_card->sd_data_buf_ready = 0;
3599
3600                retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
3601                                             sd_card->sd_addr, SD_RSP_TYPE_R1,
3602                                             NULL, 0);
3603                if (retval != STATUS_SUCCESS) {
3604                        rtsx_trace(chip);
3605                        return STATUS_FAIL;
3606                }
3607
3608                if (sd_card->sd_data_buf_ready) {
3609                        return sd_send_cmd_get_rsp(chip, SEND_STATUS,
3610                                sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
3611                }
3612        }
3613
3614        sd_set_err_code(chip, SD_TO_ERR);
3615
3616        rtsx_trace(chip);
3617        return STATUS_FAIL;
3618}
3619
3620void sd_stop_seq_mode(struct rtsx_chip *chip)
3621{
3622        struct sd_info *sd_card = &chip->sd_card;
3623        int retval;
3624
3625        if (sd_card->seq_mode) {
3626                retval = sd_switch_clock(chip);
3627                if (retval != STATUS_SUCCESS)
3628                        return;
3629
3630                retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
3631                                             SD_RSP_TYPE_R1b, NULL, 0);
3632                if (retval != STATUS_SUCCESS)
3633                        sd_set_err_code(chip, SD_STS_ERR);
3634
3635                retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
3636                if (retval != STATUS_SUCCESS)
3637                        sd_set_err_code(chip, SD_STS_ERR);
3638
3639                sd_card->seq_mode = 0;
3640
3641                rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
3642        }
3643}
3644
3645static inline int sd_auto_tune_clock(struct rtsx_chip *chip)
3646{
3647        struct sd_info *sd_card = &chip->sd_card;
3648        int retval;
3649
3650        if (chip->asic_code) {
3651                if (sd_card->sd_clock > 30)
3652                        sd_card->sd_clock -= 20;
3653        } else {
3654                switch (sd_card->sd_clock) {
3655                case CLK_200:
3656                        sd_card->sd_clock = CLK_150;
3657                        break;
3658
3659                case CLK_150:
3660                        sd_card->sd_clock = CLK_120;
3661                        break;
3662
3663                case CLK_120:
3664                        sd_card->sd_clock = CLK_100;
3665                        break;
3666
3667                case CLK_100:
3668                        sd_card->sd_clock = CLK_80;
3669                        break;
3670
3671                case CLK_80:
3672                        sd_card->sd_clock = CLK_60;
3673                        break;
3674
3675                case CLK_60:
3676                        sd_card->sd_clock = CLK_50;
3677                        break;
3678
3679                default:
3680                        break;
3681                }
3682        }
3683
3684        retval = sd_switch_clock(chip);
3685        if (retval != STATUS_SUCCESS) {
3686                rtsx_trace(chip);
3687                return STATUS_FAIL;
3688        }
3689
3690        return STATUS_SUCCESS;
3691}
3692
3693int sd_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip, u32 start_sector,
3694          u16 sector_cnt)
3695{
3696        struct sd_info *sd_card = &chip->sd_card;
3697        u32 data_addr;
3698        u8 cfg2;
3699        int retval;
3700
3701        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3702                dev_dbg(rtsx_dev(chip), "%s: Read %d %s from 0x%x\n", __func__,
3703                        sector_cnt, (sector_cnt > 1) ? "sectors" : "sector",
3704                        start_sector);
3705        } else {
3706                dev_dbg(rtsx_dev(chip), "%s: Write %d %s to 0x%x\n", __func__,
3707                        sector_cnt, (sector_cnt > 1) ? "sectors" : "sector",
3708                        start_sector);
3709        }
3710
3711        sd_card->cleanup_counter = 0;
3712
3713        if (!(chip->card_ready & SD_CARD)) {
3714                sd_card->seq_mode = 0;
3715
3716                retval = reset_sd_card(chip);
3717                if (retval == STATUS_SUCCESS) {
3718                        chip->card_ready |= SD_CARD;
3719                        chip->card_fail &= ~SD_CARD;
3720                } else {
3721                        chip->card_ready &= ~SD_CARD;
3722                        chip->card_fail |= SD_CARD;
3723                        chip->capacity[chip->card2lun[SD_CARD]] = 0;
3724                        chip->rw_need_retry = 1;
3725                        rtsx_trace(chip);
3726                        return STATUS_FAIL;
3727                }
3728        }
3729
3730        if (!CHK_SD_HCXC(sd_card) && !CHK_MMC_SECTOR_MODE(sd_card))
3731                data_addr = start_sector << 9;
3732        else
3733                data_addr = start_sector;
3734
3735        sd_clr_err_code(chip);
3736
3737        retval = sd_switch_clock(chip);
3738        if (retval != STATUS_SUCCESS) {
3739                sd_set_err_code(chip, SD_IO_ERR);
3740                rtsx_trace(chip);
3741                goto RW_FAIL;
3742        }
3743
3744        if (sd_card->seq_mode &&
3745            ((sd_card->pre_dir != srb->sc_data_direction) ||
3746            ((sd_card->pre_sec_addr + sd_card->pre_sec_cnt) !=
3747            start_sector))) {
3748                if ((sd_card->pre_sec_cnt < 0x80) &&
3749                    (sd_card->pre_dir == DMA_FROM_DEVICE) &&
3750                    !CHK_SD30_SPEED(sd_card) &&
3751                    !CHK_SD_HS(sd_card) &&
3752                    !CHK_MMC_HS(sd_card)) {
3753                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
3754                                            SD_RSP_TYPE_R1, NULL, 0);
3755                }
3756
3757                retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
3758                                             SD_RSP_TYPE_R1b, NULL, 0);
3759                if (retval != STATUS_SUCCESS) {
3760                        chip->rw_need_retry = 1;
3761                        sd_set_err_code(chip, SD_STS_ERR);
3762                        rtsx_trace(chip);
3763                        goto RW_FAIL;
3764                }
3765
3766                sd_card->seq_mode = 0;
3767
3768                retval = rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
3769                if (retval != STATUS_SUCCESS) {
3770                        sd_set_err_code(chip, SD_IO_ERR);
3771                        rtsx_trace(chip);
3772                        goto RW_FAIL;
3773                }
3774
3775                if ((sd_card->pre_sec_cnt < 0x80) &&
3776                    !CHK_SD30_SPEED(sd_card) &&
3777                    !CHK_SD_HS(sd_card) &&
3778                    !CHK_MMC_HS(sd_card)) {
3779                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
3780                                            SD_RSP_TYPE_R1, NULL, 0);
3781                }
3782        }
3783
3784        rtsx_init_cmd(chip);
3785
3786        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x00);
3787        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 0x02);
3788        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF,
3789                     (u8)sector_cnt);
3790        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF,
3791                     (u8)(sector_cnt >> 8));
3792
3793        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
3794
3795        if (CHK_MMC_8BIT(sd_card))
3796                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1,
3797                             0x03, SD_BUS_WIDTH_8);
3798        else if (CHK_MMC_4BIT(sd_card) || CHK_SD(sd_card))
3799                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1,
3800                             0x03, SD_BUS_WIDTH_4);
3801        else
3802                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1,
3803                             0x03, SD_BUS_WIDTH_1);
3804
3805        if (sd_card->seq_mode) {
3806                cfg2 = SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3807                        SD_NO_WAIT_BUSY_END | SD_NO_CHECK_CRC7 |
3808                        SD_RSP_LEN_0;
3809                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, cfg2);
3810
3811                trans_dma_enable(srb->sc_data_direction, chip, sector_cnt * 512,
3812                                 DMA_512);
3813
3814                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3815                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3816                                     SD_TM_AUTO_READ_3 | SD_TRANSFER_START);
3817                } else {
3818                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3819                                     SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3820                }
3821
3822                rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
3823                             SD_TRANSFER_END, SD_TRANSFER_END);
3824
3825                rtsx_send_cmd_no_wait(chip);
3826        } else {
3827                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3828                        dev_dbg(rtsx_dev(chip), "SD/MMC CMD %d\n",
3829                                READ_MULTIPLE_BLOCK);
3830                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF,
3831                                     0x40 | READ_MULTIPLE_BLOCK);
3832                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF,
3833                                     (u8)(data_addr >> 24));
3834                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF,
3835                                     (u8)(data_addr >> 16));
3836                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF,
3837                                     (u8)(data_addr >> 8));
3838                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF,
3839                                     (u8)data_addr);
3840
3841                        cfg2 = SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3842                                SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 |
3843                                SD_RSP_LEN_6;
3844                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
3845                                     cfg2);
3846
3847                        trans_dma_enable(srb->sc_data_direction, chip,
3848                                         sector_cnt * 512, DMA_512);
3849
3850                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3851                                     SD_TM_AUTO_READ_2 | SD_TRANSFER_START);
3852                        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
3853                                     SD_TRANSFER_END, SD_TRANSFER_END);
3854
3855                        rtsx_send_cmd_no_wait(chip);
3856                } else {
3857                        retval = rtsx_send_cmd(chip, SD_CARD, 50);
3858                        if (retval < 0) {
3859                                rtsx_clear_sd_error(chip);
3860
3861                                chip->rw_need_retry = 1;
3862                                sd_set_err_code(chip, SD_TO_ERR);
3863                                rtsx_trace(chip);
3864                                goto RW_FAIL;
3865                        }
3866
3867                        retval = wait_data_buf_ready(chip);
3868                        if (retval != STATUS_SUCCESS) {
3869                                chip->rw_need_retry = 1;
3870                                sd_set_err_code(chip, SD_TO_ERR);
3871                                rtsx_trace(chip);
3872                                goto RW_FAIL;
3873                        }
3874
3875                        retval = sd_send_cmd_get_rsp(chip, WRITE_MULTIPLE_BLOCK,
3876                                                     data_addr, SD_RSP_TYPE_R1,
3877                                                     NULL, 0);
3878                        if (retval != STATUS_SUCCESS) {
3879                                chip->rw_need_retry = 1;
3880                                rtsx_trace(chip);
3881                                goto RW_FAIL;
3882                        }
3883
3884                        rtsx_init_cmd(chip);
3885
3886                        cfg2 = SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3887                                SD_NO_WAIT_BUSY_END |
3888                                SD_NO_CHECK_CRC7 | SD_RSP_LEN_0;
3889                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
3890                                     cfg2);
3891
3892                        trans_dma_enable(srb->sc_data_direction, chip,
3893                                         sector_cnt * 512, DMA_512);
3894
3895                        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3896                                     SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3897                        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
3898                                     SD_TRANSFER_END, SD_TRANSFER_END);
3899
3900                        rtsx_send_cmd_no_wait(chip);
3901                }
3902
3903                sd_card->seq_mode = 1;
3904        }
3905
3906        retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb),
3907                                    scsi_bufflen(srb), scsi_sg_count(srb),
3908                                srb->sc_data_direction, chip->sd_timeout);
3909        if (retval < 0) {
3910                u8 stat = 0;
3911                int err;
3912
3913                sd_card->seq_mode = 0;
3914
3915                if (retval == -ETIMEDOUT)
3916                        err = STATUS_TIMEDOUT;
3917                else
3918                        err = STATUS_FAIL;
3919
3920                rtsx_read_register(chip, REG_SD_STAT1, &stat);
3921                rtsx_clear_sd_error(chip);
3922                if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3923                        chip->rw_need_retry = 0;
3924                        dev_dbg(rtsx_dev(chip), "No card exist, exit %s\n",
3925                                __func__);
3926                        rtsx_trace(chip);
3927                        return STATUS_FAIL;
3928                }
3929
3930                chip->rw_need_retry = 1;
3931
3932                retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
3933                                             SD_RSP_TYPE_R1b, NULL, 0);
3934                if (retval != STATUS_SUCCESS) {
3935                        sd_set_err_code(chip, SD_STS_ERR);
3936                        rtsx_trace(chip);
3937                        goto RW_FAIL;
3938                }
3939
3940                if (stat & (SD_CRC7_ERR | SD_CRC16_ERR | SD_CRC_WRITE_ERR)) {
3941                        dev_dbg(rtsx_dev(chip), "SD CRC error, tune clock!\n");
3942                        sd_set_err_code(chip, SD_CRC_ERR);
3943                        rtsx_trace(chip);
3944                        goto RW_FAIL;
3945                }
3946
3947                if (err == STATUS_TIMEDOUT) {
3948                        sd_set_err_code(chip, SD_TO_ERR);
3949                        rtsx_trace(chip);
3950                        goto RW_FAIL;
3951                }
3952
3953                rtsx_trace(chip);
3954                return err;
3955        }
3956
3957        sd_card->pre_sec_addr = start_sector;
3958        sd_card->pre_sec_cnt = sector_cnt;
3959        sd_card->pre_dir = srb->sc_data_direction;
3960
3961        return STATUS_SUCCESS;
3962
3963RW_FAIL:
3964        sd_card->seq_mode = 0;
3965
3966        if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3967                chip->rw_need_retry = 0;
3968                dev_dbg(rtsx_dev(chip), "No card exist, exit %s\n", __func__);
3969                rtsx_trace(chip);
3970                return STATUS_FAIL;
3971        }
3972
3973        if (sd_check_err_code(chip, SD_CRC_ERR)) {
3974                if (CHK_MMC_4BIT(sd_card) || CHK_MMC_8BIT(sd_card)) {
3975                        sd_card->mmc_dont_switch_bus = 1;
3976                        reset_mmc_only(chip);
3977                        sd_card->mmc_dont_switch_bus = 0;
3978                } else {
3979                        sd_card->need_retune = 1;
3980                        sd_auto_tune_clock(chip);
3981                }
3982        } else if (sd_check_err_code(chip, SD_TO_ERR | SD_STS_ERR)) {
3983                retval = reset_sd_card(chip);
3984                if (retval != STATUS_SUCCESS) {
3985                        chip->card_ready &= ~SD_CARD;
3986                        chip->card_fail |= SD_CARD;
3987                        chip->capacity[chip->card2lun[SD_CARD]] = 0;
3988                }
3989        }
3990
3991        rtsx_trace(chip);
3992        return STATUS_FAIL;
3993}
3994
3995#ifdef SUPPORT_CPRM
3996int soft_reset_sd_card(struct rtsx_chip *chip)
3997{
3998        return reset_sd(chip);
3999}
4000
4001int ext_sd_send_cmd_get_rsp(struct rtsx_chip *chip, u8 cmd_idx, u32 arg,
4002                            u8 rsp_type, u8 *rsp, int rsp_len,
4003                            bool special_check)
4004{
4005        int retval;
4006        int timeout = 100;
4007        u16 reg_addr;
4008        u8 *ptr;
4009        int stat_idx = 0;
4010        int rty_cnt = 0;
4011
4012        dev_dbg(rtsx_dev(chip), "EXT SD/MMC CMD %d\n", cmd_idx);
4013
4014        if (rsp_type == SD_RSP_TYPE_R1b)
4015                timeout = 3000;
4016
4017RTY_SEND_CMD:
4018
4019        rtsx_init_cmd(chip);
4020
4021        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | cmd_idx);
4022        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, (u8)(arg >> 24));
4023        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, (u8)(arg >> 16));
4024        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, (u8)(arg >> 8));
4025        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, (u8)arg);
4026
4027        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
4028        rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
4029                     0x01, PINGPONG_BUFFER);
4030        rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
4031                     0xFF, SD_TM_CMD_RSP | SD_TRANSFER_START);
4032        rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END,
4033                     SD_TRANSFER_END);
4034
4035        if (rsp_type == SD_RSP_TYPE_R2) {
4036                for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16;
4037                     reg_addr++)
4038                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
4039
4040                stat_idx = 17;
4041        } else if (rsp_type != SD_RSP_TYPE_R0) {
4042                for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4;
4043                     reg_addr++)
4044                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
4045
4046                stat_idx = 6;
4047        }
4048        rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_CMD5, 0, 0);
4049
4050        rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_STAT1, 0, 0);
4051
4052        retval = rtsx_send_cmd(chip, SD_CARD, timeout);
4053        if (retval < 0) {
4054                if (retval == -ETIMEDOUT) {
4055                        rtsx_clear_sd_error(chip);
4056
4057                        if (rsp_type & SD_WAIT_BUSY_END) {
4058                                retval = sd_check_data0_status(chip);
4059                                if (retval != STATUS_SUCCESS) {
4060                                        rtsx_trace(chip);
4061                                        return retval;
4062                                }
4063                        } else {
4064                                sd_set_err_code(chip, SD_TO_ERR);
4065                        }
4066                }
4067                rtsx_trace(chip);
4068                return STATUS_FAIL;
4069        }
4070
4071        if (rsp_type == SD_RSP_TYPE_R0)
4072                return STATUS_SUCCESS;
4073
4074        ptr = rtsx_get_cmd_data(chip) + 1;
4075
4076        if ((ptr[0] & 0xC0) != 0) {
4077                sd_set_err_code(chip, SD_STS_ERR);
4078                rtsx_trace(chip);
4079                return STATUS_FAIL;
4080        }
4081
4082        if (!(rsp_type & SD_NO_CHECK_CRC7)) {
4083                if (ptr[stat_idx] & SD_CRC7_ERR) {
4084                        if (cmd_idx == WRITE_MULTIPLE_BLOCK) {
4085                                sd_set_err_code(chip, SD_CRC_ERR);
4086                                rtsx_trace(chip);
4087                                return STATUS_FAIL;
4088                        }
4089                        if (rty_cnt < SD_MAX_RETRY_COUNT) {
4090                                wait_timeout(20);
4091                                rty_cnt++;
4092                                goto RTY_SEND_CMD;
4093                        } else {
4094                                sd_set_err_code(chip, SD_CRC_ERR);
4095                                rtsx_trace(chip);
4096                                return STATUS_FAIL;
4097                        }
4098                }
4099        }
4100
4101        if ((cmd_idx == SELECT_CARD) || (cmd_idx == APP_CMD) ||
4102            (cmd_idx == SEND_STATUS) || (cmd_idx == STOP_TRANSMISSION)) {
4103                if ((cmd_idx != STOP_TRANSMISSION) && !special_check) {
4104                        if (ptr[1] & 0x80) {
4105                                rtsx_trace(chip);
4106                                return STATUS_FAIL;
4107                        }
4108                }
4109#ifdef SUPPORT_SD_LOCK
4110                if (ptr[1] & 0x7D) {
4111#else
4112                if (ptr[1] & 0x7F) {
4113#endif
4114                        rtsx_trace(chip);
4115                        return STATUS_FAIL;
4116                }
4117                if (ptr[2] & 0xF8) {
4118                        rtsx_trace(chip);
4119                        return STATUS_FAIL;
4120                }
4121
4122                if (cmd_idx == SELECT_CARD) {
4123                        if (rsp_type == SD_RSP_TYPE_R2) {
4124                                if ((ptr[3] & 0x1E) != 0x04) {
4125                                        rtsx_trace(chip);
4126                                        return STATUS_FAIL;
4127                                }
4128                        }
4129                }
4130        }
4131
4132        if (rsp && rsp_len)
4133                memcpy(rsp, ptr, rsp_len);
4134
4135        return STATUS_SUCCESS;
4136}
4137
4138int ext_sd_get_rsp(struct rtsx_chip *chip, int len, u8 *rsp, u8 rsp_type)
4139{
4140        int retval, rsp_len;
4141        u16 reg_addr;
4142
4143        if (rsp_type == SD_RSP_TYPE_R0)
4144                return STATUS_SUCCESS;
4145
4146        rtsx_init_cmd(chip);
4147
4148        if (rsp_type == SD_RSP_TYPE_R2) {
4149                for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16;
4150                     reg_addr++)
4151                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0xFF, 0);
4152
4153                rsp_len = 17;
4154        } else if (rsp_type != SD_RSP_TYPE_R0) {
4155                for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4;
4156                     reg_addr++)
4157                        rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0xFF, 0);
4158
4159                rsp_len = 6;
4160        }
4161        rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_CMD5, 0xFF, 0);
4162
4163        retval = rtsx_send_cmd(chip, SD_CARD, 100);
4164        if (retval != STATUS_SUCCESS) {
4165                rtsx_trace(chip);
4166                return STATUS_FAIL;
4167        }
4168
4169        if (rsp) {
4170                int min_len = (rsp_len < len) ? rsp_len : len;
4171
4172                memcpy(rsp, rtsx_get_cmd_data(chip), min_len);
4173
4174                dev_dbg(rtsx_dev(chip), "min_len = %d\n", min_len);
4175                dev_dbg(rtsx_dev(chip), "Response in cmd buf: 0x%x 0x%x 0x%x 0x%x\n",
4176                        rsp[0], rsp[1], rsp[2], rsp[3]);
4177        }
4178
4179        return STATUS_SUCCESS;
4180}
4181
4182int sd_pass_thru_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4183{
4184        struct sd_info *sd_card = &chip->sd_card;
4185        unsigned int lun = SCSI_LUN(srb);
4186        int len;
4187        u8 buf[18] = {
4188                0x00,
4189                0x00,
4190                0x00,
4191                0x0E,
4192                0x00,
4193                0x00,
4194                0x00,
4195                0x00,
4196                0x53,
4197                0x44,
4198                0x20,
4199                0x43,
4200                0x61,
4201                0x72,
4202                0x64,
4203                0x00,
4204                0x00,
4205                0x00,
4206        };
4207
4208        sd_card->pre_cmd_err = 0;
4209
4210        if (!(CHK_BIT(chip->lun_mc, lun))) {
4211                SET_BIT(chip->lun_mc, lun);
4212                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4213                rtsx_trace(chip);
4214                return TRANSPORT_FAILED;
4215        }
4216
4217        if ((srb->cmnd[2] != 0x53) || (srb->cmnd[3] != 0x44) ||
4218            (srb->cmnd[4] != 0x20) || (srb->cmnd[5] != 0x43) ||
4219            (srb->cmnd[6] != 0x61) || (srb->cmnd[7] != 0x72) ||
4220            (srb->cmnd[8] != 0x64)) {
4221                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4222                rtsx_trace(chip);
4223                return TRANSPORT_FAILED;
4224        }
4225
4226        switch (srb->cmnd[1] & 0x0F) {
4227        case 0:
4228                sd_card->sd_pass_thru_en = 0;
4229                break;
4230
4231        case 1:
4232                sd_card->sd_pass_thru_en = 1;
4233                break;
4234
4235        default:
4236                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4237                rtsx_trace(chip);
4238                return TRANSPORT_FAILED;
4239        }
4240
4241        buf[5] = (CHK_SD(sd_card) == 1) ? 0x01 : 0x02;
4242        if (chip->card_wp & SD_CARD)
4243                buf[5] |= 0x80;
4244
4245        buf[6] = (u8)(sd_card->sd_addr >> 16);
4246        buf[7] = (u8)(sd_card->sd_addr >> 24);
4247
4248        buf[15] = chip->max_lun;
4249
4250        len = min_t(int, 18, scsi_bufflen(srb));
4251        rtsx_stor_set_xfer_buf(buf, len, srb);
4252
4253        return TRANSPORT_GOOD;
4254}
4255
4256static inline int get_rsp_type(struct scsi_cmnd *srb, u8 *rsp_type,
4257                               int *rsp_len)
4258{
4259        if (!rsp_type || !rsp_len)
4260                return STATUS_FAIL;
4261
4262        switch (srb->cmnd[10]) {
4263        case 0x03:
4264                *rsp_type = SD_RSP_TYPE_R0;
4265                *rsp_len = 0;
4266                break;
4267
4268        case 0x04:
4269                *rsp_type = SD_RSP_TYPE_R1;
4270                *rsp_len = 6;
4271                break;
4272
4273        case 0x05:
4274                *rsp_type = SD_RSP_TYPE_R1b;
4275                *rsp_len = 6;
4276                break;
4277
4278        case 0x06:
4279                *rsp_type = SD_RSP_TYPE_R2;
4280                *rsp_len = 17;
4281                break;
4282
4283        case 0x07:
4284                *rsp_type = SD_RSP_TYPE_R3;
4285                *rsp_len = 6;
4286                break;
4287
4288        default:
4289                return STATUS_FAIL;
4290        }
4291
4292        return STATUS_SUCCESS;
4293}
4294
4295int sd_execute_no_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4296{
4297        struct sd_info *sd_card = &chip->sd_card;
4298        unsigned int lun = SCSI_LUN(srb);
4299        int retval, rsp_len;
4300        u8 cmd_idx, rsp_type;
4301        bool standby = false, acmd = false;
4302        u32 arg;
4303
4304        if (!sd_card->sd_pass_thru_en) {
4305                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4306                rtsx_trace(chip);
4307                return TRANSPORT_FAILED;
4308        }
4309
4310        retval = sd_switch_clock(chip);
4311        if (retval != STATUS_SUCCESS) {
4312                rtsx_trace(chip);
4313                return TRANSPORT_FAILED;
4314        }
4315
4316        if (sd_card->pre_cmd_err) {
4317                sd_card->pre_cmd_err = 0;
4318                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4319                rtsx_trace(chip);
4320                return TRANSPORT_FAILED;
4321        }
4322
4323        cmd_idx = srb->cmnd[2] & 0x3F;
4324        if (srb->cmnd[1] & 0x02)
4325                standby = true;
4326
4327        if (srb->cmnd[1] & 0x01)
4328                acmd = true;
4329
4330        arg = ((u32)srb->cmnd[3] << 24) | ((u32)srb->cmnd[4] << 16) |
4331                ((u32)srb->cmnd[5] << 8) | srb->cmnd[6];
4332
4333        retval = get_rsp_type(srb, &rsp_type, &rsp_len);
4334        if (retval != STATUS_SUCCESS) {
4335                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4336                rtsx_trace(chip);
4337                return TRANSPORT_FAILED;
4338        }
4339        sd_card->last_rsp_type = rsp_type;
4340
4341        retval = sd_switch_clock(chip);
4342        if (retval != STATUS_SUCCESS) {
4343                rtsx_trace(chip);
4344                return TRANSPORT_FAILED;
4345        }
4346
4347#ifdef SUPPORT_SD_LOCK
4348        if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
4349                if (CHK_MMC_8BIT(sd_card)) {
4350                        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03,
4351                                                     SD_BUS_WIDTH_8);
4352                        if (retval != STATUS_SUCCESS) {
4353                                rtsx_trace(chip);
4354                                return TRANSPORT_FAILED;
4355                        }
4356
4357                } else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card)) {
4358                        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03,
4359                                                     SD_BUS_WIDTH_4);
4360                        if (retval != STATUS_SUCCESS) {
4361                                rtsx_trace(chip);
4362                                return TRANSPORT_FAILED;
4363                        }
4364                }
4365        }
4366#else
4367        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
4368        if (retval != STATUS_SUCCESS) {
4369                rtsx_trace(chip);
4370                return TRANSPORT_FAILED;
4371        }
4372#endif
4373
4374        if (standby) {
4375                retval = sd_select_card(chip, 0);
4376                if (retval != STATUS_SUCCESS) {
4377                        rtsx_trace(chip);
4378                        goto sd_execute_cmd_failed;
4379                }
4380        }
4381
4382        if (acmd) {
4383                retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD,
4384                                                 sd_card->sd_addr,
4385                                                 SD_RSP_TYPE_R1, NULL, 0,
4386                                                 false);
4387                if (retval != STATUS_SUCCESS) {
4388                        rtsx_trace(chip);
4389                        goto sd_execute_cmd_failed;
4390                }
4391        }
4392
4393        retval = ext_sd_send_cmd_get_rsp(chip, cmd_idx, arg, rsp_type,
4394                                         sd_card->rsp, rsp_len, false);
4395        if (retval != STATUS_SUCCESS) {
4396                rtsx_trace(chip);
4397                goto sd_execute_cmd_failed;
4398        }
4399
4400        if (standby) {
4401                retval = sd_select_card(chip, 1);
4402                if (retval != STATUS_SUCCESS) {
4403                        rtsx_trace(chip);
4404                        goto sd_execute_cmd_failed;
4405                }
4406        }
4407
4408#ifdef SUPPORT_SD_LOCK
4409        retval = sd_update_lock_status(chip);
4410        if (retval != STATUS_SUCCESS) {
4411                rtsx_trace(chip);
4412                goto sd_execute_cmd_failed;
4413        }
4414#endif
4415
4416        scsi_set_resid(srb, 0);
4417        return TRANSPORT_GOOD;
4418
4419sd_execute_cmd_failed:
4420        sd_card->pre_cmd_err = 1;
4421        set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4422        release_sd_card(chip);
4423        do_reset_sd_card(chip);
4424        if (!(chip->card_ready & SD_CARD))
4425                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4426
4427        rtsx_trace(chip);
4428        return TRANSPORT_FAILED;
4429}
4430
4431int sd_execute_read_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4432{
4433        struct sd_info *sd_card = &chip->sd_card;
4434        unsigned int lun = SCSI_LUN(srb);
4435        int retval, rsp_len, i;
4436        bool read_err = false, cmd13_checkbit = false;
4437        u8 cmd_idx, rsp_type, bus_width;
4438        bool standby = false, send_cmd12 = false, acmd = false;
4439        u32 data_len;
4440
4441        if (!sd_card->sd_pass_thru_en) {
4442                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4443                rtsx_trace(chip);
4444                return TRANSPORT_FAILED;
4445        }
4446
4447        if (sd_card->pre_cmd_err) {
4448                sd_card->pre_cmd_err = 0;
4449                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4450                rtsx_trace(chip);
4451                return TRANSPORT_FAILED;
4452        }
4453
4454        retval = sd_switch_clock(chip);
4455        if (retval != STATUS_SUCCESS) {
4456                rtsx_trace(chip);
4457                return TRANSPORT_FAILED;
4458        }
4459
4460        cmd_idx = srb->cmnd[2] & 0x3F;
4461        if (srb->cmnd[1] & 0x04)
4462                send_cmd12 = true;
4463
4464        if (srb->cmnd[1] & 0x02)
4465                standby = true;
4466
4467        if (srb->cmnd[1] & 0x01)
4468                acmd = true;
4469
4470        data_len = ((u32)srb->cmnd[7] << 16) | ((u32)srb->cmnd[8]
4471                                                << 8) | srb->cmnd[9];
4472
4473        retval = get_rsp_type(srb, &rsp_type, &rsp_len);
4474        if (retval != STATUS_SUCCESS) {
4475                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4476                rtsx_trace(chip);
4477                return TRANSPORT_FAILED;
4478        }
4479        sd_card->last_rsp_type = rsp_type;
4480
4481        retval = sd_switch_clock(chip);
4482        if (retval != STATUS_SUCCESS) {
4483                rtsx_trace(chip);
4484                return TRANSPORT_FAILED;
4485        }
4486
4487#ifdef SUPPORT_SD_LOCK
4488        if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
4489                if (CHK_MMC_8BIT(sd_card))
4490                        bus_width = SD_BUS_WIDTH_8;
4491                else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card))
4492                        bus_width = SD_BUS_WIDTH_4;
4493                else
4494                        bus_width = SD_BUS_WIDTH_1;
4495        } else {
4496                bus_width = SD_BUS_WIDTH_4;
4497        }
4498        dev_dbg(rtsx_dev(chip), "bus_width = %d\n", bus_width);
4499#else
4500        bus_width = SD_BUS_WIDTH_4;
4501#endif
4502
4503        if (data_len < 512) {
4504                retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, data_len,
4505                                                 SD_RSP_TYPE_R1, NULL, 0,
4506                                                 false);
4507                if (retval != STATUS_SUCCESS) {
4508                        rtsx_trace(chip);
4509                        goto sd_execute_read_cmd_failed;
4510                }
4511        }
4512
4513        if (standby) {
4514                retval = sd_select_card(chip, 0);
4515                if (retval != STATUS_SUCCESS) {
4516                        rtsx_trace(chip);
4517                        goto sd_execute_read_cmd_failed;
4518                }
4519        }
4520
4521        if (acmd) {
4522                retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD,
4523                                                 sd_card->sd_addr,
4524                                                 SD_RSP_TYPE_R1, NULL, 0,
4525                                                 false);
4526                if (retval != STATUS_SUCCESS) {
4527                        rtsx_trace(chip);
4528                        goto sd_execute_read_cmd_failed;
4529                }
4530        }
4531
4532        if (data_len <= 512) {
4533                int min_len;
4534                u8 *buf;
4535                u16 byte_cnt, blk_cnt;
4536                u8 cmd[5];
4537
4538                byte_cnt = ((u16)(srb->cmnd[8] & 0x03) << 8) | srb->cmnd[9];
4539                blk_cnt = 1;
4540
4541                cmd[0] = 0x40 | cmd_idx;
4542                cmd[1] = srb->cmnd[3];
4543                cmd[2] = srb->cmnd[4];
4544                cmd[3] = srb->cmnd[5];
4545                cmd[4] = srb->cmnd[6];
4546
4547                buf = kmalloc(data_len, GFP_KERNEL);
4548                if (!buf) {
4549                        rtsx_trace(chip);
4550                        return TRANSPORT_ERROR;
4551                }
4552
4553                retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, byte_cnt,
4554                                      blk_cnt, bus_width, buf, data_len, 2000);
4555                if (retval != STATUS_SUCCESS) {
4556                        read_err = true;
4557                        kfree(buf);
4558                        rtsx_clear_sd_error(chip);
4559                        rtsx_trace(chip);
4560                        goto sd_execute_read_cmd_failed;
4561                }
4562
4563                min_len = min(data_len, scsi_bufflen(srb));
4564                rtsx_stor_set_xfer_buf(buf, min_len, srb);
4565
4566                kfree(buf);
4567        } else if (!(data_len & 0x1FF)) {
4568                rtsx_init_cmd(chip);
4569
4570                trans_dma_enable(DMA_FROM_DEVICE, chip, data_len, DMA_512);
4571
4572                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF,
4573                             0x02);
4574                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF,
4575                             0x00);
4576                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H,
4577                             0xFF, (srb->cmnd[7] & 0xFE) >> 1);
4578                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L,
4579                             0xFF, (u8)((data_len & 0x0001FE00) >> 9));
4580
4581                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF,
4582                             0x40 | cmd_idx);
4583                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF,
4584                             srb->cmnd[3]);
4585                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF,
4586                             srb->cmnd[4]);
4587                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF,
4588                             srb->cmnd[5]);
4589                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF,
4590                             srb->cmnd[6]);
4591
4592                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
4593                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
4594
4595                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
4596                             0xFF, SD_TM_AUTO_READ_2 | SD_TRANSFER_START);
4597                rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
4598                             SD_TRANSFER_END, SD_TRANSFER_END);
4599
4600                rtsx_send_cmd_no_wait(chip);
4601
4602                retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb),
4603                                            scsi_bufflen(srb),
4604                                            scsi_sg_count(srb),
4605                                            DMA_FROM_DEVICE, 10000);
4606                if (retval < 0) {
4607                        read_err = true;
4608                        rtsx_clear_sd_error(chip);
4609                        rtsx_trace(chip);
4610                        goto sd_execute_read_cmd_failed;
4611                }
4612
4613        } else {
4614                rtsx_trace(chip);
4615                goto sd_execute_read_cmd_failed;
4616        }
4617
4618        retval = ext_sd_get_rsp(chip, rsp_len, sd_card->rsp, rsp_type);
4619        if (retval != STATUS_SUCCESS) {
4620                rtsx_trace(chip);
4621                goto sd_execute_read_cmd_failed;
4622        }
4623
4624        if (standby) {
4625                retval = sd_select_card(chip, 1);
4626                if (retval != STATUS_SUCCESS) {
4627                        rtsx_trace(chip);
4628                        goto sd_execute_read_cmd_failed;
4629                }
4630        }
4631
4632        if (send_cmd12) {
4633                retval = ext_sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
4634                                                 SD_RSP_TYPE_R1b, NULL, 0,
4635                                                 false);
4636                if (retval != STATUS_SUCCESS) {
4637                        rtsx_trace(chip);
4638                        goto sd_execute_read_cmd_failed;
4639                }
4640        }
4641
4642        if (data_len < 512) {
4643                retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200,
4644                                                 SD_RSP_TYPE_R1, NULL, 0,
4645                                                 false);
4646                if (retval != STATUS_SUCCESS) {
4647                        rtsx_trace(chip);
4648                        goto sd_execute_read_cmd_failed;
4649                }
4650
4651                retval = rtsx_write_register(chip, SD_BYTE_CNT_H, 0xFF, 0x02);
4652                if (retval != STATUS_SUCCESS) {
4653                        rtsx_trace(chip);
4654                        goto sd_execute_read_cmd_failed;
4655                }
4656
4657                retval = rtsx_write_register(chip, SD_BYTE_CNT_L, 0xFF, 0x00);
4658                if (retval != STATUS_SUCCESS) {
4659                        rtsx_trace(chip);
4660                        goto sd_execute_read_cmd_failed;
4661                }
4662        }
4663
4664        if ((srb->cmnd[1] & 0x02) || (srb->cmnd[1] & 0x04))
4665                cmd13_checkbit = true;
4666
4667        for (i = 0; i < 3; i++) {
4668                retval = ext_sd_send_cmd_get_rsp(chip, SEND_STATUS,
4669                                                 sd_card->sd_addr,
4670                                                SD_RSP_TYPE_R1, NULL, 0,
4671                                                cmd13_checkbit);
4672                if (retval == STATUS_SUCCESS)
4673                        break;
4674        }
4675        if (retval != STATUS_SUCCESS) {
4676                rtsx_trace(chip);
4677                goto sd_execute_read_cmd_failed;
4678        }
4679
4680        scsi_set_resid(srb, 0);
4681        return TRANSPORT_GOOD;
4682
4683sd_execute_read_cmd_failed:
4684        sd_card->pre_cmd_err = 1;
4685        set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4686        if (read_err)
4687                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4688
4689        release_sd_card(chip);
4690        do_reset_sd_card(chip);
4691        if (!(chip->card_ready & SD_CARD))
4692                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4693
4694        rtsx_trace(chip);
4695        return TRANSPORT_FAILED;
4696}
4697
4698int sd_execute_write_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4699{
4700        struct sd_info *sd_card = &chip->sd_card;
4701        unsigned int lun = SCSI_LUN(srb);
4702        int retval, rsp_len, i;
4703        bool write_err = false, cmd13_checkbit = false;
4704        u8 cmd_idx, rsp_type;
4705        bool standby = false, send_cmd12 = false, acmd = false;
4706        u32 data_len, arg;
4707#ifdef SUPPORT_SD_LOCK
4708        int lock_cmd_fail = 0;
4709        u8 sd_lock_state = 0;
4710        u8 lock_cmd_type = 0;
4711#endif
4712
4713        if (!sd_card->sd_pass_thru_en) {
4714                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4715                rtsx_trace(chip);
4716                return TRANSPORT_FAILED;
4717        }
4718
4719        if (sd_card->pre_cmd_err) {
4720                sd_card->pre_cmd_err = 0;
4721                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4722                rtsx_trace(chip);
4723                return TRANSPORT_FAILED;
4724        }
4725
4726        retval = sd_switch_clock(chip);
4727        if (retval != STATUS_SUCCESS) {
4728                rtsx_trace(chip);
4729                return TRANSPORT_FAILED;
4730        }
4731
4732        cmd_idx = srb->cmnd[2] & 0x3F;
4733        if (srb->cmnd[1] & 0x04)
4734                send_cmd12 = true;
4735
4736        if (srb->cmnd[1] & 0x02)
4737                standby = true;
4738
4739        if (srb->cmnd[1] & 0x01)
4740                acmd = true;
4741
4742        data_len = ((u32)srb->cmnd[7] << 16) | ((u32)srb->cmnd[8]
4743                                                << 8) | srb->cmnd[9];
4744        arg = ((u32)srb->cmnd[3] << 24) | ((u32)srb->cmnd[4] << 16) |
4745                ((u32)srb->cmnd[5] << 8) | srb->cmnd[6];
4746
4747#ifdef SUPPORT_SD_LOCK
4748        if (cmd_idx == LOCK_UNLOCK) {
4749                sd_lock_state = sd_card->sd_lock_status;
4750                sd_lock_state &= SD_LOCKED;
4751        }
4752#endif
4753
4754        retval = get_rsp_type(srb, &rsp_type, &rsp_len);
4755        if (retval != STATUS_SUCCESS) {
4756                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4757                rtsx_trace(chip);
4758                return TRANSPORT_FAILED;
4759        }
4760        sd_card->last_rsp_type = rsp_type;
4761
4762        retval = sd_switch_clock(chip);
4763        if (retval != STATUS_SUCCESS) {
4764                rtsx_trace(chip);
4765                return TRANSPORT_FAILED;
4766        }
4767
4768#ifdef SUPPORT_SD_LOCK
4769        if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
4770                if (CHK_MMC_8BIT(sd_card)) {
4771                        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03,
4772                                                     SD_BUS_WIDTH_8);
4773                        if (retval != STATUS_SUCCESS) {
4774                                rtsx_trace(chip);
4775                                return TRANSPORT_FAILED;
4776                        }
4777
4778                } else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card)) {
4779                        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03,
4780                                                     SD_BUS_WIDTH_4);
4781                        if (retval != STATUS_SUCCESS) {
4782                                rtsx_trace(chip);
4783                                return TRANSPORT_FAILED;
4784                        }
4785                }
4786        }
4787#else
4788        retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
4789        if (retval != STATUS_SUCCESS) {
4790                rtsx_trace(chip);
4791                return TRANSPORT_FAILED;
4792        }
4793#endif
4794
4795        if (data_len < 512) {
4796                retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, data_len,
4797                                                 SD_RSP_TYPE_R1, NULL, 0,
4798                                                 false);
4799                if (retval != STATUS_SUCCESS) {
4800                        rtsx_trace(chip);
4801                        goto sd_execute_write_cmd_failed;
4802                }
4803        }
4804
4805        if (standby) {
4806                retval = sd_select_card(chip, 0);
4807                if (retval != STATUS_SUCCESS) {
4808                        rtsx_trace(chip);
4809                        goto sd_execute_write_cmd_failed;
4810                }
4811        }
4812
4813        if (acmd) {
4814                retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD,
4815                                                 sd_card->sd_addr,
4816                                                 SD_RSP_TYPE_R1, NULL, 0,
4817                                                 false);
4818                if (retval != STATUS_SUCCESS) {
4819                        rtsx_trace(chip);
4820                        goto sd_execute_write_cmd_failed;
4821                }
4822        }
4823
4824        retval = ext_sd_send_cmd_get_rsp(chip, cmd_idx, arg, rsp_type,
4825                                         sd_card->rsp, rsp_len, false);
4826        if (retval != STATUS_SUCCESS) {
4827                rtsx_trace(chip);
4828                goto sd_execute_write_cmd_failed;
4829        }
4830
4831        if (data_len <= 512) {
4832                u16 i;
4833                u8 *buf;
4834
4835                buf = kmalloc(data_len, GFP_KERNEL);
4836                if (!buf) {
4837                        rtsx_trace(chip);
4838                        return TRANSPORT_ERROR;
4839                }
4840
4841                rtsx_stor_get_xfer_buf(buf, data_len, srb);
4842
4843#ifdef SUPPORT_SD_LOCK
4844                if (cmd_idx == LOCK_UNLOCK)
4845                        lock_cmd_type = buf[0] & 0x0F;
4846#endif
4847
4848                if (data_len > 256) {
4849                        rtsx_init_cmd(chip);
4850                        for (i = 0; i < 256; i++) {
4851                                rtsx_add_cmd(chip, WRITE_REG_CMD,
4852                                             PPBUF_BASE2 + i, 0xFF, buf[i]);
4853                        }
4854                        retval = rtsx_send_cmd(chip, 0, 250);
4855                        if (retval != STATUS_SUCCESS) {
4856                                kfree(buf);
4857                                rtsx_trace(chip);
4858                                goto sd_execute_write_cmd_failed;
4859                        }
4860
4861                        rtsx_init_cmd(chip);
4862                        for (i = 256; i < data_len; i++) {
4863                                rtsx_add_cmd(chip, WRITE_REG_CMD,
4864                                             PPBUF_BASE2 + i, 0xFF, buf[i]);
4865                        }
4866                        retval = rtsx_send_cmd(chip, 0, 250);
4867                        if (retval != STATUS_SUCCESS) {
4868                                kfree(buf);
4869                                rtsx_trace(chip);
4870                                goto sd_execute_write_cmd_failed;
4871                        }
4872                } else {
4873                        rtsx_init_cmd(chip);
4874                        for (i = 0; i < data_len; i++) {
4875                                rtsx_add_cmd(chip, WRITE_REG_CMD,
4876                                             PPBUF_BASE2 + i, 0xFF, buf[i]);
4877                        }
4878                        retval = rtsx_send_cmd(chip, 0, 250);
4879                        if (retval != STATUS_SUCCESS) {
4880                                kfree(buf);
4881                                rtsx_trace(chip);
4882                                goto sd_execute_write_cmd_failed;
4883                        }
4884                }
4885
4886                kfree(buf);
4887
4888                rtsx_init_cmd(chip);
4889
4890                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF,
4891                             srb->cmnd[8] & 0x03);
4892                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF,
4893                             srb->cmnd[9]);
4894                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF,
4895                             0x00);
4896                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF,
4897                             0x01);
4898                rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
4899                             PINGPONG_BUFFER);
4900
4901                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
4902                             SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
4903                rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
4904                             SD_TRANSFER_END, SD_TRANSFER_END);
4905
4906                retval = rtsx_send_cmd(chip, SD_CARD, 250);
4907        } else if (!(data_len & 0x1FF)) {
4908                rtsx_init_cmd(chip);
4909
4910                trans_dma_enable(DMA_TO_DEVICE, chip, data_len, DMA_512);
4911
4912                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF,
4913                             0x02);
4914                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF,
4915                             0x00);
4916                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H,
4917                             0xFF, (srb->cmnd[7] & 0xFE) >> 1);
4918                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L,
4919                             0xFF, (u8)((data_len & 0x0001FE00) >> 9));
4920
4921                rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
4922                             SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
4923                rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
4924                             SD_TRANSFER_END, SD_TRANSFER_END);
4925
4926                rtsx_send_cmd_no_wait(chip);
4927
4928                retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb),
4929                                            scsi_bufflen(srb),
4930                                            scsi_sg_count(srb),
4931                                            DMA_TO_DEVICE, 10000);
4932
4933        } else {
4934                rtsx_trace(chip);
4935                goto sd_execute_write_cmd_failed;
4936        }
4937
4938        if (retval < 0) {
4939                write_err = true;
4940                rtsx_clear_sd_error(chip);
4941                rtsx_trace(chip);
4942                goto sd_execute_write_cmd_failed;
4943        }
4944
4945#ifdef SUPPORT_SD_LOCK
4946        if (cmd_idx == LOCK_UNLOCK) {
4947                if (lock_cmd_type == SD_ERASE) {
4948                        sd_card->sd_erase_status = SD_UNDER_ERASING;
4949                        scsi_set_resid(srb, 0);
4950                        return TRANSPORT_GOOD;
4951                }
4952
4953                rtsx_init_cmd(chip);
4954                rtsx_add_cmd(chip, CHECK_REG_CMD, 0xFD30, 0x02, 0x02);
4955
4956                rtsx_send_cmd(chip, SD_CARD, 250);
4957
4958                retval = sd_update_lock_status(chip);
4959                if (retval != STATUS_SUCCESS) {
4960                        dev_dbg(rtsx_dev(chip), "Lock command fail!\n");
4961                        lock_cmd_fail = 1;
4962                }
4963        }
4964#endif /* SUPPORT_SD_LOCK */
4965
4966        if (standby) {
4967                retval = sd_select_card(chip, 1);
4968                if (retval != STATUS_SUCCESS) {
4969                        rtsx_trace(chip);
4970                        goto sd_execute_write_cmd_failed;
4971                }
4972        }
4973
4974        if (send_cmd12) {
4975                retval = ext_sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
4976                                                 SD_RSP_TYPE_R1b, NULL, 0,
4977                                                 false);
4978                if (retval != STATUS_SUCCESS) {
4979                        rtsx_trace(chip);
4980                        goto sd_execute_write_cmd_failed;
4981                }
4982        }
4983
4984        if (data_len < 512) {
4985                retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200,
4986                                                 SD_RSP_TYPE_R1, NULL, 0,
4987                                                 false);
4988                if (retval != STATUS_SUCCESS) {
4989                        rtsx_trace(chip);
4990                        goto sd_execute_write_cmd_failed;
4991                }
4992
4993                retval = rtsx_write_register(chip, SD_BYTE_CNT_H, 0xFF, 0x02);
4994                if (retval != STATUS_SUCCESS) {
4995                        rtsx_trace(chip);
4996                        goto sd_execute_write_cmd_failed;
4997                }
4998
4999                rtsx_write_register(chip, SD_BYTE_CNT_L, 0xFF, 0x00);
5000                if (retval != STATUS_SUCCESS) {
5001                        rtsx_trace(chip);
5002                        goto sd_execute_write_cmd_failed;
5003                }
5004        }
5005
5006        if ((srb->cmnd[1] & 0x02) || (srb->cmnd[1] & 0x04))
5007                cmd13_checkbit = true;
5008
5009        for (i = 0; i < 3; i++) {
5010                retval = ext_sd_send_cmd_get_rsp(chip, SEND_STATUS,
5011                                                 sd_card->sd_addr,
5012                                                 SD_RSP_TYPE_R1, NULL, 0,
5013                                                 cmd13_checkbit);
5014                if (retval == STATUS_SUCCESS)
5015                        break;
5016        }
5017        if (retval != STATUS_SUCCESS) {
5018                rtsx_trace(chip);
5019                goto sd_execute_write_cmd_failed;
5020        }
5021
5022#ifdef SUPPORT_SD_LOCK
5023        if (cmd_idx == LOCK_UNLOCK) {
5024                if (!lock_cmd_fail) {
5025                        dev_dbg(rtsx_dev(chip), "lock_cmd_type = 0x%x\n",
5026                                lock_cmd_type);
5027                        if (lock_cmd_type & SD_CLR_PWD)
5028                                sd_card->sd_lock_status &= ~SD_PWD_EXIST;
5029
5030                        if (lock_cmd_type & SD_SET_PWD)
5031                                sd_card->sd_lock_status |= SD_PWD_EXIST;
5032                }
5033
5034                dev_dbg(rtsx_dev(chip), "sd_lock_state = 0x%x, sd_card->sd_lock_status = 0x%x\n",
5035                        sd_lock_state, sd_card->sd_lock_status);
5036                if (sd_lock_state ^ (sd_card->sd_lock_status & SD_LOCKED)) {
5037                        sd_card->sd_lock_notify = 1;
5038                        if (sd_lock_state) {
5039                                if (sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) {
5040                                        sd_card->sd_lock_status |= (
5041                                                SD_UNLOCK_POW_ON | SD_SDR_RST);
5042                                        if (CHK_SD(sd_card)) {
5043                                                retval = reset_sd(chip);
5044                                                if (retval != STATUS_SUCCESS) {
5045                                                        sd_card->sd_lock_status &= ~(SD_UNLOCK_POW_ON | SD_SDR_RST);
5046                                                        rtsx_trace(chip);
5047                                                        goto sd_execute_write_cmd_failed;
5048                                                }
5049                                        }
5050
5051                                        sd_card->sd_lock_status &= ~(SD_UNLOCK_POW_ON | SD_SDR_RST);
5052                                }
5053                        }
5054                }
5055        }
5056
5057        if (lock_cmd_fail) {
5058                scsi_set_resid(srb, 0);
5059                set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
5060                rtsx_trace(chip);
5061                return TRANSPORT_FAILED;
5062        }
5063#endif  /* SUPPORT_SD_LOCK */
5064
5065        scsi_set_resid(srb, 0);
5066        return TRANSPORT_GOOD;
5067
5068sd_execute_write_cmd_failed:
5069        sd_card->pre_cmd_err = 1;
5070        set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
5071        if (write_err)
5072                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
5073
5074        release_sd_card(chip);
5075        do_reset_sd_card(chip);
5076        if (!(chip->card_ready & SD_CARD))
5077                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
5078
5079        rtsx_trace(chip);
5080        return TRANSPORT_FAILED;
5081}
5082
5083int sd_get_cmd_rsp(struct scsi_cmnd *srb, struct rtsx_chip *chip)
5084{
5085        struct sd_info *sd_card = &chip->sd_card;
5086        unsigned int lun = SCSI_LUN(srb);
5087        int count;
5088        u16 data_len;
5089
5090        if (!sd_card->sd_pass_thru_en) {
5091                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
5092                rtsx_trace(chip);
5093                return TRANSPORT_FAILED;
5094        }
5095
5096        if (sd_card->pre_cmd_err) {
5097                sd_card->pre_cmd_err = 0;
5098                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
5099                rtsx_trace(chip);
5100                return TRANSPORT_FAILED;
5101        }
5102
5103        data_len = ((u16)srb->cmnd[7] << 8) | srb->cmnd[8];
5104
5105        if (sd_card->last_rsp_type == SD_RSP_TYPE_R0) {
5106                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
5107                rtsx_trace(chip);
5108                return TRANSPORT_FAILED;
5109        } else if (sd_card->last_rsp_type == SD_RSP_TYPE_R2) {
5110                count = (data_len < 17) ? data_len : 17;
5111        } else {
5112                count = (data_len < 6) ? data_len : 6;
5113        }
5114        rtsx_stor_set_xfer_buf(sd_card->rsp, count, srb);
5115
5116        dev_dbg(rtsx_dev(chip), "Response length: %d\n", data_len);
5117        dev_dbg(rtsx_dev(chip), "Response: 0x%x 0x%x 0x%x 0x%x\n",
5118                sd_card->rsp[0], sd_card->rsp[1],
5119                sd_card->rsp[2], sd_card->rsp[3]);
5120
5121        scsi_set_resid(srb, 0);
5122        return TRANSPORT_GOOD;
5123}
5124
5125int sd_hw_rst(struct scsi_cmnd *srb, struct rtsx_chip *chip)
5126{
5127        struct sd_info *sd_card = &chip->sd_card;
5128        unsigned int lun = SCSI_LUN(srb);
5129        int retval;
5130
5131        if (!sd_card->sd_pass_thru_en) {
5132                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
5133                rtsx_trace(chip);
5134                return TRANSPORT_FAILED;
5135        }
5136
5137        if (sd_card->pre_cmd_err) {
5138                sd_card->pre_cmd_err = 0;
5139                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
5140                rtsx_trace(chip);
5141                return TRANSPORT_FAILED;
5142        }
5143
5144        if ((srb->cmnd[2] != 0x53) || (srb->cmnd[3] != 0x44) ||
5145            (srb->cmnd[4] != 0x20) || (srb->cmnd[5] != 0x43) ||
5146            (srb->cmnd[6] != 0x61) || (srb->cmnd[7] != 0x72) ||
5147            (srb->cmnd[8] != 0x64)) {
5148                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
5149                rtsx_trace(chip);
5150                return TRANSPORT_FAILED;
5151        }
5152
5153        switch (srb->cmnd[1] & 0x0F) {
5154        case 0:
5155#ifdef SUPPORT_SD_LOCK
5156                if (srb->cmnd[9] == 0x64)
5157                        sd_card->sd_lock_status |= SD_SDR_RST;
5158#endif
5159                retval = reset_sd_card(chip);
5160                if (retval != STATUS_SUCCESS) {
5161#ifdef SUPPORT_SD_LOCK
5162                        sd_card->sd_lock_status &= ~SD_SDR_RST;
5163#endif
5164                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
5165                        sd_card->pre_cmd_err = 1;
5166                        rtsx_trace(chip);
5167                        return TRANSPORT_FAILED;
5168                }
5169#ifdef SUPPORT_SD_LOCK
5170                sd_card->sd_lock_status &= ~SD_SDR_RST;
5171#endif
5172                break;
5173
5174        case 1:
5175                retval = soft_reset_sd_card(chip);
5176                if (retval != STATUS_SUCCESS) {
5177                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
5178                        sd_card->pre_cmd_err = 1;
5179                        rtsx_trace(chip);
5180                        return TRANSPORT_FAILED;
5181                }
5182                break;
5183
5184        default:
5185                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
5186                rtsx_trace(chip);
5187                return TRANSPORT_FAILED;
5188        }
5189
5190        scsi_set_resid(srb, 0);
5191        return TRANSPORT_GOOD;
5192}
5193#endif
5194
5195void sd_cleanup_work(struct rtsx_chip *chip)
5196{
5197        struct sd_info *sd_card = &chip->sd_card;
5198
5199        if (sd_card->seq_mode) {
5200                dev_dbg(rtsx_dev(chip), "SD: stop transmission\n");
5201                sd_stop_seq_mode(chip);
5202                sd_card->cleanup_counter = 0;
5203        }
5204}
5205
5206int sd_power_off_card3v3(struct rtsx_chip *chip)
5207{
5208        int retval;
5209
5210        retval = disable_card_clock(chip, SD_CARD);
5211        if (retval != STATUS_SUCCESS) {
5212                rtsx_trace(chip);
5213                return STATUS_FAIL;
5214        }
5215
5216        retval = rtsx_write_register(chip, CARD_OE, SD_OUTPUT_EN, 0);
5217        if (retval) {
5218                rtsx_trace(chip);
5219                return retval;
5220        }
5221
5222        if (!chip->ft2_fast_mode) {
5223                retval = card_power_off(chip, SD_CARD);
5224                if (retval != STATUS_SUCCESS) {
5225                        rtsx_trace(chip);
5226                        return STATUS_FAIL;
5227                }
5228
5229                mdelay(50);
5230        }
5231
5232        if (chip->asic_code) {
5233                retval = sd_pull_ctl_disable(chip);
5234                if (retval != STATUS_SUCCESS) {
5235                        rtsx_trace(chip);
5236                        return STATUS_FAIL;
5237                }
5238        } else {
5239                retval = rtsx_write_register(chip, FPGA_PULL_CTL,
5240                                             FPGA_SD_PULL_CTL_BIT | 0x20,
5241                                             FPGA_SD_PULL_CTL_BIT);
5242                if (retval) {
5243                        rtsx_trace(chip);
5244                        return retval;
5245                }
5246        }
5247
5248        return STATUS_SUCCESS;
5249}
5250
5251int release_sd_card(struct rtsx_chip *chip)
5252{
5253        struct sd_info *sd_card = &chip->sd_card;
5254        int retval;
5255
5256        chip->card_ready &= ~SD_CARD;
5257        chip->card_fail &= ~SD_CARD;
5258        chip->card_wp &= ~SD_CARD;
5259
5260        chip->sd_io = 0;
5261        chip->sd_int = 0;
5262
5263#ifdef SUPPORT_SD_LOCK
5264        sd_card->sd_lock_status = 0;
5265        sd_card->sd_erase_status = 0;
5266#endif
5267
5268        memset(sd_card->raw_csd, 0, 16);
5269        memset(sd_card->raw_scr, 0, 8);
5270
5271        retval = sd_power_off_card3v3(chip);
5272        if (retval != STATUS_SUCCESS) {
5273                rtsx_trace(chip);
5274                return STATUS_FAIL;
5275        }
5276
5277        return STATUS_SUCCESS;
5278}
5279