mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 07:54:54 +08:00
53555fb7bc
The following two header files have the same file name: include/scsi/scsi.h and drivers/scsi/scsi.h. This is confusing. Remove the latter since the following note was added in drivers/scsi/scsi.h in 2004: "NOTE: this file only contains compatibility glue for old drivers. All these wrappers will be removed sooner or later. For new code please use the interfaces declared in the headers in include/scsi/" Link: https://lore.kernel.org/r/20220218195117.25689-7-bvanassche@acm.org Cc: Christoph Hellwig <hch@lst.de> Cc: Ming Lei <ming.lei@redhat.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
175 lines
6.7 KiB
C
175 lines
6.7 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Driver for USB Mass Storage compliant devices
|
|
* Debugging Functions Source Code File
|
|
*
|
|
* Current development and maintenance by:
|
|
* (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
|
*
|
|
* Developed with the assistance of:
|
|
* (c) 2002 Alan Stern <stern@rowland.org>
|
|
*
|
|
* Initial work by:
|
|
* (c) 1999 Michael Gee (michael@linuxspecific.com)
|
|
*
|
|
* This driver is based on the 'USB Mass Storage Class' document. This
|
|
* describes in detail the protocol used to communicate with such
|
|
* devices. Clearly, the designers had SCSI and ATAPI commands in
|
|
* mind when they created this document. The commands are all very
|
|
* similar to commands in the SCSI-II and ATAPI specifications.
|
|
*
|
|
* It is important to note that in a number of cases this class
|
|
* exhibits class-specific exemptions from the USB specification.
|
|
* Notably the usage of NAK, STALL and ACK differs from the norm, in
|
|
* that they are used to communicate wait, failed and OK on commands.
|
|
*
|
|
* Also, for certain devices, the interrupt endpoint is used to convey
|
|
* status of a command.
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/cdrom.h>
|
|
#include <linux/export.h>
|
|
#include <scsi/scsi.h>
|
|
#include <scsi/scsi_cmnd.h>
|
|
#include <scsi/scsi_dbg.h>
|
|
|
|
#include "usb.h"
|
|
#include "debug.h"
|
|
|
|
|
|
void usb_stor_show_command(const struct us_data *us, struct scsi_cmnd *srb)
|
|
{
|
|
char *what = NULL;
|
|
|
|
switch (srb->cmnd[0]) {
|
|
case TEST_UNIT_READY: what = "TEST_UNIT_READY"; break;
|
|
case REZERO_UNIT: what = "REZERO_UNIT"; break;
|
|
case REQUEST_SENSE: what = "REQUEST_SENSE"; break;
|
|
case FORMAT_UNIT: what = "FORMAT_UNIT"; break;
|
|
case READ_BLOCK_LIMITS: what = "READ_BLOCK_LIMITS"; break;
|
|
case REASSIGN_BLOCKS: what = "REASSIGN_BLOCKS"; break;
|
|
case READ_6: what = "READ_6"; break;
|
|
case WRITE_6: what = "WRITE_6"; break;
|
|
case SEEK_6: what = "SEEK_6"; break;
|
|
case READ_REVERSE: what = "READ_REVERSE"; break;
|
|
case WRITE_FILEMARKS: what = "WRITE_FILEMARKS"; break;
|
|
case SPACE: what = "SPACE"; break;
|
|
case INQUIRY: what = "INQUIRY"; break;
|
|
case RECOVER_BUFFERED_DATA: what = "RECOVER_BUFFERED_DATA"; break;
|
|
case MODE_SELECT: what = "MODE_SELECT"; break;
|
|
case RESERVE: what = "RESERVE"; break;
|
|
case RELEASE: what = "RELEASE"; break;
|
|
case COPY: what = "COPY"; break;
|
|
case ERASE: what = "ERASE"; break;
|
|
case MODE_SENSE: what = "MODE_SENSE"; break;
|
|
case START_STOP: what = "START_STOP"; break;
|
|
case RECEIVE_DIAGNOSTIC: what = "RECEIVE_DIAGNOSTIC"; break;
|
|
case SEND_DIAGNOSTIC: what = "SEND_DIAGNOSTIC"; break;
|
|
case ALLOW_MEDIUM_REMOVAL: what = "ALLOW_MEDIUM_REMOVAL"; break;
|
|
case SET_WINDOW: what = "SET_WINDOW"; break;
|
|
case READ_CAPACITY: what = "READ_CAPACITY"; break;
|
|
case READ_10: what = "READ_10"; break;
|
|
case WRITE_10: what = "WRITE_10"; break;
|
|
case SEEK_10: what = "SEEK_10"; break;
|
|
case WRITE_VERIFY: what = "WRITE_VERIFY"; break;
|
|
case VERIFY: what = "VERIFY"; break;
|
|
case SEARCH_HIGH: what = "SEARCH_HIGH"; break;
|
|
case SEARCH_EQUAL: what = "SEARCH_EQUAL"; break;
|
|
case SEARCH_LOW: what = "SEARCH_LOW"; break;
|
|
case SET_LIMITS: what = "SET_LIMITS"; break;
|
|
case READ_POSITION: what = "READ_POSITION"; break;
|
|
case SYNCHRONIZE_CACHE: what = "SYNCHRONIZE_CACHE"; break;
|
|
case LOCK_UNLOCK_CACHE: what = "LOCK_UNLOCK_CACHE"; break;
|
|
case READ_DEFECT_DATA: what = "READ_DEFECT_DATA"; break;
|
|
case MEDIUM_SCAN: what = "MEDIUM_SCAN"; break;
|
|
case COMPARE: what = "COMPARE"; break;
|
|
case COPY_VERIFY: what = "COPY_VERIFY"; break;
|
|
case WRITE_BUFFER: what = "WRITE_BUFFER"; break;
|
|
case READ_BUFFER: what = "READ_BUFFER"; break;
|
|
case UPDATE_BLOCK: what = "UPDATE_BLOCK"; break;
|
|
case READ_LONG: what = "READ_LONG"; break;
|
|
case WRITE_LONG: what = "WRITE_LONG"; break;
|
|
case CHANGE_DEFINITION: what = "CHANGE_DEFINITION"; break;
|
|
case WRITE_SAME: what = "WRITE_SAME"; break;
|
|
case GPCMD_READ_SUBCHANNEL: what = "READ SUBCHANNEL"; break;
|
|
case READ_TOC: what = "READ_TOC"; break;
|
|
case GPCMD_READ_HEADER: what = "READ HEADER"; break;
|
|
case GPCMD_PLAY_AUDIO_10: what = "PLAY AUDIO (10)"; break;
|
|
case GPCMD_PLAY_AUDIO_MSF: what = "PLAY AUDIO MSF"; break;
|
|
case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
|
|
what = "GET EVENT/STATUS NOTIFICATION"; break;
|
|
case GPCMD_PAUSE_RESUME: what = "PAUSE/RESUME"; break;
|
|
case LOG_SELECT: what = "LOG_SELECT"; break;
|
|
case LOG_SENSE: what = "LOG_SENSE"; break;
|
|
case GPCMD_STOP_PLAY_SCAN: what = "STOP PLAY/SCAN"; break;
|
|
case GPCMD_READ_DISC_INFO: what = "READ DISC INFORMATION"; break;
|
|
case GPCMD_READ_TRACK_RZONE_INFO:
|
|
what = "READ TRACK INFORMATION"; break;
|
|
case GPCMD_RESERVE_RZONE_TRACK: what = "RESERVE TRACK"; break;
|
|
case GPCMD_SEND_OPC: what = "SEND OPC"; break;
|
|
case MODE_SELECT_10: what = "MODE_SELECT_10"; break;
|
|
case GPCMD_REPAIR_RZONE_TRACK: what = "REPAIR TRACK"; break;
|
|
case 0x59: what = "READ MASTER CUE"; break;
|
|
case MODE_SENSE_10: what = "MODE_SENSE_10"; break;
|
|
case GPCMD_CLOSE_TRACK: what = "CLOSE TRACK/SESSION"; break;
|
|
case 0x5C: what = "READ BUFFER CAPACITY"; break;
|
|
case 0x5D: what = "SEND CUE SHEET"; break;
|
|
case GPCMD_BLANK: what = "BLANK"; break;
|
|
case REPORT_LUNS: what = "REPORT LUNS"; break;
|
|
case MOVE_MEDIUM: what = "MOVE_MEDIUM or PLAY AUDIO (12)"; break;
|
|
case READ_12: what = "READ_12"; break;
|
|
case WRITE_12: what = "WRITE_12"; break;
|
|
case WRITE_VERIFY_12: what = "WRITE_VERIFY_12"; break;
|
|
case SEARCH_HIGH_12: what = "SEARCH_HIGH_12"; break;
|
|
case SEARCH_EQUAL_12: what = "SEARCH_EQUAL_12"; break;
|
|
case SEARCH_LOW_12: what = "SEARCH_LOW_12"; break;
|
|
case SEND_VOLUME_TAG: what = "SEND_VOLUME_TAG"; break;
|
|
case READ_ELEMENT_STATUS: what = "READ_ELEMENT_STATUS"; break;
|
|
case GPCMD_READ_CD_MSF: what = "READ CD MSF"; break;
|
|
case GPCMD_SCAN: what = "SCAN"; break;
|
|
case GPCMD_SET_SPEED: what = "SET CD SPEED"; break;
|
|
case GPCMD_MECHANISM_STATUS: what = "MECHANISM STATUS"; break;
|
|
case GPCMD_READ_CD: what = "READ CD"; break;
|
|
case 0xE1: what = "WRITE CONTINUE"; break;
|
|
case WRITE_LONG_2: what = "WRITE_LONG_2"; break;
|
|
default: what = "(unknown command)"; break;
|
|
}
|
|
usb_stor_dbg(us, "Command %s (%d bytes)\n", what, srb->cmd_len);
|
|
usb_stor_dbg(us, "bytes: %*ph\n", min_t(int, srb->cmd_len, 16),
|
|
(const unsigned char *)srb->cmnd);
|
|
}
|
|
|
|
void usb_stor_show_sense(const struct us_data *us,
|
|
unsigned char key,
|
|
unsigned char asc,
|
|
unsigned char ascq)
|
|
{
|
|
const char *what, *keystr, *fmt;
|
|
|
|
keystr = scsi_sense_key_string(key);
|
|
what = scsi_extd_sense_format(asc, ascq, &fmt);
|
|
|
|
if (keystr == NULL)
|
|
keystr = "(Unknown Key)";
|
|
if (what == NULL)
|
|
what = "(unknown ASC/ASCQ)";
|
|
|
|
if (fmt)
|
|
usb_stor_dbg(us, "%s: %s (%s%x)\n", keystr, what, fmt, ascq);
|
|
else
|
|
usb_stor_dbg(us, "%s: %s\n", keystr, what);
|
|
}
|
|
|
|
void usb_stor_dbg(const struct us_data *us, const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
dev_vprintk_emit(LOGLEVEL_DEBUG, &us->pusb_dev->dev, fmt, args);
|
|
|
|
va_end(args);
|
|
}
|
|
EXPORT_SYMBOL_GPL(usb_stor_dbg);
|