1 /* Driver for Realtek PCI-Express card reader
3 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
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
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.
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/>.
19 * Wei WANG (wei_wang@realsil.com.cn)
20 * Micky Ching (micky_ching@realsil.com.cn)
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
30 static inline void spi_set_err_code(struct rtsx_chip
*chip
, u8 err_code
)
32 struct spi_info
*spi
= &(chip
->spi
);
34 spi
->err_code
= err_code
;
37 static int spi_init(struct rtsx_chip
*chip
)
41 retval
= rtsx_write_register(chip
, SPI_CONTROL
, 0xFF,
42 CS_POLARITY_LOW
| DTO_MSB_FIRST
| SPI_MASTER
| SPI_MODE0
| SPI_AUTO
);
47 retval
= rtsx_write_register(chip
, SPI_TCTL
, EDO_TIMING_MASK
,
54 return STATUS_SUCCESS
;
57 static int spi_set_init_para(struct rtsx_chip
*chip
)
59 struct spi_info
*spi
= &(chip
->spi
);
62 retval
= rtsx_write_register(chip
, SPI_CLK_DIVIDER1
, 0xFF,
63 (u8
)(spi
->clk_div
>> 8));
68 retval
= rtsx_write_register(chip
, SPI_CLK_DIVIDER0
, 0xFF,
75 retval
= switch_clock(chip
, spi
->spi_clock
);
76 if (retval
!= STATUS_SUCCESS
) {
81 retval
= select_card(chip
, SPI_CARD
);
82 if (retval
!= STATUS_SUCCESS
) {
87 retval
= rtsx_write_register(chip
, CARD_CLK_EN
, SPI_CLK_EN
,
93 retval
= rtsx_write_register(chip
, CARD_OE
, SPI_OUTPUT_EN
,
102 retval
= spi_init(chip
);
103 if (retval
!= STATUS_SUCCESS
) {
108 return STATUS_SUCCESS
;
111 static int sf_polling_status(struct rtsx_chip
*chip
, int msec
)
117 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, SPI_RDSR
);
118 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
119 SPI_TRANSFER0_START
| SPI_POLLING_MODE0
);
120 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
123 retval
= rtsx_send_cmd(chip
, 0, msec
);
125 rtsx_clear_spi_error(chip
);
126 spi_set_err_code(chip
, SPI_BUSY_ERR
);
131 return STATUS_SUCCESS
;
134 static int sf_enable_write(struct rtsx_chip
*chip
, u8 ins
)
136 struct spi_info
*spi
= &(chip
->spi
);
140 return STATUS_SUCCESS
;
144 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
145 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
146 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
147 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
148 SPI_TRANSFER0_START
| SPI_C_MODE0
);
149 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
152 retval
= rtsx_send_cmd(chip
, 0, 100);
154 rtsx_clear_spi_error(chip
);
155 spi_set_err_code(chip
, SPI_HW_ERR
);
160 return STATUS_SUCCESS
;
163 static int sf_disable_write(struct rtsx_chip
*chip
, u8 ins
)
165 struct spi_info
*spi
= &(chip
->spi
);
169 return STATUS_SUCCESS
;
173 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
174 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
175 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
176 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
177 SPI_TRANSFER0_START
| SPI_C_MODE0
);
178 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
181 retval
= rtsx_send_cmd(chip
, 0, 100);
183 rtsx_clear_spi_error(chip
);
184 spi_set_err_code(chip
, SPI_HW_ERR
);
189 return STATUS_SUCCESS
;
192 static void sf_program(struct rtsx_chip
*chip
, u8 ins
, u8 addr_mode
, u32 addr
,
195 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
196 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
197 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
198 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, (u8
)len
);
199 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, (u8
)(len
>> 8));
201 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
202 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
204 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
206 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
207 SPI_TRANSFER0_START
| SPI_CADO_MODE0
);
209 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
210 SPI_TRANSFER0_START
| SPI_CDO_MODE0
);
212 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
216 static int sf_erase(struct rtsx_chip
*chip
, u8 ins
, u8 addr_mode
, u32 addr
)
222 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
223 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
224 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
226 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
227 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
229 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
231 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
232 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
234 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
235 SPI_TRANSFER0_START
| SPI_C_MODE0
);
237 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
240 retval
= rtsx_send_cmd(chip
, 0, 100);
242 rtsx_clear_spi_error(chip
);
243 spi_set_err_code(chip
, SPI_HW_ERR
);
248 return STATUS_SUCCESS
;
251 static int spi_init_eeprom(struct rtsx_chip
*chip
)
261 retval
= rtsx_write_register(chip
, SPI_CLK_DIVIDER1
, 0xFF, 0x00);
266 retval
= rtsx_write_register(chip
, SPI_CLK_DIVIDER0
, 0xFF, 0x27);
272 retval
= switch_clock(chip
, clk
);
273 if (retval
!= STATUS_SUCCESS
) {
278 retval
= select_card(chip
, SPI_CARD
);
279 if (retval
!= STATUS_SUCCESS
) {
284 retval
= rtsx_write_register(chip
, CARD_CLK_EN
, SPI_CLK_EN
,
290 retval
= rtsx_write_register(chip
, CARD_OE
, SPI_OUTPUT_EN
,
299 retval
= rtsx_write_register(chip
, SPI_CONTROL
, 0xFF,
300 CS_POLARITY_HIGH
| SPI_EEPROM_AUTO
);
305 retval
= rtsx_write_register(chip
, SPI_TCTL
, EDO_TIMING_MASK
,
312 return STATUS_SUCCESS
;
315 static int spi_eeprom_program_enable(struct rtsx_chip
*chip
)
321 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x86);
322 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x13);
323 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
324 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
325 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
328 retval
= rtsx_send_cmd(chip
, 0, 100);
334 return STATUS_SUCCESS
;
337 int spi_erase_eeprom_chip(struct rtsx_chip
*chip
)
341 retval
= spi_init_eeprom(chip
);
342 if (retval
!= STATUS_SUCCESS
) {
347 retval
= spi_eeprom_program_enable(chip
);
348 if (retval
!= STATUS_SUCCESS
) {
355 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
356 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
357 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x12);
358 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x84);
359 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
360 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
361 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
364 retval
= rtsx_send_cmd(chip
, 0, 100);
370 retval
= rtsx_write_register(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
376 return STATUS_SUCCESS
;
379 int spi_erase_eeprom_byte(struct rtsx_chip
*chip
, u16 addr
)
383 retval
= spi_init_eeprom(chip
);
384 if (retval
!= STATUS_SUCCESS
) {
389 retval
= spi_eeprom_program_enable(chip
);
390 if (retval
!= STATUS_SUCCESS
) {
397 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
398 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
399 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x07);
400 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
401 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)(addr
>> 8));
402 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x46);
403 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
404 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
405 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
408 retval
= rtsx_send_cmd(chip
, 0, 100);
414 retval
= rtsx_write_register(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
420 return STATUS_SUCCESS
;
423 int spi_read_eeprom(struct rtsx_chip
*chip
, u16 addr
, u8
*val
)
428 retval
= spi_init_eeprom(chip
);
429 if (retval
!= STATUS_SUCCESS
) {
436 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
437 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
438 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x06);
439 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
440 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)(addr
>> 8));
441 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x46);
442 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, 1);
443 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
444 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
445 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
448 retval
= rtsx_send_cmd(chip
, 0, 100);
455 retval
= rtsx_read_register(chip
, SPI_DATA
, &data
);
464 retval
= rtsx_write_register(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
470 return STATUS_SUCCESS
;
473 int spi_write_eeprom(struct rtsx_chip
*chip
, u16 addr
, u8 val
)
477 retval
= spi_init_eeprom(chip
);
478 if (retval
!= STATUS_SUCCESS
) {
483 retval
= spi_eeprom_program_enable(chip
);
484 if (retval
!= STATUS_SUCCESS
) {
491 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
492 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
493 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x05);
494 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, val
);
495 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)addr
);
496 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF, (u8
)(addr
>> 8));
497 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x4E);
498 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
499 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
500 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
503 retval
= rtsx_send_cmd(chip
, 0, 100);
509 retval
= rtsx_write_register(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
515 return STATUS_SUCCESS
;
518 int spi_get_status(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
520 struct spi_info
*spi
= &(chip
->spi
);
522 dev_dbg(rtsx_dev(chip
), "spi_get_status: err_code = 0x%x\n",
524 rtsx_stor_set_xfer_buf(&(spi
->err_code
),
525 min_t(int, scsi_bufflen(srb
), 1), srb
);
526 scsi_set_resid(srb
, scsi_bufflen(srb
) - 1);
528 return STATUS_SUCCESS
;
531 int spi_set_parameter(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
533 struct spi_info
*spi
= &(chip
->spi
);
535 spi_set_err_code(chip
, SPI_NO_ERR
);
538 spi
->spi_clock
= ((u16
)(srb
->cmnd
[8]) << 8) | srb
->cmnd
[9];
540 spi
->spi_clock
= srb
->cmnd
[3];
542 spi
->clk_div
= ((u16
)(srb
->cmnd
[4]) << 8) | srb
->cmnd
[5];
543 spi
->write_en
= srb
->cmnd
[6];
545 dev_dbg(rtsx_dev(chip
), "spi_set_parameter: spi_clock = %d, clk_div = %d, write_en = %d\n",
546 spi
->spi_clock
, spi
->clk_div
, spi
->write_en
);
548 return STATUS_SUCCESS
;
551 int spi_read_flash_id(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
557 spi_set_err_code(chip
, SPI_NO_ERR
);
559 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
561 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
566 retval
= spi_set_init_para(chip
);
567 if (retval
!= STATUS_SUCCESS
) {
568 spi_set_err_code(chip
, SPI_HW_ERR
);
575 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01,
578 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, srb
->cmnd
[3]);
579 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF, srb
->cmnd
[4]);
580 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, srb
->cmnd
[5]);
581 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, srb
->cmnd
[6]);
582 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
583 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
584 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, srb
->cmnd
[7]);
585 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, srb
->cmnd
[8]);
589 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
,
590 0xFF, SPI_TRANSFER0_START
| SPI_CA_MODE0
);
592 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
,
593 0xFF, SPI_TRANSFER0_START
| SPI_C_MODE0
);
597 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
598 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
600 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
601 SPI_TRANSFER0_START
| SPI_CDI_MODE0
);
605 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
608 retval
= rtsx_send_cmd(chip
, 0, 100);
610 rtsx_clear_spi_error(chip
);
611 spi_set_err_code(chip
, SPI_HW_ERR
);
617 buf
= kmalloc(len
, GFP_KERNEL
);
623 retval
= rtsx_read_ppbuf(chip
, buf
, len
);
624 if (retval
!= STATUS_SUCCESS
) {
625 spi_set_err_code(chip
, SPI_READ_ERR
);
631 rtsx_stor_set_xfer_buf(buf
, scsi_bufflen(srb
), srb
);
632 scsi_set_resid(srb
, 0);
637 return STATUS_SUCCESS
;
640 int spi_read_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
643 unsigned int index
= 0, offset
= 0;
649 spi_set_err_code(chip
, SPI_NO_ERR
);
652 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
653 << 8) | srb
->cmnd
[6];
654 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
655 slow_read
= srb
->cmnd
[9];
657 retval
= spi_set_init_para(chip
);
658 if (retval
!= STATUS_SUCCESS
) {
659 spi_set_err_code(chip
, SPI_HW_ERR
);
664 buf
= kmalloc(SF_PAGE_LEN
, GFP_KERNEL
);
671 u16 pagelen
= SF_PAGE_LEN
- (u8
)addr
;
678 trans_dma_enable(DMA_FROM_DEVICE
, chip
, 256, DMA_256
);
680 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
683 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF,
685 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
687 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
689 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
690 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
692 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
694 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
696 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR3
, 0xFF,
698 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
699 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_32
);
702 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF,
704 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF,
707 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
708 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
709 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
,
710 SPI_TRANSFER0_END
, SPI_TRANSFER0_END
);
712 rtsx_send_cmd_no_wait(chip
);
714 retval
= rtsx_transfer_data(chip
, 0, buf
, pagelen
, 0,
715 DMA_FROM_DEVICE
, 10000);
718 rtsx_clear_spi_error(chip
);
719 spi_set_err_code(chip
, SPI_HW_ERR
);
724 rtsx_stor_access_xfer_buf(buf
, pagelen
, srb
, &index
, &offset
,
731 scsi_set_resid(srb
, 0);
734 return STATUS_SUCCESS
;
737 int spi_write_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
740 u8 ins
, program_mode
;
744 unsigned int index
= 0, offset
= 0;
746 spi_set_err_code(chip
, SPI_NO_ERR
);
749 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
750 << 8) | srb
->cmnd
[6];
751 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
752 program_mode
= srb
->cmnd
[9];
754 retval
= spi_set_init_para(chip
);
755 if (retval
!= STATUS_SUCCESS
) {
756 spi_set_err_code(chip
, SPI_HW_ERR
);
761 if (program_mode
== BYTE_PROGRAM
) {
762 buf
= kmalloc(4, GFP_KERNEL
);
769 retval
= sf_enable_write(chip
, SPI_WREN
);
770 if (retval
!= STATUS_SUCCESS
) {
776 rtsx_stor_access_xfer_buf(buf
, 1, srb
, &index
, &offset
,
781 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
,
782 0x01, PINGPONG_BUFFER
);
783 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF,
785 sf_program(chip
, ins
, 1, addr
, 1);
787 retval
= rtsx_send_cmd(chip
, 0, 100);
790 rtsx_clear_spi_error(chip
);
791 spi_set_err_code(chip
, SPI_HW_ERR
);
796 retval
= sf_polling_status(chip
, 100);
797 if (retval
!= STATUS_SUCCESS
) {
809 } else if (program_mode
== AAI_PROGRAM
) {
812 retval
= sf_enable_write(chip
, SPI_WREN
);
813 if (retval
!= STATUS_SUCCESS
) {
818 buf
= kmalloc(4, GFP_KERNEL
);
825 rtsx_stor_access_xfer_buf(buf
, 1, srb
, &index
, &offset
,
830 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
,
831 0x01, PINGPONG_BUFFER
);
832 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF,
835 sf_program(chip
, ins
, 1, addr
, 1);
838 sf_program(chip
, ins
, 0, 0, 1);
841 retval
= rtsx_send_cmd(chip
, 0, 100);
844 rtsx_clear_spi_error(chip
);
845 spi_set_err_code(chip
, SPI_HW_ERR
);
850 retval
= sf_polling_status(chip
, 100);
851 if (retval
!= STATUS_SUCCESS
) {
862 retval
= sf_disable_write(chip
, SPI_WRDI
);
863 if (retval
!= STATUS_SUCCESS
) {
868 retval
= sf_polling_status(chip
, 100);
869 if (retval
!= STATUS_SUCCESS
) {
873 } else if (program_mode
== PAGE_PROGRAM
) {
874 buf
= kmalloc(SF_PAGE_LEN
, GFP_KERNEL
);
881 u16 pagelen
= SF_PAGE_LEN
- (u8
)addr
;
886 retval
= sf_enable_write(chip
, SPI_WREN
);
887 if (retval
!= STATUS_SUCCESS
) {
895 trans_dma_enable(DMA_TO_DEVICE
, chip
, 256, DMA_256
);
896 sf_program(chip
, ins
, 1, addr
, pagelen
);
898 rtsx_send_cmd_no_wait(chip
);
900 rtsx_stor_access_xfer_buf(buf
, pagelen
, srb
, &index
,
901 &offset
, FROM_XFER_BUF
);
903 retval
= rtsx_transfer_data(chip
, 0, buf
, pagelen
, 0,
907 rtsx_clear_spi_error(chip
);
908 spi_set_err_code(chip
, SPI_HW_ERR
);
913 retval
= sf_polling_status(chip
, 100);
914 if (retval
!= STATUS_SUCCESS
) {
926 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
931 return STATUS_SUCCESS
;
934 int spi_erase_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
940 spi_set_err_code(chip
, SPI_NO_ERR
);
943 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
944 << 8) | srb
->cmnd
[6];
945 erase_mode
= srb
->cmnd
[9];
947 retval
= spi_set_init_para(chip
);
948 if (retval
!= STATUS_SUCCESS
) {
949 spi_set_err_code(chip
, SPI_HW_ERR
);
954 if (erase_mode
== PAGE_ERASE
) {
955 retval
= sf_enable_write(chip
, SPI_WREN
);
956 if (retval
!= STATUS_SUCCESS
) {
961 retval
= sf_erase(chip
, ins
, 1, addr
);
962 if (retval
!= STATUS_SUCCESS
) {
966 } else if (erase_mode
== CHIP_ERASE
) {
967 retval
= sf_enable_write(chip
, SPI_WREN
);
968 if (retval
!= STATUS_SUCCESS
) {
973 retval
= sf_erase(chip
, ins
, 0, 0);
974 if (retval
!= STATUS_SUCCESS
) {
979 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
984 return STATUS_SUCCESS
;
987 int spi_write_flash_status(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
990 u8 ins
, status
, ewsr
;
993 status
= srb
->cmnd
[4];
996 retval
= spi_set_init_para(chip
);
997 if (retval
!= STATUS_SUCCESS
) {
998 spi_set_err_code(chip
, SPI_HW_ERR
);
1003 retval
= sf_enable_write(chip
, ewsr
);
1004 if (retval
!= STATUS_SUCCESS
) {
1009 rtsx_init_cmd(chip
);
1011 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01,
1014 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
1015 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
1016 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
1017 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, 0);
1018 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, 1);
1019 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF, status
);
1020 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
1021 SPI_TRANSFER0_START
| SPI_CDO_MODE0
);
1022 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
1025 retval
= rtsx_send_cmd(chip
, 0, 100);
1026 if (retval
!= STATUS_SUCCESS
) {
1027 rtsx_clear_spi_error(chip
);
1028 spi_set_err_code(chip
, SPI_HW_ERR
);
1033 return STATUS_SUCCESS
;