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