tcm_fc.h (4287B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (c) 2010 Cisco Systems, Inc. 4 */ 5#ifndef __TCM_FC_H__ 6#define __TCM_FC_H__ 7 8#include <linux/types.h> 9#include <target/target_core_base.h> 10 11#define FT_VERSION "0.4" 12 13#define FT_NAMELEN 32 /* length of ASCII WWPNs including pad */ 14#define FT_TPG_NAMELEN 32 /* max length of TPG name */ 15#define FT_LUN_NAMELEN 32 /* max length of LUN name */ 16#define TCM_FC_DEFAULT_TAGS 512 /* tags used for per-session preallocation */ 17 18struct ft_transport_id { 19 __u8 format; 20 __u8 __resvd1[7]; 21 __u8 wwpn[8]; 22 __u8 __resvd2[8]; 23} __attribute__((__packed__)); 24 25/* 26 * Session (remote port). 27 */ 28struct ft_sess { 29 u32 port_id; /* for hash lookup use only */ 30 u32 params; 31 u16 max_frame; /* maximum frame size */ 32 u64 port_name; /* port name for transport ID */ 33 struct ft_tport *tport; 34 struct se_session *se_sess; 35 struct hlist_node hash; /* linkage in ft_sess_hash table */ 36 struct rcu_head rcu; 37 struct kref kref; /* ref for hash and outstanding I/Os */ 38}; 39 40/* 41 * Hash table of sessions per local port. 42 * Hash lookup by remote port FC_ID. 43 */ 44#define FT_SESS_HASH_BITS 6 45#define FT_SESS_HASH_SIZE (1 << FT_SESS_HASH_BITS) 46 47/* 48 * Per local port data. 49 * This is created only after a TPG exists that allows target function 50 * for the local port. If the TPG exists, this is allocated when 51 * we're notified that the local port has been created, or when 52 * the first PRLI provider callback is received. 53 */ 54struct ft_tport { 55 struct fc_lport *lport; 56 struct ft_tpg *tpg; /* NULL if TPG deleted before tport */ 57 u32 sess_count; /* number of sessions in hash */ 58 struct rcu_head rcu; 59 struct hlist_head hash[FT_SESS_HASH_SIZE]; /* list of sessions */ 60}; 61 62/* 63 * Node ID and authentication. 64 */ 65struct ft_node_auth { 66 u64 port_name; 67 u64 node_name; 68}; 69 70/* 71 * Node ACL for FC remote port session. 72 */ 73struct ft_node_acl { 74 struct se_node_acl se_node_acl; 75 struct ft_node_auth node_auth; 76}; 77 78struct ft_lun { 79 u32 index; 80 char name[FT_LUN_NAMELEN]; 81}; 82 83/* 84 * Target portal group (local port). 85 */ 86struct ft_tpg { 87 u32 index; 88 struct ft_lport_wwn *lport_wwn; 89 struct ft_tport *tport; /* active tport or NULL */ 90 struct list_head lun_list; /* head of LUNs */ 91 struct se_portal_group se_tpg; 92 struct workqueue_struct *workqueue; 93}; 94 95struct ft_lport_wwn { 96 u64 wwpn; 97 char name[FT_NAMELEN]; 98 struct list_head ft_wwn_node; 99 struct ft_tpg *tpg; 100 struct se_wwn se_wwn; 101}; 102 103/* 104 * Commands 105 */ 106struct ft_cmd { 107 struct ft_sess *sess; /* session held for cmd */ 108 struct fc_seq *seq; /* sequence in exchange mgr */ 109 struct se_cmd se_cmd; /* Local TCM I/O descriptor */ 110 struct fc_frame *req_frame; 111 u32 write_data_len; /* data received on writes */ 112 struct work_struct work; 113 /* Local sense buffer */ 114 unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; 115 u32 was_ddp_setup:1; /* Set only if ddp is setup */ 116 u32 aborted:1; /* Set if aborted by reset or timeout */ 117 struct scatterlist *sg; /* Set only if DDP is setup */ 118 u32 sg_cnt; /* No. of item in scatterlist */ 119}; 120 121extern struct mutex ft_lport_lock; 122extern struct fc4_prov ft_prov; 123extern unsigned int ft_debug_logging; 124 125/* 126 * Fabric methods. 127 */ 128 129/* 130 * Session ops. 131 */ 132void ft_sess_put(struct ft_sess *); 133void ft_sess_close(struct se_session *); 134u32 ft_sess_get_index(struct se_session *); 135u32 ft_sess_get_port_name(struct se_session *, unsigned char *, u32); 136 137void ft_lport_add(struct fc_lport *, void *); 138void ft_lport_del(struct fc_lport *, void *); 139int ft_lport_notify(struct notifier_block *, unsigned long, void *); 140 141/* 142 * IO methods. 143 */ 144int ft_check_stop_free(struct se_cmd *); 145void ft_release_cmd(struct se_cmd *); 146int ft_queue_status(struct se_cmd *); 147int ft_queue_data_in(struct se_cmd *); 148int ft_write_pending(struct se_cmd *); 149int ft_get_cmd_state(struct se_cmd *); 150void ft_queue_tm_resp(struct se_cmd *); 151void ft_aborted_task(struct se_cmd *); 152 153/* 154 * other internal functions. 155 */ 156void ft_recv_req(struct ft_sess *, struct fc_frame *); 157struct ft_tpg *ft_lport_find_tpg(struct fc_lport *); 158 159void ft_recv_write_data(struct ft_cmd *, struct fc_frame *); 160void ft_dump_cmd(struct ft_cmd *, const char *caller); 161 162ssize_t ft_format_wwn(char *, size_t, u64); 163 164/* 165 * Underlying HW specific helper function 166 */ 167void ft_invl_hw_context(struct ft_cmd *); 168 169#endif /* __TCM_FC_H__ */