1 /* Driver for Realtek PCI-Express card reader
3 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
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
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.
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/>.
19 * wwang (wei_wang@realsil.com.cn)
20 * No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
28 #include "rtsx_transport.h"
29 #include "rtsx_scsi.h"
30 #include "rtsx_card.h"
33 #define SD_MAX_RETRY_COUNT 3
35 static u16 REG_SD_CFG1;
36 static u16 REG_SD_CFG2;
37 static u16 REG_SD_CFG3;
38 static u16 REG_SD_STAT1;
39 static u16 REG_SD_STAT2;
40 static u16 REG_SD_BUS_STAT;
41 static u16 REG_SD_PAD_CTL;
42 static u16 REG_SD_SAMPLE_POINT_CTL;
43 static u16 REG_SD_PUSH_POINT_CTL;
44 static u16 REG_SD_CMD0;
45 static u16 REG_SD_CMD1;
46 static u16 REG_SD_CMD2;
47 static u16 REG_SD_CMD3;
48 static u16 REG_SD_CMD4;
49 static u16 REG_SD_CMD5;
50 static u16 REG_SD_BYTE_CNT_L;
51 static u16 REG_SD_BYTE_CNT_H;
52 static u16 REG_SD_BLOCK_CNT_L;
53 static u16 REG_SD_BLOCK_CNT_H;
54 static u16 REG_SD_TRANSFER;
55 static u16 REG_SD_VPCLK0_CTL;
56 static u16 REG_SD_VPCLK1_CTL;
57 static u16 REG_SD_DCMPS0_CTL;
58 static u16 REG_SD_DCMPS1_CTL;
60 static inline void sd_set_err_code(struct rtsx_chip *chip, u8 err_code)
62 struct sd_info *sd_card = &(chip->sd_card);
64 sd_card->err_code |= err_code;
67 static inline void sd_clr_err_code(struct rtsx_chip *chip)
69 struct sd_info *sd_card = &(chip->sd_card);
71 sd_card->err_code = 0;
74 static inline int sd_check_err_code(struct rtsx_chip *chip, u8 err_code)
76 struct sd_info *sd_card = &(chip->sd_card);
78 return sd_card->err_code & err_code;
81 static void sd_init_reg_addr(struct rtsx_chip *chip)
83 if (CHECK_PID(chip, 0x5209)) {
84 REG_SD_CFG1 = SD_CFG1;
85 REG_SD_CFG2 = SD_CFG2;
86 REG_SD_CFG3 = SD_CFG3;
87 REG_SD_STAT1 = SD_STAT1;
88 REG_SD_STAT2 = SD_STAT2;
89 REG_SD_BUS_STAT = SD_BUS_STAT;
90 REG_SD_PAD_CTL = SD_PAD_CTL;
91 REG_SD_SAMPLE_POINT_CTL = SD_SAMPLE_POINT_CTL;
92 REG_SD_PUSH_POINT_CTL = SD_PUSH_POINT_CTL;
93 REG_SD_CMD0 = SD_CMD0;
94 REG_SD_CMD1 = SD_CMD1;
95 REG_SD_CMD2 = SD_CMD2;
96 REG_SD_CMD3 = SD_CMD3;
97 REG_SD_CMD4 = SD_CMD4;
98 REG_SD_CMD5 = SD_CMD5;
99 REG_SD_BYTE_CNT_L = SD_BYTE_CNT_L;
100 REG_SD_BYTE_CNT_H = SD_BYTE_CNT_H;
101 REG_SD_BLOCK_CNT_L = SD_BLOCK_CNT_L;
102 REG_SD_BLOCK_CNT_H = SD_BLOCK_CNT_H;
103 REG_SD_TRANSFER = SD_TRANSFER;
104 REG_SD_VPCLK0_CTL = SD_VPCLK0_CTL;
105 REG_SD_VPCLK1_CTL = SD_VPCLK1_CTL;
106 REG_SD_DCMPS0_CTL = SD_DCMPS0_CTL;
107 REG_SD_DCMPS1_CTL = SD_DCMPS1_CTL;
109 REG_SD_CFG1 = 0xFD31;
110 REG_SD_CFG2 = 0xFD33;
111 REG_SD_CFG3 = 0xFD3E;
112 REG_SD_STAT1 = 0xFD30;
116 REG_SD_SAMPLE_POINT_CTL = 0;
117 REG_SD_PUSH_POINT_CTL = 0;
118 REG_SD_CMD0 = 0xFD34;
119 REG_SD_CMD1 = 0xFD35;
120 REG_SD_CMD2 = 0xFD36;
121 REG_SD_CMD3 = 0xFD37;
122 REG_SD_CMD4 = 0xFD38;
123 REG_SD_CMD5 = 0xFD5A;
124 REG_SD_BYTE_CNT_L = 0xFD39;
125 REG_SD_BYTE_CNT_H = 0xFD3A;
126 REG_SD_BLOCK_CNT_L = 0xFD3B;
127 REG_SD_BLOCK_CNT_H = 0xFD3C;
128 REG_SD_TRANSFER = 0xFD32;
129 REG_SD_VPCLK0_CTL = 0;
130 REG_SD_VPCLK1_CTL = 0;
131 REG_SD_DCMPS0_CTL = 0;
132 REG_SD_DCMPS1_CTL = 0;
136 static int sd_check_data0_status(struct rtsx_chip *chip)
140 if (CHECK_PID(chip, 0x5209))
141 RTSX_READ_REG(chip, REG_SD_BUS_STAT, &stat);
143 RTSX_READ_REG(chip, REG_SD_STAT1, &stat);
145 if (!(stat & SD_DAT0_STATUS)) {
146 sd_set_err_code(chip, SD_BUSY);
147 TRACE_RET(chip, STATUS_FAIL);
150 return STATUS_SUCCESS;
153 static int sd_send_cmd_get_rsp(struct rtsx_chip *chip, u8 cmd_idx,
154 u32 arg, u8 rsp_type, u8 *rsp, int rsp_len)
156 struct sd_info *sd_card = &(chip->sd_card);
164 sd_clr_err_code(chip);
166 RTSX_DEBUGP("SD/MMC CMD %d, arg = 0x%08x\n", cmd_idx, arg);
168 if (rsp_type == SD_RSP_TYPE_R1b)
175 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | cmd_idx);
176 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, (u8)(arg >> 24));
177 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, (u8)(arg >> 16));
178 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, (u8)(arg >> 8));
179 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, (u8)arg);
181 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
182 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
183 0x01, PINGPONG_BUFFER);
184 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
185 0xFF, SD_TM_CMD_RSP | SD_TRANSFER_START);
186 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
187 SD_TRANSFER_END | SD_STAT_IDLE, SD_TRANSFER_END | SD_STAT_IDLE);
189 if (rsp_type == SD_RSP_TYPE_R2) {
190 for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16; reg_addr++)
191 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
194 } else if (rsp_type != SD_RSP_TYPE_R0) {
195 for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4; reg_addr++)
196 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
201 rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_STAT1, 0, 0);
203 retval = rtsx_send_cmd(chip, SD_CARD, timeout);
207 rtsx_read_register(chip, REG_SD_STAT1, &val);
208 RTSX_DEBUGP("SD_STAT1: 0x%x\n", val);
210 if (CHECK_PID(chip, 0x5209)) {
211 rtsx_read_register(chip, REG_SD_STAT2, &val);
212 RTSX_DEBUGP("SD_STAT2: 0x%x\n", val);
214 if (val & SD_RSP_80CLK_TIMEOUT) {
215 rtsx_clear_sd_error(chip);
216 sd_set_err_code(chip, SD_RSP_TIMEOUT);
217 TRACE_RET(chip, STATUS_FAIL);
220 rtsx_read_register(chip, REG_SD_BUS_STAT, &val);
221 RTSX_DEBUGP("SD_BUS_STAT: 0x%x\n", val);
223 rtsx_read_register(chip, REG_SD_CFG3, &val);
224 RTSX_DEBUGP("SD_CFG3: 0x%x\n", val);
227 if (retval == -ETIMEDOUT) {
228 if (rsp_type & SD_WAIT_BUSY_END) {
229 retval = sd_check_data0_status(chip);
230 if (retval != STATUS_SUCCESS) {
231 rtsx_clear_sd_error(chip);
232 TRACE_RET(chip, retval);
235 sd_set_err_code(chip, SD_TO_ERR);
237 retval = STATUS_TIMEDOUT;
239 retval = STATUS_FAIL;
241 rtsx_clear_sd_error(chip);
243 TRACE_RET(chip, retval);
246 if (rsp_type == SD_RSP_TYPE_R0)
247 return STATUS_SUCCESS;
249 ptr = rtsx_get_cmd_data(chip) + 1;
251 if ((ptr[0] & 0xC0) != 0) {
252 sd_set_err_code(chip, SD_STS_ERR);
253 TRACE_RET(chip, STATUS_FAIL);
256 if (!(rsp_type & SD_NO_CHECK_CRC7)) {
257 if (ptr[stat_idx] & SD_CRC7_ERR) {
258 if (cmd_idx == WRITE_MULTIPLE_BLOCK) {
259 sd_set_err_code(chip, SD_CRC_ERR);
260 TRACE_RET(chip, STATUS_FAIL);
262 if (rty_cnt < SD_MAX_RETRY_COUNT) {
267 sd_set_err_code(chip, SD_CRC_ERR);
268 TRACE_RET(chip, STATUS_FAIL);
273 if ((rsp_type == SD_RSP_TYPE_R1) || (rsp_type == SD_RSP_TYPE_R1b)) {
274 if ((cmd_idx != SEND_RELATIVE_ADDR) && (cmd_idx != SEND_IF_COND)) {
275 if (cmd_idx != STOP_TRANSMISSION) {
277 TRACE_RET(chip, STATUS_FAIL);
279 #ifdef SUPPORT_SD_LOCK
285 RTSX_DEBUGP("ptr[1]: 0x%02x\n", ptr[1]);
286 TRACE_RET(chip, STATUS_FAIL);
289 RTSX_DEBUGP("ptr[2]: 0x%02x\n", ptr[2]);
290 TRACE_RET(chip, STATUS_FAIL);
293 RTSX_DEBUGP("ptr[3]: 0x%02x\n", ptr[3]);
294 TRACE_RET(chip, STATUS_FAIL);
297 sd_card->sd_data_buf_ready = 1;
299 sd_card->sd_data_buf_ready = 0;
304 memcpy(rsp, ptr, rsp_len);
306 return STATUS_SUCCESS;
309 static int sd_read_data(struct rtsx_chip *chip,
310 u8 trans_mode, u8 *cmd, int cmd_len, u16 byte_cnt,
311 u16 blk_cnt, u8 bus_width, u8 *buf, int buf_len,
314 struct sd_info *sd_card = &(chip->sd_card);
318 sd_clr_err_code(chip);
324 TRACE_RET(chip, STATUS_FAIL);
329 RTSX_DEBUGP("SD/MMC CMD %d\n", cmd[0] - 0x40);
330 for (i = 0; i < (cmd_len < 6 ? cmd_len : 6); i++)
331 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0 + i, 0xFF, cmd[i]);
333 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, (u8)byte_cnt);
334 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, (u8)(byte_cnt >> 8));
335 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, (u8)blk_cnt);
336 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, (u8)(blk_cnt >> 8));
338 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
340 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
341 SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
342 SD_CHECK_CRC7 | SD_RSP_LEN_6);
343 if (trans_mode != SD_TM_AUTO_TUNING)
344 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
346 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF, trans_mode | SD_TRANSFER_START);
347 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
349 retval = rtsx_send_cmd(chip, SD_CARD, timeout);
351 if (retval == -ETIMEDOUT) {
352 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
353 SD_RSP_TYPE_R1, NULL, 0);
356 TRACE_RET(chip, STATUS_FAIL);
359 if (buf && buf_len) {
360 retval = rtsx_read_ppbuf(chip, buf, buf_len);
361 if (retval != STATUS_SUCCESS)
362 TRACE_RET(chip, STATUS_FAIL);
365 return STATUS_SUCCESS;
368 static int sd_write_data(struct rtsx_chip *chip, u8 trans_mode,
369 u8 *cmd, int cmd_len, u16 byte_cnt, u16 blk_cnt, u8 bus_width,
370 u8 *buf, int buf_len, int timeout)
372 struct sd_info *sd_card = &(chip->sd_card);
376 sd_clr_err_code(chip);
382 /* This function can't write data more than one page */
383 TRACE_RET(chip, STATUS_FAIL);
386 if (buf && buf_len) {
387 retval = rtsx_write_ppbuf(chip, buf, buf_len);
388 if (retval != STATUS_SUCCESS)
389 TRACE_RET(chip, STATUS_FAIL);
395 RTSX_DEBUGP("SD/MMC CMD %d\n", cmd[0] - 0x40);
396 for (i = 0; i < (cmd_len < 6 ? cmd_len : 6); i++) {
397 rtsx_add_cmd(chip, WRITE_REG_CMD,
398 REG_SD_CMD0 + i, 0xFF, cmd[i]);
401 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, (u8)byte_cnt);
402 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, (u8)(byte_cnt >> 8));
403 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, (u8)blk_cnt);
404 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, (u8)(blk_cnt >> 8));
406 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
408 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
409 SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
410 SD_CHECK_CRC7 | SD_RSP_LEN_6);
412 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF, trans_mode | SD_TRANSFER_START);
413 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
415 retval = rtsx_send_cmd(chip, SD_CARD, timeout);
417 if (retval == -ETIMEDOUT) {
418 sd_send_cmd_get_rsp(chip, SEND_STATUS,
419 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
422 TRACE_RET(chip, STATUS_FAIL);
425 return STATUS_SUCCESS;
428 static int sd_check_csd(struct rtsx_chip *chip, char check_wp)
430 struct sd_info *sd_card = &(chip->sd_card);
433 u8 csd_ver, trans_speed;
436 for (i = 0; i < 6; i++) {
437 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
438 sd_set_err_code(chip, SD_NO_CARD);
439 TRACE_RET(chip, STATUS_FAIL);
442 retval = sd_send_cmd_get_rsp(chip, SEND_CSD, sd_card->sd_addr, SD_RSP_TYPE_R2, rsp, 16);
443 if (retval == STATUS_SUCCESS)
448 TRACE_RET(chip, STATUS_FAIL);
450 memcpy(sd_card->raw_csd, rsp + 1, 15);
452 if (CHECK_PID(chip, 0x5209))
453 RTSX_READ_REG(chip, REG_SD_CMD5, sd_card->raw_csd + 15);
455 RTSX_DEBUGP("CSD Response:\n");
456 RTSX_DUMP(sd_card->raw_csd, 16);
458 csd_ver = (rsp[1] & 0xc0) >> 6;
459 RTSX_DEBUGP("csd_ver = %d\n", csd_ver);
461 trans_speed = rsp[4];
462 if ((trans_speed & 0x07) == 0x02) {
463 if ((trans_speed & 0xf8) >= 0x30) {
465 sd_card->sd_clock = 47;
467 sd_card->sd_clock = CLK_50;
469 } else if ((trans_speed & 0xf8) == 0x28) {
471 sd_card->sd_clock = 39;
473 sd_card->sd_clock = CLK_40;
475 } else if ((trans_speed & 0xf8) == 0x20) {
477 sd_card->sd_clock = 29;
479 sd_card->sd_clock = CLK_30;
481 } else if ((trans_speed & 0xf8) >= 0x10) {
483 sd_card->sd_clock = 23;
485 sd_card->sd_clock = CLK_20;
487 } else if ((trans_speed & 0x08) >= 0x08) {
489 sd_card->sd_clock = 19;
491 sd_card->sd_clock = CLK_20;
493 TRACE_RET(chip, STATUS_FAIL);
496 TRACE_RET(chip, STATUS_FAIL);
499 if (CHK_MMC_SECTOR_MODE(sd_card)) {
500 sd_card->capacity = 0;
502 if ((!CHK_SD_HCXC(sd_card)) || (csd_ver == 0)) {
503 u8 blk_size, c_size_mult;
505 blk_size = rsp[6] & 0x0F;
506 c_size = ((u16)(rsp[7] & 0x03) << 10)
508 + ((u16)(rsp[9] & 0xC0) >> 6);
509 c_size_mult = (u8)((rsp[10] & 0x03) << 1);
510 c_size_mult += (rsp[11] & 0x80) >> 7;
511 sd_card->capacity = (((u32)(c_size + 1)) * (1 << (c_size_mult + 2))) << (blk_size - 9);
513 u32 total_sector = 0;
514 total_sector = (((u32)rsp[8] & 0x3f) << 16) |
515 ((u32)rsp[9] << 8) | (u32)rsp[10];
516 sd_card->capacity = (total_sector + 1) << 10;
522 chip->card_wp |= SD_CARD;
524 RTSX_DEBUGP("CSD WP Status: 0x%x\n", rsp[15]);
527 return STATUS_SUCCESS;
530 static int sd_set_sample_push_timing(struct rtsx_chip *chip)
532 struct sd_info *sd_card = &(chip->sd_card);
534 if (CHECK_PID(chip, 0x5209)) {
535 if (CHK_SD_SDR104(sd_card) || CHK_SD_SDR50(sd_card)) {
536 RTSX_WRITE_REG(chip, SD_CFG1, 0x0C | SD_ASYNC_FIFO_NOT_RST,
537 SD_30_MODE | SD_ASYNC_FIFO_NOT_RST);
538 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, CLK_LOW_FREQ);
539 RTSX_WRITE_REG(chip, CARD_CLK_SOURCE, 0xFF,
540 CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
541 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, 0);
542 } else if (CHK_SD_DDR50(sd_card) || CHK_MMC_DDR52(sd_card)) {
543 RTSX_WRITE_REG(chip, SD_CFG1, 0x0C | SD_ASYNC_FIFO_NOT_RST,
544 SD_DDR_MODE | SD_ASYNC_FIFO_NOT_RST);
545 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, CLK_LOW_FREQ);
546 RTSX_WRITE_REG(chip, CARD_CLK_SOURCE, 0xFF,
547 CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
548 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, 0);
549 RTSX_WRITE_REG(chip, SD_PUSH_POINT_CTL, DDR_VAR_TX_CMD_DAT,
551 RTSX_WRITE_REG(chip, SD_SAMPLE_POINT_CTL, DDR_VAR_RX_DAT | DDR_VAR_RX_CMD,
552 DDR_VAR_RX_DAT | DDR_VAR_RX_CMD);
556 RTSX_WRITE_REG(chip, SD_CFG1, 0x0C, SD_20_MODE);
557 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, CLK_LOW_FREQ);
558 RTSX_WRITE_REG(chip, CARD_CLK_SOURCE, 0xFF,
559 CRC_FIX_CLK | SD30_VAR_CLK0 | SAMPLE_VAR_CLK1);
560 RTSX_WRITE_REG(chip, CLK_CTL, CLK_LOW_FREQ, 0);
562 if ((chip->sd_ctl & SD_PUSH_POINT_CTL_MASK) == SD_PUSH_POINT_AUTO)
563 val = SD20_TX_NEG_EDGE;
564 else if ((chip->sd_ctl & SD_PUSH_POINT_CTL_MASK) == SD_PUSH_POINT_DELAY)
565 val = SD20_TX_14_AHEAD;
567 val = SD20_TX_NEG_EDGE;
569 RTSX_WRITE_REG(chip, SD_PUSH_POINT_CTL, SD20_TX_SEL_MASK, val);
571 if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) == SD_SAMPLE_POINT_AUTO) {
572 if (chip->asic_code) {
573 if (CHK_SD_HS(sd_card) || CHK_MMC_52M(sd_card))
574 val = SD20_RX_14_DELAY;
576 val = SD20_RX_POS_EDGE;
578 val = SD20_RX_14_DELAY;
580 } else if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) == SD_SAMPLE_POINT_DELAY) {
581 val = SD20_RX_14_DELAY;
583 val = SD20_RX_POS_EDGE;
585 RTSX_WRITE_REG(chip, SD_SAMPLE_POINT_CTL, SD20_RX_SEL_MASK, val);
590 if ((chip->sd_ctl & SD_PUSH_POINT_CTL_MASK) == SD_PUSH_POINT_DELAY)
593 if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) == SD_SAMPLE_POINT_AUTO) {
594 if (chip->asic_code) {
595 if (CHK_SD_HS(sd_card) || CHK_MMC_52M(sd_card)) {
607 } else if ((chip->sd_ctl & SD_SAMPLE_POINT_CTL_MASK) == SD_SAMPLE_POINT_DELAY) {
614 RTSX_WRITE_REG(chip, REG_SD_CFG1, 0x1C, val);
617 return STATUS_SUCCESS;
620 static void sd_choose_proper_clock(struct rtsx_chip *chip)
622 struct sd_info *sd_card = &(chip->sd_card);
624 if (CHK_SD_SDR104(sd_card)) {
626 sd_card->sd_clock = chip->asic_sd_sdr104_clk;
628 sd_card->sd_clock = chip->fpga_sd_sdr104_clk;
630 } else if (CHK_SD_DDR50(sd_card)) {
632 sd_card->sd_clock = chip->asic_sd_ddr50_clk;
634 sd_card->sd_clock = chip->fpga_sd_ddr50_clk;
636 } else if (CHK_SD_SDR50(sd_card)) {
638 sd_card->sd_clock = chip->asic_sd_sdr50_clk;
640 sd_card->sd_clock = chip->fpga_sd_sdr50_clk;
642 } else if (CHK_SD_HS(sd_card)) {
644 sd_card->sd_clock = chip->asic_sd_hs_clk;
646 sd_card->sd_clock = chip->fpga_sd_hs_clk;
648 } else if (CHK_MMC_52M(sd_card) || CHK_MMC_DDR52(sd_card)) {
650 sd_card->sd_clock = chip->asic_mmc_52m_clk;
652 sd_card->sd_clock = chip->fpga_mmc_52m_clk;
654 } else if (CHK_MMC_26M(sd_card)) {
656 sd_card->sd_clock = 48;
658 sd_card->sd_clock = CLK_50;
662 static int sd_set_clock_divider(struct rtsx_chip *chip, u8 clk_div)
664 u8 mask = 0, val = 0;
666 if (CHECK_PID(chip, 0x5209)) {
667 mask = SD_CLK_DIVIDE_MASK;
671 if (clk_div == SD_CLK_DIVIDE_0)
673 else if (clk_div == SD_CLK_DIVIDE_128)
675 else if (clk_div == SD_CLK_DIVIDE_256)
679 RTSX_WRITE_REG(chip, REG_SD_CFG1, mask, val);
681 return STATUS_SUCCESS;
684 static int sd_set_init_para(struct rtsx_chip *chip)
686 struct sd_info *sd_card = &(chip->sd_card);
689 retval = sd_set_sample_push_timing(chip);
690 if (retval != STATUS_SUCCESS)
691 TRACE_RET(chip, STATUS_FAIL);
693 sd_choose_proper_clock(chip);
695 retval = switch_clock(chip, sd_card->sd_clock);
696 if (retval != STATUS_SUCCESS)
697 TRACE_RET(chip, STATUS_FAIL);
699 return STATUS_SUCCESS;
702 int sd_select_card(struct rtsx_chip *chip, int select)
704 struct sd_info *sd_card = &(chip->sd_card);
706 u8 cmd_idx, cmd_type;
710 cmd_idx = SELECT_CARD;
711 cmd_type = SD_RSP_TYPE_R1;
712 addr = sd_card->sd_addr;
714 cmd_idx = DESELECT_CARD;
715 cmd_type = SD_RSP_TYPE_R0;
719 retval = sd_send_cmd_get_rsp(chip, cmd_idx, addr, cmd_type, NULL, 0);
720 if (retval != STATUS_SUCCESS)
721 TRACE_RET(chip, STATUS_FAIL);
723 return STATUS_SUCCESS;
726 #ifdef SUPPORT_SD_LOCK
727 static int sd_update_lock_status(struct rtsx_chip *chip)
729 struct sd_info *sd_card = &(chip->sd_card);
733 retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1, rsp, 5);
734 if (retval != STATUS_SUCCESS)
735 TRACE_RET(chip, STATUS_FAIL);
738 sd_card->sd_lock_status |= SD_LOCKED;
740 sd_card->sd_lock_status &= ~SD_LOCKED;
742 RTSX_DEBUGP("sd_card->sd_lock_status = 0x%x\n", sd_card->sd_lock_status);
745 TRACE_RET(chip, STATUS_FAIL);
747 return STATUS_SUCCESS;
751 static int sd_wait_state_data_ready(struct rtsx_chip *chip, u8 state, u8 data_ready, int polling_cnt)
753 struct sd_info *sd_card = &(chip->sd_card);
757 for (i = 0; i < polling_cnt; i++) {
758 retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
759 sd_card->sd_addr, SD_RSP_TYPE_R1, rsp, 5);
760 if (retval != STATUS_SUCCESS)
761 TRACE_RET(chip, STATUS_FAIL);
763 if (((rsp[3] & 0x1E) == state) && ((rsp[3] & 0x01) == data_ready))
764 return STATUS_SUCCESS;
767 TRACE_RET(chip, STATUS_FAIL);
770 static int sd_change_bank_voltage(struct rtsx_chip *chip, u8 voltage)
774 if (voltage == SD_IO_3V3) {
775 if (chip->asic_code) {
776 retval = rtsx_write_phy_register(chip, 0x08, 0x4FC0 | chip->phy_voltage);
777 if (retval != STATUS_SUCCESS) {
778 TRACE_RET(chip, STATUS_FAIL);
781 RTSX_WRITE_REG(chip, SD_PAD_CTL, SD_IO_USING_1V8, 0);
783 } else if (voltage == SD_IO_1V8) {
784 if (chip->asic_code) {
785 retval = rtsx_write_phy_register(chip, 0x08, 0x4C40 | chip->phy_voltage);
786 if (retval != STATUS_SUCCESS) {
787 TRACE_RET(chip, STATUS_FAIL);
790 RTSX_WRITE_REG(chip, SD_PAD_CTL, SD_IO_USING_1V8, SD_IO_USING_1V8);
793 TRACE_RET(chip, STATUS_FAIL);
796 return STATUS_SUCCESS;
799 static int sd_voltage_switch(struct rtsx_chip *chip)
804 RTSX_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, SD_CLK_TOGGLE_EN);
806 retval = sd_send_cmd_get_rsp(chip, VOLTAGE_SWITCH, 0, SD_RSP_TYPE_R1, NULL, 0);
807 if (retval != STATUS_SUCCESS) {
808 TRACE_RET(chip, STATUS_FAIL);
811 udelay(chip->sd_voltage_switch_delay);
813 RTSX_READ_REG(chip, SD_BUS_STAT, &stat);
814 if (stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
815 SD_DAT1_STATUS | SD_DAT0_STATUS)) {
816 TRACE_RET(chip, STATUS_FAIL);
819 RTSX_WRITE_REG(chip, SD_BUS_STAT, 0xFF, SD_CLK_FORCE_STOP);
820 retval = sd_change_bank_voltage(chip, SD_IO_1V8);
821 if (retval != STATUS_SUCCESS) {
822 TRACE_RET(chip, STATUS_FAIL);
826 RTSX_WRITE_REG(chip, SD_BUS_STAT, 0xFF, SD_CLK_TOGGLE_EN);
829 RTSX_READ_REG(chip, SD_BUS_STAT, &stat);
830 if ((stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
831 SD_DAT1_STATUS | SD_DAT0_STATUS)) !=
832 (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
833 SD_DAT1_STATUS | SD_DAT0_STATUS)) {
834 RTSX_DEBUGP("SD_BUS_STAT: 0x%x\n", stat);
835 rtsx_write_register(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
836 rtsx_write_register(chip, CARD_CLK_EN, 0xFF, 0);
837 TRACE_RET(chip, STATUS_FAIL);
840 RTSX_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
842 return STATUS_SUCCESS;
845 static int sd_reset_dcm(struct rtsx_chip *chip, u8 tune_dir)
847 if (tune_dir == TUNE_RX) {
848 RTSX_WRITE_REG(chip, DCM_DRP_CTL, 0xFF, DCM_RESET | DCM_RX);
849 RTSX_WRITE_REG(chip, DCM_DRP_CTL, 0xFF, DCM_RX);
851 RTSX_WRITE_REG(chip, DCM_DRP_CTL, 0xFF, DCM_RESET | DCM_TX);
852 RTSX_WRITE_REG(chip, DCM_DRP_CTL, 0xFF, DCM_TX);
855 return STATUS_SUCCESS;
858 static int sd_change_phase(struct rtsx_chip *chip, u8 sample_point, u8 tune_dir)
860 struct sd_info *sd_card = &(chip->sd_card);
861 u16 SD_VP_CTL, SD_DCMPS_CTL;
866 RTSX_DEBUGP("sd_change_phase (sample_point = %d, tune_dir = %d)\n",
867 sample_point, tune_dir);
869 if (tune_dir == TUNE_RX) {
870 SD_VP_CTL = SD_VPRX_CTL;
871 SD_DCMPS_CTL = SD_DCMPS_RX_CTL;
872 if (CHK_SD_DDR50(sd_card)) {
876 SD_VP_CTL = SD_VPTX_CTL;
877 SD_DCMPS_CTL = SD_DCMPS_TX_CTL;
880 if (chip->asic_code) {
881 RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, CHANGE_CLK);
882 RTSX_WRITE_REG(chip, SD_VP_CTL, 0x1F, sample_point);
883 RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0);
884 RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET);
885 RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0);
887 #ifdef CONFIG_RTS_PSTOR_DEBUG
888 rtsx_read_register(chip, SD_VP_CTL, &val);
889 RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val);
890 rtsx_read_register(chip, SD_DCMPS_CTL, &val);
891 RTSX_DEBUGP("SD_DCMPS_CTL: 0x%x\n", val);
895 RTSX_WRITE_REG(chip, SD_VP_CTL, PHASE_CHANGE, PHASE_CHANGE);
897 RTSX_WRITE_REG(chip, SD_VP_CTL, 0xFF,
898 PHASE_CHANGE | PHASE_NOT_RESET | sample_point);
900 RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, CHANGE_CLK);
902 RTSX_WRITE_REG(chip, SD_VP_CTL, 0xFF,
903 PHASE_NOT_RESET | sample_point);
908 rtsx_add_cmd(chip, WRITE_REG_CMD, SD_DCMPS_CTL, DCMPS_CHANGE, DCMPS_CHANGE);
909 rtsx_add_cmd(chip, CHECK_REG_CMD, SD_DCMPS_CTL, DCMPS_CHANGE_DONE, DCMPS_CHANGE_DONE);
910 retval = rtsx_send_cmd(chip, SD_CARD, 100);
911 if (retval != STATUS_SUCCESS) {
912 TRACE_GOTO(chip, Fail);
915 val = *rtsx_get_cmd_data(chip);
916 if (val & DCMPS_ERROR) {
917 TRACE_GOTO(chip, Fail);
919 if ((val & DCMPS_CURRENT_PHASE) != sample_point) {
920 TRACE_GOTO(chip, Fail);
922 RTSX_WRITE_REG(chip, SD_DCMPS_CTL, DCMPS_CHANGE, 0);
924 RTSX_WRITE_REG(chip, SD_VP_CTL, PHASE_CHANGE, 0);
926 RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0);
931 RTSX_WRITE_REG(chip, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0);
933 return STATUS_SUCCESS;
936 #ifdef CONFIG_RTS_PSTOR_DEBUG
937 rtsx_read_register(chip, SD_VP_CTL, &val);
938 RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val);
939 rtsx_read_register(chip, SD_DCMPS_CTL, &val);
940 RTSX_DEBUGP("SD_DCMPS_CTL: 0x%x\n", val);
943 rtsx_write_register(chip, SD_DCMPS_CTL, DCMPS_CHANGE, 0);
944 rtsx_write_register(chip, SD_VP_CTL, PHASE_CHANGE, 0);
946 sd_reset_dcm(chip, tune_dir);
950 static int sd_check_spec(struct rtsx_chip *chip, u8 bus_width)
952 struct sd_info *sd_card = &(chip->sd_card);
956 retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
957 if (retval != STATUS_SUCCESS) {
958 TRACE_RET(chip, STATUS_FAIL);
961 cmd[0] = 0x40 | SEND_SCR;
967 retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 8, 1, bus_width, buf, 8, 250);
968 if (retval != STATUS_SUCCESS) {
969 rtsx_clear_sd_error(chip);
970 TRACE_RET(chip, STATUS_FAIL);
973 memcpy(sd_card->raw_scr, buf, 8);
975 if ((buf[0] & 0x0F) == 0) {
976 TRACE_RET(chip, STATUS_FAIL);
979 return STATUS_SUCCESS;
982 static int sd_query_switch_result(struct rtsx_chip *chip, u8 func_group, u8 func_to_switch,
983 u8 *buf, int buf_len)
985 u8 support_mask = 0, query_switch = 0, switch_busy = 0;
986 int support_offset = 0, query_switch_offset = 0, check_busy_offset = 0;
988 if (func_group == SD_FUNC_GROUP_1) {
989 support_offset = FUNCTION_GROUP1_SUPPORT_OFFSET;
990 query_switch_offset = FUNCTION_GROUP1_QUERY_SWITCH_OFFSET;
991 check_busy_offset = FUNCTION_GROUP1_CHECK_BUSY_OFFSET;
993 switch (func_to_switch) {
995 support_mask = HS_SUPPORT_MASK;
996 query_switch = HS_QUERY_SWITCH_OK;
997 switch_busy = HS_SWITCH_BUSY;
1001 support_mask = SDR50_SUPPORT_MASK;
1002 query_switch = SDR50_QUERY_SWITCH_OK;
1003 switch_busy = SDR50_SWITCH_BUSY;
1006 case SDR104_SUPPORT:
1007 support_mask = SDR104_SUPPORT_MASK;
1008 query_switch = SDR104_QUERY_SWITCH_OK;
1009 switch_busy = SDR104_SWITCH_BUSY;
1013 support_mask = DDR50_SUPPORT_MASK;
1014 query_switch = DDR50_QUERY_SWITCH_OK;
1015 switch_busy = DDR50_SWITCH_BUSY;
1019 TRACE_RET(chip, STATUS_FAIL);
1021 } else if (func_group == SD_FUNC_GROUP_3) {
1022 support_offset = FUNCTION_GROUP3_SUPPORT_OFFSET;
1023 query_switch_offset = FUNCTION_GROUP3_QUERY_SWITCH_OFFSET;
1024 check_busy_offset = FUNCTION_GROUP3_CHECK_BUSY_OFFSET;
1026 switch (func_to_switch) {
1027 case DRIVING_TYPE_A:
1028 support_mask = DRIVING_TYPE_A_MASK;
1029 query_switch = TYPE_A_QUERY_SWITCH_OK;
1030 switch_busy = TYPE_A_SWITCH_BUSY;
1033 case DRIVING_TYPE_C:
1034 support_mask = DRIVING_TYPE_C_MASK;
1035 query_switch = TYPE_C_QUERY_SWITCH_OK;
1036 switch_busy = TYPE_C_SWITCH_BUSY;
1039 case DRIVING_TYPE_D:
1040 support_mask = DRIVING_TYPE_D_MASK;
1041 query_switch = TYPE_D_QUERY_SWITCH_OK;
1042 switch_busy = TYPE_D_SWITCH_BUSY;
1046 TRACE_RET(chip, STATUS_FAIL);
1048 } else if (func_group == SD_FUNC_GROUP_4) {
1049 support_offset = FUNCTION_GROUP4_SUPPORT_OFFSET;
1050 query_switch_offset = FUNCTION_GROUP4_QUERY_SWITCH_OFFSET;
1051 check_busy_offset = FUNCTION_GROUP4_CHECK_BUSY_OFFSET;
1053 switch (func_to_switch) {
1054 case CURRENT_LIMIT_400:
1055 support_mask = CURRENT_LIMIT_400_MASK;
1056 query_switch = CURRENT_LIMIT_400_QUERY_SWITCH_OK;
1057 switch_busy = CURRENT_LIMIT_400_SWITCH_BUSY;
1060 case CURRENT_LIMIT_600:
1061 support_mask = CURRENT_LIMIT_600_MASK;
1062 query_switch = CURRENT_LIMIT_600_QUERY_SWITCH_OK;
1063 switch_busy = CURRENT_LIMIT_600_SWITCH_BUSY;
1066 case CURRENT_LIMIT_800:
1067 support_mask = CURRENT_LIMIT_800_MASK;
1068 query_switch = CURRENT_LIMIT_800_QUERY_SWITCH_OK;
1069 switch_busy = CURRENT_LIMIT_800_SWITCH_BUSY;
1073 TRACE_RET(chip, STATUS_FAIL);
1076 TRACE_RET(chip, STATUS_FAIL);
1079 if (func_group == SD_FUNC_GROUP_1) {
1080 if (!(buf[support_offset] & support_mask) ||
1081 ((buf[query_switch_offset] & 0x0F) != query_switch)) {
1082 TRACE_RET(chip, STATUS_FAIL);
1086 /* Check 'Busy Status' */
1087 if ((buf[DATA_STRUCTURE_VER_OFFSET] == 0x01) &&
1088 ((buf[check_busy_offset] & switch_busy) == switch_busy)) {
1089 TRACE_RET(chip, STATUS_FAIL);
1092 return STATUS_SUCCESS;
1095 static int sd_check_switch_mode(struct rtsx_chip *chip, u8 mode,
1096 u8 func_group, u8 func_to_switch, u8 bus_width)
1098 struct sd_info *sd_card = &(chip->sd_card);
1102 RTSX_DEBUGP("sd_check_switch_mode (mode = %d, func_group = %d, func_to_switch = %d)\n",
1103 mode, func_group, func_to_switch);
1105 cmd[0] = 0x40 | SWITCH;
1108 if (func_group == SD_FUNC_GROUP_1) {
1111 cmd[4] = 0xF0 + func_to_switch;
1112 } else if (func_group == SD_FUNC_GROUP_3) {
1114 cmd[3] = 0xF0 + func_to_switch;
1116 } else if (func_group == SD_FUNC_GROUP_4) {
1118 cmd[3] = 0x0F + (func_to_switch << 4);
1121 cmd[1] = SD_CHECK_MODE;
1127 retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1, bus_width, buf, 64, 250);
1128 if (retval != STATUS_SUCCESS) {
1129 rtsx_clear_sd_error(chip);
1130 TRACE_RET(chip, STATUS_FAIL);
1135 if (func_group == NO_ARGUMENT) {
1136 sd_card->func_group1_mask = buf[0x0D];
1137 sd_card->func_group2_mask = buf[0x0B];
1138 sd_card->func_group3_mask = buf[0x09];
1139 sd_card->func_group4_mask = buf[0x07];
1141 RTSX_DEBUGP("func_group1_mask = 0x%02x\n", buf[0x0D]);
1142 RTSX_DEBUGP("func_group2_mask = 0x%02x\n", buf[0x0B]);
1143 RTSX_DEBUGP("func_group3_mask = 0x%02x\n", buf[0x09]);
1144 RTSX_DEBUGP("func_group4_mask = 0x%02x\n", buf[0x07]);
1146 /* Maximum current consumption, check whether current is acceptable;
1147 * bit[511:496] = 0x0000 means some error happened.
1149 u16 cc = ((u16)buf[0] << 8) | buf[1];
1150 RTSX_DEBUGP("Maximum current consumption: %dmA\n", cc);
1151 if ((cc == 0) || (cc > 800)) {
1152 TRACE_RET(chip, STATUS_FAIL);
1154 retval = sd_query_switch_result(chip, func_group, func_to_switch, buf, 64);
1155 if (retval != STATUS_SUCCESS) {
1156 TRACE_RET(chip, STATUS_FAIL);
1159 if ((cc > 400) || (func_to_switch > CURRENT_LIMIT_400)) {
1160 RTSX_WRITE_REG(chip, OCPPARA2, SD_OCP_THD_MASK, chip->sd_800mA_ocp_thd);
1161 RTSX_WRITE_REG(chip, CARD_PWR_CTL, PMOS_STRG_MASK, PMOS_STRG_800mA);
1165 return STATUS_SUCCESS;
1168 static u8 downgrade_switch_mode(u8 func_group, u8 func_to_switch)
1170 if (func_group == SD_FUNC_GROUP_1) {
1171 if (func_to_switch > HS_SUPPORT) {
1174 } else if (func_group == SD_FUNC_GROUP_4) {
1175 if (func_to_switch > CURRENT_LIMIT_200) {
1180 return func_to_switch;
1183 static int sd_check_switch(struct rtsx_chip *chip,
1184 u8 func_group, u8 func_to_switch, u8 bus_width)
1188 int switch_good = 0;
1190 for (i = 0; i < 3; i++) {
1191 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1192 sd_set_err_code(chip, SD_NO_CARD);
1193 TRACE_RET(chip, STATUS_FAIL);
1196 retval = sd_check_switch_mode(chip, SD_CHECK_MODE, func_group,
1197 func_to_switch, bus_width);
1198 if (retval == STATUS_SUCCESS) {
1201 retval = sd_check_switch_mode(chip, SD_SWITCH_MODE,
1202 func_group, func_to_switch, bus_width);
1203 if (retval == STATUS_SUCCESS) {
1208 RTSX_READ_REG(chip, SD_STAT1, &stat);
1209 if (stat & SD_CRC16_ERR) {
1210 RTSX_DEBUGP("SD CRC16 error when switching mode\n");
1211 TRACE_RET(chip, STATUS_FAIL);
1215 func_to_switch = downgrade_switch_mode(func_group, func_to_switch);
1221 TRACE_RET(chip, STATUS_FAIL);
1224 return STATUS_SUCCESS;
1227 static int sd_switch_function(struct rtsx_chip *chip, u8 bus_width)
1229 struct sd_info *sd_card = &(chip->sd_card);
1232 u8 func_to_switch = 0;
1234 /* Get supported functions */
1235 retval = sd_check_switch_mode(chip, SD_CHECK_MODE,
1236 NO_ARGUMENT, NO_ARGUMENT, bus_width);
1237 if (retval != STATUS_SUCCESS) {
1238 TRACE_RET(chip, STATUS_FAIL);
1241 sd_card->func_group1_mask &= ~(sd_card->sd_switch_fail);
1243 /* Function Group 1: Access Mode */
1244 for (i = 0; i < 4; i++) {
1245 switch ((u8)(chip->sd_speed_prior >> (i*8))) {
1246 case SDR104_SUPPORT:
1247 if ((sd_card->func_group1_mask & SDR104_SUPPORT_MASK)
1248 && chip->sdr104_en) {
1249 func_to_switch = SDR104_SUPPORT;
1254 if ((sd_card->func_group1_mask & DDR50_SUPPORT_MASK)
1255 && chip->ddr50_en) {
1256 func_to_switch = DDR50_SUPPORT;
1261 if ((sd_card->func_group1_mask & SDR50_SUPPORT_MASK)
1262 && chip->sdr50_en) {
1263 func_to_switch = SDR50_SUPPORT;
1268 if (sd_card->func_group1_mask & HS_SUPPORT_MASK) {
1269 func_to_switch = HS_SUPPORT;
1278 if (func_to_switch) {
1282 RTSX_DEBUGP("SD_FUNC_GROUP_1: func_to_switch = 0x%02x", func_to_switch);
1284 #ifdef SUPPORT_SD_LOCK
1285 if ((sd_card->sd_lock_status & SD_SDR_RST)
1286 && (DDR50_SUPPORT == func_to_switch)
1287 && (sd_card->func_group1_mask & SDR50_SUPPORT_MASK)) {
1288 func_to_switch = SDR50_SUPPORT;
1289 RTSX_DEBUGP("Using SDR50 instead of DDR50 for SD Lock\n");
1293 if (func_to_switch) {
1294 retval = sd_check_switch(chip, SD_FUNC_GROUP_1, func_to_switch, bus_width);
1295 if (retval != STATUS_SUCCESS) {
1296 if (func_to_switch == SDR104_SUPPORT) {
1297 sd_card->sd_switch_fail = SDR104_SUPPORT_MASK;
1298 } else if (func_to_switch == DDR50_SUPPORT) {
1299 sd_card->sd_switch_fail =
1300 SDR104_SUPPORT_MASK | DDR50_SUPPORT_MASK;
1301 } else if (func_to_switch == SDR50_SUPPORT) {
1302 sd_card->sd_switch_fail =
1303 SDR104_SUPPORT_MASK | DDR50_SUPPORT_MASK |
1306 TRACE_RET(chip, STATUS_FAIL);
1309 if (func_to_switch == SDR104_SUPPORT) {
1310 SET_SD_SDR104(sd_card);
1311 } else if (func_to_switch == DDR50_SUPPORT) {
1312 SET_SD_DDR50(sd_card);
1313 } else if (func_to_switch == SDR50_SUPPORT) {
1314 SET_SD_SDR50(sd_card);
1320 if (CHK_SD_DDR50(sd_card)) {
1321 RTSX_WRITE_REG(chip, SD_PUSH_POINT_CTL, 0x06, 0x04);
1322 retval = sd_set_sample_push_timing(chip);
1323 if (retval != STATUS_SUCCESS) {
1324 TRACE_RET(chip, STATUS_FAIL);
1328 if (!func_to_switch || (func_to_switch == HS_SUPPORT)) {
1329 /* Do not try to switch current limit if the card doesn't
1330 * support UHS mode or we don't want it to support UHS mode
1332 return STATUS_SUCCESS;
1335 /* Function Group 4: Current Limit */
1336 func_to_switch = 0xFF;
1338 for (i = 0; i < 4; i++) {
1339 switch ((u8)(chip->sd_current_prior >> (i*8))) {
1340 case CURRENT_LIMIT_800:
1341 if (sd_card->func_group4_mask & CURRENT_LIMIT_800_MASK) {
1342 func_to_switch = CURRENT_LIMIT_800;
1346 case CURRENT_LIMIT_600:
1347 if (sd_card->func_group4_mask & CURRENT_LIMIT_600_MASK) {
1348 func_to_switch = CURRENT_LIMIT_600;
1352 case CURRENT_LIMIT_400:
1353 if (sd_card->func_group4_mask & CURRENT_LIMIT_400_MASK) {
1354 func_to_switch = CURRENT_LIMIT_400;
1358 case CURRENT_LIMIT_200:
1359 if (sd_card->func_group4_mask & CURRENT_LIMIT_200_MASK) {
1360 func_to_switch = CURRENT_LIMIT_200;
1368 if (func_to_switch != 0xFF) {
1373 RTSX_DEBUGP("SD_FUNC_GROUP_4: func_to_switch = 0x%02x", func_to_switch);
1375 if (func_to_switch <= CURRENT_LIMIT_800) {
1376 retval = sd_check_switch(chip, SD_FUNC_GROUP_4, func_to_switch, bus_width);
1377 if (retval != STATUS_SUCCESS) {
1378 if (sd_check_err_code(chip, SD_NO_CARD)) {
1379 TRACE_RET(chip, STATUS_FAIL);
1382 RTSX_DEBUGP("Switch current limit finished! (%d)\n", retval);
1385 if (CHK_SD_DDR50(sd_card)) {
1386 RTSX_WRITE_REG(chip, SD_PUSH_POINT_CTL, 0x06, 0);
1389 return STATUS_SUCCESS;
1392 static int sd_wait_data_idle(struct rtsx_chip *chip)
1394 int retval = STATUS_TIMEDOUT;
1398 for (i = 0; i < 100; i++) {
1399 RTSX_READ_REG(chip, SD_DATA_STATE, &val);
1400 if (val & SD_DATA_IDLE) {
1401 retval = STATUS_SUCCESS;
1406 RTSX_DEBUGP("SD_DATA_STATE: 0x%02x\n", val);
1411 static int sd_sdr_tuning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1416 retval = sd_change_phase(chip, sample_point, TUNE_RX);
1417 if (retval != STATUS_SUCCESS) {
1418 TRACE_RET(chip, STATUS_FAIL);
1421 cmd[0] = 0x40 | SEND_TUNING_PATTERN;
1427 retval = sd_read_data(chip, SD_TM_AUTO_TUNING,
1428 cmd, 5, 0x40, 1, SD_BUS_WIDTH_4, NULL, 0, 100);
1429 if (retval != STATUS_SUCCESS) {
1430 (void)sd_wait_data_idle(chip);
1432 rtsx_clear_sd_error(chip);
1433 TRACE_RET(chip, STATUS_FAIL);
1436 return STATUS_SUCCESS;
1439 static int sd_ddr_tuning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1441 struct sd_info *sd_card = &(chip->sd_card);
1445 retval = sd_change_phase(chip, sample_point, TUNE_RX);
1446 if (retval != STATUS_SUCCESS) {
1447 TRACE_RET(chip, STATUS_FAIL);
1450 RTSX_DEBUGP("sd ddr tuning rx\n");
1452 retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
1453 if (retval != STATUS_SUCCESS) {
1454 TRACE_RET(chip, STATUS_FAIL);
1457 cmd[0] = 0x40 | SD_STATUS;
1463 retval = sd_read_data(chip, SD_TM_NORMAL_READ,
1464 cmd, 5, 64, 1, SD_BUS_WIDTH_4, NULL, 0, 100);
1465 if (retval != STATUS_SUCCESS) {
1466 (void)sd_wait_data_idle(chip);
1468 rtsx_clear_sd_error(chip);
1469 TRACE_RET(chip, STATUS_FAIL);
1472 return STATUS_SUCCESS;
1475 static int mmc_ddr_tunning_rx_cmd(struct rtsx_chip *chip, u8 sample_point)
1477 struct sd_info *sd_card = &(chip->sd_card);
1479 u8 cmd[5], bus_width;
1481 if (CHK_MMC_8BIT(sd_card)) {
1482 bus_width = SD_BUS_WIDTH_8;
1483 } else if (CHK_MMC_4BIT(sd_card)) {
1484 bus_width = SD_BUS_WIDTH_4;
1486 bus_width = SD_BUS_WIDTH_1;
1489 retval = sd_change_phase(chip, sample_point, TUNE_RX);
1490 if (retval != STATUS_SUCCESS) {
1491 TRACE_RET(chip, STATUS_FAIL);
1494 RTSX_DEBUGP("mmc ddr tuning rx\n");
1496 cmd[0] = 0x40 | SEND_EXT_CSD;
1502 retval = sd_read_data(chip, SD_TM_NORMAL_READ,
1503 cmd, 5, 0x200, 1, bus_width, NULL, 0, 100);
1504 if (retval != STATUS_SUCCESS) {
1505 (void)sd_wait_data_idle(chip);
1507 rtsx_clear_sd_error(chip);
1508 TRACE_RET(chip, STATUS_FAIL);
1511 return STATUS_SUCCESS;
1514 static int sd_sdr_tuning_tx_cmd(struct rtsx_chip *chip, u8 sample_point)
1516 struct sd_info *sd_card = &(chip->sd_card);
1519 retval = sd_change_phase(chip, sample_point, TUNE_TX);
1520 if (retval != STATUS_SUCCESS) {
1521 TRACE_RET(chip, STATUS_FAIL);
1524 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, SD_RSP_80CLK_TIMEOUT_EN);
1526 retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
1527 SD_RSP_TYPE_R1, NULL, 0);
1528 if (retval != STATUS_SUCCESS) {
1529 if (sd_check_err_code(chip, SD_RSP_TIMEOUT)) {
1530 rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1531 TRACE_RET(chip, STATUS_FAIL);
1535 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1537 return STATUS_SUCCESS;
1540 static int sd_ddr_tuning_tx_cmd(struct rtsx_chip *chip, u8 sample_point)
1542 struct sd_info *sd_card = &(chip->sd_card);
1544 u8 cmd[5], bus_width;
1546 retval = sd_change_phase(chip, sample_point, TUNE_TX);
1547 if (retval != STATUS_SUCCESS) {
1548 TRACE_RET(chip, STATUS_FAIL);
1551 if (CHK_SD(sd_card)) {
1552 bus_width = SD_BUS_WIDTH_4;
1554 if (CHK_MMC_8BIT(sd_card)) {
1555 bus_width = SD_BUS_WIDTH_8;
1556 } else if (CHK_MMC_4BIT(sd_card)) {
1557 bus_width = SD_BUS_WIDTH_4;
1559 bus_width = SD_BUS_WIDTH_1;
1563 retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
1564 if (retval != STATUS_SUCCESS) {
1565 TRACE_RET(chip, STATUS_FAIL);
1568 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, SD_RSP_80CLK_TIMEOUT_EN);
1570 cmd[0] = 0x40 | PROGRAM_CSD;
1576 retval = sd_write_data(chip, SD_TM_AUTO_WRITE_2,
1577 cmd, 5, 16, 1, bus_width, sd_card->raw_csd, 16, 100);
1578 if (retval != STATUS_SUCCESS) {
1579 rtsx_clear_sd_error(chip);
1580 rtsx_write_register(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1581 TRACE_RET(chip, STATUS_FAIL);
1584 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1586 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
1588 return STATUS_SUCCESS;
1591 static u8 sd_search_final_phase(struct rtsx_chip *chip, u32 phase_map, u8 tune_dir)
1593 struct sd_info *sd_card = &(chip->sd_card);
1594 struct timing_phase_path path[MAX_PHASE + 1];
1595 int i, j, cont_path_cnt;
1596 int new_block, max_len, final_path_idx;
1597 u8 final_phase = 0xFF;
1599 if (phase_map == 0xFFFFFFFF) {
1600 if (tune_dir == TUNE_RX) {
1601 final_phase = (u8)chip->sd_default_rx_phase;
1603 final_phase = (u8)chip->sd_default_tx_phase;
1612 for (i = 0; i < MAX_PHASE + 1; i++) {
1613 if (phase_map & (1 << i)) {
1616 j = cont_path_cnt++;
1624 if (cont_path_cnt) {
1625 int idx = cont_path_cnt - 1;
1626 path[idx].len = path[idx].end - path[idx].start + 1;
1627 path[idx].mid = path[idx].start + path[idx].len / 2;
1632 if (cont_path_cnt == 0) {
1633 RTSX_DEBUGP("No continuous phase path\n");
1636 int idx = cont_path_cnt - 1;
1637 path[idx].len = path[idx].end - path[idx].start + 1;
1638 path[idx].mid = path[idx].start + path[idx].len / 2;
1641 if ((path[0].start == 0) && (path[cont_path_cnt - 1].end == MAX_PHASE)) {
1642 path[0].start = path[cont_path_cnt - 1].start - MAX_PHASE - 1;
1643 path[0].len += path[cont_path_cnt - 1].len;
1644 path[0].mid = path[0].start + path[0].len / 2;
1645 if (path[0].mid < 0) {
1646 path[0].mid += MAX_PHASE + 1;
1654 for (i = 0; i < cont_path_cnt; i++) {
1655 if (path[i].len > max_len) {
1656 max_len = path[i].len;
1657 final_phase = (u8)path[i].mid;
1661 RTSX_DEBUGP("path[%d].start = %d\n", i, path[i].start);
1662 RTSX_DEBUGP("path[%d].end = %d\n", i, path[i].end);
1663 RTSX_DEBUGP("path[%d].len = %d\n", i, path[i].len);
1664 RTSX_DEBUGP("path[%d].mid = %d\n", i, path[i].mid);
1668 if (tune_dir == TUNE_TX) {
1669 if (CHK_SD_SDR104(sd_card)) {
1671 int temp_mid = (max_len - 16) / 2;
1672 int temp_final_phase =
1673 path[final_path_idx].end - (max_len - (6 + temp_mid));
1675 if (temp_final_phase < 0) {
1676 final_phase = (u8)(temp_final_phase + MAX_PHASE + 1);
1678 final_phase = (u8)temp_final_phase;
1681 } else if (CHK_SD_SDR50(sd_card)) {
1683 int temp_mid = (max_len - 13) / 2;
1684 int temp_final_phase =
1685 path[final_path_idx].end - (max_len - (3 + temp_mid));
1687 if (temp_final_phase < 0) {
1688 final_phase = (u8)(temp_final_phase + MAX_PHASE + 1);
1690 final_phase = (u8)temp_final_phase;
1697 RTSX_DEBUGP("Final chosen phase: %d\n", final_phase);
1701 static int sd_tuning_rx(struct rtsx_chip *chip)
1703 struct sd_info *sd_card = &(chip->sd_card);
1706 u32 raw_phase_map[3], phase_map;
1708 int (*tuning_cmd)(struct rtsx_chip *chip, u8 sample_point);
1710 if (CHK_SD(sd_card)) {
1711 if (CHK_SD_DDR50(sd_card)) {
1712 tuning_cmd = sd_ddr_tuning_rx_cmd;
1714 tuning_cmd = sd_sdr_tuning_rx_cmd;
1717 if (CHK_MMC_DDR52(sd_card)) {
1718 tuning_cmd = mmc_ddr_tunning_rx_cmd;
1720 TRACE_RET(chip, STATUS_FAIL);
1724 for (i = 0; i < 3; i++) {
1725 raw_phase_map[i] = 0;
1726 for (j = MAX_PHASE; j >= 0; j--) {
1727 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1728 sd_set_err_code(chip, SD_NO_CARD);
1729 TRACE_RET(chip, STATUS_FAIL);
1732 retval = tuning_cmd(chip, (u8)j);
1733 if (retval == STATUS_SUCCESS) {
1734 raw_phase_map[i] |= 1 << j;
1739 phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
1740 for (i = 0; i < 3; i++) {
1741 RTSX_DEBUGP("RX raw_phase_map[%d] = 0x%08x\n", i, raw_phase_map[i]);
1743 RTSX_DEBUGP("RX phase_map = 0x%08x\n", phase_map);
1745 final_phase = sd_search_final_phase(chip, phase_map, TUNE_RX);
1746 if (final_phase == 0xFF) {
1747 TRACE_RET(chip, STATUS_FAIL);
1750 retval = sd_change_phase(chip, final_phase, TUNE_RX);
1751 if (retval != STATUS_SUCCESS) {
1752 TRACE_RET(chip, STATUS_FAIL);
1755 return STATUS_SUCCESS;
1758 static int sd_ddr_pre_tuning_tx(struct rtsx_chip *chip)
1760 struct sd_info *sd_card = &(chip->sd_card);
1766 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, SD_RSP_80CLK_TIMEOUT_EN);
1769 for (i = MAX_PHASE; i >= 0; i--) {
1770 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1771 sd_set_err_code(chip, SD_NO_CARD);
1772 rtsx_write_register(chip, SD_CFG3,
1773 SD_RSP_80CLK_TIMEOUT_EN, 0);
1774 TRACE_RET(chip, STATUS_FAIL);
1777 retval = sd_change_phase(chip, (u8)i, TUNE_TX);
1778 if (retval != STATUS_SUCCESS) {
1782 retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
1783 SD_RSP_TYPE_R1, NULL, 0);
1784 if ((retval == STATUS_SUCCESS) || !sd_check_err_code(chip, SD_RSP_TIMEOUT)) {
1785 phase_map |= 1 << i;
1789 RTSX_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1791 RTSX_DEBUGP("DDR TX pre tune phase_map = 0x%08x\n", phase_map);
1793 final_phase = sd_search_final_phase(chip, phase_map, TUNE_TX);
1794 if (final_phase == 0xFF) {
1795 TRACE_RET(chip, STATUS_FAIL);
1798 retval = sd_change_phase(chip, final_phase, TUNE_TX);
1799 if (retval != STATUS_SUCCESS) {
1800 TRACE_RET(chip, STATUS_FAIL);
1803 RTSX_DEBUGP("DDR TX pre tune phase: %d\n", (int)final_phase);
1805 return STATUS_SUCCESS;
1808 static int sd_tuning_tx(struct rtsx_chip *chip)
1810 struct sd_info *sd_card = &(chip->sd_card);
1813 u32 raw_phase_map[3], phase_map;
1815 int (*tuning_cmd)(struct rtsx_chip *chip, u8 sample_point);
1817 if (CHK_SD(sd_card)) {
1818 if (CHK_SD_DDR50(sd_card)) {
1819 tuning_cmd = sd_ddr_tuning_tx_cmd;
1821 tuning_cmd = sd_sdr_tuning_tx_cmd;
1824 if (CHK_MMC_DDR52(sd_card)) {
1825 tuning_cmd = sd_ddr_tuning_tx_cmd;
1827 TRACE_RET(chip, STATUS_FAIL);
1831 for (i = 0; i < 3; i++) {
1832 raw_phase_map[i] = 0;
1833 for (j = MAX_PHASE; j >= 0; j--) {
1834 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
1835 sd_set_err_code(chip, SD_NO_CARD);
1836 rtsx_write_register(chip, SD_CFG3,
1837 SD_RSP_80CLK_TIMEOUT_EN, 0);
1838 TRACE_RET(chip, STATUS_FAIL);
1841 retval = tuning_cmd(chip, (u8)j);
1842 if (retval == STATUS_SUCCESS) {
1843 raw_phase_map[i] |= 1 << j;
1848 phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
1849 for (i = 0; i < 3; i++) {
1850 RTSX_DEBUGP("TX raw_phase_map[%d] = 0x%08x\n", i, raw_phase_map[i]);
1852 RTSX_DEBUGP("TX phase_map = 0x%08x\n", phase_map);
1854 final_phase = sd_search_final_phase(chip, phase_map, TUNE_TX);
1855 if (final_phase == 0xFF) {
1856 TRACE_RET(chip, STATUS_FAIL);
1859 retval = sd_change_phase(chip, final_phase, TUNE_TX);
1860 if (retval != STATUS_SUCCESS) {
1861 TRACE_RET(chip, STATUS_FAIL);
1864 return STATUS_SUCCESS;
1867 static int sd_sdr_tuning(struct rtsx_chip *chip)
1871 retval = sd_tuning_tx(chip);
1872 if (retval != STATUS_SUCCESS) {
1873 TRACE_RET(chip, STATUS_FAIL);
1876 retval = sd_tuning_rx(chip);
1877 if (retval != STATUS_SUCCESS) {
1878 TRACE_RET(chip, STATUS_FAIL);
1881 return STATUS_SUCCESS;
1884 static int sd_ddr_tuning(struct rtsx_chip *chip)
1888 if (!(chip->sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
1889 retval = sd_ddr_pre_tuning_tx(chip);
1890 if (retval != STATUS_SUCCESS) {
1891 TRACE_RET(chip, STATUS_FAIL);
1894 retval = sd_change_phase(chip, (u8)chip->sd_ddr_tx_phase, TUNE_TX);
1895 if (retval != STATUS_SUCCESS) {
1896 TRACE_RET(chip, STATUS_FAIL);
1900 retval = sd_tuning_rx(chip);
1901 if (retval != STATUS_SUCCESS) {
1902 TRACE_RET(chip, STATUS_FAIL);
1905 if (!(chip->sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
1906 retval = sd_tuning_tx(chip);
1907 if (retval != STATUS_SUCCESS) {
1908 TRACE_RET(chip, STATUS_FAIL);
1912 return STATUS_SUCCESS;
1915 static int mmc_ddr_tuning(struct rtsx_chip *chip)
1919 if (!(chip->sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
1920 retval = sd_ddr_pre_tuning_tx(chip);
1921 if (retval != STATUS_SUCCESS) {
1922 TRACE_RET(chip, STATUS_FAIL);
1925 retval = sd_change_phase(chip, (u8)chip->mmc_ddr_tx_phase, TUNE_TX);
1926 if (retval != STATUS_SUCCESS) {
1927 TRACE_RET(chip, STATUS_FAIL);
1931 retval = sd_tuning_rx(chip);
1932 if (retval != STATUS_SUCCESS) {
1933 TRACE_RET(chip, STATUS_FAIL);
1936 if (!(chip->sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
1937 retval = sd_tuning_tx(chip);
1938 if (retval != STATUS_SUCCESS) {
1939 TRACE_RET(chip, STATUS_FAIL);
1943 return STATUS_SUCCESS;
1946 int sd_switch_clock(struct rtsx_chip *chip)
1948 struct sd_info *sd_card = &(chip->sd_card);
1952 retval = select_card(chip, SD_CARD);
1953 if (retval != STATUS_SUCCESS) {
1954 TRACE_RET(chip, STATUS_FAIL);
1957 if (CHECK_PID(chip, 0x5209) &&
1958 (CHK_SD30_SPEED(sd_card) || CHK_MMC_DDR52(sd_card))) {
1959 if (sd_card->need_retune && (sd_card->sd_clock != chip->cur_clk)) {
1961 sd_card->need_retune = 0;
1965 retval = switch_clock(chip, sd_card->sd_clock);
1966 if (retval != STATUS_SUCCESS) {
1967 TRACE_RET(chip, STATUS_FAIL);
1971 if (CHK_SD(sd_card)) {
1972 if (CHK_SD_DDR50(sd_card)) {
1973 retval = sd_ddr_tuning(chip);
1975 retval = sd_sdr_tuning(chip);
1978 if (CHK_MMC_DDR52(sd_card)) {
1979 retval = mmc_ddr_tuning(chip);
1983 if (retval != STATUS_SUCCESS) {
1984 TRACE_RET(chip, STATUS_FAIL);
1988 return STATUS_SUCCESS;
1991 static int sd_prepare_reset(struct rtsx_chip *chip)
1993 struct sd_info *sd_card = &(chip->sd_card);
1996 if (chip->asic_code) {
1997 sd_card->sd_clock = 29;
1999 sd_card->sd_clock = CLK_30;
2002 sd_card->sd_type = 0;
2003 sd_card->seq_mode = 0;
2004 sd_card->sd_data_buf_ready = 0;
2005 sd_card->capacity = 0;
2007 #ifdef SUPPORT_SD_LOCK
2008 sd_card->sd_lock_status = 0;
2009 sd_card->sd_erase_status = 0;
2012 chip->capacity[chip->card2lun[SD_CARD]] = 0;
2015 retval = sd_set_init_para(chip);
2016 if (retval != STATUS_SUCCESS) {
2017 TRACE_RET(chip, retval);
2020 if (CHECK_PID(chip, 0x5209)) {
2021 RTSX_WRITE_REG(chip, REG_SD_CFG1, 0xFF,
2022 SD_CLK_DIVIDE_128 | SD_20_MODE | SD_BUS_WIDTH_1);
2023 RTSX_WRITE_REG(chip, SD_SAMPLE_POINT_CTL, 0xFF, SD20_RX_POS_EDGE);
2024 RTSX_WRITE_REG(chip, SD_PUSH_POINT_CTL, 0xFF, 0);
2026 RTSX_WRITE_REG(chip, REG_SD_CFG1, 0xFF, 0x40);
2029 RTSX_WRITE_REG(chip, CARD_STOP, SD_STOP | SD_CLR_ERR, SD_STOP | SD_CLR_ERR);
2031 retval = select_card(chip, SD_CARD);
2032 if (retval != STATUS_SUCCESS) {
2033 TRACE_RET(chip, STATUS_FAIL);
2036 return STATUS_SUCCESS;
2039 static int sd_pull_ctl_disable(struct rtsx_chip *chip)
2041 if (CHECK_PID(chip, 0x5209)) {
2042 RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF, 0x55);
2043 RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF, 0x55);
2044 RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF, 0xD5);
2045 } else if (CHECK_PID(chip, 0x5208)) {
2046 RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF,
2047 XD_D3_PD | SD_D7_PD | SD_CLK_PD | SD_D5_PD);
2048 RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF,
2049 SD_D6_PD | SD_D0_PD | SD_D1_PD | XD_D5_PD);
2050 RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF,
2051 SD_D4_PD | XD_CE_PD | XD_CLE_PD | XD_CD_PU);
2052 RTSX_WRITE_REG(chip, CARD_PULL_CTL4, 0xFF,
2053 XD_RDY_PD | SD_D3_PD | SD_D2_PD | XD_ALE_PD);
2054 RTSX_WRITE_REG(chip, CARD_PULL_CTL5, 0xFF,
2055 MS_INS_PU | SD_WP_PD | SD_CD_PU | SD_CMD_PD);
2056 RTSX_WRITE_REG(chip, CARD_PULL_CTL6, 0xFF, MS_D5_PD | MS_D4_PD);
2057 } else if (CHECK_PID(chip, 0x5288)) {
2058 if (CHECK_BARO_PKG(chip, QFN)) {
2059 RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF, 0x55);
2060 RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF, 0x55);
2061 RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF, 0x4B);
2062 RTSX_WRITE_REG(chip, CARD_PULL_CTL4, 0xFF, 0x69);
2066 return STATUS_SUCCESS;
2069 int sd_pull_ctl_enable(struct rtsx_chip *chip)
2073 rtsx_init_cmd(chip);
2075 if (CHECK_PID(chip, 0x5209)) {
2076 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0xAA);
2077 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0xAA);
2078 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0xE9);
2079 } else if (CHECK_PID(chip, 0x5208)) {
2080 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF,
2081 XD_D3_PD | SD_DAT7_PU | SD_CLK_NP | SD_D5_PU);
2082 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF,
2083 SD_D6_PU | SD_D0_PU | SD_D1_PU | XD_D5_PD);
2084 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF,
2085 SD_D4_PU | XD_CE_PD | XD_CLE_PD | XD_CD_PU);
2086 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF,
2087 XD_RDY_PD | SD_D3_PU | SD_D2_PU | XD_ALE_PD);
2088 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF,
2089 MS_INS_PU | SD_WP_PU | SD_CD_PU | SD_CMD_PU);
2090 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, MS_D5_PD | MS_D4_PD);
2091 } else if (CHECK_PID(chip, 0x5288)) {
2092 if (CHECK_BARO_PKG(chip, QFN)) {
2093 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0xA8);
2094 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x5A);
2095 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
2096 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0xAA);
2100 retval = rtsx_send_cmd(chip, SD_CARD, 100);
2102 TRACE_RET(chip, STATUS_FAIL);
2105 return STATUS_SUCCESS;
2108 static int sd_init_power(struct rtsx_chip *chip)
2112 if (CHECK_PID(chip, 0x5209)) {
2113 RTSX_WRITE_REG(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_OFF);
2116 retval = sd_power_off_card3v3(chip);
2117 if (retval != STATUS_SUCCESS) {
2118 TRACE_RET(chip, STATUS_FAIL);
2121 if (!chip->ft2_fast_mode) {
2125 retval = enable_card_clock(chip, SD_CARD);
2126 if (retval != STATUS_SUCCESS) {
2127 TRACE_RET(chip, STATUS_FAIL);
2130 if (chip->asic_code) {
2131 retval = sd_pull_ctl_enable(chip);
2132 if (retval != STATUS_SUCCESS) {
2133 TRACE_RET(chip, STATUS_FAIL);
2136 RTSX_WRITE_REG(chip, FPGA_PULL_CTL, FPGA_SD_PULL_CTL_BIT | 0x20, 0);
2139 if (chip->ft2_fast_mode) {
2140 if (CHECK_PID(chip, 0x5209)) {
2141 RTSX_WRITE_REG(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_ON);
2144 retval = card_power_on(chip, SD_CARD);
2145 if (retval != STATUS_SUCCESS) {
2146 TRACE_RET(chip, STATUS_FAIL);
2151 if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) {
2152 RTSX_DEBUGP("Over current, OCPSTAT is 0x%x\n", chip->ocp_stat);
2153 TRACE_RET(chip, STATUS_FAIL);
2158 RTSX_WRITE_REG(chip, CARD_OE, SD_OUTPUT_EN, SD_OUTPUT_EN);
2160 return STATUS_SUCCESS;
2163 static int sd_dummy_clock(struct rtsx_chip *chip)
2165 if (CHECK_PID(chip, 0x5209)) {
2166 RTSX_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN, SD_CLK_TOGGLE_EN);
2168 RTSX_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN, 0x00);
2170 RTSX_WRITE_REG(chip, REG_SD_CFG3, 0x01, 0x01);
2172 RTSX_WRITE_REG(chip, REG_SD_CFG3, 0x01, 0);
2175 return STATUS_SUCCESS;
2178 static int sd_read_lba0(struct rtsx_chip *chip)
2180 struct sd_info *sd_card = &(chip->sd_card);
2182 u8 cmd[5], bus_width;
2184 cmd[0] = 0x40 | READ_SINGLE_BLOCK;
2190 if (CHK_SD(sd_card)) {
2191 bus_width = SD_BUS_WIDTH_4;
2193 if (CHK_MMC_8BIT(sd_card)) {
2194 bus_width = SD_BUS_WIDTH_8;
2195 } else if (CHK_MMC_4BIT(sd_card)) {
2196 bus_width = SD_BUS_WIDTH_4;
2198 bus_width = SD_BUS_WIDTH_1;
2202 retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd,
2203 5, 512, 1, bus_width, NULL, 0, 100);
2204 if (retval != STATUS_SUCCESS) {
2205 rtsx_clear_sd_error(chip);
2206 TRACE_RET(chip, STATUS_FAIL);
2209 return STATUS_SUCCESS;
2212 static int sd_check_wp_state(struct rtsx_chip *chip)
2214 struct sd_info *sd_card = &(chip->sd_card);
2220 retval = sd_send_cmd_get_rsp(chip, APP_CMD,
2221 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2222 if (retval != STATUS_SUCCESS) {
2223 TRACE_RET(chip, STATUS_FAIL);
2226 cmd[0] = 0x40 | SD_STATUS;
2232 retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1, SD_BUS_WIDTH_4, buf, 64, 250);
2233 if (retval != STATUS_SUCCESS) {
2234 rtsx_clear_sd_error(chip);
2236 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2237 TRACE_RET(chip, STATUS_FAIL);
2240 RTSX_DEBUGP("ACMD13:\n");
2243 sd_card_type = ((u16)buf[2] << 8) | buf[3];
2244 RTSX_DEBUGP("sd_card_type = 0x%04x\n", sd_card_type);
2245 if ((sd_card_type == 0x0001) || (sd_card_type == 0x0002)) {
2246 /* ROM card or OTP */
2247 chip->card_wp |= SD_CARD;
2250 /* Check SD Machanical Write-Protect Switch */
2251 val = rtsx_readl(chip, RTSX_BIPR);
2252 if (val & SD_WRITE_PROTECT) {
2253 chip->card_wp |= SD_CARD;
2256 return STATUS_SUCCESS;
2259 static int reset_sd(struct rtsx_chip *chip)
2261 struct sd_info *sd_card = &(chip->sd_card);
2262 int retval, i = 0, j = 0, k = 0, hi_cap_flow = 0;
2263 int sd_dont_switch = 0;
2264 int support_1v8 = 0;
2267 u8 switch_bus_width;
2280 #ifdef SUPPORT_SD_LOCK
2281 if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON)
2282 goto SD_UNLOCK_ENTRY;
2285 retval = sd_prepare_reset(chip);
2286 if (retval != STATUS_SUCCESS) {
2287 TRACE_RET(chip, STATUS_FAIL);
2290 retval = sd_dummy_clock(chip);
2291 if (retval != STATUS_SUCCESS) {
2292 TRACE_RET(chip, STATUS_FAIL);
2295 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip) && try_sdio) {
2298 for (; rty_cnt < chip->sdio_retry_cnt; rty_cnt++) {
2299 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2300 sd_set_err_code(chip, SD_NO_CARD);
2301 TRACE_RET(chip, STATUS_FAIL);
2304 retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0, SD_RSP_TYPE_R4, rsp, 5);
2305 if (retval == STATUS_SUCCESS) {
2306 int func_num = (rsp[1] >> 4) & 0x07;
2308 RTSX_DEBUGP("SD_IO card (Function number: %d)!\n", func_num);
2310 TRACE_RET(chip, STATUS_FAIL);
2316 sd_init_power(chip);
2318 sd_dummy_clock(chip);
2321 RTSX_DEBUGP("Normal card!\n");
2324 /* Start Initialization Process of SD Card */
2326 retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0, NULL, 0);
2327 if (retval != STATUS_SUCCESS) {
2328 TRACE_RET(chip, STATUS_FAIL);
2333 retval = sd_send_cmd_get_rsp(chip, SEND_IF_COND, 0x000001AA, SD_RSP_TYPE_R7, rsp, 5);
2334 if (retval == STATUS_SUCCESS) {
2335 if ((rsp[4] == 0xAA) && ((rsp[3] & 0x0f) == 0x01)) {
2337 if (CHECK_PID(chip, 0x5209)) {
2339 voltage = SUPPORT_VOLTAGE |
2340 SUPPORT_HIGH_AND_EXTENDED_CAPACITY;
2342 voltage = SUPPORT_VOLTAGE |
2343 SUPPORT_HIGH_AND_EXTENDED_CAPACITY |
2344 SUPPORT_MAX_POWER_PERMANCE | SUPPORT_1V8;
2347 voltage = SUPPORT_VOLTAGE | 0x40000000;
2353 voltage = SUPPORT_VOLTAGE;
2355 retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0, NULL, 0);
2356 if (retval != STATUS_SUCCESS) {
2357 TRACE_RET(chip, STATUS_FAIL);
2364 retval = sd_send_cmd_get_rsp(chip, APP_CMD, 0, SD_RSP_TYPE_R1, NULL, 0);
2365 if (retval != STATUS_SUCCESS) {
2366 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2367 sd_set_err_code(chip, SD_NO_CARD);
2368 TRACE_RET(chip, STATUS_FAIL);
2375 TRACE_RET(chip, STATUS_FAIL);
2379 retval = sd_send_cmd_get_rsp(chip, SD_APP_OP_COND, voltage, SD_RSP_TYPE_R3, rsp, 5);
2380 if (retval != STATUS_SUCCESS) {
2385 TRACE_RET(chip, STATUS_FAIL);
2391 } while (!(rsp[1] & 0x80) && (i < 255));
2394 TRACE_RET(chip, STATUS_FAIL);
2398 if (rsp[1] & 0x40) {
2399 SET_SD_HCXC(sd_card);
2401 CLR_SD_HCXC(sd_card);
2403 if (CHECK_PID(chip, 0x5209) && CHK_SD_HCXC(sd_card) && !sd20_mode) {
2404 support_1v8 = (rsp[1] & 0x01) ? 1 : 0;
2409 CLR_SD_HCXC(sd_card);
2412 RTSX_DEBUGP("support_1v8 = %d\n", support_1v8);
2415 retval = sd_voltage_switch(chip);
2416 if (retval != STATUS_SUCCESS) {
2417 TRACE_RET(chip, STATUS_FAIL);
2421 retval = sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2, NULL, 0);
2422 if (retval != STATUS_SUCCESS) {
2423 TRACE_RET(chip, STATUS_FAIL);
2426 for (i = 0; i < 3; i++) {
2427 retval = sd_send_cmd_get_rsp(chip, SEND_RELATIVE_ADDR, 0, SD_RSP_TYPE_R6, rsp, 5);
2428 if (retval != STATUS_SUCCESS) {
2429 TRACE_RET(chip, STATUS_FAIL);
2432 sd_card->sd_addr = (u32)rsp[1] << 24;
2433 sd_card->sd_addr += (u32)rsp[2] << 16;
2435 if (sd_card->sd_addr) {
2440 retval = sd_check_csd(chip, 1);
2441 if (retval != STATUS_SUCCESS) {
2442 TRACE_RET(chip, STATUS_FAIL);
2445 retval = sd_select_card(chip, 1);
2446 if (retval != STATUS_SUCCESS) {
2447 TRACE_RET(chip, STATUS_FAIL);
2450 #ifdef SUPPORT_SD_LOCK
2452 retval = sd_update_lock_status(chip);
2453 if (retval != STATUS_SUCCESS) {
2454 TRACE_RET(chip, STATUS_FAIL);
2457 if (sd_card->sd_lock_status & SD_LOCKED) {
2458 sd_card->sd_lock_status |= (SD_LOCK_1BIT_MODE | SD_PWD_EXIST);
2459 return STATUS_SUCCESS;
2460 } else if (!(sd_card->sd_lock_status & SD_UNLOCK_POW_ON)) {
2461 sd_card->sd_lock_status &= ~SD_PWD_EXIST;
2465 retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2466 if (retval != STATUS_SUCCESS) {
2467 TRACE_RET(chip, STATUS_FAIL);
2469 retval = sd_send_cmd_get_rsp(chip, SET_CLR_CARD_DETECT, 0, SD_RSP_TYPE_R1, NULL, 0);
2470 if (retval != STATUS_SUCCESS) {
2471 TRACE_RET(chip, STATUS_FAIL);
2475 retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2476 if (retval != STATUS_SUCCESS) {
2477 TRACE_RET(chip, STATUS_FAIL);
2479 retval = sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2, SD_RSP_TYPE_R1, NULL, 0);
2480 if (retval != STATUS_SUCCESS) {
2481 TRACE_RET(chip, STATUS_FAIL);
2484 switch_bus_width = SD_BUS_WIDTH_4;
2486 switch_bus_width = SD_BUS_WIDTH_1;
2489 retval = sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200, SD_RSP_TYPE_R1, NULL, 0);
2490 if (retval != STATUS_SUCCESS) {
2491 TRACE_RET(chip, STATUS_FAIL);
2494 retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
2495 if (retval != STATUS_SUCCESS) {
2496 TRACE_RET(chip, STATUS_FAIL);
2499 if (!(sd_card->raw_csd[4] & 0x40))
2502 if (!sd_dont_switch) {
2504 /* Set sd_switch_fail here, because we needn't
2505 * switch to UHS mode
2507 sd_card->sd_switch_fail = SDR104_SUPPORT_MASK |
2508 DDR50_SUPPORT_MASK | SDR50_SUPPORT_MASK;
2511 /* Check the card whether follow SD1.1 spec or higher */
2512 retval = sd_check_spec(chip, switch_bus_width);
2513 if (retval == STATUS_SUCCESS) {
2514 retval = sd_switch_function(chip, switch_bus_width);
2515 if (retval != STATUS_SUCCESS) {
2516 if (CHECK_PID(chip, 0x5209)) {
2517 sd_change_bank_voltage(chip, SD_IO_3V3);
2519 sd_init_power(chip);
2527 if (CHECK_PID(chip, 0x5209)) {
2528 sd_change_bank_voltage(chip, SD_IO_3V3);
2530 sd_init_power(chip);
2540 retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2541 if (retval != STATUS_SUCCESS) {
2542 TRACE_RET(chip, STATUS_FAIL);
2544 retval = sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2, SD_RSP_TYPE_R1, NULL, 0);
2545 if (retval != STATUS_SUCCESS) {
2546 TRACE_RET(chip, STATUS_FAIL);
2550 #ifdef SUPPORT_SD_LOCK
2551 sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
2554 if (!sd20_mode && CHK_SD30_SPEED(sd_card)) {
2557 RTSX_WRITE_REG(chip, SD30_DRIVE_SEL, 0x07, chip->sd30_drive_sel_1v8);
2559 retval = sd_set_init_para(chip);
2560 if (retval != STATUS_SUCCESS) {
2561 TRACE_RET(chip, STATUS_FAIL);
2564 if (CHK_SD_DDR50(sd_card)) {
2565 retval = sd_ddr_tuning(chip);
2567 retval = sd_sdr_tuning(chip);
2570 if (retval != STATUS_SUCCESS) {
2572 TRACE_RET(chip, STATUS_FAIL);
2574 retval = sd_init_power(chip);
2575 if (retval != STATUS_SUCCESS) {
2576 TRACE_RET(chip, STATUS_FAIL);
2584 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2586 if (CHK_SD_DDR50(sd_card)) {
2587 retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
2588 if (retval != STATUS_SUCCESS) {
2594 retval = sd_read_lba0(chip);
2595 if (retval != STATUS_SUCCESS) {
2597 TRACE_RET(chip, STATUS_FAIL);
2599 retval = sd_init_power(chip);
2600 if (retval != STATUS_SUCCESS) {
2601 TRACE_RET(chip, STATUS_FAIL);
2611 retval = sd_check_wp_state(chip);
2612 if (retval != STATUS_SUCCESS) {
2613 TRACE_RET(chip, STATUS_FAIL);
2616 chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
2618 #ifdef SUPPORT_SD_LOCK
2619 if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON) {
2620 RTSX_WRITE_REG(chip, REG_SD_BLOCK_CNT_H, 0xFF, 0x02);
2621 RTSX_WRITE_REG(chip, REG_SD_BLOCK_CNT_L, 0xFF, 0x00);
2625 return STATUS_SUCCESS;
2629 static int mmc_test_switch_bus(struct rtsx_chip *chip, u8 width)
2631 struct sd_info *sd_card = &(chip->sd_card);
2633 u8 buf[8] = {0}, bus_width, *ptr;
2637 retval = sd_send_cmd_get_rsp(chip, BUSTEST_W, 0, SD_RSP_TYPE_R1, NULL, 0);
2638 if (retval != STATUS_SUCCESS) {
2639 TRACE_RET(chip, SWITCH_FAIL);
2642 if (width == MMC_8BIT_BUS) {
2647 bus_width = SD_BUS_WIDTH_8;
2652 bus_width = SD_BUS_WIDTH_4;
2655 if (!CHECK_PID(chip, 0x5209)) {
2656 retval = rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0x02);
2657 if (retval != STATUS_SUCCESS)
2658 TRACE_RET(chip, SWITCH_ERR);
2661 retval = sd_write_data(chip, SD_TM_AUTO_WRITE_3,
2662 NULL, 0, byte_cnt, 1, bus_width, buf, len, 100);
2663 if (retval != STATUS_SUCCESS) {
2664 if (CHECK_PID(chip, 0x5209)) {
2665 u8 val1 = 0, val2 = 0;
2666 rtsx_read_register(chip, REG_SD_STAT1, &val1);
2667 rtsx_read_register(chip, REG_SD_STAT2, &val2);
2668 rtsx_clear_sd_error(chip);
2669 if ((val1 & 0xE0) || val2) {
2670 TRACE_RET(chip, SWITCH_ERR);
2673 rtsx_clear_sd_error(chip);
2674 rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0);
2675 TRACE_RET(chip, SWITCH_ERR);
2679 if (!CHECK_PID(chip, 0x5209)) {
2680 retval = rtsx_write_register(chip, REG_SD_CFG3, 0x02, 0);
2681 if (retval != STATUS_SUCCESS)
2682 TRACE_RET(chip, SWITCH_ERR);
2685 RTSX_DEBUGP("SD/MMC CMD %d\n", BUSTEST_R);
2687 rtsx_init_cmd(chip);
2689 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | BUSTEST_R);
2691 if (width == MMC_8BIT_BUS) {
2692 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x08);
2694 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x04);
2697 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, 1);
2698 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, 0);
2700 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
2701 SD_CALCULATE_CRC7 | SD_NO_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
2702 SD_CHECK_CRC7 | SD_RSP_LEN_6);
2703 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
2704 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF, SD_TM_NORMAL_READ | SD_TRANSFER_START);
2705 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
2707 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2, 0, 0);
2708 if (width == MMC_8BIT_BUS) {
2709 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 1, 0, 0);
2712 retval = rtsx_send_cmd(chip, SD_CARD, 100);
2714 rtsx_clear_sd_error(chip);
2715 TRACE_RET(chip, SWITCH_ERR);
2718 ptr = rtsx_get_cmd_data(chip) + 1;
2720 if (width == MMC_8BIT_BUS) {
2721 RTSX_DEBUGP("BUSTEST_R [8bits]: 0x%02x 0x%02x\n", ptr[0], ptr[1]);
2722 if ((ptr[0] == 0xAA) && (ptr[1] == 0x55)) {
2726 if (CHK_MMC_DDR52(sd_card)) {
2731 retval = sd_send_cmd_get_rsp(chip, SWITCH, arg, SD_RSP_TYPE_R1b, rsp, 5);
2732 if ((retval == STATUS_SUCCESS) && !(rsp[4] & MMC_SWITCH_ERR)) {
2733 return SWITCH_SUCCESS;
2737 RTSX_DEBUGP("BUSTEST_R [4bits]: 0x%02x\n", ptr[0]);
2738 if (ptr[0] == 0xA5) {
2742 if (CHK_MMC_DDR52(sd_card)) {
2747 retval = sd_send_cmd_get_rsp(chip, SWITCH, arg, SD_RSP_TYPE_R1b, rsp, 5);
2748 if ((retval == STATUS_SUCCESS) && !(rsp[4] & MMC_SWITCH_ERR)) {
2749 return SWITCH_SUCCESS;
2754 TRACE_RET(chip, SWITCH_FAIL);
2758 static int mmc_switch_timing_bus(struct rtsx_chip *chip, int switch_ddr)
2760 struct sd_info *sd_card = &(chip->sd_card);
2762 u8 *ptr, card_type, card_type_mask = 0;
2764 CLR_MMC_HS(sd_card);
2766 RTSX_DEBUGP("SD/MMC CMD %d\n", SEND_EXT_CSD);
2768 rtsx_init_cmd(chip);
2770 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | SEND_EXT_CSD);
2771 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, 0);
2772 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, 0);
2773 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, 0);
2774 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, 0);
2776 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0);
2777 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 2);
2778 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, 1);
2779 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, 0);
2781 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF,
2782 SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
2783 SD_CHECK_CRC7 | SD_RSP_LEN_6);
2784 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
2785 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF, SD_TM_NORMAL_READ | SD_TRANSFER_START);
2786 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
2788 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 196, 0xFF, 0);
2789 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 212, 0xFF, 0);
2790 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 213, 0xFF, 0);
2791 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 214, 0xFF, 0);
2792 rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 215, 0xFF, 0);
2794 retval = rtsx_send_cmd(chip, SD_CARD, 1000);
2796 if (retval == -ETIMEDOUT) {
2797 rtsx_clear_sd_error(chip);
2798 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2799 SD_RSP_TYPE_R1, NULL, 0);
2801 TRACE_RET(chip, STATUS_FAIL);
2804 ptr = rtsx_get_cmd_data(chip);
2805 if (ptr[0] & SD_TRANSFER_ERR) {
2806 sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
2807 TRACE_RET(chip, STATUS_FAIL);
2810 if (CHK_MMC_SECTOR_MODE(sd_card)) {
2811 sd_card->capacity = ((u32)ptr[5] << 24) | ((u32)ptr[4] << 16) |
2812 ((u32)ptr[3] << 8) | ((u32)ptr[2]);
2815 if (CHECK_PID(chip, 0x5209)) {
2816 #ifdef SUPPORT_SD_LOCK
2817 if (!(sd_card->sd_lock_status & SD_SDR_RST) &&
2818 (chip->sd_ctl & SUPPORT_MMC_DDR_MODE)) {
2819 card_type_mask = 0x07;
2821 card_type_mask = 0x03;
2824 if (chip->sd_ctl & SUPPORT_MMC_DDR_MODE) {
2825 card_type_mask = 0x07;
2827 card_type_mask = 0x03;
2831 card_type_mask = 0x03;
2833 card_type = ptr[1] & card_type_mask;
2837 if (card_type & 0x04) {
2839 SET_MMC_DDR52(sd_card);
2841 SET_MMC_52M(sd_card);
2843 } else if (card_type & 0x02) {
2844 SET_MMC_52M(sd_card);
2846 SET_MMC_26M(sd_card);
2849 retval = sd_send_cmd_get_rsp(chip, SWITCH,
2850 0x03B90100, SD_RSP_TYPE_R1b, rsp, 5);
2851 if ((retval != STATUS_SUCCESS) || (rsp[4] & MMC_SWITCH_ERR)) {
2852 CLR_MMC_HS(sd_card);
2856 sd_choose_proper_clock(chip);
2857 retval = switch_clock(chip, sd_card->sd_clock);
2858 if (retval != STATUS_SUCCESS) {
2859 TRACE_RET(chip, STATUS_FAIL);
2862 /* Test Bus Procedure */
2863 retval = mmc_test_switch_bus(chip, MMC_8BIT_BUS);
2864 if (retval == SWITCH_SUCCESS) {
2865 SET_MMC_8BIT(sd_card);
2866 chip->card_bus_width[chip->card2lun[SD_CARD]] = 8;
2867 #ifdef SUPPORT_SD_LOCK
2868 sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
2870 } else if (retval == SWITCH_FAIL) {
2871 retval = mmc_test_switch_bus(chip, MMC_4BIT_BUS);
2872 if (retval == SWITCH_SUCCESS) {
2873 SET_MMC_4BIT(sd_card);
2874 chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
2875 #ifdef SUPPORT_SD_LOCK
2876 sd_card->sd_lock_status &= ~SD_LOCK_1BIT_MODE;
2878 } else if (retval == SWITCH_FAIL) {
2879 CLR_MMC_8BIT(sd_card);
2880 CLR_MMC_4BIT(sd_card);
2882 TRACE_RET(chip, STATUS_FAIL);
2885 TRACE_RET(chip, STATUS_FAIL);
2888 return STATUS_SUCCESS;
2892 static int reset_mmc(struct rtsx_chip *chip)
2894 struct sd_info *sd_card = &(chip->sd_card);
2895 int retval, i = 0, j = 0, k = 0;
2901 #ifdef SUPPORT_SD_LOCK
2902 if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON)
2903 goto MMC_UNLOCK_ENTRY;
2907 retval = sd_prepare_reset(chip);
2908 if (retval != STATUS_SUCCESS) {
2909 TRACE_RET(chip, retval);
2915 retval = sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0, NULL, 0);
2916 if (retval != STATUS_SUCCESS) {
2917 TRACE_RET(chip, STATUS_FAIL);
2921 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
2922 sd_set_err_code(chip, SD_NO_CARD);
2923 TRACE_RET(chip, STATUS_FAIL);
2926 retval = sd_send_cmd_get_rsp(chip, SEND_OP_COND,
2927 (SUPPORT_VOLTAGE|0x40000000), SD_RSP_TYPE_R3, rsp, 5);
2928 if (retval != STATUS_SUCCESS) {
2929 if (sd_check_err_code(chip, SD_BUSY) || sd_check_err_code(chip, SD_TO_ERR)) {
2932 sd_clr_err_code(chip);
2935 TRACE_RET(chip, STATUS_FAIL);
2940 sd_clr_err_code(chip);
2943 TRACE_RET(chip, STATUS_FAIL);
2950 } while (!(rsp[1] & 0x80) && (i < 255));
2953 TRACE_RET(chip, STATUS_FAIL);
2956 if ((rsp[1] & 0x60) == 0x40) {
2957 SET_MMC_SECTOR_MODE(sd_card);
2959 CLR_MMC_SECTOR_MODE(sd_card);
2962 retval = sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2, NULL, 0);
2963 if (retval != STATUS_SUCCESS) {
2964 TRACE_RET(chip, STATUS_FAIL);
2967 sd_card->sd_addr = 0x00100000;
2968 retval = sd_send_cmd_get_rsp(chip, SET_RELATIVE_ADDR, sd_card->sd_addr, SD_RSP_TYPE_R6, rsp, 5);
2969 if (retval != STATUS_SUCCESS) {
2970 TRACE_RET(chip, STATUS_FAIL);
2973 retval = sd_check_csd(chip, 1);
2974 if (retval != STATUS_SUCCESS) {
2975 TRACE_RET(chip, STATUS_FAIL);
2978 spec_ver = (sd_card->raw_csd[0] & 0x3C) >> 2;
2980 retval = sd_select_card(chip, 1);
2981 if (retval != STATUS_SUCCESS) {
2982 TRACE_RET(chip, STATUS_FAIL);
2985 retval = sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200, SD_RSP_TYPE_R1, NULL, 0);
2986 if (retval != STATUS_SUCCESS) {
2987 TRACE_RET(chip, STATUS_FAIL);
2990 #ifdef SUPPORT_SD_LOCK
2992 retval = sd_update_lock_status(chip);
2993 if (retval != STATUS_SUCCESS) {
2994 TRACE_RET(chip, STATUS_FAIL);
2998 retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
2999 if (retval != STATUS_SUCCESS) {
3000 TRACE_RET(chip, STATUS_FAIL);
3003 chip->card_bus_width[chip->card2lun[SD_CARD]] = 1;
3005 if (!sd_card->mmc_dont_switch_bus) {
3006 if (spec_ver == 4) {
3008 retval = mmc_switch_timing_bus(chip, switch_ddr);
3009 if (retval != STATUS_SUCCESS) {
3010 retval = sd_init_power(chip);
3011 if (retval != STATUS_SUCCESS)
3012 TRACE_RET(chip, STATUS_FAIL);
3013 sd_card->mmc_dont_switch_bus = 1;
3014 TRACE_GOTO(chip, Switch_Fail);
3018 if (CHK_MMC_SECTOR_MODE(sd_card) && (sd_card->capacity == 0)) {
3019 TRACE_RET(chip, STATUS_FAIL);
3022 if (switch_ddr && CHK_MMC_DDR52(sd_card)) {
3023 retval = sd_set_init_para(chip);
3024 if (retval != STATUS_SUCCESS) {
3025 TRACE_RET(chip, STATUS_FAIL);
3028 retval = mmc_ddr_tuning(chip);
3029 if (retval != STATUS_SUCCESS) {
3030 retval = sd_init_power(chip);
3031 if (retval != STATUS_SUCCESS) {
3032 TRACE_RET(chip, STATUS_FAIL);
3035 TRACE_GOTO(chip, Switch_Fail);
3038 retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
3039 if (retval == STATUS_SUCCESS) {
3040 retval = sd_read_lba0(chip);
3041 if (retval != STATUS_SUCCESS) {
3042 retval = sd_init_power(chip);
3043 if (retval != STATUS_SUCCESS) {
3044 TRACE_RET(chip, STATUS_FAIL);
3047 TRACE_GOTO(chip, Switch_Fail);
3053 #ifdef SUPPORT_SD_LOCK
3054 if (sd_card->sd_lock_status & SD_UNLOCK_POW_ON) {
3055 RTSX_WRITE_REG(chip, REG_SD_BLOCK_CNT_H, 0xFF, 0x02);
3056 RTSX_WRITE_REG(chip, REG_SD_BLOCK_CNT_L, 0xFF, 0x00);
3060 temp = rtsx_readl(chip, RTSX_BIPR);
3061 if (temp & SD_WRITE_PROTECT) {
3062 chip->card_wp |= SD_CARD;
3065 return STATUS_SUCCESS;
3068 int reset_sd_card(struct rtsx_chip *chip)
3070 struct sd_info *sd_card = &(chip->sd_card);
3073 sd_init_reg_addr(chip);
3075 memset(sd_card, 0, sizeof(struct sd_info));
3076 chip->capacity[chip->card2lun[SD_CARD]] = 0;
3078 retval = enable_card_clock(chip, SD_CARD);
3079 if (retval != STATUS_SUCCESS) {
3080 TRACE_RET(chip, STATUS_FAIL);
3083 if (chip->ignore_sd && CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
3084 if (chip->asic_code) {
3085 retval = sd_pull_ctl_enable(chip);
3086 if (retval != STATUS_SUCCESS) {
3087 TRACE_RET(chip, STATUS_FAIL);
3090 retval = rtsx_write_register(chip, FPGA_PULL_CTL,
3091 FPGA_SD_PULL_CTL_BIT | 0x20, 0);
3092 if (retval != STATUS_SUCCESS) {
3093 TRACE_RET(chip, STATUS_FAIL);
3096 retval = card_share_mode(chip, SD_CARD);
3097 if (retval != STATUS_SUCCESS) {
3098 TRACE_RET(chip, STATUS_FAIL);
3102 TRACE_RET(chip, STATUS_FAIL);
3105 retval = sd_init_power(chip);
3106 if (retval != STATUS_SUCCESS) {
3107 TRACE_RET(chip, STATUS_FAIL);
3110 if (chip->sd_ctl & RESET_MMC_FIRST) {
3111 retval = reset_mmc(chip);
3112 if (retval != STATUS_SUCCESS) {
3113 if (sd_check_err_code(chip, SD_NO_CARD))
3114 TRACE_RET(chip, STATUS_FAIL);
3116 retval = reset_sd(chip);
3117 if (retval != STATUS_SUCCESS) {
3118 if (CHECK_PID(chip, 0x5209))
3119 sd_change_bank_voltage(chip, SD_IO_3V3);
3121 TRACE_RET(chip, STATUS_FAIL);
3125 retval = reset_sd(chip);
3126 if (retval != STATUS_SUCCESS) {
3127 if (sd_check_err_code(chip, SD_NO_CARD))
3128 TRACE_RET(chip, STATUS_FAIL);
3130 if (CHECK_PID(chip, 0x5209)) {
3131 retval = sd_change_bank_voltage(chip, SD_IO_3V3);
3132 if (retval != STATUS_SUCCESS)
3133 TRACE_RET(chip, STATUS_FAIL);
3137 TRACE_RET(chip, STATUS_FAIL);
3139 retval = reset_mmc(chip);
3140 if (retval != STATUS_SUCCESS)
3141 TRACE_RET(chip, STATUS_FAIL);
3146 retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
3147 if (retval != STATUS_SUCCESS) {
3148 TRACE_RET(chip, STATUS_FAIL);
3150 RTSX_WRITE_REG(chip, REG_SD_BYTE_CNT_L, 0xFF, 0);
3151 RTSX_WRITE_REG(chip, REG_SD_BYTE_CNT_H, 0xFF, 2);
3153 chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity;
3155 retval = sd_set_init_para(chip);
3156 if (retval != STATUS_SUCCESS) {
3157 TRACE_RET(chip, STATUS_FAIL);
3160 RTSX_DEBUGP("sd_card->sd_type = 0x%x\n", sd_card->sd_type);
3162 return STATUS_SUCCESS;
3165 static int reset_mmc_only(struct rtsx_chip *chip)
3167 struct sd_info *sd_card = &(chip->sd_card);
3170 sd_card->sd_type = 0;
3171 sd_card->seq_mode = 0;
3172 sd_card->sd_data_buf_ready = 0;
3173 sd_card->capacity = 0;
3174 sd_card->sd_switch_fail = 0;
3176 #ifdef SUPPORT_SD_LOCK
3177 sd_card->sd_lock_status = 0;
3178 sd_card->sd_erase_status = 0;
3181 chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity = 0;
3183 retval = enable_card_clock(chip, SD_CARD);
3184 if (retval != STATUS_SUCCESS) {
3185 TRACE_RET(chip, STATUS_FAIL);
3188 retval = sd_init_power(chip);
3189 if (retval != STATUS_SUCCESS) {
3190 TRACE_RET(chip, STATUS_FAIL);
3193 retval = reset_mmc(chip);
3194 if (retval != STATUS_SUCCESS) {
3195 TRACE_RET(chip, STATUS_FAIL);
3198 retval = sd_set_clock_divider(chip, SD_CLK_DIVIDE_0);
3199 if (retval != STATUS_SUCCESS) {
3200 TRACE_RET(chip, STATUS_FAIL);
3202 RTSX_WRITE_REG(chip, REG_SD_BYTE_CNT_L, 0xFF, 0);
3203 RTSX_WRITE_REG(chip, REG_SD_BYTE_CNT_H, 0xFF, 2);
3205 chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity;
3207 retval = sd_set_init_para(chip);
3208 if (retval != STATUS_SUCCESS) {
3209 TRACE_RET(chip, STATUS_FAIL);
3212 RTSX_DEBUGP("In reset_mmc_only, sd_card->sd_type = 0x%x\n", sd_card->sd_type);
3214 return STATUS_SUCCESS;
3217 #define WAIT_DATA_READY_RTY_CNT 255
3219 static int wait_data_buf_ready(struct rtsx_chip *chip)
3221 struct sd_info *sd_card = &(chip->sd_card);
3224 for (i = 0; i < WAIT_DATA_READY_RTY_CNT; i++) {
3225 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3226 sd_set_err_code(chip, SD_NO_CARD);
3227 TRACE_RET(chip, STATUS_FAIL);
3230 sd_card->sd_data_buf_ready = 0;
3232 retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
3233 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
3234 if (retval != STATUS_SUCCESS) {
3235 TRACE_RET(chip, STATUS_FAIL);
3238 if (sd_card->sd_data_buf_ready) {
3239 return sd_send_cmd_get_rsp(chip, SEND_STATUS,
3240 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
3244 sd_set_err_code(chip, SD_TO_ERR);
3246 TRACE_RET(chip, STATUS_FAIL);
3249 void sd_stop_seq_mode(struct rtsx_chip *chip)
3251 struct sd_info *sd_card = &(chip->sd_card);
3254 if (sd_card->seq_mode) {
3255 retval = sd_switch_clock(chip);
3256 if (retval != STATUS_SUCCESS) {
3260 retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
3261 SD_RSP_TYPE_R1b, NULL, 0);
3262 if (retval != STATUS_SUCCESS) {
3263 sd_set_err_code(chip, SD_STS_ERR);
3265 retval = sd_wait_state_data_ready(chip, 0x08, 1, 1000);
3266 if (retval != STATUS_SUCCESS) {
3267 sd_set_err_code(chip, SD_STS_ERR);
3269 sd_card->seq_mode = 0;
3271 rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
3275 static inline int sd_auto_tune_clock(struct rtsx_chip *chip)
3277 struct sd_info *sd_card = &(chip->sd_card);
3280 if (chip->asic_code) {
3281 if (sd_card->sd_clock > 30) {
3282 sd_card->sd_clock -= 20;
3285 switch (sd_card->sd_clock) {
3287 sd_card->sd_clock = CLK_150;
3291 sd_card->sd_clock = CLK_120;
3295 sd_card->sd_clock = CLK_100;
3299 sd_card->sd_clock = CLK_80;
3303 sd_card->sd_clock = CLK_60;
3307 sd_card->sd_clock = CLK_50;
3315 retval = sd_switch_clock(chip);
3316 if (retval != STATUS_SUCCESS) {
3317 TRACE_RET(chip, STATUS_FAIL);
3320 return STATUS_SUCCESS;
3323 int sd_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip, u32 start_sector, u16 sector_cnt)
3325 struct sd_info *sd_card = &(chip->sd_card);
3330 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3331 RTSX_DEBUGP("sd_rw: Read %d %s from 0x%x\n", sector_cnt,
3332 (sector_cnt > 1) ? "sectors" : "sector", start_sector);
3334 RTSX_DEBUGP("sd_rw: Write %d %s to 0x%x\n", sector_cnt,
3335 (sector_cnt > 1) ? "sectors" : "sector", start_sector);
3338 sd_card->cleanup_counter = 0;
3340 if (!(chip->card_ready & SD_CARD)) {
3341 sd_card->seq_mode = 0;
3343 retval = reset_sd_card(chip);
3344 if (retval == STATUS_SUCCESS) {
3345 chip->card_ready |= SD_CARD;
3346 chip->card_fail &= ~SD_CARD;
3348 chip->card_ready &= ~SD_CARD;
3349 chip->card_fail |= SD_CARD;
3350 chip->capacity[chip->card2lun[SD_CARD]] = 0;
3351 chip->rw_need_retry = 1;
3352 TRACE_RET(chip, STATUS_FAIL);
3356 if (!CHK_SD_HCXC(sd_card) && !CHK_MMC_SECTOR_MODE(sd_card)) {
3357 data_addr = start_sector << 9;
3359 data_addr = start_sector;
3362 sd_clr_err_code(chip);
3364 retval = sd_switch_clock(chip);
3365 if (retval != STATUS_SUCCESS) {
3366 sd_set_err_code(chip, SD_IO_ERR);
3367 TRACE_GOTO(chip, RW_FAIL);
3370 if (sd_card->seq_mode && ((sd_card->pre_dir != srb->sc_data_direction)
3371 || ((sd_card->pre_sec_addr + sd_card->pre_sec_cnt) != start_sector))) {
3372 if ((sd_card->pre_sec_cnt < 0x80)
3373 && (sd_card->pre_dir == DMA_FROM_DEVICE)
3374 && !CHK_SD30_SPEED(sd_card)
3375 && !CHK_SD_HS(sd_card)
3376 && !CHK_MMC_HS(sd_card)) {
3377 sd_send_cmd_get_rsp(chip, SEND_STATUS,
3378 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
3381 retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION,
3382 0, SD_RSP_TYPE_R1b, NULL, 0);
3383 if (retval != STATUS_SUCCESS) {
3384 chip->rw_need_retry = 1;
3385 sd_set_err_code(chip, SD_STS_ERR);
3386 TRACE_GOTO(chip, RW_FAIL);
3389 sd_card->seq_mode = 0;
3391 retval = rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
3392 if (retval != STATUS_SUCCESS) {
3393 sd_set_err_code(chip, SD_IO_ERR);
3394 TRACE_GOTO(chip, RW_FAIL);
3397 if ((sd_card->pre_sec_cnt < 0x80)
3398 && !CHK_SD30_SPEED(sd_card)
3399 && !CHK_SD_HS(sd_card)
3400 && !CHK_MMC_HS(sd_card)) {
3401 sd_send_cmd_get_rsp(chip, SEND_STATUS,
3402 sd_card->sd_addr, SD_RSP_TYPE_R1, NULL, 0);
3406 rtsx_init_cmd(chip);
3408 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x00);
3409 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 0x02);
3410 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, (u8)sector_cnt);
3411 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, (u8)(sector_cnt >> 8));
3413 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
3415 if (CHK_MMC_8BIT(sd_card)) {
3416 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_8);
3417 } else if (CHK_MMC_4BIT(sd_card) || CHK_SD(sd_card)) {
3418 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
3420 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_1);
3423 if (sd_card->seq_mode) {
3424 cfg2 = SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
3425 SD_NO_CHECK_CRC7 | SD_RSP_LEN_0;
3426 if (CHECK_PID(chip, 0x5209)) {
3427 if (!CHK_SD30_SPEED(sd_card)) {
3428 cfg2 |= SD_NO_CHECK_WAIT_CRC_TO;
3431 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, cfg2);
3433 trans_dma_enable(srb->sc_data_direction, chip, sector_cnt * 512, DMA_512);
3435 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3436 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3437 SD_TM_AUTO_READ_3 | SD_TRANSFER_START);
3439 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3440 SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3443 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
3445 rtsx_send_cmd_no_wait(chip);
3447 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3448 RTSX_DEBUGP("SD/MMC CMD %d\n", READ_MULTIPLE_BLOCK);
3449 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF,
3450 0x40 | READ_MULTIPLE_BLOCK);
3451 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, (u8)(data_addr >> 24));
3452 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, (u8)(data_addr >> 16));
3453 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, (u8)(data_addr >> 8));
3454 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, (u8)data_addr);
3456 cfg2 = SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
3457 SD_CHECK_CRC7 | SD_RSP_LEN_6;
3458 if (CHECK_PID(chip, 0x5209)) {
3459 if (!CHK_SD30_SPEED(sd_card)) {
3460 cfg2 |= SD_NO_CHECK_WAIT_CRC_TO;
3463 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, cfg2);
3465 trans_dma_enable(srb->sc_data_direction, chip, sector_cnt * 512, DMA_512);
3467 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3468 SD_TM_AUTO_READ_2 | SD_TRANSFER_START);
3469 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
3470 SD_TRANSFER_END, SD_TRANSFER_END);
3472 rtsx_send_cmd_no_wait(chip);
3474 retval = rtsx_send_cmd(chip, SD_CARD, 50);
3476 rtsx_clear_sd_error(chip);
3478 chip->rw_need_retry = 1;
3479 sd_set_err_code(chip, SD_TO_ERR);
3480 TRACE_GOTO(chip, RW_FAIL);
3483 retval = wait_data_buf_ready(chip);
3484 if (retval != STATUS_SUCCESS) {
3485 chip->rw_need_retry = 1;
3486 sd_set_err_code(chip, SD_TO_ERR);
3487 TRACE_GOTO(chip, RW_FAIL);
3490 retval = sd_send_cmd_get_rsp(chip, WRITE_MULTIPLE_BLOCK,
3491 data_addr, SD_RSP_TYPE_R1, NULL, 0);
3492 if (retval != STATUS_SUCCESS) {
3493 chip->rw_need_retry = 1;
3494 TRACE_GOTO(chip, RW_FAIL);
3497 rtsx_init_cmd(chip);
3499 cfg2 = SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END |
3500 SD_NO_CHECK_CRC7 | SD_RSP_LEN_0;
3501 if (CHECK_PID(chip, 0x5209)) {
3502 if (!CHK_SD30_SPEED(sd_card)) {
3503 cfg2 |= SD_NO_CHECK_WAIT_CRC_TO;
3506 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, cfg2);
3508 trans_dma_enable(srb->sc_data_direction, chip, sector_cnt * 512, DMA_512);
3510 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
3511 SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3512 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER,
3513 SD_TRANSFER_END, SD_TRANSFER_END);
3515 rtsx_send_cmd_no_wait(chip);
3518 sd_card->seq_mode = 1;
3521 retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb), scsi_bufflen(srb),
3522 scsi_sg_count(srb), srb->sc_data_direction, chip->sd_timeout);
3527 sd_card->seq_mode = 0;
3529 if (retval == -ETIMEDOUT) {
3530 err = STATUS_TIMEDOUT;
3535 rtsx_read_register(chip, REG_SD_STAT1, &stat);
3536 rtsx_clear_sd_error(chip);
3537 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3538 chip->rw_need_retry = 0;
3539 RTSX_DEBUGP("No card exist, exit sd_rw\n");
3540 TRACE_RET(chip, STATUS_FAIL);
3543 chip->rw_need_retry = 1;
3545 retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0, SD_RSP_TYPE_R1b, NULL, 0);
3546 if (retval != STATUS_SUCCESS) {
3547 sd_set_err_code(chip, SD_STS_ERR);
3548 TRACE_GOTO(chip, RW_FAIL);
3551 if (stat & (SD_CRC7_ERR | SD_CRC16_ERR | SD_CRC_WRITE_ERR)) {
3552 RTSX_DEBUGP("SD CRC error, tune clock!\n");
3553 sd_set_err_code(chip, SD_CRC_ERR);
3554 TRACE_GOTO(chip, RW_FAIL);
3557 if (err == STATUS_TIMEDOUT) {
3558 sd_set_err_code(chip, SD_TO_ERR);
3559 TRACE_GOTO(chip, RW_FAIL);
3562 TRACE_RET(chip, err);
3565 sd_card->pre_sec_addr = start_sector;
3566 sd_card->pre_sec_cnt = sector_cnt;
3567 sd_card->pre_dir = srb->sc_data_direction;
3569 return STATUS_SUCCESS;
3572 sd_card->seq_mode = 0;
3574 if (detect_card_cd(chip, SD_CARD) != STATUS_SUCCESS) {
3575 chip->rw_need_retry = 0;
3576 RTSX_DEBUGP("No card exist, exit sd_rw\n");
3577 TRACE_RET(chip, STATUS_FAIL);
3580 if (sd_check_err_code(chip, SD_CRC_ERR)) {
3581 if (CHK_MMC_4BIT(sd_card) || CHK_MMC_8BIT(sd_card)) {
3582 sd_card->mmc_dont_switch_bus = 1;
3583 reset_mmc_only(chip);
3584 sd_card->mmc_dont_switch_bus = 0;
3586 sd_card->need_retune = 1;
3587 sd_auto_tune_clock(chip);
3589 } else if (sd_check_err_code(chip, SD_TO_ERR | SD_STS_ERR)) {
3590 retval = reset_sd_card(chip);
3591 if (retval != STATUS_SUCCESS) {
3592 chip->card_ready &= ~SD_CARD;
3593 chip->card_fail |= SD_CARD;
3594 chip->capacity[chip->card2lun[SD_CARD]] = 0;
3598 TRACE_RET(chip, STATUS_FAIL);
3602 int soft_reset_sd_card(struct rtsx_chip *chip)
3604 return reset_sd(chip);
3607 int ext_sd_send_cmd_get_rsp(struct rtsx_chip *chip, u8 cmd_idx,
3608 u32 arg, u8 rsp_type, u8 *rsp, int rsp_len, int special_check)
3617 RTSX_DEBUGP("EXT SD/MMC CMD %d\n", cmd_idx);
3619 if (rsp_type == SD_RSP_TYPE_R1b) {
3625 rtsx_init_cmd(chip);
3627 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | cmd_idx);
3628 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, (u8)(arg >> 24));
3629 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, (u8)(arg >> 16));
3630 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, (u8)(arg >> 8));
3631 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, (u8)arg);
3633 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
3634 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
3635 0x01, PINGPONG_BUFFER);
3636 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
3637 0xFF, SD_TM_CMD_RSP | SD_TRANSFER_START);
3638 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
3640 if (rsp_type == SD_RSP_TYPE_R2) {
3641 for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16; reg_addr++) {
3642 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
3645 } else if (rsp_type != SD_RSP_TYPE_R0) {
3646 for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4; reg_addr++) {
3647 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0, 0);
3651 rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_CMD5, 0, 0);
3653 rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_STAT1, 0, 0);
3655 retval = rtsx_send_cmd(chip, SD_CARD, timeout);
3657 if (retval == -ETIMEDOUT) {
3658 rtsx_clear_sd_error(chip);
3660 if (rsp_type & SD_WAIT_BUSY_END) {
3661 retval = sd_check_data0_status(chip);
3662 if (retval != STATUS_SUCCESS) {
3663 TRACE_RET(chip, retval);
3666 sd_set_err_code(chip, SD_TO_ERR);
3669 TRACE_RET(chip, STATUS_FAIL);
3672 if (rsp_type == SD_RSP_TYPE_R0) {
3673 return STATUS_SUCCESS;
3676 ptr = rtsx_get_cmd_data(chip) + 1;
3678 if ((ptr[0] & 0xC0) != 0) {
3679 sd_set_err_code(chip, SD_STS_ERR);
3680 TRACE_RET(chip, STATUS_FAIL);
3683 if (!(rsp_type & SD_NO_CHECK_CRC7)) {
3684 if (ptr[stat_idx] & SD_CRC7_ERR) {
3685 if (cmd_idx == WRITE_MULTIPLE_BLOCK) {
3686 sd_set_err_code(chip, SD_CRC_ERR);
3687 TRACE_RET(chip, STATUS_FAIL);
3689 if (rty_cnt < SD_MAX_RETRY_COUNT) {
3694 sd_set_err_code(chip, SD_CRC_ERR);
3695 TRACE_RET(chip, STATUS_FAIL);
3700 if ((cmd_idx == SELECT_CARD) || (cmd_idx == APP_CMD) ||
3701 (cmd_idx == SEND_STATUS) || (cmd_idx == STOP_TRANSMISSION)) {
3702 if ((cmd_idx != STOP_TRANSMISSION) && (special_check == 0)) {
3703 if (ptr[1] & 0x80) {
3704 TRACE_RET(chip, STATUS_FAIL);
3707 #ifdef SUPPORT_SD_LOCK
3713 TRACE_RET(chip, STATUS_FAIL);
3715 if (ptr[2] & 0xF8) {
3716 TRACE_RET(chip, STATUS_FAIL);
3719 if (cmd_idx == SELECT_CARD) {
3720 if (rsp_type == SD_RSP_TYPE_R2) {
3721 if ((ptr[3] & 0x1E) != 0x04) {
3722 TRACE_RET(chip, STATUS_FAIL);
3724 } else if (rsp_type == SD_RSP_TYPE_R0) {
3725 if ((ptr[3] & 0x1E) != 0x03) {
3726 TRACE_RET(chip, STATUS_FAIL);
3732 if (rsp && rsp_len) {
3733 memcpy(rsp, ptr, rsp_len);
3736 return STATUS_SUCCESS;
3739 int ext_sd_get_rsp(struct rtsx_chip *chip, int len, u8 *rsp, u8 rsp_type)
3741 int retval, rsp_len;
3744 if (rsp_type == SD_RSP_TYPE_R0) {
3745 return STATUS_SUCCESS;
3748 rtsx_init_cmd(chip);
3750 if (rsp_type == SD_RSP_TYPE_R2) {
3751 for (reg_addr = PPBUF_BASE2; reg_addr < PPBUF_BASE2 + 16; reg_addr++) {
3752 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0xFF, 0);
3755 } else if (rsp_type != SD_RSP_TYPE_R0) {
3756 for (reg_addr = REG_SD_CMD0; reg_addr <= REG_SD_CMD4; reg_addr++) {
3757 rtsx_add_cmd(chip, READ_REG_CMD, reg_addr, 0xFF, 0);
3761 rtsx_add_cmd(chip, READ_REG_CMD, REG_SD_CMD5, 0xFF, 0);
3763 retval = rtsx_send_cmd(chip, SD_CARD, 100);
3764 if (retval != STATUS_SUCCESS) {
3765 TRACE_RET(chip, STATUS_FAIL);
3769 int min_len = (rsp_len < len) ? rsp_len : len;
3771 memcpy(rsp, rtsx_get_cmd_data(chip), min_len);
3773 RTSX_DEBUGP("min_len = %d\n", min_len);
3774 RTSX_DEBUGP("Response in cmd buf: 0x%x 0x%x 0x%x 0x%x\n",
3775 rsp[0], rsp[1], rsp[2], rsp[3]);
3778 return STATUS_SUCCESS;
3781 int sd_pass_thru_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3783 struct sd_info *sd_card = &(chip->sd_card);
3784 unsigned int lun = SCSI_LUN(srb);
3807 sd_card->pre_cmd_err = 0;
3809 if (!(CHK_BIT(chip->lun_mc, lun))) {
3810 SET_BIT(chip->lun_mc, lun);
3811 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
3812 TRACE_RET(chip, TRANSPORT_FAILED);
3815 if ((0x53 != srb->cmnd[2]) || (0x44 != srb->cmnd[3]) || (0x20 != srb->cmnd[4]) ||
3816 (0x43 != srb->cmnd[5]) || (0x61 != srb->cmnd[6]) ||
3817 (0x72 != srb->cmnd[7]) || (0x64 != srb->cmnd[8])) {
3818 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3819 TRACE_RET(chip, TRANSPORT_FAILED);
3822 switch (srb->cmnd[1] & 0x0F) {
3824 sd_card->sd_pass_thru_en = 0;
3828 sd_card->sd_pass_thru_en = 1;
3832 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3833 TRACE_RET(chip, TRANSPORT_FAILED);
3836 buf[5] = (1 == CHK_SD(sd_card)) ? 0x01 : 0x02;
3837 if (chip->card_wp & SD_CARD) {
3841 buf[6] = (u8)(sd_card->sd_addr >> 16);
3842 buf[7] = (u8)(sd_card->sd_addr >> 24);
3844 buf[15] = chip->max_lun;
3846 len = min(18, (int)scsi_bufflen(srb));
3847 rtsx_stor_set_xfer_buf(buf, len, srb);
3849 return TRANSPORT_GOOD;
3852 static inline int get_rsp_type(struct scsi_cmnd *srb, u8 *rsp_type, int *rsp_len)
3854 if (!rsp_type || !rsp_len) {
3858 switch (srb->cmnd[10]) {
3860 *rsp_type = SD_RSP_TYPE_R0;
3865 *rsp_type = SD_RSP_TYPE_R1;
3870 *rsp_type = SD_RSP_TYPE_R1b;
3875 *rsp_type = SD_RSP_TYPE_R2;
3880 *rsp_type = SD_RSP_TYPE_R3;
3888 return STATUS_SUCCESS;
3891 int sd_execute_no_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3893 struct sd_info *sd_card = &(chip->sd_card);
3894 unsigned int lun = SCSI_LUN(srb);
3895 int retval, rsp_len;
3896 u8 cmd_idx, rsp_type;
3897 u8 standby = 0, acmd = 0;
3900 if (!sd_card->sd_pass_thru_en) {
3901 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3902 TRACE_RET(chip, TRANSPORT_FAILED);
3905 retval = sd_switch_clock(chip);
3906 if (retval != STATUS_SUCCESS) {
3907 TRACE_RET(chip, TRANSPORT_FAILED);
3910 if (sd_card->pre_cmd_err) {
3911 sd_card->pre_cmd_err = 0;
3912 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
3913 TRACE_RET(chip, TRANSPORT_FAILED);
3916 cmd_idx = srb->cmnd[2] & 0x3F;
3917 if (srb->cmnd[1] & 0x02) {
3920 if (srb->cmnd[1] & 0x01) {
3924 arg = ((u32)srb->cmnd[3] << 24) | ((u32)srb->cmnd[4] << 16) |
3925 ((u32)srb->cmnd[5] << 8) | srb->cmnd[6];
3927 retval = get_rsp_type(srb, &rsp_type, &rsp_len);
3928 if (retval != STATUS_SUCCESS) {
3929 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3930 TRACE_RET(chip, TRANSPORT_FAILED);
3932 sd_card->last_rsp_type = rsp_type;
3934 retval = sd_switch_clock(chip);
3935 if (retval != STATUS_SUCCESS) {
3936 TRACE_RET(chip, TRANSPORT_FAILED);
3939 #ifdef SUPPORT_SD_LOCK
3940 if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
3941 if (CHK_MMC_8BIT(sd_card)) {
3942 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_8);
3943 if (retval != STATUS_SUCCESS) {
3944 TRACE_RET(chip, TRANSPORT_FAILED);
3946 } else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card)) {
3947 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
3948 if (retval != STATUS_SUCCESS) {
3949 TRACE_RET(chip, TRANSPORT_FAILED);
3954 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
3955 if (retval != STATUS_SUCCESS) {
3956 TRACE_RET(chip, TRANSPORT_FAILED);
3961 retval = sd_select_card(chip, 0);
3962 if (retval != STATUS_SUCCESS) {
3963 TRACE_GOTO(chip, SD_Execute_Cmd_Failed);
3968 retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
3969 SD_RSP_TYPE_R1, NULL, 0, 0);
3970 if (retval != STATUS_SUCCESS) {
3971 TRACE_GOTO(chip, SD_Execute_Cmd_Failed);
3975 retval = ext_sd_send_cmd_get_rsp(chip, cmd_idx, arg, rsp_type,
3976 sd_card->rsp, rsp_len, 0);
3977 if (retval != STATUS_SUCCESS) {
3978 TRACE_GOTO(chip, SD_Execute_Cmd_Failed);
3982 retval = sd_select_card(chip, 1);
3983 if (retval != STATUS_SUCCESS) {
3984 TRACE_GOTO(chip, SD_Execute_Cmd_Failed);
3988 #ifdef SUPPORT_SD_LOCK
3989 retval = sd_update_lock_status(chip);
3990 if (retval != STATUS_SUCCESS) {
3991 TRACE_GOTO(chip, SD_Execute_Cmd_Failed);
3995 scsi_set_resid(srb, 0);
3996 return TRANSPORT_GOOD;
3998 SD_Execute_Cmd_Failed:
3999 sd_card->pre_cmd_err = 1;
4000 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4001 release_sd_card(chip);
4002 do_reset_sd_card(chip);
4003 if (!(chip->card_ready & SD_CARD)) {
4004 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4007 TRACE_RET(chip, TRANSPORT_FAILED);
4010 int sd_execute_read_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4012 struct sd_info *sd_card = &(chip->sd_card);
4013 unsigned int lun = SCSI_LUN(srb);
4014 int retval, rsp_len, i;
4015 int cmd13_checkbit = 0, read_err = 0;
4016 u8 cmd_idx, rsp_type, bus_width;
4017 u8 send_cmd12 = 0, standby = 0, acmd = 0;
4020 if (!sd_card->sd_pass_thru_en) {
4021 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4022 TRACE_RET(chip, TRANSPORT_FAILED);
4025 if (sd_card->pre_cmd_err) {
4026 sd_card->pre_cmd_err = 0;
4027 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4028 TRACE_RET(chip, TRANSPORT_FAILED);
4031 retval = sd_switch_clock(chip);
4032 if (retval != STATUS_SUCCESS) {
4033 TRACE_RET(chip, TRANSPORT_FAILED);
4036 cmd_idx = srb->cmnd[2] & 0x3F;
4037 if (srb->cmnd[1] & 0x04) {
4040 if (srb->cmnd[1] & 0x02) {
4043 if (srb->cmnd[1] & 0x01) {
4047 data_len = ((u32)srb->cmnd[7] << 16) | ((u32)srb->cmnd[8] << 8) | srb->cmnd[9];
4049 retval = get_rsp_type(srb, &rsp_type, &rsp_len);
4050 if (retval != STATUS_SUCCESS) {
4051 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4052 TRACE_RET(chip, TRANSPORT_FAILED);
4054 sd_card->last_rsp_type = rsp_type;
4056 retval = sd_switch_clock(chip);
4057 if (retval != STATUS_SUCCESS) {
4058 TRACE_RET(chip, TRANSPORT_FAILED);
4061 #ifdef SUPPORT_SD_LOCK
4062 if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
4063 if (CHK_MMC_8BIT(sd_card)) {
4064 bus_width = SD_BUS_WIDTH_8;
4065 } else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card)) {
4066 bus_width = SD_BUS_WIDTH_4;
4068 bus_width = SD_BUS_WIDTH_1;
4071 bus_width = SD_BUS_WIDTH_4;
4073 RTSX_DEBUGP("bus_width = %d\n", bus_width);
4075 bus_width = SD_BUS_WIDTH_4;
4078 if (data_len < 512) {
4079 retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, data_len,
4080 SD_RSP_TYPE_R1, NULL, 0, 0);
4081 if (retval != STATUS_SUCCESS) {
4082 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4087 retval = sd_select_card(chip, 0);
4088 if (retval != STATUS_SUCCESS) {
4089 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4094 retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
4095 SD_RSP_TYPE_R1, NULL, 0, 0);
4096 if (retval != STATUS_SUCCESS) {
4097 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4101 if (data_len <= 512) {
4104 u16 byte_cnt, blk_cnt;
4107 byte_cnt = ((u16)(srb->cmnd[8] & 0x03) << 8) | srb->cmnd[9];
4110 cmd[0] = 0x40 | cmd_idx;
4111 cmd[1] = srb->cmnd[3];
4112 cmd[2] = srb->cmnd[4];
4113 cmd[3] = srb->cmnd[5];
4114 cmd[4] = srb->cmnd[6];
4116 buf = kmalloc(data_len, GFP_KERNEL);
4118 TRACE_RET(chip, TRANSPORT_ERROR);
4121 retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, byte_cnt,
4122 blk_cnt, bus_width, buf, data_len, 2000);
4123 if (retval != STATUS_SUCCESS) {
4126 rtsx_clear_sd_error(chip);
4127 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4130 min_len = min(data_len, scsi_bufflen(srb));
4131 rtsx_stor_set_xfer_buf(buf, min_len, srb);
4134 } else if (!(data_len & 0x1FF)) {
4135 rtsx_init_cmd(chip);
4137 trans_dma_enable(DMA_FROM_DEVICE, chip, data_len, DMA_512);
4139 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 0x02);
4140 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x00);
4141 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H,
4142 0xFF, (srb->cmnd[7] & 0xFE) >> 1);
4143 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L,
4144 0xFF, (u8)((data_len & 0x0001FE00) >> 9));
4146 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD0, 0xFF, 0x40 | cmd_idx);
4147 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD1, 0xFF, srb->cmnd[3]);
4148 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD2, 0xFF, srb->cmnd[4]);
4149 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD3, 0xFF, srb->cmnd[5]);
4150 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CMD4, 0xFF, srb->cmnd[6]);
4152 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG1, 0x03, bus_width);
4153 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_CFG2, 0xFF, rsp_type);
4155 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER,
4156 0xFF, SD_TM_AUTO_READ_2 | SD_TRANSFER_START);
4157 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
4159 rtsx_send_cmd_no_wait(chip);
4161 retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb), scsi_bufflen(srb),
4162 scsi_sg_count(srb), DMA_FROM_DEVICE, 10000);
4165 rtsx_clear_sd_error(chip);
4166 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4170 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4173 retval = ext_sd_get_rsp(chip, rsp_len, sd_card->rsp, rsp_type);
4174 if (retval != STATUS_SUCCESS) {
4175 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4179 retval = sd_select_card(chip, 1);
4180 if (retval != STATUS_SUCCESS) {
4181 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4186 retval = ext_sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION,
4187 0, SD_RSP_TYPE_R1b, NULL, 0, 0);
4188 if (retval != STATUS_SUCCESS) {
4189 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4193 if (data_len < 512) {
4194 retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200,
4195 SD_RSP_TYPE_R1, NULL, 0, 0);
4196 if (retval != STATUS_SUCCESS) {
4197 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4200 retval = rtsx_write_register(chip, SD_BYTE_CNT_H, 0xFF, 0x02);
4201 if (retval != STATUS_SUCCESS) {
4202 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4204 retval = rtsx_write_register(chip, SD_BYTE_CNT_L, 0xFF, 0x00);
4205 if (retval != STATUS_SUCCESS) {
4206 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4210 if ((srb->cmnd[1] & 0x02) || (srb->cmnd[1] & 0x04)) {
4214 for (i = 0; i < 3; i++) {
4215 retval = ext_sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
4216 SD_RSP_TYPE_R1, NULL, 0, cmd13_checkbit);
4217 if (retval == STATUS_SUCCESS) {
4221 if (retval != STATUS_SUCCESS) {
4222 TRACE_GOTO(chip, SD_Execute_Read_Cmd_Failed);
4225 scsi_set_resid(srb, 0);
4226 return TRANSPORT_GOOD;
4228 SD_Execute_Read_Cmd_Failed:
4229 sd_card->pre_cmd_err = 1;
4230 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4232 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
4234 release_sd_card(chip);
4235 do_reset_sd_card(chip);
4236 if (!(chip->card_ready & SD_CARD)) {
4237 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4240 TRACE_RET(chip, TRANSPORT_FAILED);
4243 int sd_execute_write_data(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4245 struct sd_info *sd_card = &(chip->sd_card);
4246 unsigned int lun = SCSI_LUN(srb);
4247 int retval, rsp_len, i;
4248 int cmd13_checkbit = 0, write_err = 0;
4249 u8 cmd_idx, rsp_type;
4250 u8 send_cmd12 = 0, standby = 0, acmd = 0;
4252 #ifdef SUPPORT_SD_LOCK
4253 int lock_cmd_fail = 0;
4254 u8 sd_lock_state = 0;
4255 u8 lock_cmd_type = 0;
4258 if (!sd_card->sd_pass_thru_en) {
4259 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4260 TRACE_RET(chip, TRANSPORT_FAILED);
4263 if (sd_card->pre_cmd_err) {
4264 sd_card->pre_cmd_err = 0;
4265 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4266 TRACE_RET(chip, TRANSPORT_FAILED);
4269 retval = sd_switch_clock(chip);
4270 if (retval != STATUS_SUCCESS) {
4271 TRACE_RET(chip, TRANSPORT_FAILED);
4274 cmd_idx = srb->cmnd[2] & 0x3F;
4275 if (srb->cmnd[1] & 0x04) {
4278 if (srb->cmnd[1] & 0x02) {
4281 if (srb->cmnd[1] & 0x01) {
4285 data_len = ((u32)srb->cmnd[7] << 16) | ((u32)srb->cmnd[8] << 8) | srb->cmnd[9];
4286 arg = ((u32)srb->cmnd[3] << 24) | ((u32)srb->cmnd[4] << 16) |
4287 ((u32)srb->cmnd[5] << 8) | srb->cmnd[6];
4289 #ifdef SUPPORT_SD_LOCK
4290 if (cmd_idx == LOCK_UNLOCK) {
4291 sd_lock_state = sd_card->sd_lock_status;
4292 sd_lock_state &= SD_LOCKED;
4296 retval = get_rsp_type(srb, &rsp_type, &rsp_len);
4297 if (retval != STATUS_SUCCESS) {
4298 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4299 TRACE_RET(chip, TRANSPORT_FAILED);
4301 sd_card->last_rsp_type = rsp_type;
4303 retval = sd_switch_clock(chip);
4304 if (retval != STATUS_SUCCESS) {
4305 TRACE_RET(chip, TRANSPORT_FAILED);
4308 #ifdef SUPPORT_SD_LOCK
4309 if ((sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) == 0) {
4310 if (CHK_MMC_8BIT(sd_card)) {
4311 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_8);
4312 if (retval != STATUS_SUCCESS) {
4313 TRACE_RET(chip, TRANSPORT_FAILED);
4315 } else if (CHK_SD(sd_card) || CHK_MMC_4BIT(sd_card)) {
4316 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
4317 if (retval != STATUS_SUCCESS) {
4318 TRACE_RET(chip, TRANSPORT_FAILED);
4323 retval = rtsx_write_register(chip, REG_SD_CFG1, 0x03, SD_BUS_WIDTH_4);
4324 if (retval != STATUS_SUCCESS) {
4325 TRACE_RET(chip, TRANSPORT_FAILED);
4329 if (data_len < 512) {
4330 retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, data_len,
4331 SD_RSP_TYPE_R1, NULL, 0, 0);
4332 if (retval != STATUS_SUCCESS) {
4333 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4338 retval = sd_select_card(chip, 0);
4339 if (retval != STATUS_SUCCESS) {
4340 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4345 retval = ext_sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
4346 SD_RSP_TYPE_R1, NULL, 0, 0);
4347 if (retval != STATUS_SUCCESS) {
4348 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4352 retval = ext_sd_send_cmd_get_rsp(chip, cmd_idx, arg, rsp_type,
4353 sd_card->rsp, rsp_len, 0);
4354 if (retval != STATUS_SUCCESS) {
4355 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4358 if (data_len <= 512) {
4362 buf = kmalloc(data_len, GFP_KERNEL);
4364 TRACE_RET(chip, TRANSPORT_ERROR);
4367 rtsx_stor_get_xfer_buf(buf, data_len, srb);
4369 #ifdef SUPPORT_SD_LOCK
4370 if (cmd_idx == LOCK_UNLOCK) {
4371 lock_cmd_type = buf[0] & 0x0F;
4375 if (data_len > 256) {
4376 rtsx_init_cmd(chip);
4377 for (i = 0; i < 256; i++) {
4378 rtsx_add_cmd(chip, WRITE_REG_CMD,
4379 PPBUF_BASE2 + i, 0xFF, buf[i]);
4381 retval = rtsx_send_cmd(chip, 0, 250);
4382 if (retval != STATUS_SUCCESS) {
4384 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4387 rtsx_init_cmd(chip);
4388 for (i = 256; i < data_len; i++) {
4389 rtsx_add_cmd(chip, WRITE_REG_CMD,
4390 PPBUF_BASE2 + i, 0xFF, buf[i]);
4392 retval = rtsx_send_cmd(chip, 0, 250);
4393 if (retval != STATUS_SUCCESS) {
4395 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4398 rtsx_init_cmd(chip);
4399 for (i = 0; i < data_len; i++) {
4400 rtsx_add_cmd(chip, WRITE_REG_CMD,
4401 PPBUF_BASE2 + i, 0xFF, buf[i]);
4403 retval = rtsx_send_cmd(chip, 0, 250);
4404 if (retval != STATUS_SUCCESS) {
4406 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4412 rtsx_init_cmd(chip);
4414 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, srb->cmnd[8] & 0x03);
4415 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, srb->cmnd[9]);
4416 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H, 0xFF, 0x00);
4417 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L, 0xFF, 0x01);
4418 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
4420 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF,
4421 SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
4422 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
4424 retval = rtsx_send_cmd(chip, SD_CARD, 250);
4425 } else if (!(data_len & 0x1FF)) {
4426 rtsx_init_cmd(chip);
4428 trans_dma_enable(DMA_TO_DEVICE, chip, data_len, DMA_512);
4430 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_H, 0xFF, 0x02);
4431 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BYTE_CNT_L, 0xFF, 0x00);
4432 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_H,
4433 0xFF, (srb->cmnd[7] & 0xFE) >> 1);
4434 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_BLOCK_CNT_L,
4435 0xFF, (u8)((data_len & 0x0001FE00) >> 9));
4437 rtsx_add_cmd(chip, WRITE_REG_CMD, REG_SD_TRANSFER, 0xFF, SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
4438 rtsx_add_cmd(chip, CHECK_REG_CMD, REG_SD_TRANSFER, SD_TRANSFER_END, SD_TRANSFER_END);
4440 rtsx_send_cmd_no_wait(chip);
4442 retval = rtsx_transfer_data(chip, SD_CARD, scsi_sglist(srb), scsi_bufflen(srb),
4443 scsi_sg_count(srb), DMA_TO_DEVICE, 10000);
4446 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4451 rtsx_clear_sd_error(chip);
4452 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4455 #ifdef SUPPORT_SD_LOCK
4456 if (cmd_idx == LOCK_UNLOCK) {
4457 if (lock_cmd_type == SD_ERASE) {
4458 sd_card->sd_erase_status = SD_UNDER_ERASING;
4459 scsi_set_resid(srb, 0);
4460 return TRANSPORT_GOOD;
4463 rtsx_init_cmd(chip);
4464 if (CHECK_PID(chip, 0x5209)) {
4465 rtsx_add_cmd(chip, CHECK_REG_CMD, SD_BUS_STAT, SD_DAT0_STATUS, SD_DAT0_STATUS);
4467 rtsx_add_cmd(chip, CHECK_REG_CMD, 0xFD30, 0x02, 0x02);
4469 rtsx_send_cmd(chip, SD_CARD, 250);
4471 retval = sd_update_lock_status(chip);
4472 if (retval != STATUS_SUCCESS) {
4473 RTSX_DEBUGP("Lock command fail!\n");
4477 #endif /* SUPPORT_SD_LOCK */
4480 retval = sd_select_card(chip, 1);
4481 if (retval != STATUS_SUCCESS) {
4482 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4487 retval = ext_sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION,
4488 0, SD_RSP_TYPE_R1b, NULL, 0, 0);
4489 if (retval != STATUS_SUCCESS) {
4490 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4494 if (data_len < 512) {
4495 retval = ext_sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200,
4496 SD_RSP_TYPE_R1, NULL, 0, 0);
4497 if (retval != STATUS_SUCCESS) {
4498 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4501 retval = rtsx_write_register(chip, SD_BYTE_CNT_H, 0xFF, 0x02);
4502 if (retval != STATUS_SUCCESS) {
4503 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4505 rtsx_write_register(chip, SD_BYTE_CNT_L, 0xFF, 0x00);
4506 if (retval != STATUS_SUCCESS) {
4507 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4511 if ((srb->cmnd[1] & 0x02) || (srb->cmnd[1] & 0x04)) {
4515 for (i = 0; i < 3; i++) {
4516 retval = ext_sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
4517 SD_RSP_TYPE_R1, NULL, 0, cmd13_checkbit);
4518 if (retval == STATUS_SUCCESS) {
4522 if (retval != STATUS_SUCCESS) {
4523 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4526 #ifdef SUPPORT_SD_LOCK
4527 if (cmd_idx == LOCK_UNLOCK) {
4528 if (!lock_cmd_fail) {
4529 RTSX_DEBUGP("lock_cmd_type = 0x%x\n", lock_cmd_type);
4530 if (lock_cmd_type & SD_CLR_PWD) {
4531 sd_card->sd_lock_status &= ~SD_PWD_EXIST;
4533 if (lock_cmd_type & SD_SET_PWD) {
4534 sd_card->sd_lock_status |= SD_PWD_EXIST;
4538 RTSX_DEBUGP("sd_lock_state = 0x%x, sd_card->sd_lock_status = 0x%x\n",
4539 sd_lock_state, sd_card->sd_lock_status);
4540 if (sd_lock_state ^ (sd_card->sd_lock_status & SD_LOCKED)) {
4541 sd_card->sd_lock_notify = 1;
4542 if (sd_lock_state) {
4543 if (sd_card->sd_lock_status & SD_LOCK_1BIT_MODE) {
4544 sd_card->sd_lock_status |= (SD_UNLOCK_POW_ON | SD_SDR_RST);
4545 if (CHK_SD(sd_card)) {
4546 retval = reset_sd(chip);
4547 if (retval != STATUS_SUCCESS) {
4548 sd_card->sd_lock_status &= ~(SD_UNLOCK_POW_ON | SD_SDR_RST);
4549 TRACE_GOTO(chip, SD_Execute_Write_Cmd_Failed);
4553 sd_card->sd_lock_status &= ~(SD_UNLOCK_POW_ON | SD_SDR_RST);
4559 if (lock_cmd_fail) {
4560 scsi_set_resid(srb, 0);
4561 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4562 TRACE_RET(chip, TRANSPORT_FAILED);
4564 #endif /* SUPPORT_SD_LOCK */
4566 scsi_set_resid(srb, 0);
4567 return TRANSPORT_GOOD;
4569 SD_Execute_Write_Cmd_Failed:
4570 sd_card->pre_cmd_err = 1;
4571 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
4573 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
4575 release_sd_card(chip);
4576 do_reset_sd_card(chip);
4577 if (!(chip->card_ready & SD_CARD)) {
4578 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4581 TRACE_RET(chip, TRANSPORT_FAILED);
4584 int sd_get_cmd_rsp(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4586 struct sd_info *sd_card = &(chip->sd_card);
4587 unsigned int lun = SCSI_LUN(srb);
4591 if (!sd_card->sd_pass_thru_en) {
4592 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4593 TRACE_RET(chip, TRANSPORT_FAILED);
4596 if (sd_card->pre_cmd_err) {
4597 sd_card->pre_cmd_err = 0;
4598 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4599 TRACE_RET(chip, TRANSPORT_FAILED);
4602 data_len = ((u16)srb->cmnd[7] << 8) | srb->cmnd[8];
4604 if (sd_card->last_rsp_type == SD_RSP_TYPE_R0) {
4605 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4606 TRACE_RET(chip, TRANSPORT_FAILED);
4607 } else if (sd_card->last_rsp_type == SD_RSP_TYPE_R2) {
4608 count = (data_len < 17) ? data_len : 17;
4610 count = (data_len < 6) ? data_len : 6;
4612 rtsx_stor_set_xfer_buf(sd_card->rsp, count, srb);
4614 RTSX_DEBUGP("Response length: %d\n", data_len);
4615 RTSX_DEBUGP("Response: 0x%x 0x%x 0x%x 0x%x\n",
4616 sd_card->rsp[0], sd_card->rsp[1], sd_card->rsp[2], sd_card->rsp[3]);
4618 scsi_set_resid(srb, 0);
4619 return TRANSPORT_GOOD;
4622 int sd_hw_rst(struct scsi_cmnd *srb, struct rtsx_chip *chip)
4624 struct sd_info *sd_card = &(chip->sd_card);
4625 unsigned int lun = SCSI_LUN(srb);
4628 if (!sd_card->sd_pass_thru_en) {
4629 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4630 TRACE_RET(chip, TRANSPORT_FAILED);
4633 if (sd_card->pre_cmd_err) {
4634 sd_card->pre_cmd_err = 0;
4635 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
4636 TRACE_RET(chip, TRANSPORT_FAILED);
4639 if ((0x53 != srb->cmnd[2]) || (0x44 != srb->cmnd[3]) || (0x20 != srb->cmnd[4]) ||
4640 (0x43 != srb->cmnd[5]) || (0x61 != srb->cmnd[6]) ||
4641 (0x72 != srb->cmnd[7]) || (0x64 != srb->cmnd[8])) {
4642 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4643 TRACE_RET(chip, TRANSPORT_FAILED);
4646 switch (srb->cmnd[1] & 0x0F) {
4648 #ifdef SUPPORT_SD_LOCK
4649 if (0x64 == srb->cmnd[9]) {
4650 sd_card->sd_lock_status |= SD_SDR_RST;
4653 retval = reset_sd_card(chip);
4654 if (retval != STATUS_SUCCESS) {
4655 #ifdef SUPPORT_SD_LOCK
4656 sd_card->sd_lock_status &= ~SD_SDR_RST;
4658 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4659 sd_card->pre_cmd_err = 1;
4660 TRACE_RET(chip, TRANSPORT_FAILED);
4662 #ifdef SUPPORT_SD_LOCK
4663 sd_card->sd_lock_status &= ~SD_SDR_RST;
4668 retval = soft_reset_sd_card(chip);
4669 if (retval != STATUS_SUCCESS) {
4670 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
4671 sd_card->pre_cmd_err = 1;
4672 TRACE_RET(chip, TRANSPORT_FAILED);
4677 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
4678 TRACE_RET(chip, TRANSPORT_FAILED);
4681 scsi_set_resid(srb, 0);
4682 return TRANSPORT_GOOD;
4686 void sd_cleanup_work(struct rtsx_chip *chip)
4688 struct sd_info *sd_card = &(chip->sd_card);
4690 if (sd_card->seq_mode) {
4691 RTSX_DEBUGP("SD: stop transmission\n");
4692 sd_stop_seq_mode(chip);
4693 sd_card->cleanup_counter = 0;
4697 int sd_power_off_card3v3(struct rtsx_chip *chip)
4701 retval = disable_card_clock(chip, SD_CARD);
4702 if (retval != STATUS_SUCCESS) {
4703 TRACE_RET(chip, STATUS_FAIL);
4706 RTSX_WRITE_REG(chip, CARD_OE, SD_OUTPUT_EN, 0);
4708 if (!chip->ft2_fast_mode) {
4709 retval = card_power_off(chip, SD_CARD);
4710 if (retval != STATUS_SUCCESS) {
4711 TRACE_RET(chip, STATUS_FAIL);
4717 if (chip->asic_code) {
4718 retval = sd_pull_ctl_disable(chip);
4719 if (retval != STATUS_SUCCESS) {
4720 TRACE_RET(chip, STATUS_FAIL);
4723 RTSX_WRITE_REG(chip, FPGA_PULL_CTL,
4724 FPGA_SD_PULL_CTL_BIT | 0x20, FPGA_SD_PULL_CTL_BIT);
4727 return STATUS_SUCCESS;
4730 int release_sd_card(struct rtsx_chip *chip)
4732 struct sd_info *sd_card = &(chip->sd_card);
4735 RTSX_DEBUGP("release_sd_card\n");
4737 chip->card_ready &= ~SD_CARD;
4738 chip->card_fail &= ~SD_CARD;
4739 chip->card_wp &= ~SD_CARD;
4744 #ifdef SUPPORT_SD_LOCK
4745 sd_card->sd_lock_status = 0;
4746 sd_card->sd_erase_status = 0;
4749 memset(sd_card->raw_csd, 0, 16);
4750 memset(sd_card->raw_scr, 0, 8);
4752 retval = sd_power_off_card3v3(chip);
4753 if (retval != STATUS_SUCCESS) {
4754 TRACE_RET(chip, STATUS_FAIL);
4757 if (CHECK_PID(chip, 0x5209)) {
4758 retval = sd_change_bank_voltage(chip, SD_IO_3V3);
4759 if (retval != STATUS_SUCCESS) {
4760 TRACE_RET(chip, STATUS_FAIL);
4763 if (CHK_SD30_SPEED(sd_card)) {
4764 RTSX_WRITE_REG(chip, SD30_DRIVE_SEL, 0x07, chip->sd30_drive_sel_3v3);
4767 RTSX_WRITE_REG(chip, OCPPARA2, SD_OCP_THD_MASK, chip->sd_400mA_ocp_thd);
4770 return STATUS_SUCCESS;