1 /* Driver for USB Mass Storage compliant devices 2 * 3 * $Id: protocol.c,v 1.14 2002/04/22 03:39:43 mdharm Exp $ 4 * 5 * Current development and maintenance by: 6 * (c) 1999-2002 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 * (c) 2002 Alan Stern (stern@rowland.org) 11 * 12 * Initial work by: 13 * (c) 1999 Michael Gee (michael@linuxspecific.com) 14 * 15 * This driver is based on the 'USB Mass Storage Class' document. This 16 * describes in detail the protocol used to communicate with such 17 * devices. Clearly, the designers had SCSI and ATAPI commands in 18 * mind when they created this document. The commands are all very 19 * similar to commands in the SCSI-II and ATAPI specifications. 20 * 21 * It is important to note that in a number of cases this class 22 * exhibits class-specific exemptions from the USB specification. 23 * Notably the usage of NAK, STALL and ACK differs from the norm, in 24 * that they are used to communicate wait, failed and OK on commands. 25 * 26 * Also, for certain devices, the interrupt endpoint is used to convey 27 * status of a command. 28 * 29 * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more 30 * information about this driver. 31 * 32 * This program is free software; you can redistribute it and/or modify it 33 * under the terms of the GNU General Public License as published by the 34 * Free Software Foundation; either version 2, or (at your option) any 35 * later version. 36 * 37 * This program is distributed in the hope that it will be useful, but 38 * WITHOUT ANY WARRANTY; without even the implied warranty of 39 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 40 * General Public License for more details. 41 * 42 * You should have received a copy of the GNU General Public License along 43 * with this program; if not, write to the Free Software Foundation, Inc., 44 * 675 Mass Ave, Cambridge, MA 02139, USA. 45 */ 46 47 #include <linux/highmem.h> 48 #include <scsi/scsi.h> 49 #include <scsi/scsi_cmnd.h> 50 51 #include "usb.h" 52 #include "protocol.h" 53 #include "debug.h" 54 #include "scsiglue.h" 55 #include "transport.h" 56 57 /*********************************************************************** 58 * Protocol routines 59 ***********************************************************************/ 60 61 void usb_stor_qic157_command(struct scsi_cmnd *srb, struct us_data *us) 62 { 63 /* Pad the ATAPI command with zeros 64 * 65 * NOTE: This only works because a scsi_cmnd struct field contains 66 * a unsigned char cmnd[16], so we know we have storage available 67 */ 68 for (; srb->cmd_len<12; srb->cmd_len++) 69 srb->cmnd[srb->cmd_len] = 0; 70 71 /* set command length to 12 bytes */ 72 srb->cmd_len = 12; 73 74 /* send the command to the transport layer */ 75 usb_stor_invoke_transport(srb, us); 76 } 77 78 void usb_stor_ATAPI_command(struct scsi_cmnd *srb, struct us_data *us) 79 { 80 /* Pad the ATAPI command with zeros 81 * 82 * NOTE: This only works because a scsi_cmnd struct field contains 83 * a unsigned char cmnd[16], so we know we have storage available 84 */ 85 86 /* Pad the ATAPI command with zeros */ 87 for (; srb->cmd_len<12; srb->cmd_len++) 88 srb->cmnd[srb->cmd_len] = 0; 89 90 /* set command length to 12 bytes */ 91 srb->cmd_len = 12; 92 93 /* send the command to the transport layer */ 94 usb_stor_invoke_transport(srb, us); 95 } 96 97 98 void usb_stor_ufi_command(struct scsi_cmnd *srb, struct us_data *us) 99 { 100 /* fix some commands -- this is a form of mode translation 101 * UFI devices only accept 12 byte long commands 102 * 103 * NOTE: This only works because a scsi_cmnd struct field contains 104 * a unsigned char cmnd[16], so we know we have storage available 105 */ 106 107 /* Pad the ATAPI command with zeros */ 108 for (; srb->cmd_len<12; srb->cmd_len++) 109 srb->cmnd[srb->cmd_len] = 0; 110 111 /* set command length to 12 bytes (this affects the transport layer) */ 112 srb->cmd_len = 12; 113 114 /* XXX We should be constantly re-evaluating the need for these */ 115 116 /* determine the correct data length for these commands */ 117 switch (srb->cmnd[0]) { 118 119 /* for INQUIRY, UFI devices only ever return 36 bytes */ 120 case INQUIRY: 121 srb->cmnd[4] = 36; 122 break; 123 124 /* again, for MODE_SENSE_10, we get the minimum (8) */ 125 case MODE_SENSE_10: 126 srb->cmnd[7] = 0; 127 srb->cmnd[8] = 8; 128 break; 129 130 /* for REQUEST_SENSE, UFI devices only ever return 18 bytes */ 131 case REQUEST_SENSE: 132 srb->cmnd[4] = 18; 133 break; 134 } /* end switch on cmnd[0] */ 135 136 /* send the command to the transport layer */ 137 usb_stor_invoke_transport(srb, us); 138 } 139 140 void usb_stor_transparent_scsi_command(struct scsi_cmnd *srb, 141 struct us_data *us) 142 { 143 /* send the command to the transport layer */ 144 usb_stor_invoke_transport(srb, us); 145 } 146 147 /*********************************************************************** 148 * Scatter-gather transfer buffer access routines 149 ***********************************************************************/ 150 151 /* Copy a buffer of length buflen to/from the srb's transfer buffer. 152 * Update the **sgptr and *offset variables so that the next copy will 153 * pick up from where this one left off. 154 */ 155 unsigned int usb_stor_access_xfer_buf(unsigned char *buffer, 156 unsigned int buflen, struct scsi_cmnd *srb, struct scatterlist **sgptr, 157 unsigned int *offset, enum xfer_buf_dir dir) 158 { 159 unsigned int cnt; 160 struct scatterlist *sg = *sgptr; 161 162 /* We have to go through the list one entry 163 * at a time. Each s-g entry contains some number of pages, and 164 * each page has to be kmap()'ed separately. If the page is already 165 * in kernel-addressable memory then kmap() will return its address. 166 * If the page is not directly accessible -- such as a user buffer 167 * located in high memory -- then kmap() will map it to a temporary 168 * position in the kernel's virtual address space. 169 */ 170 171 if (!sg) 172 sg = scsi_sglist(srb); 173 174 /* This loop handles a single s-g list entry, which may 175 * include multiple pages. Find the initial page structure 176 * and the starting offset within the page, and update 177 * the *offset and **sgptr values for the next loop. 178 */ 179 cnt = 0; 180 while (cnt < buflen && sg) { 181 struct page *page = sg_page(sg) + 182 ((sg->offset + *offset) >> PAGE_SHIFT); 183 unsigned int poff = (sg->offset + *offset) & (PAGE_SIZE-1); 184 unsigned int sglen = sg->length - *offset; 185 186 if (sglen > buflen - cnt) { 187 188 /* Transfer ends within this s-g entry */ 189 sglen = buflen - cnt; 190 *offset += sglen; 191 } else { 192 193 /* Transfer continues to next s-g entry */ 194 *offset = 0; 195 sg = sg_next(sg); 196 } 197 198 /* Transfer the data for all the pages in this 199 * s-g entry. For each page: call kmap(), do the 200 * transfer, and call kunmap() immediately after. */ 201 while (sglen > 0) { 202 unsigned int plen = min(sglen, (unsigned int) 203 PAGE_SIZE - poff); 204 unsigned char *ptr = kmap(page); 205 206 if (dir == TO_XFER_BUF) 207 memcpy(ptr + poff, buffer + cnt, plen); 208 else 209 memcpy(buffer + cnt, ptr + poff, plen); 210 kunmap(page); 211 212 /* Start at the beginning of the next page */ 213 poff = 0; 214 ++page; 215 cnt += plen; 216 sglen -= plen; 217 } 218 } 219 *sgptr = sg; 220 221 /* Return the amount actually transferred */ 222 return cnt; 223 } 224 225 /* Store the contents of buffer into srb's transfer buffer and set the 226 * SCSI residue. 227 */ 228 void usb_stor_set_xfer_buf(unsigned char *buffer, 229 unsigned int buflen, struct scsi_cmnd *srb) 230 { 231 unsigned int offset = 0; 232 struct scatterlist *sg = NULL; 233 234 buflen = min(buflen, scsi_bufflen(srb)); 235 buflen = usb_stor_access_xfer_buf(buffer, buflen, srb, &sg, &offset, 236 TO_XFER_BUF); 237 if (buflen < scsi_bufflen(srb)) 238 scsi_set_resid(srb, scsi_bufflen(srb) - buflen); 239 } 240