2 * Driver for USB Mass Storage compliant devices
3 * Debugging Functions Source Code File
5 * Current development and maintenance by:
6 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * Developed with the assistance of:
9 * (c) 2002 Alan Stern <stern@rowland.org>
12 * (c) 1999 Michael Gee (michael@linuxspecific.com)
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.
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.
25 * Also, for certain devices, the interrupt endpoint is used to convey
26 * status of a command.
28 * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more
29 * information about this driver.
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
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.
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.
46 #include <linux/device.h>
47 #include <linux/cdrom.h>
48 #include <linux/export.h>
49 #include <scsi/scsi.h>
50 #include <scsi/scsi_cmnd.h>
51 #include <scsi/scsi_dbg.h>
58 void usb_stor_show_command(const struct us_data
*us
, struct scsi_cmnd
*srb
)
62 switch (srb
->cmnd
[0]) {
63 case TEST_UNIT_READY
: what
= "TEST_UNIT_READY"; break;
64 case REZERO_UNIT
: what
= "REZERO_UNIT"; break;
65 case REQUEST_SENSE
: what
= "REQUEST_SENSE"; break;
66 case FORMAT_UNIT
: what
= "FORMAT_UNIT"; break;
67 case READ_BLOCK_LIMITS
: what
= "READ_BLOCK_LIMITS"; break;
68 case REASSIGN_BLOCKS
: what
= "REASSIGN_BLOCKS"; break;
69 case READ_6
: what
= "READ_6"; break;
70 case WRITE_6
: what
= "WRITE_6"; break;
71 case SEEK_6
: what
= "SEEK_6"; break;
72 case READ_REVERSE
: what
= "READ_REVERSE"; break;
73 case WRITE_FILEMARKS
: what
= "WRITE_FILEMARKS"; break;
74 case SPACE
: what
= "SPACE"; break;
75 case INQUIRY
: what
= "INQUIRY"; break;
76 case RECOVER_BUFFERED_DATA
: what
= "RECOVER_BUFFERED_DATA"; break;
77 case MODE_SELECT
: what
= "MODE_SELECT"; break;
78 case RESERVE
: what
= "RESERVE"; break;
79 case RELEASE
: what
= "RELEASE"; break;
80 case COPY
: what
= "COPY"; break;
81 case ERASE
: what
= "ERASE"; break;
82 case MODE_SENSE
: what
= "MODE_SENSE"; break;
83 case START_STOP
: what
= "START_STOP"; break;
84 case RECEIVE_DIAGNOSTIC
: what
= "RECEIVE_DIAGNOSTIC"; break;
85 case SEND_DIAGNOSTIC
: what
= "SEND_DIAGNOSTIC"; break;
86 case ALLOW_MEDIUM_REMOVAL
: what
= "ALLOW_MEDIUM_REMOVAL"; break;
87 case SET_WINDOW
: what
= "SET_WINDOW"; break;
88 case READ_CAPACITY
: what
= "READ_CAPACITY"; break;
89 case READ_10
: what
= "READ_10"; break;
90 case WRITE_10
: what
= "WRITE_10"; break;
91 case SEEK_10
: what
= "SEEK_10"; break;
92 case WRITE_VERIFY
: what
= "WRITE_VERIFY"; break;
93 case VERIFY
: what
= "VERIFY"; break;
94 case SEARCH_HIGH
: what
= "SEARCH_HIGH"; break;
95 case SEARCH_EQUAL
: what
= "SEARCH_EQUAL"; break;
96 case SEARCH_LOW
: what
= "SEARCH_LOW"; break;
97 case SET_LIMITS
: what
= "SET_LIMITS"; break;
98 case READ_POSITION
: what
= "READ_POSITION"; break;
99 case SYNCHRONIZE_CACHE
: what
= "SYNCHRONIZE_CACHE"; break;
100 case LOCK_UNLOCK_CACHE
: what
= "LOCK_UNLOCK_CACHE"; break;
101 case READ_DEFECT_DATA
: what
= "READ_DEFECT_DATA"; break;
102 case MEDIUM_SCAN
: what
= "MEDIUM_SCAN"; break;
103 case COMPARE
: what
= "COMPARE"; break;
104 case COPY_VERIFY
: what
= "COPY_VERIFY"; break;
105 case WRITE_BUFFER
: what
= "WRITE_BUFFER"; break;
106 case READ_BUFFER
: what
= "READ_BUFFER"; break;
107 case UPDATE_BLOCK
: what
= "UPDATE_BLOCK"; break;
108 case READ_LONG
: what
= "READ_LONG"; break;
109 case WRITE_LONG
: what
= "WRITE_LONG"; break;
110 case CHANGE_DEFINITION
: what
= "CHANGE_DEFINITION"; break;
111 case WRITE_SAME
: what
= "WRITE_SAME"; break;
112 case GPCMD_READ_SUBCHANNEL
: what
= "READ SUBCHANNEL"; break;
113 case READ_TOC
: what
= "READ_TOC"; break;
114 case GPCMD_READ_HEADER
: what
= "READ HEADER"; break;
115 case GPCMD_PLAY_AUDIO_10
: what
= "PLAY AUDIO (10)"; break;
116 case GPCMD_PLAY_AUDIO_MSF
: what
= "PLAY AUDIO MSF"; break;
117 case GPCMD_GET_EVENT_STATUS_NOTIFICATION
:
118 what
= "GET EVENT/STATUS NOTIFICATION"; break;
119 case GPCMD_PAUSE_RESUME
: what
= "PAUSE/RESUME"; break;
120 case LOG_SELECT
: what
= "LOG_SELECT"; break;
121 case LOG_SENSE
: what
= "LOG_SENSE"; break;
122 case GPCMD_STOP_PLAY_SCAN
: what
= "STOP PLAY/SCAN"; break;
123 case GPCMD_READ_DISC_INFO
: what
= "READ DISC INFORMATION"; break;
124 case GPCMD_READ_TRACK_RZONE_INFO
:
125 what
= "READ TRACK INFORMATION"; break;
126 case GPCMD_RESERVE_RZONE_TRACK
: what
= "RESERVE TRACK"; break;
127 case GPCMD_SEND_OPC
: what
= "SEND OPC"; break;
128 case MODE_SELECT_10
: what
= "MODE_SELECT_10"; break;
129 case GPCMD_REPAIR_RZONE_TRACK
: what
= "REPAIR TRACK"; break;
130 case 0x59: what
= "READ MASTER CUE"; break;
131 case MODE_SENSE_10
: what
= "MODE_SENSE_10"; break;
132 case GPCMD_CLOSE_TRACK
: what
= "CLOSE TRACK/SESSION"; break;
133 case 0x5C: what
= "READ BUFFER CAPACITY"; break;
134 case 0x5D: what
= "SEND CUE SHEET"; break;
135 case GPCMD_BLANK
: what
= "BLANK"; break;
136 case REPORT_LUNS
: what
= "REPORT LUNS"; break;
137 case MOVE_MEDIUM
: what
= "MOVE_MEDIUM or PLAY AUDIO (12)"; break;
138 case READ_12
: what
= "READ_12"; break;
139 case WRITE_12
: what
= "WRITE_12"; break;
140 case WRITE_VERIFY_12
: what
= "WRITE_VERIFY_12"; break;
141 case SEARCH_HIGH_12
: what
= "SEARCH_HIGH_12"; break;
142 case SEARCH_EQUAL_12
: what
= "SEARCH_EQUAL_12"; break;
143 case SEARCH_LOW_12
: what
= "SEARCH_LOW_12"; break;
144 case SEND_VOLUME_TAG
: what
= "SEND_VOLUME_TAG"; break;
145 case READ_ELEMENT_STATUS
: what
= "READ_ELEMENT_STATUS"; break;
146 case GPCMD_READ_CD_MSF
: what
= "READ CD MSF"; break;
147 case GPCMD_SCAN
: what
= "SCAN"; break;
148 case GPCMD_SET_SPEED
: what
= "SET CD SPEED"; break;
149 case GPCMD_MECHANISM_STATUS
: what
= "MECHANISM STATUS"; break;
150 case GPCMD_READ_CD
: what
= "READ CD"; break;
151 case 0xE1: what
= "WRITE CONTINUE"; break;
152 case WRITE_LONG_2
: what
= "WRITE_LONG_2"; break;
153 default: what
= "(unknown command)"; break;
155 usb_stor_dbg(us
, "Command %s (%d bytes)\n", what
, srb
->cmd_len
);
156 usb_stor_dbg(us
, "bytes: %*ph\n", min_t(int, srb
->cmd_len
, 16),
157 (const unsigned char *)srb
->cmnd
);
160 void usb_stor_show_sense(const struct us_data
*us
,
165 const char *what
, *keystr
, *fmt
;
167 keystr
= scsi_sense_key_string(key
);
168 what
= scsi_extd_sense_format(asc
, ascq
, &fmt
);
171 keystr
= "(Unknown Key)";
173 what
= "(unknown ASC/ASCQ)";
176 usb_stor_dbg(us
, "%s: %s (%s%x)\n", keystr
, what
, fmt
, ascq
);
178 usb_stor_dbg(us
, "%s: %s\n", keystr
, what
);
181 void usb_stor_dbg(const struct us_data
*us
, const char *fmt
, ...)
187 dev_vprintk_emit(LOGLEVEL_DEBUG
, &us
->pusb_dev
->dev
, fmt
, args
);
191 EXPORT_SYMBOL_GPL(usb_stor_dbg
);