protocol.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Driver for USB Mass Storage compliant devices
  2.  *
  3.  * $Id: protocol.c,v 1.11 2002/01/13 06:40:25 mdharm Exp $
  4.  *
  5.  * Current development and maintenance by:
  6.  *   (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
  7.  *
  8.  * Developed with the assistance of:
  9.  *   (c) 2000 David L. Brown, Jr. (usb-storage@davidb.org)
  10.  *
  11.  * Initial work by:
  12.  *   (c) 1999 Michael Gee (michael@linuxspecific.com)
  13.  *
  14.  * This driver is based on the 'USB Mass Storage Class' document. This
  15.  * describes in detail the protocol used to communicate with such
  16.  * devices.  Clearly, the designers had SCSI and ATAPI commands in
  17.  * mind when they created this document.  The commands are all very
  18.  * similar to commands in the SCSI-II and ATAPI specifications.
  19.  *
  20.  * It is important to note that in a number of cases this class
  21.  * exhibits class-specific exemptions from the USB specification.
  22.  * Notably the usage of NAK, STALL and ACK differs from the norm, in
  23.  * that they are used to communicate wait, failed and OK on commands.
  24.  *
  25.  * Also, for certain devices, the interrupt endpoint is used to convey
  26.  * status of a command.
  27.  *
  28.  * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more
  29.  * information about this driver.
  30.  *
  31.  * This program is free software; you can redistribute it and/or modify it
  32.  * under the terms of the GNU General Public License as published by the
  33.  * Free Software Foundation; either version 2, or (at your option) any
  34.  * later version.
  35.  *
  36.  * This program is distributed in the hope that it will be useful, but
  37.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  38.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  39.  * General Public License for more details.
  40.  *
  41.  * You should have received a copy of the GNU General Public License along
  42.  * with this program; if not, write to the Free Software Foundation, Inc.,
  43.  * 675 Mass Ave, Cambridge, MA 02139, USA.
  44.  */
  45. #include "protocol.h"
  46. #include "usb.h"
  47. #include "debug.h"
  48. #include "scsiglue.h"
  49. #include "transport.h"
  50. /***********************************************************************
  51.  * Helper routines
  52.  ***********************************************************************/
  53. /* Fix-up the return data from an INQUIRY command to show 
  54.  * ANSI SCSI rev 2 so we don't confuse the SCSI layers above us
  55.  */
  56. void fix_inquiry_data(Scsi_Cmnd *srb)
  57. {
  58. unsigned char *data_ptr;
  59. /* verify that it's an INQUIRY command */
  60. if (srb->cmnd[0] != INQUIRY)
  61. return;
  62. US_DEBUGP("Fixing INQUIRY data to show SCSI rev 2n");
  63. /* find the location of the data */
  64. if (srb->use_sg) {
  65. struct scatterlist *sg;
  66. sg = (struct scatterlist *) srb->request_buffer;
  67. data_ptr = (unsigned char *) sg[0].address;
  68. } else
  69. data_ptr = (unsigned char *)srb->request_buffer;
  70. /* Change the SCSI revision number */
  71. data_ptr[2] = (data_ptr[2] & ~7) | 2;
  72. }
  73. /***********************************************************************
  74.  * Protocol routines
  75.  ***********************************************************************/
  76. void usb_stor_qic157_command(Scsi_Cmnd *srb, struct us_data *us)
  77. {
  78. /* Pad the ATAPI command with zeros 
  79.  * NOTE: This only works because a Scsi_Cmnd struct field contains
  80.  * a unsigned char cmnd[12], so we know we have storage available
  81.  */
  82. for (; srb->cmd_len<12; srb->cmd_len++)
  83. srb->cmnd[srb->cmd_len] = 0;
  84. /* set command length to 12 bytes */
  85. srb->cmd_len = 12;
  86. /* send the command to the transport layer */
  87. usb_stor_invoke_transport(srb, us);
  88. /* fix the INQUIRY data if necessary */
  89. fix_inquiry_data(srb);
  90. }
  91. void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
  92. {
  93. int old_cmnd = 0;
  94. /* Fix some commands -- this is a form of mode translation
  95.  * ATAPI devices only accept 12 byte long commands 
  96.  *
  97.  * NOTE: This only works because a Scsi_Cmnd struct field contains
  98.  * a unsigned char cmnd[12], so we know we have storage available
  99.  */
  100. /* Pad the ATAPI command with zeros */
  101. for (; srb->cmd_len<12; srb->cmd_len++)
  102. srb->cmnd[srb->cmd_len] = 0;
  103. /* set command length to 12 bytes */
  104. srb->cmd_len = 12;
  105. /* determine the correct (or minimum) data length for these commands */
  106. switch (srb->cmnd[0]) {
  107. /* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
  108. case MODE_SENSE:
  109. case MODE_SELECT:
  110. /* save the command so we can tell what it was */
  111. old_cmnd = srb->cmnd[0];
  112. srb->cmnd[11] = 0;
  113. srb->cmnd[10] = 0;
  114. srb->cmnd[9] = 0;
  115. srb->cmnd[8] = srb->cmnd[4];
  116. srb->cmnd[7] = 0;
  117. srb->cmnd[6] = 0;
  118. srb->cmnd[5] = 0;
  119. srb->cmnd[4] = 0;
  120. srb->cmnd[3] = 0;
  121. srb->cmnd[2] = srb->cmnd[2];
  122. srb->cmnd[1] = srb->cmnd[1];
  123. srb->cmnd[0] = srb->cmnd[0] | 0x40;
  124. break;
  125. /* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
  126.  * are ATAPI commands */
  127. case WRITE_6:
  128. case READ_6:
  129. srb->cmnd[11] = 0;
  130. srb->cmnd[10] = 0;
  131. srb->cmnd[9] = 0;
  132. srb->cmnd[8] = srb->cmnd[4];
  133. srb->cmnd[7] = 0;
  134. srb->cmnd[6] = 0;
  135. srb->cmnd[5] = srb->cmnd[3];
  136. srb->cmnd[4] = srb->cmnd[2];
  137. srb->cmnd[3] = srb->cmnd[1] & 0x1F;
  138. srb->cmnd[2] = 0;
  139. srb->cmnd[1] = srb->cmnd[1] & 0xE0;
  140. srb->cmnd[0] = srb->cmnd[0] | 0x20;
  141. break;
  142. } /* end switch on cmnd[0] */
  143. /* convert MODE_SELECT data here */
  144. if (old_cmnd == MODE_SELECT)
  145. usb_stor_scsiSense6to10(srb);
  146. /* send the command to the transport layer */
  147. usb_stor_invoke_transport(srb, us);
  148. /* Fix the MODE_SENSE data if we translated the command */
  149. if ((old_cmnd == MODE_SENSE) && (status_byte(srb->result) == GOOD))
  150. usb_stor_scsiSense10to6(srb);
  151. /* fix the INQUIRY data if necessary */
  152. fix_inquiry_data(srb);
  153. }
  154. void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
  155. {
  156. int old_cmnd = 0;
  157. /* fix some commands -- this is a form of mode translation
  158.  * UFI devices only accept 12 byte long commands 
  159.  *
  160.  * NOTE: This only works because a Scsi_Cmnd struct field contains
  161.  * a unsigned char cmnd[12], so we know we have storage available
  162.  */
  163. /* set command length to 12 bytes (this affects the transport layer) */
  164. srb->cmd_len = 12;
  165. /* determine the correct (or minimum) data length for these commands */
  166. switch (srb->cmnd[0]) {
  167. /* for INQUIRY, UFI devices only ever return 36 bytes */
  168. case INQUIRY:
  169. srb->cmnd[4] = 36;
  170. break;
  171. /* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
  172. case MODE_SENSE:
  173. case MODE_SELECT:
  174. /* save the command so we can tell what it was */
  175. old_cmnd = srb->cmnd[0];
  176. srb->cmnd[11] = 0;
  177. srb->cmnd[10] = 0;
  178. srb->cmnd[9] = 0;
  179. /* if we're sending data, we send all. If getting data, 
  180.  * get the minimum */
  181. if (srb->cmnd[0] == MODE_SELECT)
  182. srb->cmnd[8] = srb->cmnd[4];
  183. else
  184. srb->cmnd[8] = 8;
  185. srb->cmnd[7] = 0;
  186. srb->cmnd[6] = 0;
  187. srb->cmnd[5] = 0;
  188. srb->cmnd[4] = 0;
  189. srb->cmnd[3] = 0;
  190. srb->cmnd[2] = srb->cmnd[2];
  191. srb->cmnd[1] = srb->cmnd[1];
  192. srb->cmnd[0] = srb->cmnd[0] | 0x40;
  193. break;
  194. /* again, for MODE_SENSE_10, we get the minimum (8) */
  195. case MODE_SENSE_10:
  196. srb->cmnd[7] = 0;
  197. srb->cmnd[8] = 8;
  198. break;
  199. /* for REQUEST_SENSE, UFI devices only ever return 18 bytes */
  200. case REQUEST_SENSE:
  201. srb->cmnd[4] = 18;
  202. break;
  203. /* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
  204.  * are UFI commands */
  205. case WRITE_6:
  206. case READ_6:
  207. srb->cmnd[11] = 0;
  208. srb->cmnd[10] = 0;
  209. srb->cmnd[9] = 0;
  210. srb->cmnd[8] = srb->cmnd[4];
  211. srb->cmnd[7] = 0;
  212. srb->cmnd[6] = 0;
  213. srb->cmnd[5] = srb->cmnd[3];
  214. srb->cmnd[4] = srb->cmnd[2];
  215. srb->cmnd[3] = srb->cmnd[1] & 0x1F;
  216. srb->cmnd[2] = 0;
  217. srb->cmnd[1] = srb->cmnd[1] & 0xE0;
  218. srb->cmnd[0] = srb->cmnd[0] | 0x20;
  219. break;
  220. } /* end switch on cmnd[0] */
  221. /* convert MODE_SELECT data here */
  222. if (old_cmnd == MODE_SELECT)
  223. usb_stor_scsiSense6to10(srb);
  224. /* send the command to the transport layer */
  225. usb_stor_invoke_transport(srb, us);
  226. /* Fix the MODE_SENSE data if we translated the command */
  227. if ((old_cmnd == MODE_SENSE) && (status_byte(srb->result) == GOOD))
  228. usb_stor_scsiSense10to6(srb);
  229. /* Fix the data for an INQUIRY, if necessary */
  230. fix_inquiry_data(srb);
  231. }
  232. void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
  233. {
  234. int old_cmnd = 0;
  235. /* This code supports devices which do not support {READ|WRITE}_6
  236.  * Apparently, neither Windows or MacOS will use these commands,
  237.  * so some devices do not support them
  238.  */
  239. if (us->flags & US_FL_MODE_XLATE) {
  240. US_DEBUGP("Invoking Mode Translationn");
  241. /* save the old command for later */
  242. old_cmnd = srb->cmnd[0];
  243. switch (srb->cmnd[0]) {
  244. /* change READ_6/WRITE_6 to READ_10/WRITE_10 */
  245. case WRITE_6:
  246. case READ_6:
  247. srb->cmd_len = 12;
  248. srb->cmnd[11] = 0;
  249. srb->cmnd[10] = 0;
  250. srb->cmnd[9] = 0;
  251. srb->cmnd[8] = srb->cmnd[4];
  252. srb->cmnd[7] = 0;
  253. srb->cmnd[6] = 0;
  254. srb->cmnd[5] = srb->cmnd[3];
  255. srb->cmnd[4] = srb->cmnd[2];
  256. srb->cmnd[3] = srb->cmnd[1] & 0x1F;
  257. srb->cmnd[2] = 0;
  258. srb->cmnd[1] = srb->cmnd[1] & 0xE0;
  259. srb->cmnd[0] = srb->cmnd[0] | 0x20;
  260. break;
  261. /* convert MODE_SELECT data here */
  262. case MODE_SENSE:
  263. case MODE_SELECT:
  264. srb->cmd_len = 12;
  265. srb->cmnd[11] = 0;
  266. srb->cmnd[10] = 0;
  267. srb->cmnd[9] = 0;
  268. srb->cmnd[8] = srb->cmnd[4];
  269. srb->cmnd[7] = 0;
  270. srb->cmnd[6] = 0;
  271. srb->cmnd[5] = 0;
  272. srb->cmnd[4] = 0;
  273. srb->cmnd[3] = 0;
  274. srb->cmnd[2] = srb->cmnd[2];
  275. srb->cmnd[1] = srb->cmnd[1];
  276. srb->cmnd[0] = srb->cmnd[0] | 0x40;
  277. break;
  278. } /* switch (srb->cmnd[0]) */
  279. } /* if (us->flags & US_FL_MODE_XLATE) */
  280. /* convert MODE_SELECT data here */
  281. if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SELECT))
  282. usb_stor_scsiSense6to10(srb);
  283. /* send the command to the transport layer */
  284. usb_stor_invoke_transport(srb, us);
  285. /* Fix the MODE_SENSE data if we translated the command */
  286. if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SENSE)
  287. && (status_byte(srb->result) == GOOD))
  288. usb_stor_scsiSense10to6(srb);
  289. /* fix the INQUIRY data if necessary */
  290. fix_inquiry_data(srb);
  291. }