0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #include <linux/errno.h>
0033 #include <linux/module.h>
0034 #include <linux/slab.h>
0035 #include <linux/cdrom.h>
0036
0037 #include <scsi/scsi.h>
0038 #include <scsi/scsi_cmnd.h>
0039
0040 #include "usb.h"
0041 #include "transport.h"
0042 #include "protocol.h"
0043 #include "debug.h"
0044 #include "scsiglue.h"
0045
0046 #define DRV_NAME "ums-usbat"
0047
0048 MODULE_DESCRIPTION("Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable");
0049 MODULE_AUTHOR("Daniel Drake <dsd@gentoo.org>, Robert Baruch <autophile@starband.net>");
0050 MODULE_LICENSE("GPL");
0051 MODULE_IMPORT_NS(USB_STORAGE);
0052
0053
0054 #define USBAT_DEV_HP8200 0x01
0055 #define USBAT_DEV_FLASH 0x02
0056
0057 #define USBAT_EPP_PORT 0x10
0058 #define USBAT_EPP_REGISTER 0x30
0059 #define USBAT_ATA 0x40
0060 #define USBAT_ISA 0x50
0061
0062
0063 #define USBAT_CMD_READ_REG 0x00
0064 #define USBAT_CMD_WRITE_REG 0x01
0065 #define USBAT_CMD_READ_BLOCK 0x02
0066 #define USBAT_CMD_WRITE_BLOCK 0x03
0067 #define USBAT_CMD_COND_READ_BLOCK 0x04
0068 #define USBAT_CMD_COND_WRITE_BLOCK 0x05
0069 #define USBAT_CMD_WRITE_REGS 0x07
0070
0071
0072 #define USBAT_CMD_EXEC_CMD 0x80
0073 #define USBAT_CMD_SET_FEAT 0x81
0074 #define USBAT_CMD_UIO 0x82
0075
0076
0077 #define USBAT_UIO_READ 1
0078 #define USBAT_UIO_WRITE 0
0079
0080
0081 #define USBAT_QUAL_FCQ 0x20
0082 #define USBAT_QUAL_ALQ 0x10
0083
0084
0085 #define USBAT_FLASH_MEDIA_NONE 0
0086 #define USBAT_FLASH_MEDIA_CF 1
0087
0088
0089 #define USBAT_FLASH_MEDIA_SAME 0
0090 #define USBAT_FLASH_MEDIA_CHANGED 1
0091
0092
0093 #define USBAT_ATA_DATA 0x10
0094 #define USBAT_ATA_FEATURES 0x11
0095 #define USBAT_ATA_ERROR 0x11
0096 #define USBAT_ATA_SECCNT 0x12
0097 #define USBAT_ATA_SECNUM 0x13
0098 #define USBAT_ATA_LBA_ME 0x14
0099 #define USBAT_ATA_LBA_HI 0x15
0100 #define USBAT_ATA_DEVICE 0x16
0101 #define USBAT_ATA_STATUS 0x17
0102 #define USBAT_ATA_CMD 0x17
0103 #define USBAT_ATA_ALTSTATUS 0x0E
0104
0105
0106 #define USBAT_UIO_EPAD 0x80
0107 #define USBAT_UIO_CDT 0x40
0108
0109 #define USBAT_UIO_1 0x20
0110 #define USBAT_UIO_0 0x10
0111 #define USBAT_UIO_EPP_ATA 0x08
0112 #define USBAT_UIO_UI1 0x04
0113 #define USBAT_UIO_UI0 0x02
0114 #define USBAT_UIO_INTR_ACK 0x01
0115
0116
0117 #define USBAT_UIO_DRVRST 0x80
0118 #define USBAT_UIO_ACKD 0x40
0119 #define USBAT_UIO_OE1 0x20
0120
0121 #define USBAT_UIO_OE0 0x10
0122 #define USBAT_UIO_ADPRST 0x01
0123
0124
0125 #define USBAT_FEAT_ETEN 0x80
0126 #define USBAT_FEAT_U1 0x08
0127 #define USBAT_FEAT_U0 0x04
0128 #define USBAT_FEAT_ET1 0x02
0129 #define USBAT_FEAT_ET2 0x01
0130
0131 struct usbat_info {
0132 int devicetype;
0133
0134
0135 unsigned long sectors;
0136 unsigned long ssize;
0137
0138 unsigned char sense_key;
0139 unsigned long sense_asc;
0140 unsigned long sense_ascq;
0141 };
0142
0143 #define short_pack(LSB,MSB) ( ((u16)(LSB)) | ( ((u16)(MSB))<<8 ) )
0144 #define LSB_of(s) ((s)&0xFF)
0145 #define MSB_of(s) ((s)>>8)
0146
0147 static int transferred = 0;
0148
0149 static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us);
0150 static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us);
0151
0152 static int init_usbat_cd(struct us_data *us);
0153 static int init_usbat_flash(struct us_data *us);
0154
0155
0156
0157
0158
0159 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
0160 vendorName, productName, useProtocol, useTransport, \
0161 initFunction, flags) \
0162 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
0163 .driver_info = (flags) }
0164
0165 static struct usb_device_id usbat_usb_ids[] = {
0166 # include "unusual_usbat.h"
0167 { }
0168 };
0169 MODULE_DEVICE_TABLE(usb, usbat_usb_ids);
0170
0171 #undef UNUSUAL_DEV
0172
0173
0174
0175
0176 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
0177 vendor_name, product_name, use_protocol, use_transport, \
0178 init_function, Flags) \
0179 { \
0180 .vendorName = vendor_name, \
0181 .productName = product_name, \
0182 .useProtocol = use_protocol, \
0183 .useTransport = use_transport, \
0184 .initFunction = init_function, \
0185 }
0186
0187 static struct us_unusual_dev usbat_unusual_dev_list[] = {
0188 # include "unusual_usbat.h"
0189 { }
0190 };
0191
0192 #undef UNUSUAL_DEV
0193
0194
0195
0196
0197
0198 static void usbat_pack_ata_sector_cmd(unsigned char *buf,
0199 unsigned char thistime,
0200 u32 sector, unsigned char cmd)
0201 {
0202 buf[0] = 0;
0203 buf[1] = thistime;
0204 buf[2] = sector & 0xFF;
0205 buf[3] = (sector >> 8) & 0xFF;
0206 buf[4] = (sector >> 16) & 0xFF;
0207 buf[5] = 0xE0 | ((sector >> 24) & 0x0F);
0208 buf[6] = cmd;
0209 }
0210
0211
0212
0213
0214 static int usbat_get_device_type(struct us_data *us)
0215 {
0216 return ((struct usbat_info*)us->extra)->devicetype;
0217 }
0218
0219
0220
0221
0222 static int usbat_read(struct us_data *us,
0223 unsigned char access,
0224 unsigned char reg,
0225 unsigned char *content)
0226 {
0227 return usb_stor_ctrl_transfer(us,
0228 us->recv_ctrl_pipe,
0229 access | USBAT_CMD_READ_REG,
0230 0xC0,
0231 (u16)reg,
0232 0,
0233 content,
0234 1);
0235 }
0236
0237
0238
0239
0240 static int usbat_write(struct us_data *us,
0241 unsigned char access,
0242 unsigned char reg,
0243 unsigned char content)
0244 {
0245 return usb_stor_ctrl_transfer(us,
0246 us->send_ctrl_pipe,
0247 access | USBAT_CMD_WRITE_REG,
0248 0x40,
0249 short_pack(reg, content),
0250 0,
0251 NULL,
0252 0);
0253 }
0254
0255
0256
0257
0258 static int usbat_bulk_read(struct us_data *us,
0259 void* buf,
0260 unsigned int len,
0261 int use_sg)
0262 {
0263 if (len == 0)
0264 return USB_STOR_XFER_GOOD;
0265
0266 usb_stor_dbg(us, "len = %d\n", len);
0267 return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, buf, len, use_sg, NULL);
0268 }
0269
0270
0271
0272
0273 static int usbat_bulk_write(struct us_data *us,
0274 void* buf,
0275 unsigned int len,
0276 int use_sg)
0277 {
0278 if (len == 0)
0279 return USB_STOR_XFER_GOOD;
0280
0281 usb_stor_dbg(us, "len = %d\n", len);
0282 return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, buf, len, use_sg, NULL);
0283 }
0284
0285
0286
0287
0288
0289
0290 static int usbat_execute_command(struct us_data *us,
0291 unsigned char *commands,
0292 unsigned int len)
0293 {
0294 return usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
0295 USBAT_CMD_EXEC_CMD, 0x40, 0, 0,
0296 commands, len);
0297 }
0298
0299
0300
0301
0302 static int usbat_get_status(struct us_data *us, unsigned char *status)
0303 {
0304 int rc;
0305 rc = usbat_read(us, USBAT_ATA, USBAT_ATA_STATUS, status);
0306
0307 usb_stor_dbg(us, "0x%02X\n", *status);
0308 return rc;
0309 }
0310
0311
0312
0313
0314 static int usbat_check_status(struct us_data *us)
0315 {
0316 unsigned char *reply = us->iobuf;
0317 int rc;
0318
0319 rc = usbat_get_status(us, reply);
0320 if (rc != USB_STOR_XFER_GOOD)
0321 return USB_STOR_TRANSPORT_FAILED;
0322
0323
0324 if (*reply & 0x01 && *reply != 0x51)
0325 return USB_STOR_TRANSPORT_FAILED;
0326
0327
0328 if (*reply & 0x20)
0329 return USB_STOR_TRANSPORT_FAILED;
0330
0331 return USB_STOR_TRANSPORT_GOOD;
0332 }
0333
0334
0335
0336
0337
0338 static int usbat_set_shuttle_features(struct us_data *us,
0339 unsigned char external_trigger,
0340 unsigned char epp_control,
0341 unsigned char mask_byte,
0342 unsigned char test_pattern,
0343 unsigned char subcountH,
0344 unsigned char subcountL)
0345 {
0346 unsigned char *command = us->iobuf;
0347
0348 command[0] = 0x40;
0349 command[1] = USBAT_CMD_SET_FEAT;
0350
0351
0352
0353
0354
0355 command[2] = epp_control;
0356
0357
0358
0359
0360
0361
0362
0363 command[3] = external_trigger;
0364
0365
0366
0367
0368
0369
0370 command[4] = test_pattern;
0371
0372
0373
0374
0375
0376 command[5] = mask_byte;
0377
0378
0379
0380
0381
0382
0383
0384 command[6] = subcountL;
0385 command[7] = subcountH;
0386
0387 return usbat_execute_command(us, command, 8);
0388 }
0389
0390
0391
0392
0393
0394 static int usbat_wait_not_busy(struct us_data *us, int minutes)
0395 {
0396 int i;
0397 int result;
0398 unsigned char *status = us->iobuf;
0399
0400
0401
0402
0403
0404
0405
0406
0407 for (i=0; i<1200+minutes*60; i++) {
0408
0409 result = usbat_get_status(us, status);
0410
0411 if (result!=USB_STOR_XFER_GOOD)
0412 return USB_STOR_TRANSPORT_ERROR;
0413 if (*status & 0x01) {
0414 result = usbat_read(us, USBAT_ATA, 0x10, status);
0415 return USB_STOR_TRANSPORT_FAILED;
0416 }
0417 if (*status & 0x20)
0418 return USB_STOR_TRANSPORT_FAILED;
0419
0420 if ((*status & 0x80)==0x00) {
0421 usb_stor_dbg(us, "Waited not busy for %d steps\n", i);
0422 return USB_STOR_TRANSPORT_GOOD;
0423 }
0424
0425 if (i<500)
0426 msleep(10);
0427 else if (i<700)
0428 msleep(50);
0429 else if (i<1200)
0430 msleep(100);
0431 else
0432 msleep(1000);
0433 }
0434
0435 usb_stor_dbg(us, "Waited not busy for %d minutes, timing out\n",
0436 minutes);
0437 return USB_STOR_TRANSPORT_FAILED;
0438 }
0439
0440
0441
0442
0443 static int usbat_read_block(struct us_data *us,
0444 void* buf,
0445 unsigned short len,
0446 int use_sg)
0447 {
0448 int result;
0449 unsigned char *command = us->iobuf;
0450
0451 if (!len)
0452 return USB_STOR_TRANSPORT_GOOD;
0453
0454 command[0] = 0xC0;
0455 command[1] = USBAT_ATA | USBAT_CMD_READ_BLOCK;
0456 command[2] = USBAT_ATA_DATA;
0457 command[3] = 0;
0458 command[4] = 0;
0459 command[5] = 0;
0460 command[6] = LSB_of(len);
0461 command[7] = MSB_of(len);
0462
0463 result = usbat_execute_command(us, command, 8);
0464 if (result != USB_STOR_XFER_GOOD)
0465 return USB_STOR_TRANSPORT_ERROR;
0466
0467 result = usbat_bulk_read(us, buf, len, use_sg);
0468 return (result == USB_STOR_XFER_GOOD ?
0469 USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
0470 }
0471
0472
0473
0474
0475 static int usbat_write_block(struct us_data *us,
0476 unsigned char access,
0477 void* buf,
0478 unsigned short len,
0479 int minutes,
0480 int use_sg)
0481 {
0482 int result;
0483 unsigned char *command = us->iobuf;
0484
0485 if (!len)
0486 return USB_STOR_TRANSPORT_GOOD;
0487
0488 command[0] = 0x40;
0489 command[1] = access | USBAT_CMD_WRITE_BLOCK;
0490 command[2] = USBAT_ATA_DATA;
0491 command[3] = 0;
0492 command[4] = 0;
0493 command[5] = 0;
0494 command[6] = LSB_of(len);
0495 command[7] = MSB_of(len);
0496
0497 result = usbat_execute_command(us, command, 8);
0498
0499 if (result != USB_STOR_XFER_GOOD)
0500 return USB_STOR_TRANSPORT_ERROR;
0501
0502 result = usbat_bulk_write(us, buf, len, use_sg);
0503 if (result != USB_STOR_XFER_GOOD)
0504 return USB_STOR_TRANSPORT_ERROR;
0505
0506 return usbat_wait_not_busy(us, minutes);
0507 }
0508
0509
0510
0511
0512 static int usbat_hp8200e_rw_block_test(struct us_data *us,
0513 unsigned char access,
0514 unsigned char *registers,
0515 unsigned char *data_out,
0516 unsigned short num_registers,
0517 unsigned char data_reg,
0518 unsigned char status_reg,
0519 unsigned char timeout,
0520 unsigned char qualifier,
0521 int direction,
0522 void *buf,
0523 unsigned short len,
0524 int use_sg,
0525 int minutes)
0526 {
0527 int result;
0528 unsigned int pipe = (direction == DMA_FROM_DEVICE) ?
0529 us->recv_bulk_pipe : us->send_bulk_pipe;
0530
0531 unsigned char *command = us->iobuf;
0532 int i, j;
0533 int cmdlen;
0534 unsigned char *data = us->iobuf;
0535 unsigned char *status = us->iobuf;
0536
0537 BUG_ON(num_registers > US_IOBUF_SIZE/2);
0538
0539 for (i=0; i<20; i++) {
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552 if (i==0) {
0553 cmdlen = 16;
0554
0555
0556
0557
0558
0559
0560 command[0] = 0x40;
0561 command[1] = access | USBAT_CMD_WRITE_REGS;
0562 command[2] = 0x07;
0563 command[3] = 0x17;
0564 command[4] = 0xFC;
0565 command[5] = 0xE7;
0566 command[6] = LSB_of(num_registers*2);
0567 command[7] = MSB_of(num_registers*2);
0568 } else
0569 cmdlen = 8;
0570
0571
0572 command[cmdlen-8] = (direction==DMA_TO_DEVICE ? 0x40 : 0xC0);
0573 command[cmdlen-7] = access |
0574 (direction==DMA_TO_DEVICE ?
0575 USBAT_CMD_COND_WRITE_BLOCK : USBAT_CMD_COND_READ_BLOCK);
0576 command[cmdlen-6] = data_reg;
0577 command[cmdlen-5] = status_reg;
0578 command[cmdlen-4] = timeout;
0579 command[cmdlen-3] = qualifier;
0580 command[cmdlen-2] = LSB_of(len);
0581 command[cmdlen-1] = MSB_of(len);
0582
0583 result = usbat_execute_command(us, command, cmdlen);
0584
0585 if (result != USB_STOR_XFER_GOOD)
0586 return USB_STOR_TRANSPORT_ERROR;
0587
0588 if (i==0) {
0589
0590 for (j=0; j<num_registers; j++) {
0591 data[j<<1] = registers[j];
0592 data[1+(j<<1)] = data_out[j];
0593 }
0594
0595 result = usbat_bulk_write(us, data, num_registers*2, 0);
0596 if (result != USB_STOR_XFER_GOOD)
0597 return USB_STOR_TRANSPORT_ERROR;
0598
0599 }
0600
0601 result = usb_stor_bulk_transfer_sg(us,
0602 pipe, buf, len, use_sg, NULL);
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623 if (result == USB_STOR_XFER_SHORT ||
0624 result == USB_STOR_XFER_STALLED) {
0625
0626
0627
0628
0629
0630
0631 if (direction==DMA_FROM_DEVICE && i==0) {
0632 if (usb_stor_clear_halt(us,
0633 us->send_bulk_pipe) < 0)
0634 return USB_STOR_TRANSPORT_ERROR;
0635 }
0636
0637
0638
0639
0640
0641 result = usbat_read(us, USBAT_ATA,
0642 direction==DMA_TO_DEVICE ?
0643 USBAT_ATA_STATUS : USBAT_ATA_ALTSTATUS,
0644 status);
0645
0646 if (result!=USB_STOR_XFER_GOOD)
0647 return USB_STOR_TRANSPORT_ERROR;
0648 if (*status & 0x01)
0649 return USB_STOR_TRANSPORT_FAILED;
0650 if (*status & 0x20)
0651 return USB_STOR_TRANSPORT_FAILED;
0652
0653 usb_stor_dbg(us, "Redoing %s\n",
0654 direction == DMA_TO_DEVICE
0655 ? "write" : "read");
0656
0657 } else if (result != USB_STOR_XFER_GOOD)
0658 return USB_STOR_TRANSPORT_ERROR;
0659 else
0660 return usbat_wait_not_busy(us, minutes);
0661
0662 }
0663
0664 usb_stor_dbg(us, "Bummer! %s bulk data 20 times failed\n",
0665 direction == DMA_TO_DEVICE ? "Writing" : "Reading");
0666
0667 return USB_STOR_TRANSPORT_FAILED;
0668 }
0669
0670
0671
0672
0673
0674
0675
0676
0677 static int usbat_multiple_write(struct us_data *us,
0678 unsigned char *registers,
0679 unsigned char *data_out,
0680 unsigned short num_registers)
0681 {
0682 int i, result;
0683 unsigned char *data = us->iobuf;
0684 unsigned char *command = us->iobuf;
0685
0686 BUG_ON(num_registers > US_IOBUF_SIZE/2);
0687
0688
0689 command[0] = 0x40;
0690 command[1] = USBAT_ATA | USBAT_CMD_WRITE_REGS;
0691
0692
0693 command[2] = 0;
0694 command[3] = 0;
0695 command[4] = 0;
0696 command[5] = 0;
0697
0698
0699 command[6] = LSB_of(num_registers*2);
0700 command[7] = MSB_of(num_registers*2);
0701
0702
0703 result = usbat_execute_command(us, command, 8);
0704 if (result != USB_STOR_XFER_GOOD)
0705 return USB_STOR_TRANSPORT_ERROR;
0706
0707
0708 for (i=0; i<num_registers; i++) {
0709 data[i<<1] = registers[i];
0710 data[1+(i<<1)] = data_out[i];
0711 }
0712
0713
0714 result = usbat_bulk_write(us, data, num_registers*2, 0);
0715 if (result != USB_STOR_XFER_GOOD)
0716 return USB_STOR_TRANSPORT_ERROR;
0717
0718 if (usbat_get_device_type(us) == USBAT_DEV_HP8200)
0719 return usbat_wait_not_busy(us, 0);
0720 else
0721 return USB_STOR_TRANSPORT_GOOD;
0722 }
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736 static int usbat_read_blocks(struct us_data *us,
0737 void* buffer,
0738 int len,
0739 int use_sg)
0740 {
0741 int result;
0742 unsigned char *command = us->iobuf;
0743
0744 command[0] = 0xC0;
0745 command[1] = USBAT_ATA | USBAT_CMD_COND_READ_BLOCK;
0746 command[2] = USBAT_ATA_DATA;
0747 command[3] = USBAT_ATA_STATUS;
0748 command[4] = 0xFD;
0749 command[5] = USBAT_QUAL_FCQ;
0750 command[6] = LSB_of(len);
0751 command[7] = MSB_of(len);
0752
0753
0754 result = usbat_execute_command(us, command, 8);
0755 if (result != USB_STOR_XFER_GOOD)
0756 return USB_STOR_TRANSPORT_FAILED;
0757
0758
0759 result = usbat_bulk_read(us, buffer, len, use_sg);
0760 if (result != USB_STOR_XFER_GOOD)
0761 return USB_STOR_TRANSPORT_FAILED;
0762
0763 return USB_STOR_TRANSPORT_GOOD;
0764 }
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778 static int usbat_write_blocks(struct us_data *us,
0779 void* buffer,
0780 int len,
0781 int use_sg)
0782 {
0783 int result;
0784 unsigned char *command = us->iobuf;
0785
0786 command[0] = 0x40;
0787 command[1] = USBAT_ATA | USBAT_CMD_COND_WRITE_BLOCK;
0788 command[2] = USBAT_ATA_DATA;
0789 command[3] = USBAT_ATA_STATUS;
0790 command[4] = 0xFD;
0791 command[5] = USBAT_QUAL_FCQ;
0792 command[6] = LSB_of(len);
0793 command[7] = MSB_of(len);
0794
0795
0796 result = usbat_execute_command(us, command, 8);
0797 if (result != USB_STOR_XFER_GOOD)
0798 return USB_STOR_TRANSPORT_FAILED;
0799
0800
0801 result = usbat_bulk_write(us, buffer, len, use_sg);
0802 if (result != USB_STOR_XFER_GOOD)
0803 return USB_STOR_TRANSPORT_FAILED;
0804
0805 return USB_STOR_TRANSPORT_GOOD;
0806 }
0807
0808
0809
0810
0811 static int usbat_read_user_io(struct us_data *us, unsigned char *data_flags)
0812 {
0813 int result;
0814
0815 result = usb_stor_ctrl_transfer(us,
0816 us->recv_ctrl_pipe,
0817 USBAT_CMD_UIO,
0818 0xC0,
0819 0,
0820 0,
0821 data_flags,
0822 USBAT_UIO_READ);
0823
0824 usb_stor_dbg(us, "UIO register reads %02X\n", *data_flags);
0825
0826 return result;
0827 }
0828
0829
0830
0831
0832 static int usbat_write_user_io(struct us_data *us,
0833 unsigned char enable_flags,
0834 unsigned char data_flags)
0835 {
0836 return usb_stor_ctrl_transfer(us,
0837 us->send_ctrl_pipe,
0838 USBAT_CMD_UIO,
0839 0x40,
0840 short_pack(enable_flags, data_flags),
0841 0,
0842 NULL,
0843 USBAT_UIO_WRITE);
0844 }
0845
0846
0847
0848
0849
0850 static int usbat_device_reset(struct us_data *us)
0851 {
0852 int rc;
0853
0854
0855
0856
0857
0858 rc = usbat_write_user_io(us,
0859 USBAT_UIO_DRVRST | USBAT_UIO_OE1 | USBAT_UIO_OE0,
0860 USBAT_UIO_EPAD | USBAT_UIO_1);
0861 if (rc != USB_STOR_XFER_GOOD)
0862 return USB_STOR_TRANSPORT_ERROR;
0863
0864
0865
0866
0867
0868 rc = usbat_write_user_io(us,
0869 USBAT_UIO_OE1 | USBAT_UIO_OE0,
0870 USBAT_UIO_EPAD | USBAT_UIO_1);
0871 if (rc != USB_STOR_XFER_GOOD)
0872 return USB_STOR_TRANSPORT_ERROR;
0873
0874 return USB_STOR_TRANSPORT_GOOD;
0875 }
0876
0877
0878
0879
0880 static int usbat_device_enable_cdt(struct us_data *us)
0881 {
0882 int rc;
0883
0884
0885 rc = usbat_write_user_io(us,
0886 USBAT_UIO_ACKD | USBAT_UIO_OE1 | USBAT_UIO_OE0,
0887 USBAT_UIO_EPAD | USBAT_UIO_1);
0888 if (rc != USB_STOR_XFER_GOOD)
0889 return USB_STOR_TRANSPORT_ERROR;
0890
0891 return USB_STOR_TRANSPORT_GOOD;
0892 }
0893
0894
0895
0896
0897 static int usbat_flash_check_media_present(struct us_data *us,
0898 unsigned char *uio)
0899 {
0900 if (*uio & USBAT_UIO_UI0) {
0901 usb_stor_dbg(us, "no media detected\n");
0902 return USBAT_FLASH_MEDIA_NONE;
0903 }
0904
0905 return USBAT_FLASH_MEDIA_CF;
0906 }
0907
0908
0909
0910
0911 static int usbat_flash_check_media_changed(struct us_data *us,
0912 unsigned char *uio)
0913 {
0914 if (*uio & USBAT_UIO_0) {
0915 usb_stor_dbg(us, "media change detected\n");
0916 return USBAT_FLASH_MEDIA_CHANGED;
0917 }
0918
0919 return USBAT_FLASH_MEDIA_SAME;
0920 }
0921
0922
0923
0924
0925 static int usbat_flash_check_media(struct us_data *us,
0926 struct usbat_info *info)
0927 {
0928 int rc;
0929 unsigned char *uio = us->iobuf;
0930
0931 rc = usbat_read_user_io(us, uio);
0932 if (rc != USB_STOR_XFER_GOOD)
0933 return USB_STOR_TRANSPORT_ERROR;
0934
0935
0936 rc = usbat_flash_check_media_present(us, uio);
0937 if (rc == USBAT_FLASH_MEDIA_NONE) {
0938 info->sense_key = 0x02;
0939 info->sense_asc = 0x3A;
0940 info->sense_ascq = 0x00;
0941 return USB_STOR_TRANSPORT_FAILED;
0942 }
0943
0944
0945 rc = usbat_flash_check_media_changed(us, uio);
0946 if (rc == USBAT_FLASH_MEDIA_CHANGED) {
0947
0948
0949 rc = usbat_device_reset(us);
0950 if (rc != USB_STOR_TRANSPORT_GOOD)
0951 return rc;
0952 rc = usbat_device_enable_cdt(us);
0953 if (rc != USB_STOR_TRANSPORT_GOOD)
0954 return rc;
0955
0956 msleep(50);
0957
0958 rc = usbat_read_user_io(us, uio);
0959 if (rc != USB_STOR_XFER_GOOD)
0960 return USB_STOR_TRANSPORT_ERROR;
0961
0962 info->sense_key = UNIT_ATTENTION;
0963 info->sense_asc = 0x28;
0964 info->sense_ascq = 0x00;
0965 return USB_STOR_TRANSPORT_FAILED;
0966 }
0967
0968 return USB_STOR_TRANSPORT_GOOD;
0969 }
0970
0971
0972
0973
0974
0975
0976 static int usbat_identify_device(struct us_data *us,
0977 struct usbat_info *info)
0978 {
0979 int rc;
0980 unsigned char status;
0981
0982 if (!us || !info)
0983 return USB_STOR_TRANSPORT_ERROR;
0984
0985 rc = usbat_device_reset(us);
0986 if (rc != USB_STOR_TRANSPORT_GOOD)
0987 return rc;
0988 msleep(500);
0989
0990
0991
0992
0993
0994
0995
0996 rc = usbat_write(us, USBAT_ATA, USBAT_ATA_CMD, 0xA1);
0997 if (rc != USB_STOR_XFER_GOOD)
0998 return USB_STOR_TRANSPORT_ERROR;
0999
1000 rc = usbat_get_status(us, &status);
1001 if (rc != USB_STOR_XFER_GOOD)
1002 return USB_STOR_TRANSPORT_ERROR;
1003
1004
1005 if (status == 0xA1 || !(status & 0x01)) {
1006
1007 usb_stor_dbg(us, "Detected HP8200 CDRW\n");
1008 info->devicetype = USBAT_DEV_HP8200;
1009 } else {
1010
1011 usb_stor_dbg(us, "Detected Flash reader/writer\n");
1012 info->devicetype = USBAT_DEV_FLASH;
1013 }
1014
1015 return USB_STOR_TRANSPORT_GOOD;
1016 }
1017
1018
1019
1020
1021 static int usbat_set_transport(struct us_data *us,
1022 struct usbat_info *info,
1023 int devicetype)
1024 {
1025
1026 if (!info->devicetype)
1027 info->devicetype = devicetype;
1028
1029 if (!info->devicetype)
1030 usbat_identify_device(us, info);
1031
1032 switch (info->devicetype) {
1033 default:
1034 return USB_STOR_TRANSPORT_ERROR;
1035
1036 case USBAT_DEV_HP8200:
1037 us->transport = usbat_hp8200e_transport;
1038 break;
1039
1040 case USBAT_DEV_FLASH:
1041 us->transport = usbat_flash_transport;
1042 break;
1043 }
1044
1045 return 0;
1046 }
1047
1048
1049
1050
1051 static int usbat_flash_get_sector_count(struct us_data *us,
1052 struct usbat_info *info)
1053 {
1054 unsigned char registers[3] = {
1055 USBAT_ATA_SECCNT,
1056 USBAT_ATA_DEVICE,
1057 USBAT_ATA_CMD,
1058 };
1059 unsigned char command[3] = { 0x01, 0xA0, 0xEC };
1060 unsigned char *reply;
1061 unsigned char status;
1062 int rc;
1063
1064 if (!us || !info)
1065 return USB_STOR_TRANSPORT_ERROR;
1066
1067 reply = kmalloc(512, GFP_NOIO);
1068 if (!reply)
1069 return USB_STOR_TRANSPORT_ERROR;
1070
1071
1072 rc = usbat_multiple_write(us, registers, command, 3);
1073 if (rc != USB_STOR_XFER_GOOD) {
1074 usb_stor_dbg(us, "Gah! identify_device failed\n");
1075 rc = USB_STOR_TRANSPORT_ERROR;
1076 goto leave;
1077 }
1078
1079
1080 if (usbat_get_status(us, &status) != USB_STOR_XFER_GOOD) {
1081 rc = USB_STOR_TRANSPORT_ERROR;
1082 goto leave;
1083 }
1084
1085 msleep(100);
1086
1087
1088 rc = usbat_read_block(us, reply, 512, 0);
1089 if (rc != USB_STOR_TRANSPORT_GOOD)
1090 goto leave;
1091
1092 info->sectors = ((u32)(reply[117]) << 24) |
1093 ((u32)(reply[116]) << 16) |
1094 ((u32)(reply[115]) << 8) |
1095 ((u32)(reply[114]) );
1096
1097 rc = USB_STOR_TRANSPORT_GOOD;
1098
1099 leave:
1100 kfree(reply);
1101 return rc;
1102 }
1103
1104
1105
1106
1107 static int usbat_flash_read_data(struct us_data *us,
1108 struct usbat_info *info,
1109 u32 sector,
1110 u32 sectors)
1111 {
1112 unsigned char registers[7] = {
1113 USBAT_ATA_FEATURES,
1114 USBAT_ATA_SECCNT,
1115 USBAT_ATA_SECNUM,
1116 USBAT_ATA_LBA_ME,
1117 USBAT_ATA_LBA_HI,
1118 USBAT_ATA_DEVICE,
1119 USBAT_ATA_STATUS,
1120 };
1121 unsigned char command[7];
1122 unsigned char *buffer;
1123 unsigned char thistime;
1124 unsigned int totallen, alloclen;
1125 int len, result;
1126 unsigned int sg_offset = 0;
1127 struct scatterlist *sg = NULL;
1128
1129 result = usbat_flash_check_media(us, info);
1130 if (result != USB_STOR_TRANSPORT_GOOD)
1131 return result;
1132
1133
1134
1135
1136
1137
1138
1139
1140 if (sector > 0x0FFFFFFF)
1141 return USB_STOR_TRANSPORT_ERROR;
1142
1143 totallen = sectors * info->ssize;
1144
1145
1146
1147
1148
1149
1150
1151 alloclen = min(totallen, 65536u);
1152 buffer = kmalloc(alloclen, GFP_NOIO);
1153 if (buffer == NULL)
1154 return USB_STOR_TRANSPORT_ERROR;
1155
1156 do {
1157
1158
1159
1160
1161 len = min(totallen, alloclen);
1162 thistime = (len / info->ssize) & 0xff;
1163
1164
1165 usbat_pack_ata_sector_cmd(command, thistime, sector, 0x20);
1166
1167
1168 result = usbat_multiple_write(us, registers, command, 7);
1169 if (result != USB_STOR_TRANSPORT_GOOD)
1170 goto leave;
1171
1172
1173 result = usbat_read_blocks(us, buffer, len, 0);
1174 if (result != USB_STOR_TRANSPORT_GOOD)
1175 goto leave;
1176
1177 usb_stor_dbg(us, "%d bytes\n", len);
1178
1179
1180 usb_stor_access_xfer_buf(buffer, len, us->srb,
1181 &sg, &sg_offset, TO_XFER_BUF);
1182
1183 sector += thistime;
1184 totallen -= len;
1185 } while (totallen > 0);
1186
1187 kfree(buffer);
1188 return USB_STOR_TRANSPORT_GOOD;
1189
1190 leave:
1191 kfree(buffer);
1192 return USB_STOR_TRANSPORT_ERROR;
1193 }
1194
1195
1196
1197
1198 static int usbat_flash_write_data(struct us_data *us,
1199 struct usbat_info *info,
1200 u32 sector,
1201 u32 sectors)
1202 {
1203 unsigned char registers[7] = {
1204 USBAT_ATA_FEATURES,
1205 USBAT_ATA_SECCNT,
1206 USBAT_ATA_SECNUM,
1207 USBAT_ATA_LBA_ME,
1208 USBAT_ATA_LBA_HI,
1209 USBAT_ATA_DEVICE,
1210 USBAT_ATA_STATUS,
1211 };
1212 unsigned char command[7];
1213 unsigned char *buffer;
1214 unsigned char thistime;
1215 unsigned int totallen, alloclen;
1216 int len, result;
1217 unsigned int sg_offset = 0;
1218 struct scatterlist *sg = NULL;
1219
1220 result = usbat_flash_check_media(us, info);
1221 if (result != USB_STOR_TRANSPORT_GOOD)
1222 return result;
1223
1224
1225
1226
1227
1228
1229
1230
1231 if (sector > 0x0FFFFFFF)
1232 return USB_STOR_TRANSPORT_ERROR;
1233
1234 totallen = sectors * info->ssize;
1235
1236
1237
1238
1239
1240
1241
1242 alloclen = min(totallen, 65536u);
1243 buffer = kmalloc(alloclen, GFP_NOIO);
1244 if (buffer == NULL)
1245 return USB_STOR_TRANSPORT_ERROR;
1246
1247 do {
1248
1249
1250
1251
1252 len = min(totallen, alloclen);
1253 thistime = (len / info->ssize) & 0xff;
1254
1255
1256 usb_stor_access_xfer_buf(buffer, len, us->srb,
1257 &sg, &sg_offset, FROM_XFER_BUF);
1258
1259
1260 usbat_pack_ata_sector_cmd(command, thistime, sector, 0x30);
1261
1262
1263 result = usbat_multiple_write(us, registers, command, 7);
1264 if (result != USB_STOR_TRANSPORT_GOOD)
1265 goto leave;
1266
1267
1268 result = usbat_write_blocks(us, buffer, len, 0);
1269 if (result != USB_STOR_TRANSPORT_GOOD)
1270 goto leave;
1271
1272 sector += thistime;
1273 totallen -= len;
1274 } while (totallen > 0);
1275
1276 kfree(buffer);
1277 return result;
1278
1279 leave:
1280 kfree(buffer);
1281 return USB_STOR_TRANSPORT_ERROR;
1282 }
1283
1284
1285
1286
1287
1288 static int usbat_hp8200e_handle_read10(struct us_data *us,
1289 unsigned char *registers,
1290 unsigned char *data,
1291 struct scsi_cmnd *srb)
1292 {
1293 int result = USB_STOR_TRANSPORT_GOOD;
1294 unsigned char *buffer;
1295 unsigned int len;
1296 unsigned int sector;
1297 unsigned int sg_offset = 0;
1298 struct scatterlist *sg = NULL;
1299
1300 usb_stor_dbg(us, "transfersize %d\n", srb->transfersize);
1301
1302 if (scsi_bufflen(srb) < 0x10000) {
1303
1304 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1305 registers, data, 19,
1306 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1307 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1308 DMA_FROM_DEVICE,
1309 scsi_sglist(srb),
1310 scsi_bufflen(srb), scsi_sg_count(srb), 1);
1311
1312 return result;
1313 }
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323 if (data[7+0] == GPCMD_READ_CD) {
1324 len = short_pack(data[7+9], data[7+8]);
1325 len <<= 16;
1326 len |= data[7+7];
1327 usb_stor_dbg(us, "GPCMD_READ_CD: len %d\n", len);
1328 srb->transfersize = scsi_bufflen(srb)/len;
1329 }
1330
1331 if (!srb->transfersize) {
1332 srb->transfersize = 2048;
1333 usb_stor_dbg(us, "transfersize 0, forcing %d\n",
1334 srb->transfersize);
1335 }
1336
1337
1338
1339
1340
1341
1342
1343 len = (65535/srb->transfersize) * srb->transfersize;
1344 usb_stor_dbg(us, "Max read is %d bytes\n", len);
1345 len = min(len, scsi_bufflen(srb));
1346 buffer = kmalloc(len, GFP_NOIO);
1347 if (buffer == NULL)
1348 return USB_STOR_TRANSPORT_FAILED;
1349 sector = short_pack(data[7+3], data[7+2]);
1350 sector <<= 16;
1351 sector |= short_pack(data[7+5], data[7+4]);
1352 transferred = 0;
1353
1354 while (transferred != scsi_bufflen(srb)) {
1355
1356 if (len > scsi_bufflen(srb) - transferred)
1357 len = scsi_bufflen(srb) - transferred;
1358
1359 data[3] = len&0xFF;
1360 data[4] = (len>>8)&0xFF;
1361
1362
1363
1364 data[7+2] = MSB_of(sector>>16);
1365 data[7+3] = LSB_of(sector>>16);
1366 data[7+4] = MSB_of(sector&0xFFFF);
1367 data[7+5] = LSB_of(sector&0xFFFF);
1368 if (data[7+0] == GPCMD_READ_CD)
1369 data[7+6] = 0;
1370 data[7+7] = MSB_of(len / srb->transfersize);
1371 data[7+8] = LSB_of(len / srb->transfersize);
1372
1373 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1374 registers, data, 19,
1375 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1376 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1377 DMA_FROM_DEVICE,
1378 buffer,
1379 len, 0, 1);
1380
1381 if (result != USB_STOR_TRANSPORT_GOOD)
1382 break;
1383
1384
1385 usb_stor_access_xfer_buf(buffer, len, srb,
1386 &sg, &sg_offset, TO_XFER_BUF);
1387
1388
1389
1390 transferred += len;
1391 sector += len / srb->transfersize;
1392
1393 }
1394
1395 kfree(buffer);
1396 return result;
1397 }
1398
1399 static int usbat_select_and_test_registers(struct us_data *us)
1400 {
1401 int selector;
1402 unsigned char *status = us->iobuf;
1403
1404
1405 for (selector = 0xA0; selector <= 0xB0; selector += 0x10) {
1406 if (usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) !=
1407 USB_STOR_XFER_GOOD)
1408 return USB_STOR_TRANSPORT_ERROR;
1409
1410 if (usbat_read(us, USBAT_ATA, USBAT_ATA_STATUS, status) !=
1411 USB_STOR_XFER_GOOD)
1412 return USB_STOR_TRANSPORT_ERROR;
1413
1414 if (usbat_read(us, USBAT_ATA, USBAT_ATA_DEVICE, status) !=
1415 USB_STOR_XFER_GOOD)
1416 return USB_STOR_TRANSPORT_ERROR;
1417
1418 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1419 USB_STOR_XFER_GOOD)
1420 return USB_STOR_TRANSPORT_ERROR;
1421
1422 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_HI, status) !=
1423 USB_STOR_XFER_GOOD)
1424 return USB_STOR_TRANSPORT_ERROR;
1425
1426 if (usbat_write(us, USBAT_ATA, USBAT_ATA_LBA_ME, 0x55) !=
1427 USB_STOR_XFER_GOOD)
1428 return USB_STOR_TRANSPORT_ERROR;
1429
1430 if (usbat_write(us, USBAT_ATA, USBAT_ATA_LBA_HI, 0xAA) !=
1431 USB_STOR_XFER_GOOD)
1432 return USB_STOR_TRANSPORT_ERROR;
1433
1434 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1435 USB_STOR_XFER_GOOD)
1436 return USB_STOR_TRANSPORT_ERROR;
1437
1438 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1439 USB_STOR_XFER_GOOD)
1440 return USB_STOR_TRANSPORT_ERROR;
1441 }
1442
1443 return USB_STOR_TRANSPORT_GOOD;
1444 }
1445
1446
1447
1448
1449 static int init_usbat(struct us_data *us, int devicetype)
1450 {
1451 int rc;
1452 struct usbat_info *info;
1453 unsigned char subcountH = USBAT_ATA_LBA_HI;
1454 unsigned char subcountL = USBAT_ATA_LBA_ME;
1455 unsigned char *status = us->iobuf;
1456
1457 us->extra = kzalloc(sizeof(struct usbat_info), GFP_NOIO);
1458 if (!us->extra)
1459 return -ENOMEM;
1460
1461 info = (struct usbat_info *) (us->extra);
1462
1463
1464 rc = usbat_write_user_io(us,
1465 USBAT_UIO_OE1 | USBAT_UIO_OE0,
1466 USBAT_UIO_EPAD | USBAT_UIO_1);
1467 if (rc != USB_STOR_XFER_GOOD)
1468 return -EIO;
1469
1470 usb_stor_dbg(us, "INIT 1\n");
1471
1472 msleep(2000);
1473
1474 rc = usbat_read_user_io(us, status);
1475 if (rc != USB_STOR_TRANSPORT_GOOD)
1476 return -EIO;
1477
1478 usb_stor_dbg(us, "INIT 2\n");
1479
1480 rc = usbat_read_user_io(us, status);
1481 if (rc != USB_STOR_XFER_GOOD)
1482 return -EIO;
1483
1484 rc = usbat_read_user_io(us, status);
1485 if (rc != USB_STOR_XFER_GOOD)
1486 return -EIO;
1487
1488 usb_stor_dbg(us, "INIT 3\n");
1489
1490 rc = usbat_select_and_test_registers(us);
1491 if (rc != USB_STOR_TRANSPORT_GOOD)
1492 return -EIO;
1493
1494 usb_stor_dbg(us, "INIT 4\n");
1495
1496 rc = usbat_read_user_io(us, status);
1497 if (rc != USB_STOR_XFER_GOOD)
1498 return -EIO;
1499
1500 usb_stor_dbg(us, "INIT 5\n");
1501
1502
1503 rc = usbat_device_enable_cdt(us);
1504 if (rc != USB_STOR_TRANSPORT_GOOD)
1505 return -EIO;
1506
1507 usb_stor_dbg(us, "INIT 6\n");
1508
1509 rc = usbat_read_user_io(us, status);
1510 if (rc != USB_STOR_XFER_GOOD)
1511 return -EIO;
1512
1513 usb_stor_dbg(us, "INIT 7\n");
1514
1515 msleep(1400);
1516
1517 rc = usbat_read_user_io(us, status);
1518 if (rc != USB_STOR_XFER_GOOD)
1519 return -EIO;
1520
1521 usb_stor_dbg(us, "INIT 8\n");
1522
1523 rc = usbat_select_and_test_registers(us);
1524 if (rc != USB_STOR_TRANSPORT_GOOD)
1525 return -EIO;
1526
1527 usb_stor_dbg(us, "INIT 9\n");
1528
1529
1530 if (usbat_set_transport(us, info, devicetype))
1531 return -EIO;
1532
1533 usb_stor_dbg(us, "INIT 10\n");
1534
1535 if (usbat_get_device_type(us) == USBAT_DEV_FLASH) {
1536 subcountH = 0x02;
1537 subcountL = 0x00;
1538 }
1539 rc = usbat_set_shuttle_features(us, (USBAT_FEAT_ETEN | USBAT_FEAT_ET2 | USBAT_FEAT_ET1),
1540 0x00, 0x88, 0x08, subcountH, subcountL);
1541 if (rc != USB_STOR_XFER_GOOD)
1542 return -EIO;
1543
1544 usb_stor_dbg(us, "INIT 11\n");
1545
1546 return 0;
1547 }
1548
1549
1550
1551
1552 static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
1553 {
1554 int result;
1555 unsigned char *status = us->iobuf;
1556 unsigned char registers[32];
1557 unsigned char data[32];
1558 unsigned int len;
1559 int i;
1560
1561 len = scsi_bufflen(srb);
1562
1563
1564
1565
1566
1567
1568
1569 registers[0] = USBAT_ATA_FEATURES;
1570 registers[1] = USBAT_ATA_SECCNT;
1571 registers[2] = USBAT_ATA_SECNUM;
1572 registers[3] = USBAT_ATA_LBA_ME;
1573 registers[4] = USBAT_ATA_LBA_HI;
1574 registers[5] = USBAT_ATA_DEVICE;
1575 registers[6] = USBAT_ATA_CMD;
1576 data[0] = 0x00;
1577 data[1] = 0x00;
1578 data[2] = 0x00;
1579 data[3] = len&0xFF;
1580 data[4] = (len>>8)&0xFF;
1581 data[5] = 0xB0;
1582 data[6] = 0xA0;
1583
1584 for (i=7; i<19; i++) {
1585 registers[i] = 0x10;
1586 data[i] = (i-7 >= srb->cmd_len) ? 0 : srb->cmnd[i-7];
1587 }
1588
1589 result = usbat_get_status(us, status);
1590 usb_stor_dbg(us, "Status = %02X\n", *status);
1591 if (result != USB_STOR_XFER_GOOD)
1592 return USB_STOR_TRANSPORT_ERROR;
1593 if (srb->cmnd[0] == TEST_UNIT_READY)
1594 transferred = 0;
1595
1596 if (srb->sc_data_direction == DMA_TO_DEVICE) {
1597
1598 result = usbat_hp8200e_rw_block_test(us, USBAT_ATA,
1599 registers, data, 19,
1600 USBAT_ATA_DATA, USBAT_ATA_STATUS, 0xFD,
1601 (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
1602 DMA_TO_DEVICE,
1603 scsi_sglist(srb),
1604 len, scsi_sg_count(srb), 10);
1605
1606 if (result == USB_STOR_TRANSPORT_GOOD) {
1607 transferred += len;
1608 usb_stor_dbg(us, "Wrote %08X bytes\n", transferred);
1609 }
1610
1611 return result;
1612
1613 } else if (srb->cmnd[0] == READ_10 ||
1614 srb->cmnd[0] == GPCMD_READ_CD) {
1615
1616 return usbat_hp8200e_handle_read10(us, registers, data, srb);
1617
1618 }
1619
1620 if (len > 0xFFFF) {
1621 usb_stor_dbg(us, "Error: len = %08X... what do I do now?\n",
1622 len);
1623 return USB_STOR_TRANSPORT_ERROR;
1624 }
1625
1626 result = usbat_multiple_write(us, registers, data, 7);
1627
1628 if (result != USB_STOR_TRANSPORT_GOOD)
1629 return result;
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641 result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
1642 srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
1643
1644 if (result != USB_STOR_TRANSPORT_GOOD)
1645 return result;
1646
1647
1648
1649 if (len != 0 && (srb->sc_data_direction == DMA_FROM_DEVICE)) {
1650
1651
1652
1653 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, status) !=
1654 USB_STOR_XFER_GOOD) {
1655 return USB_STOR_TRANSPORT_ERROR;
1656 }
1657
1658 if (len > 0xFF) {
1659 len = *status;
1660 if (usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_HI, status) !=
1661 USB_STOR_XFER_GOOD) {
1662 return USB_STOR_TRANSPORT_ERROR;
1663 }
1664 len += ((unsigned int) *status)<<8;
1665 }
1666 else
1667 len = *status;
1668
1669
1670 result = usbat_read_block(us, scsi_sglist(srb), len,
1671 scsi_sg_count(srb));
1672 }
1673
1674 return result;
1675 }
1676
1677
1678
1679
1680 static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us)
1681 {
1682 int rc;
1683 struct usbat_info *info = (struct usbat_info *) (us->extra);
1684 unsigned long block, blocks;
1685 unsigned char *ptr = us->iobuf;
1686 static unsigned char inquiry_response[36] = {
1687 0x00, 0x80, 0x00, 0x01, 0x1F, 0x00, 0x00, 0x00
1688 };
1689
1690 if (srb->cmnd[0] == INQUIRY) {
1691 usb_stor_dbg(us, "INQUIRY - Returning bogus response\n");
1692 memcpy(ptr, inquiry_response, sizeof(inquiry_response));
1693 fill_inquiry_response(us, ptr, 36);
1694 return USB_STOR_TRANSPORT_GOOD;
1695 }
1696
1697 if (srb->cmnd[0] == READ_CAPACITY) {
1698 rc = usbat_flash_check_media(us, info);
1699 if (rc != USB_STOR_TRANSPORT_GOOD)
1700 return rc;
1701
1702 rc = usbat_flash_get_sector_count(us, info);
1703 if (rc != USB_STOR_TRANSPORT_GOOD)
1704 return rc;
1705
1706
1707 info->ssize = 0x200;
1708 usb_stor_dbg(us, "READ_CAPACITY: %ld sectors, %ld bytes per sector\n",
1709 info->sectors, info->ssize);
1710
1711
1712
1713
1714
1715
1716 ((__be32 *) ptr)[0] = cpu_to_be32(info->sectors - 1);
1717 ((__be32 *) ptr)[1] = cpu_to_be32(info->ssize);
1718 usb_stor_set_xfer_buf(ptr, 8, srb);
1719
1720 return USB_STOR_TRANSPORT_GOOD;
1721 }
1722
1723 if (srb->cmnd[0] == MODE_SELECT_10) {
1724 usb_stor_dbg(us, "Gah! MODE_SELECT_10\n");
1725 return USB_STOR_TRANSPORT_ERROR;
1726 }
1727
1728 if (srb->cmnd[0] == READ_10) {
1729 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1730 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1731
1732 blocks = ((u32)(srb->cmnd[7]) << 8) | ((u32)(srb->cmnd[8]));
1733
1734 usb_stor_dbg(us, "READ_10: read block 0x%04lx count %ld\n",
1735 block, blocks);
1736 return usbat_flash_read_data(us, info, block, blocks);
1737 }
1738
1739 if (srb->cmnd[0] == READ_12) {
1740
1741
1742
1743 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1744 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1745
1746 blocks = ((u32)(srb->cmnd[6]) << 24) | ((u32)(srb->cmnd[7]) << 16) |
1747 ((u32)(srb->cmnd[8]) << 8) | ((u32)(srb->cmnd[9]));
1748
1749 usb_stor_dbg(us, "READ_12: read block 0x%04lx count %ld\n",
1750 block, blocks);
1751 return usbat_flash_read_data(us, info, block, blocks);
1752 }
1753
1754 if (srb->cmnd[0] == WRITE_10) {
1755 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1756 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1757
1758 blocks = ((u32)(srb->cmnd[7]) << 8) | ((u32)(srb->cmnd[8]));
1759
1760 usb_stor_dbg(us, "WRITE_10: write block 0x%04lx count %ld\n",
1761 block, blocks);
1762 return usbat_flash_write_data(us, info, block, blocks);
1763 }
1764
1765 if (srb->cmnd[0] == WRITE_12) {
1766
1767
1768
1769 block = ((u32)(srb->cmnd[2]) << 24) | ((u32)(srb->cmnd[3]) << 16) |
1770 ((u32)(srb->cmnd[4]) << 8) | ((u32)(srb->cmnd[5]));
1771
1772 blocks = ((u32)(srb->cmnd[6]) << 24) | ((u32)(srb->cmnd[7]) << 16) |
1773 ((u32)(srb->cmnd[8]) << 8) | ((u32)(srb->cmnd[9]));
1774
1775 usb_stor_dbg(us, "WRITE_12: write block 0x%04lx count %ld\n",
1776 block, blocks);
1777 return usbat_flash_write_data(us, info, block, blocks);
1778 }
1779
1780
1781 if (srb->cmnd[0] == TEST_UNIT_READY) {
1782 usb_stor_dbg(us, "TEST_UNIT_READY\n");
1783
1784 rc = usbat_flash_check_media(us, info);
1785 if (rc != USB_STOR_TRANSPORT_GOOD)
1786 return rc;
1787
1788 return usbat_check_status(us);
1789 }
1790
1791 if (srb->cmnd[0] == REQUEST_SENSE) {
1792 usb_stor_dbg(us, "REQUEST_SENSE\n");
1793
1794 memset(ptr, 0, 18);
1795 ptr[0] = 0xF0;
1796 ptr[2] = info->sense_key;
1797 ptr[7] = 11;
1798 ptr[12] = info->sense_asc;
1799 ptr[13] = info->sense_ascq;
1800 usb_stor_set_xfer_buf(ptr, 18, srb);
1801
1802 return USB_STOR_TRANSPORT_GOOD;
1803 }
1804
1805 if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
1806
1807
1808
1809
1810 return USB_STOR_TRANSPORT_GOOD;
1811 }
1812
1813 usb_stor_dbg(us, "Gah! Unknown command: %d (0x%x)\n",
1814 srb->cmnd[0], srb->cmnd[0]);
1815 info->sense_key = 0x05;
1816 info->sense_asc = 0x20;
1817 info->sense_ascq = 0x00;
1818 return USB_STOR_TRANSPORT_FAILED;
1819 }
1820
1821 static int init_usbat_cd(struct us_data *us)
1822 {
1823 return init_usbat(us, USBAT_DEV_HP8200);
1824 }
1825
1826 static int init_usbat_flash(struct us_data *us)
1827 {
1828 return init_usbat(us, USBAT_DEV_FLASH);
1829 }
1830
1831 static struct scsi_host_template usbat_host_template;
1832
1833 static 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 &usbat_host_template);
1842 if (result)
1843 return result;
1844
1845
1846
1847
1848
1849 us->transport_name = "Shuttle USBAT";
1850 us->transport = usbat_flash_transport;
1851 us->transport_reset = usb_stor_CB_reset;
1852 us->max_lun = 0;
1853
1854 result = usb_stor_probe2(us);
1855 return result;
1856 }
1857
1858 static struct usb_driver usbat_driver = {
1859 .name = DRV_NAME,
1860 .probe = usbat_probe,
1861 .disconnect = usb_stor_disconnect,
1862 .suspend = usb_stor_suspend,
1863 .resume = usb_stor_resume,
1864 .reset_resume = usb_stor_reset_resume,
1865 .pre_reset = usb_stor_pre_reset,
1866 .post_reset = usb_stor_post_reset,
1867 .id_table = usbat_usb_ids,
1868 .soft_unbind = 1,
1869 .no_dynamic_id = 1,
1870 };
1871
1872 module_usb_stor_driver(usbat_driver, usbat_host_template, DRV_NAME);