Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
xd.c
Go to the documentation of this file.
1 /* Driver for Realtek PCI-Express card reader
2  *
3  * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License as published by the
7  * Free Software Foundation; either version 2, or (at your option) any
8  * later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, see <http://www.gnu.org/licenses/>.
17  *
18  * Author:
19  * wwang ([email protected])
20  * No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
21  */
22 
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
26 #include <linux/vmalloc.h>
27 
28 #include "rtsx.h"
29 #include "rtsx_transport.h"
30 #include "rtsx_scsi.h"
31 #include "rtsx_card.h"
32 #include "xd.h"
33 
34 static int xd_build_l2p_tbl(struct rtsx_chip *chip, int zone_no);
35 static int xd_init_page(struct rtsx_chip *chip, u32 phy_blk, u16 logoff, u8 start_page, u8 end_page);
36 
37 static inline void xd_set_err_code(struct rtsx_chip *chip, u8 err_code)
38 {
39  struct xd_info *xd_card = &(chip->xd_card);
40 
41  xd_card->err_code = err_code;
42 }
43 
44 static inline int xd_check_err_code(struct rtsx_chip *chip, u8 err_code)
45 {
46  struct xd_info *xd_card = &(chip->xd_card);
47 
48  return (xd_card->err_code == err_code);
49 }
50 
51 static int xd_set_init_para(struct rtsx_chip *chip)
52 {
53  struct xd_info *xd_card = &(chip->xd_card);
54  int retval;
55 
56  if (chip->asic_code)
57  xd_card->xd_clock = 47;
58  else
59  xd_card->xd_clock = CLK_50;
60 
61  retval = switch_clock(chip, xd_card->xd_clock);
62  if (retval != STATUS_SUCCESS)
63  TRACE_RET(chip, STATUS_FAIL);
64 
65  return STATUS_SUCCESS;
66 }
67 
68 static int xd_switch_clock(struct rtsx_chip *chip)
69 {
70  struct xd_info *xd_card = &(chip->xd_card);
71  int retval;
72 
73  retval = select_card(chip, XD_CARD);
74  if (retval != STATUS_SUCCESS)
75  TRACE_RET(chip, STATUS_FAIL);
76 
77  retval = switch_clock(chip, xd_card->xd_clock);
78  if (retval != STATUS_SUCCESS)
79  TRACE_RET(chip, STATUS_FAIL);
80 
81  return STATUS_SUCCESS;
82 }
83 
84 static int xd_read_id(struct rtsx_chip *chip, u8 id_cmd, u8 *id_buf, u8 buf_len)
85 {
86  int retval, i;
87  u8 *ptr;
88 
89  rtsx_init_cmd(chip);
90 
91  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_DAT, 0xFF, id_cmd);
94 
95  for (i = 0; i < 4; i++)
96  rtsx_add_cmd(chip, READ_REG_CMD, (u16)(XD_ADDRESS1 + i), 0, 0);
97 
98  retval = rtsx_send_cmd(chip, XD_CARD, 20);
99  if (retval < 0)
100  TRACE_RET(chip, STATUS_FAIL);
101 
102  ptr = rtsx_get_cmd_data(chip) + 1;
103  if (id_buf && buf_len) {
104  if (buf_len > 4)
105  buf_len = 4;
106  memcpy(id_buf, ptr, buf_len);
107  }
108 
109  return STATUS_SUCCESS;
110 }
111 
112 static void xd_assign_phy_addr(struct rtsx_chip *chip, u32 addr, u8 mode)
113 {
114  struct xd_info *xd_card = &(chip->xd_card);
115 
116  switch (mode) {
117  case XD_RW_ADDR:
118  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS0, 0xFF, 0);
119  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS1, 0xFF, (u8)addr);
120  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS2, 0xFF, (u8)(addr >> 8));
121  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS3, 0xFF, (u8)(addr >> 16));
122  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_CFG, 0xFF,
124  break;
125 
126  case XD_ERASE_ADDR:
127  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS0, 0xFF, (u8)addr);
128  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS1, 0xFF, (u8)(addr >> 8));
129  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_ADDRESS2, 0xFF, (u8)(addr >> 16));
130  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_CFG, 0xFF,
131  (xd_card->addr_cycle - 1) | XD_CALC_ECC | XD_BA_NO_TRANSFORM);
132  break;
133 
134  default:
135  break;
136  }
137 }
138 
139 static int xd_read_redundant(struct rtsx_chip *chip, u32 page_addr, u8 *buf, int buf_len)
140 {
141  int retval, i;
142 
143  rtsx_init_cmd(chip);
144 
145  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
146 
149 
150  for (i = 0; i < 6; i++)
151  rtsx_add_cmd(chip, READ_REG_CMD, (u16)(XD_PAGE_STATUS + i), 0, 0);
152  for (i = 0; i < 4; i++)
153  rtsx_add_cmd(chip, READ_REG_CMD, (u16)(XD_RESERVED0 + i), 0, 0);
154  rtsx_add_cmd(chip, READ_REG_CMD, XD_PARITY, 0, 0);
155 
156  retval = rtsx_send_cmd(chip, XD_CARD, 500);
157  if (retval < 0)
158  TRACE_RET(chip, STATUS_FAIL);
159 
160  if (buf && buf_len) {
161  u8 *ptr = rtsx_get_cmd_data(chip) + 1;
162 
163  if (buf_len > 11)
164  buf_len = 11;
165  memcpy(buf, ptr, buf_len);
166  }
167 
168  return STATUS_SUCCESS;
169 }
170 
171 static int xd_read_data_from_ppb(struct rtsx_chip *chip, int offset, u8 *buf, int buf_len)
172 {
173  int retval, i;
174 
175  if (!buf || (buf_len < 0))
176  TRACE_RET(chip, STATUS_FAIL);
177 
178  rtsx_init_cmd(chip);
179 
180  for (i = 0; i < buf_len; i++)
181  rtsx_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + offset + i, 0, 0);
182 
183  retval = rtsx_send_cmd(chip, 0, 250);
184  if (retval < 0) {
185  rtsx_clear_xd_error(chip);
186  TRACE_RET(chip, STATUS_FAIL);
187  }
188 
189  memcpy(buf, rtsx_get_cmd_data(chip), buf_len);
190 
191  return STATUS_SUCCESS;
192 }
193 
194 static int xd_read_cis(struct rtsx_chip *chip, u32 page_addr, u8 *buf, int buf_len)
195 {
196  int retval;
197  u8 reg;
198 
199  if (!buf || (buf_len < 10))
200  TRACE_RET(chip, STATUS_FAIL);
201 
202  rtsx_init_cmd(chip);
203 
204  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
205 
207  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, 1);
209 
212 
213  retval = rtsx_send_cmd(chip, XD_CARD, 250);
214  if (retval == -ETIMEDOUT) {
215  rtsx_clear_xd_error(chip);
216  TRACE_RET(chip, STATUS_FAIL);
217  }
218 
219  RTSX_READ_REG(chip, XD_PAGE_STATUS, &reg);
220  if (reg != XD_GPG) {
221  rtsx_clear_xd_error(chip);
222  TRACE_RET(chip, STATUS_FAIL);
223  }
224 
225  RTSX_READ_REG(chip, XD_CTL, &reg);
226  if (!(reg & XD_ECC1_ERROR) || !(reg & XD_ECC1_UNCORRECTABLE)) {
227  retval = xd_read_data_from_ppb(chip, 0, buf, buf_len);
228  if (retval != STATUS_SUCCESS)
229  TRACE_RET(chip, STATUS_FAIL);
230  if (reg & XD_ECC1_ERROR) {
231  u8 ecc_bit, ecc_byte;
232 
233  RTSX_READ_REG(chip, XD_ECC_BIT1, &ecc_bit);
234  RTSX_READ_REG(chip, XD_ECC_BYTE1, &ecc_byte);
235 
236  RTSX_DEBUGP("ECC_BIT1 = 0x%x, ECC_BYTE1 = 0x%x\n", ecc_bit, ecc_byte);
237  if (ecc_byte < buf_len) {
238  RTSX_DEBUGP("Before correct: 0x%x\n", buf[ecc_byte]);
239  buf[ecc_byte] ^= (1 << ecc_bit);
240  RTSX_DEBUGP("After correct: 0x%x\n", buf[ecc_byte]);
241  }
242  }
243  } else if (!(reg & XD_ECC2_ERROR) || !(reg & XD_ECC2_UNCORRECTABLE)) {
244  rtsx_clear_xd_error(chip);
245 
246  retval = xd_read_data_from_ppb(chip, 256, buf, buf_len);
247  if (retval != STATUS_SUCCESS)
248  TRACE_RET(chip, STATUS_FAIL);
249  if (reg & XD_ECC2_ERROR) {
250  u8 ecc_bit, ecc_byte;
251 
252  RTSX_READ_REG(chip, XD_ECC_BIT2, &ecc_bit);
253  RTSX_READ_REG(chip, XD_ECC_BYTE2, &ecc_byte);
254 
255  RTSX_DEBUGP("ECC_BIT2 = 0x%x, ECC_BYTE2 = 0x%x\n", ecc_bit, ecc_byte);
256  if (ecc_byte < buf_len) {
257  RTSX_DEBUGP("Before correct: 0x%x\n", buf[ecc_byte]);
258  buf[ecc_byte] ^= (1 << ecc_bit);
259  RTSX_DEBUGP("After correct: 0x%x\n", buf[ecc_byte]);
260  }
261  }
262  } else {
263  rtsx_clear_xd_error(chip);
264  TRACE_RET(chip, STATUS_FAIL);
265  }
266 
267  return STATUS_SUCCESS;
268 }
269 
270 static void xd_fill_pull_ctl_disable(struct rtsx_chip *chip)
271 {
272  if (CHECK_PID(chip, 0x5209)) {
273  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
274  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
275  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0xD5);
276  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
277  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
278  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x15);
279  } else if (CHECK_PID(chip, 0x5208)) {
291  } else if (CHECK_PID(chip, 0x5288)) {
292  if (CHECK_BARO_PKG(chip, QFN)) {
293  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
294  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
295  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x4B);
296  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x69);
297  }
298  }
299 }
300 
301 static void xd_fill_pull_ctl_stage1_barossa(struct rtsx_chip *chip)
302 {
303  if (CHECK_BARO_PKG(chip, QFN)) {
304  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
305  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
306  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x4B);
307  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
308  }
309 }
310 
311 static void xd_fill_pull_ctl_enable(struct rtsx_chip *chip)
312 {
313  if (CHECK_PID(chip, 0x5209)) {
314  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0xAA);
315  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
316  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0xD5);
317  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
318  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
319  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x15);
320  } else if (CHECK_PID(chip, 0x5208)) {
332  } else if (CHECK_PID(chip, 0x5288)) {
333  if (CHECK_BARO_PKG(chip, QFN)) {
334  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
335  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
336  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x53);
337  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0xA9);
338  }
339  }
340 }
341 
342 static int xd_pull_ctl_disable(struct rtsx_chip *chip)
343 {
344  if (CHECK_PID(chip, 0x5209)) {
345  RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF, 0x55);
346  RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF, 0x55);
347  RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF, 0xD5);
348  RTSX_WRITE_REG(chip, CARD_PULL_CTL4, 0xFF, 0x55);
349  RTSX_WRITE_REG(chip, CARD_PULL_CTL5, 0xFF, 0x55);
350  RTSX_WRITE_REG(chip, CARD_PULL_CTL6, 0xFF, 0x15);
351  } else if (CHECK_PID(chip, 0x5208)) {
352  RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF,
354  RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF,
356  RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF,
358  RTSX_WRITE_REG(chip, CARD_PULL_CTL4, 0xFF,
360  RTSX_WRITE_REG(chip, CARD_PULL_CTL5, 0xFF,
363  } else if (CHECK_PID(chip, 0x5288)) {
364  if (CHECK_BARO_PKG(chip, QFN)) {
365  RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF, 0x55);
366  RTSX_WRITE_REG(chip, CARD_PULL_CTL2, 0xFF, 0x55);
367  RTSX_WRITE_REG(chip, CARD_PULL_CTL3, 0xFF, 0x4B);
368  RTSX_WRITE_REG(chip, CARD_PULL_CTL4, 0xFF, 0x69);
369  }
370  }
371 
372  return STATUS_SUCCESS;
373 }
374 
375 static void xd_clear_dma_buffer(struct rtsx_chip *chip)
376 {
377  if (CHECK_PID(chip, 0x5209)) {
378  int retval;
379  u8 *buf;
380 
381  RTSX_DEBUGP("xD ECC error, dummy write!\n");
382 
383  buf = kmalloc(512, GFP_KERNEL);
384  if (!buf)
385  return;
386 
387  rtsx_init_cmd(chip);
388 
390 
393  if (chip->asic_code) {
394  rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0xAA);
395  } else {
398  }
399 
400  rtsx_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0x00);
401  rtsx_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF, 0x02);
402  rtsx_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, 1);
403  rtsx_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF, 0);
405 
407 
411 
412  rtsx_send_cmd_no_wait(chip);
413 
414  retval = rtsx_transfer_data(chip, SD_CARD, buf, 512, 0, DMA_TO_DEVICE, 100);
415  if (retval < 0) {
416  u8 val;
417 
418  rtsx_read_register(chip, SD_STAT1, &val);
419  RTSX_DEBUGP("SD_STAT1: 0x%x\n", val);
420 
421  rtsx_read_register(chip, SD_STAT2, &val);
422  RTSX_DEBUGP("SD_STAT2: 0x%x\n", val);
423 
424  rtsx_read_register(chip, SD_BUS_STAT, &val);
425  RTSX_DEBUGP("SD_BUS_STAT: 0x%x\n", val);
426 
428  }
429 
430  kfree(buf);
431 
432  if (chip->asic_code) {
433  rtsx_write_register(chip, CARD_PULL_CTL2, 0xFF, 0x55);
434  } else {
437  }
440  }
441 }
442 
443 static int reset_xd(struct rtsx_chip *chip)
444 {
445  struct xd_info *xd_card = &(chip->xd_card);
446  int retval, i, j;
447  u8 *ptr, id_buf[4], redunt[11];
448 
449  retval = select_card(chip, XD_CARD);
450  if (retval != STATUS_SUCCESS)
451  TRACE_RET(chip, STATUS_FAIL);
452 
453  rtsx_init_cmd(chip);
454 
456  if (chip->asic_code) {
457  if (!CHECK_PID(chip, 0x5288))
458  xd_fill_pull_ctl_disable(chip);
459  else
460  xd_fill_pull_ctl_stage1_barossa(chip);
461  } else {
464  }
465 
466  if (!chip->ft2_fast_mode)
468 
470 
471  retval = rtsx_send_cmd(chip, XD_CARD, 100);
472  if (retval < 0)
473  TRACE_RET(chip, STATUS_FAIL);
474 
475  if (!chip->ft2_fast_mode) {
476  retval = card_power_off(chip, XD_CARD);
477  if (retval != STATUS_SUCCESS)
478  TRACE_RET(chip, STATUS_FAIL);
479 
480  wait_timeout(250);
481 
482  if (CHECK_PID(chip, 0x5209))
483  RTSX_WRITE_REG(chip, CARD_PULL_CTL1, 0xFF, 0xAA);
484 
485  rtsx_init_cmd(chip);
486 
487  if (chip->asic_code) {
488  xd_fill_pull_ctl_enable(chip);
489  } else {
492  }
493 
494  retval = rtsx_send_cmd(chip, XD_CARD, 100);
495  if (retval < 0)
496  TRACE_RET(chip, STATUS_FAIL);
497 
498  retval = card_power_on(chip, XD_CARD);
499  if (retval != STATUS_SUCCESS)
500  TRACE_RET(chip, STATUS_FAIL);
501 
502 #ifdef SUPPORT_OCP
503  wait_timeout(50);
504  if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) {
505  RTSX_DEBUGP("Over current, OCPSTAT is 0x%x\n", chip->ocp_stat);
506  TRACE_RET(chip, STATUS_FAIL);
507  }
508 #endif
509  }
510 
511  rtsx_init_cmd(chip);
512 
513  if (chip->ft2_fast_mode) {
514  if (chip->asic_code) {
515  xd_fill_pull_ctl_enable(chip);
516  } else {
519  }
520  }
521 
524 
525  retval = rtsx_send_cmd(chip, XD_CARD, 100);
526  if (retval < 0)
527  TRACE_RET(chip, STATUS_FAIL);
528 
529  if (!chip->ft2_fast_mode)
530  wait_timeout(200);
531 
532  retval = xd_set_init_para(chip);
533  if (retval != STATUS_SUCCESS)
534  TRACE_RET(chip, STATUS_FAIL);
535 
536  /* Read ID to check if the timing setting is right */
537  for (i = 0; i < 4; i++) {
538  rtsx_init_cmd(chip);
539 
540  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_DTCTL, 0xFF,
541  XD_TIME_SETUP_STEP * 3 + XD_TIME_RW_STEP * (2 + i) + XD_TIME_RWN_STEP * i);
542  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_CATCTL, 0xFF,
543  XD_TIME_SETUP_STEP * 3 + XD_TIME_RW_STEP * (4 + i) + XD_TIME_RWN_STEP * (3 + i));
544 
547 
548  rtsx_add_cmd(chip, READ_REG_CMD, XD_DAT, 0, 0);
549  rtsx_add_cmd(chip, READ_REG_CMD, XD_CTL, 0, 0);
550 
551  retval = rtsx_send_cmd(chip, XD_CARD, 100);
552  if (retval < 0)
553  TRACE_RET(chip, STATUS_FAIL);
554 
555  ptr = rtsx_get_cmd_data(chip) + 1;
556 
557  RTSX_DEBUGP("XD_DAT: 0x%x, XD_CTL: 0x%x\n", ptr[0], ptr[1]);
558 
559  if (((ptr[0] & READY_FLAG) != READY_STATE) || !(ptr[1] & XD_RDY))
560  continue;
561 
562  retval = xd_read_id(chip, READ_ID, id_buf, 4);
563  if (retval != STATUS_SUCCESS)
564  TRACE_RET(chip, STATUS_FAIL);
565 
566  RTSX_DEBUGP("READ_ID: 0x%x 0x%x 0x%x 0x%x\n",
567  id_buf[0], id_buf[1], id_buf[2], id_buf[3]);
568 
569  xd_card->device_code = id_buf[1];
570 
571  /* Check if the xD card is supported */
572  switch (xd_card->device_code) {
573  case XD_4M_X8_512_1:
574  case XD_4M_X8_512_2:
575  xd_card->block_shift = 4;
576  xd_card->page_off = 0x0F;
577  xd_card->addr_cycle = 3;
578  xd_card->zone_cnt = 1;
579  xd_card->capacity = 8000;
580  XD_SET_4MB(xd_card);
581  break;
582  case XD_8M_X8_512:
583  xd_card->block_shift = 4;
584  xd_card->page_off = 0x0F;
585  xd_card->addr_cycle = 3;
586  xd_card->zone_cnt = 1;
587  xd_card->capacity = 16000;
588  break;
589  case XD_16M_X8_512:
590  XD_PAGE_512(xd_card);
591  xd_card->addr_cycle = 3;
592  xd_card->zone_cnt = 1;
593  xd_card->capacity = 32000;
594  break;
595  case XD_32M_X8_512:
596  XD_PAGE_512(xd_card);
597  xd_card->addr_cycle = 3;
598  xd_card->zone_cnt = 2;
599  xd_card->capacity = 64000;
600  break;
601  case XD_64M_X8_512:
602  XD_PAGE_512(xd_card);
603  xd_card->addr_cycle = 4;
604  xd_card->zone_cnt = 4;
605  xd_card->capacity = 128000;
606  break;
607  case XD_128M_X8_512:
608  XD_PAGE_512(xd_card);
609  xd_card->addr_cycle = 4;
610  xd_card->zone_cnt = 8;
611  xd_card->capacity = 256000;
612  break;
613  case XD_256M_X8_512:
614  XD_PAGE_512(xd_card);
615  xd_card->addr_cycle = 4;
616  xd_card->zone_cnt = 16;
617  xd_card->capacity = 512000;
618  break;
619  case XD_512M_X8:
620  XD_PAGE_512(xd_card);
621  xd_card->addr_cycle = 4;
622  xd_card->zone_cnt = 32;
623  xd_card->capacity = 1024000;
624  break;
625  case xD_1G_X8_512:
626  XD_PAGE_512(xd_card);
627  xd_card->addr_cycle = 4;
628  xd_card->zone_cnt = 64;
629  xd_card->capacity = 2048000;
630  break;
631  case xD_2G_X8_512:
632  XD_PAGE_512(xd_card);
633  xd_card->addr_cycle = 4;
634  xd_card->zone_cnt = 128;
635  xd_card->capacity = 4096000;
636  break;
637  default:
638  continue;
639  }
640 
641  /* Confirm timing setting */
642  for (j = 0; j < 10; j++) {
643  retval = xd_read_id(chip, READ_ID, id_buf, 4);
644  if (retval != STATUS_SUCCESS)
645  TRACE_RET(chip, STATUS_FAIL);
646 
647  if (id_buf[1] != xd_card->device_code)
648  break;
649  }
650 
651  if (j == 10)
652  break;
653  }
654 
655  if (i == 4) {
656  xd_card->block_shift = 0;
657  xd_card->page_off = 0;
658  xd_card->addr_cycle = 0;
659  xd_card->capacity = 0;
660 
661  TRACE_RET(chip, STATUS_FAIL);
662  }
663 
664  retval = xd_read_id(chip, READ_xD_ID, id_buf, 4);
665  if (retval != STATUS_SUCCESS)
666  TRACE_RET(chip, STATUS_FAIL);
667  RTSX_DEBUGP("READ_xD_ID: 0x%x 0x%x 0x%x 0x%x\n",
668  id_buf[0], id_buf[1], id_buf[2], id_buf[3]);
669  if (id_buf[2] != XD_ID_CODE)
670  TRACE_RET(chip, STATUS_FAIL);
671 
672  /* Search CIS block */
673  for (i = 0; i < 24; i++) {
674  u32 page_addr;
675 
676  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS)
677  TRACE_RET(chip, STATUS_FAIL);
678 
679  page_addr = (u32)i << xd_card->block_shift;
680 
681  for (j = 0; j < 3; j++) {
682  retval = xd_read_redundant(chip, page_addr, redunt, 11);
683  if (retval == STATUS_SUCCESS)
684  break;
685  }
686  if (j == 3)
687  continue;
688 
689  if (redunt[BLOCK_STATUS] != XD_GBLK)
690  continue;
691 
692  j = 0;
693  if (redunt[PAGE_STATUS] != XD_GPG) {
694  for (j = 1; j <= 8; j++) {
695  retval = xd_read_redundant(chip, page_addr + j, redunt, 11);
696  if (retval == STATUS_SUCCESS) {
697  if (redunt[PAGE_STATUS] == XD_GPG)
698  break;
699  }
700  }
701 
702  if (j == 9)
703  break;
704  }
705 
706  /* Check CIS data */
707  if ((redunt[BLOCK_STATUS] == XD_GBLK) && (redunt[PARITY] & XD_BA1_ALL0)) {
708  u8 buf[10];
709 
710  page_addr += j;
711 
712  retval = xd_read_cis(chip, page_addr, buf, 10);
713  if (retval != STATUS_SUCCESS)
714  TRACE_RET(chip, STATUS_FAIL);
715 
716  if ((buf[0] == 0x01) && (buf[1] == 0x03) && (buf[2] == 0xD9)
717  && (buf[3] == 0x01) && (buf[4] == 0xFF)
718  && (buf[5] == 0x18) && (buf[6] == 0x02)
719  && (buf[7] == 0xDF) && (buf[8] == 0x01)
720  && (buf[9] == 0x20)) {
721  xd_card->cis_block = (u16)i;
722  }
723  }
724 
725  break;
726  }
727 
728  RTSX_DEBUGP("CIS block: 0x%x\n", xd_card->cis_block);
729  if (xd_card->cis_block == 0xFFFF)
730  TRACE_RET(chip, STATUS_FAIL);
731 
732  chip->capacity[chip->card2lun[XD_CARD]] = xd_card->capacity;
733 
734  return STATUS_SUCCESS;
735 }
736 
737 static int xd_check_data_blank(u8 *redunt)
738 {
739  int i;
740 
741  for (i = 0; i < 6; i++) {
742  if (redunt[PAGE_STATUS + i] != 0xFF)
743  return 0;
744  }
745 
746  if ((redunt[PARITY] & (XD_ECC1_ALL1 | XD_ECC2_ALL1)) != (XD_ECC1_ALL1 | XD_ECC2_ALL1))
747  return 0;
748 
749 
750  for (i = 0; i < 4; i++) {
751  if (redunt[RESERVED0 + i] != 0xFF)
752  return 0;
753  }
754 
755  return 1;
756 }
757 
758 static u16 xd_load_log_block_addr(u8 *redunt)
759 {
760  u16 addr = 0xFFFF;
761 
762  if (redunt[PARITY] & XD_BA1_BA2_EQL)
763  addr = ((u16)redunt[BLOCK_ADDR1_H] << 8) | redunt[BLOCK_ADDR1_L];
764  else if (redunt[PARITY] & XD_BA1_VALID)
765  addr = ((u16)redunt[BLOCK_ADDR1_H] << 8) | redunt[BLOCK_ADDR1_L];
766  else if (redunt[PARITY] & XD_BA2_VALID)
767  addr = ((u16)redunt[BLOCK_ADDR2_H] << 8) | redunt[BLOCK_ADDR2_L];
768 
769  return addr;
770 }
771 
772 static int xd_init_l2p_tbl(struct rtsx_chip *chip)
773 {
774  struct xd_info *xd_card = &(chip->xd_card);
775  int size, i;
776 
777  RTSX_DEBUGP("xd_init_l2p_tbl: zone_cnt = %d\n", xd_card->zone_cnt);
778 
779  if (xd_card->zone_cnt < 1)
780  TRACE_RET(chip, STATUS_FAIL);
781 
782  size = xd_card->zone_cnt * sizeof(struct zone_entry);
783  RTSX_DEBUGP("Buffer size for l2p table is %d\n", size);
784 
785  xd_card->zone = (struct zone_entry *)vmalloc(size);
786  if (!xd_card->zone)
787  TRACE_RET(chip, STATUS_ERROR);
788 
789  for (i = 0; i < xd_card->zone_cnt; i++) {
790  xd_card->zone[i].build_flag = 0;
791  xd_card->zone[i].l2p_table = NULL;
792  xd_card->zone[i].free_table = NULL;
793  xd_card->zone[i].get_index = 0;
794  xd_card->zone[i].set_index = 0;
795  xd_card->zone[i].unused_blk_cnt = 0;
796  }
797 
798  return STATUS_SUCCESS;
799 }
800 
801 static inline void free_zone(struct zone_entry *zone)
802 {
803  RTSX_DEBUGP("free_zone\n");
804 
805  if (!zone)
806  return;
807 
808  zone->build_flag = 0;
809  zone->set_index = 0;
810  zone->get_index = 0;
811  zone->unused_blk_cnt = 0;
812  if (zone->l2p_table) {
813  vfree(zone->l2p_table);
814  zone->l2p_table = NULL;
815  }
816  if (zone->free_table) {
817  vfree(zone->free_table);
818  zone->free_table = NULL;
819  }
820 }
821 
822 static void xd_set_unused_block(struct rtsx_chip *chip, u32 phy_blk)
823 {
824  struct xd_info *xd_card = &(chip->xd_card);
825  struct zone_entry *zone;
826  int zone_no;
827 
828  zone_no = (int)phy_blk >> 10;
829  if (zone_no >= xd_card->zone_cnt) {
830  RTSX_DEBUGP("Set unused block to invalid zone (zone_no = %d, zone_cnt = %d)\n",
831  zone_no, xd_card->zone_cnt);
832  return;
833  }
834  zone = &(xd_card->zone[zone_no]);
835 
836  if (zone->free_table == NULL) {
837  if (xd_build_l2p_tbl(chip, zone_no) != STATUS_SUCCESS)
838  return;
839  }
840 
841  if ((zone->set_index >= XD_FREE_TABLE_CNT)
842  || (zone->set_index < 0)) {
843  free_zone(zone);
844  RTSX_DEBUGP("Set unused block fail, invalid set_index\n");
845  return;
846  }
847 
848  RTSX_DEBUGP("Set unused block to index %d\n", zone->set_index);
849 
850  zone->free_table[zone->set_index++] = (u16) (phy_blk & 0x3ff);
851  if (zone->set_index >= XD_FREE_TABLE_CNT)
852  zone->set_index = 0;
853  zone->unused_blk_cnt++;
854 }
855 
856 static u32 xd_get_unused_block(struct rtsx_chip *chip, int zone_no)
857 {
858  struct xd_info *xd_card = &(chip->xd_card);
859  struct zone_entry *zone;
860  u32 phy_blk;
861 
862  if (zone_no >= xd_card->zone_cnt) {
863  RTSX_DEBUGP("Get unused block from invalid zone (zone_no = %d, zone_cnt = %d)\n",
864  zone_no, xd_card->zone_cnt);
865  return BLK_NOT_FOUND;
866  }
867  zone = &(xd_card->zone[zone_no]);
868 
869  if ((zone->unused_blk_cnt == 0) || (zone->set_index == zone->get_index)) {
870  free_zone(zone);
871  RTSX_DEBUGP("Get unused block fail, no unused block available\n");
872  return BLK_NOT_FOUND;
873  }
874  if ((zone->get_index >= XD_FREE_TABLE_CNT) || (zone->get_index < 0)) {
875  free_zone(zone);
876  RTSX_DEBUGP("Get unused block fail, invalid get_index\n");
877  return BLK_NOT_FOUND;
878  }
879 
880  RTSX_DEBUGP("Get unused block from index %d\n", zone->get_index);
881 
882  phy_blk = zone->free_table[zone->get_index];
883  zone->free_table[zone->get_index++] = 0xFFFF;
884  if (zone->get_index >= XD_FREE_TABLE_CNT)
885  zone->get_index = 0;
886  zone->unused_blk_cnt--;
887 
888  phy_blk += ((u32)(zone_no) << 10);
889  return phy_blk;
890 }
891 
892 static void xd_set_l2p_tbl(struct rtsx_chip *chip, int zone_no, u16 log_off, u16 phy_off)
893 {
894  struct xd_info *xd_card = &(chip->xd_card);
895  struct zone_entry *zone;
896 
897  zone = &(xd_card->zone[zone_no]);
898  zone->l2p_table[log_off] = phy_off;
899 }
900 
901 static u32 xd_get_l2p_tbl(struct rtsx_chip *chip, int zone_no, u16 log_off)
902 {
903  struct xd_info *xd_card = &(chip->xd_card);
904  struct zone_entry *zone;
905  int retval;
906 
907  zone = &(xd_card->zone[zone_no]);
908  if (zone->l2p_table[log_off] == 0xFFFF) {
909  u32 phy_blk = 0;
910  int i;
911 
912 #ifdef XD_DELAY_WRITE
913  retval = xd_delay_write(chip);
914  if (retval != STATUS_SUCCESS) {
915  RTSX_DEBUGP("In xd_get_l2p_tbl, delay write fail!\n");
916  return BLK_NOT_FOUND;
917  }
918 #endif
919 
920  if (zone->unused_blk_cnt <= 0) {
921  RTSX_DEBUGP("No unused block!\n");
922  return BLK_NOT_FOUND;
923  }
924 
925  for (i = 0; i < zone->unused_blk_cnt; i++) {
926  phy_blk = xd_get_unused_block(chip, zone_no);
927  if (phy_blk == BLK_NOT_FOUND) {
928  RTSX_DEBUGP("No unused block available!\n");
929  return BLK_NOT_FOUND;
930  }
931 
932  retval = xd_init_page(chip, phy_blk, log_off, 0, xd_card->page_off + 1);
933  if (retval == STATUS_SUCCESS)
934  break;
935  }
936  if (i >= zone->unused_blk_cnt) {
937  RTSX_DEBUGP("No good unused block available!\n");
938  return BLK_NOT_FOUND;
939  }
940 
941  xd_set_l2p_tbl(chip, zone_no, log_off, (u16)(phy_blk & 0x3FF));
942  return phy_blk;
943  }
944 
945  return (u32)zone->l2p_table[log_off] + ((u32)(zone_no) << 10);
946 }
947 
948 int reset_xd_card(struct rtsx_chip *chip)
949 {
950  struct xd_info *xd_card = &(chip->xd_card);
951  int retval;
952 
953  memset(xd_card, 0, sizeof(struct xd_info));
954 
955  xd_card->block_shift = 0;
956  xd_card->page_off = 0;
957  xd_card->addr_cycle = 0;
958  xd_card->capacity = 0;
959  xd_card->zone_cnt = 0;
960  xd_card->cis_block = 0xFFFF;
961  xd_card->delay_write.delay_write_flag = 0;
962 
963  retval = enable_card_clock(chip, XD_CARD);
964  if (retval != STATUS_SUCCESS)
965  TRACE_RET(chip, STATUS_FAIL);
966 
967  retval = reset_xd(chip);
968  if (retval != STATUS_SUCCESS)
969  TRACE_RET(chip, STATUS_FAIL);
970 
971  retval = xd_init_l2p_tbl(chip);
972  if (retval != STATUS_SUCCESS)
973  TRACE_RET(chip, STATUS_FAIL);
974 
975  return STATUS_SUCCESS;
976 }
977 
978 static int xd_mark_bad_block(struct rtsx_chip *chip, u32 phy_blk)
979 {
980  struct xd_info *xd_card = &(chip->xd_card);
981  int retval;
982  u32 page_addr;
983  u8 reg = 0;
984 
985  RTSX_DEBUGP("mark block 0x%x as bad block\n", phy_blk);
986 
987  if (phy_blk == BLK_NOT_FOUND)
988  TRACE_RET(chip, STATUS_FAIL);
989 
990  rtsx_init_cmd(chip);
991 
994  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_H, 0xFF, 0xFF);
995  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_L, 0xFF, 0xFF);
996  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR2_H, 0xFF, 0xFF);
997  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR2_L, 0xFF, 0xFF);
998  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_RESERVED0, 0xFF, 0xFF);
999  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_RESERVED1, 0xFF, 0xFF);
1000  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_RESERVED2, 0xFF, 0xFF);
1001  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_RESERVED3, 0xFF, 0xFF);
1002 
1003  page_addr = phy_blk << xd_card->block_shift;
1004 
1005  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
1006 
1007  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, xd_card->page_off + 1);
1008 
1011 
1012  retval = rtsx_send_cmd(chip, XD_CARD, 500);
1013  if (retval < 0) {
1014  rtsx_clear_xd_error(chip);
1015  rtsx_read_register(chip, XD_DAT, &reg);
1016  if (reg & PROGRAM_ERROR)
1017  xd_set_err_code(chip, XD_PRG_ERROR);
1018  else
1019  xd_set_err_code(chip, XD_TO_ERROR);
1020  TRACE_RET(chip, STATUS_FAIL);
1021  }
1022 
1023  return STATUS_SUCCESS;
1024 }
1025 
1026 static int xd_init_page(struct rtsx_chip *chip, u32 phy_blk, u16 logoff, u8 start_page, u8 end_page)
1027 {
1028  struct xd_info *xd_card = &(chip->xd_card);
1029  int retval;
1030  u32 page_addr;
1031  u8 reg = 0;
1032 
1033  RTSX_DEBUGP("Init block 0x%x\n", phy_blk);
1034 
1035  if (start_page > end_page)
1036  TRACE_RET(chip, STATUS_FAIL);
1037  if (phy_blk == BLK_NOT_FOUND)
1038  TRACE_RET(chip, STATUS_FAIL);
1039 
1040  rtsx_init_cmd(chip);
1041 
1042  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_STATUS, 0xFF, 0xFF);
1043  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_STATUS, 0xFF, 0xFF);
1044  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_H, 0xFF, (u8)(logoff >> 8));
1045  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_L, 0xFF, (u8)logoff);
1046 
1047  page_addr = (phy_blk << xd_card->block_shift) + start_page;
1048 
1049  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
1050 
1052 
1053  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, (end_page - start_page));
1054 
1057 
1058  retval = rtsx_send_cmd(chip, XD_CARD, 500);
1059  if (retval < 0) {
1060  rtsx_clear_xd_error(chip);
1061  rtsx_read_register(chip, XD_DAT, &reg);
1062  if (reg & PROGRAM_ERROR) {
1063  xd_mark_bad_block(chip, phy_blk);
1064  xd_set_err_code(chip, XD_PRG_ERROR);
1065  } else {
1066  xd_set_err_code(chip, XD_TO_ERROR);
1067  }
1068  TRACE_RET(chip, STATUS_FAIL);
1069  }
1070 
1071  return STATUS_SUCCESS;
1072 }
1073 
1074 static int xd_copy_page(struct rtsx_chip *chip, u32 old_blk, u32 new_blk, u8 start_page, u8 end_page)
1075 {
1076  struct xd_info *xd_card = &(chip->xd_card);
1077  u32 old_page, new_page;
1078  u8 i, reg = 0;
1079  int retval;
1080 
1081  RTSX_DEBUGP("Copy page from block 0x%x to block 0x%x\n", old_blk, new_blk);
1082 
1083  if (start_page > end_page)
1084  TRACE_RET(chip, STATUS_FAIL);
1085 
1086  if ((old_blk == BLK_NOT_FOUND) || (new_blk == BLK_NOT_FOUND))
1087  TRACE_RET(chip, STATUS_FAIL);
1088 
1089  old_page = (old_blk << xd_card->block_shift) + start_page;
1090  new_page = (new_blk << xd_card->block_shift) + start_page;
1091 
1092  XD_CLR_BAD_NEWBLK(xd_card);
1093 
1095 
1096  for (i = start_page; i < end_page; i++) {
1097  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1098  rtsx_clear_xd_error(chip);
1099  xd_set_err_code(chip, XD_NO_CARD);
1100  TRACE_RET(chip, STATUS_FAIL);
1101  }
1102 
1103  rtsx_init_cmd(chip);
1104 
1105  xd_assign_phy_addr(chip, old_page, XD_RW_ADDR);
1106 
1107  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, 1);
1111 
1112  retval = rtsx_send_cmd(chip, XD_CARD, 500);
1113  if (retval < 0) {
1114  rtsx_clear_xd_error(chip);
1115  reg = 0;
1116  rtsx_read_register(chip, XD_CTL, &reg);
1117  if (reg & (XD_ECC1_ERROR | XD_ECC2_ERROR)) {
1118  wait_timeout(100);
1119 
1120  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1121  xd_set_err_code(chip, XD_NO_CARD);
1122  TRACE_RET(chip, STATUS_FAIL);
1123  }
1124 
1125  if (((reg & (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE)) ==
1126  (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1127  || ((reg & (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE)) ==
1128  (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))) {
1131  XD_SET_BAD_OLDBLK(xd_card);
1132  RTSX_DEBUGP("old block 0x%x ecc error\n", old_blk);
1133  }
1134  } else {
1135  xd_set_err_code(chip, XD_TO_ERROR);
1136  TRACE_RET(chip, STATUS_FAIL);
1137  }
1138  }
1139 
1140  if (XD_CHK_BAD_OLDBLK(xd_card))
1141  rtsx_clear_xd_error(chip);
1142 
1143  rtsx_init_cmd(chip);
1144 
1145  xd_assign_phy_addr(chip, new_page, XD_RW_ADDR);
1146  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, 1);
1147  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_TRANSFER, 0xFF,
1150 
1151  retval = rtsx_send_cmd(chip, XD_CARD, 300);
1152  if (retval < 0) {
1153  rtsx_clear_xd_error(chip);
1154  reg = 0;
1155  rtsx_read_register(chip, XD_DAT, &reg);
1156  if (reg & PROGRAM_ERROR) {
1157  xd_mark_bad_block(chip, new_blk);
1158  xd_set_err_code(chip, XD_PRG_ERROR);
1159  XD_SET_BAD_NEWBLK(xd_card);
1160  } else {
1161  xd_set_err_code(chip, XD_TO_ERROR);
1162  }
1163  TRACE_RET(chip, STATUS_FAIL);
1164  }
1165 
1166  old_page++;
1167  new_page++;
1168  }
1169 
1170  return STATUS_SUCCESS;
1171 }
1172 
1173 static int xd_reset_cmd(struct rtsx_chip *chip)
1174 {
1175  int retval;
1176  u8 *ptr;
1177 
1178  rtsx_init_cmd(chip);
1179 
1182  rtsx_add_cmd(chip, READ_REG_CMD, XD_DAT, 0, 0);
1183  rtsx_add_cmd(chip, READ_REG_CMD, XD_CTL, 0, 0);
1184 
1185  retval = rtsx_send_cmd(chip, XD_CARD, 100);
1186  if (retval < 0)
1187  TRACE_RET(chip, STATUS_FAIL);
1188 
1189  ptr = rtsx_get_cmd_data(chip) + 1;
1190  if (((ptr[0] & READY_FLAG) == READY_STATE) && (ptr[1] & XD_RDY))
1191  return STATUS_SUCCESS;
1192 
1193  TRACE_RET(chip, STATUS_FAIL);
1194 }
1195 
1196 static int xd_erase_block(struct rtsx_chip *chip, u32 phy_blk)
1197 {
1198  struct xd_info *xd_card = &(chip->xd_card);
1199  u32 page_addr;
1200  u8 reg = 0, *ptr;
1201  int i, retval;
1202 
1203  if (phy_blk == BLK_NOT_FOUND)
1204  TRACE_RET(chip, STATUS_FAIL);
1205 
1206  page_addr = phy_blk << xd_card->block_shift;
1207 
1208  for (i = 0; i < 3; i++) {
1209  rtsx_init_cmd(chip);
1210 
1211  xd_assign_phy_addr(chip, page_addr, XD_ERASE_ADDR);
1212 
1215  rtsx_add_cmd(chip, READ_REG_CMD, XD_DAT, 0, 0);
1216 
1217  retval = rtsx_send_cmd(chip, XD_CARD, 250);
1218  if (retval < 0) {
1219  rtsx_clear_xd_error(chip);
1220  rtsx_read_register(chip, XD_DAT, &reg);
1221  if (reg & PROGRAM_ERROR) {
1222  xd_mark_bad_block(chip, phy_blk);
1223  xd_set_err_code(chip, XD_PRG_ERROR);
1224  TRACE_RET(chip, STATUS_FAIL);
1225  } else {
1226  xd_set_err_code(chip, XD_ERASE_FAIL);
1227  }
1228  retval = xd_reset_cmd(chip);
1229  if (retval != STATUS_SUCCESS)
1230  TRACE_RET(chip, STATUS_FAIL);
1231  continue;
1232  }
1233 
1234  ptr = rtsx_get_cmd_data(chip) + 1;
1235  if (*ptr & PROGRAM_ERROR) {
1236  xd_mark_bad_block(chip, phy_blk);
1237  xd_set_err_code(chip, XD_PRG_ERROR);
1238  TRACE_RET(chip, STATUS_FAIL);
1239  }
1240 
1241  return STATUS_SUCCESS;
1242  }
1243 
1244  xd_mark_bad_block(chip, phy_blk);
1245  xd_set_err_code(chip, XD_ERASE_FAIL);
1246  TRACE_RET(chip, STATUS_FAIL);
1247 }
1248 
1249 
1250 static int xd_build_l2p_tbl(struct rtsx_chip *chip, int zone_no)
1251 {
1252  struct xd_info *xd_card = &(chip->xd_card);
1253  struct zone_entry *zone;
1254  int retval;
1255  u32 start, end, i;
1256  u16 max_logoff, cur_fst_page_logoff, cur_lst_page_logoff, ent_lst_page_logoff;
1257  u8 redunt[11];
1258 
1259  RTSX_DEBUGP("xd_build_l2p_tbl: %d\n", zone_no);
1260 
1261  if (xd_card->zone == NULL) {
1262  retval = xd_init_l2p_tbl(chip);
1263  if (retval != STATUS_SUCCESS)
1264  return retval;
1265  }
1266 
1267  if (xd_card->zone[zone_no].build_flag) {
1268  RTSX_DEBUGP("l2p table of zone %d has been built\n", zone_no);
1269  return STATUS_SUCCESS;
1270  }
1271 
1272  zone = &(xd_card->zone[zone_no]);
1273 
1274  if (zone->l2p_table == NULL) {
1275  zone->l2p_table = (u16 *)vmalloc(2000);
1276  if (zone->l2p_table == NULL)
1277  TRACE_GOTO(chip, Build_Fail);
1278  }
1279  memset((u8 *)(zone->l2p_table), 0xff, 2000);
1280 
1281  if (zone->free_table == NULL) {
1282  zone->free_table = (u16 *)vmalloc(XD_FREE_TABLE_CNT * 2);
1283  if (zone->free_table == NULL)
1284  TRACE_GOTO(chip, Build_Fail);
1285  }
1286  memset((u8 *)(zone->free_table), 0xff, XD_FREE_TABLE_CNT * 2);
1287 
1288  if (zone_no == 0) {
1289  if (xd_card->cis_block == 0xFFFF)
1290  start = 0;
1291  else
1292  start = xd_card->cis_block + 1;
1293  if (XD_CHK_4MB(xd_card)) {
1294  end = 0x200;
1295  max_logoff = 499;
1296  } else {
1297  end = 0x400;
1298  max_logoff = 999;
1299  }
1300  } else {
1301  start = (u32)(zone_no) << 10;
1302  end = (u32)(zone_no + 1) << 10;
1303  max_logoff = 999;
1304  }
1305 
1306  RTSX_DEBUGP("start block 0x%x, end block 0x%x\n", start, end);
1307 
1308  zone->set_index = zone->get_index = 0;
1309  zone->unused_blk_cnt = 0;
1310 
1311  for (i = start; i < end; i++) {
1312  u32 page_addr = i << xd_card->block_shift;
1313  u32 phy_block;
1314 
1315  retval = xd_read_redundant(chip, page_addr, redunt, 11);
1316  if (retval != STATUS_SUCCESS)
1317  continue;
1318 
1319  if (redunt[BLOCK_STATUS] != 0xFF) {
1320  RTSX_DEBUGP("bad block\n");
1321  continue;
1322  }
1323 
1324  if (xd_check_data_blank(redunt)) {
1325  RTSX_DEBUGP("blank block\n");
1326  xd_set_unused_block(chip, i);
1327  continue;
1328  }
1329 
1330  cur_fst_page_logoff = xd_load_log_block_addr(redunt);
1331  if ((cur_fst_page_logoff == 0xFFFF) || (cur_fst_page_logoff > max_logoff)) {
1332  retval = xd_erase_block(chip, i);
1333  if (retval == STATUS_SUCCESS)
1334  xd_set_unused_block(chip, i);
1335  continue;
1336  }
1337 
1338  if ((zone_no == 0) && (cur_fst_page_logoff == 0) && (redunt[PAGE_STATUS] != XD_GPG))
1339  XD_SET_MBR_FAIL(xd_card);
1340 
1341  if (zone->l2p_table[cur_fst_page_logoff] == 0xFFFF) {
1342  zone->l2p_table[cur_fst_page_logoff] = (u16)(i & 0x3FF);
1343  continue;
1344  }
1345 
1346  phy_block = zone->l2p_table[cur_fst_page_logoff] + ((u32)((zone_no) << 10));
1347 
1348  page_addr = ((i + 1) << xd_card->block_shift) - 1;
1349 
1350  retval = xd_read_redundant(chip, page_addr, redunt, 11);
1351  if (retval != STATUS_SUCCESS)
1352  continue;
1353 
1354  cur_lst_page_logoff = xd_load_log_block_addr(redunt);
1355  if (cur_lst_page_logoff == cur_fst_page_logoff) {
1356  int m;
1357 
1358  page_addr = ((phy_block + 1) << xd_card->block_shift) - 1;
1359 
1360  for (m = 0; m < 3; m++) {
1361  retval = xd_read_redundant(chip, page_addr, redunt, 11);
1362  if (retval == STATUS_SUCCESS)
1363  break;
1364  }
1365 
1366  if (m == 3) {
1367  zone->l2p_table[cur_fst_page_logoff] = (u16)(i & 0x3FF);
1368  retval = xd_erase_block(chip, phy_block);
1369  if (retval == STATUS_SUCCESS)
1370  xd_set_unused_block(chip, phy_block);
1371  continue;
1372  }
1373 
1374  ent_lst_page_logoff = xd_load_log_block_addr(redunt);
1375  if (ent_lst_page_logoff != cur_fst_page_logoff) {
1376  zone->l2p_table[cur_fst_page_logoff] = (u16)(i & 0x3FF);
1377  retval = xd_erase_block(chip, phy_block);
1378  if (retval == STATUS_SUCCESS)
1379  xd_set_unused_block(chip, phy_block);
1380  continue;
1381  } else {
1382  retval = xd_erase_block(chip, i);
1383  if (retval == STATUS_SUCCESS)
1384  xd_set_unused_block(chip, i);
1385  }
1386  } else {
1387  retval = xd_erase_block(chip, i);
1388  if (retval == STATUS_SUCCESS)
1389  xd_set_unused_block(chip, i);
1390  }
1391  }
1392 
1393  if (XD_CHK_4MB(xd_card))
1394  end = 500;
1395  else
1396  end = 1000;
1397 
1398  i = 0;
1399  for (start = 0; start < end; start++) {
1400  if (zone->l2p_table[start] == 0xFFFF)
1401  i++;
1402  }
1403 
1404  RTSX_DEBUGP("Block count %d, invalid L2P entry %d\n", end, i);
1405  RTSX_DEBUGP("Total unused block: %d\n", zone->unused_blk_cnt);
1406 
1407  if ((zone->unused_blk_cnt - i) < 1)
1408  chip->card_wp |= XD_CARD;
1409 
1410  zone->build_flag = 1;
1411 
1412  return STATUS_SUCCESS;
1413 
1414 Build_Fail:
1415  if (zone->l2p_table) {
1416  vfree(zone->l2p_table);
1417  zone->l2p_table = NULL;
1418  }
1419  if (zone->free_table) {
1420  vfree(zone->free_table);
1421  zone->free_table = NULL;
1422  }
1423 
1424  return STATUS_FAIL;
1425 }
1426 
1427 static int xd_send_cmd(struct rtsx_chip *chip, u8 cmd)
1428 {
1429  int retval;
1430 
1431  rtsx_init_cmd(chip);
1432 
1433  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_DAT, 0xFF, cmd);
1436 
1437  retval = rtsx_send_cmd(chip, XD_CARD, 200);
1438  if (retval < 0)
1439  TRACE_RET(chip, STATUS_FAIL);
1440 
1441  return STATUS_SUCCESS;
1442 }
1443 
1444 static int xd_read_multiple_pages(struct rtsx_chip *chip, u32 phy_blk, u32 log_blk,
1445  u8 start_page, u8 end_page, u8 *buf, unsigned int *index, unsigned int *offset)
1446 {
1447  struct xd_info *xd_card = &(chip->xd_card);
1448  u32 page_addr, new_blk;
1449  u16 log_off;
1450  u8 reg_val, page_cnt;
1451  int zone_no, retval, i;
1452 
1453  if (start_page > end_page)
1454  TRACE_RET(chip, STATUS_FAIL);
1455 
1456  page_cnt = end_page - start_page;
1457  zone_no = (int)(log_blk / 1000);
1458  log_off = (u16)(log_blk % 1000);
1459 
1460  if ((phy_blk & 0x3FF) == 0x3FF) {
1461  for (i = 0; i < 256; i++) {
1462  page_addr = ((u32)i) << xd_card->block_shift;
1463 
1464  retval = xd_read_redundant(chip, page_addr, NULL, 0);
1465  if (retval == STATUS_SUCCESS)
1466  break;
1467 
1468  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1469  xd_set_err_code(chip, XD_NO_CARD);
1470  TRACE_RET(chip, STATUS_FAIL);
1471  }
1472  }
1473  }
1474 
1475  page_addr = (phy_blk << xd_card->block_shift) + start_page;
1476 
1477  rtsx_init_cmd(chip);
1478 
1479  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
1482  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, page_cnt);
1485 
1486  trans_dma_enable(chip->srb->sc_data_direction, chip, page_cnt * 512, DMA_512);
1487 
1491 
1492  rtsx_send_cmd_no_wait(chip);
1493 
1494  retval = rtsx_transfer_data_partial(chip, XD_CARD, buf, page_cnt * 512, scsi_sg_count(chip->srb),
1495  index, offset, DMA_FROM_DEVICE, chip->xd_timeout);
1496  if (retval < 0) {
1497  rtsx_clear_xd_error(chip);
1498  xd_clear_dma_buffer(chip);
1499 
1500  if (retval == -ETIMEDOUT) {
1501  xd_set_err_code(chip, XD_TO_ERROR);
1502  TRACE_RET(chip, STATUS_FAIL);
1503  } else {
1504  TRACE_GOTO(chip, Fail);
1505  }
1506  }
1507 
1508  return STATUS_SUCCESS;
1509 
1510 Fail:
1511  RTSX_READ_REG(chip, XD_PAGE_STATUS, &reg_val);
1512 
1513  if (reg_val != XD_GPG)
1514  xd_set_err_code(chip, XD_PRG_ERROR);
1515 
1516  RTSX_READ_REG(chip, XD_CTL, &reg_val);
1517 
1518  if (((reg_val & (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1519  == (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1520  || ((reg_val & (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))
1521  == (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))) {
1522  wait_timeout(100);
1523 
1524  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1525  xd_set_err_code(chip, XD_NO_CARD);
1526  TRACE_RET(chip, STATUS_FAIL);
1527  }
1528 
1529  xd_set_err_code(chip, XD_ECC_ERROR);
1530 
1531  new_blk = xd_get_unused_block(chip, zone_no);
1532  if (new_blk == NO_NEW_BLK) {
1533  XD_CLR_BAD_OLDBLK(xd_card);
1534  TRACE_RET(chip, STATUS_FAIL);
1535  }
1536 
1537  retval = xd_copy_page(chip, phy_blk, new_blk, 0, xd_card->page_off + 1);
1538  if (retval != STATUS_SUCCESS) {
1539  if (!XD_CHK_BAD_NEWBLK(xd_card)) {
1540  retval = xd_erase_block(chip, new_blk);
1541  if (retval == STATUS_SUCCESS)
1542  xd_set_unused_block(chip, new_blk);
1543  } else {
1544  XD_CLR_BAD_NEWBLK(xd_card);
1545  }
1546  XD_CLR_BAD_OLDBLK(xd_card);
1547  TRACE_RET(chip, STATUS_FAIL);
1548  }
1549  xd_set_l2p_tbl(chip, zone_no, log_off, (u16)(new_blk & 0x3FF));
1550  xd_erase_block(chip, phy_blk);
1551  xd_mark_bad_block(chip, phy_blk);
1552  XD_CLR_BAD_OLDBLK(xd_card);
1553  }
1554 
1555  TRACE_RET(chip, STATUS_FAIL);
1556 }
1557 
1558 static int xd_finish_write(struct rtsx_chip *chip,
1559  u32 old_blk, u32 new_blk, u32 log_blk, u8 page_off)
1560 {
1561  struct xd_info *xd_card = &(chip->xd_card);
1562  int retval, zone_no;
1563  u16 log_off;
1564 
1565  RTSX_DEBUGP("xd_finish_write, old_blk = 0x%x, new_blk = 0x%x, log_blk = 0x%x\n",
1566  old_blk, new_blk, log_blk);
1567 
1568  if (page_off > xd_card->page_off)
1569  TRACE_RET(chip, STATUS_FAIL);
1570 
1571  zone_no = (int)(log_blk / 1000);
1572  log_off = (u16)(log_blk % 1000);
1573 
1574  if (old_blk == BLK_NOT_FOUND) {
1575  retval = xd_init_page(chip, new_blk, log_off,
1576  page_off, xd_card->page_off + 1);
1577  if (retval != STATUS_SUCCESS) {
1578  retval = xd_erase_block(chip, new_blk);
1579  if (retval == STATUS_SUCCESS)
1580  xd_set_unused_block(chip, new_blk);
1581  TRACE_RET(chip, STATUS_FAIL);
1582  }
1583  } else {
1584  retval = xd_copy_page(chip, old_blk, new_blk,
1585  page_off, xd_card->page_off + 1);
1586  if (retval != STATUS_SUCCESS) {
1587  if (!XD_CHK_BAD_NEWBLK(xd_card)) {
1588  retval = xd_erase_block(chip, new_blk);
1589  if (retval == STATUS_SUCCESS)
1590  xd_set_unused_block(chip, new_blk);
1591  }
1592  XD_CLR_BAD_NEWBLK(xd_card);
1593  TRACE_RET(chip, STATUS_FAIL);
1594  }
1595 
1596  retval = xd_erase_block(chip, old_blk);
1597  if (retval == STATUS_SUCCESS) {
1598  if (XD_CHK_BAD_OLDBLK(xd_card)) {
1599  xd_mark_bad_block(chip, old_blk);
1600  XD_CLR_BAD_OLDBLK(xd_card);
1601  } else {
1602  xd_set_unused_block(chip, old_blk);
1603  }
1604  } else {
1605  xd_set_err_code(chip, XD_NO_ERROR);
1606  XD_CLR_BAD_OLDBLK(xd_card);
1607  }
1608  }
1609 
1610  xd_set_l2p_tbl(chip, zone_no, log_off, (u16)(new_blk & 0x3FF));
1611 
1612  return STATUS_SUCCESS;
1613 }
1614 
1615 static int xd_prepare_write(struct rtsx_chip *chip,
1616  u32 old_blk, u32 new_blk, u32 log_blk, u8 page_off)
1617 {
1618  int retval;
1619 
1620  RTSX_DEBUGP("%s, old_blk = 0x%x, new_blk = 0x%x, log_blk = 0x%x, page_off = %d\n",
1621  __func__, old_blk, new_blk, log_blk, (int)page_off);
1622 
1623  if (page_off) {
1624  retval = xd_copy_page(chip, old_blk, new_blk, 0, page_off);
1625  if (retval != STATUS_SUCCESS)
1626  TRACE_RET(chip, STATUS_FAIL);
1627  }
1628 
1629  return STATUS_SUCCESS;
1630 }
1631 
1632 
1633 static int xd_write_multiple_pages(struct rtsx_chip *chip, u32 old_blk, u32 new_blk, u32 log_blk,
1634  u8 start_page, u8 end_page, u8 *buf, unsigned int *index, unsigned int *offset)
1635 {
1636  struct xd_info *xd_card = &(chip->xd_card);
1637  u32 page_addr;
1638  int zone_no, retval;
1639  u16 log_off;
1640  u8 page_cnt, reg_val;
1641 
1642  RTSX_DEBUGP("%s, old_blk = 0x%x, new_blk = 0x%x, log_blk = 0x%x\n",
1643  __func__, old_blk, new_blk, log_blk);
1644 
1645  if (start_page > end_page)
1646  TRACE_RET(chip, STATUS_FAIL);
1647 
1648  page_cnt = end_page - start_page;
1649  zone_no = (int)(log_blk / 1000);
1650  log_off = (u16)(log_blk % 1000);
1651 
1652  page_addr = (new_blk << xd_card->block_shift) + start_page;
1653 
1654  retval = xd_send_cmd(chip, READ1_1);
1655  if (retval != STATUS_SUCCESS)
1656  TRACE_RET(chip, STATUS_FAIL);
1657 
1658  rtsx_init_cmd(chip);
1659 
1660  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_H, 0xFF, (u8)(log_off >> 8));
1661  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_BLOCK_ADDR1_L, 0xFF, (u8)log_off);
1664 
1665  xd_assign_phy_addr(chip, page_addr, XD_RW_ADDR);
1666 
1668  rtsx_add_cmd(chip, WRITE_REG_CMD, XD_PAGE_CNT, 0xFF, page_cnt);
1670 
1671  trans_dma_enable(chip->srb->sc_data_direction, chip, page_cnt * 512, DMA_512);
1672 
1675 
1676  rtsx_send_cmd_no_wait(chip);
1677 
1678  retval = rtsx_transfer_data_partial(chip, XD_CARD, buf, page_cnt * 512, scsi_sg_count(chip->srb),
1679  index, offset, DMA_TO_DEVICE, chip->xd_timeout);
1680  if (retval < 0) {
1681  rtsx_clear_xd_error(chip);
1682 
1683  if (retval == -ETIMEDOUT) {
1684  xd_set_err_code(chip, XD_TO_ERROR);
1685  TRACE_RET(chip, STATUS_FAIL);
1686  } else {
1687  TRACE_GOTO(chip, Fail);
1688  }
1689  }
1690 
1691  if (end_page == (xd_card->page_off + 1)) {
1692  xd_card->delay_write.delay_write_flag = 0;
1693 
1694  if (old_blk != BLK_NOT_FOUND) {
1695  retval = xd_erase_block(chip, old_blk);
1696  if (retval == STATUS_SUCCESS) {
1697  if (XD_CHK_BAD_OLDBLK(xd_card)) {
1698  xd_mark_bad_block(chip, old_blk);
1699  XD_CLR_BAD_OLDBLK(xd_card);
1700  } else {
1701  xd_set_unused_block(chip, old_blk);
1702  }
1703  } else {
1704  xd_set_err_code(chip, XD_NO_ERROR);
1705  XD_CLR_BAD_OLDBLK(xd_card);
1706  }
1707  }
1708  xd_set_l2p_tbl(chip, zone_no, log_off, (u16)(new_blk & 0x3FF));
1709  }
1710 
1711  return STATUS_SUCCESS;
1712 
1713 Fail:
1714  RTSX_READ_REG(chip, XD_DAT, &reg_val);
1715  if (reg_val & PROGRAM_ERROR) {
1716  xd_set_err_code(chip, XD_PRG_ERROR);
1717  xd_mark_bad_block(chip, new_blk);
1718  }
1719 
1720  TRACE_RET(chip, STATUS_FAIL);
1721 }
1722 
1723 #ifdef XD_DELAY_WRITE
1724 int xd_delay_write(struct rtsx_chip *chip)
1725 {
1726  struct xd_info *xd_card = &(chip->xd_card);
1727  struct xd_delay_write_tag *delay_write = &(xd_card->delay_write);
1728  int retval;
1729 
1730  if (delay_write->delay_write_flag) {
1731  RTSX_DEBUGP("xd_delay_write\n");
1732  retval = xd_switch_clock(chip);
1733  if (retval != STATUS_SUCCESS)
1734  TRACE_RET(chip, STATUS_FAIL);
1735 
1736  delay_write->delay_write_flag = 0;
1737  retval = xd_finish_write(chip,
1738  delay_write->old_phyblock, delay_write->new_phyblock,
1739  delay_write->logblock, delay_write->pageoff);
1740  if (retval != STATUS_SUCCESS)
1741  TRACE_RET(chip, STATUS_FAIL);
1742  }
1743 
1744  return STATUS_SUCCESS;
1745 }
1746 #endif
1747 
1748 int xd_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip, u32 start_sector, u16 sector_cnt)
1749 {
1750  struct xd_info *xd_card = &(chip->xd_card);
1751  unsigned int lun = SCSI_LUN(srb);
1752 #ifdef XD_DELAY_WRITE
1753  struct xd_delay_write_tag *delay_write = &(xd_card->delay_write);
1754 #endif
1755  int retval, zone_no;
1756  unsigned int index = 0, offset = 0;
1757  u32 log_blk, old_blk = 0, new_blk = 0;
1758  u16 log_off, total_sec_cnt = sector_cnt;
1759  u8 start_page, end_page = 0, page_cnt;
1760  u8 *ptr;
1761 
1762  xd_set_err_code(chip, XD_NO_ERROR);
1763 
1764  xd_card->cleanup_counter = 0;
1765 
1766  RTSX_DEBUGP("xd_rw: scsi_sg_count = %d\n", scsi_sg_count(srb));
1767 
1768  ptr = (u8 *)scsi_sglist(srb);
1769 
1770  retval = xd_switch_clock(chip);
1771  if (retval != STATUS_SUCCESS)
1772  TRACE_RET(chip, STATUS_FAIL);
1773 
1774 
1775  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1776  chip->card_fail |= XD_CARD;
1778  TRACE_RET(chip, STATUS_FAIL);
1779  }
1780 
1781  log_blk = start_sector >> xd_card->block_shift;
1782  start_page = (u8)start_sector & xd_card->page_off;
1783  zone_no = (int)(log_blk / 1000);
1784  log_off = (u16)(log_blk % 1000);
1785 
1786  if (xd_card->zone[zone_no].build_flag == 0) {
1787  retval = xd_build_l2p_tbl(chip, zone_no);
1788  if (retval != STATUS_SUCCESS) {
1789  chip->card_fail |= XD_CARD;
1791  TRACE_RET(chip, STATUS_FAIL);
1792  }
1793  }
1794 
1795  if (srb->sc_data_direction == DMA_TO_DEVICE) {
1796 #ifdef XD_DELAY_WRITE
1797  if (delay_write->delay_write_flag &&
1798  (delay_write->logblock == log_blk) &&
1799  (start_page > delay_write->pageoff)) {
1800  delay_write->delay_write_flag = 0;
1801  if (delay_write->old_phyblock != BLK_NOT_FOUND) {
1802  retval = xd_copy_page(chip,
1803  delay_write->old_phyblock,
1804  delay_write->new_phyblock,
1805  delay_write->pageoff, start_page);
1806  if (retval != STATUS_SUCCESS) {
1808  TRACE_RET(chip, STATUS_FAIL);
1809  }
1810  }
1811  old_blk = delay_write->old_phyblock;
1812  new_blk = delay_write->new_phyblock;
1813  } else if (delay_write->delay_write_flag &&
1814  (delay_write->logblock == log_blk) &&
1815  (start_page == delay_write->pageoff)) {
1816  delay_write->delay_write_flag = 0;
1817  old_blk = delay_write->old_phyblock;
1818  new_blk = delay_write->new_phyblock;
1819  } else {
1820  retval = xd_delay_write(chip);
1821  if (retval != STATUS_SUCCESS) {
1823  TRACE_RET(chip, STATUS_FAIL);
1824  }
1825 #endif
1826  old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
1827  new_blk = xd_get_unused_block(chip, zone_no);
1828  if ((old_blk == BLK_NOT_FOUND) || (new_blk == BLK_NOT_FOUND)) {
1830  TRACE_RET(chip, STATUS_FAIL);
1831  }
1832 
1833  retval = xd_prepare_write(chip, old_blk, new_blk, log_blk, start_page);
1834  if (retval != STATUS_SUCCESS) {
1835  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1837  TRACE_RET(chip, STATUS_FAIL);
1838  }
1840  TRACE_RET(chip, STATUS_FAIL);
1841  }
1842 #ifdef XD_DELAY_WRITE
1843  }
1844 #endif
1845  } else {
1846 #ifdef XD_DELAY_WRITE
1847  retval = xd_delay_write(chip);
1848  if (retval != STATUS_SUCCESS) {
1849  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1851  TRACE_RET(chip, STATUS_FAIL);
1852  }
1854  TRACE_RET(chip, STATUS_FAIL);
1855  }
1856 #endif
1857 
1858  old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
1859  if (old_blk == BLK_NOT_FOUND) {
1861  TRACE_RET(chip, STATUS_FAIL);
1862  }
1863  }
1864 
1865  RTSX_DEBUGP("old_blk = 0x%x\n", old_blk);
1866 
1867  while (total_sec_cnt) {
1868  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1869  chip->card_fail |= XD_CARD;
1871  TRACE_RET(chip, STATUS_FAIL);
1872  }
1873 
1874  if ((start_page + total_sec_cnt) > (xd_card->page_off + 1))
1875  end_page = xd_card->page_off + 1;
1876  else
1877  end_page = start_page + (u8)total_sec_cnt;
1878 
1879  page_cnt = end_page - start_page;
1880  if (srb->sc_data_direction == DMA_FROM_DEVICE) {
1881  retval = xd_read_multiple_pages(chip, old_blk, log_blk,
1882  start_page, end_page, ptr, &index, &offset);
1883  if (retval != STATUS_SUCCESS) {
1885  TRACE_RET(chip, STATUS_FAIL);
1886  }
1887  } else {
1888  retval = xd_write_multiple_pages(chip, old_blk, new_blk, log_blk,
1889  start_page, end_page, ptr, &index, &offset);
1890  if (retval != STATUS_SUCCESS) {
1892  TRACE_RET(chip, STATUS_FAIL);
1893  }
1894  }
1895 
1896  total_sec_cnt -= page_cnt;
1897  if (scsi_sg_count(srb) == 0)
1898  ptr += page_cnt * 512;
1899 
1900  if (total_sec_cnt == 0)
1901  break;
1902 
1903  log_blk++;
1904  zone_no = (int)(log_blk / 1000);
1905  log_off = (u16)(log_blk % 1000);
1906 
1907  if (xd_card->zone[zone_no].build_flag == 0) {
1908  retval = xd_build_l2p_tbl(chip, zone_no);
1909  if (retval != STATUS_SUCCESS) {
1910  chip->card_fail |= XD_CARD;
1912  TRACE_RET(chip, STATUS_FAIL);
1913  }
1914  }
1915 
1916  old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
1917  if (old_blk == BLK_NOT_FOUND) {
1918  if (srb->sc_data_direction == DMA_FROM_DEVICE)
1920  else
1922 
1923  TRACE_RET(chip, STATUS_FAIL);
1924  }
1925 
1926  if (srb->sc_data_direction == DMA_TO_DEVICE) {
1927  new_blk = xd_get_unused_block(chip, zone_no);
1928  if (new_blk == BLK_NOT_FOUND) {
1930  TRACE_RET(chip, STATUS_FAIL);
1931  }
1932  }
1933 
1934  start_page = 0;
1935  }
1936 
1937  if ((srb->sc_data_direction == DMA_TO_DEVICE) &&
1938  (end_page != (xd_card->page_off + 1))) {
1939 #ifdef XD_DELAY_WRITE
1940  delay_write->delay_write_flag = 1;
1941  delay_write->old_phyblock = old_blk;
1942  delay_write->new_phyblock = new_blk;
1943  delay_write->logblock = log_blk;
1944  delay_write->pageoff = end_page;
1945 #else
1946  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1947  chip->card_fail |= XD_CARD;
1949  TRACE_RET(chip, STATUS_FAIL);
1950  }
1951 
1952  retval = xd_finish_write(chip, old_blk, new_blk, log_blk, end_page);
1953  if (retval != STATUS_SUCCESS) {
1954  if (detect_card_cd(chip, XD_CARD) != STATUS_SUCCESS) {
1956  TRACE_RET(chip, STATUS_FAIL);
1957  }
1959  TRACE_RET(chip, STATUS_FAIL);
1960  }
1961 #endif
1962  }
1963 
1964  scsi_set_resid(srb, 0);
1965 
1966  return STATUS_SUCCESS;
1967 }
1968 
1969 void xd_free_l2p_tbl(struct rtsx_chip *chip)
1970 {
1971  struct xd_info *xd_card = &(chip->xd_card);
1972  int i = 0;
1973 
1974  if (xd_card->zone != NULL) {
1975  for (i = 0; i < xd_card->zone_cnt; i++) {
1976  if (xd_card->zone[i].l2p_table != NULL) {
1977  vfree(xd_card->zone[i].l2p_table);
1978  xd_card->zone[i].l2p_table = NULL;
1979  }
1980  if (xd_card->zone[i].free_table != NULL) {
1981  vfree(xd_card->zone[i].free_table);
1982  xd_card->zone[i].free_table = NULL;
1983  }
1984  }
1985  vfree(xd_card->zone);
1986  xd_card->zone = NULL;
1987  }
1988 }
1989 
1990 void xd_cleanup_work(struct rtsx_chip *chip)
1991 {
1992 #ifdef XD_DELAY_WRITE
1993  struct xd_info *xd_card = &(chip->xd_card);
1994 
1995  if (xd_card->delay_write.delay_write_flag) {
1996  RTSX_DEBUGP("xD: delay write\n");
1997  xd_delay_write(chip);
1998  xd_card->cleanup_counter = 0;
1999  }
2000 #endif
2001 }
2002 
2004 {
2005  int retval;
2006 
2007  retval = disable_card_clock(chip, XD_CARD);
2008  if (retval != STATUS_SUCCESS)
2009  TRACE_RET(chip, STATUS_FAIL);
2010 
2011  RTSX_WRITE_REG(chip, CARD_OE, XD_OUTPUT_EN, 0);
2012 
2013  if (!chip->ft2_fast_mode) {
2014  retval = card_power_off(chip, XD_CARD);
2015  if (retval != STATUS_SUCCESS)
2016  TRACE_RET(chip, STATUS_FAIL);
2017 
2018  wait_timeout(50);
2019  }
2020 
2021  if (chip->asic_code) {
2022  retval = xd_pull_ctl_disable(chip);
2023  if (retval != STATUS_SUCCESS)
2024  TRACE_RET(chip, STATUS_FAIL);
2025  } else {
2026  RTSX_WRITE_REG(chip, FPGA_PULL_CTL, 0xFF, 0xDF);
2027  }
2028 
2029  return STATUS_SUCCESS;
2030 }
2031 
2032 int release_xd_card(struct rtsx_chip *chip)
2033 {
2034  struct xd_info *xd_card = &(chip->xd_card);
2035  int retval;
2036 
2037  RTSX_DEBUGP("release_xd_card\n");
2038 
2039  chip->card_ready &= ~XD_CARD;
2040  chip->card_fail &= ~XD_CARD;
2041  chip->card_wp &= ~XD_CARD;
2042 
2043  xd_card->delay_write.delay_write_flag = 0;
2044 
2045  xd_free_l2p_tbl(chip);
2046 
2047  retval = xd_power_off_card3v3(chip);
2048  if (retval != STATUS_SUCCESS)
2049  TRACE_RET(chip, STATUS_FAIL);
2050 
2051  return STATUS_SUCCESS;
2052 }