diff options
Diffstat (limited to 'include/scsi')
31 files changed, 912 insertions, 2092 deletions
diff --git a/include/scsi/Kbuild b/include/scsi/Kbuild deleted file mode 100644 index f2b94918994..00000000000 --- a/include/scsi/Kbuild +++ /dev/null @@ -1,4 +0,0 @@ -header-y += scsi_netlink.h -header-y += scsi_netlink_fc.h -header-y += scsi_bsg_fc.h -header-y += fc/ diff --git a/include/scsi/fc/Kbuild b/include/scsi/fc/Kbuild index 56603813c6c..e69de29bb2d 100644 --- a/include/scsi/fc/Kbuild +++ b/include/scsi/fc/Kbuild @@ -1,4 +0,0 @@ -header-y += fc_els.h -header-y += fc_fs.h -header-y += fc_gs.h -header-y += fc_ns.h diff --git a/include/scsi/fc/fc_els.h b/include/scsi/fc/fc_els.h deleted file mode 100644 index 481abbd48e3..00000000000 --- a/include/scsi/fc/fc_els.h +++ /dev/null @@ -1,831 +0,0 @@ -/* - * Copyright(c) 2007 Intel Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * Maintained at www.Open-FCoE.org - */ - -#ifndef _FC_ELS_H_ -#define _FC_ELS_H_ - -#include <linux/types.h> - -/* - * Fibre Channel Switch - Enhanced Link Services definitions. - * From T11 FC-LS Rev 1.2 June 7, 2005. - */ - -/* - * ELS Command codes - byte 0 of the frame payload - */ -enum fc_els_cmd { - ELS_LS_RJT = 0x01, /* ESL reject */ - ELS_LS_ACC = 0x02, /* ESL Accept */ - ELS_PLOGI = 0x03, /* N_Port login */ - ELS_FLOGI = 0x04, /* F_Port login */ - ELS_LOGO = 0x05, /* Logout */ - ELS_ABTX = 0x06, /* Abort exchange - obsolete */ - ELS_RCS = 0x07, /* read connection status */ - ELS_RES = 0x08, /* read exchange status block */ - ELS_RSS = 0x09, /* read sequence status block */ - ELS_RSI = 0x0a, /* read sequence initiative */ - ELS_ESTS = 0x0b, /* establish streaming */ - ELS_ESTC = 0x0c, /* estimate credit */ - ELS_ADVC = 0x0d, /* advise credit */ - ELS_RTV = 0x0e, /* read timeout value */ - ELS_RLS = 0x0f, /* read link error status block */ - ELS_ECHO = 0x10, /* echo */ - ELS_TEST = 0x11, /* test */ - ELS_RRQ = 0x12, /* reinstate recovery qualifier */ - ELS_REC = 0x13, /* read exchange concise */ - ELS_SRR = 0x14, /* sequence retransmission request */ - ELS_PRLI = 0x20, /* process login */ - ELS_PRLO = 0x21, /* process logout */ - ELS_SCN = 0x22, /* state change notification */ - ELS_TPLS = 0x23, /* test process login state */ - ELS_TPRLO = 0x24, /* third party process logout */ - ELS_LCLM = 0x25, /* login control list mgmt (obs) */ - ELS_GAID = 0x30, /* get alias_ID */ - ELS_FACT = 0x31, /* fabric activate alias_id */ - ELS_FDACDT = 0x32, /* fabric deactivate alias_id */ - ELS_NACT = 0x33, /* N-port activate alias_id */ - ELS_NDACT = 0x34, /* N-port deactivate alias_id */ - ELS_QOSR = 0x40, /* quality of service request */ - ELS_RVCS = 0x41, /* read virtual circuit status */ - ELS_PDISC = 0x50, /* discover N_port service params */ - ELS_FDISC = 0x51, /* discover F_port service params */ - ELS_ADISC = 0x52, /* discover address */ - ELS_RNC = 0x53, /* report node cap (obs) */ - ELS_FARP_REQ = 0x54, /* FC ARP request */ - ELS_FARP_REPL = 0x55, /* FC ARP reply */ - ELS_RPS = 0x56, /* read port status block */ - ELS_RPL = 0x57, /* read port list */ - ELS_RPBC = 0x58, /* read port buffer condition */ - ELS_FAN = 0x60, /* fabric address notification */ - ELS_RSCN = 0x61, /* registered state change notification */ - ELS_SCR = 0x62, /* state change registration */ - ELS_RNFT = 0x63, /* report node FC-4 types */ - ELS_CSR = 0x68, /* clock synch. request */ - ELS_CSU = 0x69, /* clock synch. update */ - ELS_LINIT = 0x70, /* loop initialize */ - ELS_LSTS = 0x72, /* loop status */ - ELS_RNID = 0x78, /* request node ID data */ - ELS_RLIR = 0x79, /* registered link incident report */ - ELS_LIRR = 0x7a, /* link incident record registration */ - ELS_SRL = 0x7b, /* scan remote loop */ - ELS_SBRP = 0x7c, /* set bit-error reporting params */ - ELS_RPSC = 0x7d, /* report speed capabilities */ - ELS_QSA = 0x7e, /* query security attributes */ - ELS_EVFP = 0x7f, /* exchange virt. fabrics params */ - ELS_LKA = 0x80, /* link keep-alive */ - ELS_AUTH_ELS = 0x90, /* authentication ELS */ -}; - -/* - * Initializer useful for decoding table. - * Please keep this in sync with the above definitions. - */ -#define FC_ELS_CMDS_INIT { \ - [ELS_LS_RJT] = "LS_RJT", \ - [ELS_LS_ACC] = "LS_ACC", \ - [ELS_PLOGI] = "PLOGI", \ - [ELS_FLOGI] = "FLOGI", \ - [ELS_LOGO] = "LOGO", \ - [ELS_ABTX] = "ABTX", \ - [ELS_RCS] = "RCS", \ - [ELS_RES] = "RES", \ - [ELS_RSS] = "RSS", \ - [ELS_RSI] = "RSI", \ - [ELS_ESTS] = "ESTS", \ - [ELS_ESTC] = "ESTC", \ - [ELS_ADVC] = "ADVC", \ - [ELS_RTV] = "RTV", \ - [ELS_RLS] = "RLS", \ - [ELS_ECHO] = "ECHO", \ - [ELS_TEST] = "TEST", \ - [ELS_RRQ] = "RRQ", \ - [ELS_REC] = "REC", \ - [ELS_SRR] = "SRR", \ - [ELS_PRLI] = "PRLI", \ - [ELS_PRLO] = "PRLO", \ - [ELS_SCN] = "SCN", \ - [ELS_TPLS] = "TPLS", \ - [ELS_TPRLO] = "TPRLO", \ - [ELS_LCLM] = "LCLM", \ - [ELS_GAID] = "GAID", \ - [ELS_FACT] = "FACT", \ - [ELS_FDACDT] = "FDACDT", \ - [ELS_NACT] = "NACT", \ - [ELS_NDACT] = "NDACT", \ - [ELS_QOSR] = "QOSR", \ - [ELS_RVCS] = "RVCS", \ - [ELS_PDISC] = "PDISC", \ - [ELS_FDISC] = "FDISC", \ - [ELS_ADISC] = "ADISC", \ - [ELS_RNC] = "RNC", \ - [ELS_FARP_REQ] = "FARP_REQ", \ - [ELS_FARP_REPL] = "FARP_REPL", \ - [ELS_RPS] = "RPS", \ - [ELS_RPL] = "RPL", \ - [ELS_RPBC] = "RPBC", \ - [ELS_FAN] = "FAN", \ - [ELS_RSCN] = "RSCN", \ - [ELS_SCR] = "SCR", \ - [ELS_RNFT] = "RNFT", \ - [ELS_CSR] = "CSR", \ - [ELS_CSU] = "CSU", \ - [ELS_LINIT] = "LINIT", \ - [ELS_LSTS] = "LSTS", \ - [ELS_RNID] = "RNID", \ - [ELS_RLIR] = "RLIR", \ - [ELS_LIRR] = "LIRR", \ - [ELS_SRL] = "SRL", \ - [ELS_SBRP] = "SBRP", \ - [ELS_RPSC] = "RPSC", \ - [ELS_QSA] = "QSA", \ - [ELS_EVFP] = "EVFP", \ - [ELS_LKA] = "LKA", \ - [ELS_AUTH_ELS] = "AUTH_ELS", \ -} - -/* - * LS_ACC payload. - */ -struct fc_els_ls_acc { - __u8 la_cmd; /* command code ELS_LS_ACC */ - __u8 la_resv[3]; /* reserved */ -}; - -/* - * ELS reject payload. - */ -struct fc_els_ls_rjt { - __u8 er_cmd; /* command code ELS_LS_RJT */ - __u8 er_resv[4]; /* reserved must be zero */ - __u8 er_reason; /* reason (enum fc_els_rjt_reason below) */ - __u8 er_explan; /* explanation (enum fc_els_rjt_explan below) */ - __u8 er_vendor; /* vendor specific code */ -}; - -/* - * ELS reject reason codes (er_reason). - */ -enum fc_els_rjt_reason { - ELS_RJT_NONE = 0, /* no reject - not to be sent */ - ELS_RJT_INVAL = 0x01, /* invalid ELS command code */ - ELS_RJT_LOGIC = 0x03, /* logical error */ - ELS_RJT_BUSY = 0x05, /* logical busy */ - ELS_RJT_PROT = 0x07, /* protocol error */ - ELS_RJT_UNAB = 0x09, /* unable to perform command request */ - ELS_RJT_UNSUP = 0x0b, /* command not supported */ - ELS_RJT_INPROG = 0x0e, /* command already in progress */ - ELS_RJT_FIP = 0x20, /* FIP error */ - ELS_RJT_VENDOR = 0xff, /* vendor specific error */ -}; - - -/* - * reason code explanation (er_explan). - */ -enum fc_els_rjt_explan { - ELS_EXPL_NONE = 0x00, /* No additional explanation */ - ELS_EXPL_SPP_OPT_ERR = 0x01, /* service parameter error - options */ - ELS_EXPL_SPP_ICTL_ERR = 0x03, /* service parm error - initiator ctl */ - ELS_EXPL_AH = 0x11, /* invalid association header */ - ELS_EXPL_AH_REQ = 0x13, /* association_header required */ - ELS_EXPL_SID = 0x15, /* invalid originator S_ID */ - ELS_EXPL_OXID_RXID = 0x17, /* invalid OX_ID-RX_ID combination */ - ELS_EXPL_INPROG = 0x19, /* Request already in progress */ - ELS_EXPL_PLOGI_REQD = 0x1e, /* N_Port login required */ - ELS_EXPL_INSUF_RES = 0x29, /* insufficient resources */ - ELS_EXPL_UNAB_DATA = 0x2a, /* unable to supply requested data */ - ELS_EXPL_UNSUPR = 0x2c, /* Request not supported */ - ELS_EXPL_INV_LEN = 0x2d, /* Invalid payload length */ - ELS_EXPL_NOT_NEIGHBOR = 0x62, /* VN2VN_Port not in neighbor set */ - /* TBD - above definitions incomplete */ -}; - -/* - * Common service parameters (N ports). - */ -struct fc_els_csp { - __u8 sp_hi_ver; /* highest version supported (obs.) */ - __u8 sp_lo_ver; /* highest version supported (obs.) */ - __be16 sp_bb_cred; /* buffer-to-buffer credits */ - __be16 sp_features; /* common feature flags */ - __be16 sp_bb_data; /* b-b state number and data field sz */ - union { - struct { - __be16 _sp_tot_seq; /* total concurrent sequences */ - __be16 _sp_rel_off; /* rel. offset by info cat */ - } sp_plogi; - struct { - __be32 _sp_r_a_tov; /* resource alloc. timeout msec */ - } sp_flogi_acc; - } sp_u; - __be32 sp_e_d_tov; /* error detect timeout value */ -}; -#define sp_tot_seq sp_u.sp_plogi._sp_tot_seq -#define sp_rel_off sp_u.sp_plogi._sp_rel_off -#define sp_r_a_tov sp_u.sp_flogi_acc._sp_r_a_tov - -#define FC_SP_BB_DATA_MASK 0xfff /* mask for data field size in sp_bb_data */ - -/* - * Minimum and maximum values for max data field size in service parameters. - */ -#define FC_SP_MIN_MAX_PAYLOAD FC_MIN_MAX_PAYLOAD -#define FC_SP_MAX_MAX_PAYLOAD FC_MAX_PAYLOAD - -/* - * sp_features - */ -#define FC_SP_FT_NPIV 0x8000 /* multiple N_Port_ID support (FLOGI) */ -#define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel off (PLOGI) */ -#define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */ -#define FC_SP_FT_RAND 0x4000 /* random relative offset */ -#define FC_SP_FT_VAL 0x2000 /* valid vendor version level */ -#define FC_SP_FT_NPIV_ACC 0x2000 /* NPIV assignment (FLOGI LS_ACC) */ -#define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */ -#define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */ -#define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */ -#define FC_SP_FT_MCAST 0x0200 /* multicast */ -#define FC_SP_FT_BCAST 0x0100 /* broadcast */ -#define FC_SP_FT_HUNT 0x0080 /* hunt group */ -#define FC_SP_FT_SIMP 0x0040 /* dedicated simplex */ -#define FC_SP_FT_SEC 0x0020 /* reserved for security */ -#define FC_SP_FT_CSYN 0x0010 /* clock synch. supported */ -#define FC_SP_FT_RTTOV 0x0008 /* R_T_TOV value 100 uS, else 100 mS */ -#define FC_SP_FT_HALF 0x0004 /* dynamic half duplex */ -#define FC_SP_FT_SEQC 0x0002 /* SEQ_CNT */ -#define FC_SP_FT_PAYL 0x0001 /* FLOGI payload length 256, else 116 */ - -/* - * Class-specific service parameters. - */ -struct fc_els_cssp { - __be16 cp_class; /* class flags */ - __be16 cp_init; /* initiator flags */ - __be16 cp_recip; /* recipient flags */ - __be16 cp_rdfs; /* receive data field size */ - __be16 cp_con_seq; /* concurrent sequences */ - __be16 cp_ee_cred; /* N-port end-to-end credit */ - __u8 cp_resv1; /* reserved */ - __u8 cp_open_seq; /* open sequences per exchange */ - __u8 _cp_resv2[2]; /* reserved */ -}; - -/* - * cp_class flags. - */ -#define FC_CPC_VALID 0x8000 /* class valid */ -#define FC_CPC_IMIX 0x4000 /* intermix mode */ -#define FC_CPC_SEQ 0x0800 /* sequential delivery */ -#define FC_CPC_CAMP 0x0200 /* camp-on */ -#define FC_CPC_PRI 0x0080 /* priority */ - -/* - * cp_init flags. - * (TBD: not all flags defined here). - */ -#define FC_CPI_CSYN 0x0010 /* clock synch. capable */ - -/* - * cp_recip flags. - */ -#define FC_CPR_CSYN 0x0008 /* clock synch. capable */ - -/* - * NFC_ELS_FLOGI: Fabric login request. - * NFC_ELS_PLOGI: Port login request (same format). - */ -struct fc_els_flogi { - __u8 fl_cmd; /* command */ - __u8 _fl_resvd[3]; /* must be zero */ - struct fc_els_csp fl_csp; /* common service parameters */ - __be64 fl_wwpn; /* port name */ - __be64 fl_wwnn; /* node name */ - struct fc_els_cssp fl_cssp[4]; /* class 1-4 service parameters */ - __u8 fl_vend[16]; /* vendor version level */ -} __attribute__((__packed__)); - -/* - * Process login service parameter page. - */ -struct fc_els_spp { - __u8 spp_type; /* type code or common service params */ - __u8 spp_type_ext; /* type code extension */ - __u8 spp_flags; - __u8 _spp_resvd; - __be32 spp_orig_pa; /* originator process associator */ - __be32 spp_resp_pa; /* responder process associator */ - __be32 spp_params; /* service parameters */ -}; - -/* - * spp_flags. - */ -#define FC_SPP_OPA_VAL 0x80 /* originator proc. assoc. valid */ -#define FC_SPP_RPA_VAL 0x40 /* responder proc. assoc. valid */ -#define FC_SPP_EST_IMG_PAIR 0x20 /* establish image pair */ -#define FC_SPP_RESP_MASK 0x0f /* mask for response code (below) */ - -/* - * SPP response code in spp_flags - lower 4 bits. - */ -enum fc_els_spp_resp { - FC_SPP_RESP_ACK = 1, /* request executed */ - FC_SPP_RESP_RES = 2, /* unable due to lack of resources */ - FC_SPP_RESP_INIT = 3, /* initialization not complete */ - FC_SPP_RESP_NO_PA = 4, /* unknown process associator */ - FC_SPP_RESP_CONF = 5, /* configuration precludes image pair */ - FC_SPP_RESP_COND = 6, /* request completed conditionally */ - FC_SPP_RESP_MULT = 7, /* unable to handle multiple SPPs */ - FC_SPP_RESP_INVL = 8, /* SPP is invalid */ -}; - -/* - * ELS_RRQ - Reinstate Recovery Qualifier - */ -struct fc_els_rrq { - __u8 rrq_cmd; /* command (0x12) */ - __u8 rrq_zero[3]; /* specified as zero - part of cmd */ - __u8 rrq_resvd; /* reserved */ - __u8 rrq_s_id[3]; /* originator FID */ - __be16 rrq_ox_id; /* originator exchange ID */ - __be16 rrq_rx_id; /* responders exchange ID */ -}; - -/* - * ELS_REC - Read exchange concise. - */ -struct fc_els_rec { - __u8 rec_cmd; /* command (0x13) */ - __u8 rec_zero[3]; /* specified as zero - part of cmd */ - __u8 rec_resvd; /* reserved */ - __u8 rec_s_id[3]; /* originator FID */ - __be16 rec_ox_id; /* originator exchange ID */ - __be16 rec_rx_id; /* responders exchange ID */ -}; - -/* - * ELS_REC LS_ACC payload. - */ -struct fc_els_rec_acc { - __u8 reca_cmd; /* accept (0x02) */ - __u8 reca_zero[3]; /* specified as zero - part of cmd */ - __be16 reca_ox_id; /* originator exchange ID */ - __be16 reca_rx_id; /* responders exchange ID */ - __u8 reca_resvd1; /* reserved */ - __u8 reca_ofid[3]; /* originator FID */ - __u8 reca_resvd2; /* reserved */ - __u8 reca_rfid[3]; /* responder FID */ - __be32 reca_fc4value; /* FC4 value */ - __be32 reca_e_stat; /* ESB (exchange status block) status */ -}; - -/* - * ELS_PRLI - Process login request and response. - */ -struct fc_els_prli { - __u8 prli_cmd; /* command */ - __u8 prli_spp_len; /* length of each serv. parm. page */ - __be16 prli_len; /* length of entire payload */ - /* service parameter pages follow */ -}; - -/* - * ELS_PRLO - Process logout request and response. - */ -struct fc_els_prlo { - __u8 prlo_cmd; /* command */ - __u8 prlo_obs; /* obsolete, but shall be set to 10h */ - __be16 prlo_len; /* payload length */ -}; - -/* - * ELS_ADISC payload - */ -struct fc_els_adisc { - __u8 adisc_cmd; - __u8 adisc_resv[3]; - __u8 adisc_resv1; - __u8 adisc_hard_addr[3]; - __be64 adisc_wwpn; - __be64 adisc_wwnn; - __u8 adisc_resv2; - __u8 adisc_port_id[3]; -} __attribute__((__packed__)); - -/* - * ELS_LOGO - process or fabric logout. - */ -struct fc_els_logo { - __u8 fl_cmd; /* command code */ - __u8 fl_zero[3]; /* specified as zero - part of cmd */ - __u8 fl_resvd; /* reserved */ - __u8 fl_n_port_id[3];/* N port ID */ - __be64 fl_n_port_wwn; /* port name */ -}; - -/* - * ELS_RTV - read timeout value. - */ -struct fc_els_rtv { - __u8 rtv_cmd; /* command code 0x0e */ - __u8 rtv_zero[3]; /* specified as zero - part of cmd */ -}; - -/* - * LS_ACC for ELS_RTV - read timeout value. - */ -struct fc_els_rtv_acc { - __u8 rtv_cmd; /* command code 0x02 */ - __u8 rtv_zero[3]; /* specified as zero - part of cmd */ - __be32 rtv_r_a_tov; /* resource allocation timeout value */ - __be32 rtv_e_d_tov; /* error detection timeout value */ - __be32 rtv_toq; /* timeout qualifier (see below) */ -}; - -/* - * rtv_toq bits. - */ -#define FC_ELS_RTV_EDRES (1 << 26) /* E_D_TOV resolution is nS else mS */ -#define FC_ELS_RTV_RTTOV (1 << 19) /* R_T_TOV is 100 uS else 100 mS */ - -/* - * ELS_SCR - state change registration payload. - */ -struct fc_els_scr { - __u8 scr_cmd; /* command code */ - __u8 scr_resv[6]; /* reserved */ - __u8 scr_reg_func; /* registration function (see below) */ -}; - -enum fc_els_scr_func { - ELS_SCRF_FAB = 1, /* fabric-detected registration */ - ELS_SCRF_NPORT = 2, /* Nx_Port-detected registration */ - ELS_SCRF_FULL = 3, /* full registration */ - ELS_SCRF_CLEAR = 255, /* remove any current registrations */ -}; - -/* - * ELS_RSCN - registered state change notification payload. - */ -struct fc_els_rscn { - __u8 rscn_cmd; /* RSCN opcode (0x61) */ - __u8 rscn_page_len; /* page length (4) */ - __be16 rscn_plen; /* payload length including this word */ - - /* followed by 4-byte generic affected Port_ID pages */ -}; - -struct fc_els_rscn_page { - __u8 rscn_page_flags; /* event and address format */ - __u8 rscn_fid[3]; /* fabric ID */ -}; - -#define ELS_RSCN_EV_QUAL_BIT 2 /* shift count for event qualifier */ -#define ELS_RSCN_EV_QUAL_MASK 0xf /* mask for event qualifier */ -#define ELS_RSCN_ADDR_FMT_BIT 0 /* shift count for address format */ -#define ELS_RSCN_ADDR_FMT_MASK 0x3 /* mask for address format */ - -enum fc_els_rscn_ev_qual { - ELS_EV_QUAL_NONE = 0, /* unspecified */ - ELS_EV_QUAL_NS_OBJ = 1, /* changed name server object */ - ELS_EV_QUAL_PORT_ATTR = 2, /* changed port attribute */ - ELS_EV_QUAL_SERV_OBJ = 3, /* changed service object */ - ELS_EV_QUAL_SW_CONFIG = 4, /* changed switch configuration */ - ELS_EV_QUAL_REM_OBJ = 5, /* removed object */ -}; - -enum fc_els_rscn_addr_fmt { - ELS_ADDR_FMT_PORT = 0, /* rscn_fid is a port address */ - ELS_ADDR_FMT_AREA = 1, /* rscn_fid is a area address */ - ELS_ADDR_FMT_DOM = 2, /* rscn_fid is a domain address */ - ELS_ADDR_FMT_FAB = 3, /* anything on fabric may have changed */ -}; - -/* - * ELS_RNID - request Node ID. - */ -struct fc_els_rnid { - __u8 rnid_cmd; /* RNID opcode (0x78) */ - __u8 rnid_resv[3]; /* reserved */ - __u8 rnid_fmt; /* data format */ - __u8 rnid_resv2[3]; /* reserved */ -}; - -/* - * Node Identification Data formats (rnid_fmt) - */ -enum fc_els_rnid_fmt { - ELS_RNIDF_NONE = 0, /* no specific identification data */ - ELS_RNIDF_GEN = 0xdf, /* general topology discovery format */ -}; - -/* - * ELS_RNID response. - */ -struct fc_els_rnid_resp { - __u8 rnid_cmd; /* response code (LS_ACC) */ - __u8 rnid_resv[3]; /* reserved */ - __u8 rnid_fmt; /* data format */ - __u8 rnid_cid_len; /* common ID data length */ - __u8 rnid_resv2; /* reserved */ - __u8 rnid_sid_len; /* specific ID data length */ -}; - -struct fc_els_rnid_cid { - __be64 rnid_wwpn; /* N port name */ - __be64 rnid_wwnn; /* node name */ -}; - -struct fc_els_rnid_gen { - __u8 rnid_vend_id[16]; /* vendor-unique ID */ - __be32 rnid_atype; /* associated type (see below) */ - __be32 rnid_phys_port; /* physical port number */ - __be32 rnid_att_nodes; /* number of attached nodes */ - __u8 rnid_node_mgmt; /* node management (see below) */ - __u8 rnid_ip_ver; /* IP version (see below) */ - __be16 rnid_prot_port; /* UDP / TCP port number */ - __be32 rnid_ip_addr[4]; /* IP address */ - __u8 rnid_resvd[2]; /* reserved */ - __be16 rnid_vend_spec; /* vendor-specific field */ -}; - -enum fc_els_rnid_atype { - ELS_RNIDA_UNK = 0x01, /* unknown */ - ELS_RNIDA_OTHER = 0x02, /* none of the following */ - ELS_RNIDA_HUB = 0x03, - ELS_RNIDA_SWITCH = 0x04, - ELS_RNIDA_GATEWAY = 0x05, - ELS_RNIDA_CONV = 0x06, /* Obsolete, do not use this value */ - ELS_RNIDA_HBA = 0x07, /* Obsolete, do not use this value */ - ELS_RNIDA_PROXY = 0x08, /* Obsolete, do not use this value */ - ELS_RNIDA_STORAGE = 0x09, - ELS_RNIDA_HOST = 0x0a, - ELS_RNIDA_SUBSYS = 0x0b, /* storage subsystem (e.g., RAID) */ - ELS_RNIDA_ACCESS = 0x0e, /* access device (e.g. media changer) */ - ELS_RNIDA_NAS = 0x11, /* NAS server */ - ELS_RNIDA_BRIDGE = 0x12, /* bridge */ - ELS_RNIDA_VIRT = 0x13, /* virtualization device */ - ELS_RNIDA_MF = 0xff, /* multifunction device (bits below) */ - ELS_RNIDA_MF_HUB = 1UL << 31, /* hub */ - ELS_RNIDA_MF_SW = 1UL << 30, /* switch */ - ELS_RNIDA_MF_GW = 1UL << 29, /* gateway */ - ELS_RNIDA_MF_ST = 1UL << 28, /* storage */ - ELS_RNIDA_MF_HOST = 1UL << 27, /* host */ - ELS_RNIDA_MF_SUB = 1UL << 26, /* storage subsystem */ - ELS_RNIDA_MF_ACC = 1UL << 25, /* storage access dev */ - ELS_RNIDA_MF_WDM = 1UL << 24, /* wavelength division mux */ - ELS_RNIDA_MF_NAS = 1UL << 23, /* NAS server */ - ELS_RNIDA_MF_BR = 1UL << 22, /* bridge */ - ELS_RNIDA_MF_VIRT = 1UL << 21, /* virtualization device */ -}; - -enum fc_els_rnid_mgmt { - ELS_RNIDM_SNMP = 0, - ELS_RNIDM_TELNET = 1, - ELS_RNIDM_HTTP = 2, - ELS_RNIDM_HTTPS = 3, - ELS_RNIDM_XML = 4, /* HTTP + XML */ -}; - -enum fc_els_rnid_ipver { - ELS_RNIDIP_NONE = 0, /* no IP support or node mgmt. */ - ELS_RNIDIP_V4 = 1, /* IPv4 */ - ELS_RNIDIP_V6 = 2, /* IPv6 */ -}; - -/* - * ELS RPL - Read Port List. - */ -struct fc_els_rpl { - __u8 rpl_cmd; /* command */ - __u8 rpl_resv[5]; /* reserved - must be zero */ - __be16 rpl_max_size; /* maximum response size or zero */ - __u8 rpl_resv1; /* reserved - must be zero */ - __u8 rpl_index[3]; /* starting index */ -}; - -/* - * Port number block in RPL response. - */ -struct fc_els_pnb { - __be32 pnb_phys_pn; /* physical port number */ - __u8 pnb_resv; /* reserved */ - __u8 pnb_port_id[3]; /* port ID */ - __be64 pnb_wwpn; /* port name */ -}; - -/* - * RPL LS_ACC response. - */ -struct fc_els_rpl_resp { - __u8 rpl_cmd; /* ELS_LS_ACC */ - __u8 rpl_resv1; /* reserved - must be zero */ - __be16 rpl_plen; /* payload length */ - __u8 rpl_resv2; /* reserved - must be zero */ - __u8 rpl_llen[3]; /* list length */ - __u8 rpl_resv3; /* reserved - must be zero */ - __u8 rpl_index[3]; /* starting index */ - struct fc_els_pnb rpl_pnb[1]; /* variable number of PNBs */ -}; - -/* - * Link Error Status Block. - */ -struct fc_els_lesb { - __be32 lesb_link_fail; /* link failure count */ - __be32 lesb_sync_loss; /* loss of synchronization count */ - __be32 lesb_sig_loss; /* loss of signal count */ - __be32 lesb_prim_err; /* primitive sequence error count */ - __be32 lesb_inv_word; /* invalid transmission word count */ - __be32 lesb_inv_crc; /* invalid CRC count */ -}; - -/* - * ELS RPS - Read Port Status Block request. - */ -struct fc_els_rps { - __u8 rps_cmd; /* command */ - __u8 rps_resv[2]; /* reserved - must be zero */ - __u8 rps_flag; /* flag - see below */ - __be64 rps_port_spec; /* port selection */ -}; - -enum fc_els_rps_flag { - FC_ELS_RPS_DID = 0x00, /* port identified by D_ID of req. */ - FC_ELS_RPS_PPN = 0x01, /* port_spec is physical port number */ - FC_ELS_RPS_WWPN = 0x02, /* port_spec is port WWN */ -}; - -/* - * ELS RPS LS_ACC response. - */ -struct fc_els_rps_resp { - __u8 rps_cmd; /* command - LS_ACC */ - __u8 rps_resv[2]; /* reserved - must be zero */ - __u8 rps_flag; /* flag - see below */ - __u8 rps_resv2[2]; /* reserved */ - __be16 rps_status; /* port status - see below */ - struct fc_els_lesb rps_lesb; /* link error status block */ -}; - -enum fc_els_rps_resp_flag { - FC_ELS_RPS_LPEV = 0x01, /* L_port extension valid */ -}; - -enum fc_els_rps_resp_status { - FC_ELS_RPS_PTP = 1 << 5, /* point-to-point connection */ - FC_ELS_RPS_LOOP = 1 << 4, /* loop mode */ - FC_ELS_RPS_FAB = 1 << 3, /* fabric present */ - FC_ELS_RPS_NO_SIG = 1 << 2, /* loss of signal */ - FC_ELS_RPS_NO_SYNC = 1 << 1, /* loss of synchronization */ - FC_ELS_RPS_RESET = 1 << 0, /* in link reset protocol */ -}; - -/* - * ELS LIRR - Link Incident Record Registration request. - */ -struct fc_els_lirr { - __u8 lirr_cmd; /* command */ - __u8 lirr_resv[3]; /* reserved - must be zero */ - __u8 lirr_func; /* registration function */ - __u8 lirr_fmt; /* FC-4 type of RLIR requested */ - __u8 lirr_resv2[2]; /* reserved - must be zero */ -}; - -enum fc_els_lirr_func { - ELS_LIRR_SET_COND = 0x01, /* set - conditionally receive */ - ELS_LIRR_SET_UNCOND = 0x02, /* set - unconditionally receive */ - ELS_LIRR_CLEAR = 0xff /* clear registration */ -}; - -/* - * ELS SRL - Scan Remote Loop request. - */ -struct fc_els_srl { - __u8 srl_cmd; /* command */ - __u8 srl_resv[3]; /* reserved - must be zero */ - __u8 srl_flag; /* flag - see below */ - __u8 srl_flag_param[3]; /* flag parameter */ -}; - -enum fc_els_srl_flag { - FC_ELS_SRL_ALL = 0x00, /* scan all FL ports */ - FC_ELS_SRL_ONE = 0x01, /* scan specified loop */ - FC_ELS_SRL_EN_PER = 0x02, /* enable periodic scanning (param) */ - FC_ELS_SRL_DIS_PER = 0x03, /* disable periodic scanning */ -}; - -/* - * ELS RLS - Read Link Error Status Block request. - */ -struct fc_els_rls { - __u8 rls_cmd; /* command */ - __u8 rls_resv[4]; /* reserved - must be zero */ - __u8 rls_port_id[3]; /* port ID */ -}; - -/* - * ELS RLS LS_ACC Response. - */ -struct fc_els_rls_resp { - __u8 rls_cmd; /* ELS_LS_ACC */ - __u8 rls_resv[3]; /* reserved - must be zero */ - struct fc_els_lesb rls_lesb; /* link error status block */ -}; - -/* - * ELS RLIR - Registered Link Incident Report. - * This is followed by the CLIR and the CLID, described below. - */ -struct fc_els_rlir { - __u8 rlir_cmd; /* command */ - __u8 rlir_resv[3]; /* reserved - must be zero */ - __u8 rlir_fmt; /* format (FC4-type if type specific) */ - __u8 rlir_clr_len; /* common link incident record length */ - __u8 rlir_cld_len; /* common link incident desc. length */ - __u8 rlir_slr_len; /* spec. link incident record length */ -}; - -/* - * CLIR - Common Link Incident Record Data. - Sent via RLIR. - */ -struct fc_els_clir { - __be64 clir_wwpn; /* incident port name */ - __be64 clir_wwnn; /* incident port node name */ - __u8 clir_port_type; /* incident port type */ - __u8 clir_port_id[3]; /* incident port ID */ - - __be64 clir_conn_wwpn; /* connected port name */ - __be64 clir_conn_wwnn; /* connected node name */ - __be64 clir_fab_name; /* fabric name */ - __be32 clir_phys_port; /* physical port number */ - __be32 clir_trans_id; /* transaction ID */ - __u8 clir_resv[3]; /* reserved */ - __u8 clir_ts_fmt; /* time stamp format */ - __be64 clir_timestamp; /* time stamp */ -}; - -/* - * CLIR clir_ts_fmt - time stamp format values. - */ -enum fc_els_clir_ts_fmt { - ELS_CLIR_TS_UNKNOWN = 0, /* time stamp field unknown */ - ELS_CLIR_TS_SEC_FRAC = 1, /* time in seconds and fractions */ - ELS_CLIR_TS_CSU = 2, /* time in clock synch update format */ -}; - -/* - * Common Link Incident Descriptor - sent via RLIR. - */ -struct fc_els_clid { - __u8 clid_iq; /* incident qualifier flags */ - __u8 clid_ic; /* incident code */ - __be16 clid_epai; /* domain/area of ISL */ -}; - -/* - * CLID incident qualifier flags. - */ -enum fc_els_clid_iq { - ELS_CLID_SWITCH = 0x20, /* incident port is a switch node */ - ELS_CLID_E_PORT = 0x10, /* incident is an ISL (E) port */ - ELS_CLID_SEV_MASK = 0x0c, /* severity 2-bit field mask */ - ELS_CLID_SEV_INFO = 0x00, /* report is informational */ - ELS_CLID_SEV_INOP = 0x08, /* link not operational */ - ELS_CLID_SEV_DEG = 0x04, /* link degraded but operational */ - ELS_CLID_LASER = 0x02, /* subassembly is a laser */ - ELS_CLID_FRU = 0x01, /* format can identify a FRU */ -}; - -/* - * CLID incident code. - */ -enum fc_els_clid_ic { - ELS_CLID_IC_IMPL = 1, /* implicit incident */ - ELS_CLID_IC_BER = 2, /* bit-error-rate threshold exceeded */ - ELS_CLID_IC_LOS = 3, /* loss of synch or signal */ - ELS_CLID_IC_NOS = 4, /* non-operational primitive sequence */ - ELS_CLID_IC_PST = 5, /* primitive sequence timeout */ - ELS_CLID_IC_INVAL = 6, /* invalid primitive sequence */ - ELS_CLID_IC_LOOP_TO = 7, /* loop initialization time out */ - ELS_CLID_IC_LIP = 8, /* receiving LIP */ -}; - -#endif /* _FC_ELS_H_ */ diff --git a/include/scsi/fc/fc_fc2.h b/include/scsi/fc/fc_fc2.h index f87777d0d5b..0b267143130 100644 --- a/include/scsi/fc/fc_fc2.h +++ b/include/scsi/fc/fc_fc2.h @@ -104,7 +104,7 @@ struct fc_esb { * esb_e_stat - flags from FC-FS-2 T11/1619-D Rev 0.90. */ #define ESB_ST_RESP (1 << 31) /* responder to exchange */ -#define ESB_ST_SEQ_INIT (1 << 30) /* port holds sequence initiaive */ +#define ESB_ST_SEQ_INIT (1 << 30) /* port holds sequence initiative */ #define ESB_ST_COMPLETE (1 << 29) /* exchange is complete */ #define ESB_ST_ABNORMAL (1 << 28) /* abnormal ending condition */ #define ESB_ST_REC_QUAL (1 << 26) /* recovery qualifier active */ diff --git a/include/scsi/fc/fc_fs.h b/include/scsi/fc/fc_fs.h deleted file mode 100644 index 50f28b14345..00000000000 --- a/include/scsi/fc/fc_fs.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright(c) 2007 Intel Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * Maintained at www.Open-FCoE.org - */ - -#ifndef _FC_FS_H_ -#define _FC_FS_H_ - -#include <linux/types.h> - -/* - * Fibre Channel Framing and Signalling definitions. - * From T11 FC-FS-2 Rev 0.90 - 9 August 2005. - */ - -/* - * Frame header - */ -struct fc_frame_header { - __u8 fh_r_ctl; /* routing control */ - __u8 fh_d_id[3]; /* Destination ID */ - - __u8 fh_cs_ctl; /* class of service control / pri */ - __u8 fh_s_id[3]; /* Source ID */ - - __u8 fh_type; /* see enum fc_fh_type below */ - __u8 fh_f_ctl[3]; /* frame control */ - - __u8 fh_seq_id; /* sequence ID */ - __u8 fh_df_ctl; /* data field control */ - __be16 fh_seq_cnt; /* sequence count */ - - __be16 fh_ox_id; /* originator exchange ID */ - __be16 fh_rx_id; /* responder exchange ID */ - __be32 fh_parm_offset; /* parameter or relative offset */ -}; - -#define FC_FRAME_HEADER_LEN 24 /* expected length of structure */ - -#define FC_MAX_PAYLOAD 2112U /* max payload length in bytes */ -#define FC_MIN_MAX_PAYLOAD 256U /* lower limit on max payload */ - -#define FC_MAX_FRAME (FC_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) -#define FC_MIN_MAX_FRAME (FC_MIN_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) - -/* - * fh_r_ctl - Routing control definitions. - */ - /* - * FC-4 device_data. - */ -enum fc_rctl { - FC_RCTL_DD_UNCAT = 0x00, /* uncategorized information */ - FC_RCTL_DD_SOL_DATA = 0x01, /* solicited data */ - FC_RCTL_DD_UNSOL_CTL = 0x02, /* unsolicited control */ - FC_RCTL_DD_SOL_CTL = 0x03, /* solicited control or reply */ - FC_RCTL_DD_UNSOL_DATA = 0x04, /* unsolicited data */ - FC_RCTL_DD_DATA_DESC = 0x05, /* data descriptor */ - FC_RCTL_DD_UNSOL_CMD = 0x06, /* unsolicited command */ - FC_RCTL_DD_CMD_STATUS = 0x07, /* command status */ - -#define FC_RCTL_ILS_REQ FC_RCTL_DD_UNSOL_CTL /* ILS request */ -#define FC_RCTL_ILS_REP FC_RCTL_DD_SOL_CTL /* ILS reply */ - - /* - * Extended Link_Data - */ - FC_RCTL_ELS_REQ = 0x22, /* extended link services request */ - FC_RCTL_ELS_REP = 0x23, /* extended link services reply */ - FC_RCTL_ELS4_REQ = 0x32, /* FC-4 ELS request */ - FC_RCTL_ELS4_REP = 0x33, /* FC-4 ELS reply */ - /* - * Optional Extended Headers - */ - FC_RCTL_VFTH = 0x50, /* virtual fabric tagging header */ - FC_RCTL_IFRH = 0x51, /* inter-fabric routing header */ - FC_RCTL_ENCH = 0x52, /* encapsulation header */ - /* - * Basic Link Services fh_r_ctl values. - */ - FC_RCTL_BA_NOP = 0x80, /* basic link service NOP */ - FC_RCTL_BA_ABTS = 0x81, /* basic link service abort */ - FC_RCTL_BA_RMC = 0x82, /* remove connection */ - FC_RCTL_BA_ACC = 0x84, /* basic accept */ - FC_RCTL_BA_RJT = 0x85, /* basic reject */ - FC_RCTL_BA_PRMT = 0x86, /* dedicated connection preempted */ - /* - * Link Control Information. - */ - FC_RCTL_ACK_1 = 0xc0, /* acknowledge_1 */ - FC_RCTL_ACK_0 = 0xc1, /* acknowledge_0 */ - FC_RCTL_P_RJT = 0xc2, /* port reject */ - FC_RCTL_F_RJT = 0xc3, /* fabric reject */ - FC_RCTL_P_BSY = 0xc4, /* port busy */ - FC_RCTL_F_BSY = 0xc5, /* fabric busy to data frame */ - FC_RCTL_F_BSYL = 0xc6, /* fabric busy to link control frame */ - FC_RCTL_LCR = 0xc7, /* link credit reset */ - FC_RCTL_END = 0xc9, /* end */ -}; - /* incomplete list of definitions */ - -/* - * R_CTL names initializer. - * Please keep this matching the above definitions. - */ -#define FC_RCTL_NAMES_INIT { \ - [FC_RCTL_DD_UNCAT] = "uncat", \ - [FC_RCTL_DD_SOL_DATA] = "sol data", \ - [FC_RCTL_DD_UNSOL_CTL] = "unsol ctl", \ - [FC_RCTL_DD_SOL_CTL] = "sol ctl/reply", \ - [FC_RCTL_DD_UNSOL_DATA] = "unsol data", \ - [FC_RCTL_DD_DATA_DESC] = "data desc", \ - [FC_RCTL_DD_UNSOL_CMD] = "unsol cmd", \ - [FC_RCTL_DD_CMD_STATUS] = "cmd status", \ - [FC_RCTL_ELS_REQ] = "ELS req", \ - [FC_RCTL_ELS_REP] = "ELS rep", \ - [FC_RCTL_ELS4_REQ] = "FC-4 ELS req", \ - [FC_RCTL_ELS4_REP] = "FC-4 ELS rep", \ - [FC_RCTL_BA_NOP] = "BLS NOP", \ - [FC_RCTL_BA_ABTS] = "BLS abort", \ - [FC_RCTL_BA_RMC] = "BLS remove connection", \ - [FC_RCTL_BA_ACC] = "BLS accept", \ - [FC_RCTL_BA_RJT] = "BLS reject", \ - [FC_RCTL_BA_PRMT] = "BLS dedicated connection preempted", \ - [FC_RCTL_ACK_1] = "LC ACK_1", \ - [FC_RCTL_ACK_0] = "LC ACK_0", \ - [FC_RCTL_P_RJT] = "LC port reject", \ - [FC_RCTL_F_RJT] = "LC fabric reject", \ - [FC_RCTL_P_BSY] = "LC port busy", \ - [FC_RCTL_F_BSY] = "LC fabric busy to data frame", \ - [FC_RCTL_F_BSYL] = "LC fabric busy to link control frame",\ - [FC_RCTL_LCR] = "LC link credit reset", \ - [FC_RCTL_END] = "LC end", \ -} - -/* - * Well-known fabric addresses. - */ -enum fc_well_known_fid { - FC_FID_NONE = 0x000000, /* No destination */ - FC_FID_BCAST = 0xffffff, /* broadcast */ - FC_FID_FLOGI = 0xfffffe, /* fabric login */ - FC_FID_FCTRL = 0xfffffd, /* fabric controller */ - FC_FID_DIR_SERV = 0xfffffc, /* directory server */ - FC_FID_TIME_SERV = 0xfffffb, /* time server */ - FC_FID_MGMT_SERV = 0xfffffa, /* management server */ - FC_FID_QOS = 0xfffff9, /* QoS Facilitator */ - FC_FID_ALIASES = 0xfffff8, /* alias server (FC-PH2) */ - FC_FID_SEC_KEY = 0xfffff7, /* Security key dist. server */ - FC_FID_CLOCK = 0xfffff6, /* clock synch server */ - FC_FID_MCAST_SERV = 0xfffff5, /* multicast server */ -}; - -#define FC_FID_WELL_KNOWN_MAX 0xffffff /* highest well-known fabric ID */ -#define FC_FID_WELL_KNOWN_BASE 0xfffff5 /* start of well-known fabric ID */ - -/* - * Other well-known addresses, outside the above contiguous range. - */ -#define FC_FID_DOM_MGR 0xfffc00 /* domain manager base */ - -/* - * Fabric ID bytes. - */ -#define FC_FID_DOMAIN 0 -#define FC_FID_PORT 1 -#define FC_FID_LINK 2 - -/* - * fh_type codes - */ -enum fc_fh_type { - FC_TYPE_BLS = 0x00, /* basic link service */ - FC_TYPE_ELS = 0x01, /* extended link service */ - FC_TYPE_IP = 0x05, /* IP over FC, RFC 4338 */ - FC_TYPE_FCP = 0x08, /* SCSI FCP */ - FC_TYPE_CT = 0x20, /* Fibre Channel Services (FC-CT) */ - FC_TYPE_ILS = 0x22, /* internal link service */ -}; - -/* - * FC_TYPE names initializer. - * Please keep this matching the above definitions. - */ -#define FC_TYPE_NAMES_INIT { \ - [FC_TYPE_BLS] = "BLS", \ - [FC_TYPE_ELS] = "ELS", \ - [FC_TYPE_IP] = "IP", \ - [FC_TYPE_FCP] = "FCP", \ - [FC_TYPE_CT] = "CT", \ - [FC_TYPE_ILS] = "ILS", \ -} - -/* - * Exchange IDs. - */ -#define FC_XID_UNKNOWN 0xffff /* unknown exchange ID */ -#define FC_XID_MIN 0x0 /* supported min exchange ID */ -#define FC_XID_MAX 0xfffe /* supported max exchange ID */ - -/* - * fh_f_ctl - Frame control flags. - */ -#define FC_FC_EX_CTX (1 << 23) /* sent by responder to exchange */ -#define FC_FC_SEQ_CTX (1 << 22) /* sent by responder to sequence */ -#define FC_FC_FIRST_SEQ (1 << 21) /* first sequence of this exchange */ -#define FC_FC_LAST_SEQ (1 << 20) /* last sequence of this exchange */ -#define FC_FC_END_SEQ (1 << 19) /* last frame of sequence */ -#define FC_FC_END_CONN (1 << 18) /* end of class 1 connection pending */ -#define FC_FC_RES_B17 (1 << 17) /* reserved */ -#define FC_FC_SEQ_INIT (1 << 16) /* transfer of sequence initiative */ -#define FC_FC_X_ID_REASS (1 << 15) /* exchange ID has been changed */ -#define FC_FC_X_ID_INVAL (1 << 14) /* exchange ID invalidated */ - -#define FC_FC_ACK_1 (1 << 12) /* 13:12 = 1: ACK_1 expected */ -#define FC_FC_ACK_N (2 << 12) /* 13:12 = 2: ACK_N expected */ -#define FC_FC_ACK_0 (3 << 12) /* 13:12 = 3: ACK_0 expected */ - -#define FC_FC_RES_B11 (1 << 11) /* reserved */ -#define FC_FC_RES_B10 (1 << 10) /* reserved */ -#define FC_FC_RETX_SEQ (1 << 9) /* retransmitted sequence */ -#define FC_FC_UNI_TX (1 << 8) /* unidirectional transmit (class 1) */ -#define FC_FC_CONT_SEQ(i) ((i) << 6) -#define FC_FC_ABT_SEQ(i) ((i) << 4) -#define FC_FC_REL_OFF (1 << 3) /* parameter is relative offset */ -#define FC_FC_RES2 (1 << 2) /* reserved */ -#define FC_FC_FILL(i) ((i) & 3) /* 1:0: bytes of trailing fill */ - -/* - * BA_ACC payload. - */ -struct fc_ba_acc { - __u8 ba_seq_id_val; /* SEQ_ID validity */ -#define FC_BA_SEQ_ID_VAL 0x80 - __u8 ba_seq_id; /* SEQ_ID of seq last deliverable */ - __u8 ba_resvd[2]; /* reserved */ - __be16 ba_ox_id; /* OX_ID for aborted seq or exch */ - __be16 ba_rx_id; /* RX_ID for aborted seq or exch */ - __be16 ba_low_seq_cnt; /* low SEQ_CNT of aborted seq */ - __be16 ba_high_seq_cnt; /* high SEQ_CNT of aborted seq */ -}; - -/* - * BA_RJT: Basic Reject payload. - */ -struct fc_ba_rjt { - __u8 br_resvd; /* reserved */ - __u8 br_reason; /* reason code */ - __u8 br_explan; /* reason explanation */ - __u8 br_vendor; /* vendor unique code */ -}; - -/* - * BA_RJT reason codes. - * From FS-2. - */ -enum fc_ba_rjt_reason { - FC_BA_RJT_NONE = 0, /* in software this means no reject */ - FC_BA_RJT_INVL_CMD = 0x01, /* invalid command code */ - FC_BA_RJT_LOG_ERR = 0x03, /* logical error */ - FC_BA_RJT_LOG_BUSY = 0x05, /* logical busy */ - FC_BA_RJT_PROTO_ERR = 0x07, /* protocol error */ - FC_BA_RJT_UNABLE = 0x09, /* unable to perform request */ - FC_BA_RJT_VENDOR = 0xff, /* vendor-specific (see br_vendor) */ -}; - -/* - * BA_RJT reason code explanations. - */ -enum fc_ba_rjt_explan { - FC_BA_RJT_EXP_NONE = 0x00, /* no additional expanation */ - FC_BA_RJT_INV_XID = 0x03, /* invalid OX_ID-RX_ID combination */ - FC_BA_RJT_ABT = 0x05, /* sequence aborted, no seq info */ -}; - -/* - * P_RJT or F_RJT: Port Reject or Fabric Reject parameter field. - */ -struct fc_pf_rjt { - __u8 rj_action; /* reserved */ - __u8 rj_reason; /* reason code */ - __u8 rj_resvd; /* reserved */ - __u8 rj_vendor; /* vendor unique code */ -}; - -/* - * P_RJT and F_RJT reject reason codes. - */ -enum fc_pf_rjt_reason { - FC_RJT_NONE = 0, /* non-reject (reserved by standard) */ - FC_RJT_INVL_DID = 0x01, /* invalid destination ID */ - FC_RJT_INVL_SID = 0x02, /* invalid source ID */ - FC_RJT_P_UNAV_T = 0x03, /* port unavailable, temporary */ - FC_RJT_P_UNAV = 0x04, /* port unavailable, permanent */ - FC_RJT_CLS_UNSUP = 0x05, /* class not supported */ - FC_RJT_DEL_USAGE = 0x06, /* delimiter usage error */ - FC_RJT_TYPE_UNSUP = 0x07, /* type not supported */ - FC_RJT_LINK_CTL = 0x08, /* invalid link control */ - FC_RJT_R_CTL = 0x09, /* invalid R_CTL field */ - FC_RJT_F_CTL = 0x0a, /* invalid F_CTL field */ - FC_RJT_OX_ID = 0x0b, /* invalid originator exchange ID */ - FC_RJT_RX_ID = 0x0c, /* invalid responder exchange ID */ - FC_RJT_SEQ_ID = 0x0d, /* invalid sequence ID */ - FC_RJT_DF_CTL = 0x0e, /* invalid DF_CTL field */ - FC_RJT_SEQ_CNT = 0x0f, /* invalid SEQ_CNT field */ - FC_RJT_PARAM = 0x10, /* invalid parameter field */ - FC_RJT_EXCH_ERR = 0x11, /* exchange error */ - FC_RJT_PROTO = 0x12, /* protocol error */ - FC_RJT_LEN = 0x13, /* incorrect length */ - FC_RJT_UNEXP_ACK = 0x14, /* unexpected ACK */ - FC_RJT_FAB_CLASS = 0x15, /* class unsupported by fabric entity */ - FC_RJT_LOGI_REQ = 0x16, /* login required */ - FC_RJT_SEQ_XS = 0x17, /* excessive sequences attempted */ - FC_RJT_EXCH_EST = 0x18, /* unable to establish exchange */ - FC_RJT_FAB_UNAV = 0x1a, /* fabric unavailable */ - FC_RJT_VC_ID = 0x1b, /* invalid VC_ID (class 4) */ - FC_RJT_CS_CTL = 0x1c, /* invalid CS_CTL field */ - FC_RJT_INSUF_RES = 0x1d, /* insuff. resources for VC (Class 4) */ - FC_RJT_INVL_CLS = 0x1f, /* invalid class of service */ - FC_RJT_PREEMT_RJT = 0x20, /* preemption request rejected */ - FC_RJT_PREEMT_DIS = 0x21, /* preemption not enabled */ - FC_RJT_MCAST_ERR = 0x22, /* multicast error */ - FC_RJT_MCAST_ET = 0x23, /* multicast error terminate */ - FC_RJT_PRLI_REQ = 0x24, /* process login required */ - FC_RJT_INVL_ATT = 0x25, /* invalid attachment */ - FC_RJT_VENDOR = 0xff, /* vendor specific reject */ -}; - -/* default timeout values */ - -#define FC_DEF_E_D_TOV 2000UL -#define FC_DEF_R_A_TOV 10000UL - -#endif /* _FC_FS_H_ */ diff --git a/include/scsi/fc/fc_gs.h b/include/scsi/fc/fc_gs.h deleted file mode 100644 index a37346d47eb..00000000000 --- a/include/scsi/fc/fc_gs.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright(c) 2007 Intel Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * Maintained at www.Open-FCoE.org - */ - -#ifndef _FC_GS_H_ -#define _FC_GS_H_ - -#include <linux/types.h> - -/* - * Fibre Channel Services - Common Transport. - * From T11.org FC-GS-2 Rev 5.3 November 1998. - */ - -struct fc_ct_hdr { - __u8 ct_rev; /* revision */ - __u8 ct_in_id[3]; /* N_Port ID of original requestor */ - __u8 ct_fs_type; /* type of fibre channel service */ - __u8 ct_fs_subtype; /* subtype */ - __u8 ct_options; - __u8 _ct_resvd1; - __be16 ct_cmd; /* command / response code */ - __be16 ct_mr_size; /* maximum / residual size */ - __u8 _ct_resvd2; - __u8 ct_reason; /* reject reason */ - __u8 ct_explan; /* reason code explanation */ - __u8 ct_vendor; /* vendor unique data */ -}; - -#define FC_CT_HDR_LEN 16 /* expected sizeof (struct fc_ct_hdr) */ - -enum fc_ct_rev { - FC_CT_REV = 1 /* common transport revision */ -}; - -/* - * ct_fs_type values. - */ -enum fc_ct_fs_type { - FC_FST_ALIAS = 0xf8, /* alias service */ - FC_FST_MGMT = 0xfa, /* management service */ - FC_FST_TIME = 0xfb, /* time service */ - FC_FST_DIR = 0xfc, /* directory service */ -}; - -/* - * ct_cmd: Command / response codes - */ -enum fc_ct_cmd { - FC_FS_RJT = 0x8001, /* reject */ - FC_FS_ACC = 0x8002, /* accept */ -}; - -/* - * FS_RJT reason codes. - */ -enum fc_ct_reason { - FC_FS_RJT_CMD = 0x01, /* invalid command code */ - FC_FS_RJT_VER = 0x02, /* invalid version level */ - FC_FS_RJT_LOG = 0x03, /* logical error */ - FC_FS_RJT_IUSIZ = 0x04, /* invalid IU size */ - FC_FS_RJT_BSY = 0x05, /* logical busy */ - FC_FS_RJT_PROTO = 0x07, /* protocol error */ - FC_FS_RJT_UNABL = 0x09, /* unable to perform command request */ - FC_FS_RJT_UNSUP = 0x0b, /* command not supported */ -}; - -/* - * FS_RJT reason code explanations. - */ -enum fc_ct_explan { - FC_FS_EXP_NONE = 0x00, /* no additional explanation */ - FC_FS_EXP_PID = 0x01, /* port ID not registered */ - FC_FS_EXP_PNAM = 0x02, /* port name not registered */ - FC_FS_EXP_NNAM = 0x03, /* node name not registered */ - FC_FS_EXP_COS = 0x04, /* class of service not registered */ - FC_FS_EXP_FTNR = 0x07, /* FC-4 types not registered */ - /* definitions not complete */ -}; - -#endif /* _FC_GS_H_ */ diff --git a/include/scsi/fc/fc_ns.h b/include/scsi/fc/fc_ns.h deleted file mode 100644 index f7751d53f1d..00000000000 --- a/include/scsi/fc/fc_ns.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright(c) 2007 Intel Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * Maintained at www.Open-FCoE.org - */ - -#ifndef _FC_NS_H_ -#define _FC_NS_H_ - -#include <linux/types.h> - -/* - * Fibre Channel Services - Name Service (dNS) - * From T11.org FC-GS-2 Rev 5.3 November 1998. - */ - -/* - * Common-transport sub-type for Name Server. - */ -#define FC_NS_SUBTYPE 2 /* fs_ct_hdr.ct_fs_subtype */ - -/* - * Name server Requests. - * Note: this is an incomplete list, some unused requests are omitted. - */ -enum fc_ns_req { - FC_NS_GA_NXT = 0x0100, /* get all next */ - FC_NS_GI_A = 0x0101, /* get identifiers - scope */ - FC_NS_GPN_ID = 0x0112, /* get port name by ID */ - FC_NS_GNN_ID = 0x0113, /* get node name by ID */ - FC_NS_GSPN_ID = 0x0118, /* get symbolic port name */ - FC_NS_GID_PN = 0x0121, /* get ID for port name */ - FC_NS_GID_NN = 0x0131, /* get IDs for node name */ - FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */ - FC_NS_GPN_FT = 0x0172, /* get port names by FC4 type */ - FC_NS_GID_PT = 0x01a1, /* get IDs by port type */ - FC_NS_RPN_ID = 0x0212, /* reg port name for ID */ - FC_NS_RNN_ID = 0x0213, /* reg node name for ID */ - FC_NS_RFT_ID = 0x0217, /* reg FC4 type for ID */ - FC_NS_RSPN_ID = 0x0218, /* reg symbolic port name */ - FC_NS_RFF_ID = 0x021f, /* reg FC4 Features for ID */ - FC_NS_RSNN_NN = 0x0239, /* reg symbolic node name */ -}; - -/* - * Port type values. - */ -enum fc_ns_pt { - FC_NS_UNID_PORT = 0x00, /* unidentified */ - FC_NS_N_PORT = 0x01, /* N port */ - FC_NS_NL_PORT = 0x02, /* NL port */ - FC_NS_FNL_PORT = 0x03, /* F/NL port */ - FC_NS_NX_PORT = 0x7f, /* Nx port */ - FC_NS_F_PORT = 0x81, /* F port */ - FC_NS_FL_PORT = 0x82, /* FL port */ - FC_NS_E_PORT = 0x84, /* E port */ - FC_NS_B_PORT = 0x85, /* B port */ -}; - -/* - * Port type object. - */ -struct fc_ns_pt_obj { - __u8 pt_type; -}; - -/* - * Port ID object - */ -struct fc_ns_fid { - __u8 fp_flags; /* flags for responses only */ - __u8 fp_fid[3]; -}; - -/* - * fp_flags in port ID object, for responses only. - */ -#define FC_NS_FID_LAST 0x80 /* last object */ - -/* - * FC4-types object. - */ -#define FC_NS_TYPES 256 /* number of possible FC-4 types */ -#define FC_NS_BPW 32 /* bits per word in bitmap */ - -struct fc_ns_fts { - __be32 ff_type_map[FC_NS_TYPES / FC_NS_BPW]; /* bitmap of FC-4 types */ -}; - -/* - * FC4-features object. - */ -struct fc_ns_ff { - __be32 fd_feat[FC_NS_TYPES * 4 / FC_NS_BPW]; /* 4-bits per FC-type */ -}; - -/* - * GID_PT request. - */ -struct fc_ns_gid_pt { - __u8 fn_pt_type; - __u8 fn_domain_id_scope; - __u8 fn_area_id_scope; - __u8 fn_resvd; -}; - -/* - * GID_FT or GPN_FT request. - */ -struct fc_ns_gid_ft { - __u8 fn_resvd; - __u8 fn_domain_id_scope; - __u8 fn_area_id_scope; - __u8 fn_fc4_type; -}; - -/* - * GPN_FT response. - */ -struct fc_gpn_ft_resp { - __u8 fp_flags; /* see fp_flags definitions above */ - __u8 fp_fid[3]; /* port ID */ - __be32 fp_resvd; - __be64 fp_wwpn; /* port name */ -}; - -/* - * GID_PN request - */ -struct fc_ns_gid_pn { - __be64 fn_wwpn; /* port name */ -}; - -/* - * GID_PN response or GSPN_ID request - */ -struct fc_gid_pn_resp { - __u8 fp_resvd; - __u8 fp_fid[3]; /* port ID */ -}; - -/* - * GSPN_ID response - */ -struct fc_gspn_resp { - __u8 fp_name_len; - char fp_name[]; -}; - -/* - * RFT_ID request - register FC-4 types for ID. - */ -struct fc_ns_rft_id { - struct fc_ns_fid fr_fid; /* port ID object */ - struct fc_ns_fts fr_fts; /* FC-4 types object */ -}; - -/* - * RPN_ID request - register port name for ID. - * RNN_ID request - register node name for ID. - */ -struct fc_ns_rn_id { - struct fc_ns_fid fr_fid; /* port ID object */ - __be64 fr_wwn; /* node name or port name */ -} __attribute__((__packed__)); - -/* - * RSNN_NN request - register symbolic node name - */ -struct fc_ns_rsnn { - __be64 fr_wwn; /* node name */ - __u8 fr_name_len; - char fr_name[]; -} __attribute__((__packed__)); - -/* - * RSPN_ID request - register symbolic port name - */ -struct fc_ns_rspn { - struct fc_ns_fid fr_fid; /* port ID object */ - __u8 fr_name_len; - char fr_name[]; -} __attribute__((__packed__)); - -/* - * RFF_ID request - register FC-4 Features for ID. - */ -struct fc_ns_rff_id { - struct fc_ns_fid fr_fid; /* port ID object */ - __u8 fr_resvd[2]; - __u8 fr_feat; /* FC-4 Feature bits */ - __u8 fr_type; /* FC-4 type */ -} __attribute__((__packed__)); - -#endif /* _FC_NS_H_ */ diff --git a/include/scsi/fcoe_sysfs.h b/include/scsi/fcoe_sysfs.h index 604cb9bb3e7..7e231487034 100644 --- a/include/scsi/fcoe_sysfs.h +++ b/include/scsi/fcoe_sysfs.h @@ -34,7 +34,8 @@ struct fcoe_sysfs_function_template { void (*get_fcoe_ctlr_symb_err)(struct fcoe_ctlr_device *); void (*get_fcoe_ctlr_err_block)(struct fcoe_ctlr_device *); void (*get_fcoe_ctlr_fcs_error)(struct fcoe_ctlr_device *); - void (*get_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); + void (*set_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); + int (*set_fcoe_ctlr_enabled)(struct fcoe_ctlr_device *); void (*get_fcoe_fcf_selected)(struct fcoe_fcf_device *); void (*get_fcoe_fcf_vlan_id)(struct fcoe_fcf_device *); }; @@ -48,6 +49,12 @@ enum fip_conn_type { FIP_CONN_TYPE_VN2VN, }; +enum ctlr_enabled_state { + FCOE_CTLR_ENABLED, + FCOE_CTLR_DISABLED, + FCOE_CTLR_UNUSED, +}; + struct fcoe_ctlr_device { u32 id; @@ -64,6 +71,8 @@ struct fcoe_ctlr_device { int fcf_dev_loss_tmo; enum fip_conn_type mode; + enum ctlr_enabled_state enabled; + /* expected in host order for displaying */ struct fcoe_fc_els_lesb lesb; }; diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index 917741bb8e1..fd0421c6d40 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h @@ -63,6 +63,14 @@ enum iscsi_uevent_e { ISCSI_UEVENT_PING = UEVENT_BASE + 22, ISCSI_UEVENT_GET_CHAP = UEVENT_BASE + 23, ISCSI_UEVENT_DELETE_CHAP = UEVENT_BASE + 24, + ISCSI_UEVENT_SET_FLASHNODE_PARAMS = UEVENT_BASE + 25, + ISCSI_UEVENT_NEW_FLASHNODE = UEVENT_BASE + 26, + ISCSI_UEVENT_DEL_FLASHNODE = UEVENT_BASE + 27, + ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, + ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, + ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, + ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31, + ISCSI_UEVENT_GET_HOST_STATS = UEVENT_BASE + 32, /* up events */ ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, @@ -210,6 +218,34 @@ struct iscsi_uevent { uint32_t host_no; uint16_t chap_tbl_idx; } delete_chap; + struct msg_set_flashnode_param { + uint32_t host_no; + uint32_t flashnode_idx; + uint32_t count; + } set_flashnode; + struct msg_new_flashnode { + uint32_t host_no; + uint32_t len; + } new_flashnode; + struct msg_del_flashnode { + uint32_t host_no; + uint32_t flashnode_idx; + } del_flashnode; + struct msg_login_flashnode { + uint32_t host_no; + uint32_t flashnode_idx; + } login_flashnode; + struct msg_logout_flashnode { + uint32_t host_no; + uint32_t flashnode_idx; + } logout_flashnode; + struct msg_logout_flashnode_sid { + uint32_t host_no; + uint32_t sid; + } logout_flashnode_sid; + struct msg_get_host_stats { + uint32_t host_no; + } get_host_stats; } u; union { /* messages k -> u */ @@ -267,6 +303,9 @@ struct iscsi_uevent { with each ping request */ uint32_t data_size; } ping_comp; + struct msg_new_flashnode_ret { + uint32_t flashnode_idx; + } new_flashnode_ret; } r; } __attribute__ ((aligned (sizeof(uint64_t)))); @@ -274,8 +313,18 @@ enum iscsi_param_type { ISCSI_PARAM, /* iscsi_param (session, conn, target, LU) */ ISCSI_HOST_PARAM, /* iscsi_host_param */ ISCSI_NET_PARAM, /* iscsi_net_param */ + ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ + ISCSI_CHAP_PARAM, /* iscsi_chap_param */ + ISCSI_IFACE_PARAM, /* iscsi_iface_param */ }; +/* structure for minimalist usecase */ +struct iscsi_param_info { + uint32_t len; /* Actual length of the param value */ + uint16_t param; /* iscsi param */ + uint8_t value[0]; /* length sized value follows */ +} __packed; + struct iscsi_iface_param_info { uint32_t iface_num; /* iface number, 0 - n */ uint32_t len; /* Actual length of the param */ @@ -339,28 +388,106 @@ struct iscsi_path { #define ISCSI_VLAN_DISABLE 0x01 #define ISCSI_VLAN_ENABLE 0x02 +/* iscsi generic enable/disabled setting for various features */ +#define ISCSI_NET_PARAM_DISABLE 0x01 +#define ISCSI_NET_PARAM_ENABLE 0x02 + /* iSCSI network params */ enum iscsi_net_param { ISCSI_NET_PARAM_IPV4_ADDR = 1, - ISCSI_NET_PARAM_IPV4_SUBNET = 2, - ISCSI_NET_PARAM_IPV4_GW = 3, - ISCSI_NET_PARAM_IPV4_BOOTPROTO = 4, - ISCSI_NET_PARAM_MAC = 5, - ISCSI_NET_PARAM_IPV6_LINKLOCAL = 6, - ISCSI_NET_PARAM_IPV6_ADDR = 7, - ISCSI_NET_PARAM_IPV6_ROUTER = 8, - ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG = 9, - ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG = 10, - ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG = 11, - ISCSI_NET_PARAM_IFACE_ENABLE = 12, - ISCSI_NET_PARAM_VLAN_ID = 13, - ISCSI_NET_PARAM_VLAN_PRIORITY = 14, - ISCSI_NET_PARAM_VLAN_ENABLED = 15, - ISCSI_NET_PARAM_VLAN_TAG = 16, - ISCSI_NET_PARAM_IFACE_TYPE = 17, - ISCSI_NET_PARAM_IFACE_NAME = 18, - ISCSI_NET_PARAM_MTU = 19, - ISCSI_NET_PARAM_PORT = 20, + ISCSI_NET_PARAM_IPV4_SUBNET, + ISCSI_NET_PARAM_IPV4_GW, + ISCSI_NET_PARAM_IPV4_BOOTPROTO, + ISCSI_NET_PARAM_MAC, + ISCSI_NET_PARAM_IPV6_LINKLOCAL, + ISCSI_NET_PARAM_IPV6_ADDR, + ISCSI_NET_PARAM_IPV6_ROUTER, + ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG, + ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG, + ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG, + ISCSI_NET_PARAM_IFACE_ENABLE, + ISCSI_NET_PARAM_VLAN_ID, + ISCSI_NET_PARAM_VLAN_PRIORITY, + ISCSI_NET_PARAM_VLAN_ENABLED, + ISCSI_NET_PARAM_VLAN_TAG, + ISCSI_NET_PARAM_IFACE_TYPE, + ISCSI_NET_PARAM_IFACE_NAME, + ISCSI_NET_PARAM_MTU, + ISCSI_NET_PARAM_PORT, + ISCSI_NET_PARAM_IPADDR_STATE, + ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE, + ISCSI_NET_PARAM_IPV6_ROUTER_STATE, + ISCSI_NET_PARAM_DELAYED_ACK_EN, + ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, + ISCSI_NET_PARAM_TCP_WSF_DISABLE, + ISCSI_NET_PARAM_TCP_WSF, + ISCSI_NET_PARAM_TCP_TIMER_SCALE, + ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, + ISCSI_NET_PARAM_CACHE_ID, + ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, + ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, + ISCSI_NET_PARAM_IPV4_TOS_EN, + ISCSI_NET_PARAM_IPV4_TOS, + ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, + ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, + ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, + ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, + ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, + ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, + ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, + ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, + ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, + ISCSI_NET_PARAM_IPV4_TTL, + ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, + ISCSI_NET_PARAM_IPV6_MLD_EN, + ISCSI_NET_PARAM_IPV6_FLOW_LABEL, + ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, + ISCSI_NET_PARAM_IPV6_HOP_LIMIT, + ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, + ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, + ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, + ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, + ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, + ISCSI_NET_PARAM_REDIRECT_EN, +}; + +enum iscsi_ipaddress_state { + ISCSI_IPDDRESS_STATE_UNCONFIGURED, + ISCSI_IPDDRESS_STATE_ACQUIRING, + ISCSI_IPDDRESS_STATE_TENTATIVE, + ISCSI_IPDDRESS_STATE_VALID, + ISCSI_IPDDRESS_STATE_DISABLING, + ISCSI_IPDDRESS_STATE_INVALID, + ISCSI_IPDDRESS_STATE_DEPRECATED, +}; + +enum iscsi_router_state { + ISCSI_ROUTER_STATE_UNKNOWN, + ISCSI_ROUTER_STATE_ADVERTISED, + ISCSI_ROUTER_STATE_MANUAL, + ISCSI_ROUTER_STATE_STALE, +}; + +/* iSCSI specific settings params for iface */ +enum iscsi_iface_param { + ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, + ISCSI_IFACE_PARAM_HDRDGST_EN, + ISCSI_IFACE_PARAM_DATADGST_EN, + ISCSI_IFACE_PARAM_IMM_DATA_EN, + ISCSI_IFACE_PARAM_INITIAL_R2T_EN, + ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, + ISCSI_IFACE_PARAM_PDU_INORDER_EN, + ISCSI_IFACE_PARAM_ERL, + ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, + ISCSI_IFACE_PARAM_FIRST_BURST, + ISCSI_IFACE_PARAM_MAX_R2T, + ISCSI_IFACE_PARAM_MAX_BURST, + ISCSI_IFACE_PARAM_CHAP_AUTH_EN, + ISCSI_IFACE_PARAM_BIDI_CHAP_EN, + ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, + ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, + ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, + ISCSI_IFACE_PARAM_INITIATOR_NAME, }; enum iscsi_conn_state { @@ -454,6 +581,44 @@ enum iscsi_param { ISCSI_PARAM_CHAP_IN_IDX, ISCSI_PARAM_CHAP_OUT_IDX, + + ISCSI_PARAM_BOOT_ROOT, + ISCSI_PARAM_BOOT_NIC, + ISCSI_PARAM_BOOT_TARGET, + + ISCSI_PARAM_AUTO_SND_TGT_DISABLE, + ISCSI_PARAM_DISCOVERY_SESS, + ISCSI_PARAM_PORTAL_TYPE, + ISCSI_PARAM_CHAP_AUTH_EN, + ISCSI_PARAM_DISCOVERY_LOGOUT_EN, + ISCSI_PARAM_BIDI_CHAP_EN, + ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, + + ISCSI_PARAM_DEF_TIME2WAIT, + ISCSI_PARAM_DEF_TIME2RETAIN, + ISCSI_PARAM_MAX_SEGMENT_SIZE, + ISCSI_PARAM_STATSN, + ISCSI_PARAM_KEEPALIVE_TMO, + ISCSI_PARAM_LOCAL_PORT, + ISCSI_PARAM_TSID, + ISCSI_PARAM_DEF_TASKMGMT_TMO, + + ISCSI_PARAM_TCP_TIMESTAMP_STAT, + ISCSI_PARAM_TCP_WSF_DISABLE, + ISCSI_PARAM_TCP_NAGLE_DISABLE, + ISCSI_PARAM_TCP_TIMER_SCALE, + ISCSI_PARAM_TCP_TIMESTAMP_EN, + ISCSI_PARAM_TCP_XMIT_WSF, + ISCSI_PARAM_TCP_RECV_WSF, + ISCSI_PARAM_IP_FRAGMENT_DISABLE, + ISCSI_PARAM_IPV4_TOS, + ISCSI_PARAM_IPV6_TC, + ISCSI_PARAM_IPV6_FLOW_LABEL, + ISCSI_PARAM_IS_FW_ASSIGNED_IPV6, + + ISCSI_PARAM_DISCOVERY_PARENT_IDX, + ISCSI_PARAM_DISCOVERY_PARENT_TYPE, + ISCSI_PARAM_LOCAL_IPADDR, /* must always be last */ ISCSI_PARAM_MAX, }; @@ -469,6 +634,88 @@ enum iscsi_host_param { ISCSI_HOST_PARAM_MAX, }; +/* portal type */ +#define PORTAL_TYPE_IPV4 "ipv4" +#define PORTAL_TYPE_IPV6 "ipv6" + +/* iSCSI Flash Target params */ +enum iscsi_flashnode_param { + ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, + ISCSI_FLASHNODE_PORTAL_TYPE, + ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, + ISCSI_FLASHNODE_DISCOVERY_SESS, + ISCSI_FLASHNODE_ENTRY_EN, + ISCSI_FLASHNODE_HDR_DGST_EN, + ISCSI_FLASHNODE_DATA_DGST_EN, + ISCSI_FLASHNODE_IMM_DATA_EN, + ISCSI_FLASHNODE_INITIAL_R2T_EN, + ISCSI_FLASHNODE_DATASEQ_INORDER, + ISCSI_FLASHNODE_PDU_INORDER, + ISCSI_FLASHNODE_CHAP_AUTH_EN, + ISCSI_FLASHNODE_SNACK_REQ_EN, + ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, + ISCSI_FLASHNODE_BIDI_CHAP_EN, + /* make authentication for discovery sessions optional */ + ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, + ISCSI_FLASHNODE_ERL, + ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, + ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, + ISCSI_FLASHNODE_TCP_WSF_DISABLE, + ISCSI_FLASHNODE_TCP_TIMER_SCALE, + ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, + ISCSI_FLASHNODE_IP_FRAG_DISABLE, + ISCSI_FLASHNODE_MAX_RECV_DLENGTH, + ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, + ISCSI_FLASHNODE_FIRST_BURST, + ISCSI_FLASHNODE_DEF_TIME2WAIT, + ISCSI_FLASHNODE_DEF_TIME2RETAIN, + ISCSI_FLASHNODE_MAX_R2T, + ISCSI_FLASHNODE_KEEPALIVE_TMO, + ISCSI_FLASHNODE_ISID, + ISCSI_FLASHNODE_TSID, + ISCSI_FLASHNODE_PORT, + ISCSI_FLASHNODE_MAX_BURST, + ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, + ISCSI_FLASHNODE_IPADDR, + ISCSI_FLASHNODE_ALIAS, + ISCSI_FLASHNODE_REDIRECT_IPADDR, + ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, + ISCSI_FLASHNODE_LOCAL_PORT, + ISCSI_FLASHNODE_IPV4_TOS, + ISCSI_FLASHNODE_IPV6_TC, + ISCSI_FLASHNODE_IPV6_FLOW_LABEL, + ISCSI_FLASHNODE_NAME, + ISCSI_FLASHNODE_TPGT, + ISCSI_FLASHNODE_LINK_LOCAL_IPV6, + ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, + ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, + ISCSI_FLASHNODE_TCP_XMIT_WSF, + ISCSI_FLASHNODE_TCP_RECV_WSF, + ISCSI_FLASHNODE_CHAP_IN_IDX, + ISCSI_FLASHNODE_CHAP_OUT_IDX, + ISCSI_FLASHNODE_USERNAME, + ISCSI_FLASHNODE_USERNAME_IN, + ISCSI_FLASHNODE_PASSWORD, + ISCSI_FLASHNODE_PASSWORD_IN, + ISCSI_FLASHNODE_STATSN, + ISCSI_FLASHNODE_EXP_STATSN, + ISCSI_FLASHNODE_IS_BOOT_TGT, + + ISCSI_FLASHNODE_MAX, +}; + +struct iscsi_flashnode_param_info { + uint32_t len; /* Actual length of the param */ + uint16_t param; /* iscsi param value */ + uint8_t value[0]; /* length sized value follows */ +} __packed; + +enum iscsi_discovery_parent_type { + ISCSI_DISC_PARENT_UNKNOWN = 0x1, + ISCSI_DISC_PARENT_SENDTGT = 0x2, + ISCSI_DISC_PARENT_ISNS = 0x3, +}; + /* iSCSI port Speed */ enum iscsi_port_speed { ISCSI_PORT_SPEED_UNKNOWN = 0x1, @@ -585,6 +832,14 @@ enum chap_type_e { CHAP_TYPE_IN, }; +enum iscsi_chap_param { + ISCSI_CHAP_PARAM_INDEX, + ISCSI_CHAP_PARAM_CHAP_TYPE, + ISCSI_CHAP_PARAM_USERNAME, + ISCSI_CHAP_PARAM_PASSWORD, + ISCSI_CHAP_PARAM_PASSWORD_LEN +}; + #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 struct iscsi_chap_rec { @@ -595,4 +850,112 @@ struct iscsi_chap_rec { uint8_t password_length; }; +#define ISCSI_HOST_STATS_CUSTOM_MAX 32 +#define ISCSI_HOST_STATS_CUSTOM_DESC_MAX 64 +struct iscsi_host_stats_custom { + char desc[ISCSI_HOST_STATS_CUSTOM_DESC_MAX]; + uint64_t value; +}; + +/* struct iscsi_offload_host_stats: Host statistics, + * Include statistics for MAC, IP, TCP & iSCSI. + */ +struct iscsi_offload_host_stats { + /* MAC */ + uint64_t mactx_frames; + uint64_t mactx_bytes; + uint64_t mactx_multicast_frames; + uint64_t mactx_broadcast_frames; + uint64_t mactx_pause_frames; + uint64_t mactx_control_frames; + uint64_t mactx_deferral; + uint64_t mactx_excess_deferral; + uint64_t mactx_late_collision; + uint64_t mactx_abort; + uint64_t mactx_single_collision; + uint64_t mactx_multiple_collision; + uint64_t mactx_collision; + uint64_t mactx_frames_dropped; + uint64_t mactx_jumbo_frames; + uint64_t macrx_frames; + uint64_t macrx_bytes; + uint64_t macrx_unknown_control_frames; + uint64_t macrx_pause_frames; + uint64_t macrx_control_frames; + uint64_t macrx_dribble; + uint64_t macrx_frame_length_error; + uint64_t macrx_jabber; + uint64_t macrx_carrier_sense_error; + uint64_t macrx_frame_discarded; + uint64_t macrx_frames_dropped; + uint64_t mac_crc_error; + uint64_t mac_encoding_error; + uint64_t macrx_length_error_large; + uint64_t macrx_length_error_small; + uint64_t macrx_multicast_frames; + uint64_t macrx_broadcast_frames; + /* IP */ + uint64_t iptx_packets; + uint64_t iptx_bytes; + uint64_t iptx_fragments; + uint64_t iprx_packets; + uint64_t iprx_bytes; + uint64_t iprx_fragments; + uint64_t ip_datagram_reassembly; + uint64_t ip_invalid_address_error; + uint64_t ip_error_packets; + uint64_t ip_fragrx_overlap; + uint64_t ip_fragrx_outoforder; + uint64_t ip_datagram_reassembly_timeout; + uint64_t ipv6tx_packets; + uint64_t ipv6tx_bytes; + uint64_t ipv6tx_fragments; + uint64_t ipv6rx_packets; + uint64_t ipv6rx_bytes; + uint64_t ipv6rx_fragments; + uint64_t ipv6_datagram_reassembly; + uint64_t ipv6_invalid_address_error; + uint64_t ipv6_error_packets; + uint64_t ipv6_fragrx_overlap; + uint64_t ipv6_fragrx_outoforder; + uint64_t ipv6_datagram_reassembly_timeout; + /* TCP */ + uint64_t tcptx_segments; + uint64_t tcptx_bytes; + uint64_t tcprx_segments; + uint64_t tcprx_byte; + uint64_t tcp_duplicate_ack_retx; + uint64_t tcp_retx_timer_expired; + uint64_t tcprx_duplicate_ack; + uint64_t tcprx_pure_ackr; + uint64_t tcptx_delayed_ack; + uint64_t tcptx_pure_ack; + uint64_t tcprx_segment_error; + uint64_t tcprx_segment_outoforder; + uint64_t tcprx_window_probe; + uint64_t tcprx_window_update; + uint64_t tcptx_window_probe_persist; + /* ECC */ + uint64_t ecc_error_correction; + /* iSCSI */ + uint64_t iscsi_pdu_tx; + uint64_t iscsi_data_bytes_tx; + uint64_t iscsi_pdu_rx; + uint64_t iscsi_data_bytes_rx; + uint64_t iscsi_io_completed; + uint64_t iscsi_unexpected_io_rx; + uint64_t iscsi_format_error; + uint64_t iscsi_hdr_digest_error; + uint64_t iscsi_data_digest_error; + uint64_t iscsi_sequence_error; + /* + * iSCSI Custom Host Statistics support, i.e. Transport could + * extend existing host statistics with its own specific statistics + * up to ISCSI_HOST_STATS_CUSTOM_MAX + */ + uint32_t custom_length; + struct iscsi_host_stats_custom custom[0] + __aligned(sizeof(uint64_t)); +}; + #endif diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 399162b50a8..52beadf9a29 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h @@ -410,6 +410,12 @@ struct fc_seq { * @fh_type: The frame type * @class: The class of service * @seq: The sequence in use on this exchange + * @resp_active: Number of tasks that are concurrently executing @resp(). + * @resp_task: If @resp_active > 0, either the task executing @resp(), the + * task that has been interrupted to execute the soft-IRQ + * executing @resp() or NULL if more than one task is executing + * @resp concurrently. + * @resp_wq: Waitqueue for the tasks waiting on @resp_active. * @resp: Callback for responses on this exchange * @destructor: Called when destroying the exchange * @arg: Passed as a void pointer to the resp() callback @@ -441,6 +447,9 @@ struct fc_exch { u32 r_a_tov; u32 f_ctl; struct fc_seq seq; + int resp_active; + struct task_struct *resp_task; + wait_queue_head_t resp_wq; void (*resp)(struct fc_seq *, struct fc_frame *, void *); void *arg; void (*destructor)(struct fc_seq *, void *); @@ -1074,7 +1083,8 @@ void fc_rport_terminate_io(struct fc_rport *); /* * DISCOVERY LAYER *****************************/ -int fc_disc_init(struct fc_lport *); +void fc_disc_init(struct fc_lport *); +void fc_disc_config(struct fc_lport *, void *); static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc) { diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index 8742d853a3b..de7e3ee60f0 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h @@ -90,6 +90,7 @@ enum fip_state { * @lp: &fc_lport: libfc local port. * @sel_fcf: currently selected FCF, or NULL. * @fcfs: list of discovered FCFs. + * @cdev: (Optional) pointer to sysfs fcoe_ctlr_device. * @fcf_count: number of discovered FCF entries. * @sol_time: time when a multicast solicitation was last sent. * @sel_time: time after which to select an FCF. @@ -127,6 +128,7 @@ struct fcoe_ctlr { struct fc_lport *lp; struct fcoe_fcf *sel_fcf; struct list_head fcfs; + struct fcoe_ctlr_device *cdev; u16 fcf_count; unsigned long sol_time; unsigned long sel_time; @@ -168,8 +170,11 @@ static inline void *fcoe_ctlr_priv(const struct fcoe_ctlr *ctlr) return (void *)(ctlr + 1); } +/* + * This assumes that the fcoe_ctlr (x) is allocated with the fcoe_ctlr_device. + */ #define fcoe_ctlr_to_ctlr_dev(x) \ - (struct fcoe_ctlr_device *)(((struct fcoe_ctlr_device *)(x)) - 1) + (x)->cdev /** * struct fcoe_fcf - Fibre-Channel Forwarder @@ -260,6 +265,9 @@ void __fcoe_get_lesb(struct fc_lport *lport, struct fc_els_lesb *fc_lesb, struct net_device *netdev); void fcoe_wwn_to_str(u64 wwn, char *buf, int len); int fcoe_validate_vport_create(struct fc_vport *vport); +int fcoe_link_speed_update(struct fc_lport *); +void fcoe_get_lesb(struct fc_lport *, struct fc_els_lesb *); +void fcoe_ctlr_get_lesb(struct fcoe_ctlr_device *ctlr_dev); /** * is_fip_mode() - returns true if FIP mode selected. @@ -289,8 +297,11 @@ static inline bool is_fip_mode(struct fcoe_ctlr *fip) * @attached: whether this transport is already attached * @list: list linkage to all attached transports * @match: handler to allow the transport driver to match up a given netdev + * @alloc: handler to allocate per-instance FCoE structures + * (no discovery or login) * @create: handler to sysfs entry of create for FCoE instances - * @destroy: handler to sysfs entry of destroy for FCoE instances + * @destroy: handler to delete per-instance FCoE structures + * (frees all memory) * @enable: handler to sysfs entry of enable for FCoE instances * @disable: handler to sysfs entry of disable for FCoE instances */ @@ -299,6 +310,7 @@ struct fcoe_transport { bool attached; struct list_head list; bool (*match) (struct net_device *device); + int (*alloc) (struct net_device *device); int (*create) (struct net_device *device, enum fip_state fip_mode); int (*destroy) (struct net_device *device); int (*enable) (struct net_device *device); @@ -347,7 +359,20 @@ struct fcoe_port { struct timer_list timer; struct work_struct destroy_work; u8 data_src_addr[ETH_ALEN]; + struct net_device * (*get_netdev)(const struct fc_lport *lport); }; + +/** + * fcoe_get_netdev() - Return the net device associated with a local port + * @lport: The local port to get the net device from + */ +static inline struct net_device *fcoe_get_netdev(const struct fc_lport *lport) +{ + struct fcoe_port *port = ((struct fcoe_port *)lport_priv(lport)); + + return (port->get_netdev) ? port->get_netdev(lport) : NULL; +} + void fcoe_clean_pending_queue(struct fc_lport *); void fcoe_check_wait_queue(struct fc_lport *lport, struct sk_buff *skb); void fcoe_queue_timer(ulong lport); @@ -356,7 +381,7 @@ int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen, /* FCoE Sysfs helpers */ void fcoe_fcf_get_selected(struct fcoe_fcf_device *); -void fcoe_ctlr_get_fip_mode(struct fcoe_ctlr_device *); +void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *); /** * struct netdev_list @@ -372,4 +397,12 @@ struct fcoe_netdev_mapping { int fcoe_transport_attach(struct fcoe_transport *ft); int fcoe_transport_detach(struct fcoe_transport *ft); +/* sysfs store handler for ctrl_control interface */ +ssize_t fcoe_ctlr_create_store(struct bus_type *bus, + const char *buf, size_t count); +ssize_t fcoe_ctlr_destroy_store(struct bus_type *bus, + const char *buf, size_t count); + #endif /* _LIBFCOE_H */ + + diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 6e33386a389..728c9ad9feb 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h @@ -62,6 +62,8 @@ enum { TMF_NOT_FOUND, }; +#define ISID_SIZE 6 + /* Connection suspend "bit" */ #define ISCSI_SUSPEND_BIT 1 @@ -131,6 +133,10 @@ struct iscsi_task { unsigned long last_xfer; unsigned long last_timeout; bool have_checked_conn; + + /* T10 protection information */ + bool protected; + /* state set/tested under session->lock */ int state; atomic_t refcount; @@ -173,6 +179,7 @@ struct iscsi_conn { /* iSCSI connection-wide sequencing */ uint32_t exp_statsn; + uint32_t statsn; /* control data */ int id; /* CID */ @@ -213,6 +220,23 @@ struct iscsi_conn { int persistent_port; char *persistent_address; + unsigned max_segment_size; + unsigned tcp_xmit_wsf; + unsigned tcp_recv_wsf; + uint16_t keepalive_tmo; + uint16_t local_port; + uint8_t tcp_timestamp_stat; + uint8_t tcp_nagle_disable; + uint8_t tcp_wsf_disable; + uint8_t tcp_timer_scale; + uint8_t tcp_timestamp_en; + uint8_t fragment_disable; + uint8_t ipv4_tos; + uint8_t ipv6_traffic_class; + uint8_t ipv6_flow_label; + uint8_t is_fw_assigned_ipv6; + char *local_ipaddr; + /* MIB-statistics */ uint64_t txdata_octets; uint64_t rxdata_octets; @@ -287,16 +311,39 @@ struct iscsi_session { char *targetalias; char *ifacename; char *initiatorname; + char *boot_root; + char *boot_nic; + char *boot_target; + char *portal_type; + char *discovery_parent_type; + uint16_t discovery_parent_idx; + uint16_t def_taskmgmt_tmo; + uint16_t tsid; + uint8_t auto_snd_tgt_disable; + uint8_t discovery_sess; + uint8_t chap_auth_en; + uint8_t discovery_logout_en; + uint8_t bidi_chap_en; + uint8_t discovery_auth_optional; + uint8_t isid[ISID_SIZE]; + /* control data */ struct iscsi_transport *tt; struct Scsi_Host *host; struct iscsi_conn *leadconn; /* leading connection */ - spinlock_t lock; /* protects session state, * - * sequence numbers, * + /* Between the forward and the backward locks exists a strict locking + * hierarchy. The mutual exclusion zone protected by the forward lock + * can enclose the mutual exclusion zone protected by the backward lock + * but not vice versa. + */ + spinlock_t frwd_lock; /* protects session state, * + * cmdsn, queued_cmdsn * * session resources: * - * - cmdpool, * - * - mgmtpool, * - * - r2tpool */ + * - cmdpool kfifo_out , * + * - mgmtpool, */ + spinlock_t back_lock; /* protects cmdsn_exp * + * cmdsn_max, * + * cmdpool kfifo_in */ int state; /* session state */ int age; /* counts session re-opens */ @@ -427,6 +474,7 @@ extern void iscsi_complete_scsi_task(struct iscsi_task *task, */ extern void iscsi_pool_free(struct iscsi_pool *); extern int iscsi_pool_init(struct iscsi_pool *, int, void ***, int); +extern int iscsi_switch_str_param(char **, char *); /* * inline functions to deal with padding. diff --git a/include/scsi/libiscsi_tcp.h b/include/scsi/libiscsi_tcp.h index 215469a9b80..2a7aa75dd00 100644 --- a/include/scsi/libiscsi_tcp.h +++ b/include/scsi/libiscsi_tcp.h @@ -83,6 +83,8 @@ struct iscsi_tcp_task { struct iscsi_pool r2tpool; struct kfifo r2tqueue; void *dd_data; + spinlock_t pool2queue; + spinlock_t queue2pool; }; enum { diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index ef937b56f9b..ef7872c20da 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -118,7 +118,7 @@ struct ex_phy { enum ex_phy_state phy_state; - enum sas_dev_type attached_dev_type; + enum sas_device_type attached_dev_type; enum sas_linkrate linkrate; u8 attached_sata_host:1; @@ -172,7 +172,6 @@ struct sata_device { enum ata_command_set command_set; struct smp_resp rps_resp; /* report_phy_sata_resp */ u8 port_no; /* port number, if this is a PM (Port) */ - int pm_result; struct ata_port *ap; struct ata_host ata_host; @@ -195,7 +194,7 @@ enum { struct domain_device { spinlock_t done_lock; - enum sas_dev_type dev_type; + enum sas_device_type dev_type; enum sas_linkrate linkrate; enum sas_linkrate min_linkrate; @@ -608,7 +607,7 @@ struct sas_ssp_task { u8 enable_first_burst:1; enum task_attribute task_attr; u8 task_prio; - u8 cdb[16]; + struct scsi_cmnd *cmd; }; struct sas_task { diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h index a5f9b960dfc..6ca3265a4dc 100644 --- a/include/scsi/osd_ore.h +++ b/include/scsi/osd_ore.h @@ -102,6 +102,7 @@ struct ore_striping_info { unsigned unit_off; unsigned cur_pg; unsigned cur_comp; + unsigned maxdevUnits; }; struct ore_io_state; diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h index a6026da25f3..a2594afe05c 100644 --- a/include/scsi/osd_protocol.h +++ b/include/scsi/osd_protocol.h @@ -107,7 +107,7 @@ enum osd_attributes_mode { * int exponent: 04; * } */ -typedef __be32 __bitwise osd_cdb_offset; +typedef __be32 osd_cdb_offset; enum { OSD_OFFSET_UNUSED = 0xFFFFFFFF, @@ -263,16 +263,16 @@ static inline struct osd_cdb_head *osd_cdb_head(struct osd_cdb *ocdb) * Ex name = FORMAT_OSD we have OSD_ACT_FORMAT_OSD && OSDv1_ACT_FORMAT_OSD */ #define OSD_ACT___(Name, Num) \ - OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num), \ - OSDv1_ACT_##Name = __constant_cpu_to_be16(0x8800 + Num), + OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), \ + OSDv1_ACT_##Name = cpu_to_be16(0x8800 + Num), /* V2 only actions */ #define OSD_ACT_V2(Name, Num) \ - OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num), + OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), #define OSD_ACT_V1_V2(Name, Num1, Num2) \ - OSD_ACT_##Name = __constant_cpu_to_be16(Num2), \ - OSDv1_ACT_##Name = __constant_cpu_to_be16(Num1), + OSD_ACT_##Name = cpu_to_be16(Num2), \ + OSDv1_ACT_##Name = cpu_to_be16(Num1), enum osd_service_actions { OSD_ACT_V2(OBJECT_STRUCTURE_CHECK, 0x00) diff --git a/include/scsi/sas.h b/include/scsi/sas.h index be3eb0bf1ac..0d2607d1238 100644 --- a/include/scsi/sas.h +++ b/include/scsi/sas.h @@ -90,16 +90,18 @@ enum sas_oob_mode { }; /* See sas_discover.c if you plan on changing these */ -enum sas_dev_type { - NO_DEVICE = 0, /* protocol */ - SAS_END_DEV = 1, /* protocol */ - EDGE_DEV = 2, /* protocol */ - FANOUT_DEV = 3, /* protocol */ - SAS_HA = 4, - SATA_DEV = 5, - SATA_PM = 7, - SATA_PM_PORT= 8, - SATA_PENDING = 9, +enum sas_device_type { + /* these are SAS protocol defined (attached device type field) */ + SAS_PHY_UNUSED = 0, + SAS_END_DEVICE = 1, + SAS_EDGE_EXPANDER_DEVICE = 2, + SAS_FANOUT_EXPANDER_DEVICE = 3, + /* these are internal to libsas */ + SAS_HA = 4, + SAS_SATA_DEV = 5, + SAS_SATA_PM = 7, + SAS_SATA_PM_PORT = 8, + SAS_SATA_PENDING = 9, }; enum sas_protocol { diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h index ff71a565468..00f41aeeecf 100644 --- a/include/scsi/sas_ata.h +++ b/include/scsi/sas_ata.h @@ -32,8 +32,8 @@ static inline int dev_is_sata(struct domain_device *dev) { - return dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM || - dev->dev_type == SATA_PM_PORT || dev->dev_type == SATA_PENDING; + return dev->dev_type == SAS_SATA_DEV || dev->dev_type == SAS_SATA_PM || + dev->dev_type == SAS_SATA_PM_PORT || dev->dev_type == SAS_SATA_PENDING; } int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy); diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 66216c1acb4..0a4edfe8af5 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h @@ -10,9 +10,14 @@ #include <linux/types.h> #include <linux/scatterlist.h> +#include <linux/kernel.h> struct scsi_cmnd; +enum scsi_timeouts { + SCSI_DEFAULT_EH_TIMEOUT = 10 * HZ, +}; + /* * The maximum number of SG segments that we will put inside a * scatterlist (unless chaining is used). Should ideally fit inside a @@ -139,6 +144,7 @@ struct scsi_cmnd; #define ACCESS_CONTROL_IN 0x86 #define ACCESS_CONTROL_OUT 0x87 #define READ_16 0x88 +#define COMPARE_AND_WRITE 0x89 #define WRITE_16 0x8a #define READ_ATTRIBUTE 0x8c #define WRITE_ATTRIBUTE 0x8d @@ -149,6 +155,7 @@ struct scsi_cmnd; /* values for service action in */ #define SAI_READ_CAPACITY_16 0x10 #define SAI_GET_LBA_STATUS 0x12 +#define SAI_REPORT_REFERRALS 0x13 /* values for VARIABLE_LENGTH_CMD service action codes * see spc4r17 Section D.3.5, table D.7 and D.8 */ #define VLC_SA_RECEIVE_CREDENTIAL 0x1800 @@ -452,6 +459,8 @@ static inline int scsi_is_wlun(unsigned int lun) * other paths */ #define DID_NEXUS_FAILURE 0x11 /* Permanent nexus failure, retry on other * paths might yield different results */ +#define DID_ALLOC_FAILURE 0x12 /* Space allocation on the device failed */ +#define DID_MEDIUM_ERROR 0x13 /* Medium error */ #define DRIVER_OK 0x00 /* Driver status */ /* @@ -481,7 +490,6 @@ static inline int scsi_is_wlun(unsigned int lun) #define TIMEOUT_ERROR 0x2007 #define SCSI_RETURN_NOT_HANDLED 0x2008 #define FAST_IO_FAIL 0x2009 -#define TARGET_ERROR 0x200A /* * Midlevel queue return values. diff --git a/include/scsi/scsi_bsg_fc.h b/include/scsi/scsi_bsg_fc.h deleted file mode 100644 index 3031b900b08..00000000000 --- a/include/scsi/scsi_bsg_fc.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - * FC Transport BSG Interface - * - * Copyright (C) 2008 James Smart, Emulex Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef SCSI_BSG_FC_H -#define SCSI_BSG_FC_H - -/* - * This file intended to be included by both kernel and user space - */ - -/* - * FC Transport SGIO v4 BSG Message Support - */ - -/* Default BSG request timeout (in seconds) */ -#define FC_DEFAULT_BSG_TIMEOUT (10 * HZ) - - -/* - * Request Message Codes supported by the FC Transport - */ - -/* define the class masks for the message codes */ -#define FC_BSG_CLS_MASK 0xF0000000 /* find object class */ -#define FC_BSG_HST_MASK 0x80000000 /* fc host class */ -#define FC_BSG_RPT_MASK 0x40000000 /* fc rport class */ - - /* fc_host Message Codes */ -#define FC_BSG_HST_ADD_RPORT (FC_BSG_HST_MASK | 0x00000001) -#define FC_BSG_HST_DEL_RPORT (FC_BSG_HST_MASK | 0x00000002) -#define FC_BSG_HST_ELS_NOLOGIN (FC_BSG_HST_MASK | 0x00000003) -#define FC_BSG_HST_CT (FC_BSG_HST_MASK | 0x00000004) -#define FC_BSG_HST_VENDOR (FC_BSG_HST_MASK | 0x000000FF) - - /* fc_rport Message Codes */ -#define FC_BSG_RPT_ELS (FC_BSG_RPT_MASK | 0x00000001) -#define FC_BSG_RPT_CT (FC_BSG_RPT_MASK | 0x00000002) - - - -/* - * FC Address Identifiers in Message Structures : - * - * Whenever a command payload contains a FC Address Identifier - * (aka port_id), the value is effectively in big-endian - * order, thus the array elements are decoded as follows: - * element [0] is bits 23:16 of the FC Address Identifier - * element [1] is bits 15:8 of the FC Address Identifier - * element [2] is bits 7:0 of the FC Address Identifier - */ - - -/* - * FC Host Messages - */ - -/* FC_BSG_HST_ADDR_PORT : */ - -/* Request: - * This message requests the FC host to login to the remote port - * at the specified N_Port_Id. The remote port is to be enumerated - * with the transport upon completion of the login. - */ -struct fc_bsg_host_add_rport { - uint8_t reserved; - - /* FC Address Identier of the remote port to login to */ - uint8_t port_id[3]; -}; - -/* Response: - * There is no additional response data - fc_bsg_reply->result is sufficient - */ - - -/* FC_BSG_HST_DEL_RPORT : */ - -/* Request: - * This message requests the FC host to remove an enumerated - * remote port and to terminate the login to it. - * - * Note: The driver is free to reject this request if it desires to - * remain logged in with the remote port. - */ -struct fc_bsg_host_del_rport { - uint8_t reserved; - - /* FC Address Identier of the remote port to logout of */ - uint8_t port_id[3]; -}; - -/* Response: - * There is no additional response data - fc_bsg_reply->result is sufficient - */ - - -/* FC_BSG_HST_ELS_NOLOGIN : */ - -/* Request: - * This message requests the FC_Host to send an ELS to a specific - * N_Port_ID. The host does not need to log into the remote port, - * nor does it need to enumerate the rport for further traffic - * (although, the FC host is free to do so if it desires). - */ -struct fc_bsg_host_els { - /* - * ELS Command Code being sent (must be the same as byte 0 - * of the payload) - */ - uint8_t command_code; - - /* FC Address Identier of the remote port to send the ELS to */ - uint8_t port_id[3]; -}; - -/* Response: - */ -/* fc_bsg_ctels_reply->status values */ -#define FC_CTELS_STATUS_OK 0x00000000 -#define FC_CTELS_STATUS_REJECT 0x00000001 -#define FC_CTELS_STATUS_P_RJT 0x00000002 -#define FC_CTELS_STATUS_F_RJT 0x00000003 -#define FC_CTELS_STATUS_P_BSY 0x00000004 -#define FC_CTELS_STATUS_F_BSY 0x00000006 -struct fc_bsg_ctels_reply { - /* - * Note: An ELS LS_RJT may be reported in 2 ways: - * a) A status of FC_CTELS_STATUS_OK is returned. The caller - * is to look into the ELS receive payload to determine - * LS_ACC or LS_RJT (by contents of word 0). The reject - * data will be in word 1. - * b) A status of FC_CTELS_STATUS_REJECT is returned, The - * rjt_data field will contain valid data. - * - * Note: ELS LS_ACC is determined by an FC_CTELS_STATUS_OK, and - * the receive payload word 0 indicates LS_ACC - * (e.g. value is 0x02xxxxxx). - * - * Note: Similarly, a CT Reject may be reported in 2 ways: - * a) A status of FC_CTELS_STATUS_OK is returned. The caller - * is to look into the CT receive payload to determine - * Accept or Reject (by contents of word 2). The reject - * data will be in word 3. - * b) A status of FC_CTELS_STATUS_REJECT is returned, The - * rjt_data field will contain valid data. - * - * Note: x_RJT/BSY status will indicae that the rjt_data field - * is valid and contains the reason/explanation values. - */ - uint32_t status; /* See FC_CTELS_STATUS_xxx */ - - /* valid if status is not FC_CTELS_STATUS_OK */ - struct { - uint8_t action; /* fragment_id for CT REJECT */ - uint8_t reason_code; - uint8_t reason_explanation; - uint8_t vendor_unique; - } rjt_data; -}; - - -/* FC_BSG_HST_CT : */ - -/* Request: - * This message requests that a CT Request be performed with the - * indicated N_Port_ID. The driver is responsible for logging in with - * the fabric and/or N_Port_ID, etc as per FC rules. This request does - * not mandate that the driver must enumerate the destination in the - * transport. The driver is allowed to decide whether to enumerate it, - * and whether to tear it down after the request. - */ -struct fc_bsg_host_ct { - uint8_t reserved; - - /* FC Address Identier of the remote port to send the ELS to */ - uint8_t port_id[3]; - - /* - * We need words 0-2 of the generic preamble for the LLD's - */ - uint32_t preamble_word0; /* revision & IN_ID */ - uint32_t preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */ - uint32_t preamble_word2; /* Cmd Code, Max Size */ - -}; -/* Response: - * - * The reply structure is an fc_bsg_ctels_reply structure - */ - - -/* FC_BSG_HST_VENDOR : */ - -/* Request: - * Note: When specifying vendor_id, be sure to read the Vendor Type and ID - * formatting requirements specified in scsi_netlink.h - */ -struct fc_bsg_host_vendor { - /* - * Identifies the vendor that the message is formatted for. This - * should be the recipient of the message. - */ - uint64_t vendor_id; - - /* start of vendor command area */ - uint32_t vendor_cmd[0]; -}; - -/* Response: - */ -struct fc_bsg_host_vendor_reply { - /* start of vendor response area */ - uint32_t vendor_rsp[0]; -}; - - - -/* - * FC Remote Port Messages - */ - -/* FC_BSG_RPT_ELS : */ - -/* Request: - * This message requests that an ELS be performed with the rport. - */ -struct fc_bsg_rport_els { - /* - * ELS Command Code being sent (must be the same as - * byte 0 of the payload) - */ - uint8_t els_code; -}; - -/* Response: - * - * The reply structure is an fc_bsg_ctels_reply structure - */ - - -/* FC_BSG_RPT_CT : */ - -/* Request: - * This message requests that a CT Request be performed with the rport. - */ -struct fc_bsg_rport_ct { - /* - * We need words 0-2 of the generic preamble for the LLD's - */ - uint32_t preamble_word0; /* revision & IN_ID */ - uint32_t preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */ - uint32_t preamble_word2; /* Cmd Code, Max Size */ -}; -/* Response: - * - * The reply structure is an fc_bsg_ctels_reply structure - */ - - - - -/* request (CDB) structure of the sg_io_v4 */ -struct fc_bsg_request { - uint32_t msgcode; - union { - struct fc_bsg_host_add_rport h_addrport; - struct fc_bsg_host_del_rport h_delrport; - struct fc_bsg_host_els h_els; - struct fc_bsg_host_ct h_ct; - struct fc_bsg_host_vendor h_vendor; - - struct fc_bsg_rport_els r_els; - struct fc_bsg_rport_ct r_ct; - } rqst_data; -} __attribute__((packed)); - - -/* response (request sense data) structure of the sg_io_v4 */ -struct fc_bsg_reply { - /* - * The completion result. Result exists in two forms: - * if negative, it is an -Exxx system errno value. There will - * be no further reply information supplied. - * else, it's the 4-byte scsi error result, with driver, host, - * msg and status fields. The per-msgcode reply structure - * will contain valid data. - */ - uint32_t result; - - /* If there was reply_payload, how much was recevied ? */ - uint32_t reply_payload_rcv_len; - - union { - struct fc_bsg_host_vendor_reply vendor_reply; - - struct fc_bsg_ctels_reply ctels_reply; - } reply_data; -}; - - -#endif /* SCSI_BSG_FC_H */ - diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index de5f5d8f1f8..e0ae7109814 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -7,6 +7,7 @@ #include <linux/types.h> #include <linux/timer.h> #include <linux/scatterlist.h> +#include <scsi/scsi_device.h> struct Scsi_Host; struct scsi_device; @@ -55,6 +56,7 @@ struct scsi_cmnd { struct scsi_device *device; struct list_head list; /* scsi_cmnd participates in queue lists */ struct list_head eh_entry; /* entry for the host eh_cmd_q */ + struct delayed_work abort_work; int eh_eflags; /* Used by error handlr */ /* @@ -132,6 +134,15 @@ struct scsi_cmnd { unsigned char tag; /* SCSI-II queued command tag */ }; +/* + * Return the driver private allocation behind the command. + * Only works if cmd_size is set in the host template. + */ +static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd) +{ + return cmd + 1; +} + /* make sure not to use it with REQ_TYPE_BLOCK_PC commands */ static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd) { @@ -141,8 +152,7 @@ static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd) extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t); extern struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *, gfp_t); extern void scsi_put_command(struct scsi_cmnd *); -extern void __scsi_put_command(struct Scsi_Host *, struct scsi_cmnd *, - struct device *); +extern void __scsi_put_command(struct Scsi_Host *, struct scsi_cmnd *); extern void scsi_finish_command(struct scsi_cmnd *cmd); extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count, @@ -155,9 +165,6 @@ extern void scsi_release_buffers(struct scsi_cmnd *cmd); extern int scsi_dma_map(struct scsi_cmnd *cmd); extern void scsi_dma_unmap(struct scsi_cmnd *cmd); -struct scsi_cmnd *scsi_allocate_command(gfp_t gfp_mask); -void scsi_free_command(gfp_t gfp_mask, struct scsi_cmnd *cmd); - static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd) { return cmd->sdb.table.nents; @@ -309,4 +316,20 @@ static inline void set_driver_byte(struct scsi_cmnd *cmd, char status) cmd->result = (cmd->result & 0x00ffffff) | (status << 24); } +static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd) +{ + unsigned int xfer_len = scsi_out(scmd)->length; + unsigned int prot_op = scsi_get_prot_op(scmd); + unsigned int sector_size = scmd->device->sector_size; + + switch (prot_op) { + case SCSI_PROT_NORMAL: + case SCSI_PROT_WRITE_STRIP: + case SCSI_PROT_READ_INSERT: + return xfer_len; + } + + return xfer_len + (xfer_len >> ilog2(sector_size)) * 8; +} + #endif /* _SCSI_SCSI_CMND_H */ diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 55367b04dc9..27ab31017f0 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -52,8 +52,15 @@ enum scsi_device_state { enum scsi_device_event { SDEV_EVT_MEDIA_CHANGE = 1, /* media has changed */ + SDEV_EVT_INQUIRY_CHANGE_REPORTED, /* 3F 03 UA reported */ + SDEV_EVT_CAPACITY_CHANGE_REPORTED, /* 2A 09 UA reported */ + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED, /* 38 07 UA reported */ + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED, /* 2A 01 UA reported */ + SDEV_EVT_LUN_CHANGE_REPORTED, /* 3F 0E UA reported */ + + SDEV_EVT_FIRST = SDEV_EVT_MEDIA_CHANGE, + SDEV_EVT_LAST = SDEV_EVT_LUN_CHANGE_REPORTED, - SDEV_EVT_LAST = SDEV_EVT_MEDIA_CHANGE, SDEV_EVT_MAXBITS = SDEV_EVT_LAST + 1 }; @@ -106,6 +113,12 @@ struct scsi_device { const char * vendor; /* [back_compat] point into 'inquiry' ... */ const char * model; /* ... after scan; point to static string */ const char * rev; /* ... "nullnullnullnull" before scan */ + +#define SCSI_VPD_PG_LEN 255 + int vpd_pg83_len; + unsigned char *vpd_pg83; + int vpd_pg80_len; + unsigned char *vpd_pg80; unsigned char current_tag; /* current tag */ struct scsi_target *sdev_target; /* used only for single_lun */ @@ -113,6 +126,7 @@ struct scsi_device { * scsi_devinfo.[hc]. For now used only to * pass settings from slave_alloc to scsi * core. */ + unsigned int eh_timeout; /* Error handling timeout */ unsigned writeable:1; unsigned removable:1; unsigned changed:1; /* Data invalid due to media change */ @@ -137,6 +151,7 @@ struct scsi_device { unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */ unsigned no_report_opcodes:1; /* no REPORT SUPPORTED OPERATION CODES */ unsigned no_write_same:1; /* no WRITE SAME command */ + unsigned use_16_for_rw:1; /* Use read/write(16) over read/write(10) */ unsigned skip_ms_page_8:1; /* do not use MODE SENSE page 0x08 */ unsigned skip_ms_page_3f:1; /* do not use MODE SENSE page 0x3f */ unsigned skip_vpd_pages:1; /* do not read VPD pages */ @@ -156,11 +171,14 @@ struct scsi_device { unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */ unsigned try_rc_10_first:1; /* Try READ_CAPACACITY_10 first */ unsigned is_visible:1; /* is the device visible in sysfs */ - unsigned can_power_off:1; /* Device supports runtime power off */ unsigned wce_default_on:1; /* Cache is ON by default */ unsigned no_dif:1; /* T10 PI (DIF) should be disabled */ + unsigned broken_fua:1; /* Don't set FUA bit */ + + atomic_t disk_events_disable_depth; /* disable depth for disk events */ DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ + DECLARE_BITMAP(pending_events, SDEV_EVT_MAXBITS); /* pending events */ struct list_head event_list; /* asserted events */ struct work_struct event_work; @@ -224,12 +242,24 @@ struct scsi_dh_data { #define sdev_printk(prefix, sdev, fmt, a...) \ dev_printk(prefix, &(sdev)->sdev_gendev, fmt, ##a) +#define sdev_dbg(sdev, fmt, a...) \ + dev_dbg(&(sdev)->sdev_gendev, fmt, ##a) + #define scmd_printk(prefix, scmd, fmt, a...) \ (scmd)->request->rq_disk ? \ sdev_printk(prefix, (scmd)->device, "[%s] " fmt, \ (scmd)->request->rq_disk->disk_name, ##a) : \ sdev_printk(prefix, (scmd)->device, fmt, ##a) +#define scmd_dbg(scmd, fmt, a...) \ + do { \ + if ((scmd)->request->rq_disk) \ + sdev_dbg((scmd)->device, "[%s] " fmt, \ + (scmd)->request->rq_disk->disk_name, ##a);\ + else \ + sdev_dbg((scmd)->device, fmt, ##a); \ + } while (0) + enum scsi_target_state { STARGET_CREATED = 1, STARGET_RUNNING, @@ -246,7 +276,7 @@ struct scsi_target { struct list_head siblings; struct list_head devices; struct device dev; - unsigned int reap_ref; /* protected by the host lock */ + struct kref reap_ref; /* last put renders target invisible */ unsigned int channel; unsigned int id; /* target id ... replace * scsi_device.id eventually */ @@ -258,6 +288,9 @@ struct scsi_target { * means no lun present. */ unsigned int no_report_luns:1; /* Don't use * REPORT LUNS for scanning. */ + unsigned int expecting_lun_change:1; /* A device has reported + * a 3F/0E UA, other devices on + * the same target will also. */ /* commands actually active on LLD. protected by host lock. */ unsigned int target_busy; /* @@ -270,7 +303,6 @@ struct scsi_target { #define SCSI_DEFAULT_TARGET_BLOCKED 3 char scsi_level; - struct execute_work ew; enum scsi_target_state state; void *hostdata; /* available to low-level driver */ unsigned long starget_data[0]; /* for the transport */ @@ -295,6 +327,7 @@ extern int scsi_add_device(struct Scsi_Host *host, uint channel, extern int scsi_register_device_handler(struct scsi_device_handler *scsi_dh); extern void scsi_remove_device(struct scsi_device *); extern int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh); +void scsi_attach_vpd(struct scsi_device *sdev); extern int scsi_device_get(struct scsi_device *); extern void scsi_device_put(struct scsi_device *); @@ -391,11 +424,21 @@ extern int scsi_is_target_device(const struct device *); extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, int data_direction, void *buffer, unsigned bufflen, unsigned char *sense, int timeout, int retries, - int flag, int *resid); -extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd, - int data_direction, void *buffer, unsigned bufflen, - struct scsi_sense_hdr *, int timeout, int retries, - int *resid); + u64 flags, int *resid); +extern int scsi_execute_req_flags(struct scsi_device *sdev, + const unsigned char *cmd, int data_direction, void *buffer, + unsigned bufflen, struct scsi_sense_hdr *sshdr, int timeout, + int retries, int *resid, u64 flags); +static inline int scsi_execute_req(struct scsi_device *sdev, + const unsigned char *cmd, int data_direction, void *buffer, + unsigned bufflen, struct scsi_sense_hdr *sshdr, int timeout, + int retries, int *resid) +{ + return scsi_execute_req_flags(sdev, cmd, data_direction, buffer, + bufflen, sshdr, timeout, retries, resid, 0); +} +extern void sdev_disable_disk_events(struct scsi_device *sdev); +extern void sdev_enable_disk_events(struct scsi_device *sdev); #ifdef CONFIG_PM_RUNTIME extern int scsi_autopm_get_device(struct scsi_device *); diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h index cc1f3e786ad..447d2d7466f 100644 --- a/include/scsi/scsi_devinfo.h +++ b/include/scsi/scsi_devinfo.h @@ -31,4 +31,5 @@ #define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */ #define BLIST_ATTACH_PQ3 0x1000000 /* Scan: Attach to PQ3 devices */ #define BLIST_NO_DIF 0x2000000 /* Disable T10 PI (DIF) */ +#define BLIST_SKIP_VPD_PAGES 0x4000000 /* Ignore SBC-3 VPD pages */ #endif diff --git a/include/scsi/scsi_driver.h b/include/scsi/scsi_driver.h index d443aa06a72..36c4114ed9b 100644 --- a/include/scsi/scsi_driver.h +++ b/include/scsi/scsi_driver.h @@ -4,19 +4,19 @@ #include <linux/device.h> struct module; +struct request; struct scsi_cmnd; struct scsi_device; -struct request; -struct request_queue; - struct scsi_driver { struct module *owner; struct device_driver gendrv; void (*rescan)(struct device *); + int (*init_command)(struct scsi_cmnd *); + void (*uninit_command)(struct scsi_cmnd *); int (*done)(struct scsi_cmnd *); - int (*eh_action)(struct scsi_cmnd *, unsigned char *, int, int); + int (*eh_action)(struct scsi_cmnd *, int); }; #define to_scsi_driver(drv) \ container_of((drv), struct scsi_driver, gendrv) @@ -31,8 +31,5 @@ extern int scsi_register_interface(struct class_interface *); int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req); int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req); -int scsi_prep_state_check(struct scsi_device *sdev, struct request *req); -int scsi_prep_return(struct request_queue *q, struct request *req, int ret); -int scsi_prep_fn(struct request_queue *, struct request *); #endif /* _SCSI_SCSI_DRIVER_H */ diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 49084807eb6..94844fc77b9 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -6,6 +6,7 @@ #include <linux/types.h> #include <linux/workqueue.h> #include <linux/mutex.h> +#include <linux/seq_file.h> #include <scsi/scsi.h> struct request_queue; @@ -14,6 +15,7 @@ struct completion; struct module; struct scsi_cmnd; struct scsi_device; +struct scsi_host_cmd_pool; struct scsi_target; struct Scsi_Host; struct scsi_host_cmd_pool; @@ -340,7 +342,8 @@ struct scsi_host_template { * * Status: OBSOLETE */ - int (*proc_info)(struct Scsi_Host *, char *, char **, off_t, int, int); + int (*show_info)(struct seq_file *, struct Scsi_Host *); + int (*write_info)(struct Scsi_Host *, char *, int); /* * This is an optional routine that allows the transport to become @@ -375,7 +378,7 @@ struct scsi_host_template { /* * Used to store the procfs directory if a driver implements the - * proc_info method. + * show_info method. */ struct proc_dir_entry *proc_dir; @@ -473,6 +476,14 @@ struct scsi_host_template { */ unsigned ordered_tag:1; + /* True if the controller does not support WRITE SAME */ + unsigned no_write_same:1; + + /* + * True if asynchronous aborts are not supported + */ + unsigned no_async_abort:1; + /* * Countdown for host blocking with no commands outstanding. */ @@ -514,6 +525,12 @@ struct scsi_host_template { * scsi_netlink.h */ u64 vendor_id; + + /* + * Additional per-command data allocated for the driver. + */ + unsigned int cmd_size; + struct scsi_host_cmd_pool *cmd_pool; }; /* @@ -596,9 +613,12 @@ struct Scsi_Host { unsigned int host_eh_scheduled; /* EH scheduled without command */ unsigned int host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ - int resetting; /* if set, it means that last_reset is a valid value */ + + /* next two fields are used to bound the time spent in error handling */ + int eh_deadline; unsigned long last_reset; + /* * These three parameters can be used to allow for wide scsi, * and for host adapters that support multiple busses @@ -672,6 +692,9 @@ struct Scsi_Host { /* Don't resume host in EH */ unsigned eh_noresume:1; + /* The controller does not support WRITE SAME */ + unsigned no_write_same:1; + /* * Optional work queue to be utilized by the transport */ @@ -679,6 +702,11 @@ struct Scsi_Host { struct workqueue_struct *work_q; /* + * Task management function work queue + */ + struct workqueue_struct *tmf_work_q; + + /* * Host has rejected a command because it was busy. */ unsigned int host_blocked; @@ -873,7 +901,7 @@ static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsign SHOST_DIF_TYPE2_PROTECTION, SHOST_DIF_TYPE3_PROTECTION }; - if (target_type > SHOST_DIF_TYPE3_PROTECTION) + if (target_type >= ARRAY_SIZE(cap)) return 0; return shost->prot_capabilities & cap[target_type] ? target_type : 0; @@ -887,7 +915,7 @@ static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsign SHOST_DIX_TYPE2_PROTECTION, SHOST_DIX_TYPE3_PROTECTION }; - if (target_type > SHOST_DIX_TYPE3_PROTECTION) + if (target_type >= ARRAY_SIZE(cap)) return 0; return shost->prot_capabilities & cap[target_type]; diff --git a/include/scsi/scsi_netlink.h b/include/scsi/scsi_netlink.h deleted file mode 100644 index 62b4edab15d..00000000000 --- a/include/scsi/scsi_netlink.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * SCSI Transport Netlink Interface - * Used for the posting of outbound SCSI transport events - * - * Copyright (C) 2006 James Smart, Emulex Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ -#ifndef SCSI_NETLINK_H -#define SCSI_NETLINK_H - -#include <linux/netlink.h> -#include <linux/types.h> - -/* - * This file intended to be included by both kernel and user space - */ - -/* Single Netlink Message type to send all SCSI Transport messages */ -#define SCSI_TRANSPORT_MSG NLMSG_MIN_TYPE + 1 - -/* SCSI Transport Broadcast Groups */ - /* leaving groups 0 and 1 unassigned */ -#define SCSI_NL_GRP_FC_EVENTS (1<<2) /* Group 2 */ -#define SCSI_NL_GRP_CNT 3 - - -/* SCSI_TRANSPORT_MSG event message header */ -struct scsi_nl_hdr { - uint8_t version; - uint8_t transport; - uint16_t magic; - uint16_t msgtype; - uint16_t msglen; -} __attribute__((aligned(sizeof(uint64_t)))); - -/* scsi_nl_hdr->version value */ -#define SCSI_NL_VERSION 1 - -/* scsi_nl_hdr->magic value */ -#define SCSI_NL_MAGIC 0xA1B2 - -/* scsi_nl_hdr->transport value */ -#define SCSI_NL_TRANSPORT 0 -#define SCSI_NL_TRANSPORT_FC 1 -#define SCSI_NL_MAX_TRANSPORTS 2 - -/* Transport-based scsi_nl_hdr->msgtype values are defined in each transport */ - -/* - * GENERIC SCSI scsi_nl_hdr->msgtype Values - */ - /* kernel -> user */ -#define SCSI_NL_SHOST_VENDOR 0x0001 - /* user -> kernel */ -/* SCSI_NL_SHOST_VENDOR msgtype is kernel->user and user->kernel */ - - -/* - * Message Structures : - */ - -/* macro to round up message lengths to 8byte boundary */ -#define SCSI_NL_MSGALIGN(len) (((len) + 7) & ~7) - - -/* - * SCSI HOST Vendor Unique messages : - * SCSI_NL_SHOST_VENDOR - * - * Note: The Vendor Unique message payload will begin directly after - * this structure, with the length of the payload per vmsg_datalen. - * - * Note: When specifying vendor_id, be sure to read the Vendor Type and ID - * formatting requirements specified below - */ -struct scsi_nl_host_vendor_msg { - struct scsi_nl_hdr snlh; /* must be 1st element ! */ - uint64_t vendor_id; - uint16_t host_no; - uint16_t vmsg_datalen; -} __attribute__((aligned(sizeof(uint64_t)))); - - -/* - * Vendor ID: - * If transports post vendor-unique events, they must pass a well-known - * 32-bit vendor identifier. This identifier consists of 8 bits indicating - * the "type" of identifier contained, and 24 bits of id data. - * - * Identifiers for each type: - * PCI : ID data is the 16 bit PCI Registered Vendor ID - */ -#define SCSI_NL_VID_TYPE_SHIFT 56 -#define SCSI_NL_VID_TYPE_MASK ((__u64)0xFF << SCSI_NL_VID_TYPE_SHIFT) -#define SCSI_NL_VID_TYPE_PCI ((__u64)0x01 << SCSI_NL_VID_TYPE_SHIFT) -#define SCSI_NL_VID_ID_MASK (~ SCSI_NL_VID_TYPE_MASK) - - -#define INIT_SCSI_NL_HDR(hdr, t, mtype, mlen) \ - { \ - (hdr)->version = SCSI_NL_VERSION; \ - (hdr)->transport = t; \ - (hdr)->magic = SCSI_NL_MAGIC; \ - (hdr)->msgtype = mtype; \ - (hdr)->msglen = mlen; \ - } - -#endif /* SCSI_NETLINK_H */ - diff --git a/include/scsi/scsi_netlink_fc.h b/include/scsi/scsi_netlink_fc.h deleted file mode 100644 index cbf76e47976..00000000000 --- a/include/scsi/scsi_netlink_fc.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * FC Transport Netlink Interface - * - * Copyright (C) 2006 James Smart, Emulex Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ -#ifndef SCSI_NETLINK_FC_H -#define SCSI_NETLINK_FC_H - -#include <scsi/scsi_netlink.h> - -/* - * This file intended to be included by both kernel and user space - */ - -/* - * FC Transport Message Types - */ - /* kernel -> user */ -#define FC_NL_ASYNC_EVENT 0x0100 - /* user -> kernel */ -/* none */ - - -/* - * Message Structures : - */ - -/* macro to round up message lengths to 8byte boundary */ -#define FC_NL_MSGALIGN(len) (((len) + 7) & ~7) - - -/* - * FC Transport Broadcast Event Message : - * FC_NL_ASYNC_EVENT - * - * Note: if Vendor Unique message, &event_data will be start of - * vendor unique payload, and the length of the payload is - * per event_datalen - * - * Note: When specifying vendor_id, be sure to read the Vendor Type and ID - * formatting requirements specified in scsi_netlink.h - */ -struct fc_nl_event { - struct scsi_nl_hdr snlh; /* must be 1st element ! */ - uint64_t seconds; - uint64_t vendor_id; - uint16_t host_no; - uint16_t event_datalen; - uint32_t event_num; - uint32_t event_code; - uint32_t event_data; -} __attribute__((aligned(sizeof(uint64_t)))); - - -#endif /* SCSI_NETLINK_FC_H */ - diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index b797e8fad66..8c79980dc8f 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h @@ -130,6 +130,7 @@ enum fc_vport_state { #define FC_PORTSPEED_4GBIT 8 #define FC_PORTSPEED_8GBIT 0x10 #define FC_PORTSPEED_16GBIT 0x20 +#define FC_PORTSPEED_32GBIT 0x40 #define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15) /* Speed not established */ /* diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 53f0b361d66..2555ee5343f 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h @@ -39,6 +39,8 @@ struct iscsi_task; struct sockaddr; struct iscsi_iface; struct bsg_job; +struct iscsi_bus_flash_session; +struct iscsi_bus_flash_conn; /** * struct iscsi_transport - iSCSI Transport template @@ -150,6 +152,22 @@ struct iscsi_transport { int (*get_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx, uint32_t *num_entries, char *buf); int (*delete_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx); + int (*set_chap) (struct Scsi_Host *shost, void *data, int len); + int (*get_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, + int param, char *buf); + int (*set_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, + struct iscsi_bus_flash_conn *fnode_conn, + void *data, int len); + int (*new_flashnode) (struct Scsi_Host *shost, const char *buf, + int len); + int (*del_flashnode) (struct iscsi_bus_flash_session *fnode_sess); + int (*login_flashnode) (struct iscsi_bus_flash_session *fnode_sess, + struct iscsi_bus_flash_conn *fnode_conn); + int (*logout_flashnode) (struct iscsi_bus_flash_session *fnode_sess, + struct iscsi_bus_flash_conn *fnode_conn); + int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess); + int (*get_host_stats) (struct Scsi_Host *shost, char *buf, int len); + u8 (*check_protection)(struct iscsi_task *task, sector_t *sector); }; /* @@ -286,6 +304,112 @@ struct iscsi_iface { #define iscsi_iface_to_shost(_iface) \ dev_to_shost(_iface->dev.parent) + +struct iscsi_bus_flash_conn { + struct list_head conn_list; /* item in connlist */ + void *dd_data; /* LLD private data */ + struct iscsi_transport *transport; + struct device dev; /* sysfs transport/container device */ + /* iscsi connection parameters */ + uint32_t exp_statsn; + uint32_t statsn; + unsigned max_recv_dlength; /* initiator_max_recv_dsl*/ + unsigned max_xmit_dlength; /* target_max_recv_dsl */ + unsigned max_segment_size; + unsigned tcp_xmit_wsf; + unsigned tcp_recv_wsf; + int hdrdgst_en; + int datadgst_en; + int port; + char *ipaddress; + char *link_local_ipv6_addr; + char *redirect_ipaddr; + uint16_t keepalive_timeout; + uint16_t local_port; + uint8_t snack_req_en; + /* tcp timestamp negotiation status */ + uint8_t tcp_timestamp_stat; + uint8_t tcp_nagle_disable; + /* tcp window scale factor */ + uint8_t tcp_wsf_disable; + uint8_t tcp_timer_scale; + uint8_t tcp_timestamp_en; + uint8_t ipv4_tos; + uint8_t ipv6_traffic_class; + uint8_t ipv6_flow_label; + uint8_t fragment_disable; + /* Link local IPv6 address is assigned by firmware or driver */ + uint8_t is_fw_assigned_ipv6; +}; + +#define iscsi_dev_to_flash_conn(_dev) \ + container_of(_dev, struct iscsi_bus_flash_conn, dev) + +#define iscsi_flash_conn_to_flash_session(_conn) \ + iscsi_dev_to_flash_session(_conn->dev.parent) + +#define ISID_SIZE 6 + +struct iscsi_bus_flash_session { + struct list_head sess_list; /* item in session_list */ + struct iscsi_transport *transport; + unsigned int target_id; + int flash_state; /* persistent or non-persistent */ + void *dd_data; /* LLD private data */ + struct device dev; /* sysfs transport/container device */ + /* iscsi session parameters */ + unsigned first_burst; + unsigned max_burst; + unsigned short max_r2t; + int default_taskmgmt_timeout; + int initial_r2t_en; + int imm_data_en; + int time2wait; + int time2retain; + int pdu_inorder_en; + int dataseq_inorder_en; + int erl; + int tpgt; + char *username; + char *username_in; + char *password; + char *password_in; + char *targetname; + char *targetalias; + char *portal_type; + uint16_t tsid; + uint16_t chap_in_idx; + uint16_t chap_out_idx; + /* index of iSCSI discovery session if the entry is + * discovered by iSCSI discovery session + */ + uint16_t discovery_parent_idx; + /* indicates if discovery was done through iSNS discovery service + * or through sendTarget */ + uint16_t discovery_parent_type; + /* Firmware auto sendtarget discovery disable */ + uint8_t auto_snd_tgt_disable; + uint8_t discovery_sess; + /* indicates if this flashnode entry is enabled or disabled */ + uint8_t entry_state; + uint8_t chap_auth_en; + /* enables firmware to auto logout the discovery session on discovery + * completion + */ + uint8_t discovery_logout_en; + uint8_t bidi_chap_en; + /* makes authentication for discovery session optional */ + uint8_t discovery_auth_optional; + uint8_t isid[ISID_SIZE]; + uint8_t is_boot_target; +}; + +#define iscsi_dev_to_flash_session(_dev) \ + container_of(_dev, struct iscsi_bus_flash_session, dev) + +#define iscsi_flash_session_to_shost(_session) \ + dev_to_shost(_session->dev.parent) + /* * session and connection functions that can be used by HW iSCSI LLDs */ @@ -330,4 +454,33 @@ extern char *iscsi_get_port_speed_name(struct Scsi_Host *shost); extern char *iscsi_get_port_state_name(struct Scsi_Host *shost); extern int iscsi_is_session_dev(const struct device *dev); +extern char *iscsi_get_discovery_parent_name(int parent_type); +extern struct device * +iscsi_find_flashnode(struct Scsi_Host *shost, void *data, + int (*fn)(struct device *dev, void *data)); + +extern struct iscsi_bus_flash_session * +iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index, + struct iscsi_transport *transport, int dd_size); + +extern struct iscsi_bus_flash_conn * +iscsi_create_flashnode_conn(struct Scsi_Host *shost, + struct iscsi_bus_flash_session *fnode_sess, + struct iscsi_transport *transport, int dd_size); + +extern void +iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session *fnode_sess); + +extern void iscsi_destroy_all_flashnode(struct Scsi_Host *shost); +extern int iscsi_flashnode_bus_match(struct device *dev, + struct device_driver *drv); +extern struct device * +iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data, + int (*fn)(struct device *dev, void *data)); +extern struct device * +iscsi_find_flashnode_conn(struct iscsi_bus_flash_session *fnode_sess); + +extern char * +iscsi_get_ipaddress_state_name(enum iscsi_ipaddress_state port_state); +extern char *iscsi_get_router_state_name(enum iscsi_router_state router_state); #endif diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h index 98b3a20a010..0bd71e2702e 100644 --- a/include/scsi/scsi_transport_sas.h +++ b/include/scsi/scsi_transport_sas.h @@ -10,13 +10,6 @@ struct scsi_transport_template; struct sas_rphy; struct request; -enum sas_device_type { - SAS_PHY_UNUSED = 0, - SAS_END_DEVICE = 1, - SAS_EDGE_EXPANDER_DEVICE = 2, - SAS_FANOUT_EXPANDER_DEVICE = 3, -}; - static inline int sas_protocol_ata(enum sas_protocol proto) { return ((proto & SAS_PROTOCOL_SATA) || @@ -36,6 +29,7 @@ enum sas_linkrate { SAS_LINK_RATE_3_0_GBPS = 9, SAS_LINK_RATE_G2 = SAS_LINK_RATE_3_0_GBPS, SAS_LINK_RATE_6_0_GBPS = 10, + SAS_LINK_RATE_12_0_GBPS = 11, /* These are virtual to the transport class and may never * be signalled normally since the standard defined field * is only 4 bits */ diff --git a/include/scsi/scsi_transport_srp.h b/include/scsi/scsi_transport_srp.h index 9c60ca1c08c..cdb05dd1d44 100644 --- a/include/scsi/scsi_transport_srp.h +++ b/include/scsi/scsi_transport_srp.h @@ -13,14 +13,96 @@ struct srp_rport_identifiers { u8 roles; }; +/** + * enum srp_rport_state - SRP transport layer state + * @SRP_RPORT_RUNNING: Transport layer operational. + * @SRP_RPORT_BLOCKED: Transport layer not operational; fast I/O fail timer + * is running and I/O has been blocked. + * @SRP_RPORT_FAIL_FAST: Fast I/O fail timer has expired; fail I/O fast. + * @SRP_RPORT_LOST: Port is being removed. + */ +enum srp_rport_state { + SRP_RPORT_RUNNING, + SRP_RPORT_BLOCKED, + SRP_RPORT_FAIL_FAST, + SRP_RPORT_LOST, +}; + +/** + * struct srp_rport - SRP initiator or target port + * + * Fields that are relevant for SRP initiator and SRP target drivers: + * @dev: Device associated with this rport. + * @port_id: 16-byte port identifier. + * @roles: Role of this port - initiator or target. + * + * Fields that are only relevant for SRP initiator drivers: + * @lld_data: LLD private data. + * @mutex: Protects against concurrent rport reconnect / + * fast_io_fail / dev_loss_tmo activity. + * @state: rport state. + * @reconnect_delay: Reconnect delay in seconds. + * @failed_reconnects: Number of failed reconnect attempts. + * @reconnect_work: Work structure used for scheduling reconnect attempts. + * @fast_io_fail_tmo: Fast I/O fail timeout in seconds. + * @dev_loss_tmo: Device loss timeout in seconds. + * @fast_io_fail_work: Work structure used for scheduling fast I/O fail work. + * @dev_loss_work: Work structure used for scheduling device loss work. + */ struct srp_rport { + /* for initiator and target drivers */ + struct device dev; u8 port_id[16]; u8 roles; + + /* for initiator drivers */ + + void *lld_data; + + struct mutex mutex; + enum srp_rport_state state; + int reconnect_delay; + int failed_reconnects; + struct delayed_work reconnect_work; + int fast_io_fail_tmo; + int dev_loss_tmo; + struct delayed_work fast_io_fail_work; + struct delayed_work dev_loss_work; }; +/** + * struct srp_function_template + * + * Fields that are only relevant for SRP initiator drivers: + * @has_rport_state: Whether or not to create the state, fast_io_fail_tmo and + * dev_loss_tmo sysfs attribute for an rport. + * @reset_timer_if_blocked: Whether or srp_timed_out() should reset the command + * timer if the device on which it has been queued is blocked. + * @reconnect_delay: If not NULL, points to the default reconnect_delay value. + * @fast_io_fail_tmo: If not NULL, points to the default fast_io_fail_tmo value. + * @dev_loss_tmo: If not NULL, points to the default dev_loss_tmo value. + * @reconnect: Callback function for reconnecting to the target. See also + * srp_reconnect_rport(). + * @terminate_rport_io: Callback function for terminating all outstanding I/O + * requests for an rport. + * @rport_delete: Callback function that deletes an rport. + * + * Fields that are only relevant for SRP target drivers: + * @tsk_mgmt_response: Callback function for sending a task management response. + * @it_nexus_response: Callback function for processing an IT nexus response. + */ struct srp_function_template { + /* for initiator drivers */ + bool has_rport_state; + bool reset_timer_if_blocked; + int *reconnect_delay; + int *fast_io_fail_tmo; + int *dev_loss_tmo; + int (*reconnect)(struct srp_rport *rport); + void (*terminate_rport_io)(struct srp_rport *rport); + void (*rport_delete)(struct srp_rport *rport); /* for target drivers */ int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int); int (* it_nexus_response)(struct Scsi_Host *, u64, int); @@ -30,10 +112,38 @@ extern struct scsi_transport_template * srp_attach_transport(struct srp_function_template *); extern void srp_release_transport(struct scsi_transport_template *); +extern void srp_rport_get(struct srp_rport *rport); +extern void srp_rport_put(struct srp_rport *rport); extern struct srp_rport *srp_rport_add(struct Scsi_Host *, struct srp_rport_identifiers *); extern void srp_rport_del(struct srp_rport *); - +extern int srp_tmo_valid(int reconnect_delay, int fast_io_fail_tmo, + int dev_loss_tmo); +extern int srp_reconnect_rport(struct srp_rport *rport); +extern void srp_start_tl_fail_timers(struct srp_rport *rport); extern void srp_remove_host(struct Scsi_Host *); +extern void srp_stop_rport_timers(struct srp_rport *rport); + +/** + * srp_chkready() - evaluate the transport layer state before I/O + * @rport: SRP target port pointer. + * + * Returns a SCSI result code that can be returned by the LLD queuecommand() + * implementation. The role of this function is similar to that of + * fc_remote_port_chkready(). + */ +static inline int srp_chkready(struct srp_rport *rport) +{ + switch (rport->state) { + case SRP_RPORT_RUNNING: + case SRP_RPORT_BLOCKED: + default: + return 0; + case SRP_RPORT_FAIL_FAST: + return DID_TRANSPORT_FAILFAST << 16; + case SRP_RPORT_LOST: + return DID_NO_CONNECT << 16; + } +} #endif |
