📄 scsi_all.c
字号:
/* * Implementation of Utility functions for all SCSI device types. * * Copyright (c) 1997, 1998 Justin T. Gibbs. * Copyright (c) 1997, 1998 Kenneth D. Merry. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification, immediately at the beginning of the file. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: scsi_all.c,v 1.9 1998/12/11 03:53:05 gibbs Exp $ */#include <sys/param.h>#ifdef KERNEL#include <opt_scsi.h>#include <sys/systm.h>#else#include <errno.h>#include <stdio.h>#include <string.h>#endif#include <cam/cam.h>#include <cam/cam_ccb.h>#include <cam/cam_xpt.h>#include <cam/cam_xpt_periph.h>#include <cam/scsi/scsi_all.h>#ifndef KERNEL#include <camlib.h>#ifndef FALSE#define FALSE 0#endif /* FALSE */#ifndef TRUE#define TRUE 1#endif /* TRUE */#define ERESTART -1 /* restart syscall */#define EJUSTRETURN -2 /* don't modify regs, just return */#endif /* !KERNEL */const char *scsi_sense_key_text[] = { "NO SENSE", "RECOVERED ERROR", "NOT READY", "MEDIUM ERROR", "HARDWARE FAILURE", "ILLEGAL REQUEST", "UNIT ATTENTION", "DATA PROTECT", "BLANK CHECK", "Vendor Specific", "COPY ABORTED", "ABORTED COMMAND", "EQUAL", "VOLUME OVERFLOW", "MISCOMPARE", "RESERVED"};#if !defined(SCSI_NO_OP_STRINGS)#define D 0x001#define T 0x002#define L 0x004#define P 0x008#define W 0x010#define R 0x020#define S 0x040#define O 0x080#define M 0x100#define C 0x200#define A 0x400#define E 0x800#define ALL 0xFFF/* * WARNING: You must update the num_ops field below for this quirk table * entry if you add more entries. */static struct op_table_entry plextor_cd_ops[] = { {0xD8, R, "CD-DA READ"}};static struct scsi_op_quirk_entry scsi_op_quirk_table[] = { { /* * I believe that 0xD8 is the Plextor proprietary command * to read CD-DA data. I'm not sure which Plextor CDROM * models support the command, though. I know for sure * that the 4X, 8X, and 12X models do, and presumably the * 12-20X does. I don't know about any earlier models, * though. If anyone has any more complete information, * feel free to change this quirk entry. */ {T_CDROM, SIP_MEDIA_REMOVABLE, "PLEXTOR", "CD-ROM PX*", "*"}, 1, /* number of vendor-specific opcodes for this entry */ plextor_cd_ops }};static struct op_table_entry scsi_op_codes[] = {/* * From: ftp://ftp.symbios.com/pub/standards/io/t10/drafts/spc/op-num.txt * Modifications by Kenneth Merry (ken@FreeBSD.ORG) * * Note: order is important in this table, scsi_op_desc() currently * depends on the opcodes in the table being in order to save search time. *//* * File: OP-NUM.TXT * * SCSI Operation Codes * Numeric Sorted Listing * as of 11/13/96 * * D - DIRECT ACCESS DEVICE (SBC) device column key * .T - SEQUENTIAL ACCESS DEVICE (SSC) ------------------- * . L - PRINTER DEVICE (SSC) M = Mandatory * . P - PROCESSOR DEVICE (SPC) O = Optional * . .W - WRITE ONCE READ MULTIPLE DEVICE (SBC) V = Vendor specific * . . R - CD DEVICE (MMC) R = Reserved * . . S - SCANNER DEVICE (SGC) Z = Obsolete * . . .O - OPTICAL MEMORY DEVICE (SBC) * . . . M - MEDIA CHANGER DEVICE (SMC) * . . . C - COMMUNICATION DEVICE (SSC) * . . . .A - STORAGE ARRAY DEVICE (SCC) * . . . . E - ENCLOSURE SERVICES DEVICE (SES) * OP DTLPWRSOMCAE Description * -- ------------ ---------------------------------------------------- *//* 00 MMMMMMMMMMMM TEST UNIT READY */{0x00, ALL, "TEST UNIT READY"},/* 01 M REWIND */{0x01, T, "REWIND"},/* 01 Z V ZO ZO REZERO UNIT */{0x01, D|L|W|O|M, "REZERO UNIT"},/* 02 VVVVVV V *//* 03 MMMMMMMMMMMM REQUEST SENSE */{0x03, ALL, "REQUEST SENSE"},/* 04 M O O FORMAT UNIT */{0x04, D|R|O, "FORMAT UNIT"},/* 04 O FORMAT MEDIUM */{0x04, T, "FORMAT MEDIUM"},/* 04 O FORMAT */{0x04, L, "FORMAT"},/* 05 VMVVVV V READ BLOCK LIMITS */{0x05, T, "READ BLOCK LIMITS"},/* 06 VVVVVV V *//* 07 OVV O OV REASSIGN BLOCKS */{0x07, D|W|O, "REASSIGN BLOCKS"},/* 07 O INITIALIZE ELEMENT STATUS */{0x07, M, "INITIALIZE ELEMENT STATUS"},/* 08 OMV OO OV READ(06) */{0x08, D|T|W|R|O, "READ(06)"},/* 08 O RECEIVE */{0x08, P, "RECEIVE"},/* 08 M GET MESSAGE(06) */{0x08, C, "GET MESSAGE(06)"},/* 09 VVVVVV V *//* 0A OM O OV WRITE(06) */{0x0A, D|T|W|O, "WRITE(06)"},/* 0A M SEND(06) */{0x0A, P, "SEND(06)"},/* 0A M SEND MESSAGE(06) */{0x0A, C, "SEND MESSAGE(06)"},/* 0A M PRINT */{0x0A, L, "PRINT"},/* 0B Z ZO ZV SEEK(06) */{0x0B, D|W|R|O, "SEEK(06)"},/* 0B O SLEW AND PRINT */{0x0B, L, "SLEW AND PRINT"},/* 0C VVVVVV V *//* 0D VVVVVV V *//* 0E VVVVVV V *//* 0F VOVVVV V READ REVERSE */{0x0F, T, "READ REVERSE"},/* 10 VM VVV WRITE FILEMARKS */{0x10, T, "WRITE FILEMARKS"},/* 10 O O SYNCHRONIZE BUFFER */{0x10, L|W, "SYNCHRONIZE BUFFER"},/* 11 VMVVVV SPACE */{0x11, T, "SPACE"},/* 12 MMMMMMMMMMMM INQUIRY */{0x12, ALL, "INQUIRY"},/* 13 VOVVVV VERIFY(06) */{0x13, T, "VERIFY(06)"},/* 14 VOOVVV RECOVER BUFFERED DATA */{0x14, T|L, "RECOVER BUFFERED DATA"},/* 15 OMO OOOOOOOO MODE SELECT(06) */{0x15, ALL & ~(P), "MODE SELECT(06)"},/* 16 MMMOMMMM O RESERVE(06) */{0x16, D|T|L|P|W|R|S|O|E, "RESERVE(06)"},/* 16 M RESERVE ELEMENT(06) */{0x16, M, "RESERVE ELEMENT(06)"},/* 17 MMMOMMMM O RELEASE(06) */{0x17, ALL & ~(M|C|A), "RELEASE(06)"},/* 17 M RELEASE ELEMENT(06) */{0x17, M, "RELEASE ELEMENT(06)"},/* 18 OOOOOOOO COPY */{0x18, ALL & ~(M|C|A|E), "COPY"},/* 19 VMVVVV ERASE */{0x19, T, "ERASE"},/* 1A OMO OOOOOOOO MODE SENSE(06) */{0x1A, ALL & ~(P), "MODE SENSE(06)"},/* 1B O OM O STOP START UNIT */{0x1B, D|W|R|O, "STOP START UNIT"},/* 1B O LOAD UNLOAD */{0x1B, T, "LOAD UNLOAD"},/* 1B O SCAN */{0x1B, S, "SCAN"},/* 1B O STOP PRINT */{0x1B, L, "STOP PRINT"},/* 1C OOOOOOOOOO M RECEIVE DIAGNOSTIC RESULTS */{0x1C, ALL & ~(A), "RECEIVE DIAGNOSTIC RESULTS"},/* 1D MMMMMMMMMMMM SEND DIAGNOSTIC */{0x1D, ALL, "SEND DIAGNOSTIC"},/* 1E OO OM OO PREVENT ALLOW MEDIUM REMOVAL */{0x1E, D|T|W|R|O|M, "PREVENT ALLOW MEDIUM REMOVAL"},/* 1F *//* 20 V VV V *//* 21 V VV V *//* 22 V VV V *//* 23 V VV V *//* 24 V VVM SET WINDOW */{0x24, S, "SET WINDOW"},/* 25 M M M READ CAPACITY */{0x25, D|W|O, "READ CAPACITY"},/* 25 M READ CD RECORDED CAPACITY */{0x25, R, "READ CD RECORDED CAPACITY"},/* 25 O GET WINDOW */{0x25, S, "GET WINDOW"},/* 26 V VV *//* 27 V VV *//* 28 M MMMM READ(10) */{0x28, D|W|R|S|O, "READ(10)"},/* 28 O GET MESSAGE(10) */{0x28, C, "GET MESSAGE(10)"},/* 29 V VV O READ GENERATION */{0x29, O, "READ GENERATION"},/* 2A M MM M WRITE(10) */{0x2A, D|W|R|O, "WRITE(10)"},/* 2A O SEND(10) */{0x2A, S, "SEND(10)"},/* 2A O SEND MESSAGE(10) */{0x2A, C, "SEND MESSAGE(10)"},/* 2B O OM O SEEK(10) */{0x2B, D|W|R|O, "SEEK(10)"},/* 2B O LOCATE */{0x2B, T, "LOCATE"},/* 2B O POSITION TO ELEMENT */{0x2B, M, "POSITION TO ELEMENT"},/* 2C V O ERASE(10) */{0x2C, O, "ERASE(10)"},/* 2D V O O READ UPDATED BLOCK */{0x2D, W|O, "READ UPDATED BLOCK"},/* 2E O O O WRITE AND VERIFY(10) */{0x2E, D|W|O, "WRITE AND VERIFY(10)"},/* 2F O OO O VERIFY(10) */{0x2F, D|W|R|O, "VERIFY(10)"},/* 30 Z ZO Z SEARCH DATA HIGH(10) */{0x30, D|W|R|O, "SEARCH DATA HIGH(10)"},/* 31 Z ZO Z SEARCH DATA EQUAL(10) */{0x31, D|W|R|O, "SEARCH DATA EQUAL(10)"},/* 31 O OBJECT POSITION */{0x31, S, "OBJECT POSITION"},/* 32 Z ZO Z SEARCH DATA LOW(10) */{0x32, D|W|R|O, "SEARCH DATA LOW(10"},/* 33 O OO O SET LIMITS(10) */{0x33, D|W|R|O, "SET LIMITS(10)"},/* 34 O OO O PRE-FETCH */{0x34, D|W|R|O, "PRE-FETCH"},/* 34 O READ POSITION */{0x34, T, "READ POSITION"},/* 34 O GET DATA BUFFER STATUS */{0x34, S, "GET DATA BUFFER STATUS"},/* 35 O OM O SYNCHRONIZE CACHE */{0x35, D|W|R|O, "SYNCHRONIZE CACHE"},/* 36 O OO O LOCK UNLOCK CACHE */{0x36, D|W|R|O, "LOCK UNLOCK CACHE"},/* 37 O O READ DEFECT DATA(10) */{0x37, D|O, "READ DEFECT DATA(10)"},/* 38 O O MEDIUM SCAN */{0x38, W|O, "MEDIUM SCAN"},/* 39 OOOOOOOO COMPARE */{0x39, ALL & ~(M|C|A|E), "COMPARE"},/* 3A OOOOOOOO COPY AND VERIFY */{0x3A, ALL & ~(M|C|A|E), "COPY AND VERIFY"},/* 3B OOOOOOOOOO O WRITE BUFFER */{0x3B, ALL & ~(A), "WRITE BUFFER"},/* 3C OOOOOOOOOO READ BUFFER */{0x3C, ALL & ~(A|E),"READ BUFFER"},/* 3D O O UPDATE BLOCK */{0x3D, W|O, "UPDATE BLOCK"},/* 3E O OO O READ LONG */{0x3E, D|W|R|O, "READ LONG"},/* 3F O O O WRITE LONG */{0x3F, D|W|O, "WRITE LONG"},/* 40 OOOOOOOOOO CHANGE DEFINITION */{0x40, ALL & ~(A|E),"CHANGE DEFINITION"},/* 41 O WRITE SAME */{0x41, D, "WRITE SAME"},/* 42 M READ SUB-CHANNEL */{0x42, R, "READ SUB-CHANNEL"}, /* 43 M READ TOC/PMA/ATIP {MMC Proposed} */{0x43, R, "READ TOC/PMA/ATIP {MMC Proposed}"},/* 44 M REPORT DENSITY SUPPORT */{0x44, T, "REPORT DENSITY SUPPORT"},/* 44 M READ HEADER */{0x44, R, "READ HEADER"},/* 45 O PLAY AUDIO(10) */{0x45, R, "PLAY AUDIO(10)"},/* 46 *//* 47 O PLAY AUDIO MSF */{0x47, R, "PLAY AUDIO MSF"},/* 48 O PLAY AUDIO TRACK INDEX */{0x48, R, "PLAY AUDIO TRACK INDEX"},/* 49 O PLAY TRACK RELATIVE(10) */{0x49, R, "PLAY TRACK RELATIVE(10)"},/* 4A *//* 4B O PAUSE/RESUME */{0x4B, R, "PAUSE/RESUME"},/* 4C OOOOOOOOOOO LOG SELECT */{0x4C, ALL & ~(E), "LOG SELECT"},/* 4D OOOOOOOOOOO LOG SENSE */{0x4D, ALL & ~(E), "LOG SENSE"},/* 4E O STOP PLAY/SCAN {MMC Proposed} */{0x4E, R, "STOP PLAY/SCAN {MMC Proposed}"},/* 4F */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -