| /* |
| * 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 |