28 #include <linux/sched.h>
41 u8 start_page,
u8 end_page);
60 retval = switch_clock(chip, xd_card->
xd_clock);
67 static int xd_switch_clock(
struct rts51x_chip *chip)
76 retval = switch_clock(chip, xd_card->
xd_clock);
88 rts51x_init_cmd(chip);
96 for (i = 0; i < 4; i++) {
108 rts51x_clear_xd_error(chip);
112 if (id_buf && buf_len) {
115 rts51x_read_rsp_buf(chip, 1, id_buf, buf_len);
161 rts51x_init_cmd(chip);
163 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
170 for (i = 0; i < 6; i++) {
174 for (i = 0; i < 4; i++) {
187 rts51x_clear_xd_error(chip);
191 if (buf && buf_len) {
194 rts51x_read_rsp_buf(chip, 1, buf, buf_len);
205 if (!buf || (buf_len <= 0))
208 rts51x_init_cmd(chip);
210 for (i = 0; i < buf_len; i++) {
223 rts51x_read_rsp_buf(chip, 0, buf, buf_len);
234 if (!buf || (buf_len < 10))
237 rts51x_init_cmd(chip);
239 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
259 rts51x_clear_xd_error(chip);
265 rts51x_clear_xd_error(chip);
272 retval = xd_read_data_from_ppb(chip, 0, buf, buf_len);
275 if (reg & XD_ECC1_ERROR) {
276 u8 ecc_bit, ecc_byte;
283 if (ecc_byte < buf_len) {
286 buf[ecc_byte] ^= (1 << ecc_bit);
295 retval = xd_read_data_from_ppb(chip, 256, buf, buf_len);
298 if (reg & XD_ECC2_ERROR) {
299 u8 ecc_bit, ecc_byte;
306 if (ecc_byte < buf_len) {
309 buf[ecc_byte] ^= (1 << ecc_bit);
315 rts51x_clear_xd_error(chip);
322 static void xd_pull_ctl_disable(
struct rts51x_chip *chip)
341 static void xd_pull_ctl_enable(
struct rts51x_chip *chip)
364 u8 id_buf[4], redunt[11];
370 rts51x_init_cmd(chip);
375 xd_pull_ctl_disable(chip);
380 if (!chip->
option.FT2_fast_mode) {
384 chip->
option.rts5129_D3318_off_enable) {
391 if (!chip->
option.FT2_fast_mode) {
399 if (!chip->
option.FT2_fast_mode) {
400 #ifdef SD_XD_IO_FOLLOW_PWR
402 || chip->
option.rts5129_D3318_off_enable) {
410 #ifdef SD_XD_IO_FOLLOW_PWR
412 || chip->
option.rts5129_D3318_off_enable) {
413 rts51x_init_cmd(chip);
415 xd_pull_ctl_enable(chip);
444 rts51x_init_cmd(chip);
447 xd_pull_ctl_enable(chip);
459 if (!chip->
option.FT2_fast_mode)
462 retval = xd_set_init_para(chip);
466 for (i = 0; i < 4; i++) {
472 rts51x_init_cmd(chip);
475 (2 + i + chip->
option.xd_rw_step)
491 rts51x_clear_xd_error(chip);
497 rts51x_clear_xd_error(chip);
503 RTS51X_DEBUGP(
"XD_DAT: 0x%x, XD_CTL: 0x%x\n", xd_dat, xd_ctl);
509 retval = xd_read_id(chip,
READ_ID, id_buf, 4);
514 id_buf[0], id_buf[1], id_buf[2], id_buf[3]);
588 for (j = 0; j < 10; j++) {
589 retval = xd_read_id(chip,
READ_ID, id_buf, 4);
611 retval = xd_read_id(chip,
READ_xD_ID, id_buf, 4);
615 id_buf[0], id_buf[1], id_buf[2], id_buf[3]);
620 for (i = 0; i < 24; i++) {
628 for (j = 0; j < 3; j++) {
629 retval = xd_read_redundant(chip, page_addr, redunt, 11);
642 for (j = 1; j <= 8; j++) {
644 xd_read_redundant(chip, page_addr + j,
662 retval = xd_read_cis(chip, page_addr, buf, 10);
666 if ((buf[0] == 0x01) && (buf[1] == 0x03)
668 && (buf[3] == 0x01) && (buf[4] == 0xFF)
669 && (buf[5] == 0x18) && (buf[6] == 0x02)
670 && (buf[7] == 0xDF) && (buf[8] == 0x01)
671 && (buf[9] == 0x20)) {
688 static int xd_check_data_blank(
u8 *redunt)
692 for (i = 0; i < 6; i++) {
701 for (i = 0; i < 4; i++) {
709 static u16 xd_load_log_block_addr(
u8 *redunt)
726 static int xd_init_l2p_tbl(
struct rts51x_chip *chip)
743 for (i = 0; i < xd_card->
zone_cnt; i++) {
744 xd_card->
zone[
i].build_flag = 0;
747 xd_card->
zone[
i].get_index = 0;
748 xd_card->
zone[
i].set_index = 0;
749 xd_card->
zone[
i].unused_blk_cnt = 0;
774 static void xd_set_unused_block(
struct rts51x_chip *chip,
u32 phy_blk)
780 zone_no = (
int)phy_blk >> 10;
783 "(zone_no = %d, zone_cnt = %d)\n",
787 zone = &(xd_card->
zone[zone_no]);
809 static u32 xd_get_unused_block(
struct rts51x_chip *chip,
int zone_no)
817 "(zone_no = %d, zone_cnt = %d)\n",
821 zone = &(xd_card->
zone[zone_no]);
827 "no unused block available\n");
844 phy_blk += ((
u32) (zone_no) << 10);
848 static void xd_set_l2p_tbl(
struct rts51x_chip *chip,
int zone_no,
u16 log_off,
854 zone = &(xd_card->
zone[zone_no]);
858 static int xd_delay_write(
struct rts51x_chip *chip);
866 zone = &(xd_card->
zone[zone_no]);
867 if (zone->
l2p_table[log_off] == 0xFFFF) {
871 retval = xd_delay_write(chip);
874 "delay write fail!\n");
884 phy_blk = xd_get_unused_block(chip, zone_no);
891 xd_init_page(chip, phy_blk, log_off, 0,
901 xd_set_l2p_tbl(chip, zone_no, log_off, (
u16) (phy_blk & 0x3FF));
925 retval = reset_xd(chip);
927 if (chip->
option.reset_or_rw_fail_set_pad_drive) {
934 retval = xd_init_l2p_tbl(chip);
941 static int xd_mark_bad_block(
struct rts51x_chip *chip,
u32 phy_blk)
953 rts51x_init_cmd(chip);
969 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
987 rts51x_clear_xd_error(chip);
1000 u8 start_page,
u8 end_page)
1009 if (start_page > end_page)
1014 rts51x_init_cmd(chip);
1019 (
u8) (logoff >> 8));
1023 page_addr = (phy_blk << xd_card->
block_shift) + start_page;
1025 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
1031 (end_page - start_page));
1045 rts51x_clear_xd_error(chip);
1048 xd_mark_bad_block(chip, phy_blk);
1060 u32 old_blk,
u32 new_blk,
u8 start_page,
u8 end_page)
1063 u32 old_page, new_page;
1067 RTS51X_DEBUGP(
"Copy page from block 0x%x to block 0x%x\n", old_blk,
1070 if (start_page > end_page)
1076 old_page = (old_blk << xd_card->
block_shift) + start_page;
1077 new_page = (new_blk << xd_card->
block_shift) + start_page;
1083 for (i = start_page; i < end_page; i++) {
1091 rts51x_init_cmd(chip);
1093 xd_assign_phy_addr(chip, old_page,
XD_RW_ADDR);
1110 (chip->
rsp_buf[2] & (XD_ECC1_ERROR | XD_ECC2_ERROR))) {
1111 rts51x_clear_xd_error(chip);
1114 if (reg & (XD_ECC1_ERROR | XD_ECC2_ERROR)) {
1124 (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1125 == (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1126 || ((reg & (XD_ECC2_ERROR |
1127 XD_ECC2_UNCORRECTABLE)) ==
1128 (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))) {
1135 "ecc error\n", old_blk);
1143 rts51x_clear_xd_error(chip);
1145 rts51x_init_cmd(chip);
1147 xd_assign_phy_addr(chip, new_page,
XD_RW_ADDR);
1160 rts51x_clear_xd_error(chip);
1164 xd_mark_bad_block(chip, new_blk);
1185 rts51x_init_cmd(chip);
1200 rts51x_clear_xd_error(chip);
1206 if (((xd_dat & READY_FLAG) ==
READY_STATE) && (xd_ctl & XD_RDY))
1224 for (i = 0; i < 3; i++) {
1225 rts51x_init_cmd(chip);
1241 rts51x_clear_xd_error(chip);
1244 xd_mark_bad_block(chip, phy_blk);
1250 retval = xd_reset_cmd(chip);
1256 if (xd_dat & PROGRAM_ERROR) {
1257 xd_mark_bad_block(chip, phy_blk);
1265 xd_mark_bad_block(chip, phy_blk);
1270 static int xd_build_l2p_tbl(
struct rts51x_chip *chip,
int zone_no)
1276 u16 max_logoff, cur_fst_page_logoff, cur_lst_page_logoff,
1277 ent_lst_page_logoff;
1283 retval = xd_init_l2p_tbl(chip);
1288 if (xd_card->
zone[zone_no].build_flag) {
1294 zone = &(xd_card->
zone[zone_no]);
1323 start = (
u32) (zone_no) << 10;
1324 end = (
u32) (zone_no + 1) << 10;
1328 RTS51X_DEBUGP(
"start block 0x%x, end block 0x%x\n", start, end);
1333 for (i = start; i <
end; i++) {
1337 retval = xd_read_redundant(chip, page_addr, redunt, 11);
1346 if (xd_check_data_blank(redunt)) {
1348 xd_set_unused_block(chip, i);
1352 cur_fst_page_logoff = xd_load_log_block_addr(redunt);
1353 if ((cur_fst_page_logoff == 0xFFFF)
1354 || (cur_fst_page_logoff > max_logoff)) {
1355 retval = xd_erase_block(chip, i);
1357 xd_set_unused_block(chip, i);
1360 if ((zone_no == 0) && (cur_fst_page_logoff == 0)
1364 if (zone->
l2p_table[cur_fst_page_logoff] == 0xFFFF) {
1372 ((
u32) ((zone_no) << 10));
1374 page_addr = ((i + 1) << xd_card->
block_shift) - 1;
1376 retval = xd_read_redundant(chip, page_addr, redunt, 11);
1380 cur_lst_page_logoff = xd_load_log_block_addr(redunt);
1381 if (cur_lst_page_logoff == cur_fst_page_logoff) {
1387 for (m = 0; m < 3; m++) {
1389 xd_read_redundant(chip, page_addr, redunt,
1398 retval = xd_erase_block(chip, phy_block);
1400 xd_set_unused_block(chip, phy_block);
1404 ent_lst_page_logoff = xd_load_log_block_addr(redunt);
1405 if (ent_lst_page_logoff != cur_fst_page_logoff) {
1408 retval = xd_erase_block(chip, phy_block);
1410 xd_set_unused_block(chip, phy_block);
1413 retval = xd_erase_block(chip, i);
1415 xd_set_unused_block(chip, i);
1418 retval = xd_erase_block(chip, i);
1420 xd_set_unused_block(chip, i);
1430 for (start = 0; start <
end; start++) {
1435 RTS51X_DEBUGP(
"Block count %d, invalid L2P entry %d\n", end, i);
1462 rts51x_init_cmd(chip);
1476 rts51x_clear_xd_error(chip);
1483 static int xd_read_multiple_pages(
struct rts51x_chip *chip,
u32 phy_blk,
1484 u32 log_blk,
u8 start_page,
u8 end_page,
1485 u8 *buf,
void **
ptr,
unsigned int *offset)
1488 u32 page_addr, new_blk;
1493 if (start_page > end_page)
1496 page_cnt = end_page - start_page;
1497 zone_no = (
int)(log_blk / 1000);
1498 log_off = (
u16) (log_blk % 1000);
1500 if ((phy_blk & 0x3FF) == 0x3FF) {
1501 for (i = 0; i < 256; i++) {
1504 retval = xd_read_redundant(chip, page_addr,
NULL, 0);
1515 page_addr = (phy_blk << xd_card->
block_shift) + start_page;
1517 rts51x_init_cmd(chip);
1519 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
1544 ptr, offset, page_cnt * 512,
1545 scsi_sg_count(chip->
srb),
NULL, 2000);
1547 rts51x_clear_xd_error(chip);
1558 rts51x_clear_xd_error(chip);
1581 if (((reg_val & (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1582 == (XD_ECC1_ERROR | XD_ECC1_UNCORRECTABLE))
1583 || ((reg_val & (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))
1584 == (XD_ECC2_ERROR | XD_ECC2_UNCORRECTABLE))) {
1594 new_blk = xd_get_unused_block(chip, zone_no);
1600 xd_copy_page(chip, phy_blk, new_blk, 0,
1604 retval = xd_erase_block(chip, new_blk);
1606 xd_set_unused_block(chip, new_blk);
1613 xd_set_l2p_tbl(chip, zone_no, log_off, (
u16) (new_blk & 0x3FF));
1614 xd_erase_block(chip, phy_blk);
1615 xd_mark_bad_block(chip, phy_blk);
1622 static int xd_finish_write(
struct rts51x_chip *chip,
1629 RTS51X_DEBUGP(
"xd_finish_write, old_blk = 0x%x, new_blk = 0x%x,"
1630 "log_blk = 0x%x\n", old_blk, new_blk, log_blk);
1635 zone_no = (
int)(log_blk / 1000);
1636 log_off = (
u16) (log_blk % 1000);
1639 retval = xd_init_page(chip, new_blk, log_off,
1642 retval = xd_erase_block(chip, new_blk);
1644 xd_set_unused_block(chip, new_blk);
1648 retval = xd_copy_page(chip, old_blk, new_blk,
1652 retval = xd_erase_block(chip, new_blk);
1654 xd_set_unused_block(chip, new_blk);
1660 retval = xd_erase_block(chip, old_blk);
1663 xd_mark_bad_block(chip, old_blk);
1667 xd_set_unused_block(chip, old_blk);
1676 xd_set_l2p_tbl(chip, zone_no, log_off, (
u16) (new_blk & 0x3FF));
1681 static int xd_prepare_write(
struct rts51x_chip *chip,
1682 u32 old_blk,
u32 new_blk,
u32 log_blk,
u8 page_off)
1686 RTS51X_DEBUGP(
"xd_prepare_write, old_blk = 0x%x, new_blk = 0x%x,"
1687 "log_blk = 0x%x, page_off = %d\n",
1688 old_blk, new_blk, log_blk, (
int)page_off);
1691 retval = xd_copy_page(chip, old_blk, new_blk, 0, page_off);
1699 static int xd_write_multiple_pages(
struct rts51x_chip *chip,
u32 old_blk,
1700 u32 new_blk,
u32 log_blk,
u8 start_page,
1701 u8 end_page,
u8 *buf,
void **ptr,
1702 unsigned int *offset)
1711 "new_blk = 0x%x, log_blk = 0x%x\n",
1712 old_blk, new_blk, log_blk);
1714 if (start_page > end_page)
1717 page_cnt = end_page - start_page;
1718 zone_no = (
int)(log_blk / 1000);
1719 log_off = (
u16) (log_blk % 1000);
1721 page_addr = (new_blk << xd_card->
block_shift) + start_page;
1724 retval = xd_send_cmd(chip,
READ1_1);
1728 rts51x_init_cmd(chip);
1732 (
u8) (log_off >> 8));
1738 xd_assign_phy_addr(chip, page_addr,
XD_RW_ADDR);
1762 ptr, offset, page_cnt * 512,
1763 scsi_sg_count(chip->
srb),
NULL, 2000);
1765 rts51x_clear_xd_error(chip);
1776 rts51x_clear_xd_error(chip);
1786 if (end_page == (xd_card->
page_off + 1)) {
1790 retval = xd_erase_block(chip, old_blk);
1793 xd_mark_bad_block(chip, old_blk);
1796 xd_set_unused_block(chip, old_blk);
1803 xd_set_l2p_tbl(chip, zone_no, log_off, (
u16) (new_blk & 0x3FF));
1814 xd_mark_bad_block(chip, new_blk);
1820 static int xd_delay_write(
struct rts51x_chip *chip)
1828 retval = xd_switch_clock(chip);
1833 retval = xd_finish_write(chip,
1852 u32 log_blk, old_blk = 0, new_blk = 0;
1853 u16 log_off, total_sec_cnt = sector_cnt;
1854 u8 start_page, end_page = 0, page_cnt;
1857 unsigned int offset = 0;
1863 RTS51X_DEBUGP(
"xd_rw: scsi_bufflen = %d, scsi_sg_count = %d\n",
1864 scsi_bufflen(srb), scsi_sg_count(srb));
1869 buf = (
u8 *) scsi_sglist(srb);
1871 retval = xd_switch_clock(chip);
1876 start_page = (
u8) start_sector & xd_card->
page_off;
1877 zone_no = (
int)(log_blk / 1000);
1878 log_off = (
u16) (log_blk % 1000);
1882 if (xd_card->
zone[zone_no].build_flag == 0) {
1883 retval = xd_build_l2p_tbl(chip, zone_no);
1893 (delay_write->
logblock == log_blk) &&
1894 (start_page > delay_write->
pageoff)) {
1897 retval = xd_copy_page(chip,
1911 (delay_write->
logblock == log_blk) &&
1912 (start_page == delay_write->
pageoff)) {
1917 retval = xd_delay_write(chip);
1923 old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
1924 new_blk = xd_get_unused_block(chip, zone_no);
1933 xd_prepare_write(chip, old_blk, new_blk, log_blk,
1948 retval = xd_delay_write(chip);
1960 old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
1972 while (total_sec_cnt) {
1973 if ((start_page + total_sec_cnt) > (xd_card->
page_off + 1))
1976 end_page = start_page + (
u8) total_sec_cnt;
1977 page_cnt = end_page - start_page;
1979 retval = xd_read_multiple_pages(chip, old_blk, log_blk,
1980 start_page, end_page,
1981 buf, &ptr, &offset);
1989 xd_write_multiple_pages(chip, old_blk, new_blk,
1990 log_blk, start_page,
1991 end_page, buf, &ptr,
2000 total_sec_cnt -= page_cnt;
2002 if (total_sec_cnt == 0)
2006 zone_no = (
int)(log_blk / 1000);
2007 log_off = (
u16) (log_blk % 1000);
2009 if (xd_card->
zone[zone_no].build_flag == 0) {
2010 retval = xd_build_l2p_tbl(chip, zone_no);
2019 old_blk = xd_get_l2p_tbl(chip, zone_no, log_off);
2032 new_blk = xd_get_unused_block(chip, zone_no);
2044 (end_page != (xd_card->
page_off + 1))) {
2049 delay_write->
pageoff = end_page;
2052 scsi_set_resid(srb, 0);
2063 for (i = 0; i < xd_card->
zone_cnt; i++) {
2064 if (xd_card->
zone[i].l2p_table !=
NULL) {
2068 if (xd_card->
zone[i].free_table !=
NULL) {
2084 xd_delay_write(chip);
2089 static int xd_power_off_card3v3(
struct rts51x_chip *chip)
2093 rts51x_init_cmd(chip);
2098 xd_pull_ctl_disable(chip);
2102 if (!chip->
option.FT2_fast_mode) {
2106 || chip->
option.rts5129_D3318_off_enable)
2135 retval = xd_power_off_card3v3(chip);