Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: [SCSI] aic94xx: fix section mismatch [SCSI] u14-34f: Fix 32bit only problem [SCSI] dpt_i2o: sysfs code [SCSI] dpt_i2o: 64 bit support [SCSI] dpt_i2o: move from virt_to_bus/bus_to_virt to dma_alloc_coherent [SCSI] dpt_i2o: use standard __init / __exit code [SCSI] megaraid_sas: fix suspend/resume sections [SCSI] aacraid: Add Power Management support [SCSI] aacraid: Fix jbod operations scan issues [SCSI] aacraid: Fix warning about macro side-effects [SCSI] add support for variable length extended commands [SCSI] Let scsi_cmnd->cmnd use request->cmd buffer [SCSI] bsg: add large command support [SCSI] aacraid: Fix down_interruptible() to check the return value correctly [SCSI] megaraid_sas; Update the Version and Changelog [SCSI] ibmvscsi: Handle non SCSI error status [SCSI] bug fix for free list handling [SCSI] ipr: Rename ipr's state scsi host attribute to prevent collisions [SCSI] megaraid_mbox: fix Dell CERC firmware problem
This commit is contained in:
+33
-7
@@ -29,13 +29,6 @@
|
||||
#define SCSI_MAX_SG_CHAIN_SEGMENTS SCSI_MAX_SG_SEGMENTS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SCSI command lengths
|
||||
*/
|
||||
|
||||
extern const unsigned char scsi_command_size[8];
|
||||
#define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
|
||||
|
||||
/*
|
||||
* Special value for scanning to specify scanning or rescanning of all
|
||||
* possible channels, (target) ids, or luns on a given shost.
|
||||
@@ -109,6 +102,7 @@ extern const unsigned char scsi_command_size[8];
|
||||
#define MODE_SENSE_10 0x5a
|
||||
#define PERSISTENT_RESERVE_IN 0x5e
|
||||
#define PERSISTENT_RESERVE_OUT 0x5f
|
||||
#define VARIABLE_LENGTH_CMD 0x7f
|
||||
#define REPORT_LUNS 0xa0
|
||||
#define MAINTENANCE_IN 0xa3
|
||||
#define MOVE_MEDIUM 0xa5
|
||||
@@ -135,6 +129,38 @@ extern const unsigned char scsi_command_size[8];
|
||||
#define ATA_16 0x85 /* 16-byte pass-thru */
|
||||
#define ATA_12 0xa1 /* 12-byte pass-thru */
|
||||
|
||||
/*
|
||||
* SCSI command lengths
|
||||
*/
|
||||
|
||||
#define SCSI_MAX_VARLEN_CDB_SIZE 260
|
||||
|
||||
/* defined in T10 SCSI Primary Commands-2 (SPC2) */
|
||||
struct scsi_varlen_cdb_hdr {
|
||||
u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
|
||||
u8 control;
|
||||
u8 misc[5];
|
||||
u8 additional_cdb_length; /* total cdb length - 8 */
|
||||
__be16 service_action;
|
||||
/* service specific data follows */
|
||||
};
|
||||
|
||||
static inline unsigned
|
||||
scsi_varlen_cdb_length(const void *hdr)
|
||||
{
|
||||
return ((struct scsi_varlen_cdb_hdr *)hdr)->additional_cdb_length + 8;
|
||||
}
|
||||
|
||||
extern const unsigned char scsi_command_size_tbl[8];
|
||||
#define COMMAND_SIZE(opcode) scsi_command_size_tbl[((opcode) >> 5) & 7]
|
||||
|
||||
static inline unsigned
|
||||
scsi_command_size(const unsigned char *cmnd)
|
||||
{
|
||||
return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
|
||||
scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
|
||||
}
|
||||
|
||||
/*
|
||||
* SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
|
||||
* T10/1561-D Revision 4 Draft dated 7th November 2002.
|
||||
|
||||
@@ -7,10 +7,28 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
struct Scsi_Host;
|
||||
struct scsi_device;
|
||||
|
||||
/*
|
||||
* MAX_COMMAND_SIZE is:
|
||||
* The longest fixed-length SCSI CDB as per the SCSI standard.
|
||||
* fixed-length means: commands that their size can be determined
|
||||
* by their opcode and the CDB does not carry a length specifier, (unlike
|
||||
* the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly
|
||||
* true and the SCSI standard also defines extended commands and
|
||||
* vendor specific commands that can be bigger than 16 bytes. The kernel
|
||||
* will support these using the same infrastructure used for VARLEN CDB's.
|
||||
* So in effect MAX_COMMAND_SIZE means the maximum size command scsi-ml
|
||||
* supports without specifying a cmd_len by ULD's
|
||||
*/
|
||||
#define MAX_COMMAND_SIZE 16
|
||||
#if (MAX_COMMAND_SIZE > BLK_MAX_CDB)
|
||||
# error MAX_COMMAND_SIZE can not be bigger than BLK_MAX_CDB
|
||||
#endif
|
||||
|
||||
struct scsi_data_buffer {
|
||||
struct sg_table table;
|
||||
unsigned length;
|
||||
@@ -60,12 +78,11 @@ struct scsi_cmnd {
|
||||
int allowed;
|
||||
int timeout_per_command;
|
||||
|
||||
unsigned char cmd_len;
|
||||
unsigned short cmd_len;
|
||||
enum dma_data_direction sc_data_direction;
|
||||
|
||||
/* These elements define the operation we are about to perform */
|
||||
#define MAX_COMMAND_SIZE 16
|
||||
unsigned char cmnd[MAX_COMMAND_SIZE];
|
||||
unsigned char *cmnd;
|
||||
|
||||
struct timer_list eh_timeout; /* Used to time out the command. */
|
||||
|
||||
|
||||
@@ -75,11 +75,11 @@ struct scsi_eh_save {
|
||||
int result;
|
||||
enum dma_data_direction data_direction;
|
||||
unsigned char cmd_len;
|
||||
unsigned char cmnd[MAX_COMMAND_SIZE];
|
||||
unsigned char *cmnd;
|
||||
struct scsi_data_buffer sdb;
|
||||
struct request *next_rq;
|
||||
|
||||
/* new command support */
|
||||
unsigned char eh_cmnd[BLK_MAX_CDB];
|
||||
struct scatterlist sense_sgl;
|
||||
};
|
||||
|
||||
|
||||
@@ -573,13 +573,11 @@ struct Scsi_Host {
|
||||
/*
|
||||
* The maximum length of SCSI commands that this host can accept.
|
||||
* Probably 12 for most host adapters, but could be 16 for others.
|
||||
* or 260 if the driver supports variable length cdbs.
|
||||
* For drivers that don't set this field, a value of 12 is
|
||||
* assumed. I am leaving this as a number rather than a bit
|
||||
* because you never know what subsequent SCSI standards might do
|
||||
* (i.e. could there be a 20 byte or a 24-byte command a few years
|
||||
* down the road?).
|
||||
* assumed.
|
||||
*/
|
||||
unsigned char max_cmd_len;
|
||||
unsigned short max_cmd_len;
|
||||
|
||||
int this_id;
|
||||
int can_queue;
|
||||
|
||||
Reference in New Issue
Block a user