1*a61127c2SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 23699d92aSKiran Patil /* 33699d92aSKiran Patil * Copyright (c) 2010 Cisco Systems, Inc. 43699d92aSKiran Patil */ 53699d92aSKiran Patil #ifndef __TCM_FC_H__ 63699d92aSKiran Patil #define __TCM_FC_H__ 73699d92aSKiran Patil 88dcf07beSBart Van Assche #include <linux/types.h> 98dcf07beSBart Van Assche #include <target/target_core_base.h> 108dcf07beSBart Van Assche 119765b1f3SNicholas Bellinger #define FT_VERSION "0.4" 123699d92aSKiran Patil 133699d92aSKiran Patil #define FT_NAMELEN 32 /* length of ASCII WWPNs including pad */ 143699d92aSKiran Patil #define FT_TPG_NAMELEN 32 /* max length of TPG name */ 153699d92aSKiran Patil #define FT_LUN_NAMELEN 32 /* max length of LUN name */ 165f544cfaSNicholas Bellinger #define TCM_FC_DEFAULT_TAGS 512 /* tags used for per-session preallocation */ 173699d92aSKiran Patil 183699d92aSKiran Patil struct ft_transport_id { 193699d92aSKiran Patil __u8 format; 203699d92aSKiran Patil __u8 __resvd1[7]; 213699d92aSKiran Patil __u8 wwpn[8]; 223699d92aSKiran Patil __u8 __resvd2[8]; 233699d92aSKiran Patil } __attribute__((__packed__)); 243699d92aSKiran Patil 253699d92aSKiran Patil /* 263699d92aSKiran Patil * Session (remote port). 273699d92aSKiran Patil */ 283699d92aSKiran Patil struct ft_sess { 293699d92aSKiran Patil u32 port_id; /* for hash lookup use only */ 303699d92aSKiran Patil u32 params; 313699d92aSKiran Patil u16 max_frame; /* maximum frame size */ 323699d92aSKiran Patil u64 port_name; /* port name for transport ID */ 333699d92aSKiran Patil struct ft_tport *tport; 343699d92aSKiran Patil struct se_session *se_sess; 353699d92aSKiran Patil struct hlist_node hash; /* linkage in ft_sess_hash table */ 363699d92aSKiran Patil struct rcu_head rcu; 373699d92aSKiran Patil struct kref kref; /* ref for hash and outstanding I/Os */ 383699d92aSKiran Patil }; 393699d92aSKiran Patil 403699d92aSKiran Patil /* 413699d92aSKiran Patil * Hash table of sessions per local port. 423699d92aSKiran Patil * Hash lookup by remote port FC_ID. 433699d92aSKiran Patil */ 443699d92aSKiran Patil #define FT_SESS_HASH_BITS 6 453699d92aSKiran Patil #define FT_SESS_HASH_SIZE (1 << FT_SESS_HASH_BITS) 463699d92aSKiran Patil 473699d92aSKiran Patil /* 483699d92aSKiran Patil * Per local port data. 493699d92aSKiran Patil * This is created only after a TPG exists that allows target function 503699d92aSKiran Patil * for the local port. If the TPG exists, this is allocated when 513699d92aSKiran Patil * we're notified that the local port has been created, or when 523699d92aSKiran Patil * the first PRLI provider callback is received. 533699d92aSKiran Patil */ 543699d92aSKiran Patil struct ft_tport { 553699d92aSKiran Patil struct fc_lport *lport; 563699d92aSKiran Patil struct ft_tpg *tpg; /* NULL if TPG deleted before tport */ 573699d92aSKiran Patil u32 sess_count; /* number of sessions in hash */ 583699d92aSKiran Patil struct rcu_head rcu; 593699d92aSKiran Patil struct hlist_head hash[FT_SESS_HASH_SIZE]; /* list of sessions */ 603699d92aSKiran Patil }; 613699d92aSKiran Patil 623699d92aSKiran Patil /* 633699d92aSKiran Patil * Node ID and authentication. 643699d92aSKiran Patil */ 653699d92aSKiran Patil struct ft_node_auth { 663699d92aSKiran Patil u64 port_name; 673699d92aSKiran Patil u64 node_name; 683699d92aSKiran Patil }; 693699d92aSKiran Patil 703699d92aSKiran Patil /* 713699d92aSKiran Patil * Node ACL for FC remote port session. 723699d92aSKiran Patil */ 733699d92aSKiran Patil struct ft_node_acl { 743699d92aSKiran Patil struct se_node_acl se_node_acl; 75144bc4c2SChristoph Hellwig struct ft_node_auth node_auth; 763699d92aSKiran Patil }; 773699d92aSKiran Patil 783699d92aSKiran Patil struct ft_lun { 793699d92aSKiran Patil u32 index; 803699d92aSKiran Patil char name[FT_LUN_NAMELEN]; 813699d92aSKiran Patil }; 823699d92aSKiran Patil 833699d92aSKiran Patil /* 843699d92aSKiran Patil * Target portal group (local port). 853699d92aSKiran Patil */ 863699d92aSKiran Patil struct ft_tpg { 873699d92aSKiran Patil u32 index; 88705665daSAndy Grover struct ft_lport_wwn *lport_wwn; 893699d92aSKiran Patil struct ft_tport *tport; /* active tport or NULL */ 903699d92aSKiran Patil struct list_head lun_list; /* head of LUNs */ 913699d92aSKiran Patil struct se_portal_group se_tpg; 9258fc73d1SChristoph Hellwig struct workqueue_struct *workqueue; 933699d92aSKiran Patil }; 943699d92aSKiran Patil 95705665daSAndy Grover struct ft_lport_wwn { 963699d92aSKiran Patil u64 wwpn; 973699d92aSKiran Patil char name[FT_NAMELEN]; 98705665daSAndy Grover struct list_head ft_wwn_node; 99d242c1d7SAndy Grover struct ft_tpg *tpg; 100705665daSAndy Grover struct se_wwn se_wwn; 1013699d92aSKiran Patil }; 1023699d92aSKiran Patil 1033699d92aSKiran Patil /* 1043699d92aSKiran Patil * Commands 1053699d92aSKiran Patil */ 1063699d92aSKiran Patil struct ft_cmd { 1073699d92aSKiran Patil struct ft_sess *sess; /* session held for cmd */ 1083699d92aSKiran Patil struct fc_seq *seq; /* sequence in exchange mgr */ 1093699d92aSKiran Patil struct se_cmd se_cmd; /* Local TCM I/O descriptor */ 1103699d92aSKiran Patil struct fc_frame *req_frame; 1113699d92aSKiran Patil u32 write_data_len; /* data received on writes */ 11258fc73d1SChristoph Hellwig struct work_struct work; 1133699d92aSKiran Patil /* Local sense buffer */ 1143699d92aSKiran Patil unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; 1153699d92aSKiran Patil u32 was_ddp_setup:1; /* Set only if ddp is setup */ 116e1c40382SMark Rustad u32 aborted:1; /* Set if aborted by reset or timeout */ 1173699d92aSKiran Patil struct scatterlist *sg; /* Set only if DDP is setup */ 1183699d92aSKiran Patil u32 sg_cnt; /* No. of item in scatterlist */ 1193699d92aSKiran Patil }; 1203699d92aSKiran Patil 1213699d92aSKiran Patil extern struct mutex ft_lport_lock; 1223699d92aSKiran Patil extern struct fc4_prov ft_prov; 1231fa8f450SMark Rustad extern unsigned int ft_debug_logging; 1243699d92aSKiran Patil 1253699d92aSKiran Patil /* 1263699d92aSKiran Patil * Fabric methods. 1273699d92aSKiran Patil */ 1283699d92aSKiran Patil 1293699d92aSKiran Patil /* 1303699d92aSKiran Patil * Session ops. 1313699d92aSKiran Patil */ 1323699d92aSKiran Patil void ft_sess_put(struct ft_sess *); 1333699d92aSKiran Patil void ft_sess_close(struct se_session *); 1343699d92aSKiran Patil u32 ft_sess_get_index(struct se_session *); 1353699d92aSKiran Patil u32 ft_sess_get_port_name(struct se_session *, unsigned char *, u32); 1363699d92aSKiran Patil 1373699d92aSKiran Patil void ft_lport_add(struct fc_lport *, void *); 1383699d92aSKiran Patil void ft_lport_del(struct fc_lport *, void *); 1393699d92aSKiran Patil int ft_lport_notify(struct notifier_block *, unsigned long, void *); 1403699d92aSKiran Patil 1413699d92aSKiran Patil /* 1423699d92aSKiran Patil * IO methods. 1433699d92aSKiran Patil */ 14488dd9e26SNicholas Bellinger int ft_check_stop_free(struct se_cmd *); 1453699d92aSKiran Patil void ft_release_cmd(struct se_cmd *); 1463699d92aSKiran Patil int ft_queue_status(struct se_cmd *); 1473699d92aSKiran Patil int ft_queue_data_in(struct se_cmd *); 1483699d92aSKiran Patil int ft_write_pending(struct se_cmd *); 149b79fafacSJoern Engel void ft_queue_tm_resp(struct se_cmd *); 150131e6abcSNicholas Bellinger void ft_aborted_task(struct se_cmd *); 1513699d92aSKiran Patil 1523699d92aSKiran Patil /* 1533699d92aSKiran Patil * other internal functions. 1543699d92aSKiran Patil */ 1553699d92aSKiran Patil void ft_recv_req(struct ft_sess *, struct fc_frame *); 1563699d92aSKiran Patil struct ft_tpg *ft_lport_find_tpg(struct fc_lport *); 1573699d92aSKiran Patil 1583699d92aSKiran Patil void ft_recv_write_data(struct ft_cmd *, struct fc_frame *); 1593699d92aSKiran Patil void ft_dump_cmd(struct ft_cmd *, const char *caller); 1603699d92aSKiran Patil 1613699d92aSKiran Patil ssize_t ft_format_wwn(char *, size_t, u64); 1623699d92aSKiran Patil 163dcd998ccSKiran Patil /* 164dcd998ccSKiran Patil * Underlying HW specific helper function 165dcd998ccSKiran Patil */ 166dcd998ccSKiran Patil void ft_invl_hw_context(struct ft_cmd *); 167dcd998ccSKiran Patil 1683699d92aSKiran Patil #endif /* __TCM_FC_H__ */ 169