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>
28 #include "rtsx_transport.h"
29 #include "rtsx_scsi.h"
30 #include "rtsx_card.h"
33 static inline void spi_set_err_code(struct rtsx_chip
*chip
, u8 err_code
)
35 struct spi_info
*spi
= &(chip
->spi
);
37 spi
->err_code
= err_code
;
40 static int spi_init(struct rtsx_chip
*chip
)
42 RTSX_WRITE_REG(chip
, SPI_CONTROL
, 0xFF,
43 CS_POLARITY_LOW
| DTO_MSB_FIRST
| SPI_MASTER
| SPI_MODE0
|
45 RTSX_WRITE_REG(chip
, SPI_TCTL
, EDO_TIMING_MASK
, SAMPLE_DELAY_HALF
);
47 return STATUS_SUCCESS
;
50 static int spi_set_init_para(struct rtsx_chip
*chip
)
52 struct spi_info
*spi
= &(chip
->spi
);
55 RTSX_WRITE_REG(chip
, SPI_CLK_DIVIDER1
, 0xFF, (u8
)(spi
->clk_div
>> 8));
56 RTSX_WRITE_REG(chip
, SPI_CLK_DIVIDER0
, 0xFF, (u8
)(spi
->clk_div
));
58 retval
= switch_clock(chip
, spi
->spi_clock
);
59 if (retval
!= STATUS_SUCCESS
)
60 TRACE_RET(chip
, STATUS_FAIL
);
62 retval
= select_card(chip
, SPI_CARD
);
63 if (retval
!= STATUS_SUCCESS
)
64 TRACE_RET(chip
, STATUS_FAIL
);
66 RTSX_WRITE_REG(chip
, CARD_CLK_EN
, SPI_CLK_EN
, SPI_CLK_EN
);
67 RTSX_WRITE_REG(chip
, CARD_OE
, SPI_OUTPUT_EN
, SPI_OUTPUT_EN
);
71 retval
= spi_init(chip
);
72 if (retval
!= STATUS_SUCCESS
)
73 TRACE_RET(chip
, STATUS_FAIL
);
75 return STATUS_SUCCESS
;
78 static int sf_polling_status(struct rtsx_chip
*chip
, int msec
)
84 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, SPI_RDSR
);
85 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
86 SPI_TRANSFER0_START
| SPI_POLLING_MODE0
);
87 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
90 retval
= rtsx_send_cmd(chip
, 0, msec
);
92 rtsx_clear_spi_error(chip
);
93 spi_set_err_code(chip
, SPI_BUSY_ERR
);
94 TRACE_RET(chip
, STATUS_FAIL
);
97 return STATUS_SUCCESS
;
100 static int sf_enable_write(struct rtsx_chip
*chip
, u8 ins
)
102 struct spi_info
*spi
= &(chip
->spi
);
106 return STATUS_SUCCESS
;
110 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
111 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
112 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
113 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
114 SPI_TRANSFER0_START
| SPI_C_MODE0
);
115 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
118 retval
= rtsx_send_cmd(chip
, 0, 100);
120 rtsx_clear_spi_error(chip
);
121 spi_set_err_code(chip
, SPI_HW_ERR
);
122 TRACE_RET(chip
, STATUS_FAIL
);
125 return STATUS_SUCCESS
;
128 static int sf_disable_write(struct rtsx_chip
*chip
, u8 ins
)
130 struct spi_info
*spi
= &(chip
->spi
);
134 return STATUS_SUCCESS
;
138 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
139 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
140 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
141 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
142 SPI_TRANSFER0_START
| SPI_C_MODE0
);
143 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
146 retval
= rtsx_send_cmd(chip
, 0, 100);
148 rtsx_clear_spi_error(chip
);
149 spi_set_err_code(chip
, SPI_HW_ERR
);
150 TRACE_RET(chip
, STATUS_FAIL
);
153 return STATUS_SUCCESS
;
156 static void sf_program(struct rtsx_chip
*chip
, u8 ins
, u8 addr_mode
, u32 addr
,
159 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
160 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
161 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
162 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, (u8
)len
);
163 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, (u8
)(len
>> 8));
165 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
166 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
168 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
170 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
171 SPI_TRANSFER0_START
| SPI_CADO_MODE0
);
173 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
174 SPI_TRANSFER0_START
| SPI_CDO_MODE0
);
176 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
180 static int sf_erase(struct rtsx_chip
*chip
, u8 ins
, u8 addr_mode
, u32 addr
)
186 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
187 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
188 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
190 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
191 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
193 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
195 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
196 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
198 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
199 SPI_TRANSFER0_START
| SPI_C_MODE0
);
201 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
204 retval
= rtsx_send_cmd(chip
, 0, 100);
206 rtsx_clear_spi_error(chip
);
207 spi_set_err_code(chip
, SPI_HW_ERR
);
208 TRACE_RET(chip
, STATUS_FAIL
);
211 return STATUS_SUCCESS
;
214 static int spi_init_eeprom(struct rtsx_chip
*chip
)
224 RTSX_WRITE_REG(chip
, SPI_CLK_DIVIDER1
, 0xFF, 0x00);
225 RTSX_WRITE_REG(chip
, SPI_CLK_DIVIDER0
, 0xFF, 0x27);
227 retval
= switch_clock(chip
, clk
);
228 if (retval
!= STATUS_SUCCESS
)
229 TRACE_RET(chip
, STATUS_FAIL
);
231 retval
= select_card(chip
, SPI_CARD
);
232 if (retval
!= STATUS_SUCCESS
)
233 TRACE_RET(chip
, STATUS_FAIL
);
235 RTSX_WRITE_REG(chip
, CARD_CLK_EN
, SPI_CLK_EN
, SPI_CLK_EN
);
236 RTSX_WRITE_REG(chip
, CARD_OE
, SPI_OUTPUT_EN
, SPI_OUTPUT_EN
);
240 RTSX_WRITE_REG(chip
, SPI_CONTROL
, 0xFF,
241 CS_POLARITY_HIGH
| SPI_EEPROM_AUTO
);
242 RTSX_WRITE_REG(chip
, SPI_TCTL
, EDO_TIMING_MASK
, SAMPLE_DELAY_HALF
);
244 return STATUS_SUCCESS
;
247 static int spi_eeprom_program_enable(struct rtsx_chip
*chip
)
253 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x86);
254 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x13);
255 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
256 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
257 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
260 retval
= rtsx_send_cmd(chip
, 0, 100);
262 TRACE_RET(chip
, STATUS_FAIL
);
264 return STATUS_SUCCESS
;
267 int spi_erase_eeprom_chip(struct rtsx_chip
*chip
)
271 retval
= spi_init_eeprom(chip
);
272 if (retval
!= STATUS_SUCCESS
)
273 TRACE_RET(chip
, STATUS_FAIL
);
275 retval
= spi_eeprom_program_enable(chip
);
276 if (retval
!= STATUS_SUCCESS
)
277 TRACE_RET(chip
, STATUS_FAIL
);
281 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
282 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
283 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x12);
284 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x84);
285 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
286 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
287 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
290 retval
= rtsx_send_cmd(chip
, 0, 100);
292 TRACE_RET(chip
, STATUS_FAIL
);
294 RTSX_WRITE_REG(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
296 return STATUS_SUCCESS
;
299 int spi_erase_eeprom_byte(struct rtsx_chip
*chip
, u16 addr
)
303 retval
= spi_init_eeprom(chip
);
304 if (retval
!= STATUS_SUCCESS
)
305 TRACE_RET(chip
, STATUS_FAIL
);
307 retval
= spi_eeprom_program_enable(chip
);
308 if (retval
!= STATUS_SUCCESS
)
309 TRACE_RET(chip
, STATUS_FAIL
);
313 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
314 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
315 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x07);
316 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
317 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)(addr
>> 8));
318 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x46);
319 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
320 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
321 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
324 retval
= rtsx_send_cmd(chip
, 0, 100);
326 TRACE_RET(chip
, STATUS_FAIL
);
328 RTSX_WRITE_REG(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
330 return STATUS_SUCCESS
;
334 int spi_read_eeprom(struct rtsx_chip
*chip
, u16 addr
, u8
*val
)
339 retval
= spi_init_eeprom(chip
);
340 if (retval
!= STATUS_SUCCESS
)
341 TRACE_RET(chip
, STATUS_FAIL
);
345 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
346 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
347 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x06);
348 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, (u8
)addr
);
349 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)(addr
>> 8));
350 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x46);
351 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, 1);
352 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
353 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
354 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
357 retval
= rtsx_send_cmd(chip
, 0, 100);
359 TRACE_RET(chip
, STATUS_FAIL
);
362 RTSX_READ_REG(chip
, SPI_DATA
, &data
);
367 RTSX_WRITE_REG(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
369 return STATUS_SUCCESS
;
372 int spi_write_eeprom(struct rtsx_chip
*chip
, u16 addr
, u8 val
)
376 retval
= spi_init_eeprom(chip
);
377 if (retval
!= STATUS_SUCCESS
)
378 TRACE_RET(chip
, STATUS_FAIL
);
380 retval
= spi_eeprom_program_enable(chip
);
381 if (retval
!= STATUS_SUCCESS
)
382 TRACE_RET(chip
, STATUS_FAIL
);
386 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_GPIO_DIR
, 0x01, 0);
387 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01, RING_BUFFER
);
388 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, 0x05);
389 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, val
);
390 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, (u8
)addr
);
391 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF, (u8
)(addr
>> 8));
392 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF, 0x4E);
393 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
394 SPI_TRANSFER0_START
| SPI_CA_MODE0
);
395 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
398 retval
= rtsx_send_cmd(chip
, 0, 100);
400 TRACE_RET(chip
, STATUS_FAIL
);
402 RTSX_WRITE_REG(chip
, CARD_GPIO_DIR
, 0x01, 0x01);
404 return STATUS_SUCCESS
;
408 int spi_get_status(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
410 struct spi_info
*spi
= &(chip
->spi
);
412 dev_dbg(rtsx_dev(chip
), "spi_get_status: err_code = 0x%x\n",
414 rtsx_stor_set_xfer_buf(&(spi
->err_code
),
415 min_t(int, scsi_bufflen(srb
), 1), srb
);
416 scsi_set_resid(srb
, scsi_bufflen(srb
) - 1);
418 return STATUS_SUCCESS
;
421 int spi_set_parameter(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
423 struct spi_info
*spi
= &(chip
->spi
);
425 spi_set_err_code(chip
, SPI_NO_ERR
);
428 spi
->spi_clock
= ((u16
)(srb
->cmnd
[8]) << 8) | srb
->cmnd
[9];
430 spi
->spi_clock
= srb
->cmnd
[3];
432 spi
->clk_div
= ((u16
)(srb
->cmnd
[4]) << 8) | srb
->cmnd
[5];
433 spi
->write_en
= srb
->cmnd
[6];
435 dev_dbg(rtsx_dev(chip
), "spi_set_parameter: spi_clock = %d, clk_div = %d, write_en = %d\n",
436 spi
->spi_clock
, spi
->clk_div
, spi
->write_en
);
438 return STATUS_SUCCESS
;
441 int spi_read_flash_id(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
447 spi_set_err_code(chip
, SPI_NO_ERR
);
449 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
451 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
452 TRACE_RET(chip
, STATUS_FAIL
);
455 retval
= spi_set_init_para(chip
);
456 if (retval
!= STATUS_SUCCESS
) {
457 spi_set_err_code(chip
, SPI_HW_ERR
);
458 TRACE_RET(chip
, STATUS_FAIL
);
463 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01,
466 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, srb
->cmnd
[3]);
467 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF, srb
->cmnd
[4]);
468 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF, srb
->cmnd
[5]);
469 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF, srb
->cmnd
[6]);
470 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
471 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
472 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, srb
->cmnd
[7]);
473 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, srb
->cmnd
[8]);
477 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
,
478 0xFF, SPI_TRANSFER0_START
| SPI_CA_MODE0
);
480 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
,
481 0xFF, SPI_TRANSFER0_START
| SPI_C_MODE0
);
485 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
486 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
488 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
489 SPI_TRANSFER0_START
| SPI_CDI_MODE0
);
493 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
496 retval
= rtsx_send_cmd(chip
, 0, 100);
498 rtsx_clear_spi_error(chip
);
499 spi_set_err_code(chip
, SPI_HW_ERR
);
500 TRACE_RET(chip
, STATUS_FAIL
);
504 buf
= kmalloc(len
, GFP_KERNEL
);
506 TRACE_RET(chip
, STATUS_ERROR
);
508 retval
= rtsx_read_ppbuf(chip
, buf
, len
);
509 if (retval
!= STATUS_SUCCESS
) {
510 spi_set_err_code(chip
, SPI_READ_ERR
);
512 TRACE_RET(chip
, STATUS_FAIL
);
515 rtsx_stor_set_xfer_buf(buf
, scsi_bufflen(srb
), srb
);
516 scsi_set_resid(srb
, 0);
521 return STATUS_SUCCESS
;
524 int spi_read_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
527 unsigned int index
= 0, offset
= 0;
533 spi_set_err_code(chip
, SPI_NO_ERR
);
536 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
537 << 8) | srb
->cmnd
[6];
538 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
539 slow_read
= srb
->cmnd
[9];
541 retval
= spi_set_init_para(chip
);
542 if (retval
!= STATUS_SUCCESS
) {
543 spi_set_err_code(chip
, SPI_HW_ERR
);
544 TRACE_RET(chip
, STATUS_FAIL
);
547 buf
= kmalloc(SF_PAGE_LEN
, GFP_KERNEL
);
549 TRACE_RET(chip
, STATUS_ERROR
);
552 u16 pagelen
= SF_PAGE_LEN
- (u8
)addr
;
559 trans_dma_enable(DMA_FROM_DEVICE
, chip
, 256, DMA_256
);
561 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
564 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR0
, 0xFF,
566 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
568 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
570 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
571 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
573 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR1
, 0xFF,
575 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR2
, 0xFF,
577 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_ADDR3
, 0xFF,
579 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
580 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_32
);
583 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF,
585 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF,
588 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
589 SPI_TRANSFER0_START
| SPI_CADI_MODE0
);
590 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
,
591 SPI_TRANSFER0_END
, SPI_TRANSFER0_END
);
593 rtsx_send_cmd_no_wait(chip
);
595 retval
= rtsx_transfer_data(chip
, 0, buf
, pagelen
, 0,
596 DMA_FROM_DEVICE
, 10000);
599 rtsx_clear_spi_error(chip
);
600 spi_set_err_code(chip
, SPI_HW_ERR
);
601 TRACE_RET(chip
, STATUS_FAIL
);
604 rtsx_stor_access_xfer_buf(buf
, pagelen
, srb
, &index
, &offset
,
611 scsi_set_resid(srb
, 0);
614 return STATUS_SUCCESS
;
617 int spi_write_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
620 u8 ins
, program_mode
;
624 unsigned int index
= 0, offset
= 0;
626 spi_set_err_code(chip
, SPI_NO_ERR
);
629 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
630 << 8) | srb
->cmnd
[6];
631 len
= ((u16
)(srb
->cmnd
[7]) << 8) | srb
->cmnd
[8];
632 program_mode
= srb
->cmnd
[9];
634 retval
= spi_set_init_para(chip
);
635 if (retval
!= STATUS_SUCCESS
) {
636 spi_set_err_code(chip
, SPI_HW_ERR
);
637 TRACE_RET(chip
, STATUS_FAIL
);
640 if (program_mode
== BYTE_PROGRAM
) {
641 buf
= kmalloc(4, GFP_KERNEL
);
643 TRACE_RET(chip
, STATUS_ERROR
);
646 retval
= sf_enable_write(chip
, SPI_WREN
);
647 if (retval
!= STATUS_SUCCESS
) {
649 TRACE_RET(chip
, STATUS_FAIL
);
652 rtsx_stor_access_xfer_buf(buf
, 1, srb
, &index
, &offset
,
657 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
,
658 0x01, PINGPONG_BUFFER
);
659 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF,
661 sf_program(chip
, ins
, 1, addr
, 1);
663 retval
= rtsx_send_cmd(chip
, 0, 100);
666 rtsx_clear_spi_error(chip
);
667 spi_set_err_code(chip
, SPI_HW_ERR
);
668 TRACE_RET(chip
, STATUS_FAIL
);
671 retval
= sf_polling_status(chip
, 100);
672 if (retval
!= STATUS_SUCCESS
) {
674 TRACE_RET(chip
, STATUS_FAIL
);
683 } else if (program_mode
== AAI_PROGRAM
) {
686 retval
= sf_enable_write(chip
, SPI_WREN
);
687 if (retval
!= STATUS_SUCCESS
)
688 TRACE_RET(chip
, STATUS_FAIL
);
690 buf
= kmalloc(4, GFP_KERNEL
);
692 TRACE_RET(chip
, STATUS_ERROR
);
695 rtsx_stor_access_xfer_buf(buf
, 1, srb
, &index
, &offset
,
700 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
,
701 0x01, PINGPONG_BUFFER
);
702 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF,
705 sf_program(chip
, ins
, 1, addr
, 1);
708 sf_program(chip
, ins
, 0, 0, 1);
711 retval
= rtsx_send_cmd(chip
, 0, 100);
714 rtsx_clear_spi_error(chip
);
715 spi_set_err_code(chip
, SPI_HW_ERR
);
716 TRACE_RET(chip
, STATUS_FAIL
);
719 retval
= sf_polling_status(chip
, 100);
720 if (retval
!= STATUS_SUCCESS
) {
722 TRACE_RET(chip
, STATUS_FAIL
);
730 retval
= sf_disable_write(chip
, SPI_WRDI
);
731 if (retval
!= STATUS_SUCCESS
)
732 TRACE_RET(chip
, STATUS_FAIL
);
734 retval
= sf_polling_status(chip
, 100);
735 if (retval
!= STATUS_SUCCESS
)
736 TRACE_RET(chip
, STATUS_FAIL
);
737 } else if (program_mode
== PAGE_PROGRAM
) {
738 buf
= kmalloc(SF_PAGE_LEN
, GFP_KERNEL
);
740 TRACE_RET(chip
, STATUS_NOMEM
);
743 u16 pagelen
= SF_PAGE_LEN
- (u8
)addr
;
748 retval
= sf_enable_write(chip
, SPI_WREN
);
749 if (retval
!= STATUS_SUCCESS
) {
751 TRACE_RET(chip
, STATUS_FAIL
);
756 trans_dma_enable(DMA_TO_DEVICE
, chip
, 256, DMA_256
);
757 sf_program(chip
, ins
, 1, addr
, pagelen
);
759 rtsx_send_cmd_no_wait(chip
);
761 rtsx_stor_access_xfer_buf(buf
, pagelen
, srb
, &index
,
762 &offset
, FROM_XFER_BUF
);
764 retval
= rtsx_transfer_data(chip
, 0, buf
, pagelen
, 0,
768 rtsx_clear_spi_error(chip
);
769 spi_set_err_code(chip
, SPI_HW_ERR
);
770 TRACE_RET(chip
, STATUS_FAIL
);
773 retval
= sf_polling_status(chip
, 100);
774 if (retval
!= STATUS_SUCCESS
) {
776 TRACE_RET(chip
, STATUS_FAIL
);
785 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
786 TRACE_RET(chip
, STATUS_FAIL
);
789 return STATUS_SUCCESS
;
792 int spi_erase_flash(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
798 spi_set_err_code(chip
, SPI_NO_ERR
);
801 addr
= ((u32
)(srb
->cmnd
[4]) << 16) | ((u32
)(srb
->cmnd
[5])
802 << 8) | srb
->cmnd
[6];
803 erase_mode
= srb
->cmnd
[9];
805 retval
= spi_set_init_para(chip
);
806 if (retval
!= STATUS_SUCCESS
) {
807 spi_set_err_code(chip
, SPI_HW_ERR
);
808 TRACE_RET(chip
, STATUS_FAIL
);
811 if (erase_mode
== PAGE_ERASE
) {
812 retval
= sf_enable_write(chip
, SPI_WREN
);
813 if (retval
!= STATUS_SUCCESS
)
814 TRACE_RET(chip
, STATUS_FAIL
);
816 retval
= sf_erase(chip
, ins
, 1, addr
);
817 if (retval
!= STATUS_SUCCESS
)
818 TRACE_RET(chip
, STATUS_FAIL
);
819 } else if (erase_mode
== CHIP_ERASE
) {
820 retval
= sf_enable_write(chip
, SPI_WREN
);
821 if (retval
!= STATUS_SUCCESS
)
822 TRACE_RET(chip
, STATUS_FAIL
);
824 retval
= sf_erase(chip
, ins
, 0, 0);
825 if (retval
!= STATUS_SUCCESS
)
826 TRACE_RET(chip
, STATUS_FAIL
);
828 spi_set_err_code(chip
, SPI_INVALID_COMMAND
);
829 TRACE_RET(chip
, STATUS_FAIL
);
832 return STATUS_SUCCESS
;
835 int spi_write_flash_status(struct scsi_cmnd
*srb
, struct rtsx_chip
*chip
)
838 u8 ins
, status
, ewsr
;
841 status
= srb
->cmnd
[4];
844 retval
= spi_set_init_para(chip
);
845 if (retval
!= STATUS_SUCCESS
) {
846 spi_set_err_code(chip
, SPI_HW_ERR
);
847 TRACE_RET(chip
, STATUS_FAIL
);
850 retval
= sf_enable_write(chip
, ewsr
);
851 if (retval
!= STATUS_SUCCESS
)
852 TRACE_RET(chip
, STATUS_FAIL
);
856 rtsx_add_cmd(chip
, WRITE_REG_CMD
, CARD_DATA_SOURCE
, 0x01,
859 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_COMMAND
, 0xFF, ins
);
860 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_CA_NUMBER
, 0xFF,
861 SPI_COMMAND_BIT_8
| SPI_ADDRESS_BIT_24
);
862 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH1
, 0xFF, 0);
863 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_LENGTH0
, 0xFF, 1);
864 rtsx_add_cmd(chip
, WRITE_REG_CMD
, PPBUF_BASE2
, 0xFF, status
);
865 rtsx_add_cmd(chip
, WRITE_REG_CMD
, SPI_TRANSFER0
, 0xFF,
866 SPI_TRANSFER0_START
| SPI_CDO_MODE0
);
867 rtsx_add_cmd(chip
, CHECK_REG_CMD
, SPI_TRANSFER0
, SPI_TRANSFER0_END
,
870 retval
= rtsx_send_cmd(chip
, 0, 100);
871 if (retval
!= STATUS_SUCCESS
) {
872 rtsx_clear_spi_error(chip
);
873 spi_set_err_code(chip
, SPI_HW_ERR
);
874 TRACE_RET(chip
, STATUS_FAIL
);
877 return STATUS_SUCCESS
;