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