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