diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2008-04-30 04:27:26 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-05-02 12:33:25 -0400 |
commit | db4742dd8f0aa9125b74f9b2516336a75f3d9106 (patch) | |
tree | 6820b74e8fbfb13c4eee4c8ef8b59a9132320799 /include/scsi | |
parent | 64a87b244b9297667ca80264aab849a36f494884 (diff) |
[SCSI] add support for variable length extended commands
Add support for variable-length, extended, and vendor specific
CDBs to scsi-ml. It is now possible for initiators and ULD's
to issue these types of commands. LLDs need not change much.
All they need is to raise the .max_cmd_len to the longest command
they support (see iscsi patch).
- clean-up some code paths that did not expect commands to be
larger than 16, and change cmd_len members' type to short as
char is not enough.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/scsi.h | 40 | ||||
-rw-r--r-- | include/scsi/scsi_cmnd.h | 2 | ||||
-rw-r--r-- | include/scsi/scsi_host.h | 8 |
3 files changed, 37 insertions, 13 deletions
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 1f74bcd603fe..32742c4563de 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
@@ -30,13 +30,6 @@ | |||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * SCSI command lengths | ||
34 | */ | ||
35 | |||
36 | extern const unsigned char scsi_command_size[8]; | ||
37 | #define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7] | ||
38 | |||
39 | /* | ||
40 | * Special value for scanning to specify scanning or rescanning of all | 33 | * Special value for scanning to specify scanning or rescanning of all |
41 | * possible channels, (target) ids, or luns on a given shost. | 34 | * possible channels, (target) ids, or luns on a given shost. |
42 | */ | 35 | */ |
@@ -109,6 +102,7 @@ extern const unsigned char scsi_command_size[8]; | |||
109 | #define MODE_SENSE_10 0x5a | 102 | #define MODE_SENSE_10 0x5a |
110 | #define PERSISTENT_RESERVE_IN 0x5e | 103 | #define PERSISTENT_RESERVE_IN 0x5e |
111 | #define PERSISTENT_RESERVE_OUT 0x5f | 104 | #define PERSISTENT_RESERVE_OUT 0x5f |
105 | #define VARIABLE_LENGTH_CMD 0x7f | ||
112 | #define REPORT_LUNS 0xa0 | 106 | #define REPORT_LUNS 0xa0 |
113 | #define MAINTENANCE_IN 0xa3 | 107 | #define MAINTENANCE_IN 0xa3 |
114 | #define MOVE_MEDIUM 0xa5 | 108 | #define MOVE_MEDIUM 0xa5 |
@@ -136,6 +130,38 @@ extern const unsigned char scsi_command_size[8]; | |||
136 | #define ATA_12 0xa1 /* 12-byte pass-thru */ | 130 | #define ATA_12 0xa1 /* 12-byte pass-thru */ |
137 | 131 | ||
138 | /* | 132 | /* |
133 | * SCSI command lengths | ||
134 | */ | ||
135 | |||
136 | #define SCSI_MAX_VARLEN_CDB_SIZE 260 | ||
137 | |||
138 | /* defined in T10 SCSI Primary Commands-2 (SPC2) */ | ||
139 | struct scsi_varlen_cdb_hdr { | ||
140 | u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */ | ||
141 | u8 control; | ||
142 | u8 misc[5]; | ||
143 | u8 additional_cdb_length; /* total cdb length - 8 */ | ||
144 | __be16 service_action; | ||
145 | /* service specific data follows */ | ||
146 | }; | ||
147 | |||
148 | static inline unsigned | ||
149 | scsi_varlen_cdb_length(const void *hdr) | ||
150 | { | ||
151 | return ((struct scsi_varlen_cdb_hdr *)hdr)->additional_cdb_length + 8; | ||
152 | } | ||
153 | |||
154 | extern const unsigned char scsi_command_size_tbl[8]; | ||
155 | #define COMMAND_SIZE(opcode) scsi_command_size_tbl[((opcode) >> 5) & 7] | ||
156 | |||
157 | static inline unsigned | ||
158 | scsi_command_size(const unsigned char *cmnd) | ||
159 | { | ||
160 | return (cmnd[0] == VARIABLE_LENGTH_CMD) ? | ||
161 | scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]); | ||
162 | } | ||
163 | |||
164 | /* | ||
139 | * SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft | 165 | * SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft |
140 | * T10/1561-D Revision 4 Draft dated 7th November 2002. | 166 | * T10/1561-D Revision 4 Draft dated 7th November 2002. |
141 | */ | 167 | */ |
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 7ed883c8e48a..3e46dfae8194 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h | |||
@@ -78,7 +78,7 @@ struct scsi_cmnd { | |||
78 | int allowed; | 78 | int allowed; |
79 | int timeout_per_command; | 79 | int timeout_per_command; |
80 | 80 | ||
81 | unsigned char cmd_len; | 81 | unsigned short cmd_len; |
82 | enum dma_data_direction sc_data_direction; | 82 | enum dma_data_direction sc_data_direction; |
83 | 83 | ||
84 | /* These elements define the operation we are about to perform */ | 84 | /* These elements define the operation we are about to perform */ |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index d967d6dc7a28..1834fdfe82a7 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -573,13 +573,11 @@ struct Scsi_Host { | |||
573 | /* | 573 | /* |
574 | * The maximum length of SCSI commands that this host can accept. | 574 | * The maximum length of SCSI commands that this host can accept. |
575 | * Probably 12 for most host adapters, but could be 16 for others. | 575 | * Probably 12 for most host adapters, but could be 16 for others. |
576 | * or 260 if the driver supports variable length cdbs. | ||
576 | * For drivers that don't set this field, a value of 12 is | 577 | * For drivers that don't set this field, a value of 12 is |
577 | * assumed. I am leaving this as a number rather than a bit | 578 | * assumed. |
578 | * because you never know what subsequent SCSI standards might do | ||
579 | * (i.e. could there be a 20 byte or a 24-byte command a few years | ||
580 | * down the road?). | ||
581 | */ | 579 | */ |
582 | unsigned char max_cmd_len; | 580 | unsigned short max_cmd_len; |
583 | 581 | ||
584 | int this_id; | 582 | int this_id; |
585 | int can_queue; | 583 | int can_queue; |