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