isd200.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:55k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
  2.  *
  3.  * $Id: isd200.c,v 1.14 2002/02/25 00:40:13 mdharm Exp $
  4.  *
  5.  * Current development and maintenance:
  6.  *   (C) 2001-2002 Bj鰎n Stenberg (bjorn@haxx.se)
  7.  *
  8.  * Developed with the assistance of:
  9.  *   (C) 2002 Alan Stern <stern@rowland.org>
  10.  *
  11.  * Initial work:
  12.  *   (C) 2000 In-System Design, Inc. (support@in-system.com)
  13.  *
  14.  * The ISD200 ASIC does not natively support ATA devices.  The chip
  15.  * does implement an interface, the ATA Command Block (ATACB) which provides
  16.  * a means of passing ATA commands and ATA register accesses to a device.
  17.  *
  18.  * This program is free software; you can redistribute it and/or modify it
  19.  * under the terms of the GNU General Public License as published by the
  20.  * Free Software Foundation; either version 2, or (at your option) any
  21.  * later version.
  22.  *
  23.  * This program is distributed in the hope that it will be useful, but
  24.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  26.  * General Public License for more details.
  27.  *
  28.  * You should have received a copy of the GNU General Public License along
  29.  * with this program; if not, write to the Free Software Foundation, Inc.,
  30.  * 675 Mass Ave, Cambridge, MA 02139, USA.
  31.  *
  32.  * History:
  33.  *
  34.  *  2001-02-24: Removed lots of duplicate code and simplified the structure.
  35.  *              (bjorn@haxx.se)
  36.  *  2002-01-16: Fixed endianness bug so it works on the ppc arch.
  37.  *              (Luc Saillard <luc@saillard.org>)
  38.  *  2002-01-17: All bitfields removed.
  39.  *              (bjorn@haxx.se)
  40.  */
  41. /* Include files */
  42. #include "transport.h"
  43. #include "protocol.h"
  44. #include "usb.h"
  45. #include "debug.h"
  46. #include "scsiglue.h"
  47. #include "isd200.h"
  48. #include <linux/sched.h>
  49. #include <linux/errno.h>
  50. #include <linux/slab.h>
  51. #include <linux/hdreg.h>
  52. #include <linux/ide.h>
  53. /* Timeout defines (in Seconds) */
  54. #define ISD200_ENUM_BSY_TIMEOUT         35
  55. #define ISD200_ENUM_DETECT_TIMEOUT      30
  56. #define ISD200_DEFAULT_TIMEOUT          30
  57. /* device flags */
  58. #define DF_ATA_DEVICE               0x0001
  59. #define DF_MEDIA_STATUS_ENABLED     0x0002
  60. #define DF_REMOVABLE_MEDIA          0x0004
  61. /* capability bit definitions */
  62. #define CAPABILITY_DMA 0x01
  63. #define CAPABILITY_LBA 0x02
  64. /* command_setX bit definitions */
  65. #define COMMANDSET_REMOVABLE 0x02
  66. #define COMMANDSET_MEDIA_STATUS 0x10
  67. /* ATA Vendor Specific defines */
  68. #define ATA_ADDRESS_DEVHEAD_STD      0xa0
  69. #define ATA_ADDRESS_DEVHEAD_LBA_MODE 0x40    
  70. #define ATA_ADDRESS_DEVHEAD_SLAVE    0x10
  71. /* Action Select bits */
  72. #define ACTION_SELECT_0             0x01
  73. #define ACTION_SELECT_1             0x02
  74. #define ACTION_SELECT_2             0x04
  75. #define ACTION_SELECT_3             0x08
  76. #define ACTION_SELECT_4             0x10
  77. #define ACTION_SELECT_5             0x20
  78. #define ACTION_SELECT_6             0x40
  79. #define ACTION_SELECT_7             0x80
  80. /* Register Select bits */
  81. #define REG_ALTERNATE_STATUS 0x01
  82. #define REG_DEVICE_CONTROL   0x01
  83. #define REG_ERROR            0x02
  84. #define REG_FEATURES         0x02
  85. #define REG_SECTOR_COUNT     0x04
  86. #define REG_SECTOR_NUMBER    0x08
  87. #define REG_CYLINDER_LOW     0x10
  88. #define REG_CYLINDER_HIGH    0x20
  89. #define REG_DEVICE_HEAD      0x40
  90. #define REG_STATUS           0x80
  91. #define REG_COMMAND          0x80
  92. /* ATA error definitions not in <linux/hdreg.h> */
  93. #define ATA_ERROR_MEDIA_CHANGE       0x20
  94. /* ATA command definitions not in <linux/hdreg.h> */
  95. #define ATA_COMMAND_GET_MEDIA_STATUS        0xDA
  96. #define ATA_COMMAND_MEDIA_EJECT             0xED
  97. /* ATA drive control definitions */
  98. #define ATA_DC_DISABLE_INTERRUPTS    0x02
  99. #define ATA_DC_RESET_CONTROLLER      0x04
  100. #define ATA_DC_REENABLE_CONTROLLER   0x00
  101. /*
  102.  *  General purpose return codes
  103.  */ 
  104. #define ISD200_ERROR                -1
  105. #define ISD200_GOOD                 0
  106. /*
  107.  * Transport return codes
  108.  */
  109. #define ISD200_TRANSPORT_GOOD       0   /* Transport good, command good     */
  110. #define ISD200_TRANSPORT_FAILED     1   /* Transport good, command failed   */
  111. #define ISD200_TRANSPORT_ERROR      2   /* Transport bad (i.e. device dead) */
  112. #define ISD200_TRANSPORT_ABORTED    3   /* Transport aborted                */
  113. #define ISD200_TRANSPORT_SHORT      4   /* Transport short                  */
  114. /* driver action codes */
  115. #define ACTION_READ_STATUS 0
  116. #define ACTION_RESET 1
  117. #define ACTION_REENABLE 2
  118. #define ACTION_SOFT_RESET 3
  119. #define ACTION_ENUM 4
  120. #define ACTION_IDENTIFY 5
  121. /*
  122.  * ata_cdb struct
  123.  */
  124. union ata_cdb {
  125. struct {
  126. unsigned char SignatureByte0;
  127. unsigned char SignatureByte1;
  128. unsigned char ActionSelect;
  129. unsigned char RegisterSelect;
  130. unsigned char TransferBlockSize;
  131. unsigned char WriteData3F6;
  132. unsigned char WriteData1F1;
  133. unsigned char WriteData1F2;
  134. unsigned char WriteData1F3;
  135. unsigned char WriteData1F4;
  136. unsigned char WriteData1F5;
  137. unsigned char WriteData1F6;
  138. unsigned char WriteData1F7;
  139. unsigned char Reserved[3];
  140. } generic;
  141.         
  142. struct {
  143. unsigned char SignatureByte0;
  144. unsigned char SignatureByte1;
  145. unsigned char ActionSelect;
  146. unsigned char RegisterSelect;
  147. unsigned char TransferBlockSize;
  148. unsigned char AlternateStatusByte;
  149. unsigned char ErrorByte;
  150. unsigned char SectorCountByte;
  151. unsigned char SectorNumberByte;
  152. unsigned char CylinderLowByte;
  153. unsigned char CylinderHighByte;
  154. unsigned char DeviceHeadByte;
  155. unsigned char StatusByte;
  156. unsigned char Reserved[3];
  157. } read;
  158.         struct {
  159. unsigned char SignatureByte0;
  160. unsigned char SignatureByte1;
  161. unsigned char ActionSelect;
  162. unsigned char RegisterSelect;
  163. unsigned char TransferBlockSize;
  164. unsigned char DeviceControlByte;
  165. unsigned char FeaturesByte;
  166. unsigned char SectorCountByte;
  167. unsigned char SectorNumberByte;
  168. unsigned char CylinderLowByte;
  169. unsigned char CylinderHighByte;
  170. unsigned char DeviceHeadByte;
  171. unsigned char CommandByte;
  172. unsigned char Reserved[3];
  173. } write;
  174. };
  175. /*
  176.  * Inquiry data structure. This is the data returned from the target
  177.  * after it receives an inquiry.
  178.  *
  179.  * This structure may be extended by the number of bytes specified
  180.  * in the field AdditionalLength. The defined size constant only
  181.  * includes fields through ProductRevisionLevel.
  182.  */
  183. /*
  184.  * DeviceType field
  185.  */
  186. #define DIRECT_ACCESS_DEVICE            0x00    /* disks */
  187. #define DEVICE_REMOVABLE                0x80
  188. struct inquiry_data {
  189.     unsigned char DeviceType;
  190. unsigned char DeviceTypeModifier;
  191. unsigned char Versions;
  192. unsigned char Format; 
  193. unsigned char AdditionalLength;
  194. unsigned char Reserved[2];
  195. unsigned char Capability;
  196. unsigned char VendorId[8];
  197. unsigned char ProductId[16];
  198. unsigned char ProductRevisionLevel[4];
  199. unsigned char VendorSpecific[20];
  200. unsigned char Reserved3[40];
  201. } __attribute__ ((packed));
  202. /*
  203.  * INQUIRY data buffer size
  204.  */
  205. #define INQUIRYDATABUFFERSIZE 36
  206. /*
  207.  * ISD200 CONFIG data struct
  208.  */
  209. #define ATACFG_TIMING          0x0f
  210. #define ATACFG_ATAPI_RESET     0x10
  211. #define ATACFG_MASTER          0x20
  212. #define ATACFG_BLOCKSIZE       0xa0
  213. #define ATACFGE_LAST_LUN       0x07
  214. #define ATACFGE_DESC_OVERRIDE  0x08
  215. #define ATACFGE_STATE_SUSPEND  0x10
  216. #define ATACFGE_SKIP_BOOT      0x20
  217. #define ATACFGE_CONF_DESC2     0x40
  218. #define ATACFGE_INIT_STATUS    0x80
  219. #define CFG_CAPABILITY_SRST    0x01
  220. struct isd200_config {
  221.         unsigned char EventNotification;
  222.         unsigned char ExternalClock;
  223.         unsigned char ATAInitTimeout;
  224. unsigned char ATAConfig;
  225.         unsigned char ATAMajorCommand;
  226.         unsigned char ATAMinorCommand;
  227. unsigned char ATAExtraConfig;
  228. unsigned char Capability;
  229. }__attribute__ ((packed));
  230. /*
  231.  * ISD200 driver information struct
  232.  */
  233. struct isd200_info {
  234. struct inquiry_data InquiryData;
  235. struct hd_driveid drive;
  236. struct isd200_config ConfigData;
  237. unsigned char ATARegs[8];
  238. unsigned char DeviceHead;
  239. unsigned char DeviceFlags;
  240. /* maximum number of LUNs supported */
  241. unsigned char MaxLUNs;
  242. };
  243. /*
  244.  * Read Capacity Data - returned in Big Endian format
  245.  */
  246. struct read_capacity_data {
  247. unsigned long LogicalBlockAddress;
  248. unsigned long BytesPerBlock;
  249. };
  250. /*
  251.  * Read Block Limits Data - returned in Big Endian format
  252.  * This structure returns the maximum and minimum block
  253.  * size for a TAPE device.
  254.  */
  255. struct read_block_limits {
  256. unsigned char Reserved;
  257. unsigned char BlockMaximumSize[3];
  258. unsigned char BlockMinimumSize[2];
  259. };
  260. /*
  261.  * Sense Data Format
  262.  */
  263. #define SENSE_ERRCODE           0x7f
  264. #define SENSE_ERRCODE_VALID     0x80
  265. #define SENSE_FLAG_SENSE_KEY    0x0f
  266. #define SENSE_FLAG_BAD_LENGTH   0x20
  267. #define SENSE_FLAG_END_OF_MEDIA 0x40
  268. #define SENSE_FLAG_FILE_MARK    0x80
  269. struct sense_data {
  270. unsigned char ErrorCode;
  271. unsigned char SegmentNumber;
  272. unsigned char Flags;
  273.         unsigned char Information[4];
  274.         unsigned char AdditionalSenseLength;
  275.         unsigned char CommandSpecificInformation[4];
  276.         unsigned char AdditionalSenseCode;
  277.         unsigned char AdditionalSenseCodeQualifier;
  278.         unsigned char FieldReplaceableUnitCode;
  279.         unsigned char SenseKeySpecific[3];
  280. } __attribute__ ((packed));
  281. /*
  282.  * Default request sense buffer size
  283.  */
  284. #define SENSE_BUFFER_SIZE 18
  285. /***********************************************************************
  286.  * Helper routines
  287.  ***********************************************************************/
  288. /**************************************************************************
  289.  * isd200_build_sense
  290.  *                                                                         
  291.  *  Builds an artificial sense buffer to report the results of a 
  292.  *  failed command.
  293.  *                                                                       
  294.  * RETURNS:
  295.  *    void
  296.  */                                                                        
  297. void isd200_build_sense(struct us_data *us, Scsi_Cmnd *srb)
  298. {
  299.         struct isd200_info *info = (struct isd200_info *)us->extra;
  300.         struct sense_data *buf = (struct sense_data *) &srb->sense_buffer[0];
  301.         unsigned char error = info->ATARegs[IDE_ERROR_OFFSET];
  302. if(error & ATA_ERROR_MEDIA_CHANGE) {
  303. buf->ErrorCode = 0x70 | SENSE_ERRCODE_VALID;
  304. buf->AdditionalSenseLength = 0xb;
  305. buf->Flags = UNIT_ATTENTION;
  306. buf->AdditionalSenseCode = 0;
  307. buf->AdditionalSenseCodeQualifier = 0;
  308.         } else if(error & MCR_ERR) {
  309. buf->ErrorCode = 0x70 | SENSE_ERRCODE_VALID;
  310. buf->AdditionalSenseLength = 0xb;
  311. buf->Flags =  UNIT_ATTENTION;
  312. buf->AdditionalSenseCode = 0;
  313. buf->AdditionalSenseCodeQualifier = 0;
  314.         } else if(error & TRK0_ERR) {
  315. buf->ErrorCode = 0x70 | SENSE_ERRCODE_VALID;
  316. buf->AdditionalSenseLength = 0xb;
  317. buf->Flags =  NOT_READY;
  318. buf->AdditionalSenseCode = 0;
  319. buf->AdditionalSenseCodeQualifier = 0;
  320.         } else if(error & ECC_ERR) {
  321. buf->ErrorCode = 0x70 | SENSE_ERRCODE_VALID;
  322. buf->AdditionalSenseLength = 0xb;
  323. buf->Flags =  DATA_PROTECT;
  324. buf->AdditionalSenseCode = 0;
  325. buf->AdditionalSenseCodeQualifier = 0;
  326.         } else {
  327. buf->ErrorCode = 0;
  328. buf->AdditionalSenseLength = 0;
  329. buf->Flags =  0;
  330. buf->AdditionalSenseCode = 0;
  331. buf->AdditionalSenseCodeQualifier = 0;
  332.         }
  333. }
  334. /***********************************************************************
  335.  * Data transfer routines
  336.  ***********************************************************************/
  337. /**************************************************************************
  338.  * Transfer one SCSI scatter-gather buffer via bulk transfer
  339.  *
  340.  * Note that this function is necessary because we want the ability to
  341.  * use scatter-gather memory.  Good performance is achieved by a combination
  342.  * of scatter-gather and clustering (which makes each chunk bigger).
  343.  *
  344.  * Note that the lower layer will always retry when a NAK occurs, up to the
  345.  * timeout limit.  Thus we don't have to worry about it for individual
  346.  * packets.
  347.  */
  348. static int isd200_transfer_partial( struct us_data *us, 
  349.     unsigned char dataDirection,
  350.     char *buf, int length )
  351. {
  352.         int result;
  353.         int partial;
  354.         int pipe;
  355.         /* calculate the appropriate pipe information */
  356. if (dataDirection == SCSI_DATA_READ)
  357.                 pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
  358.         else
  359.                 pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
  360.         /* transfer the data */
  361.         US_DEBUGP("isd200_transfer_partial(): xfer %d bytesn", length);
  362.         result = usb_stor_bulk_msg(us, buf, pipe, length, &partial);
  363.         US_DEBUGP("usb_stor_bulk_msg() returned %d xferred %d/%dn",
  364.                   result, partial, length);
  365.         /* if we stall, we need to clear it before we go on */
  366.         if (result == -EPIPE) {
  367.                 US_DEBUGP("clearing endpoint halt for pipe 0x%xn", pipe);
  368.                 usb_stor_clear_halt(us, pipe);
  369.         }
  370.     
  371.         /* did we send all the data? */
  372.         if (partial == length) {
  373.                 US_DEBUGP("isd200_transfer_partial(): transfer completen");
  374.                 return ISD200_TRANSPORT_GOOD;
  375.         }
  376.         /* uh oh... we have an error code, so something went wrong. */
  377.         if (result) {
  378.                 /* NAK - that means we've retried a few times already */
  379.                 if (result == -ETIMEDOUT) {
  380.                         US_DEBUGP("isd200_transfer_partial(): device NAKedn");
  381.                         return ISD200_TRANSPORT_FAILED;
  382.                 }
  383.                 /* -ENOENT -- we canceled this transfer */
  384.                 if (result == -ENOENT) {
  385.                         US_DEBUGP("isd200_transfer_partial(): transfer abortedn");
  386.                         return ISD200_TRANSPORT_ABORTED;
  387.                 }
  388.                 /* the catch-all case */
  389.                 US_DEBUGP("isd200_transfer_partial(): unknown errorn");
  390.                 return ISD200_TRANSPORT_FAILED;
  391.         }
  392.         /* no error code, so we must have transferred some data, 
  393.          * just not all of it */
  394.         return ISD200_TRANSPORT_SHORT;
  395. }
  396. /**************************************************************************
  397.  * Transfer an entire SCSI command's worth of data payload over the bulk
  398.  * pipe.
  399.  *
  400.  * Note that this uses us_transfer_partial to achieve it's goals -- this
  401.  * function simply determines if we're going to use scatter-gather or not,
  402.  * and acts appropriately.  For now, it also re-interprets the error codes.
  403.  */
  404. static void isd200_transfer( struct us_data *us, Scsi_Cmnd *srb )
  405. {
  406.         int i;
  407.         int result = -1;
  408.         struct scatterlist *sg;
  409.         unsigned int total_transferred = 0;
  410.         unsigned int transfer_amount;
  411.         /* calculate how much we want to transfer */
  412. int dir = srb->sc_data_direction;
  413. srb->sc_data_direction = SCSI_DATA_WRITE;
  414.         transfer_amount = usb_stor_transfer_length(srb);
  415. srb->sc_data_direction = dir;
  416.         /* was someone foolish enough to request more data than available
  417.          * buffer space? */
  418.         if (transfer_amount > srb->request_bufflen)
  419.                 transfer_amount = srb->request_bufflen;
  420.         /* are we scatter-gathering? */
  421.         if (srb->use_sg) {
  422.                 /* loop over all the scatter gather structures and 
  423.                  * make the appropriate requests for each, until done
  424.                  */
  425.                 sg = (struct scatterlist *) srb->request_buffer;
  426.                 for (i = 0; i < srb->use_sg; i++) {
  427.                         /* transfer the lesser of the next buffer or the
  428.                          * remaining data */
  429.                         if (transfer_amount - total_transferred >= 
  430.                             sg[i].length) {
  431.                                 result = isd200_transfer_partial(us, 
  432.                                                                  srb->sc_data_direction,
  433.                                                                  sg[i].address, 
  434.                                                                  sg[i].length);
  435.                                 total_transferred += sg[i].length;
  436.                         } else
  437.                                 result = isd200_transfer_partial(us, 
  438.                                                                  srb->sc_data_direction,                            
  439.                                                                  sg[i].address,
  440.                                                                  transfer_amount - total_transferred);
  441.                         /* if we get an error, end the loop here */
  442.                         if (result)
  443.                                 break;
  444.                 }
  445.         }
  446.         else
  447.                 /* no scatter-gather, just make the request */
  448.                 result = isd200_transfer_partial(us, 
  449.                                                  srb->sc_data_direction,
  450.                                                  srb->request_buffer, 
  451.                                                  transfer_amount);
  452.         /* return the result in the data structure itself */
  453.         srb->result = result;
  454. }
  455. /***********************************************************************
  456.  * Transport routines
  457.  ***********************************************************************/
  458. /**************************************************************************
  459.  *  ISD200 Bulk Transport
  460.  *
  461.  * Note:  This routine was copied from the usb_stor_Bulk_transport routine
  462.  * located in the transport.c source file.  The scsi command is limited to
  463.  * only 12 bytes while the CDB for the ISD200 must be 16 bytes.
  464.  */
  465. int isd200_Bulk_transport( struct us_data *us, Scsi_Cmnd *srb, 
  466.                            union ata_cdb *AtaCdb, unsigned char AtaCdbLength )
  467. {
  468.         struct bulk_cb_wrap bcb;
  469.         struct bulk_cs_wrap bcs;
  470.         int result;
  471.         int pipe;
  472.         int partial;
  473.         unsigned int transfer_amount;
  474. int dir = srb->sc_data_direction;
  475. srb->sc_data_direction = SCSI_DATA_WRITE;
  476.         transfer_amount = usb_stor_transfer_length(srb);
  477. srb->sc_data_direction = dir;
  478.     
  479.         /* set up the command wrapper */
  480.         bcb.Signature = cpu_to_le32(US_BULK_CB_SIGN);
  481.         bcb.DataTransferLength = cpu_to_le32(transfer_amount);
  482.         bcb.Flags = srb->sc_data_direction == SCSI_DATA_READ ? 1 << 7 : 0;
  483.         bcb.Tag = srb->serial_number;
  484.         bcb.Lun = srb->cmnd[1] >> 5;
  485.         if (us->flags & US_FL_SCM_MULT_TARG)
  486.                 bcb.Lun |= srb->target << 4;
  487.         bcb.Length = AtaCdbLength;
  488.     
  489.         /* construct the pipe handle */
  490.         pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
  491.     
  492.         /* copy the command payload */
  493.         memset(bcb.CDB, 0, sizeof(bcb.CDB));
  494.         memcpy(bcb.CDB, AtaCdb, bcb.Length);
  495.     
  496.         /* send it to out endpoint */
  497.         US_DEBUGP("Bulk command S 0x%x T 0x%x Trg %d LUN %d L %d F %d CL %dn",
  498.                   le32_to_cpu(bcb.Signature), bcb.Tag,
  499.                   (bcb.Lun >> 4), (bcb.Lun & 0xFF), 
  500.                   le32_to_cpu(bcb.DataTransferLength), bcb.Flags, bcb.Length);
  501.         result = usb_stor_bulk_msg(us, &bcb, pipe, US_BULK_CB_WRAP_LEN, 
  502.    &partial);
  503.         US_DEBUGP("Bulk command transfer result=%dn", result);
  504.     
  505. if (result == -ENOENT)
  506. return ISD200_TRANSPORT_ABORTED;
  507. else if (result == -EPIPE) {
  508. /* if we stall, we need to clear it before we go on */
  509.                 US_DEBUGP("clearing endpoint halt for pipe 0x%xn", pipe);
  510.                 usb_stor_clear_halt(us, pipe);
  511. } else if (result)  
  512.                 return ISD200_TRANSPORT_ERROR;
  513.     
  514.         /* if the command transfered well, then we go to the data stage */
  515.         if (!result && bcb.DataTransferLength) {
  516. isd200_transfer(us, srb);
  517. US_DEBUGP("Bulk data transfer result 0x%xn", srb->result);
  518. if (srb->result == ISD200_TRANSPORT_ABORTED)
  519. return ISD200_TRANSPORT_ABORTED;
  520.         }
  521.     
  522.         /* See flow chart on pg 15 of the Bulk Only Transport spec for
  523.          * an explanation of how this code works.
  524.          */
  525.     
  526.         /* construct the pipe handle */
  527.         pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
  528.     
  529.         /* get CSW for device status */
  530.         US_DEBUGP("Attempting to get CSW...n");
  531.         result = usb_stor_bulk_msg(us, &bcs, pipe, US_BULK_CS_WRAP_LEN, 
  532.    &partial);
  533.         if (result == -ENOENT)
  534.                 return ISD200_TRANSPORT_ABORTED;
  535.         /* did the attempt to read the CSW fail? */
  536.         if (result == -EPIPE) {
  537.                 US_DEBUGP("clearing endpoint halt for pipe 0x%xn", pipe);
  538.                 usb_stor_clear_halt(us, pipe);
  539.            
  540.                 /* get the status again */
  541.                 US_DEBUGP("Attempting to get CSW (2nd try)...n");
  542.                 result = usb_stor_bulk_msg(us, &bcs, pipe,
  543.                                            US_BULK_CS_WRAP_LEN, &partial);
  544.                 /* if the command was aborted, indicate that */
  545.                 if (result == -ENOENT)
  546.                         return ISD200_TRANSPORT_ABORTED;
  547.         
  548.                 /* if it fails again, we need a reset and return an error*/
  549.                 if (result == -EPIPE) {
  550.                         US_DEBUGP("clearing halt for pipe 0x%xn", pipe);
  551.                         usb_stor_clear_halt(us, pipe);
  552.                         return ISD200_TRANSPORT_ERROR;
  553.                 }
  554.         }
  555.     
  556.         /* if we still have a failure at this point, we're in trouble */
  557.         US_DEBUGP("Bulk status result = %dn", result);
  558.         if (result)
  559.                 return ISD200_TRANSPORT_ERROR;
  560.     
  561.         /* check bulk status */
  562.         US_DEBUGP("Bulk status Sig 0x%x T 0x%x R %d Stat 0x%xn",
  563.                   le32_to_cpu(bcs.Signature), bcs.Tag, 
  564.                   bcs.Residue, bcs.Status);
  565.         if (bcs.Signature != cpu_to_le32(US_BULK_CS_SIGN) || 
  566.             bcs.Tag != bcb.Tag || 
  567.             bcs.Status > US_BULK_STAT_PHASE || partial != 13) {
  568.                 US_DEBUGP("Bulk logical errorn");
  569.                 return ISD200_TRANSPORT_ERROR;
  570.         }
  571.     
  572.         /* based on the status code, we report good or bad */
  573.         switch (bcs.Status) {
  574.         case US_BULK_STAT_OK:
  575.                 /* command good -- note that we could be short on data */
  576.                 return ISD200_TRANSPORT_GOOD;
  577.         case US_BULK_STAT_FAIL:
  578.                 /* command failed */
  579.                 return ISD200_TRANSPORT_FAILED;
  580.         
  581.         case US_BULK_STAT_PHASE:
  582.                 /* phase error */
  583.                 usb_stor_Bulk_reset(us);
  584.                 return ISD200_TRANSPORT_ERROR;
  585.         }
  586.     
  587.         /* we should never get here, but if we do, we're in trouble */
  588.         return ISD200_TRANSPORT_ERROR;
  589. }
  590. /**************************************************************************
  591.  *  isd200_action
  592.  *
  593.  * Routine for sending commands to the isd200
  594.  *
  595.  * RETURNS:
  596.  *    ISD status code
  597.  */
  598. static int isd200_action( struct us_data *us, int action, 
  599.   void* pointer, int value )
  600. {
  601. union ata_cdb ata;
  602. struct scsi_cmnd srb;
  603. struct isd200_info *info = (struct isd200_info *)us->extra;
  604. int status;
  605. memset(&ata, 0, sizeof(ata));
  606. memset(&srb, 0, sizeof(srb));
  607. ata.generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  608. ata.generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  609. ata.generic.TransferBlockSize = 1;
  610. switch ( action ) {
  611. case ACTION_READ_STATUS:
  612. US_DEBUGP("   isd200_action(READ_STATUS)n");
  613. ata.generic.ActionSelect = ACTION_SELECT_0|ACTION_SELECT_2;
  614. ata.generic.RegisterSelect =
  615.   REG_CYLINDER_LOW | REG_CYLINDER_HIGH |
  616.   REG_STATUS | REG_ERROR;
  617. srb.sc_data_direction = SCSI_DATA_READ;
  618. srb.request_buffer = pointer;
  619. srb.request_bufflen = value;
  620. break;
  621. case ACTION_ENUM:
  622. US_DEBUGP("   isd200_action(ENUM,0x%02x)n",value);
  623. ata.generic.ActionSelect = ACTION_SELECT_1|ACTION_SELECT_2|
  624.                    ACTION_SELECT_3|ACTION_SELECT_4|
  625.                            ACTION_SELECT_5;
  626. ata.generic.RegisterSelect = REG_DEVICE_HEAD;
  627. ata.write.DeviceHeadByte = value;
  628. srb.sc_data_direction = SCSI_DATA_NONE;
  629. break;
  630. case ACTION_RESET:
  631. US_DEBUGP("   isd200_action(RESET)n");
  632. ata.generic.ActionSelect = ACTION_SELECT_1|ACTION_SELECT_2|
  633.                    ACTION_SELECT_3|ACTION_SELECT_4;
  634. ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
  635. ata.write.DeviceControlByte = ATA_DC_RESET_CONTROLLER;
  636. srb.sc_data_direction = SCSI_DATA_NONE;
  637. break;
  638. case ACTION_REENABLE:
  639. US_DEBUGP("   isd200_action(REENABLE)n");
  640. ata.generic.ActionSelect = ACTION_SELECT_1|ACTION_SELECT_2|
  641.                    ACTION_SELECT_3|ACTION_SELECT_4;
  642. ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
  643. ata.write.DeviceControlByte = ATA_DC_REENABLE_CONTROLLER;
  644. srb.sc_data_direction = SCSI_DATA_NONE;
  645. break;
  646. case ACTION_SOFT_RESET:
  647. US_DEBUGP("   isd200_action(SOFT_RESET)n");
  648. ata.generic.ActionSelect = ACTION_SELECT_1|ACTION_SELECT_5;
  649. ata.generic.RegisterSelect = REG_DEVICE_HEAD | REG_COMMAND;
  650. ata.write.DeviceHeadByte = info->DeviceHead;
  651. ata.write.CommandByte = WIN_SRST;
  652. srb.sc_data_direction = SCSI_DATA_NONE;
  653. break;
  654. case ACTION_IDENTIFY:
  655. US_DEBUGP("   isd200_action(IDENTIFY)n");
  656. ata.generic.RegisterSelect = REG_COMMAND;
  657. ata.write.CommandByte = WIN_IDENTIFY;
  658. srb.sc_data_direction = SCSI_DATA_READ;
  659. srb.request_buffer = (void *)&info->drive;
  660. srb.request_bufflen = sizeof(struct hd_driveid);
  661. break;
  662. default:
  663. US_DEBUGP("Error: Undefined action %dn",action);
  664. break;
  665. }
  666. status = isd200_Bulk_transport(us, &srb, &ata, sizeof(ata.generic));
  667. if (status != ISD200_TRANSPORT_GOOD) {
  668. US_DEBUGP("   isd200_action(0x%02x) error: %dn",action,status);
  669. status = ISD200_ERROR;
  670. /* need to reset device here */
  671. }
  672. return status;
  673. }
  674. /**************************************************************************
  675.  * isd200_read_regs
  676.  *                                                                         
  677.  * Read ATA Registers
  678.  *
  679.  * RETURNS:
  680.  *    ISD status code
  681.  */                                                                        
  682. int isd200_read_regs( struct us_data *us )
  683. {
  684. struct isd200_info *info = (struct isd200_info *)us->extra;
  685. int retStatus = ISD200_GOOD;
  686. int transferStatus;
  687. US_DEBUGP("Entering isd200_IssueATAReadRegsn");
  688. transferStatus = isd200_action( us, ACTION_READ_STATUS,
  689.     info->ATARegs, sizeof(info->ATARegs) );
  690. if (transferStatus != ISD200_TRANSPORT_GOOD) {
  691. US_DEBUGP("   Error reading ATA registersn");
  692. retStatus = ISD200_ERROR;
  693.         } else {
  694. US_DEBUGP("   Got ATA Register[IDE_ERROR_OFFSET] = 0x%xn", 
  695.   info->ATARegs[IDE_ERROR_OFFSET]);
  696.         }
  697. return retStatus;
  698. }
  699. /**************************************************************************
  700.  * Invoke the transport and basic error-handling/recovery methods
  701.  *
  702.  * This is used by the protocol layers to actually send the message to
  703.  * the device and receive the response.
  704.  */
  705. void isd200_invoke_transport( struct us_data *us, 
  706.       Scsi_Cmnd *srb, 
  707.       union ata_cdb *ataCdb )
  708. {
  709. int need_auto_sense = 0;
  710. int transferStatus;
  711. /* send the command to the transport layer */
  712. transferStatus = isd200_Bulk_transport(us, srb, ataCdb,
  713.        sizeof(ataCdb->generic));
  714. switch (transferStatus) {
  715. case ISD200_TRANSPORT_GOOD:
  716. /* Indicate a good result */
  717. srb->result = GOOD;
  718. break;
  719. case ISD200_TRANSPORT_ABORTED:
  720. /* if the command gets aborted by the higher layers, we need to
  721.  * short-circuit all other processing
  722.  */
  723. US_DEBUGP("-- transport indicates command was abortedn");
  724. srb->result = DID_ABORT << 16;
  725. break;
  726. case ISD200_TRANSPORT_FAILED:
  727. US_DEBUGP("-- transport indicates command failuren");
  728. need_auto_sense = 1;
  729. break;
  730. case ISD200_TRANSPORT_ERROR:
  731. US_DEBUGP("-- transport indicates transport failuren");
  732. srb->result = DID_ERROR << 16;
  733. break;
  734. case ISD200_TRANSPORT_SHORT:
  735. if (!((srb->cmnd[0] == REQUEST_SENSE) ||
  736.       (srb->cmnd[0] == INQUIRY) ||
  737.       (srb->cmnd[0] == MODE_SENSE) ||
  738.       (srb->cmnd[0] == LOG_SENSE) ||
  739.       (srb->cmnd[0] == MODE_SENSE_10))) {
  740. US_DEBUGP("-- unexpectedly short transfern");
  741. need_auto_sense = 1;
  742. }
  743. break;
  744.     
  745. default:
  746. US_DEBUGP("-- transport indicates unknown failuren");   
  747. srb->result = DID_ERROR << 16;
  748.        
  749. }
  750. if (need_auto_sense)
  751. if (isd200_read_regs(us) == ISD200_GOOD)
  752. isd200_build_sense(us, srb);
  753. /* Regardless of auto-sense, if we _know_ we have an error
  754.  * condition, show that in the result code
  755.  */
  756. if (transferStatus == ISD200_TRANSPORT_FAILED)
  757. srb->result = CHECK_CONDITION;
  758. }
  759. #ifdef CONFIG_USB_STORAGE_DEBUG
  760. static void isd200_log_config( struct isd200_info* info )
  761. {
  762. US_DEBUGP("      Event Notification: 0x%xn", 
  763.   info->ConfigData.EventNotification);
  764. US_DEBUGP("      External Clock: 0x%xn", 
  765.   info->ConfigData.ExternalClock);
  766. US_DEBUGP("      ATA Init Timeout: 0x%xn", 
  767.   info->ConfigData.ATAInitTimeout);
  768. US_DEBUGP("      ATAPI Command Block Size: 0x%xn", 
  769.   (info->ConfigData.ATAConfig & ATACFG_BLOCKSIZE) >> 6);
  770. US_DEBUGP("      Master/Slave Selection: 0x%xn", 
  771.   info->ConfigData.ATAConfig & ATACFG_MASTER);
  772. US_DEBUGP("      ATAPI Reset: 0x%xn",
  773.   info->ConfigData.ATAConfig & ATACFG_ATAPI_RESET);
  774. US_DEBUGP("      ATA Timing: 0x%xn",
  775.   info->ConfigData.ATAConfig & ATACFG_TIMING);
  776. US_DEBUGP("      ATA Major Command: 0x%xn", 
  777.   info->ConfigData.ATAMajorCommand);
  778. US_DEBUGP("      ATA Minor Command: 0x%xn", 
  779.   info->ConfigData.ATAMinorCommand);
  780. US_DEBUGP("      Init Status: 0x%xn", 
  781.   info->ConfigData.ATAExtraConfig & ATACFGE_INIT_STATUS);
  782. US_DEBUGP("      Config Descriptor 2: 0x%xn", 
  783.   info->ConfigData.ATAExtraConfig & ATACFGE_CONF_DESC2);
  784. US_DEBUGP("      Skip Device Boot: 0x%xn",
  785.   info->ConfigData.ATAExtraConfig & ATACFGE_SKIP_BOOT);
  786. US_DEBUGP("      ATA 3 State Supsend: 0x%xn",
  787.   info->ConfigData.ATAExtraConfig & ATACFGE_STATE_SUSPEND);
  788. US_DEBUGP("      Descriptor Override: 0x%xn", 
  789.   info->ConfigData.ATAExtraConfig & ATACFGE_DESC_OVERRIDE);
  790. US_DEBUGP("      Last LUN Identifier: 0x%xn",
  791.   info->ConfigData.ATAExtraConfig & ATACFGE_LAST_LUN);
  792. US_DEBUGP("      SRST Enable: 0x%xn", 
  793.   info->ConfigData.ATAExtraConfig & CFG_CAPABILITY_SRST);
  794. }
  795. #endif
  796. /**************************************************************************
  797.  * isd200_write_config
  798.  *                                                                         
  799.  * Write the ISD200 Configuraton data
  800.  *
  801.  * RETURNS:
  802.  *    ISD status code
  803.  */                                                                        
  804. int isd200_write_config( struct us_data *us ) 
  805. {
  806. struct isd200_info *info = (struct isd200_info *)us->extra;
  807. int retStatus = ISD200_GOOD;
  808. int result;
  809. #ifdef CONFIG_USB_STORAGE_DEBUG
  810. US_DEBUGP("Entering isd200_write_confign");
  811. US_DEBUGP("   Writing the following ISD200 Config Data:n");
  812. isd200_log_config(info);
  813. #endif
  814. /* let's send the command via the control pipe */
  815. result = usb_stor_control_msg(
  816.                 us, 
  817.                 usb_sndctrlpipe(us->pusb_dev,0),
  818.                 0x01, 
  819.                 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
  820.                 0x0000, 
  821.                 0x0002, 
  822.                 (void *) &info->ConfigData, 
  823.                 sizeof(info->ConfigData));
  824. if (result >= 0) {
  825. US_DEBUGP("   ISD200 Config Data was written successfullyn");
  826.         } else {
  827. US_DEBUGP("   Request to write ISD200 Config Data failed!n");
  828. /* STALL must be cleared when they are detected */
  829. if (result == -EPIPE) {
  830. US_DEBUGP("-- Stall on control pipe. Clearingn");
  831. result = usb_stor_clear_halt(us,
  832. usb_sndctrlpipe(us->pusb_dev, 0));
  833. US_DEBUGP("-- usb_stor_clear_halt() returns %dn", result);
  834. }
  835. retStatus = ISD200_ERROR;
  836.         }
  837. US_DEBUGP("Leaving isd200_write_config %08Xn", retStatus);
  838. return retStatus;
  839. }
  840. /**************************************************************************
  841.  * isd200_read_config
  842.  *                                                                         
  843.  * Reads the ISD200 Configuraton data
  844.  *
  845.  * RETURNS:
  846.  *    ISD status code
  847.  */                                                                        
  848. int isd200_read_config( struct us_data *us ) 
  849. {
  850. struct isd200_info *info = (struct isd200_info *)us->extra;
  851. int retStatus = ISD200_GOOD;
  852. int result;
  853. US_DEBUGP("Entering isd200_read_confign");
  854. /* read the configuration information from ISD200.  Use this to */
  855. /* determine what the special ATA CDB bytes are.                */
  856. result = usb_stor_control_msg(
  857.                 us, 
  858.                 usb_rcvctrlpipe(us->pusb_dev,0),
  859.                 0x02, 
  860.                 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
  861.                 0x0000, 
  862.                 0x0002, 
  863.                 (void *) &info->ConfigData, 
  864.                 sizeof(info->ConfigData));
  865. if (result >= 0) {
  866. US_DEBUGP("   Retrieved the following ISD200 Config Data:n");
  867. #ifdef CONFIG_USB_STORAGE_DEBUG
  868. isd200_log_config(info);
  869. #endif
  870.         } else {
  871. US_DEBUGP("   Request to get ISD200 Config Data failed!n");
  872. /* STALL must be cleared when they are detected */
  873. if (result == -EPIPE) {
  874. US_DEBUGP("-- Stall on control pipe. Clearingn");
  875. result = usb_stor_clear_halt(us,   
  876. usb_sndctrlpipe(us->pusb_dev, 0));
  877. US_DEBUGP("-- usb_stor_clear_halt() returns %dn", result);
  878. }
  879. retStatus = ISD200_ERROR;
  880.         }
  881. US_DEBUGP("Leaving isd200_read_config %08Xn", retStatus);
  882. return retStatus;
  883. }
  884. /**************************************************************************
  885.  * isd200_atapi_soft_reset
  886.  *                                                                         
  887.  * Perform an Atapi Soft Reset on the device
  888.  *
  889.  * RETURNS:
  890.  *    NT status code
  891.  */                                                                        
  892. int isd200_atapi_soft_reset( struct us_data *us ) 
  893. {
  894. int retStatus = ISD200_GOOD;
  895. int transferStatus;
  896. US_DEBUGP("Entering isd200_atapi_soft_resetn");
  897. transferStatus = isd200_action( us, ACTION_SOFT_RESET, NULL, 0 );
  898. if (transferStatus != ISD200_TRANSPORT_GOOD) {
  899. US_DEBUGP("   Error issuing Atapi Soft Resetn");
  900. retStatus = ISD200_ERROR;
  901.         }
  902. US_DEBUGP("Leaving isd200_atapi_soft_reset %08Xn", retStatus);
  903. return retStatus;
  904. }
  905. /**************************************************************************
  906.  * isd200_srst
  907.  *                                                                         
  908.  * Perform an SRST on the device
  909.  *
  910.  * RETURNS:
  911.  *    ISD status code
  912.  */                                                                        
  913. int isd200_srst( struct us_data *us ) 
  914. {
  915. int retStatus = ISD200_GOOD;
  916. int transferStatus;
  917. US_DEBUGP("Entering isd200_SRSTn");
  918. transferStatus = isd200_action( us, ACTION_RESET, NULL, 0 );
  919. /* check to see if this request failed */
  920. if (transferStatus != ISD200_TRANSPORT_GOOD) {
  921. US_DEBUGP("   Error issuing SRSTn");
  922. retStatus = ISD200_ERROR;
  923.         } else {
  924. /* delay 10ms to give the drive a chance to see it */
  925. wait_ms(10);
  926. transferStatus = isd200_action( us, ACTION_REENABLE, NULL, 0 );
  927. if (transferStatus != ISD200_TRANSPORT_GOOD) {
  928. US_DEBUGP("   Error taking drive out of resetn");
  929. retStatus = ISD200_ERROR;
  930. } else {
  931. /* delay 50ms to give the drive a chance to recover after SRST */
  932. wait_ms(50);
  933. }
  934.         }
  935. US_DEBUGP("Leaving isd200_srst %08Xn", retStatus);
  936. return retStatus;
  937. }
  938. /**************************************************************************
  939.  * isd200_try_enum
  940.  *                                                                         
  941.  * Helper function for isd200_manual_enum(). Does ENUM and READ_STATUS
  942.  * and tries to analyze the status registers
  943.  *
  944.  * RETURNS:
  945.  *    ISD status code
  946.  */                                                                        
  947. static int isd200_try_enum(struct us_data *us, unsigned char master_slave,
  948.    int detect )
  949. {
  950. int status = ISD200_GOOD;
  951. unsigned char regs[8];
  952. unsigned long endTime;
  953. struct isd200_info *info = (struct isd200_info *)us->extra;
  954. int recheckAsMaster = FALSE;
  955. if ( detect )
  956. endTime = jiffies + ISD200_ENUM_DETECT_TIMEOUT * HZ;
  957. else
  958. endTime = jiffies + ISD200_ENUM_BSY_TIMEOUT * HZ;
  959. /* loop until we detect !BSY or timeout */
  960. while(TRUE) {
  961. #ifdef CONFIG_USB_STORAGE_DEBUG
  962. char* mstr = master_slave == ATA_ADDRESS_DEVHEAD_STD ?
  963. "Master" : "Slave";
  964. #endif
  965. status = isd200_action( us, ACTION_ENUM, NULL, master_slave );
  966. if ( status != ISD200_GOOD )
  967. break;
  968. status = isd200_action( us, ACTION_READ_STATUS, 
  969. regs, sizeof(regs) );
  970. if ( status != ISD200_GOOD )
  971. break;
  972. if (!detect) {
  973. if (regs[IDE_STATUS_OFFSET] & BUSY_STAT ) {
  974. US_DEBUGP("   %s status is still BSY, try again...n",mstr);
  975. } else {
  976. US_DEBUGP("   %s status !BSY, continue with next operationn",mstr);
  977. break;
  978. }
  979. }
  980. /* check for BUSY_STAT and */
  981. /* WRERR_STAT (workaround ATA Zip drive) and */ 
  982. /* ERR_STAT (workaround for Archos CD-ROM) */
  983. else if (regs[IDE_STATUS_OFFSET] & 
  984.  (BUSY_STAT | WRERR_STAT | ERR_STAT )) {
  985. US_DEBUGP("   Status indicates it is not ready, try again...n");
  986. }
  987. /* check for DRDY, ATA devices set DRDY after SRST */
  988. else if (regs[IDE_STATUS_OFFSET] & READY_STAT) {
  989. US_DEBUGP("   Identified ATA devicen");
  990. info->DeviceFlags |= DF_ATA_DEVICE;
  991. info->DeviceHead = master_slave;
  992. break;
  993. /* check Cylinder High/Low to
  994.    determine if it is an ATAPI device
  995. */
  996. else if ((regs[IDE_HCYL_OFFSET] == 0xEB) &&
  997.  (regs[IDE_LCYL_OFFSET] == 0x14)) {
  998. /* It seems that the RICOH 
  999.    MP6200A CD/RW drive will 
  1000.    report itself okay as a
  1001.    slave when it is really a
  1002.    master. So this check again
  1003.    as a master device just to
  1004.    make sure it doesn't report
  1005.    itself okay as a master also
  1006. */
  1007. if ((master_slave & ATA_ADDRESS_DEVHEAD_SLAVE) &&
  1008.     (recheckAsMaster == FALSE)) {
  1009. US_DEBUGP("   Identified ATAPI device as slave.  Rechecking again as mastern");
  1010. recheckAsMaster = TRUE;
  1011. master_slave = ATA_ADDRESS_DEVHEAD_STD;
  1012. } else {
  1013. US_DEBUGP("   Identified ATAPI devicen");
  1014. info->DeviceHead = master_slave;
  1015.       
  1016. status = isd200_atapi_soft_reset(us);
  1017. break;
  1018. }
  1019. } else {
  1020.   US_DEBUGP("   Not ATA, not ATAPI. Weird.n");
  1021. break;
  1022. }
  1023. /* check for timeout on this request */
  1024. if (time_after_eq(jiffies, endTime)) {
  1025. if (!detect)
  1026. US_DEBUGP("   BSY check timeout, just continue with next operation...n");
  1027. else
  1028. US_DEBUGP("   Device detect timeout!n");
  1029. break;
  1030. }
  1031. }
  1032. return status;
  1033. }
  1034. /**************************************************************************
  1035.  * isd200_manual_enum
  1036.  *                                                                         
  1037.  * Determines if the drive attached is an ATA or ATAPI and if it is a
  1038.  * master or slave.
  1039.  *
  1040.  * RETURNS:
  1041.  *    ISD status code
  1042.  */                                                                        
  1043. int isd200_manual_enum(struct us_data *us)
  1044. {
  1045. struct isd200_info *info = (struct isd200_info *)us->extra;
  1046. int retStatus = ISD200_GOOD;
  1047. US_DEBUGP("Entering isd200_manual_enumn");
  1048. retStatus = isd200_read_config(us);
  1049. if (retStatus == ISD200_GOOD) {
  1050. int isslave;
  1051. /* master or slave? */
  1052. retStatus = isd200_try_enum( us, ATA_ADDRESS_DEVHEAD_STD, FALSE );
  1053. if (retStatus == ISD200_GOOD)
  1054. retStatus = isd200_try_enum( us, ATA_ADDRESS_DEVHEAD_SLAVE, FALSE );
  1055. if (retStatus == ISD200_GOOD) {
  1056. retStatus = isd200_srst(us);
  1057. if (retStatus == ISD200_GOOD)
  1058. /* ata or atapi? */
  1059. retStatus = isd200_try_enum( us, ATA_ADDRESS_DEVHEAD_STD, TRUE );
  1060. }
  1061. isslave = (info->DeviceHead & ATA_ADDRESS_DEVHEAD_SLAVE) ? 1 : 0;
  1062. if (!(info->ConfigData.ATAConfig & ATACFG_MASTER)) {
  1063. US_DEBUGP("   Setting Master/Slave selection to %dn", isslave);
  1064. info->ConfigData.ATAConfig &= 0x3f;
  1065. info->ConfigData.ATAConfig |= (isslave<<6);
  1066. retStatus = isd200_write_config(us);
  1067. }
  1068. }
  1069. US_DEBUGP("Leaving isd200_manual_enum %08Xn", retStatus);
  1070. return(retStatus);
  1071. }
  1072. /**************************************************************************
  1073.  * isd200_get_inquiry_data
  1074.  *
  1075.  * Get inquiry data
  1076.  *
  1077.  * RETURNS:
  1078.  *    ISD status code
  1079.  */
  1080. int isd200_get_inquiry_data( struct us_data *us )
  1081. {
  1082. struct isd200_info *info = (struct isd200_info *)us->extra;
  1083. int retStatus = ISD200_GOOD;
  1084. US_DEBUGP("Entering isd200_get_inquiry_datan");
  1085. /* set default to Master */
  1086. info->DeviceHead = ATA_ADDRESS_DEVHEAD_STD;
  1087. /* attempt to manually enumerate this device */
  1088. retStatus = isd200_manual_enum(us);
  1089. if (retStatus == ISD200_GOOD) {
  1090. int transferStatus;
  1091. /* check for an ATA device */
  1092. if (info->DeviceFlags & DF_ATA_DEVICE) {
  1093. /* this must be an ATA device */
  1094. /* perform an ATA Commmand Identify */
  1095. transferStatus = isd200_action( us, ACTION_IDENTIFY,
  1096. &info->drive, 
  1097. sizeof(struct hd_driveid) );
  1098. if (transferStatus != ISD200_TRANSPORT_GOOD) {
  1099. /* Error issuing ATA Command Identify */
  1100. US_DEBUGP("   Error issuing ATA Command Identifyn");
  1101. retStatus = ISD200_ERROR;
  1102. } else {
  1103. /* ATA Command Identify successful */
  1104. int i;
  1105. __u16 *src, *dest;
  1106. ide_fix_driveid(&info->drive);
  1107. US_DEBUGP("   Identify Data Structure:n");
  1108. US_DEBUGP("      config = 0x%xn", info->drive.config);
  1109. US_DEBUGP("      cyls = 0x%xn", info->drive.cyls);
  1110. US_DEBUGP("      heads = 0x%xn", info->drive.heads);
  1111. US_DEBUGP("      track_bytes = 0x%xn", info->drive.track_bytes);
  1112. US_DEBUGP("      sector_bytes = 0x%xn", info->drive.sector_bytes);
  1113. US_DEBUGP("      sectors = 0x%xn", info->drive.sectors);
  1114. US_DEBUGP("      serial_no[0] = 0x%xn", info->drive.serial_no[0]);
  1115. US_DEBUGP("      buf_type = 0x%xn", info->drive.buf_type);
  1116. US_DEBUGP("      buf_size = 0x%xn", info->drive.buf_size);
  1117. US_DEBUGP("      ecc_bytes = 0x%xn", info->drive.ecc_bytes);
  1118. US_DEBUGP("      fw_rev[0] = 0x%xn", info->drive.fw_rev[0]);
  1119. US_DEBUGP("      model[0] = 0x%xn", info->drive.model[0]);
  1120. US_DEBUGP("      max_multsect = 0x%xn", info->drive.max_multsect);
  1121. US_DEBUGP("      dword_io = 0x%xn", info->drive.dword_io);
  1122. US_DEBUGP("      capability = 0x%xn", info->drive.capability);
  1123. US_DEBUGP("      tPIO = 0x%xn", info->drive.tPIO);
  1124. US_DEBUGP("      tDMA = 0x%xn", info->drive.tDMA);
  1125. US_DEBUGP("      field_valid = 0x%xn", info->drive.field_valid);
  1126. US_DEBUGP("      cur_cyls = 0x%xn", info->drive.cur_cyls);
  1127. US_DEBUGP("      cur_heads = 0x%xn", info->drive.cur_heads);
  1128. US_DEBUGP("      cur_sectors = 0x%xn", info->drive.cur_sectors);
  1129. US_DEBUGP("      cur_capacity = 0x%xn", (info->drive.cur_capacity1 << 16) + info->drive.cur_capacity0 );
  1130. US_DEBUGP("      multsect = 0x%xn", info->drive.multsect);
  1131. US_DEBUGP("      lba_capacity = 0x%xn", info->drive.lba_capacity);
  1132. US_DEBUGP("      command_set_1 = 0x%xn", info->drive.command_set_1);
  1133. US_DEBUGP("      command_set_2 = 0x%xn", info->drive.command_set_2);
  1134. memset(&info->InquiryData, 0, sizeof(info->InquiryData));
  1135. /* Standard IDE interface only supports disks */
  1136. info->InquiryData.DeviceType = DIRECT_ACCESS_DEVICE;
  1137. /* Fix-up the return data from an INQUIRY command to show 
  1138.  * ANSI SCSI rev 2 so we don't confuse the SCSI layers above us
  1139.  * in Linux.
  1140.  */
  1141. info->InquiryData.Versions = 0x2;
  1142. /* The length must be at least 36 (5 + 31) */
  1143. info->InquiryData.AdditionalLength = 0x1F;
  1144. if (info->drive.command_set_1 & COMMANDSET_MEDIA_STATUS) {
  1145. /* set the removable bit */
  1146. info->InquiryData.DeviceTypeModifier = DEVICE_REMOVABLE;
  1147. info->DeviceFlags |= DF_REMOVABLE_MEDIA;
  1148. }
  1149. /* Fill in vendor identification fields */
  1150. src = (__u16*)info->drive.model;
  1151. dest = (__u16*)info->InquiryData.VendorId;
  1152. for (i=0;i<4;i++)
  1153. dest[i] = be16_to_cpu(src[i]);
  1154. src = (__u16*)(info->drive.model+8);
  1155. dest = (__u16*)info->InquiryData.ProductId;
  1156. for (i=0;i<8;i++)
  1157. dest[i] = be16_to_cpu(src[i]);
  1158. src = (__u16*)info->drive.fw_rev;
  1159. dest = (__u16*)info->InquiryData.ProductRevisionLevel;
  1160. for (i=0;i<2;i++)
  1161. dest[i] = be16_to_cpu(src[i]);
  1162. /* determine if it supports Media Status Notification */
  1163. if (info->drive.command_set_2 & COMMANDSET_MEDIA_STATUS) {
  1164. US_DEBUGP("   Device supports Media Status Notificationn");
  1165. /* Indicate that it is enabled, even though it is not
  1166.  * This allows the lock/unlock of the media to work
  1167.  * correctly.
  1168.  */
  1169. info->DeviceFlags |= DF_MEDIA_STATUS_ENABLED;
  1170. }
  1171. else
  1172. info->DeviceFlags &= ~DF_MEDIA_STATUS_ENABLED;
  1173. }
  1174. } else {
  1175. /* 
  1176.  * this must be an ATAPI device 
  1177.  * use an ATAPI protocol (Transparent SCSI)
  1178.  */
  1179. us->protocol_name = "Transparent SCSI";
  1180. us->proto_handler = usb_stor_transparent_scsi_command;
  1181. US_DEBUGP("Protocol changed to: %sn", us->protocol_name);
  1182.             
  1183. /* Free driver structure */            
  1184. if (us->extra != NULL) {
  1185. kfree(us->extra);
  1186. us->extra = NULL;
  1187. us->extra_destructor = NULL;
  1188. }
  1189. }
  1190.         }
  1191. US_DEBUGP("Leaving isd200_get_inquiry_data %08Xn", retStatus);
  1192. return(retStatus);
  1193. }
  1194. /**************************************************************************
  1195.  * isd200_data_copy
  1196.  *                                                                         
  1197.  * Copy data into the srb request buffer.  Use scatter gather if required.
  1198.  *
  1199.  * RETURNS:
  1200.  *    void
  1201.  */                                                                        
  1202. void isd200_data_copy(Scsi_Cmnd *srb, char * src, int length)
  1203. {
  1204. unsigned int len = length;
  1205. struct scatterlist *sg;
  1206. if (srb->use_sg) {
  1207. int i;
  1208. unsigned int total = 0;
  1209. /* Add up the sizes of all the sg segments */
  1210. sg = (struct scatterlist *) srb->request_buffer;
  1211. for (i = 0; i < srb->use_sg; i++)
  1212. total += sg[i].length;
  1213. if (length > total)
  1214. len = total;
  1215. total = 0;
  1216. /* Copy data into sg buffer(s) */
  1217. for (i = 0; i < srb->use_sg; i++) {
  1218. if ((len > total) && (len > 0)) {
  1219. /* transfer the lesser of the next buffer or the
  1220.  * remaining data */
  1221. if (len - total >= sg[i].length) {
  1222. memcpy(sg[i].address, src + total, sg[i].length);
  1223. total += sg[i].length;
  1224. } else {
  1225. memcpy(sg[i].address, src + total, len - total);
  1226. total = len;
  1227. }
  1228. else
  1229. break;
  1230. }
  1231. } else {
  1232. /* Make sure length does not exceed buffer length */
  1233. if (length > srb->request_bufflen)
  1234. len = srb->request_bufflen;
  1235. if (len > 0)
  1236. memcpy(srb->request_buffer, src, len);
  1237. }
  1238. }
  1239. /**************************************************************************
  1240.  * isd200_scsi_to_ata
  1241.  *                                                                         
  1242.  * Translate SCSI commands to ATA commands.
  1243.  *
  1244.  * RETURNS:
  1245.  *    TRUE if the command needs to be sent to the transport layer
  1246.  *    FALSE otherwise
  1247.  */                                                                        
  1248. int isd200_scsi_to_ata(Scsi_Cmnd *srb, struct us_data *us, 
  1249.        union ata_cdb * ataCdb)
  1250. {
  1251. struct isd200_info *info = (struct isd200_info *)us->extra;
  1252. int sendToTransport = TRUE;
  1253. unsigned char sectnum, head;
  1254. unsigned short cylinder;
  1255. unsigned long lba;
  1256. unsigned long blockCount;
  1257. unsigned char senseData[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  1258. memset(ataCdb, 0, sizeof(union ata_cdb));
  1259. /* SCSI Command */
  1260. switch (srb->cmnd[0]) {
  1261. case INQUIRY:
  1262. US_DEBUGP("   ATA OUT - INQUIRYn");
  1263. if (srb->request_bufflen > sizeof(struct inquiry_data))
  1264. srb->request_bufflen = sizeof(struct inquiry_data);
  1265. /* copy InquiryData */
  1266. isd200_data_copy(srb, (char *) &info->InquiryData, srb->request_bufflen);
  1267. srb->result = GOOD;
  1268. sendToTransport = FALSE;
  1269. break;
  1270. case MODE_SENSE:
  1271. US_DEBUGP("   ATA OUT - SCSIOP_MODE_SENSEn");
  1272. /* Initialize the return buffer */
  1273. isd200_data_copy(srb, (char *) &senseData, 8);
  1274. if (info->DeviceFlags & DF_MEDIA_STATUS_ENABLED)
  1275. {
  1276. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1277. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1278. ataCdb->generic.TransferBlockSize = 1;
  1279. ataCdb->generic.RegisterSelect = REG_COMMAND;
  1280. ataCdb->write.CommandByte = ATA_COMMAND_GET_MEDIA_STATUS;
  1281. srb->request_bufflen = 0;
  1282. } else {
  1283. US_DEBUGP("   Media Status not supported, just report okayn");
  1284. srb->result = GOOD;
  1285. sendToTransport = FALSE;
  1286. }
  1287. break;
  1288. case TEST_UNIT_READY:
  1289. US_DEBUGP("   ATA OUT - SCSIOP_TEST_UNIT_READYn");
  1290. /* Initialize the return buffer */
  1291. isd200_data_copy(srb, (char *) &senseData, 8);
  1292. if (info->DeviceFlags & DF_MEDIA_STATUS_ENABLED)
  1293. {
  1294. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1295. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1296. ataCdb->generic.TransferBlockSize = 1;
  1297. ataCdb->generic.RegisterSelect = REG_COMMAND;
  1298. ataCdb->write.CommandByte = ATA_COMMAND_GET_MEDIA_STATUS;
  1299. srb->request_bufflen = 0;
  1300. } else {
  1301. US_DEBUGP("   Media Status not supported, just report okayn");
  1302. srb->result = GOOD;
  1303. sendToTransport = FALSE;
  1304. }
  1305. break;
  1306. case READ_CAPACITY:
  1307. {
  1308. unsigned long capacity;
  1309. struct read_capacity_data readCapacityData;
  1310. US_DEBUGP("   ATA OUT - SCSIOP_READ_CAPACITYn");
  1311. if (info->drive.capability & CAPABILITY_LBA ) {
  1312. capacity = info->drive.lba_capacity - 1;
  1313. } else {
  1314. capacity = (info->drive.heads *
  1315.     info->drive.cyls *
  1316.     info->drive.sectors) - 1;
  1317. }
  1318. readCapacityData.LogicalBlockAddress = cpu_to_be32(capacity);
  1319. readCapacityData.BytesPerBlock = cpu_to_be32(0x200);
  1320. if (srb->request_bufflen > sizeof(struct read_capacity_data))
  1321. srb->request_bufflen = sizeof(struct read_capacity_data);
  1322. isd200_data_copy(srb, (char *) &readCapacityData, srb->request_bufflen);
  1323. srb->result = GOOD;
  1324. sendToTransport = FALSE;
  1325. }
  1326. break;
  1327. case READ_10:
  1328. US_DEBUGP("   ATA OUT - SCSIOP_READn");
  1329. lba = *(unsigned long *)&srb->cmnd[2]; 
  1330. lba = cpu_to_be32(lba);
  1331. blockCount = (unsigned long)srb->cmnd[7]<<8 | (unsigned long)srb->cmnd[8];
  1332. if (info->drive.capability & CAPABILITY_LBA) {
  1333. sectnum = (unsigned char)(lba);
  1334. cylinder = (unsigned short)(lba>>8);
  1335. head = ATA_ADDRESS_DEVHEAD_LBA_MODE | (unsigned char)(lba>>24 & 0x0F);
  1336. } else {
  1337. sectnum = (unsigned char)((lba % info->drive.sectors) + 1);
  1338. cylinder = (unsigned short)(lba / (info->drive.sectors *
  1339.    info->drive.heads));
  1340. head = (unsigned char)((lba / info->drive.sectors) %
  1341.        info->drive.heads);
  1342. }
  1343. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1344. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1345. ataCdb->generic.TransferBlockSize = 1;
  1346. ataCdb->generic.RegisterSelect =
  1347.   REG_SECTOR_COUNT | REG_SECTOR_NUMBER |
  1348.   REG_CYLINDER_LOW | REG_CYLINDER_HIGH |
  1349.   REG_DEVICE_HEAD  | REG_COMMAND;
  1350. ataCdb->write.SectorCountByte = (unsigned char)blockCount;
  1351. ataCdb->write.SectorNumberByte = sectnum;
  1352. ataCdb->write.CylinderHighByte = (unsigned char)(cylinder>>8);
  1353. ataCdb->write.CylinderLowByte = (unsigned char)cylinder;
  1354. ataCdb->write.DeviceHeadByte = (head | ATA_ADDRESS_DEVHEAD_STD);
  1355. ataCdb->write.CommandByte = WIN_READ;
  1356. break;
  1357. case WRITE_10:
  1358. US_DEBUGP("   ATA OUT - SCSIOP_WRITEn");
  1359. lba = *(unsigned long *)&srb->cmnd[2]; 
  1360. lba = cpu_to_be32(lba);
  1361. blockCount = (unsigned long)srb->cmnd[7]<<8 | (unsigned long)srb->cmnd[8];
  1362. if (info->drive.capability & CAPABILITY_LBA) {
  1363. sectnum = (unsigned char)(lba);
  1364. cylinder = (unsigned short)(lba>>8);
  1365. head = ATA_ADDRESS_DEVHEAD_LBA_MODE | (unsigned char)(lba>>24 & 0x0F);
  1366. } else {
  1367. sectnum = (unsigned char)((lba % info->drive.sectors) + 1);
  1368. cylinder = (unsigned short)(lba / (info->drive.sectors * info->drive.heads));
  1369. head = (unsigned char)((lba / info->drive.sectors) % info->drive.heads);
  1370. }
  1371. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1372. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1373. ataCdb->generic.TransferBlockSize = 1;
  1374. ataCdb->generic.RegisterSelect =
  1375.   REG_SECTOR_COUNT | REG_SECTOR_NUMBER |
  1376.   REG_CYLINDER_LOW | REG_CYLINDER_HIGH |
  1377.   REG_DEVICE_HEAD  | REG_COMMAND;
  1378. ataCdb->write.SectorCountByte = (unsigned char)blockCount;
  1379. ataCdb->write.SectorNumberByte = sectnum;
  1380. ataCdb->write.CylinderHighByte = (unsigned char)(cylinder>>8);
  1381. ataCdb->write.CylinderLowByte = (unsigned char)cylinder;
  1382. ataCdb->write.DeviceHeadByte = (head | ATA_ADDRESS_DEVHEAD_STD);
  1383. ataCdb->write.CommandByte = WIN_WRITE;
  1384. break;
  1385. case ALLOW_MEDIUM_REMOVAL:
  1386. US_DEBUGP("   ATA OUT - SCSIOP_MEDIUM_REMOVALn");
  1387. if (info->DeviceFlags & DF_REMOVABLE_MEDIA) {
  1388. US_DEBUGP("   srb->cmnd[4] = 0x%Xn", srb->cmnd[4]);
  1389.             
  1390. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1391. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1392. ataCdb->generic.TransferBlockSize = 1;
  1393. ataCdb->generic.RegisterSelect = REG_COMMAND;
  1394. ataCdb->write.CommandByte = (srb->cmnd[4] & 0x1) ?
  1395. WIN_DOORLOCK : WIN_DOORUNLOCK;
  1396. srb->request_bufflen = 0;
  1397. } else {
  1398. US_DEBUGP("   Not removeable media, just report okayn");
  1399. srb->result = GOOD;
  1400. sendToTransport = FALSE;
  1401. }
  1402. break;
  1403. case START_STOP:    
  1404. US_DEBUGP("   ATA OUT - SCSIOP_START_STOP_UNITn");
  1405. US_DEBUGP("   srb->cmnd[4] = 0x%Xn", srb->cmnd[4]);
  1406. /* Initialize the return buffer */
  1407. isd200_data_copy(srb, (char *) &senseData, 8);
  1408. if ((srb->cmnd[4] & 0x3) == 0x2) {
  1409. US_DEBUGP("   Media Ejectn");
  1410. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1411. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1412. ataCdb->generic.TransferBlockSize = 0;
  1413. ataCdb->generic.RegisterSelect = REG_COMMAND;
  1414. ataCdb->write.CommandByte = ATA_COMMAND_MEDIA_EJECT;
  1415. } else if ((srb->cmnd[4] & 0x3) == 0x1) {
  1416. US_DEBUGP("   Get Media Statusn");
  1417. ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
  1418. ataCdb->generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
  1419. ataCdb->generic.TransferBlockSize = 1;
  1420. ataCdb->generic.RegisterSelect = REG_COMMAND;
  1421. ataCdb->write.CommandByte = ATA_COMMAND_GET_MEDIA_STATUS;
  1422. srb->request_bufflen = 0;
  1423. } else {
  1424. US_DEBUGP("   Nothing to do, just report okayn");
  1425. srb->result = GOOD;
  1426. sendToTransport = FALSE;
  1427. }
  1428. break;
  1429. default:
  1430. US_DEBUGP("Unsupported SCSI command - 0x%Xn", srb->cmnd[0]);
  1431. srb->result = DID_ERROR << 16;
  1432. sendToTransport = FALSE;
  1433. break;
  1434. }
  1435. return(sendToTransport);
  1436. }
  1437. /**************************************************************************
  1438.  * isd200_init_info
  1439.  *                                                                         
  1440.  * Allocates (if necessary) and initializes the driver structure.
  1441.  *
  1442.  * RETURNS:
  1443.  *    ISD status code
  1444.  */                                                                        
  1445. int isd200_init_info(struct us_data *us)
  1446. {
  1447. int retStatus = ISD200_GOOD;
  1448. if (!us->extra) {
  1449. us->extra = (void *) kmalloc(sizeof(struct isd200_info), GFP_KERNEL);
  1450. if (!us->extra) {
  1451. US_DEBUGP("ERROR - kmalloc failuren");
  1452. retStatus = ISD200_ERROR;
  1453. }
  1454.         }
  1455. if (retStatus == ISD200_GOOD) {
  1456. memset(us->extra, 0, sizeof(struct isd200_info));
  1457.         }
  1458. return(retStatus);
  1459. }
  1460. /**************************************************************************
  1461.  * Initialization for the ISD200 
  1462.  */
  1463. int isd200_Initialization(struct us_data *us)
  1464. {
  1465. US_DEBUGP("ISD200 Initialization...n");
  1466. /* Initialize ISD200 info struct */
  1467. if (isd200_init_info(us) == ISD200_ERROR) {
  1468. US_DEBUGP("ERROR Initializing ISD200 Info structn");
  1469.         } else {
  1470. /* Get device specific data */
  1471. if (isd200_get_inquiry_data(us) != ISD200_GOOD)
  1472. US_DEBUGP("ISD200 Initialization Failuren");
  1473. else
  1474. US_DEBUGP("ISD200 Initialization completen");
  1475.         }
  1476. return 0;
  1477. }
  1478. /**************************************************************************
  1479.  * Protocol and Transport for the ISD200 ASIC
  1480.  *
  1481.  * This protocol and transport are for ATA devices connected to an ISD200
  1482.  * ASIC.  An ATAPI device that is conected as a slave device will be
  1483.  * detected in the driver initialization function and the protocol will
  1484.  * be changed to an ATAPI protocol (Transparent SCSI).
  1485.  *
  1486.  */
  1487. void isd200_ata_command(Scsi_Cmnd *srb, struct us_data *us)
  1488. {
  1489. int sendToTransport = TRUE;
  1490. union ata_cdb ataCdb;
  1491. /* Make sure driver was initialized */
  1492. if (us->extra == NULL)
  1493. US_DEBUGP("ERROR Driver not initializedn");
  1494. /* Convert command */
  1495. sendToTransport = isd200_scsi_to_ata(srb, us, &ataCdb);
  1496. /* send the command to the transport layer */
  1497. if (sendToTransport)
  1498. isd200_invoke_transport(us, srb, &ataCdb);
  1499. }