diff options
Diffstat (limited to 'drivers/scsi/bfa/include/protocol/fcp.h')
| -rw-r--r-- | drivers/scsi/bfa/include/protocol/fcp.h | 186 | 
1 files changed, 186 insertions, 0 deletions
| diff --git a/drivers/scsi/bfa/include/protocol/fcp.h b/drivers/scsi/bfa/include/protocol/fcp.h new file mode 100644 index 000000000000..9ade68ad2853 --- /dev/null +++ b/drivers/scsi/bfa/include/protocol/fcp.h @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. + * All rights reserved + * www.brocade.com + * + * Linux driver for Brocade Fibre Channel Host Bus Adapter. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License (GPL) Version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + */ + +#ifndef __FCPPROTO_H__ +#define __FCPPROTO_H__ + +#include <protocol/scsi.h> + +#pragma pack(1) + +enum { +	FCP_RJT		= 0x01000000,	/* SRR reject */ +	FCP_SRR_ACCEPT	= 0x02000000,	/* SRR accept */ +	FCP_SRR		= 0x14000000,	/* Sequence Retransmission Request */ +}; + +/* + * SRR FC-4 LS payload + */ +struct fc_srr_s{ +	u32	ls_cmd; +	u32        ox_id:16;	/* ox-id */ +	u32        rx_id:16;	/* rx-id */ +	u32        ro;		/* relative offset */ +	u32        r_ctl:8;		/* R_CTL for I.U. */ +	u32        res:24; +}; + + +/* + * FCP_CMND definitions + */ +#define FCP_CMND_CDB_LEN    16 +#define FCP_CMND_LUN_LEN    8 + +struct fcp_cmnd_s{ +	lun_t           lun;		/* 64-bit LU number */ +	u8         crn;		/* command reference number */ +#ifdef __BIGENDIAN +	u8         resvd:1, +			priority:4,	/* FCP-3: SAM-3 priority */ +			taskattr:3;	/* scsi task attribute */ +#else +	u8         taskattr:3,	/* scsi task attribute */ +			priority:4,	/* FCP-3: SAM-3 priority */ +			resvd:1; +#endif +	u8         tm_flags;	/* task management flags */ +#ifdef __BIGENDIAN +	u8         addl_cdb_len:6,	/* additional CDB length words */ +			iodir:2;	/* read/write FCP_DATA IUs */ +#else +	u8         iodir:2,	/* read/write FCP_DATA IUs */ +			addl_cdb_len:6;	/* additional CDB length */ +#endif +	struct scsi_cdb_s      cdb; + +	/* +	 * !!! additional cdb bytes follows here!!! +	 */ +	u32        fcp_dl;	/* bytes to be transferred */ +}; + +#define fcp_cmnd_cdb_len(_cmnd) ((_cmnd)->addl_cdb_len * 4 + FCP_CMND_CDB_LEN) +#define fcp_cmnd_fcpdl(_cmnd)	((&(_cmnd)->fcp_dl)[(_cmnd)->addl_cdb_len]) + +/* + * fcp_cmnd_t.iodir field values + */ +enum fcp_iodir{ +	FCP_IODIR_NONE	= 0, +	FCP_IODIR_WRITE = 1, +	FCP_IODIR_READ	= 2, +	FCP_IODIR_RW	= 3, +}; + +/* + * Task attribute field + */ +enum { +	FCP_TASK_ATTR_SIMPLE	= 0, +	FCP_TASK_ATTR_HOQ	= 1, +	FCP_TASK_ATTR_ORDERED	= 2, +	FCP_TASK_ATTR_ACA	= 4, +	FCP_TASK_ATTR_UNTAGGED	= 5,	/* obsolete in FCP-3 */ +}; + +/* + * Task management flags field - only one bit shall be set + */ +#ifndef BIT +#define BIT(_x)	(1 << (_x)) +#endif +enum fcp_tm_cmnd{ +	FCP_TM_ABORT_TASK_SET	= BIT(1), +	FCP_TM_CLEAR_TASK_SET	= BIT(2), +	FCP_TM_LUN_RESET	= BIT(4), +	FCP_TM_TARGET_RESET	= BIT(5),	/* obsolete in FCP-3 */ +	FCP_TM_CLEAR_ACA	= BIT(6), +}; + +/* + * FCP_XFER_RDY IU defines + */ +struct fcp_xfer_rdy_s{ +	u32        data_ro; +	u32        burst_len; +	u32        reserved; +}; + +/* + * FCP_RSP residue flags + */ +enum fcp_residue{ +	FCP_NO_RESIDUE = 0,	/* no residue */ +	FCP_RESID_OVER = 1,	/* more data left that was not sent */ +	FCP_RESID_UNDER = 2,	/* less data than requested */ +}; + +enum { +	FCP_RSPINFO_GOOD = 0, +	FCP_RSPINFO_DATALEN_MISMATCH = 1, +	FCP_RSPINFO_CMND_INVALID = 2, +	FCP_RSPINFO_ROLEN_MISMATCH = 3, +	FCP_RSPINFO_TM_NOT_SUPP = 4, +	FCP_RSPINFO_TM_FAILED = 5, +}; + +struct fcp_rspinfo_s{ +	u32        res0:24; +	u32        rsp_code:8;	/* response code (as above) */ +	u32        res1; +}; + +struct fcp_resp_s{ +	u32        reserved[2];	/* 2 words reserved */ +	u16        reserved2; +#ifdef __BIGENDIAN +	u8         reserved3:3; +	u8         fcp_conf_req:1;	/* FCP_CONF is requested */ +	u8         resid_flags:2;	/* underflow/overflow */ +	u8         sns_len_valid:1;/* sense len is valid */ +	u8         rsp_len_valid:1;/* response len is valid */ +#else +	u8         rsp_len_valid:1;/* response len is valid */ +	u8         sns_len_valid:1;/* sense len is valid */ +	u8         resid_flags:2;	/* underflow/overflow */ +	u8         fcp_conf_req:1;	/* FCP_CONF is requested */ +	u8         reserved3:3; +#endif +	u8         scsi_status;	/* one byte SCSI status */ +	u32        residue;	/* residual data bytes */ +	u32        sns_len;	/* length od sense info */ +	u32        rsp_len;	/* length of response info */ +}; + +#define fcp_snslen(__fcprsp)	((__fcprsp)->sns_len_valid ? 		\ +					(__fcprsp)->sns_len : 0) +#define fcp_rsplen(__fcprsp)	((__fcprsp)->rsp_len_valid ? 		\ +					(__fcprsp)->rsp_len : 0) +#define fcp_rspinfo(__fcprsp)	((struct fcp_rspinfo_s *)((__fcprsp) + 1)) +#define fcp_snsinfo(__fcprsp)	(((u8 *)fcp_rspinfo(__fcprsp)) + 	\ +						fcp_rsplen(__fcprsp)) + +struct fcp_cmnd_fr_s{ +	struct fchs_s          fchs; +	struct fcp_cmnd_s      fcp; +}; + +#pragma pack() + +#endif | 
