187 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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
 |