1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * iSCSI transport class definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) IBM Corporation, 2004 6*4882a593Smuzhiyun * Copyright (C) Mike Christie, 2004 - 2006 7*4882a593Smuzhiyun * Copyright (C) Dmitry Yusupov, 2004 - 2005 8*4882a593Smuzhiyun * Copyright (C) Alex Aizman, 2004 - 2005 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun #ifndef SCSI_TRANSPORT_ISCSI_H 11*4882a593Smuzhiyun #define SCSI_TRANSPORT_ISCSI_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/device.h> 14*4882a593Smuzhiyun #include <linux/list.h> 15*4882a593Smuzhiyun #include <linux/mutex.h> 16*4882a593Smuzhiyun #include <scsi/iscsi_if.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct scsi_transport_template; 19*4882a593Smuzhiyun struct iscsi_transport; 20*4882a593Smuzhiyun struct iscsi_endpoint; 21*4882a593Smuzhiyun struct Scsi_Host; 22*4882a593Smuzhiyun struct scsi_cmnd; 23*4882a593Smuzhiyun struct iscsi_cls_conn; 24*4882a593Smuzhiyun struct iscsi_conn; 25*4882a593Smuzhiyun struct iscsi_task; 26*4882a593Smuzhiyun struct sockaddr; 27*4882a593Smuzhiyun struct iscsi_iface; 28*4882a593Smuzhiyun struct bsg_job; 29*4882a593Smuzhiyun struct iscsi_bus_flash_session; 30*4882a593Smuzhiyun struct iscsi_bus_flash_conn; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /** 33*4882a593Smuzhiyun * struct iscsi_transport - iSCSI Transport template 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * @name: transport name 36*4882a593Smuzhiyun * @caps: iSCSI Data-Path capabilities 37*4882a593Smuzhiyun * @create_session: create new iSCSI session object 38*4882a593Smuzhiyun * @destroy_session: destroy existing iSCSI session object 39*4882a593Smuzhiyun * @create_conn: create new iSCSI connection 40*4882a593Smuzhiyun * @bind_conn: associate this connection with existing iSCSI session 41*4882a593Smuzhiyun * and specified transport descriptor 42*4882a593Smuzhiyun * @destroy_conn: destroy inactive iSCSI connection 43*4882a593Smuzhiyun * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA 44*4882a593Smuzhiyun * when param is not supported, and a -Exx value on other 45*4882a593Smuzhiyun * error. 46*4882a593Smuzhiyun * @get_param get iSCSI parameter. Must return number of bytes 47*4882a593Smuzhiyun * copied to buffer on success, -ENODATA when param 48*4882a593Smuzhiyun * is not supported, and a -Exx value on other error 49*4882a593Smuzhiyun * @start_conn: set connection to be operational 50*4882a593Smuzhiyun * @stop_conn: suspend/recover/terminate connection 51*4882a593Smuzhiyun * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. 52*4882a593Smuzhiyun * @session_recovery_timedout: notify LLD a block during recovery timed out 53*4882a593Smuzhiyun * @init_task: Initialize a iscsi_task and any internal structs. 54*4882a593Smuzhiyun * When offloading the data path, this is called from 55*4882a593Smuzhiyun * queuecommand with the session lock, or from the 56*4882a593Smuzhiyun * iscsi_conn_send_pdu context with the session lock. 57*4882a593Smuzhiyun * When not offloading the data path, this is called 58*4882a593Smuzhiyun * from the scsi work queue without the session lock. 59*4882a593Smuzhiyun * @xmit_task Requests LLD to transfer cmd task. Returns 0 or the 60*4882a593Smuzhiyun * number of bytes transferred on success, and -Exyz 61*4882a593Smuzhiyun * value on error. When offloading the data path, this 62*4882a593Smuzhiyun * is called from queuecommand with the session lock, or 63*4882a593Smuzhiyun * from the iscsi_conn_send_pdu context with the session 64*4882a593Smuzhiyun * lock. When not offloading the data path, this is called 65*4882a593Smuzhiyun * from the scsi work queue without the session lock. 66*4882a593Smuzhiyun * @cleanup_task: requests LLD to fail task. Called with session lock 67*4882a593Smuzhiyun * and after the connection has been suspended and 68*4882a593Smuzhiyun * terminated during recovery. If called 69*4882a593Smuzhiyun * from abort task then connection is not suspended 70*4882a593Smuzhiyun * or terminated but sk_callback_lock is held 71*4882a593Smuzhiyun * 72*4882a593Smuzhiyun * Template API provided by iSCSI Transport 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun struct iscsi_transport { 75*4882a593Smuzhiyun struct module *owner; 76*4882a593Smuzhiyun char *name; 77*4882a593Smuzhiyun unsigned int caps; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep, 80*4882a593Smuzhiyun uint16_t cmds_max, uint16_t qdepth, 81*4882a593Smuzhiyun uint32_t sn); 82*4882a593Smuzhiyun void (*destroy_session) (struct iscsi_cls_session *session); 83*4882a593Smuzhiyun struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, 84*4882a593Smuzhiyun uint32_t cid); 85*4882a593Smuzhiyun void (*unbind_conn) (struct iscsi_cls_conn *conn, bool is_active); 86*4882a593Smuzhiyun int (*bind_conn) (struct iscsi_cls_session *session, 87*4882a593Smuzhiyun struct iscsi_cls_conn *cls_conn, 88*4882a593Smuzhiyun uint64_t transport_eph, int is_leading); 89*4882a593Smuzhiyun int (*start_conn) (struct iscsi_cls_conn *conn); 90*4882a593Smuzhiyun void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); 91*4882a593Smuzhiyun void (*destroy_conn) (struct iscsi_cls_conn *conn); 92*4882a593Smuzhiyun int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, 93*4882a593Smuzhiyun char *buf, int buflen); 94*4882a593Smuzhiyun int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param, 95*4882a593Smuzhiyun char *buf); 96*4882a593Smuzhiyun int (*get_conn_param) (struct iscsi_cls_conn *conn, 97*4882a593Smuzhiyun enum iscsi_param param, char *buf); 98*4882a593Smuzhiyun int (*get_session_param) (struct iscsi_cls_session *session, 99*4882a593Smuzhiyun enum iscsi_param param, char *buf); 100*4882a593Smuzhiyun int (*get_host_param) (struct Scsi_Host *shost, 101*4882a593Smuzhiyun enum iscsi_host_param param, char *buf); 102*4882a593Smuzhiyun int (*set_host_param) (struct Scsi_Host *shost, 103*4882a593Smuzhiyun enum iscsi_host_param param, char *buf, 104*4882a593Smuzhiyun int buflen); 105*4882a593Smuzhiyun int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 106*4882a593Smuzhiyun char *data, uint32_t data_size); 107*4882a593Smuzhiyun void (*get_stats) (struct iscsi_cls_conn *conn, 108*4882a593Smuzhiyun struct iscsi_stats *stats); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun int (*init_task) (struct iscsi_task *task); 111*4882a593Smuzhiyun int (*xmit_task) (struct iscsi_task *task); 112*4882a593Smuzhiyun void (*cleanup_task) (struct iscsi_task *task); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); 115*4882a593Smuzhiyun int (*xmit_pdu) (struct iscsi_task *task); 116*4882a593Smuzhiyun int (*init_pdu) (struct iscsi_task *task, unsigned int offset, 117*4882a593Smuzhiyun unsigned int count); 118*4882a593Smuzhiyun void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, 119*4882a593Smuzhiyun int *index, int *age); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun void (*session_recovery_timedout) (struct iscsi_cls_session *session); 122*4882a593Smuzhiyun struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, 123*4882a593Smuzhiyun struct sockaddr *dst_addr, 124*4882a593Smuzhiyun int non_blocking); 125*4882a593Smuzhiyun int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); 126*4882a593Smuzhiyun void (*ep_disconnect) (struct iscsi_endpoint *ep); 127*4882a593Smuzhiyun int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type, 128*4882a593Smuzhiyun uint32_t enable, struct sockaddr *dst_addr); 129*4882a593Smuzhiyun int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params); 130*4882a593Smuzhiyun int (*set_iface_param) (struct Scsi_Host *shost, void *data, 131*4882a593Smuzhiyun uint32_t len); 132*4882a593Smuzhiyun int (*get_iface_param) (struct iscsi_iface *iface, 133*4882a593Smuzhiyun enum iscsi_param_type param_type, 134*4882a593Smuzhiyun int param, char *buf); 135*4882a593Smuzhiyun umode_t (*attr_is_visible)(int param_type, int param); 136*4882a593Smuzhiyun int (*bsg_request)(struct bsg_job *job); 137*4882a593Smuzhiyun int (*send_ping) (struct Scsi_Host *shost, uint32_t iface_num, 138*4882a593Smuzhiyun uint32_t iface_type, uint32_t payload_size, 139*4882a593Smuzhiyun uint32_t pid, struct sockaddr *dst_addr); 140*4882a593Smuzhiyun int (*get_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx, 141*4882a593Smuzhiyun uint32_t *num_entries, char *buf); 142*4882a593Smuzhiyun int (*delete_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx); 143*4882a593Smuzhiyun int (*set_chap) (struct Scsi_Host *shost, void *data, int len); 144*4882a593Smuzhiyun int (*get_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, 145*4882a593Smuzhiyun int param, char *buf); 146*4882a593Smuzhiyun int (*set_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, 147*4882a593Smuzhiyun struct iscsi_bus_flash_conn *fnode_conn, 148*4882a593Smuzhiyun void *data, int len); 149*4882a593Smuzhiyun int (*new_flashnode) (struct Scsi_Host *shost, const char *buf, 150*4882a593Smuzhiyun int len); 151*4882a593Smuzhiyun int (*del_flashnode) (struct iscsi_bus_flash_session *fnode_sess); 152*4882a593Smuzhiyun int (*login_flashnode) (struct iscsi_bus_flash_session *fnode_sess, 153*4882a593Smuzhiyun struct iscsi_bus_flash_conn *fnode_conn); 154*4882a593Smuzhiyun int (*logout_flashnode) (struct iscsi_bus_flash_session *fnode_sess, 155*4882a593Smuzhiyun struct iscsi_bus_flash_conn *fnode_conn); 156*4882a593Smuzhiyun int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess); 157*4882a593Smuzhiyun int (*get_host_stats) (struct Scsi_Host *shost, char *buf, int len); 158*4882a593Smuzhiyun u8 (*check_protection)(struct iscsi_task *task, sector_t *sector); 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 162*4882a593Smuzhiyun * transport registration upcalls 163*4882a593Smuzhiyun */ 164*4882a593Smuzhiyun extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt); 165*4882a593Smuzhiyun extern int iscsi_unregister_transport(struct iscsi_transport *tt); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* 168*4882a593Smuzhiyun * control plane upcalls 169*4882a593Smuzhiyun */ 170*4882a593Smuzhiyun extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn, 171*4882a593Smuzhiyun enum iscsi_err error); 172*4882a593Smuzhiyun extern void iscsi_conn_login_event(struct iscsi_cls_conn *conn, 173*4882a593Smuzhiyun enum iscsi_conn_state state); 174*4882a593Smuzhiyun extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 175*4882a593Smuzhiyun char *data, uint32_t data_size); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun extern int iscsi_offload_mesg(struct Scsi_Host *shost, 178*4882a593Smuzhiyun struct iscsi_transport *transport, uint32_t type, 179*4882a593Smuzhiyun char *data, uint16_t data_size); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun extern void iscsi_post_host_event(uint32_t host_no, 182*4882a593Smuzhiyun struct iscsi_transport *transport, 183*4882a593Smuzhiyun enum iscsi_host_event_code code, 184*4882a593Smuzhiyun uint32_t data_size, 185*4882a593Smuzhiyun uint8_t *data); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun extern void iscsi_ping_comp_event(uint32_t host_no, 188*4882a593Smuzhiyun struct iscsi_transport *transport, 189*4882a593Smuzhiyun uint32_t status, uint32_t pid, 190*4882a593Smuzhiyun uint32_t data_size, uint8_t *data); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* iscsi class connection state */ 193*4882a593Smuzhiyun enum iscsi_connection_state { 194*4882a593Smuzhiyun ISCSI_CONN_UP = 0, 195*4882a593Smuzhiyun ISCSI_CONN_DOWN, 196*4882a593Smuzhiyun ISCSI_CONN_FAILED, 197*4882a593Smuzhiyun ISCSI_CONN_BOUND, 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define ISCSI_CLS_CONN_BIT_CLEANUP 1 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct iscsi_cls_conn { 203*4882a593Smuzhiyun struct list_head conn_list; /* item in connlist */ 204*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 205*4882a593Smuzhiyun struct iscsi_transport *transport; 206*4882a593Smuzhiyun uint32_t cid; /* connection id */ 207*4882a593Smuzhiyun /* 208*4882a593Smuzhiyun * This protects the conn startup and binding/unbinding of the ep to 209*4882a593Smuzhiyun * the conn. Unbinding includes ep_disconnect and stop_conn. 210*4882a593Smuzhiyun */ 211*4882a593Smuzhiyun struct mutex ep_mutex; 212*4882a593Smuzhiyun struct iscsi_endpoint *ep; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* Used when accessing flags and queueing work. */ 215*4882a593Smuzhiyun spinlock_t lock; 216*4882a593Smuzhiyun unsigned long flags; 217*4882a593Smuzhiyun struct work_struct cleanup_work; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun struct device dev; /* sysfs transport/container device */ 220*4882a593Smuzhiyun enum iscsi_connection_state state; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define iscsi_dev_to_conn(_dev) \ 224*4882a593Smuzhiyun container_of(_dev, struct iscsi_cls_conn, dev) 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define transport_class_to_conn(_cdev) \ 227*4882a593Smuzhiyun iscsi_dev_to_conn(_cdev->parent) 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun #define iscsi_conn_to_session(_conn) \ 230*4882a593Smuzhiyun iscsi_dev_to_session(_conn->dev.parent) 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* iscsi class session state */ 233*4882a593Smuzhiyun enum { 234*4882a593Smuzhiyun ISCSI_SESSION_LOGGED_IN, 235*4882a593Smuzhiyun ISCSI_SESSION_FAILED, 236*4882a593Smuzhiyun ISCSI_SESSION_FREE, 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define ISCSI_MAX_TARGET -1 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun struct iscsi_cls_session { 242*4882a593Smuzhiyun struct list_head sess_list; /* item in session_list */ 243*4882a593Smuzhiyun struct iscsi_transport *transport; 244*4882a593Smuzhiyun spinlock_t lock; 245*4882a593Smuzhiyun struct work_struct block_work; 246*4882a593Smuzhiyun struct work_struct unblock_work; 247*4882a593Smuzhiyun struct work_struct scan_work; 248*4882a593Smuzhiyun struct work_struct unbind_work; 249*4882a593Smuzhiyun struct work_struct destroy_work; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* recovery fields */ 252*4882a593Smuzhiyun int recovery_tmo; 253*4882a593Smuzhiyun bool recovery_tmo_sysfs_override; 254*4882a593Smuzhiyun struct delayed_work recovery_work; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun unsigned int target_id; 257*4882a593Smuzhiyun bool ida_used; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* 260*4882a593Smuzhiyun * pid of userspace process that created session or -1 if 261*4882a593Smuzhiyun * created by the kernel. 262*4882a593Smuzhiyun */ 263*4882a593Smuzhiyun pid_t creator; 264*4882a593Smuzhiyun int state; 265*4882a593Smuzhiyun int sid; /* session id */ 266*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 267*4882a593Smuzhiyun struct device dev; /* sysfs transport/container device */ 268*4882a593Smuzhiyun }; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun #define iscsi_dev_to_session(_dev) \ 271*4882a593Smuzhiyun container_of(_dev, struct iscsi_cls_session, dev) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define transport_class_to_session(_cdev) \ 274*4882a593Smuzhiyun iscsi_dev_to_session(_cdev->parent) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #define iscsi_session_to_shost(_session) \ 277*4882a593Smuzhiyun dev_to_shost(_session->dev.parent) 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define starget_to_session(_stgt) \ 280*4882a593Smuzhiyun iscsi_dev_to_session(_stgt->dev.parent) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun struct iscsi_cls_host { 283*4882a593Smuzhiyun atomic_t nr_scans; 284*4882a593Smuzhiyun struct mutex mutex; 285*4882a593Smuzhiyun struct request_queue *bsg_q; 286*4882a593Smuzhiyun uint32_t port_speed; 287*4882a593Smuzhiyun uint32_t port_state; 288*4882a593Smuzhiyun }; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun #define iscsi_job_to_shost(_job) \ 291*4882a593Smuzhiyun dev_to_shost(_job->dev) 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun extern void iscsi_host_for_each_session(struct Scsi_Host *shost, 294*4882a593Smuzhiyun void (*fn)(struct iscsi_cls_session *)); 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun struct iscsi_endpoint { 297*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 298*4882a593Smuzhiyun struct device dev; 299*4882a593Smuzhiyun uint64_t id; 300*4882a593Smuzhiyun struct iscsi_cls_conn *conn; 301*4882a593Smuzhiyun }; 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun struct iscsi_iface { 304*4882a593Smuzhiyun struct device dev; 305*4882a593Smuzhiyun struct iscsi_transport *transport; 306*4882a593Smuzhiyun uint32_t iface_type; /* IPv4 or IPv6 */ 307*4882a593Smuzhiyun uint32_t iface_num; /* iface number, 0 - n */ 308*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun #define iscsi_dev_to_iface(_dev) \ 312*4882a593Smuzhiyun container_of(_dev, struct iscsi_iface, dev) 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun #define iscsi_iface_to_shost(_iface) \ 315*4882a593Smuzhiyun dev_to_shost(_iface->dev.parent) 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun struct iscsi_bus_flash_conn { 319*4882a593Smuzhiyun struct list_head conn_list; /* item in connlist */ 320*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 321*4882a593Smuzhiyun struct iscsi_transport *transport; 322*4882a593Smuzhiyun struct device dev; /* sysfs transport/container device */ 323*4882a593Smuzhiyun /* iscsi connection parameters */ 324*4882a593Smuzhiyun uint32_t exp_statsn; 325*4882a593Smuzhiyun uint32_t statsn; 326*4882a593Smuzhiyun unsigned max_recv_dlength; /* initiator_max_recv_dsl*/ 327*4882a593Smuzhiyun unsigned max_xmit_dlength; /* target_max_recv_dsl */ 328*4882a593Smuzhiyun unsigned max_segment_size; 329*4882a593Smuzhiyun unsigned tcp_xmit_wsf; 330*4882a593Smuzhiyun unsigned tcp_recv_wsf; 331*4882a593Smuzhiyun int hdrdgst_en; 332*4882a593Smuzhiyun int datadgst_en; 333*4882a593Smuzhiyun int port; 334*4882a593Smuzhiyun char *ipaddress; 335*4882a593Smuzhiyun char *link_local_ipv6_addr; 336*4882a593Smuzhiyun char *redirect_ipaddr; 337*4882a593Smuzhiyun uint16_t keepalive_timeout; 338*4882a593Smuzhiyun uint16_t local_port; 339*4882a593Smuzhiyun uint8_t snack_req_en; 340*4882a593Smuzhiyun /* tcp timestamp negotiation status */ 341*4882a593Smuzhiyun uint8_t tcp_timestamp_stat; 342*4882a593Smuzhiyun uint8_t tcp_nagle_disable; 343*4882a593Smuzhiyun /* tcp window scale factor */ 344*4882a593Smuzhiyun uint8_t tcp_wsf_disable; 345*4882a593Smuzhiyun uint8_t tcp_timer_scale; 346*4882a593Smuzhiyun uint8_t tcp_timestamp_en; 347*4882a593Smuzhiyun uint8_t ipv4_tos; 348*4882a593Smuzhiyun uint8_t ipv6_traffic_class; 349*4882a593Smuzhiyun uint8_t ipv6_flow_label; 350*4882a593Smuzhiyun uint8_t fragment_disable; 351*4882a593Smuzhiyun /* Link local IPv6 address is assigned by firmware or driver */ 352*4882a593Smuzhiyun uint8_t is_fw_assigned_ipv6; 353*4882a593Smuzhiyun }; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun #define iscsi_dev_to_flash_conn(_dev) \ 356*4882a593Smuzhiyun container_of(_dev, struct iscsi_bus_flash_conn, dev) 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun #define iscsi_flash_conn_to_flash_session(_conn) \ 359*4882a593Smuzhiyun iscsi_dev_to_flash_session(_conn->dev.parent) 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun #define ISID_SIZE 6 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun struct iscsi_bus_flash_session { 364*4882a593Smuzhiyun struct list_head sess_list; /* item in session_list */ 365*4882a593Smuzhiyun struct iscsi_transport *transport; 366*4882a593Smuzhiyun unsigned int target_id; 367*4882a593Smuzhiyun int flash_state; /* persistent or non-persistent */ 368*4882a593Smuzhiyun void *dd_data; /* LLD private data */ 369*4882a593Smuzhiyun struct device dev; /* sysfs transport/container device */ 370*4882a593Smuzhiyun /* iscsi session parameters */ 371*4882a593Smuzhiyun unsigned first_burst; 372*4882a593Smuzhiyun unsigned max_burst; 373*4882a593Smuzhiyun unsigned short max_r2t; 374*4882a593Smuzhiyun int default_taskmgmt_timeout; 375*4882a593Smuzhiyun int initial_r2t_en; 376*4882a593Smuzhiyun int imm_data_en; 377*4882a593Smuzhiyun int time2wait; 378*4882a593Smuzhiyun int time2retain; 379*4882a593Smuzhiyun int pdu_inorder_en; 380*4882a593Smuzhiyun int dataseq_inorder_en; 381*4882a593Smuzhiyun int erl; 382*4882a593Smuzhiyun int tpgt; 383*4882a593Smuzhiyun char *username; 384*4882a593Smuzhiyun char *username_in; 385*4882a593Smuzhiyun char *password; 386*4882a593Smuzhiyun char *password_in; 387*4882a593Smuzhiyun char *targetname; 388*4882a593Smuzhiyun char *targetalias; 389*4882a593Smuzhiyun char *portal_type; 390*4882a593Smuzhiyun uint16_t tsid; 391*4882a593Smuzhiyun uint16_t chap_in_idx; 392*4882a593Smuzhiyun uint16_t chap_out_idx; 393*4882a593Smuzhiyun /* index of iSCSI discovery session if the entry is 394*4882a593Smuzhiyun * discovered by iSCSI discovery session 395*4882a593Smuzhiyun */ 396*4882a593Smuzhiyun uint16_t discovery_parent_idx; 397*4882a593Smuzhiyun /* indicates if discovery was done through iSNS discovery service 398*4882a593Smuzhiyun * or through sendTarget */ 399*4882a593Smuzhiyun uint16_t discovery_parent_type; 400*4882a593Smuzhiyun /* Firmware auto sendtarget discovery disable */ 401*4882a593Smuzhiyun uint8_t auto_snd_tgt_disable; 402*4882a593Smuzhiyun uint8_t discovery_sess; 403*4882a593Smuzhiyun /* indicates if this flashnode entry is enabled or disabled */ 404*4882a593Smuzhiyun uint8_t entry_state; 405*4882a593Smuzhiyun uint8_t chap_auth_en; 406*4882a593Smuzhiyun /* enables firmware to auto logout the discovery session on discovery 407*4882a593Smuzhiyun * completion 408*4882a593Smuzhiyun */ 409*4882a593Smuzhiyun uint8_t discovery_logout_en; 410*4882a593Smuzhiyun uint8_t bidi_chap_en; 411*4882a593Smuzhiyun /* makes authentication for discovery session optional */ 412*4882a593Smuzhiyun uint8_t discovery_auth_optional; 413*4882a593Smuzhiyun uint8_t isid[ISID_SIZE]; 414*4882a593Smuzhiyun uint8_t is_boot_target; 415*4882a593Smuzhiyun }; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun #define iscsi_dev_to_flash_session(_dev) \ 418*4882a593Smuzhiyun container_of(_dev, struct iscsi_bus_flash_session, dev) 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun #define iscsi_flash_session_to_shost(_session) \ 421*4882a593Smuzhiyun dev_to_shost(_session->dev.parent) 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /* 424*4882a593Smuzhiyun * session and connection functions that can be used by HW iSCSI LLDs 425*4882a593Smuzhiyun */ 426*4882a593Smuzhiyun #define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \ 427*4882a593Smuzhiyun dev_printk(prefix, &(_cls_session)->dev, fmt, ##a) 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \ 430*4882a593Smuzhiyun dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a) 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun extern int iscsi_session_chkready(struct iscsi_cls_session *session); 433*4882a593Smuzhiyun extern int iscsi_is_session_online(struct iscsi_cls_session *session); 434*4882a593Smuzhiyun extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, 435*4882a593Smuzhiyun struct iscsi_transport *transport, int dd_size); 436*4882a593Smuzhiyun extern int iscsi_add_session(struct iscsi_cls_session *session, 437*4882a593Smuzhiyun unsigned int target_id); 438*4882a593Smuzhiyun extern int iscsi_session_event(struct iscsi_cls_session *session, 439*4882a593Smuzhiyun enum iscsi_uevent_e event); 440*4882a593Smuzhiyun extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, 441*4882a593Smuzhiyun struct iscsi_transport *t, 442*4882a593Smuzhiyun int dd_size, 443*4882a593Smuzhiyun unsigned int target_id); 444*4882a593Smuzhiyun extern void iscsi_remove_session(struct iscsi_cls_session *session); 445*4882a593Smuzhiyun extern void iscsi_free_session(struct iscsi_cls_session *session); 446*4882a593Smuzhiyun extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, 447*4882a593Smuzhiyun int dd_size, uint32_t cid); 448*4882a593Smuzhiyun extern void iscsi_put_conn(struct iscsi_cls_conn *conn); 449*4882a593Smuzhiyun extern void iscsi_get_conn(struct iscsi_cls_conn *conn); 450*4882a593Smuzhiyun extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); 451*4882a593Smuzhiyun extern void iscsi_unblock_session(struct iscsi_cls_session *session); 452*4882a593Smuzhiyun extern void iscsi_block_session(struct iscsi_cls_session *session); 453*4882a593Smuzhiyun extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time); 454*4882a593Smuzhiyun extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size); 455*4882a593Smuzhiyun extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep); 456*4882a593Smuzhiyun extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle); 457*4882a593Smuzhiyun extern void iscsi_put_endpoint(struct iscsi_endpoint *ep); 458*4882a593Smuzhiyun extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd); 459*4882a593Smuzhiyun extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost, 460*4882a593Smuzhiyun struct iscsi_transport *t, 461*4882a593Smuzhiyun uint32_t iface_type, 462*4882a593Smuzhiyun uint32_t iface_num, int dd_size); 463*4882a593Smuzhiyun extern void iscsi_destroy_iface(struct iscsi_iface *iface); 464*4882a593Smuzhiyun extern struct iscsi_iface *iscsi_lookup_iface(int handle); 465*4882a593Smuzhiyun extern char *iscsi_get_port_speed_name(struct Scsi_Host *shost); 466*4882a593Smuzhiyun extern char *iscsi_get_port_state_name(struct Scsi_Host *shost); 467*4882a593Smuzhiyun extern int iscsi_is_session_dev(const struct device *dev); 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun extern char *iscsi_get_discovery_parent_name(int parent_type); 470*4882a593Smuzhiyun extern struct device * 471*4882a593Smuzhiyun iscsi_find_flashnode(struct Scsi_Host *shost, void *data, 472*4882a593Smuzhiyun int (*fn)(struct device *dev, void *data)); 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun extern struct iscsi_bus_flash_session * 475*4882a593Smuzhiyun iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index, 476*4882a593Smuzhiyun struct iscsi_transport *transport, int dd_size); 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun extern struct iscsi_bus_flash_conn * 479*4882a593Smuzhiyun iscsi_create_flashnode_conn(struct Scsi_Host *shost, 480*4882a593Smuzhiyun struct iscsi_bus_flash_session *fnode_sess, 481*4882a593Smuzhiyun struct iscsi_transport *transport, int dd_size); 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun extern void 484*4882a593Smuzhiyun iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session *fnode_sess); 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun extern void iscsi_destroy_all_flashnode(struct Scsi_Host *shost); 487*4882a593Smuzhiyun extern int iscsi_flashnode_bus_match(struct device *dev, 488*4882a593Smuzhiyun struct device_driver *drv); 489*4882a593Smuzhiyun extern struct device * 490*4882a593Smuzhiyun iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data, 491*4882a593Smuzhiyun int (*fn)(struct device *dev, void *data)); 492*4882a593Smuzhiyun extern struct device * 493*4882a593Smuzhiyun iscsi_find_flashnode_conn(struct iscsi_bus_flash_session *fnode_sess); 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun extern char * 496*4882a593Smuzhiyun iscsi_get_ipaddress_state_name(enum iscsi_ipaddress_state port_state); 497*4882a593Smuzhiyun extern char *iscsi_get_router_state_name(enum iscsi_router_state router_state); 498*4882a593Smuzhiyun #endif 499