1 /* Driver for Realtek PCI-Express card reader
2 *
3 * Copyright(c) 2009-2013 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 * Wei WANG (wei_wang@realsil.com.cn)
20 * Micky Ching (micky_ching@realsil.com.cn)
21 */
22
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
26
27 #include "rtsx.h"
28 #include "spi.h"
29
spi_set_err_code(struct rtsx_chip * chip,u8 err_code)30 static inline void spi_set_err_code(struct rtsx_chip *chip, u8 err_code)
31 {
32 struct spi_info *spi = &chip->spi;
33
34 spi->err_code = err_code;
35 }
36
spi_init(struct rtsx_chip * chip)37 static int spi_init(struct rtsx_chip *chip)
38 {
39 int retval;
40
41 retval = rtsx_write_register(chip, SPI_CONTROL, 0xFF,
42 CS_POLARITY_LOW | DTO_MSB_FIRST
43 | SPI_MASTER | SPI_MODE0 | SPI_AUTO);
44 if (retval) {
45 return retval;
46 }
47 retval = rtsx_write_register(chip, SPI_TCTL, EDO_TIMING_MASK,
48 SAMPLE_DELAY_HALF);
49 if (retval) {
50 return retval;
51 }
52
53 return STATUS_SUCCESS;
54 }
55
spi_set_init_para(struct rtsx_chip * chip)56 static int spi_set_init_para(struct rtsx_chip *chip)
57 {
58 struct spi_info *spi = &chip->spi;
59 int retval;
60
61 retval = rtsx_write_register(chip, SPI_CLK_DIVIDER1, 0xFF,
62 (u8)(spi->clk_div >> 8));
63 if (retval) {
64 return retval;
65 }
66 retval = rtsx_write_register(chip, SPI_CLK_DIVIDER0, 0xFF,
67 (u8)(spi->clk_div));
68 if (retval) {
69 return retval;
70 }
71
72 retval = switch_clock(chip, spi->spi_clock);
73 if (retval != STATUS_SUCCESS) {
74 return STATUS_FAIL;
75 }
76
77 retval = select_card(chip, SPI_CARD);
78 if (retval != STATUS_SUCCESS) {
79 return STATUS_FAIL;
80 }
81
82 retval = rtsx_write_register(chip, CARD_CLK_EN, SPI_CLK_EN,
83 SPI_CLK_EN);
84 if (retval) {
85 return retval;
86 }
87 retval = rtsx_write_register(chip, CARD_OE, SPI_OUTPUT_EN,
88 SPI_OUTPUT_EN);
89 if (retval) {
90 return retval;
91 }
92
93 wait_timeout(10);
94
95 retval = spi_init(chip);
96 if (retval != STATUS_SUCCESS) {
97 return STATUS_FAIL;
98 }
99
100 return STATUS_SUCCESS;
101 }
102
sf_polling_status(struct rtsx_chip * chip,int msec)103 static int sf_polling_status(struct rtsx_chip *chip, int msec)
104 {
105 int retval;
106
107 rtsx_init_cmd(chip);
108
109 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, SPI_RDSR);
110 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
111 SPI_TRANSFER0_START | SPI_POLLING_MODE0);
112 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
113 SPI_TRANSFER0_END);
114
115 retval = rtsx_send_cmd(chip, 0, msec);
116 if (retval < 0) {
117 rtsx_clear_spi_error(chip);
118 spi_set_err_code(chip, SPI_BUSY_ERR);
119 return STATUS_FAIL;
120 }
121
122 return STATUS_SUCCESS;
123 }
124
sf_enable_write(struct rtsx_chip * chip,u8 ins)125 static int sf_enable_write(struct rtsx_chip *chip, u8 ins)
126 {
127 struct spi_info *spi = &chip->spi;
128 int retval;
129
130 if (!spi->write_en)
131 return STATUS_SUCCESS;
132
133 rtsx_init_cmd(chip);
134
135 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
136 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
137 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
138 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
139 SPI_TRANSFER0_START | SPI_C_MODE0);
140 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
141 SPI_TRANSFER0_END);
142
143 retval = rtsx_send_cmd(chip, 0, 100);
144 if (retval < 0) {
145 rtsx_clear_spi_error(chip);
146 spi_set_err_code(chip, SPI_HW_ERR);
147 return STATUS_FAIL;
148 }
149
150 return STATUS_SUCCESS;
151 }
152
sf_disable_write(struct rtsx_chip * chip,u8 ins)153 static int sf_disable_write(struct rtsx_chip *chip, u8 ins)
154 {
155 struct spi_info *spi = &chip->spi;
156 int retval;
157
158 if (!spi->write_en)
159 return STATUS_SUCCESS;
160
161 rtsx_init_cmd(chip);
162
163 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
164 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
165 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
166 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
167 SPI_TRANSFER0_START | SPI_C_MODE0);
168 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
169 SPI_TRANSFER0_END);
170
171 retval = rtsx_send_cmd(chip, 0, 100);
172 if (retval < 0) {
173 rtsx_clear_spi_error(chip);
174 spi_set_err_code(chip, SPI_HW_ERR);
175 return STATUS_FAIL;
176 }
177
178 return STATUS_SUCCESS;
179 }
180
sf_program(struct rtsx_chip * chip,u8 ins,u8 addr_mode,u32 addr,u16 len)181 static void sf_program(struct rtsx_chip *chip, u8 ins, u8 addr_mode, u32 addr,
182 u16 len)
183 {
184 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
185 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
186 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
187 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, (u8)len);
188 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, (u8)(len >> 8));
189 if (addr_mode) {
190 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
191 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
192 (u8)(addr >> 8));
193 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
194 (u8)(addr >> 16));
195 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
196 SPI_TRANSFER0_START | SPI_CADO_MODE0);
197 } else {
198 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
199 SPI_TRANSFER0_START | SPI_CDO_MODE0);
200 }
201 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
202 SPI_TRANSFER0_END);
203 }
204
sf_erase(struct rtsx_chip * chip,u8 ins,u8 addr_mode,u32 addr)205 static int sf_erase(struct rtsx_chip *chip, u8 ins, u8 addr_mode, u32 addr)
206 {
207 int retval;
208
209 rtsx_init_cmd(chip);
210
211 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
212 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
213 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
214 if (addr_mode) {
215 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
216 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
217 (u8)(addr >> 8));
218 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
219 (u8)(addr >> 16));
220 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
221 SPI_TRANSFER0_START | SPI_CA_MODE0);
222 } else {
223 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
224 SPI_TRANSFER0_START | SPI_C_MODE0);
225 }
226 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
227 SPI_TRANSFER0_END);
228
229 retval = rtsx_send_cmd(chip, 0, 100);
230 if (retval < 0) {
231 rtsx_clear_spi_error(chip);
232 spi_set_err_code(chip, SPI_HW_ERR);
233 return STATUS_FAIL;
234 }
235
236 return STATUS_SUCCESS;
237 }
238
spi_init_eeprom(struct rtsx_chip * chip)239 static int spi_init_eeprom(struct rtsx_chip *chip)
240 {
241 int retval;
242 int clk;
243
244 if (chip->asic_code)
245 clk = 30;
246 else
247 clk = CLK_30;
248
249 retval = rtsx_write_register(chip, SPI_CLK_DIVIDER1, 0xFF, 0x00);
250 if (retval) {
251 return retval;
252 }
253 retval = rtsx_write_register(chip, SPI_CLK_DIVIDER0, 0xFF, 0x27);
254 if (retval) {
255 return retval;
256 }
257
258 retval = switch_clock(chip, clk);
259 if (retval != STATUS_SUCCESS) {
260 return STATUS_FAIL;
261 }
262
263 retval = select_card(chip, SPI_CARD);
264 if (retval != STATUS_SUCCESS) {
265 return STATUS_FAIL;
266 }
267
268 retval = rtsx_write_register(chip, CARD_CLK_EN, SPI_CLK_EN,
269 SPI_CLK_EN);
270 if (retval) {
271 return retval;
272 }
273 retval = rtsx_write_register(chip, CARD_OE, SPI_OUTPUT_EN,
274 SPI_OUTPUT_EN);
275 if (retval) {
276 return retval;
277 }
278
279 wait_timeout(10);
280
281 retval = rtsx_write_register(chip, SPI_CONTROL, 0xFF,
282 CS_POLARITY_HIGH | SPI_EEPROM_AUTO);
283 if (retval) {
284 return retval;
285 }
286 retval = rtsx_write_register(chip, SPI_TCTL, EDO_TIMING_MASK,
287 SAMPLE_DELAY_HALF);
288 if (retval) {
289 return retval;
290 }
291
292 return STATUS_SUCCESS;
293 }
294
spi_eeprom_program_enable(struct rtsx_chip * chip)295 static int spi_eeprom_program_enable(struct rtsx_chip *chip)
296 {
297 int retval;
298
299 rtsx_init_cmd(chip);
300
301 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x86);
302 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x13);
303 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
304 SPI_TRANSFER0_START | SPI_CA_MODE0);
305 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
306 SPI_TRANSFER0_END);
307
308 retval = rtsx_send_cmd(chip, 0, 100);
309 if (retval < 0) {
310 return STATUS_FAIL;
311 }
312
313 return STATUS_SUCCESS;
314 }
315
spi_erase_eeprom_chip(struct rtsx_chip * chip)316 int spi_erase_eeprom_chip(struct rtsx_chip *chip)
317 {
318 int retval;
319
320 retval = spi_init_eeprom(chip);
321 if (retval != STATUS_SUCCESS) {
322 return STATUS_FAIL;
323 }
324
325 retval = spi_eeprom_program_enable(chip);
326 if (retval != STATUS_SUCCESS) {
327 return STATUS_FAIL;
328 }
329
330 rtsx_init_cmd(chip);
331
332 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
333 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
334 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x12);
335 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x84);
336 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
337 SPI_TRANSFER0_START | SPI_CA_MODE0);
338 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
339 SPI_TRANSFER0_END);
340
341 retval = rtsx_send_cmd(chip, 0, 100);
342 if (retval < 0) {
343 return STATUS_FAIL;
344 }
345
346 retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
347 if (retval) {
348 return retval;
349 }
350
351 return STATUS_SUCCESS;
352 }
353
spi_erase_eeprom_byte(struct rtsx_chip * chip,u16 addr)354 int spi_erase_eeprom_byte(struct rtsx_chip *chip, u16 addr)
355 {
356 int retval;
357
358 retval = spi_init_eeprom(chip);
359 if (retval != STATUS_SUCCESS) {
360 return STATUS_FAIL;
361 }
362
363 retval = spi_eeprom_program_enable(chip);
364 if (retval != STATUS_SUCCESS) {
365 return STATUS_FAIL;
366 }
367
368 rtsx_init_cmd(chip);
369
370 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
371 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
372 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x07);
373 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
374 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)(addr >> 8));
375 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x46);
376 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
377 SPI_TRANSFER0_START | SPI_CA_MODE0);
378 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
379 SPI_TRANSFER0_END);
380
381 retval = rtsx_send_cmd(chip, 0, 100);
382 if (retval < 0) {
383 return STATUS_FAIL;
384 }
385
386 retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
387 if (retval) {
388 return retval;
389 }
390
391 return STATUS_SUCCESS;
392 }
393
spi_read_eeprom(struct rtsx_chip * chip,u16 addr,u8 * val)394 int spi_read_eeprom(struct rtsx_chip *chip, u16 addr, u8 *val)
395 {
396 int retval;
397 u8 data;
398
399 retval = spi_init_eeprom(chip);
400 if (retval != STATUS_SUCCESS) {
401 return STATUS_FAIL;
402 }
403
404 rtsx_init_cmd(chip);
405
406 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
407 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
408 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x06);
409 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
410 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)(addr >> 8));
411 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x46);
412 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, 1);
413 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
414 SPI_TRANSFER0_START | SPI_CADI_MODE0);
415 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
416 SPI_TRANSFER0_END);
417
418 retval = rtsx_send_cmd(chip, 0, 100);
419 if (retval < 0) {
420 return STATUS_FAIL;
421 }
422
423 wait_timeout(5);
424 retval = rtsx_read_register(chip, SPI_DATA, &data);
425 if (retval) {
426 return retval;
427 }
428
429 if (val)
430 *val = data;
431
432 retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
433 if (retval) {
434 return retval;
435 }
436
437 return STATUS_SUCCESS;
438 }
439
spi_write_eeprom(struct rtsx_chip * chip,u16 addr,u8 val)440 int spi_write_eeprom(struct rtsx_chip *chip, u16 addr, u8 val)
441 {
442 int retval;
443
444 retval = spi_init_eeprom(chip);
445 if (retval != STATUS_SUCCESS) {
446 return STATUS_FAIL;
447 }
448
449 retval = spi_eeprom_program_enable(chip);
450 if (retval != STATUS_SUCCESS) {
451 return STATUS_FAIL;
452 }
453
454 rtsx_init_cmd(chip);
455
456 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
457 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
458 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x05);
459 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, val);
460 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)addr);
461 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF, (u8)(addr >> 8));
462 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x4E);
463 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
464 SPI_TRANSFER0_START | SPI_CA_MODE0);
465 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
466 SPI_TRANSFER0_END);
467
468 retval = rtsx_send_cmd(chip, 0, 100);
469 if (retval < 0) {
470 return STATUS_FAIL;
471 }
472
473 retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
474 if (retval) {
475 return retval;
476 }
477
478 return STATUS_SUCCESS;
479 }
480
spi_get_status(struct scsi_cmnd * srb,struct rtsx_chip * chip)481 int spi_get_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
482 {
483 struct spi_info *spi = &chip->spi;
484
485 dev_dbg(rtsx_dev(chip), "%s: err_code = 0x%x\n", __func__,
486 spi->err_code);
487 rtsx_stor_set_xfer_buf(&spi->err_code,
488 min_t(int, scsi_bufflen(srb), 1), srb);
489 scsi_set_resid(srb, scsi_bufflen(srb) - 1);
490
491 return STATUS_SUCCESS;
492 }
493
spi_set_parameter(struct scsi_cmnd * srb,struct rtsx_chip * chip)494 int spi_set_parameter(struct scsi_cmnd *srb, struct rtsx_chip *chip)
495 {
496 struct spi_info *spi = &chip->spi;
497
498 spi_set_err_code(chip, SPI_NO_ERR);
499
500 if (chip->asic_code)
501 spi->spi_clock = ((u16)(srb->cmnd[8]) << 8) | srb->cmnd[9];
502 else
503 spi->spi_clock = srb->cmnd[3];
504
505 spi->clk_div = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
506 spi->write_en = srb->cmnd[6];
507
508 dev_dbg(rtsx_dev(chip), "%s: ", __func__);
509 dev_dbg(rtsx_dev(chip), "spi_clock = %d, ", spi->spi_clock);
510 dev_dbg(rtsx_dev(chip), "clk_div = %d, ", spi->clk_div);
511 dev_dbg(rtsx_dev(chip), "write_en = %d\n", spi->write_en);
512
513 return STATUS_SUCCESS;
514 }
515
spi_read_flash_id(struct scsi_cmnd * srb,struct rtsx_chip * chip)516 int spi_read_flash_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
517 {
518 int retval;
519 u16 len;
520 u8 *buf;
521
522 spi_set_err_code(chip, SPI_NO_ERR);
523
524 len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
525 if (len > 512) {
526 spi_set_err_code(chip, SPI_INVALID_COMMAND);
527 return STATUS_FAIL;
528 }
529
530 retval = spi_set_init_para(chip);
531 if (retval != STATUS_SUCCESS) {
532 spi_set_err_code(chip, SPI_HW_ERR);
533 return STATUS_FAIL;
534 }
535
536 rtsx_init_cmd(chip);
537
538 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
539 PINGPONG_BUFFER);
540
541 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, srb->cmnd[3]);
542 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF, srb->cmnd[4]);
543 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, srb->cmnd[5]);
544 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, srb->cmnd[6]);
545 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
546 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
547 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, srb->cmnd[7]);
548 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, srb->cmnd[8]);
549
550 if (len == 0) {
551 if (srb->cmnd[9]) {
552 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0,
553 0xFF, SPI_TRANSFER0_START | SPI_CA_MODE0);
554 } else {
555 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0,
556 0xFF, SPI_TRANSFER0_START | SPI_C_MODE0);
557 }
558 } else {
559 if (srb->cmnd[9]) {
560 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
561 SPI_TRANSFER0_START | SPI_CADI_MODE0);
562 } else {
563 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
564 SPI_TRANSFER0_START | SPI_CDI_MODE0);
565 }
566 }
567
568 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
569 SPI_TRANSFER0_END);
570
571 retval = rtsx_send_cmd(chip, 0, 100);
572 if (retval < 0) {
573 rtsx_clear_spi_error(chip);
574 spi_set_err_code(chip, SPI_HW_ERR);
575 return STATUS_FAIL;
576 }
577
578 if (len) {
579 buf = kmalloc(len, GFP_KERNEL);
580 if (!buf) {
581 return STATUS_ERROR;
582 }
583
584 retval = rtsx_read_ppbuf(chip, buf, len);
585 if (retval != STATUS_SUCCESS) {
586 spi_set_err_code(chip, SPI_READ_ERR);
587 kfree(buf);
588 return STATUS_FAIL;
589 }
590
591 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
592 scsi_set_resid(srb, 0);
593
594 kfree(buf);
595 }
596
597 return STATUS_SUCCESS;
598 }
599
spi_read_flash(struct scsi_cmnd * srb,struct rtsx_chip * chip)600 int spi_read_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
601 {
602 int retval;
603 unsigned int index = 0, offset = 0;
604 u8 ins, slow_read;
605 u32 addr;
606 u16 len;
607 u8 *buf;
608
609 spi_set_err_code(chip, SPI_NO_ERR);
610
611 ins = srb->cmnd[3];
612 addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
613 << 8) | srb->cmnd[6];
614 len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
615 slow_read = srb->cmnd[9];
616
617 retval = spi_set_init_para(chip);
618 if (retval != STATUS_SUCCESS) {
619 spi_set_err_code(chip, SPI_HW_ERR);
620 return STATUS_FAIL;
621 }
622
623 buf = kmalloc(SF_PAGE_LEN, GFP_KERNEL);
624 if (!buf) {
625 return STATUS_ERROR;
626 }
627
628 while (len) {
629 u16 pagelen = SF_PAGE_LEN - (u8)addr;
630
631 if (pagelen > len)
632 pagelen = len;
633
634 rtsx_init_cmd(chip);
635
636 trans_dma_enable(DMA_FROM_DEVICE, chip, 256, DMA_256);
637
638 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
639
640 if (slow_read) {
641 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF,
642 (u8)addr);
643 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
644 (u8)(addr >> 8));
645 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
646 (u8)(addr >> 16));
647 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
648 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
649 } else {
650 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
651 (u8)addr);
652 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
653 (u8)(addr >> 8));
654 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR3, 0xFF,
655 (u8)(addr >> 16));
656 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
657 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_32);
658 }
659
660 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF,
661 (u8)(pagelen >> 8));
662 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF,
663 (u8)pagelen);
664
665 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
666 SPI_TRANSFER0_START | SPI_CADI_MODE0);
667 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0,
668 SPI_TRANSFER0_END, SPI_TRANSFER0_END);
669
670 rtsx_send_cmd_no_wait(chip);
671
672 retval = rtsx_transfer_data(chip, 0, buf, pagelen, 0,
673 DMA_FROM_DEVICE, 10000);
674 if (retval < 0) {
675 kfree(buf);
676 rtsx_clear_spi_error(chip);
677 spi_set_err_code(chip, SPI_HW_ERR);
678 return STATUS_FAIL;
679 }
680
681 rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index, &offset,
682 TO_XFER_BUF);
683
684 addr += pagelen;
685 len -= pagelen;
686 }
687
688 scsi_set_resid(srb, 0);
689 kfree(buf);
690
691 return STATUS_SUCCESS;
692 }
693
spi_write_flash(struct scsi_cmnd * srb,struct rtsx_chip * chip)694 int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
695 {
696 int retval;
697 u8 ins, program_mode;
698 u32 addr;
699 u16 len;
700 u8 *buf;
701 unsigned int index = 0, offset = 0;
702
703 spi_set_err_code(chip, SPI_NO_ERR);
704
705 ins = srb->cmnd[3];
706 addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
707 << 8) | srb->cmnd[6];
708 len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
709 program_mode = srb->cmnd[9];
710
711 retval = spi_set_init_para(chip);
712 if (retval != STATUS_SUCCESS) {
713 spi_set_err_code(chip, SPI_HW_ERR);
714 return STATUS_FAIL;
715 }
716
717 if (program_mode == BYTE_PROGRAM) {
718 buf = kmalloc(4, GFP_KERNEL);
719 if (!buf) {
720 return STATUS_ERROR;
721 }
722
723 while (len) {
724 retval = sf_enable_write(chip, SPI_WREN);
725 if (retval != STATUS_SUCCESS) {
726 kfree(buf);
727 return STATUS_FAIL;
728 }
729
730 rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
731 FROM_XFER_BUF);
732
733 rtsx_init_cmd(chip);
734
735 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
736 0x01, PINGPONG_BUFFER);
737 rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF,
738 buf[0]);
739 sf_program(chip, ins, 1, addr, 1);
740
741 retval = rtsx_send_cmd(chip, 0, 100);
742 if (retval < 0) {
743 kfree(buf);
744 rtsx_clear_spi_error(chip);
745 spi_set_err_code(chip, SPI_HW_ERR);
746 return STATUS_FAIL;
747 }
748
749 retval = sf_polling_status(chip, 100);
750 if (retval != STATUS_SUCCESS) {
751 kfree(buf);
752 return STATUS_FAIL;
753 }
754
755 addr++;
756 len--;
757 }
758
759 kfree(buf);
760
761 } else if (program_mode == AAI_PROGRAM) {
762 int first_byte = 1;
763
764 retval = sf_enable_write(chip, SPI_WREN);
765 if (retval != STATUS_SUCCESS) {
766 return STATUS_FAIL;
767 }
768
769 buf = kmalloc(4, GFP_KERNEL);
770 if (!buf) {
771 return STATUS_ERROR;
772 }
773
774 while (len) {
775 rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
776 FROM_XFER_BUF);
777
778 rtsx_init_cmd(chip);
779
780 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
781 0x01, PINGPONG_BUFFER);
782 rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF,
783 buf[0]);
784 if (first_byte) {
785 sf_program(chip, ins, 1, addr, 1);
786 first_byte = 0;
787 } else {
788 sf_program(chip, ins, 0, 0, 1);
789 }
790
791 retval = rtsx_send_cmd(chip, 0, 100);
792 if (retval < 0) {
793 kfree(buf);
794 rtsx_clear_spi_error(chip);
795 spi_set_err_code(chip, SPI_HW_ERR);
796 return STATUS_FAIL;
797 }
798
799 retval = sf_polling_status(chip, 100);
800 if (retval != STATUS_SUCCESS) {
801 kfree(buf);
802 return STATUS_FAIL;
803 }
804
805 len--;
806 }
807
808 kfree(buf);
809
810 retval = sf_disable_write(chip, SPI_WRDI);
811 if (retval != STATUS_SUCCESS) {
812 return STATUS_FAIL;
813 }
814
815 retval = sf_polling_status(chip, 100);
816 if (retval != STATUS_SUCCESS) {
817 return STATUS_FAIL;
818 }
819 } else if (program_mode == PAGE_PROGRAM) {
820 buf = kmalloc(SF_PAGE_LEN, GFP_KERNEL);
821 if (!buf) {
822 return STATUS_NOMEM;
823 }
824
825 while (len) {
826 u16 pagelen = SF_PAGE_LEN - (u8)addr;
827
828 if (pagelen > len)
829 pagelen = len;
830
831 retval = sf_enable_write(chip, SPI_WREN);
832 if (retval != STATUS_SUCCESS) {
833 kfree(buf);
834 return STATUS_FAIL;
835 }
836
837 rtsx_init_cmd(chip);
838
839 trans_dma_enable(DMA_TO_DEVICE, chip, 256, DMA_256);
840 sf_program(chip, ins, 1, addr, pagelen);
841
842 rtsx_send_cmd_no_wait(chip);
843
844 rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index,
845 &offset, FROM_XFER_BUF);
846
847 retval = rtsx_transfer_data(chip, 0, buf, pagelen, 0,
848 DMA_TO_DEVICE, 100);
849 if (retval < 0) {
850 kfree(buf);
851 rtsx_clear_spi_error(chip);
852 spi_set_err_code(chip, SPI_HW_ERR);
853 return STATUS_FAIL;
854 }
855
856 retval = sf_polling_status(chip, 100);
857 if (retval != STATUS_SUCCESS) {
858 kfree(buf);
859 return STATUS_FAIL;
860 }
861
862 addr += pagelen;
863 len -= pagelen;
864 }
865
866 kfree(buf);
867 } else {
868 spi_set_err_code(chip, SPI_INVALID_COMMAND);
869 return STATUS_FAIL;
870 }
871
872 return STATUS_SUCCESS;
873 }
874
spi_erase_flash(struct scsi_cmnd * srb,struct rtsx_chip * chip)875 int spi_erase_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
876 {
877 int retval;
878 u8 ins, erase_mode;
879 u32 addr;
880
881 spi_set_err_code(chip, SPI_NO_ERR);
882
883 ins = srb->cmnd[3];
884 addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
885 << 8) | srb->cmnd[6];
886 erase_mode = srb->cmnd[9];
887
888 retval = spi_set_init_para(chip);
889 if (retval != STATUS_SUCCESS) {
890 spi_set_err_code(chip, SPI_HW_ERR);
891 return STATUS_FAIL;
892 }
893
894 if (erase_mode == PAGE_ERASE) {
895 retval = sf_enable_write(chip, SPI_WREN);
896 if (retval != STATUS_SUCCESS) {
897 return STATUS_FAIL;
898 }
899
900 retval = sf_erase(chip, ins, 1, addr);
901 if (retval != STATUS_SUCCESS) {
902 return STATUS_FAIL;
903 }
904 } else if (erase_mode == CHIP_ERASE) {
905 retval = sf_enable_write(chip, SPI_WREN);
906 if (retval != STATUS_SUCCESS) {
907 return STATUS_FAIL;
908 }
909
910 retval = sf_erase(chip, ins, 0, 0);
911 if (retval != STATUS_SUCCESS) {
912 return STATUS_FAIL;
913 }
914 } else {
915 spi_set_err_code(chip, SPI_INVALID_COMMAND);
916 return STATUS_FAIL;
917 }
918
919 return STATUS_SUCCESS;
920 }
921
spi_write_flash_status(struct scsi_cmnd * srb,struct rtsx_chip * chip)922 int spi_write_flash_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
923 {
924 int retval;
925 u8 ins, status, ewsr;
926
927 ins = srb->cmnd[3];
928 status = srb->cmnd[4];
929 ewsr = srb->cmnd[5];
930
931 retval = spi_set_init_para(chip);
932 if (retval != STATUS_SUCCESS) {
933 spi_set_err_code(chip, SPI_HW_ERR);
934 return STATUS_FAIL;
935 }
936
937 retval = sf_enable_write(chip, ewsr);
938 if (retval != STATUS_SUCCESS) {
939 return STATUS_FAIL;
940 }
941
942 rtsx_init_cmd(chip);
943
944 rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
945 PINGPONG_BUFFER);
946
947 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
948 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
949 SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
950 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, 0);
951 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, 1);
952 rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF, status);
953 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
954 SPI_TRANSFER0_START | SPI_CDO_MODE0);
955 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
956 SPI_TRANSFER0_END);
957
958 retval = rtsx_send_cmd(chip, 0, 100);
959 if (retval != STATUS_SUCCESS) {
960 rtsx_clear_spi_error(chip);
961 spi_set_err_code(chip, SPI_HW_ERR);
962 return STATUS_FAIL;
963 }
964
965 return STATUS_SUCCESS;
966 }
967