This source file includes following definitions.
- nand_flash_manufacturer
- nand_find_id
- nand_init_ecc
- nand_compute_ecc
- nand_compare_ecc
- nand_store_ecc
- sddr09_send_command
- sddr09_send_scsi_command
- sddr09_test_unit_ready
- sddr09_request_sense
- sddr09_readX
- sddr09_read20
- sddr09_read21
- sddr09_read22
- sddr09_read23
- sddr09_erase
- sddr09_writeX
- sddr09_write_inplace
- sddr09_read_sg_test_only
- sddr09_read_status
- sddr09_read_data
- sddr09_find_unused_pba
- sddr09_write_lba
- sddr09_write_data
- sddr09_read_control
- sddr09_read_deviceID
- sddr09_get_wp
- sddr09_reset
- sddr09_get_cardinfo
- sddr09_read_map
- sddr09_card_info_destructor
- sddr09_common_init
- usb_stor_sddr09_dpcm_init
- dpcm_transport
- sddr09_transport
- usb_stor_sddr09_init
- sddr09_probe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <linux/errno.h>
32 #include <linux/module.h>
33 #include <linux/slab.h>
34
35 #include <scsi/scsi.h>
36 #include <scsi/scsi_cmnd.h>
37 #include <scsi/scsi_device.h>
38
39 #include "usb.h"
40 #include "transport.h"
41 #include "protocol.h"
42 #include "debug.h"
43 #include "scsiglue.h"
44
45 #define DRV_NAME "ums-sddr09"
46
47 MODULE_DESCRIPTION("Driver for SanDisk SDDR-09 SmartMedia reader");
48 MODULE_AUTHOR("Andries Brouwer <aeb@cwi.nl>, Robert Baruch <autophile@starband.net>");
49 MODULE_LICENSE("GPL");
50 MODULE_IMPORT_NS(USB_STORAGE);
51
52 static int usb_stor_sddr09_dpcm_init(struct us_data *us);
53 static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us);
54 static int usb_stor_sddr09_init(struct us_data *us);
55
56
57
58
59
60 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
61 vendorName, productName, useProtocol, useTransport, \
62 initFunction, flags) \
63 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
64 .driver_info = (flags) }
65
66 static struct usb_device_id sddr09_usb_ids[] = {
67 # include "unusual_sddr09.h"
68 { }
69 };
70 MODULE_DEVICE_TABLE(usb, sddr09_usb_ids);
71
72 #undef UNUSUAL_DEV
73
74
75
76
77 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
78 vendor_name, product_name, use_protocol, use_transport, \
79 init_function, Flags) \
80 { \
81 .vendorName = vendor_name, \
82 .productName = product_name, \
83 .useProtocol = use_protocol, \
84 .useTransport = use_transport, \
85 .initFunction = init_function, \
86 }
87
88 static struct us_unusual_dev sddr09_unusual_dev_list[] = {
89 # include "unusual_sddr09.h"
90 { }
91 };
92
93 #undef UNUSUAL_DEV
94
95
96 #define short_pack(lsb,msb) ( ((u16)(lsb)) | ( ((u16)(msb))<<8 ) )
97 #define LSB_of(s) ((s)&0xFF)
98 #define MSB_of(s) ((s)>>8)
99
100
101
102
103
104
105
106
107 struct nand_flash_dev {
108 int model_id;
109 int chipshift;
110 char pageshift;
111 char blockshift;
112 char zoneshift;
113
114 char pageadrlen;
115 };
116
117
118
119
120 #define NAND_MFR_AMD 0x01
121 #define NAND_MFR_NATSEMI 0x8f
122 #define NAND_MFR_TOSHIBA 0x98
123 #define NAND_MFR_SAMSUNG 0xec
124
125 static inline char *nand_flash_manufacturer(int manuf_id) {
126 switch(manuf_id) {
127 case NAND_MFR_AMD:
128 return "AMD";
129 case NAND_MFR_NATSEMI:
130 return "NATSEMI";
131 case NAND_MFR_TOSHIBA:
132 return "Toshiba";
133 case NAND_MFR_SAMSUNG:
134 return "Samsung";
135 default:
136 return "unknown";
137 }
138 }
139
140
141
142
143
144
145
146
147 static struct nand_flash_dev nand_flash_ids[] = {
148
149 { 0x6e, 20, 8, 4, 8, 2},
150 { 0xe8, 20, 8, 4, 8, 2},
151 { 0xec, 20, 8, 4, 8, 2},
152 { 0x64, 21, 8, 4, 9, 2},
153 { 0xea, 21, 8, 4, 9, 2},
154 { 0x6b, 22, 9, 4, 9, 2},
155 { 0xe3, 22, 9, 4, 9, 2},
156 { 0xe5, 22, 9, 4, 9, 2},
157 { 0xe6, 23, 9, 4, 10, 2},
158 { 0x73, 24, 9, 5, 10, 2},
159 { 0x75, 25, 9, 5, 10, 2},
160 { 0x76, 26, 9, 5, 10, 3},
161 { 0x79, 27, 9, 5, 10, 3},
162
163
164 { 0x5d, 21, 9, 4, 8, 2},
165 { 0xd5, 22, 9, 4, 9, 2},
166 { 0xd6, 23, 9, 4, 10, 2},
167 { 0x57, 24, 9, 4, 11, 2},
168 { 0x58, 25, 9, 4, 12, 2},
169 { 0,}
170 };
171
172 static struct nand_flash_dev *
173 nand_find_id(unsigned char id) {
174 int i;
175
176 for (i = 0; i < ARRAY_SIZE(nand_flash_ids); i++)
177 if (nand_flash_ids[i].model_id == id)
178 return &(nand_flash_ids[i]);
179 return NULL;
180 }
181
182
183
184
185 static unsigned char parity[256];
186 static unsigned char ecc2[256];
187
188 static void nand_init_ecc(void) {
189 int i, j, a;
190
191 parity[0] = 0;
192 for (i = 1; i < 256; i++)
193 parity[i] = (parity[i&(i-1)] ^ 1);
194
195 for (i = 0; i < 256; i++) {
196 a = 0;
197 for (j = 0; j < 8; j++) {
198 if (i & (1<<j)) {
199 if ((j & 1) == 0)
200 a ^= 0x04;
201 if ((j & 2) == 0)
202 a ^= 0x10;
203 if ((j & 4) == 0)
204 a ^= 0x40;
205 }
206 }
207 ecc2[i] = ~(a ^ (a<<1) ^ (parity[i] ? 0xa8 : 0));
208 }
209 }
210
211
212 static void nand_compute_ecc(unsigned char *data, unsigned char *ecc) {
213 int i, j, a;
214 unsigned char par = 0, bit, bits[8] = {0};
215
216
217 for (i = 0; i < 256; i++) {
218 par ^= data[i];
219 bit = parity[data[i]];
220 for (j = 0; j < 8; j++)
221 if ((i & (1<<j)) == 0)
222 bits[j] ^= bit;
223 }
224
225
226 a = (bits[3] << 6) + (bits[2] << 4) + (bits[1] << 2) + bits[0];
227 ecc[0] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
228
229 a = (bits[7] << 6) + (bits[6] << 4) + (bits[5] << 2) + bits[4];
230 ecc[1] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
231
232 ecc[2] = ecc2[par];
233 }
234
235 static int nand_compare_ecc(unsigned char *data, unsigned char *ecc) {
236 return (data[0] == ecc[0] && data[1] == ecc[1] && data[2] == ecc[2]);
237 }
238
239 static void nand_store_ecc(unsigned char *data, unsigned char *ecc) {
240 memcpy(data, ecc, 3);
241 }
242
243
244
245
246
247 struct sddr09_card_info {
248 unsigned long capacity;
249 int pagesize;
250 int pageshift;
251 int blocksize;
252 int blockshift;
253 int blockmask;
254 int *lba_to_pba;
255 int *pba_to_lba;
256 int lbact;
257 int flags;
258 #define SDDR09_WP 1
259 };
260
261
262
263
264
265
266
267 #define CONTROL_SHIFT 6
268
269
270
271
272
273
274 #define LUN 1
275 #define LUNBITS (LUN << 5)
276
277
278
279
280 #define UNDEF 0xffffffff
281 #define SPARE 0xfffffffe
282 #define UNUSABLE 0xfffffffd
283
284 static const int erase_bad_lba_entries = 0;
285
286
287
288 static int
289 sddr09_send_command(struct us_data *us,
290 unsigned char request,
291 unsigned char direction,
292 unsigned char *xfer_data,
293 unsigned int xfer_len) {
294 unsigned int pipe;
295 unsigned char requesttype = (0x41 | direction);
296 int rc;
297
298
299
300 if (direction == USB_DIR_IN)
301 pipe = us->recv_ctrl_pipe;
302 else
303 pipe = us->send_ctrl_pipe;
304
305 rc = usb_stor_ctrl_transfer(us, pipe, request, requesttype,
306 0, 0, xfer_data, xfer_len);
307 switch (rc) {
308 case USB_STOR_XFER_GOOD: return 0;
309 case USB_STOR_XFER_STALLED: return -EPIPE;
310 default: return -EIO;
311 }
312 }
313
314 static int
315 sddr09_send_scsi_command(struct us_data *us,
316 unsigned char *command,
317 unsigned int command_len) {
318 return sddr09_send_command(us, 0, USB_DIR_OUT, command, command_len);
319 }
320
321 #if 0
322
323
324
325
326 static int
327 sddr09_test_unit_ready(struct us_data *us) {
328 unsigned char *command = us->iobuf;
329 int result;
330
331 memset(command, 0, 6);
332 command[1] = LUNBITS;
333
334 result = sddr09_send_scsi_command(us, command, 6);
335
336 usb_stor_dbg(us, "sddr09_test_unit_ready returns %d\n", result);
337
338 return result;
339 }
340 #endif
341
342
343
344
345
346
347 static int
348 sddr09_request_sense(struct us_data *us, unsigned char *sensebuf, int buflen) {
349 unsigned char *command = us->iobuf;
350 int result;
351
352 memset(command, 0, 12);
353 command[0] = 0x03;
354 command[1] = LUNBITS;
355 command[4] = buflen;
356
357 result = sddr09_send_scsi_command(us, command, 12);
358 if (result)
359 return result;
360
361 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
362 sensebuf, buflen, NULL);
363 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
364 }
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388 static int
389 sddr09_readX(struct us_data *us, int x, unsigned long fromaddress,
390 int nr_of_pages, int bulklen, unsigned char *buf,
391 int use_sg) {
392
393 unsigned char *command = us->iobuf;
394 int result;
395
396 command[0] = 0xE8;
397 command[1] = LUNBITS | x;
398 command[2] = MSB_of(fromaddress>>16);
399 command[3] = LSB_of(fromaddress>>16);
400 command[4] = MSB_of(fromaddress & 0xFFFF);
401 command[5] = LSB_of(fromaddress & 0xFFFF);
402 command[6] = 0;
403 command[7] = 0;
404 command[8] = 0;
405 command[9] = 0;
406 command[10] = MSB_of(nr_of_pages);
407 command[11] = LSB_of(nr_of_pages);
408
409 result = sddr09_send_scsi_command(us, command, 12);
410
411 if (result) {
412 usb_stor_dbg(us, "Result for send_control in sddr09_read2%d %d\n",
413 x, result);
414 return result;
415 }
416
417 result = usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe,
418 buf, bulklen, use_sg, NULL);
419
420 if (result != USB_STOR_XFER_GOOD) {
421 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_read2%d %d\n",
422 x, result);
423 return -EIO;
424 }
425 return 0;
426 }
427
428
429
430
431
432
433
434
435
436
437 static int
438 sddr09_read20(struct us_data *us, unsigned long fromaddress,
439 int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
440 int bulklen = nr_of_pages << pageshift;
441
442
443 return sddr09_readX(us, 0, fromaddress, nr_of_pages, bulklen,
444 buf, use_sg);
445 }
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460 static int
461 sddr09_read21(struct us_data *us, unsigned long fromaddress,
462 int count, int controlshift, unsigned char *buf, int use_sg) {
463
464 int bulklen = (count << controlshift);
465 return sddr09_readX(us, 1, fromaddress, count, bulklen,
466 buf, use_sg);
467 }
468
469
470
471
472
473
474
475
476
477
478 static int
479 sddr09_read22(struct us_data *us, unsigned long fromaddress,
480 int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
481
482 int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << CONTROL_SHIFT);
483 usb_stor_dbg(us, "reading %d pages, %d bytes\n", nr_of_pages, bulklen);
484 return sddr09_readX(us, 2, fromaddress, nr_of_pages, bulklen,
485 buf, use_sg);
486 }
487
488 #if 0
489
490
491
492
493
494
495
496
497
498
499
500
501
502 static int
503 sddr09_read23(struct us_data *us, unsigned long fromaddress,
504 int count, int controlshift, unsigned char *buf, int use_sg) {
505
506 int bulklen = (count << controlshift);
507 return sddr09_readX(us, 3, fromaddress, count, bulklen,
508 buf, use_sg);
509 }
510 #endif
511
512
513
514
515
516
517
518
519
520
521 static int
522 sddr09_erase(struct us_data *us, unsigned long Eaddress) {
523 unsigned char *command = us->iobuf;
524 int result;
525
526 usb_stor_dbg(us, "erase address %lu\n", Eaddress);
527
528 memset(command, 0, 12);
529 command[0] = 0xEA;
530 command[1] = LUNBITS;
531 command[6] = MSB_of(Eaddress>>16);
532 command[7] = LSB_of(Eaddress>>16);
533 command[8] = MSB_of(Eaddress & 0xFFFF);
534 command[9] = LSB_of(Eaddress & 0xFFFF);
535
536 result = sddr09_send_scsi_command(us, command, 12);
537
538 if (result)
539 usb_stor_dbg(us, "Result for send_control in sddr09_erase %d\n",
540 result);
541
542 return result;
543 }
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570 static int
571 sddr09_writeX(struct us_data *us,
572 unsigned long Waddress, unsigned long Eaddress,
573 int nr_of_pages, int bulklen, unsigned char *buf, int use_sg) {
574
575 unsigned char *command = us->iobuf;
576 int result;
577
578 command[0] = 0xE9;
579 command[1] = LUNBITS;
580
581 command[2] = MSB_of(Waddress>>16);
582 command[3] = LSB_of(Waddress>>16);
583 command[4] = MSB_of(Waddress & 0xFFFF);
584 command[5] = LSB_of(Waddress & 0xFFFF);
585
586 command[6] = MSB_of(Eaddress>>16);
587 command[7] = LSB_of(Eaddress>>16);
588 command[8] = MSB_of(Eaddress & 0xFFFF);
589 command[9] = LSB_of(Eaddress & 0xFFFF);
590
591 command[10] = MSB_of(nr_of_pages);
592 command[11] = LSB_of(nr_of_pages);
593
594 result = sddr09_send_scsi_command(us, command, 12);
595
596 if (result) {
597 usb_stor_dbg(us, "Result for send_control in sddr09_writeX %d\n",
598 result);
599 return result;
600 }
601
602 result = usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe,
603 buf, bulklen, use_sg, NULL);
604
605 if (result != USB_STOR_XFER_GOOD) {
606 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_writeX %d\n",
607 result);
608 return -EIO;
609 }
610 return 0;
611 }
612
613
614 static int
615 sddr09_write_inplace(struct us_data *us, unsigned long address,
616 int nr_of_pages, int pageshift, unsigned char *buf,
617 int use_sg) {
618 int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << CONTROL_SHIFT);
619 return sddr09_writeX(us, address, address, nr_of_pages, bulklen,
620 buf, use_sg);
621 }
622
623 #if 0
624
625
626
627
628
629
630
631
632
633
634
635 static int
636 sddr09_read_sg_test_only(struct us_data *us) {
637 unsigned char *command = us->iobuf;
638 int result, bulklen, nsg, ct;
639 unsigned char *buf;
640 unsigned long address;
641
642 nsg = bulklen = 0;
643 command[0] = 0xE7;
644 command[1] = LUNBITS;
645 command[2] = 0;
646 address = 040000; ct = 1;
647 nsg++;
648 bulklen += (ct << 9);
649 command[4*nsg+2] = ct;
650 command[4*nsg+1] = ((address >> 9) & 0xFF);
651 command[4*nsg+0] = ((address >> 17) & 0xFF);
652 command[4*nsg-1] = ((address >> 25) & 0xFF);
653
654 address = 0340000; ct = 1;
655 nsg++;
656 bulklen += (ct << 9);
657 command[4*nsg+2] = ct;
658 command[4*nsg+1] = ((address >> 9) & 0xFF);
659 command[4*nsg+0] = ((address >> 17) & 0xFF);
660 command[4*nsg-1] = ((address >> 25) & 0xFF);
661
662 address = 01000000; ct = 2;
663 nsg++;
664 bulklen += (ct << 9);
665 command[4*nsg+2] = ct;
666 command[4*nsg+1] = ((address >> 9) & 0xFF);
667 command[4*nsg+0] = ((address >> 17) & 0xFF);
668 command[4*nsg-1] = ((address >> 25) & 0xFF);
669
670 command[2] = nsg;
671
672 result = sddr09_send_scsi_command(us, command, 4*nsg+3);
673
674 if (result) {
675 usb_stor_dbg(us, "Result for send_control in sddr09_read_sg %d\n",
676 result);
677 return result;
678 }
679
680 buf = kmalloc(bulklen, GFP_NOIO);
681 if (!buf)
682 return -ENOMEM;
683
684 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
685 buf, bulklen, NULL);
686 kfree(buf);
687 if (result != USB_STOR_XFER_GOOD) {
688 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_read_sg %d\n",
689 result);
690 return -EIO;
691 }
692
693 return 0;
694 }
695 #endif
696
697
698
699
700
701
702
703
704
705
706
707
708 static int
709 sddr09_read_status(struct us_data *us, unsigned char *status) {
710
711 unsigned char *command = us->iobuf;
712 unsigned char *data = us->iobuf;
713 int result;
714
715 usb_stor_dbg(us, "Reading status...\n");
716
717 memset(command, 0, 12);
718 command[0] = 0xEC;
719 command[1] = LUNBITS;
720
721 result = sddr09_send_scsi_command(us, command, 12);
722 if (result)
723 return result;
724
725 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
726 data, 64, NULL);
727 *status = data[0];
728 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
729 }
730
731 static int
732 sddr09_read_data(struct us_data *us,
733 unsigned long address,
734 unsigned int sectors) {
735
736 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
737 unsigned char *buffer;
738 unsigned int lba, maxlba, pba;
739 unsigned int page, pages;
740 unsigned int len, offset;
741 struct scatterlist *sg;
742 int result;
743
744
745 lba = address >> info->blockshift;
746 page = (address & info->blockmask);
747 maxlba = info->capacity >> (info->pageshift + info->blockshift);
748 if (lba >= maxlba)
749 return -EIO;
750
751
752
753
754
755 len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
756 buffer = kmalloc(len, GFP_NOIO);
757 if (!buffer)
758 return -ENOMEM;
759
760
761
762
763 result = 0;
764 offset = 0;
765 sg = NULL;
766
767 while (sectors > 0) {
768
769
770 pages = min(sectors, info->blocksize - page);
771 len = pages << info->pageshift;
772
773
774 if (lba >= maxlba) {
775 usb_stor_dbg(us, "Error: Requested lba %u exceeds maximum %u\n",
776 lba, maxlba);
777 result = -EIO;
778 break;
779 }
780
781
782 pba = info->lba_to_pba[lba];
783
784 if (pba == UNDEF) {
785
786 usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
787 pages, lba, page);
788
789
790
791
792
793
794
795
796 memset(buffer, 0, len);
797
798 } else {
799 usb_stor_dbg(us, "Read %d pages, from PBA %d (LBA %d) page %d\n",
800 pages, pba, lba, page);
801
802 address = ((pba << info->blockshift) + page) <<
803 info->pageshift;
804
805 result = sddr09_read20(us, address>>1,
806 pages, info->pageshift, buffer, 0);
807 if (result)
808 break;
809 }
810
811
812 usb_stor_access_xfer_buf(buffer, len, us->srb,
813 &sg, &offset, TO_XFER_BUF);
814
815 page = 0;
816 lba++;
817 sectors -= pages;
818 }
819
820 kfree(buffer);
821 return result;
822 }
823
824 static unsigned int
825 sddr09_find_unused_pba(struct sddr09_card_info *info, unsigned int lba) {
826 static unsigned int lastpba = 1;
827 int zonestart, end, i;
828
829 zonestart = (lba/1000) << 10;
830 end = info->capacity >> (info->blockshift + info->pageshift);
831 end -= zonestart;
832 if (end > 1024)
833 end = 1024;
834
835 for (i = lastpba+1; i < end; i++) {
836 if (info->pba_to_lba[zonestart+i] == UNDEF) {
837 lastpba = i;
838 return zonestart+i;
839 }
840 }
841 for (i = 0; i <= lastpba; i++) {
842 if (info->pba_to_lba[zonestart+i] == UNDEF) {
843 lastpba = i;
844 return zonestart+i;
845 }
846 }
847 return 0;
848 }
849
850 static int
851 sddr09_write_lba(struct us_data *us, unsigned int lba,
852 unsigned int page, unsigned int pages,
853 unsigned char *ptr, unsigned char *blockbuffer) {
854
855 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
856 unsigned long address;
857 unsigned int pba, lbap;
858 unsigned int pagelen;
859 unsigned char *bptr, *cptr, *xptr;
860 unsigned char ecc[3];
861 int i, result;
862
863 lbap = ((lba % 1000) << 1) | 0x1000;
864 if (parity[MSB_of(lbap) ^ LSB_of(lbap)])
865 lbap ^= 1;
866 pba = info->lba_to_pba[lba];
867
868 if (pba == UNDEF) {
869 pba = sddr09_find_unused_pba(info, lba);
870 if (!pba) {
871 printk(KERN_WARNING
872 "sddr09_write_lba: Out of unused blocks\n");
873 return -ENOSPC;
874 }
875 info->pba_to_lba[pba] = lba;
876 info->lba_to_pba[lba] = pba;
877 }
878
879 if (pba == 1) {
880
881
882
883
884 printk(KERN_WARNING "sddr09: avoid writing to pba 1\n");
885 return 0;
886 }
887
888 pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
889
890
891 address = (pba << (info->pageshift + info->blockshift));
892 result = sddr09_read22(us, address>>1, info->blocksize,
893 info->pageshift, blockbuffer, 0);
894 if (result)
895 return result;
896
897
898 for (i = 0; i < info->blocksize; i++) {
899 bptr = blockbuffer + i*pagelen;
900 cptr = bptr + info->pagesize;
901 nand_compute_ecc(bptr, ecc);
902 if (!nand_compare_ecc(cptr+13, ecc)) {
903 usb_stor_dbg(us, "Warning: bad ecc in page %d- of pba %d\n",
904 i, pba);
905 nand_store_ecc(cptr+13, ecc);
906 }
907 nand_compute_ecc(bptr+(info->pagesize / 2), ecc);
908 if (!nand_compare_ecc(cptr+8, ecc)) {
909 usb_stor_dbg(us, "Warning: bad ecc in page %d+ of pba %d\n",
910 i, pba);
911 nand_store_ecc(cptr+8, ecc);
912 }
913 cptr[6] = cptr[11] = MSB_of(lbap);
914 cptr[7] = cptr[12] = LSB_of(lbap);
915 }
916
917
918 xptr = ptr;
919 for (i = page; i < page+pages; i++) {
920 bptr = blockbuffer + i*pagelen;
921 cptr = bptr + info->pagesize;
922 memcpy(bptr, xptr, info->pagesize);
923 xptr += info->pagesize;
924 nand_compute_ecc(bptr, ecc);
925 nand_store_ecc(cptr+13, ecc);
926 nand_compute_ecc(bptr+(info->pagesize / 2), ecc);
927 nand_store_ecc(cptr+8, ecc);
928 }
929
930 usb_stor_dbg(us, "Rewrite PBA %d (LBA %d)\n", pba, lba);
931
932 result = sddr09_write_inplace(us, address>>1, info->blocksize,
933 info->pageshift, blockbuffer, 0);
934
935 usb_stor_dbg(us, "sddr09_write_inplace returns %d\n", result);
936
937 #if 0
938 {
939 unsigned char status = 0;
940 int result2 = sddr09_read_status(us, &status);
941 if (result2)
942 usb_stor_dbg(us, "cannot read status\n");
943 else if (status != 0xc0)
944 usb_stor_dbg(us, "status after write: 0x%x\n", status);
945 }
946 #endif
947
948 #if 0
949 {
950 int result2 = sddr09_test_unit_ready(us);
951 }
952 #endif
953
954 return result;
955 }
956
957 static int
958 sddr09_write_data(struct us_data *us,
959 unsigned long address,
960 unsigned int sectors) {
961
962 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
963 unsigned int lba, maxlba, page, pages;
964 unsigned int pagelen, blocklen;
965 unsigned char *blockbuffer;
966 unsigned char *buffer;
967 unsigned int len, offset;
968 struct scatterlist *sg;
969 int result;
970
971
972 lba = address >> info->blockshift;
973 page = (address & info->blockmask);
974 maxlba = info->capacity >> (info->pageshift + info->blockshift);
975 if (lba >= maxlba)
976 return -EIO;
977
978
979
980
981
982
983
984
985
986
987
988 pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
989 blocklen = (pagelen << info->blockshift);
990 blockbuffer = kmalloc(blocklen, GFP_NOIO);
991 if (!blockbuffer)
992 return -ENOMEM;
993
994
995
996
997
998
999
1000 len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
1001 buffer = kmalloc(len, GFP_NOIO);
1002 if (!buffer) {
1003 kfree(blockbuffer);
1004 return -ENOMEM;
1005 }
1006
1007 result = 0;
1008 offset = 0;
1009 sg = NULL;
1010
1011 while (sectors > 0) {
1012
1013
1014
1015 pages = min(sectors, info->blocksize - page);
1016 len = (pages << info->pageshift);
1017
1018
1019 if (lba >= maxlba) {
1020 usb_stor_dbg(us, "Error: Requested lba %u exceeds maximum %u\n",
1021 lba, maxlba);
1022 result = -EIO;
1023 break;
1024 }
1025
1026
1027 usb_stor_access_xfer_buf(buffer, len, us->srb,
1028 &sg, &offset, FROM_XFER_BUF);
1029
1030 result = sddr09_write_lba(us, lba, page, pages,
1031 buffer, blockbuffer);
1032 if (result)
1033 break;
1034
1035 page = 0;
1036 lba++;
1037 sectors -= pages;
1038 }
1039
1040 kfree(buffer);
1041 kfree(blockbuffer);
1042
1043 return result;
1044 }
1045
1046 static int
1047 sddr09_read_control(struct us_data *us,
1048 unsigned long address,
1049 unsigned int blocks,
1050 unsigned char *content,
1051 int use_sg) {
1052
1053 usb_stor_dbg(us, "Read control address %lu, blocks %d\n",
1054 address, blocks);
1055
1056 return sddr09_read21(us, address, blocks,
1057 CONTROL_SHIFT, content, use_sg);
1058 }
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070 static int
1071 sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
1072 unsigned char *command = us->iobuf;
1073 unsigned char *content = us->iobuf;
1074 int result, i;
1075
1076 memset(command, 0, 12);
1077 command[0] = 0xED;
1078 command[1] = LUNBITS;
1079
1080 result = sddr09_send_scsi_command(us, command, 12);
1081 if (result)
1082 return result;
1083
1084 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
1085 content, 64, NULL);
1086
1087 for (i = 0; i < 4; i++)
1088 deviceID[i] = content[i];
1089
1090 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
1091 }
1092
1093 static int
1094 sddr09_get_wp(struct us_data *us, struct sddr09_card_info *info) {
1095 int result;
1096 unsigned char status;
1097 const char *wp_fmt;
1098
1099 result = sddr09_read_status(us, &status);
1100 if (result) {
1101 usb_stor_dbg(us, "read_status fails\n");
1102 return result;
1103 }
1104 if ((status & 0x80) == 0) {
1105 info->flags |= SDDR09_WP;
1106 wp_fmt = " WP";
1107 } else {
1108 wp_fmt = "";
1109 }
1110 usb_stor_dbg(us, "status 0x%02X%s%s%s%s\n", status, wp_fmt,
1111 status & 0x40 ? " Ready" : "",
1112 status & LUNBITS ? " Suspended" : "",
1113 status & 0x01 ? " Error" : "");
1114
1115 return 0;
1116 }
1117
1118 #if 0
1119
1120
1121
1122
1123 static int
1124 sddr09_reset(struct us_data *us) {
1125
1126 unsigned char *command = us->iobuf;
1127
1128 memset(command, 0, 12);
1129 command[0] = 0xEB;
1130 command[1] = LUNBITS;
1131
1132 return sddr09_send_scsi_command(us, command, 12);
1133 }
1134 #endif
1135
1136 static struct nand_flash_dev *
1137 sddr09_get_cardinfo(struct us_data *us, unsigned char flags) {
1138 struct nand_flash_dev *cardinfo;
1139 unsigned char deviceID[4];
1140 char blurbtxt[256];
1141 int result;
1142
1143 usb_stor_dbg(us, "Reading capacity...\n");
1144
1145 result = sddr09_read_deviceID(us, deviceID);
1146
1147 if (result) {
1148 usb_stor_dbg(us, "Result of read_deviceID is %d\n", result);
1149 printk(KERN_WARNING "sddr09: could not read card info\n");
1150 return NULL;
1151 }
1152
1153 sprintf(blurbtxt, "sddr09: Found Flash card, ID = %4ph", deviceID);
1154
1155
1156 sprintf(blurbtxt + strlen(blurbtxt),
1157 ": Manuf. %s",
1158 nand_flash_manufacturer(deviceID[0]));
1159
1160
1161 cardinfo = nand_find_id(deviceID[1]);
1162 if (cardinfo) {
1163
1164
1165
1166
1167
1168 sprintf(blurbtxt + strlen(blurbtxt),
1169 ", %d MB", 1<<(cardinfo->chipshift - 20));
1170 } else {
1171 sprintf(blurbtxt + strlen(blurbtxt),
1172 ", type unrecognized");
1173 }
1174
1175
1176 if (deviceID[2] == 0xa5) {
1177 sprintf(blurbtxt + strlen(blurbtxt),
1178 ", 128-bit ID");
1179 }
1180
1181
1182 if (deviceID[3] == 0xc0) {
1183 sprintf(blurbtxt + strlen(blurbtxt),
1184 ", extra cmd");
1185 }
1186
1187 if (flags & SDDR09_WP)
1188 sprintf(blurbtxt + strlen(blurbtxt),
1189 ", WP");
1190
1191 printk(KERN_WARNING "%s\n", blurbtxt);
1192
1193 return cardinfo;
1194 }
1195
1196 static int
1197 sddr09_read_map(struct us_data *us) {
1198
1199 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
1200 int numblocks, alloc_len, alloc_blocks;
1201 int i, j, result;
1202 unsigned char *buffer, *buffer_end, *ptr;
1203 unsigned int lba, lbact;
1204
1205 if (!info->capacity)
1206 return -1;
1207
1208
1209
1210
1211
1212
1213 numblocks = info->capacity >> (info->blockshift + info->pageshift);
1214
1215
1216
1217
1218
1219
1220 #define SDDR09_READ_MAP_BUFSZ 65536
1221
1222 alloc_blocks = min(numblocks, SDDR09_READ_MAP_BUFSZ >> CONTROL_SHIFT);
1223 alloc_len = (alloc_blocks << CONTROL_SHIFT);
1224 buffer = kmalloc(alloc_len, GFP_NOIO);
1225 if (!buffer) {
1226 result = -1;
1227 goto done;
1228 }
1229 buffer_end = buffer + alloc_len;
1230
1231 #undef SDDR09_READ_MAP_BUFSZ
1232
1233 kfree(info->lba_to_pba);
1234 kfree(info->pba_to_lba);
1235 info->lba_to_pba = kmalloc_array(numblocks, sizeof(int), GFP_NOIO);
1236 info->pba_to_lba = kmalloc_array(numblocks, sizeof(int), GFP_NOIO);
1237
1238 if (info->lba_to_pba == NULL || info->pba_to_lba == NULL) {
1239 printk(KERN_WARNING "sddr09_read_map: out of memory\n");
1240 result = -1;
1241 goto done;
1242 }
1243
1244 for (i = 0; i < numblocks; i++)
1245 info->lba_to_pba[i] = info->pba_to_lba[i] = UNDEF;
1246
1247
1248
1249
1250
1251 ptr = buffer_end;
1252 for (i = 0; i < numblocks; i++) {
1253 ptr += (1 << CONTROL_SHIFT);
1254 if (ptr >= buffer_end) {
1255 unsigned long address;
1256
1257 address = i << (info->pageshift + info->blockshift);
1258 result = sddr09_read_control(
1259 us, address>>1,
1260 min(alloc_blocks, numblocks - i),
1261 buffer, 0);
1262 if (result) {
1263 result = -1;
1264 goto done;
1265 }
1266 ptr = buffer;
1267 }
1268
1269 if (i == 0 || i == 1) {
1270 info->pba_to_lba[i] = UNUSABLE;
1271 continue;
1272 }
1273
1274
1275 for (j = 0; j < 16; j++)
1276 if (ptr[j] != 0)
1277 goto nonz;
1278 info->pba_to_lba[i] = UNUSABLE;
1279 printk(KERN_WARNING "sddr09: PBA %d has no logical mapping\n",
1280 i);
1281 continue;
1282
1283 nonz:
1284
1285 for (j = 0; j < 16; j++)
1286 if (ptr[j] != 0xff)
1287 goto nonff;
1288 continue;
1289
1290 nonff:
1291
1292 if (j < 6) {
1293 printk(KERN_WARNING
1294 "sddr09: PBA %d has no logical mapping: "
1295 "reserved area = %02X%02X%02X%02X "
1296 "data status %02X block status %02X\n",
1297 i, ptr[0], ptr[1], ptr[2], ptr[3],
1298 ptr[4], ptr[5]);
1299 info->pba_to_lba[i] = UNUSABLE;
1300 continue;
1301 }
1302
1303 if ((ptr[6] >> 4) != 0x01) {
1304 printk(KERN_WARNING
1305 "sddr09: PBA %d has invalid address field "
1306 "%02X%02X/%02X%02X\n",
1307 i, ptr[6], ptr[7], ptr[11], ptr[12]);
1308 info->pba_to_lba[i] = UNUSABLE;
1309 continue;
1310 }
1311
1312
1313 if (parity[ptr[6] ^ ptr[7]]) {
1314 printk(KERN_WARNING
1315 "sddr09: Bad parity in LBA for block %d"
1316 " (%02X %02X)\n", i, ptr[6], ptr[7]);
1317 info->pba_to_lba[i] = UNUSABLE;
1318 continue;
1319 }
1320
1321 lba = short_pack(ptr[7], ptr[6]);
1322 lba = (lba & 0x07FF) >> 1;
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333 if (lba >= 1000) {
1334 printk(KERN_WARNING
1335 "sddr09: Bad low LBA %d for block %d\n",
1336 lba, i);
1337 goto possibly_erase;
1338 }
1339
1340 lba += 1000*(i/0x400);
1341
1342 if (info->lba_to_pba[lba] != UNDEF) {
1343 printk(KERN_WARNING
1344 "sddr09: LBA %d seen for PBA %d and %d\n",
1345 lba, info->lba_to_pba[lba], i);
1346 goto possibly_erase;
1347 }
1348
1349 info->pba_to_lba[i] = lba;
1350 info->lba_to_pba[lba] = i;
1351 continue;
1352
1353 possibly_erase:
1354 if (erase_bad_lba_entries) {
1355 unsigned long address;
1356
1357 address = (i << (info->pageshift + info->blockshift));
1358 sddr09_erase(us, address>>1);
1359 info->pba_to_lba[i] = UNDEF;
1360 } else
1361 info->pba_to_lba[i] = UNUSABLE;
1362 }
1363
1364
1365
1366
1367
1368
1369
1370 lbact = 0;
1371 for (i = 0; i < numblocks; i += 1024) {
1372 int ct = 0;
1373
1374 for (j = 0; j < 1024 && i+j < numblocks; j++) {
1375 if (info->pba_to_lba[i+j] != UNUSABLE) {
1376 if (ct >= 1000)
1377 info->pba_to_lba[i+j] = SPARE;
1378 else
1379 ct++;
1380 }
1381 }
1382 lbact += ct;
1383 }
1384 info->lbact = lbact;
1385 usb_stor_dbg(us, "Found %d LBA's\n", lbact);
1386 result = 0;
1387
1388 done:
1389 if (result != 0) {
1390 kfree(info->lba_to_pba);
1391 kfree(info->pba_to_lba);
1392 info->lba_to_pba = NULL;
1393 info->pba_to_lba = NULL;
1394 }
1395 kfree(buffer);
1396 return result;
1397 }
1398
1399 static void
1400 sddr09_card_info_destructor(void *extra) {
1401 struct sddr09_card_info *info = (struct sddr09_card_info *)extra;
1402
1403 if (!info)
1404 return;
1405
1406 kfree(info->lba_to_pba);
1407 kfree(info->pba_to_lba);
1408 }
1409
1410 static int
1411 sddr09_common_init(struct us_data *us) {
1412 int result;
1413
1414
1415 if (us->pusb_dev->actconfig->desc.bConfigurationValue != 1) {
1416 usb_stor_dbg(us, "active config #%d != 1 ??\n",
1417 us->pusb_dev->actconfig->desc.bConfigurationValue);
1418 return -EINVAL;
1419 }
1420
1421 result = usb_reset_configuration(us->pusb_dev);
1422 usb_stor_dbg(us, "Result of usb_reset_configuration is %d\n", result);
1423 if (result == -EPIPE) {
1424 usb_stor_dbg(us, "-- stall on control interface\n");
1425 } else if (result != 0) {
1426
1427 usb_stor_dbg(us, "-- Unknown error. Rejecting device\n");
1428 return -EINVAL;
1429 }
1430
1431 us->extra = kzalloc(sizeof(struct sddr09_card_info), GFP_NOIO);
1432 if (!us->extra)
1433 return -ENOMEM;
1434 us->extra_destructor = sddr09_card_info_destructor;
1435
1436 nand_init_ecc();
1437 return 0;
1438 }
1439
1440
1441
1442
1443
1444
1445
1446 static int
1447 usb_stor_sddr09_dpcm_init(struct us_data *us) {
1448 int result;
1449 unsigned char *data = us->iobuf;
1450
1451 result = sddr09_common_init(us);
1452 if (result)
1453 return result;
1454
1455 result = sddr09_send_command(us, 0x01, USB_DIR_IN, data, 2);
1456 if (result) {
1457 usb_stor_dbg(us, "send_command fails\n");
1458 return result;
1459 }
1460
1461 usb_stor_dbg(us, "%02X %02X\n", data[0], data[1]);
1462
1463
1464 result = sddr09_send_command(us, 0x08, USB_DIR_IN, data, 2);
1465 if (result) {
1466 usb_stor_dbg(us, "2nd send_command fails\n");
1467 return result;
1468 }
1469
1470 usb_stor_dbg(us, "%02X %02X\n", data[0], data[1]);
1471
1472
1473 result = sddr09_request_sense(us, data, 18);
1474 if (result == 0 && data[2] != 0) {
1475 int j;
1476 for (j=0; j<18; j++)
1477 printk(" %02X", data[j]);
1478 printk("\n");
1479
1480
1481
1482
1483
1484
1485
1486 }
1487
1488
1489
1490 return 0;
1491 }
1492
1493
1494
1495
1496 static int dpcm_transport(struct scsi_cmnd *srb, struct us_data *us)
1497 {
1498 int ret;
1499
1500 usb_stor_dbg(us, "LUN=%d\n", (u8)srb->device->lun);
1501
1502 switch (srb->device->lun) {
1503 case 0:
1504
1505
1506
1507
1508 ret = usb_stor_CB_transport(srb, us);
1509 break;
1510
1511 case 1:
1512
1513
1514
1515
1516
1517
1518
1519
1520 srb->device->lun = 0;
1521 ret = sddr09_transport(srb, us);
1522 srb->device->lun = 1;
1523 break;
1524
1525 default:
1526 usb_stor_dbg(us, "Invalid LUN %d\n", (u8)srb->device->lun);
1527 ret = USB_STOR_TRANSPORT_ERROR;
1528 break;
1529 }
1530 return ret;
1531 }
1532
1533
1534
1535
1536
1537 static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
1538 {
1539 static unsigned char sensekey = 0, sensecode = 0;
1540 static unsigned char havefakesense = 0;
1541 int result, i;
1542 unsigned char *ptr = us->iobuf;
1543 unsigned long capacity;
1544 unsigned int page, pages;
1545
1546 struct sddr09_card_info *info;
1547
1548 static unsigned char inquiry_response[8] = {
1549 0x00, 0x80, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00
1550 };
1551
1552
1553 static unsigned char mode_page_01[19] = {
1554 0x00, 0x0F, 0x00, 0x0, 0x0, 0x0, 0x00,
1555 0x01, 0x0A,
1556 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1557 };
1558
1559 info = (struct sddr09_card_info *)us->extra;
1560
1561 if (srb->cmnd[0] == REQUEST_SENSE && havefakesense) {
1562
1563 memset(ptr, 0, 18);
1564 ptr[0] = 0x70;
1565 ptr[2] = sensekey;
1566 ptr[7] = 11;
1567 ptr[12] = sensecode;
1568 usb_stor_set_xfer_buf(ptr, 18, srb);
1569 sensekey = sensecode = havefakesense = 0;
1570 return USB_STOR_TRANSPORT_GOOD;
1571 }
1572
1573 havefakesense = 1;
1574
1575
1576
1577
1578
1579
1580 if (srb->cmnd[0] == INQUIRY) {
1581 memcpy(ptr, inquiry_response, 8);
1582 fill_inquiry_response(us, ptr, 36);
1583 return USB_STOR_TRANSPORT_GOOD;
1584 }
1585
1586 if (srb->cmnd[0] == READ_CAPACITY) {
1587 struct nand_flash_dev *cardinfo;
1588
1589 sddr09_get_wp(us, info);
1590
1591 cardinfo = sddr09_get_cardinfo(us, info->flags);
1592 if (!cardinfo) {
1593
1594 init_error:
1595 sensekey = 0x02;
1596 sensecode = 0x3a;
1597 return USB_STOR_TRANSPORT_FAILED;
1598 }
1599
1600 info->capacity = (1 << cardinfo->chipshift);
1601 info->pageshift = cardinfo->pageshift;
1602 info->pagesize = (1 << info->pageshift);
1603 info->blockshift = cardinfo->blockshift;
1604 info->blocksize = (1 << info->blockshift);
1605 info->blockmask = info->blocksize - 1;
1606
1607
1608 if (sddr09_read_map(us)) {
1609
1610 goto init_error;
1611 }
1612
1613
1614
1615 capacity = (info->lbact << info->blockshift) - 1;
1616
1617 ((__be32 *) ptr)[0] = cpu_to_be32(capacity);
1618
1619
1620
1621 ((__be32 *) ptr)[1] = cpu_to_be32(info->pagesize);
1622 usb_stor_set_xfer_buf(ptr, 8, srb);
1623
1624 return USB_STOR_TRANSPORT_GOOD;
1625 }
1626
1627 if (srb->cmnd[0] == MODE_SENSE_10) {
1628 int modepage = (srb->cmnd[2] & 0x3F);
1629
1630
1631
1632
1633
1634
1635 if (modepage == 0x01 || modepage == 0x3F) {
1636 usb_stor_dbg(us, "Dummy up request for mode page 0x%x\n",
1637 modepage);
1638
1639 memcpy(ptr, mode_page_01, sizeof(mode_page_01));
1640 ((__be16*)ptr)[0] = cpu_to_be16(sizeof(mode_page_01) - 2);
1641 ptr[3] = (info->flags & SDDR09_WP) ? 0x80 : 0;
1642 usb_stor_set_xfer_buf(ptr, sizeof(mode_page_01), srb);
1643 return USB_STOR_TRANSPORT_GOOD;
1644 }
1645
1646 sensekey = 0x05;
1647 sensecode = 0x24;
1648 return USB_STOR_TRANSPORT_FAILED;
1649 }
1650
1651 if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL)
1652 return USB_STOR_TRANSPORT_GOOD;
1653
1654 havefakesense = 0;
1655
1656 if (srb->cmnd[0] == READ_10) {
1657
1658 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1659 page <<= 16;
1660 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1661 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1662
1663 usb_stor_dbg(us, "READ_10: read page %d pagect %d\n",
1664 page, pages);
1665
1666 result = sddr09_read_data(us, page, pages);
1667 return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
1668 USB_STOR_TRANSPORT_ERROR);
1669 }
1670
1671 if (srb->cmnd[0] == WRITE_10) {
1672
1673 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1674 page <<= 16;
1675 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1676 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1677
1678 usb_stor_dbg(us, "WRITE_10: write page %d pagect %d\n",
1679 page, pages);
1680
1681 result = sddr09_write_data(us, page, pages);
1682 return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
1683 USB_STOR_TRANSPORT_ERROR);
1684 }
1685
1686
1687
1688
1689
1690 if (srb->cmnd[0] != TEST_UNIT_READY &&
1691 srb->cmnd[0] != REQUEST_SENSE) {
1692 sensekey = 0x05;
1693 sensecode = 0x20;
1694 havefakesense = 1;
1695 return USB_STOR_TRANSPORT_FAILED;
1696 }
1697
1698 for (; srb->cmd_len<12; srb->cmd_len++)
1699 srb->cmnd[srb->cmd_len] = 0;
1700
1701 srb->cmnd[1] = LUNBITS;
1702
1703 ptr[0] = 0;
1704 for (i=0; i<12; i++)
1705 sprintf(ptr+strlen(ptr), "%02X ", srb->cmnd[i]);
1706
1707 usb_stor_dbg(us, "Send control for command %s\n", ptr);
1708
1709 result = sddr09_send_scsi_command(us, srb->cmnd, 12);
1710 if (result) {
1711 usb_stor_dbg(us, "sddr09_send_scsi_command returns %d\n",
1712 result);
1713 return USB_STOR_TRANSPORT_ERROR;
1714 }
1715
1716 if (scsi_bufflen(srb) == 0)
1717 return USB_STOR_TRANSPORT_GOOD;
1718
1719 if (srb->sc_data_direction == DMA_TO_DEVICE ||
1720 srb->sc_data_direction == DMA_FROM_DEVICE) {
1721 unsigned int pipe = (srb->sc_data_direction == DMA_TO_DEVICE)
1722 ? us->send_bulk_pipe : us->recv_bulk_pipe;
1723
1724 usb_stor_dbg(us, "%s %d bytes\n",
1725 (srb->sc_data_direction == DMA_TO_DEVICE) ?
1726 "sending" : "receiving",
1727 scsi_bufflen(srb));
1728
1729 result = usb_stor_bulk_srb(us, pipe, srb);
1730
1731 return (result == USB_STOR_XFER_GOOD ?
1732 USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
1733 }
1734
1735 return USB_STOR_TRANSPORT_GOOD;
1736 }
1737
1738
1739
1740
1741 static int
1742 usb_stor_sddr09_init(struct us_data *us) {
1743 return sddr09_common_init(us);
1744 }
1745
1746 static struct scsi_host_template sddr09_host_template;
1747
1748 static int sddr09_probe(struct usb_interface *intf,
1749 const struct usb_device_id *id)
1750 {
1751 struct us_data *us;
1752 int result;
1753
1754 result = usb_stor_probe1(&us, intf, id,
1755 (id - sddr09_usb_ids) + sddr09_unusual_dev_list,
1756 &sddr09_host_template);
1757 if (result)
1758 return result;
1759
1760 if (us->protocol == USB_PR_DPCM_USB) {
1761 us->transport_name = "Control/Bulk-EUSB/SDDR09";
1762 us->transport = dpcm_transport;
1763 us->transport_reset = usb_stor_CB_reset;
1764 us->max_lun = 1;
1765 } else {
1766 us->transport_name = "EUSB/SDDR09";
1767 us->transport = sddr09_transport;
1768 us->transport_reset = usb_stor_CB_reset;
1769 us->max_lun = 0;
1770 }
1771
1772 result = usb_stor_probe2(us);
1773 return result;
1774 }
1775
1776 static struct usb_driver sddr09_driver = {
1777 .name = DRV_NAME,
1778 .probe = sddr09_probe,
1779 .disconnect = usb_stor_disconnect,
1780 .suspend = usb_stor_suspend,
1781 .resume = usb_stor_resume,
1782 .reset_resume = usb_stor_reset_resume,
1783 .pre_reset = usb_stor_pre_reset,
1784 .post_reset = usb_stor_post_reset,
1785 .id_table = sddr09_usb_ids,
1786 .soft_unbind = 1,
1787 .no_dynamic_id = 1,
1788 };
1789
1790 module_usb_stor_driver(sddr09_driver, sddr09_host_template, DRV_NAME);