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
32
33
34
35
36
37
38
39
40
41
42
43
44#include <linux/errno.h>
45#include <linux/module.h>
46#include <linux/slab.h>
47#include <linux/cdrom.h>
48
49#include <scsi/scsi.h>
50#include <scsi/scsi_cmnd.h>
51
52#include "usb.h"
53#include "transport.h"
54#include "protocol.h"
55#include "debug.h"
56
57MODULE_DESCRIPTION("Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable");
58MODULE_AUTHOR("Daniel Drake <dsd@gentoo.org>, Robert Baruch <autophile@starband.net>");
59MODULE_LICENSE("GPL");
60
61
62#define USBAT_DEV_HP8200 0x01
63#define USBAT_DEV_FLASH 0x02
64
65#define USBAT_EPP_PORT 0x10
66#define USBAT_EPP_REGISTER 0x30
67#define USBAT_ATA 0x40
68#define USBAT_ISA 0x50
69
70
71#define USBAT_CMD_READ_REG 0x00
72#define USBAT_CMD_WRITE_REG 0x01
73#define USBAT_CMD_READ_BLOCK 0x02
74#define USBAT_CMD_WRITE_BLOCK 0x03
75#define USBAT_CMD_COND_READ_BLOCK 0x04
76#define USBAT_CMD_COND_WRITE_BLOCK 0x05
77#define USBAT_CMD_WRITE_REGS 0x07
78
79
80#define USBAT_CMD_EXEC_CMD 0x80
81#define USBAT_CMD_SET_FEAT 0x81
82#define USBAT_CMD_UIO 0x82
83
84
85#define USBAT_UIO_READ 1
86#define USBAT_UIO_WRITE 0
87
88
89#define USBAT_QUAL_FCQ 0x20
90#define USBAT_QUAL_ALQ 0x10
91
92
93#define USBAT_FLASH_MEDIA_NONE 0
94#define USBAT_FLASH_MEDIA_CF 1
95
96
97#define USBAT_FLASH_MEDIA_SAME 0
98#define USBAT_FLASH_MEDIA_CHANGED 1
99
100
101#define USBAT_ATA_DATA 0x10
102#define USBAT_ATA_FEATURES 0x11
103#define USBAT_ATA_ERROR 0x11
104#define USBAT_ATA_SECCNT 0x12
105#define USBAT_ATA_SECNUM 0x13
106#define USBAT_ATA_LBA_ME 0x14
107#define USBAT_ATA_LBA_HI 0x15
108#define USBAT_ATA_DEVICE 0x16
109#define USBAT_ATA_STATUS 0x17
110#define USBAT_ATA_CMD 0x17
111#define USBAT_ATA_ALTSTATUS 0x0E
112
113
114#define USBAT_UIO_EPAD 0x80
115#define USBAT_UIO_CDT 0x40
116
117#define USBAT_UIO_1 0x20
118#define USBAT_UIO_0 0x10
119#define USBAT_UIO_EPP_ATA 0x08
120#define USBAT_UIO_UI1 0x04
121#define USBAT_UIO_UI0 0x02
122#define USBAT_UIO_INTR_ACK 0x01
123
124
125#define USBAT_UIO_DRVRST 0x80
126#define USBAT_UIO_ACKD 0x40
127#define USBAT_UIO_OE1 0x20
128
129#define USBAT_UIO_OE0 0x10
130#define USBAT_UIO_ADPRST 0x01
131
132
133#define USBAT_FEAT_ETEN 0x80
134#define USBAT_FEAT_U1 0x08
135#define USBAT_FEAT_U0 0x04
136#define USBAT_FEAT_ET1 0x02
137#define USBAT_FEAT_ET2 0x01
138
139struct usbat_info {
140 int devicetype;
141
142
143 unsigned long sectors;
144 unsigned long ssize;
145
146 unsigned char sense_key;
147 unsigned long sense_asc;
148 unsigned long sense_ascq;
149};
150
151#define short_pack(LSB,MSB) ( ((u16)(LSB)) | ( ((u16)(MSB))<<8 ) )
152#define LSB_of(s) ((s)&0xFF)
153#define MSB_of(s) ((s)>>8)
154
155static int transferred = 0;
156
157static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us);
158static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us);
159
160static int init_usbat_cd(struct us_data *us);
161static int init_usbat_flash(struct us_data *us);
162
163
164
165
166
167#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
168 vendorName, productName, useProtocol, useTransport, \
169 initFunction, flags) \
170{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
171 .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
172
173struct usb_device_id usbat_usb_ids[] = {
174# include "unusual_usbat.h"
175 { }
176};
177MODULE_DEVICE_TABLE(usb, usbat_usb_ids);
178
179#undef UNUSUAL_DEV
180
181
182
183
184#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
185 vendor_name, product_name, use_protocol, use_transport, \
186 init_function, Flags) \
187{ \
188 .vendorName = vendor_name, \
189 .productName = product_name, \
190 .useProtocol = use_protocol, \
191 .useTransport = use_transport, \
192 .initFunction = init_function, \
193}
194
195static struct us_unusual_dev usbat_unusual_dev_list[] = {
196# include "unusual_usbat.h"
197 { }
198};
199
200#undef UNUSUAL_DEV
201
202
203
204
205
206static void usbat_pack_ata_sector_cmd(unsigned char *buf,
207 unsigned char thistime,
208 u32 sector, unsigned char cmd)
209{
210 buf[0] = 0;
211 buf[1] = thistime;
212 buf[2] = sector & 0xFF;
213 buf[3] = (sector >> 8) & 0xFF;
214 buf[4] = (sector >> 16) & 0xFF;
215 buf[5] = 0xE0 | ((sector >> 24) & 0x0F);
216 buf[6] = cmd;
217}
218
219
220
221
222static int usbat_get_device_type(struct us_data *us)
223{
224 return ((struct usbat_info*)us->extra)->devicetype;
225}
226
227
228
229
230static int usbat_read(struct us_data *us,
231 unsigned char access,
232 unsigned char reg,
233 unsigned char *content)
234{
235 return usb_stor_ctrl_transfer(us,
236 us->recv_ctrl_pipe,
237 access | USBAT_CMD_READ_REG,
238 0xC0,
239 (u16)reg,
240 0,
241 content,
242 1);
243}
244
245
246
247
248static int usbat_write(struct us_data *us,
249 unsigned char access,
250 unsigned char reg,
251 unsigned char content)
252{
253 return usb_stor_ctrl_transfer(us,
254 us->send_ctrl_pipe,
255 access | USBAT_CMD_WRITE_REG,
256 0x40,
257 short_pack(reg, content),
258 0,
259 NULL,
260 0);
261}
262
263
264
265
266static int usbat_bulk_read(struct us_data *us,
267 void* buf,
268 unsigned int len,
269 int use_sg)
270{
271 if (len == 0)
272 return USB_STOR_XFER_GOOD;
273
274 US_DEBUGP("usbat_bulk_read: len = %d\n", len);
275 return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, buf, len, use_sg, NULL);
276}
277
278
279
280
281static int usbat_bulk_write(struct us_data *us,
282 void* buf,
283 unsigned int len,
284 int use_sg)
285{
286 if (len == 0)
287 return USB_STOR_XFER_GOOD;
288
289 US_DEBUGP("usbat_bulk_write: len = %d\n", len);
290 return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, buf, len, use_sg, NULL);
291}
292
293
294
295
296
297
298static int usbat_execute_command(struct us_data *us,
299 unsigned char *commands,
300 unsigned int len)
301{
302 return usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
303 USBAT_CMD_EXEC_CMD, 0x40, 0, 0,
304 commands, len);
305}
306
307
308
309
310static int usbat_get_status(struct us_data *us, unsigned char *status)
311{
312 int rc;
313 rc = usbat_read(us, USBAT_ATA, USBAT_ATA_STATUS, status);
314
315 US_DEBUGP("usbat_get_status: 0x%02X\n", (unsigned short) (*status));
316 return rc;
317}
318
319
320
321
322static int usbat_check_status(struct us_data *us)
323{
324 unsigned char *reply = us->iobuf;
325 int rc;
326
327 rc = usbat_get_status(us, reply);
328 if (rc != USB_STOR_XFER_GOOD)
329 return USB_STOR_TRANSPORT_FAILED;
330
331
332 if (*reply & 0x01 && *reply != 0x51)
333 return USB_STOR_TRANSPORT_FAILED;
334
335
336 if (*reply & 0x20)
337 return USB_STOR_TRANSPORT_FAILED;
338
339 return USB_STOR_TRANSPORT_GOOD;
340}
341
342
343
344
345
346static int usbat_set_shuttle_features(struct us_data *us,
347 unsigned char external_trigger,
348 unsigned char epp_control,
349 unsigned char mask_byte,
350 unsigned char test_pattern,
351 unsigned char subcountH,
352 unsigned char subcountL)
353{
354 unsigned char *command = us->iobuf;
355
356 command[0] = 0x40;
357 command[1] = USBAT_CMD_SET_FEAT;
358
359
360
361
362
363 command[2] = epp_control;
364
365
366
367
368
369
370
371 command[3] = external_trigger;
372
373
374
375
376
377
378 command[4] = test_pattern;
379
380
381
382
383
384 command[5] = mask_byte;
385
386
387
388
389
390
391
392 command[6] = subcountL;
393 command[7] = subcountH;
394
395 return usbat_execute_command(us, command, 8);
396}
397
398
399
400
401
402static int usbat_wait_not_busy(struct us_data *us, int minutes)
403{
404 int i;
405 int result;
406 unsigned char *status = us->iobuf;
407
408
409
410
411
412
413
414 for (i=0; i<1200+minutes*60; i++) {
415
416 result = usbat_get_status(us, status);
417
418 if (result!=USB_STOR_XFER_GOOD)
419 return USB_STOR_TRANSPORT_ERROR;
420 if (*status & 0x01) {
421 result = usbat_read(us, USBAT_ATA, 0x10, status);
422 return USB_STOR_TRANSPORT_FAILED;
423 }
424 if (*status & 0x20)
425 return USB_STOR_TRANSPORT_FAILED;
426
427 if ((*status & 0x80)==0x00) {
428 US_DEBUGP("Waited not busy for %d steps\n", i);
429 return USB_STOR_TRANSPORT_GOOD;
430 }
431
432 if (i<500)
433 msleep(10);
434 else if (i<700)
435 msleep(50);
436 else if (i<1200)
437 msleep(100);
438 else
439 msleep(1000);
440 }
441
442 US_DEBUGP("Waited not busy for %d minutes, timing out.\n",
443 minutes);
444 return USB_STOR_TRANSPORT_FAILED;
445}
446
447
448
449
450static int usbat_read_block(struct us_data *us,
451 void* buf,
452 unsigned short len,
453 int use_sg)
454{
455 int result;
456 unsigned char *command = us->iobuf;
457
458 if (!len)
459 return USB_STOR_TRANSPORT_GOOD;
460
461 command[0] = 0xC0;
462 command[1] = USBAT_ATA | USBAT_CMD_READ_BLOCK;
463 command[2] = USBAT_ATA_DATA;
464 command[3] = 0;
465 command[4] = 0;
466 command[5] = 0;
467 command[6] = LSB_of(len);
468 command[7] = MSB_of(len);
469
470 result = usbat_execute_command(us, command, 8);
471 if (result != USB_STOR_XFER_GOOD)
472 return USB_STOR_TRANSPORT_ERROR;
473
474 result = usbat_bulk_read(us, buf, len, use_sg);
475 return (result == USB_STOR_XFER_GOOD ?
476 USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
477}
478
479
480
481
482static int usbat_write_block(struct us_data *us,
483 unsigned char access,
484 void* buf,
485 unsigned short len,
486 int minutes,
487 int use_sg)
488{
489 int result;
490 unsigned char *command = us->iobuf;
491
492 if (!len)
493 return USB_STOR_TRANSPORT_GOOD;
494
495 command[0] = 0x40;
496 command[1] = access | USBAT_CMD_WRITE_BLOCK;
497 command[2] = USBAT_ATA_DATA;
498 command[3] = 0;
499 command[4] = 0;
500 command[5] = 0;
501 command[6] = LSB_of(len);
502 command[7] = MSB_of(len);
503
504 result = usbat_execute_command(us, command, 8);
505
506 if (result != USB_STOR_XFER_GOOD)
507 return USB_STOR_TRANSPORT_ERROR;
508
509 result = usbat_bulk_write(us, buf, len, use_sg);
510 if (result != USB_STOR_XFER_GOOD)
511 return USB_STOR_TRANSPORT_ERROR;
512
513 return usbat_wait_not_busy(us, minutes);
514}
515
516
517
518
519static int usbat_hp8200e_rw_block_test(struct us_data *us,
520 unsigned char access,
521 unsigned char *registers,
522 unsigned char *data_out,
523 unsigned short num_registers,
524 unsigned char data_reg,
525 unsigned char status_reg,
526 unsigned char timeout,
527 unsigned char qualifier,
528 int direction,
529 void *buf,
530 unsigned short len,
531 int use_sg,
532 int minutes)
533{
534 int result;
535 unsigned int pipe = (direction == DMA_FROM_DEVICE) ?
536 us->recv_bulk_pipe : us->send_bulk_pipe;
537
538 unsigned char *command = us->iobuf;
539 int i, j;
540 int cmdlen;
541 unsigned char *data = us->iobuf;
542 unsigned char *status = us->iobuf;
543
544 BUG_ON(num_registers > US_IOBUF_SIZE/2);
545
546 for (i=0; i<20; i++) {
547
548
549
550
551
552
553
554
555
556
557
558
559 if (i==0) {
560 cmdlen = 16;
561
562
563
564
565
566
567 command[0] = 0x40;
568 command[1] = access | USBAT_CMD_WRITE_REGS;
569 command[2] = 0x07;
570 command[3] = 0x17;
571 command[4] = 0xFC;
572 command[5] = 0xE7;
573 command[6] = LSB_of(num_registers*2);
574 command[7] = MSB_of(num_registers*2);
575 } else
576 cmdlen = 8;
577
578
579 command[cmdlen-8] = (direction==DMA_TO_DEVICE ? 0x40 : 0xC0);
580 command[cmdlen-7] = access |
581 (direction==DMA_TO_DEVICE ?
582 USBAT_CMD_COND_WRITE_BLOCK : USBAT_CMD_COND_READ_BLOCK);
583 command[cmdlen-6] = data_reg;
584 command[cmdlen-5] = status_reg;
585 command[cmdlen-4] = timeout;
586 command[cmdlen-3] = qualifier;
587 command[cmdlen-2] = LSB_of(len);
588 command[cmdlen-1] = MSB_of(len);
589
590 result = usbat_execute_command(us, command, cmdlen);
591
592 if (result != USB_STOR_XFER_GOOD)
593 return USB_STOR_TRANSPORT_ERROR;
594
595 if (i==0) {
596
597 for (j=0; j<num_registers; j++) {
598 data[j<<1] = registers[j];
599 data[1+(j<<1)] = data_out[j];
600 }
601
602 result = usbat_bulk_write(us, data, num_registers*2, 0);
603 if (result != USB_STOR_XFER_GOOD)
604 return USB_STOR_TRANSPORT_ERROR;
605
606 }
607
608 result = usb_stor_bulk_transfer_sg(us,
609 pipe, buf, len, use_sg, NULL);
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630 if (result == USB_STOR_XFER_SHORT ||
631 result == USB_STOR_XFER_STALLED) {
632
633
634
635
636
637
638 if (direction==DMA_FROM_DEVICE && i==0) {
639 if (usb_stor_clear_halt(us,
640 us->send_bulk_pipe) < 0)
641 return USB_STOR_TRANSPORT_ERROR;
642 }
643
644
645
646
647
648 result = usbat_read(us, USBAT_ATA,
649 direction==DMA_TO_DEVICE ?
650 USBAT_ATA_STATUS : USBAT_ATA_ALTSTATUS,
651 status);
652
653 if (result!=USB_STOR_XFER_GOOD)
654 return USB_STOR_TRANSPORT_ERROR;
655 if (*status & 0x01)
656 return USB_STOR_TRANSPORT_FAILED;
657 if (*status & 0x20)
658 return USB_STOR_TRANSPORT_FAILED;
659
660 US_DEBUGP("Redoing %s\n",
661 direction==DMA_TO_DEVICE ? "write" : "read");
662
663 } else if (result != USB_STOR_XFER_GOOD)
664 return USB_STOR_TRANSPORT_ERROR;
665 else
666 return usbat_wait_not_busy(us, minutes);
667
668 }
669
670 US_DEBUGP("Bummer! %s bulk data 20 times failed.\n",
671 direction==DMA_TO_DEVICE ? "Writing" : "Reading");
672
673 return USB_STOR_TRANSPORT_FAILED;
674}
675
676
677
678
679
680
681
682
683static int usbat_multiple_write(struct us_data *us,
684 unsigned char *registers,
685 unsigned char *data_out,
686 unsigned short num_registers)
687{
688 int i, result;
689 unsigned char *data = us->iobuf;
690 unsigned char *command = us->iobuf;
691
692 BUG_ON(num_registers > US_IOBUF_SIZE/2);
693
694
695 command[0] = 0x40;
696 command[1] = USBAT_ATA | USBAT_CMD_WRITE_REGS;
697
698
699 command[2] = 0;
700 command[3] = 0;
701 command[4] = 0;
702 command[5] = 0;
703
704
705 command[6] = LSB_of(num_registers*2);
706 command[7] = MSB_of(num_registers*2);
707
708
709 result = usbat_execute_command(us, command, 8);
710 if (result != USB_STOR_XFER_GOOD)
711 return USB_STOR_TRANSPORT_ERROR;
712
713
714 for (i=0; i<num_registers; i++) {
715 data[i<<1] = registers[i];
716 data[1+(i<<1)] = data_out[i];
717 }
718
719
720 result = usbat_bulk_write(us, data, num_registers*2, 0);
721 if (result != USB_STOR_XFER_GOOD)
722 return USB_STOR_TRANSPORT_ERROR;
723
724 if (usbat_get_device_type(us) == USBAT_DEV_HP8200)
725 return usbat_wait_not_busy(us, 0);
726 else
727 return USB_STOR_TRANSPORT_GOOD;
728}
729
730
731
732
733
734
735
736
737
738
739
740
741
742static int usbat_read_blocks(struct us_data *us,
743 void* buffer,
744 int len,
745 int use_sg)
746{
747 int result;
748 unsigned char *command = us->iobuf;
749
750 command[0] = 0xC0;
751 command[1] = USBAT_ATA | USBAT_CMD_COND_READ_BLOCK;
752 command[2] = USBAT_ATA_DATA;
753 command[3] = USBAT_ATA_STATUS;
754 command[4] = 0xFD;
755 command[5] = USBAT_QUAL_FCQ;
756 command[6] = LSB_of(len);
757 command[7] = MSB_of(len);
758
759
760 result = usbat_execute_command(us, command, 8);
761 if (result != USB_STOR_XFER_GOOD)
762 return USB_STOR_TRANSPORT_FAILED;
763
764
765 result = usbat_bulk_read(us, buffer, len, use_sg);
766 if (result != USB_STOR_XFER_GOOD)
767 return USB_STOR_TRANSPORT_FAILED;
768
769 return USB_STOR_TRANSPORT_GOOD;
770}
771
772
773
774
775
776
777
778
779
780
781
782
783
784static int usbat_write_blocks(struct us_data *us,
785 void* buffer,
786 int len,
787 int use_sg)
788{
789 int result;
790 unsigned char *command = us->iobuf;
791
792 command[0] = 0x40;
793 command[1] = USBAT_ATA | USBAT_CMD_COND_WRITE_BLOCK;
794 command[2] = USBAT_ATA_DATA;
795 command[3] = USBAT_ATA_STATUS;
796 command[4] = 0xFD;
797 command[5] = USBAT_QUAL_FCQ;
798 command[6] = LSB_of(len);
799 command[7] = MSB_of(len);
800
801
802 result = usbat_execute_command(us, command, 8);
803 if (result != USB_STOR_XFER_GOOD)
804 return USB_STOR_TRANSPORT_FAILED;
805
806
807 result = usbat_bulk_write(us, buffer, len, use_sg);
808 if (result != USB_STOR_XFER_GOOD)
809 return USB_STOR_TRANSPORT_FAILED;
810
811 return USB_STOR_TRANSPORT_GOOD;
812}
813
814
815
816
817static int usbat_read_user_io(struct us_data *us, unsigned char *data_flags)
818{
819 int result;
820
821 result = usb_stor_ctrl_transfer(us,
822 us->recv_ctrl_pipe,
823 USBAT_CMD_UIO,
824 0xC0,
825 0,
826 0,
827 data_flags,
828 USBAT_UIO_READ);
829
830 US_DEBUGP("usbat_read_user_io: UIO register reads %02X\n", (unsigned short) (*data_flags));
831
832 return result;
833}
834
835
836
837
838static int usbat_write_user_io(struct us_data *us,
839 unsigned char enable_flags,
840 unsigned char data_flags)
841{
842 return usb_stor_ctrl_transfer(us,
843 us->send_ctrl_pipe,
844 USBAT_CMD_UIO,
845 0x40,
846 short_pack(enable_flags, data_flags),
847 0,
848 NULL,
849 USBAT_UIO_WRITE);
850}
851
852
853
854
855
856static int usbat_device_reset(struct us_data *us)
857{
858 int rc;
859
860
861
862
863
864 rc = usbat_write_user_io(us,
865 USBAT_UIO_DRVRST | USBAT_UIO_OE1 | USBAT_UIO_OE0,
866 USBAT_UIO_EPAD | USBAT_UIO_1);
867 if (rc != USB_STOR_XFER_GOOD)
868 return USB_STOR_TRANSPORT_ERROR;
869
870
871
872
873
874 rc = usbat_write_user_io(us,
875 USBAT_UIO_OE1 | USBAT_UIO_OE0,
876 USBAT_UIO_EPAD | USBAT_UIO_1);
877 if (rc != USB_STOR_XFER_GOOD)
878 return USB_STOR_TRANSPORT_ERROR;
879
880 return USB_STOR_TRANSPORT_GOOD;
881}
882
883
884
885
886static int usbat_device_enable_cdt(struct us_data *us)
887{
888 int rc;
889
890
891 rc = usbat_write_user_io(us,
892 USBAT_UIO_ACKD | USBAT_UIO_OE1 | USBAT_UIO_OE0,
893 USBAT_UIO_EPAD | USBAT_UIO_1);
894 if (rc != USB_STOR_XFER_GOOD)
895 return USB_STOR_TRANSPORT_ERROR;
896
897 return USB_STOR_TRANSPORT_GOOD;
898}
899
900
901
902
903static int usbat_flash_check_media_present(unsigned char *uio)
904{
905 if (*uio & USBAT_UIO_UI0) {
906 US_DEBUGP("usbat_flash_check_media_present: no media detected\n");
907 return USBAT_FLASH_MEDIA_NONE;
908 }
909
910 return USBAT_FLASH_MEDIA_CF;
911}
912
913
914
915
916static int usbat_flash_check_media_changed(unsigned char *uio)
917{
918 if (*uio & USBAT_UIO_0) {
919 US_DEBUGP("usbat_flash_check_media_changed: media change detected\n");
920 return USBAT_FLASH_MEDIA_CHANGED;
921 }
922
923 return USBAT_FLASH_MEDIA_SAME;
924}
925
926
927
928
929static int usbat_flash_check_media(struct us_data *us,
930 struct usbat_info *info)
931{
932 int rc;
933 unsigned char *uio = us->iobuf;
934
935 rc = usbat_read_user_io(us, uio);
936 if (rc != USB_STOR_XFER_GOOD)
937 return USB_STOR_TRANSPORT_ERROR;
938
939
940 rc = usbat_flash_check_media_present(uio);
941 if (rc == USBAT_FLASH_MEDIA_NONE) {
942 info->sense_key = 0x02;
943 info->sense_asc = 0x3A;
944 info->sense_ascq = 0x00;
945 return USB_STOR_TRANSPORT_FAILED;
946 }
947
948
949 rc = usbat_flash_check_media_changed(uio);
950 if (rc == USBAT_FLASH_MEDIA_CHANGED) {
951
952
953 rc = usbat_device_reset(us);
954 if (rc != USB_STOR_TRANSPORT_GOOD)
955 return rc;
956 rc = usbat_device_enable_cdt(us);
957 if (rc != USB_STOR_TRANSPORT_GOOD)
958 return rc;
959
960 msleep(50);
961
962 rc = usbat_read_user_io(us, uio);
963 if (rc != USB_STOR_XFER_GOOD)
964 return USB_STOR_TRANSPORT_ERROR;
965
966 info->sense_key = UNIT_ATTENTION;
967 info->sense_asc = 0x28;
968 info->sense_ascq = 0x00;
969 return USB_STOR_TRANSPORT_FAILED;
970 }
971
972 return USB_STOR_TRANSPORT_GOOD;
973}
974
975
976
977
978
979
980static int usbat_identify_device(struct us_data *us,
981 struct usbat_info *info)
982{
983 int rc;
984 unsigned char status;
985
986 if (!us || !info)
987 return USB_STOR_TRANSPORT_ERROR;
988
989 rc = usbat_device_reset(us);
990 if (rc != USB_STOR_TRANSPORT_GOOD)
991 return rc;
992 msleep(500);
993
994
995
996
997
998
999
1000 rc = usbat_write(us, USBAT_ATA, USBAT_ATA_CMD, 0xA1);
1001 if (rc != USB_STOR_XFER_GOOD)
1002 return USB_STOR_TRANSPORT_ERROR;
1003
1004 rc = usbat_get_status(us, &status);
1005 if (rc != USB_STOR_XFER_GOOD)
1006 return USB_STOR_TRANSPORT_ERROR;
1007
1008
1009 if (status == 0xA1 || !(status & 0x01)) {
1010
1011 US_DEBUGP("usbat_identify_device: Detected HP8200 CDRW\n");
1012 info->devicetype = USBAT_DEV_HP8200;
1013 } else {
1014
1015 US_DEBUGP("usbat_identify_device: Detected Flash reader/writer\n");
1016 info->devicetype = USBAT_DEV_FLASH;
1017 }
1018
1019 return USB_STOR_TRANSPORT_GOOD;
1020}
1021
1022
1023
1024
1025static int usbat_set_transport(struct us_data *us,
1026 struct usbat_info *info,
1027 int devicetype)
1028{
1029
1030 if (!info->devicetype)
1031 info->devicetype = devicetype;
1032
1033 if (!info->devicetype)
1034 usbat_identify_device(us, info);
1035
1036 switch (info->devicetype) {
1037 default:
1038 return USB_STOR_TRANSPORT_ERROR;
1039
1040 case USBAT_DEV_HP8200:
1041 us->transport = usbat_hp8200e_transport;
1042 break;
1043
1044 case USBAT_DEV_FLASH:
1045 us->transport = usbat_flash_transport;
1046 break;
1047 }
1048
1049 return 0;
1050}
1051
1052
1053
1054
1055static int usbat_flash_get_sector_count(struct us_data *us,
1056 struct usbat_info *info)
1057{
1058 unsigned char registers[3] = {
1059 USBAT_ATA_SECCNT,
1060 USBAT_ATA_DEVICE,
1061 USBAT_ATA_CMD,
1062 };
1063 unsigned char command[3] = { 0x01, 0xA0, 0xEC };
1064 unsigned char *reply;
1065 unsigned char status;
1066 int rc;
1067
1068 if (!us || !info)
1069 return USB_STOR_TRANSPORT_ERROR;
1070
1071 reply = kmalloc(512, GFP_NOIO);
1072 if (!reply)
1073 return USB_STOR_TRANSPORT_ERROR;
1074
1075
1076 rc = usbat_multiple_write(us, registers, command, 3);
1077 if (rc != USB_STOR_XFER_GOOD) {
1078 US_DEBUGP("usbat_flash_get_sector_count: Gah! identify_device failed\n");
1079 rc = USB_STOR_TRANSPORT_ERROR;
1080 goto leave;
1081 }
1082
1083
1084 if (usbat_get_status(us, &status) != USB_STOR_XFER_GOOD) {
1085 rc = USB_STOR_TRANSPORT_ERROR;
1086 goto leave;
1087 }
1088
1089 msleep(100);
1090
1091
1092 rc = usbat_read_block(us, reply, 512, 0);
1093 if (rc != USB_STOR_TRANSPORT_GOOD)
1094 goto leave;
1095
1096 info->sectors = ((u32)(reply[117]) << 24) |
1097 ((u32)(reply[116]) << 16) |
1098 ((u32)(reply[115]) << 8) |
1099 ((u32)(reply[114]) );
1100
1101 rc = USB_STOR_TRANSPORT_GOOD;
1102
1103 leave:
1104 kfree(reply);
1105 return rc;
1106}
1107
1108
1109
1110
1111static int usbat_flash_read_data(struct us_data *us,
1112 struct usbat_info *info,
1113 u32 sector,
1114 u32 sectors)
1115{
1116 unsigned char registers[7] = {
1117 USBAT_ATA_FEATURES,
1118 USBAT_ATA_SECCNT,
1119 USBAT_ATA_SECNUM,
1120 USBAT_ATA_LBA_ME,
1121 USBAT_ATA_LBA_HI,
1122 USBAT_ATA_DEVICE,
1123 USBAT_ATA_STATUS,
1124 };
1125 unsigned char command[7];
1126 unsigned char *buffer;
1127 unsigned char thistime;
1128 unsigned int totallen, alloclen;
1129 int len, result;
1130 unsigned int sg_offset = 0;
1131 struct scatterlist *sg = NULL;
1132
1133 result = usbat_flash_check_media(us, info);
1134 if (result != USB_STOR_TRANSPORT_GOOD)
1135 return result;
1136
1137
1138
1139
1140
1141
1142
1143
1144 if (sector > 0x0FFFFFFF)
1145 return USB_STOR_TRANSPORT_ERROR;
1146
1147 totallen = sectors * info->ssize;
1148
1149
1150
1151
1152
1153
1154
1155 alloclen = min(totallen, 65536u);
1156 buffer = kmalloc(alloclen, GFP_NOIO);
1157 if (buffer == NULL)
1158 return USB_STOR_TRANSPORT_ERROR;
1159
1160 do {
1161
1162
1163
1164
1165 len = min(totallen, alloclen);
1166 thistime = (len / info->ssize) & 0xff;
1167
1168
1169 usbat_pack_ata_sector_cmd(command, thistime, sector, 0x20);
1170
1171
1172 result = usbat_multiple_write(us, registers, command, 7);
1173 if (result != USB_STOR_TRANSPORT_GOOD)
1174 goto leave;
1175
1176
1177 result = usbat_read_blocks(us, buffer, len, 0);
1178 if (result != USB_STOR_TRANSPORT_GOOD)
1179 goto leave;
1180
1181 US_DEBUGP("usbat_flash_read_data: %d bytes\n", len);
1182
1183
1184 usb_stor_access_xfer_buf(buffer, len, us->srb,
1185 &sg, &sg_offset, TO_XFER_BUF);
1186
1187 sector += thistime;
1188 totallen -= len;
1189 } while (totallen > 0);
1190
1191 kfree(buffer);
1192 return USB_STOR_TRANSPORT_GOOD;
1193
1194leave:
1195 kfree(buffer);
1196 return USB_STOR_TRANSPORT_ERROR;
1197}
1198
1199
1200
1201
1202static int usbat_flash_write_data(struct us_data *us,
1203 struct usbat_info *info,
1204 u32 sector,
1205 u32 sectors)
1206{
1207 unsigned char registers[7] = {
1208 USBAT_ATA_FEATURES,
1209 USBAT_ATA_SECCNT,
1210 USBAT_ATA_SECNUM,
1211 USBAT_ATA_LBA_ME,
1212 USBAT_ATA_LBA_HI,
1213 USBAT_ATA_DEVICE,
1214 USBAT_ATA_STATUS,
1215 };
1216 unsigned char command[7];
1217 unsigned char *buffer;
1218 unsigned char thistime;
1219 unsigned int totallen, alloclen;
1220 int len, result;
1221 unsigned int sg_offset = 0;
1222 struct scatterlist *sg = NULL;
1223
1224 result = usbat_flash_check_media(us, info);
1225 if (result != USB_STOR_TRANSPORT_GOOD)
1226 return result;
1227
1228
1229
1230
1231
1232
1233
1234
1235 if (sector > 0x0FFFFFFF)
1236 return USB_STOR_TRANSPORT_ERROR;
1237
1238 totallen = sectors * info->ssize;
1239
1240
1241
1242
1243
1244
1245
1246 alloclen = min(totallen, 65536u);
1247 buffer = kmalloc(alloclen, GFP_NOIO);
1248 if (buffer == NULL)
1249 return USB_STOR_TRANSPORT_ERROR;
1250
1251 do {
1252
1253
1254
1255
1256 len = min(totallen, alloclen);
1257 thistime = (len / info->ssize) & 0xff;
1258
1259
1260 usb_stor_access_xfer_buf(buffer, len, us->srb,
1261 &sg, &sg_offset, FROM_XFER_BUF);
1262
1263
1264 usbat_pack_ata_sector_cmd(command, thistime, sector, 0x30);
1265
1266
1267 result = usbat_multiple_write(us, registers, command, 7);
1268 if (result != USB_STOR_TRANSPORT_GOOD)
1269 goto leave;
1270
1271
1272 result = usbat_write_blocks(us, buffer, len, 0);
1273 if (result != USB_STOR_TRANSPORT_GOOD)
1274 goto leave;
1275
1276 sector += thistime;
1277 totallen -= len;
1278 } while (totallen > 0);
1279
1280 kfree(buffer);
1281 return result;
1282
1283leave:
1284 kfree(buffer);
1285 return USB_STOR_TRANSPORT_ERROR;
1286}
1287
1288
1289
1290
1291
1292static int usbat_hp8200e_handle_read10(struct us_data *us,
1293 unsigned char *registers,
1294 unsigned char *data,
1295 struct scsi_cmnd *srb)
1296{
1297 int result = USB_STOR_TRANSPORT_GOOD;
1298 unsigned char *buffer;
1299 unsigned int len;
1300 unsigned int sector;
1301 unsigned int sg_offset = 0;
1302 struct scatterlist *sg = NULL;
1303
1304 US_DEBUGP("handle_read10: transfersize %d\n",
1305 srb->transfersize);
1306
1307 if (scsi_bufflen(srb) < 0x10000) {
1308
1309 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1310 registers, data, 19,
1311 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1312 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1313 DMA_FROM_DEVICE,
1314 scsi_sglist(srb),
1315 scsi_bufflen(srb), scsi_sg_count(srb), 1);
1316
1317 return result;
1318 }
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328 if (data[7+0] == GPCMD_READ_CD) {
1329 len = short_pack(data[7+9], data[7+8]);
1330 len <<= 16;
1331 len |= data[7+7];
1332 US_DEBUGP("handle_read10: GPCMD_READ_CD: len %d\n", len);
1333 srb->transfersize = scsi_bufflen(srb)/len;
1334 }
1335
1336 if (!srb->transfersize) {
1337 srb->transfersize = 2048;
1338 US_DEBUGP("handle_read10: transfersize 0, forcing %d\n",
1339 srb->transfersize);
1340 }
1341
1342
1343
1344
1345
1346
1347
1348 len = (65535/srb->transfersize) * srb->transfersize;
1349 US_DEBUGP("Max read is %d bytes\n", len);
1350 len = min(len, scsi_bufflen(srb));
1351 buffer = kmalloc(len, GFP_NOIO);
1352 if (buffer == NULL)
1353 return USB_STOR_TRANSPORT_FAILED;
1354 sector = short_pack(data[7+3], data[7+2]);
1355 sector <<= 16;
1356 sector |= short_pack(data[7+5], data[7+4]);
1357 transferred = 0;
1358
1359 while (transferred != scsi_bufflen(srb)) {
1360
1361 if (len > scsi_bufflen(srb) - transferred)
1362 len = scsi_bufflen(srb) - transferred;
1363
1364 data[3] = len&0xFF;
1365 data[4] = (len>>8)&0xFF;
1366
1367
1368
1369 data[7+2] = MSB_of(sector>>16);
1370 data[7+3] = LSB_of(sector>>16);
1371 data[7+4] = MSB_of(sector&0xFFFF);
1372 data[7+5] = LSB_of(sector&0xFFFF);
1373 if (data[7+0] == GPCMD_READ_CD)
1374 data[7+6] = 0;
1375 data[7+7] = MSB_of(len / srb->transfersize);
1376 data[7+8] = LSB_of(len / srb->transfersize);
1377
1378 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1379 registers, data, 19,
1380 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1381 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1382 DMA_FROM_DEVICE,
1383 buffer,
1384 len, 0, 1);
1385
1386 if (result != USB_STOR_TRANSPORT_GOOD)
1387 break;
1388
1389
1390 usb_stor_access_xfer_buf(buffer, len, srb,
1391 &sg, &sg_offset, TO_XFER_BUF);
1392
1393
1394
1395 transferred += len;
1396 sector += len / srb->transfersize;
1397
1398 }
1399
1400 kfree(buffer);
1401 return result;
1402}
1403
1404static int usbat_select_and_test_registers(struct us_data *us)
1405{
1406 int selector;
1407 unsigned char *status = us->iobuf;
1408
1409
1410 for (selector = 0xA0; selector <= 0xB0; selector += 0x10) {
1411 if (usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) !=
1412 USB_STOR_XFER_GOOD)
1413 return USB_STOR_TRANSPORT_ERROR;
1414
1415 if (usbat_read(us, USBAT_ATA, USBAT_ATA_STATUS, status) !=
1416 USB_STOR_XFER_GOOD)
1417 return USB_STOR_TRANSPORT_ERROR;
1418
1419 if (usbat_read(us, USBAT_ATA, USBAT_ATA_DEVICE, status) !=
1420 USB_STOR_XFER_GOOD)
1421 return USB_STOR_TRANSPORT_ERROR;
1422
1423 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1424 USB_STOR_XFER_GOOD)
1425 return USB_STOR_TRANSPORT_ERROR;
1426
1427 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_HI, status) !=
1428 USB_STOR_XFER_GOOD)
1429 return USB_STOR_TRANSPORT_ERROR;
1430
1431 if (usbat_write(us, USBAT_ATA, USBAT_ATA_LBA_ME, 0x55) !=
1432 USB_STOR_XFER_GOOD)
1433 return USB_STOR_TRANSPORT_ERROR;
1434
1435 if (usbat_write(us, USBAT_ATA, USBAT_ATA_LBA_HI, 0xAA) !=
1436 USB_STOR_XFER_GOOD)
1437 return USB_STOR_TRANSPORT_ERROR;
1438
1439 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1440 USB_STOR_XFER_GOOD)
1441 return USB_STOR_TRANSPORT_ERROR;
1442
1443 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1444 USB_STOR_XFER_GOOD)
1445 return USB_STOR_TRANSPORT_ERROR;
1446 }
1447
1448 return USB_STOR_TRANSPORT_GOOD;
1449}
1450
1451
1452
1453
1454static int init_usbat(struct us_data *us, int devicetype)
1455{
1456 int rc;
1457 struct usbat_info *info;
1458 unsigned char subcountH = USBAT_ATA_LBA_HI;
1459 unsigned char subcountL = USBAT_ATA_LBA_ME;
1460 unsigned char *status = us->iobuf;
1461
1462 us->extra = kzalloc(sizeof(struct usbat_info), GFP_NOIO);
1463 if (!us->extra) {
1464 US_DEBUGP("init_usbat: Gah! Can't allocate storage for usbat info struct!\n");
1465 return 1;
1466 }
1467 info = (struct usbat_info *) (us->extra);
1468
1469
1470 rc = usbat_write_user_io(us,
1471 USBAT_UIO_OE1 | USBAT_UIO_OE0,
1472 USBAT_UIO_EPAD | USBAT_UIO_1);
1473 if (rc != USB_STOR_XFER_GOOD)
1474 return USB_STOR_TRANSPORT_ERROR;
1475
1476 US_DEBUGP("INIT 1\n");
1477
1478 msleep(2000);
1479
1480 rc = usbat_read_user_io(us, status);
1481 if (rc != USB_STOR_TRANSPORT_GOOD)
1482 return rc;
1483
1484 US_DEBUGP("INIT 2\n");
1485
1486 rc = usbat_read_user_io(us, status);
1487 if (rc != USB_STOR_XFER_GOOD)
1488 return USB_STOR_TRANSPORT_ERROR;
1489
1490 rc = usbat_read_user_io(us, status);
1491 if (rc != USB_STOR_XFER_GOOD)
1492 return USB_STOR_TRANSPORT_ERROR;
1493
1494 US_DEBUGP("INIT 3\n");
1495
1496 rc = usbat_select_and_test_registers(us);
1497 if (rc != USB_STOR_TRANSPORT_GOOD)
1498 return rc;
1499
1500 US_DEBUGP("INIT 4\n");
1501
1502 rc = usbat_read_user_io(us, status);
1503 if (rc != USB_STOR_XFER_GOOD)
1504 return USB_STOR_TRANSPORT_ERROR;
1505
1506 US_DEBUGP("INIT 5\n");
1507
1508
1509 rc = usbat_device_enable_cdt(us);
1510 if (rc != USB_STOR_TRANSPORT_GOOD)
1511 return rc;
1512
1513 US_DEBUGP("INIT 6\n");
1514
1515 rc = usbat_read_user_io(us, status);
1516 if (rc != USB_STOR_XFER_GOOD)
1517 return USB_STOR_TRANSPORT_ERROR;
1518
1519 US_DEBUGP("INIT 7\n");
1520
1521 msleep(1400);
1522
1523 rc = usbat_read_user_io(us, status);
1524 if (rc != USB_STOR_XFER_GOOD)
1525 return USB_STOR_TRANSPORT_ERROR;
1526
1527 US_DEBUGP("INIT 8\n");
1528
1529 rc = usbat_select_and_test_registers(us);
1530 if (rc != USB_STOR_TRANSPORT_GOOD)
1531 return rc;
1532
1533 US_DEBUGP("INIT 9\n");
1534
1535
1536 if (usbat_set_transport(us, info, devicetype))
1537 return USB_STOR_TRANSPORT_ERROR;
1538
1539 US_DEBUGP("INIT 10\n");
1540
1541 if (usbat_get_device_type(us) == USBAT_DEV_FLASH) {
1542 subcountH = 0x02;
1543 subcountL = 0x00;
1544 }
1545 rc = usbat_set_shuttle_features(us, (USBAT_FEAT_ETEN | USBAT_FEAT_ET2 | USBAT_FEAT_ET1),
1546 0x00, 0x88, 0x08, subcountH, subcountL);
1547 if (rc != USB_STOR_XFER_GOOD)
1548 return USB_STOR_TRANSPORT_ERROR;
1549
1550 US_DEBUGP("INIT 11\n");
1551
1552 return USB_STOR_TRANSPORT_GOOD;
1553}
1554
1555
1556
1557
1558static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
1559{
1560 int result;
1561 unsigned char *status = us->iobuf;
1562 unsigned char registers[32];
1563 unsigned char data[32];
1564 unsigned int len;
1565 int i;
1566
1567 len = scsi_bufflen(srb);
1568
1569
1570
1571
1572
1573
1574 registers[0] = USBAT_ATA_FEATURES;
1575 registers[1] = USBAT_ATA_SECCNT;
1576 registers[2] = USBAT_ATA_SECNUM;
1577 registers[3] = USBAT_ATA_LBA_ME;
1578 registers[4] = USBAT_ATA_LBA_HI;
1579 registers[5] = USBAT_ATA_DEVICE;
1580 registers[6] = USBAT_ATA_CMD;
1581 data[0] = 0x00;
1582 data[1] = 0x00;
1583 data[2] = 0x00;
1584 data[3] = len&0xFF;
1585 data[4] = (len>>8)&0xFF;
1586 data[5] = 0xB0;
1587 data[6] = 0xA0;
1588
1589 for (i=7; i<19; i++) {
1590 registers[i] = 0x10;
1591 data[i] = (i-7 >= srb->cmd_len) ? 0 : srb->cmnd[i-7];
1592 }
1593
1594 result = usbat_get_status(us, status);
1595 US_DEBUGP("Status = %02X\n", *status);
1596 if (result != USB_STOR_XFER_GOOD)
1597 return USB_STOR_TRANSPORT_ERROR;
1598 if (srb->cmnd[0] == TEST_UNIT_READY)
1599 transferred = 0;
1600
1601 if (srb->sc_data_direction == DMA_TO_DEVICE) {
1602
1603 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1604 registers, data, 19,
1605 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1606 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1607 DMA_TO_DEVICE,
1608 scsi_sglist(srb),
1609 len, scsi_sg_count(srb), 10);
1610
1611 if (result == USB_STOR_TRANSPORT_GOOD) {
1612 transferred += len;
1613 US_DEBUGP("Wrote %08X bytes\n", transferred);
1614 }
1615
1616 return result;
1617
1618 } else if (srb->cmnd[0] == READ_10 ||
1619 srb->cmnd[0] == GPCMD_READ_CD) {
1620
1621 return usbat_hp8200e_handle_read10(us, registers, data, srb);
1622
1623 }
1624
1625 if (len > 0xFFFF) {
1626 US_DEBUGP("Error: len = %08X... what do I do now?\n",
1627 len);
1628 return USB_STOR_TRANSPORT_ERROR;
1629 }
1630
1631 if ( (result = usbat_multiple_write(us,
1632 registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
1633 return result;
1634 }
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646 if ((result = usbat_write_block(us,
1647 USBAT_ATA, srb->cmnd, 12,
1648 (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
1649 USB_STOR_TRANSPORT_GOOD)) {
1650 return result;
1651 }
1652
1653
1654
1655 if (len != 0 && (srb->sc_data_direction == DMA_FROM_DEVICE)) {
1656
1657
1658
1659 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1660 USB_STOR_XFER_GOOD) {
1661 return USB_STOR_TRANSPORT_ERROR;
1662 }
1663
1664 if (len > 0xFF) {
1665 len = *status;
1666 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_HI, status) !=
1667 USB_STOR_XFER_GOOD) {
1668 return USB_STOR_TRANSPORT_ERROR;
1669 }
1670 len += ((unsigned int) *status)<<8;
1671 }
1672 else
1673 len = *status;
1674
1675
1676 result = usbat_read_block(us, scsi_sglist(srb), len,
1677 scsi_sg_count(srb));
1678 }
1679
1680 return result;
1681}
1682
1683
1684
1685
1686static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us)
1687{
1688 int rc;
1689 struct usbat_info *info = (struct usbat_info *) (us->extra);
1690 unsigned long block, blocks;
1691 unsigned char *ptr = us->iobuf;
1692 static unsigned char inquiry_response[36] = {
1693 0x00, 0x80, 0x00, 0x01, 0x1F, 0x00, 0x00, 0x00
1694 };
1695
1696 if (srb->cmnd[0] == INQUIRY) {
1697 US_DEBUGP("usbat_flash_transport: INQUIRY. Returning bogus response.\n");
1698 memcpy(ptr, inquiry_response, sizeof(inquiry_response));
1699 fill_inquiry_response(us, ptr, 36);
1700 return USB_STOR_TRANSPORT_GOOD;
1701 }
1702
1703 if (srb->cmnd[0] == READ_CAPACITY) {
1704 rc = usbat_flash_check_media(us, info);
1705 if (rc != USB_STOR_TRANSPORT_GOOD)
1706 return rc;
1707
1708 rc = usbat_flash_get_sector_count(us, info);
1709 if (rc != USB_STOR_TRANSPORT_GOOD)
1710 return rc;
1711
1712
1713 info->ssize = 0x200;
1714 US_DEBUGP("usbat_flash_transport: READ_CAPACITY: %ld sectors, %ld bytes per sector\n",
1715 info->sectors, info->ssize);
1716
1717
1718
1719
1720
1721
1722 ((__be32 *) ptr)[0] = cpu_to_be32(info->sectors - 1);
1723 ((__be32 *) ptr)[1] = cpu_to_be32(info->ssize);
1724 usb_stor_set_xfer_buf(ptr, 8, srb);
1725
1726 return USB_STOR_TRANSPORT_GOOD;
1727 }
1728
1729 if (srb->cmnd[0] == MODE_SELECT_10) {
1730 US_DEBUGP("usbat_flash_transport: Gah! MODE_SELECT_10.\n");
1731 return USB_STOR_TRANSPORT_ERROR;
1732 }
1733
1734 if (srb->cmnd[0] == READ_10) {
1735 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1736 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1737
1738 blocks = ((u32)(srb->cmnd[7]) << 8) | ((u32)(srb->cmnd[8]));
1739
1740 US_DEBUGP("usbat_flash_transport: READ_10: read block 0x%04lx count %ld\n", block, blocks);
1741 return usbat_flash_read_data(us, info, block, blocks);
1742 }
1743
1744 if (srb->cmnd[0] == READ_12) {
1745
1746
1747
1748 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1749 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1750
1751 blocks = ((u32)(srb->cmnd[6]) << 24) | ((u32)(srb->cmnd[7]) << 16) |
1752 ((u32)(srb->cmnd[8]) << 8) | ((u32)(srb->cmnd[9]));
1753
1754 US_DEBUGP("usbat_flash_transport: READ_12: read block 0x%04lx count %ld\n", block, blocks);
1755 return usbat_flash_read_data(us, info, block, blocks);
1756 }
1757
1758 if (srb->cmnd[0] == WRITE_10) {
1759 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1760 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1761
1762 blocks = ((u32)(srb->cmnd[7]) << 8) | ((u32)(srb->cmnd[8]));
1763
1764 US_DEBUGP("usbat_flash_transport: WRITE_10: write block 0x%04lx count %ld\n", block, blocks);
1765 return usbat_flash_write_data(us, info, block, blocks);
1766 }
1767
1768 if (srb->cmnd[0] == WRITE_12) {
1769
1770
1771
1772 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1773 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1774
1775 blocks = ((u32)(srb->cmnd[6]) << 24) | ((u32)(srb->cmnd[7]) << 16) |
1776 ((u32)(srb->cmnd[8]) << 8) | ((u32)(srb->cmnd[9]));
1777
1778 US_DEBUGP("usbat_flash_transport: WRITE_12: write block 0x%04lx count %ld\n", block, blocks);
1779 return usbat_flash_write_data(us, info, block, blocks);
1780 }
1781
1782
1783 if (srb->cmnd[0] == TEST_UNIT_READY) {
1784 US_DEBUGP("usbat_flash_transport: TEST_UNIT_READY.\n");
1785
1786 rc = usbat_flash_check_media(us, info);
1787 if (rc != USB_STOR_TRANSPORT_GOOD)
1788 return rc;
1789
1790 return usbat_check_status(us);
1791 }
1792
1793 if (srb->cmnd[0] == REQUEST_SENSE) {
1794 US_DEBUGP("usbat_flash_transport: REQUEST_SENSE.\n");
1795
1796 memset(ptr, 0, 18);
1797 ptr[0] = 0xF0;
1798 ptr[2] = info->sense_key;
1799 ptr[7] = 11;
1800 ptr[12] = info->sense_asc;
1801 ptr[13] = info->sense_ascq;
1802 usb_stor_set_xfer_buf(ptr, 18, srb);
1803
1804 return USB_STOR_TRANSPORT_GOOD;
1805 }
1806
1807 if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
1808
1809
1810
1811
1812 return USB_STOR_TRANSPORT_GOOD;
1813 }
1814
1815 US_DEBUGP("usbat_flash_transport: Gah! Unknown command: %d (0x%x)\n",
1816 srb->cmnd[0], srb->cmnd[0]);
1817 info->sense_key = 0x05;
1818 info->sense_asc = 0x20;
1819 info->sense_ascq = 0x00;
1820 return USB_STOR_TRANSPORT_FAILED;
1821}
1822
1823static int init_usbat_cd(struct us_data *us)
1824{
1825 return init_usbat(us, USBAT_DEV_HP8200);
1826}
1827
1828static int init_usbat_flash(struct us_data *us)
1829{
1830 return init_usbat(us, USBAT_DEV_FLASH);
1831}
1832
1833static int usbat_probe(struct usb_interface *intf,
1834 const struct usb_device_id *id)
1835{
1836 struct us_data *us;
1837 int result;
1838
1839 result = usb_stor_probe1(&us, intf, id,
1840 (id - usbat_usb_ids) + usbat_unusual_dev_list);
1841 if (result)
1842 return result;
1843
1844
1845
1846
1847 us->transport_name = "Shuttle USBAT";
1848 us->transport = usbat_flash_transport;
1849 us->transport_reset = usb_stor_CB_reset;
1850 us->max_lun = 1;
1851
1852 result = usb_stor_probe2(us);
1853 return result;
1854}
1855
1856static struct usb_driver usbat_driver = {
1857 .name = "ums-usbat",
1858 .probe = usbat_probe,
1859 .disconnect = usb_stor_disconnect,
1860 .suspend = usb_stor_suspend,
1861 .resume = usb_stor_resume,
1862 .reset_resume = usb_stor_reset_resume,
1863 .pre_reset = usb_stor_pre_reset,
1864 .post_reset = usb_stor_post_reset,
1865 .id_table = usbat_usb_ids,
1866 .soft_unbind = 1,
1867};
1868
1869static int __init usbat_init(void)
1870{
1871 return usb_register(&usbat_driver);
1872}
1873
1874static void __exit usbat_exit(void)
1875{
1876 usb_deregister(&usbat_driver);
1877}
1878
1879module_init(usbat_init);
1880module_exit(usbat_exit);
1881