244 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _SBP_BASE_H3#define _SBP_BASE_H4 5#include <linux/firewire.h>6#include <linux/spinlock.h>7#include <linux/types.h>8#include <linux/workqueue.h>9#include <target/target_core_base.h>10 11#define SBP_VERSION "v0.1"12#define SBP_NAMELEN 3213 14#define SBP_ORB_FETCH_SIZE 815 16#define MANAGEMENT_AGENT_STATE_IDLE 017#define MANAGEMENT_AGENT_STATE_BUSY 118 19#define ORB_NOTIFY(v) (((v) >> 31) & 0x01)20#define ORB_REQUEST_FORMAT(v) (((v) >> 29) & 0x03)21 22#define MANAGEMENT_ORB_FUNCTION(v) (((v) >> 16) & 0x0f)23 24#define MANAGEMENT_ORB_FUNCTION_LOGIN 0x025#define MANAGEMENT_ORB_FUNCTION_QUERY_LOGINS 0x126#define MANAGEMENT_ORB_FUNCTION_RECONNECT 0x327#define MANAGEMENT_ORB_FUNCTION_SET_PASSWORD 0x428#define MANAGEMENT_ORB_FUNCTION_LOGOUT 0x729#define MANAGEMENT_ORB_FUNCTION_ABORT_TASK 0xb30#define MANAGEMENT_ORB_FUNCTION_ABORT_TASK_SET 0xc31#define MANAGEMENT_ORB_FUNCTION_LOGICAL_UNIT_RESET 0xe32#define MANAGEMENT_ORB_FUNCTION_TARGET_RESET 0xf33 34#define LOGIN_ORB_EXCLUSIVE(v) (((v) >> 28) & 0x01)35#define LOGIN_ORB_RESERVED(v) (((v) >> 24) & 0x0f)36#define LOGIN_ORB_RECONNECT(v) (((v) >> 20) & 0x0f)37#define LOGIN_ORB_LUN(v) (((v) >> 0) & 0xffff)38#define LOGIN_ORB_PASSWORD_LENGTH(v) (((v) >> 16) & 0xffff)39#define LOGIN_ORB_RESPONSE_LENGTH(v) (((v) >> 0) & 0xffff)40 41#define RECONNECT_ORB_LOGIN_ID(v) (((v) >> 0) & 0xffff)42#define LOGOUT_ORB_LOGIN_ID(v) (((v) >> 0) & 0xffff)43 44#define CMDBLK_ORB_DIRECTION(v) (((v) >> 27) & 0x01)45#define CMDBLK_ORB_SPEED(v) (((v) >> 24) & 0x07)46#define CMDBLK_ORB_MAX_PAYLOAD(v) (((v) >> 20) & 0x0f)47#define CMDBLK_ORB_PG_TBL_PRESENT(v) (((v) >> 19) & 0x01)48#define CMDBLK_ORB_PG_SIZE(v) (((v) >> 16) & 0x07)49#define CMDBLK_ORB_DATA_SIZE(v) (((v) >> 0) & 0xffff)50 51#define STATUS_BLOCK_SRC(v) (((v) & 0x03) << 30)52#define STATUS_BLOCK_RESP(v) (((v) & 0x03) << 28)53#define STATUS_BLOCK_DEAD(v) (((v) ? 1 : 0) << 27)54#define STATUS_BLOCK_LEN(v) (((v) & 0x07) << 24)55#define STATUS_BLOCK_SBP_STATUS(v) (((v) & 0xff) << 16)56#define STATUS_BLOCK_ORB_OFFSET_HIGH(v) (((v) & 0xffff) << 0)57 58#define STATUS_SRC_ORB_CONTINUING 059#define STATUS_SRC_ORB_FINISHED 160#define STATUS_SRC_UNSOLICITED 261 62#define STATUS_RESP_REQUEST_COMPLETE 063#define STATUS_RESP_TRANSPORT_FAILURE 164#define STATUS_RESP_ILLEGAL_REQUEST 265#define STATUS_RESP_VENDOR_DEPENDENT 366 67#define SBP_STATUS_OK 068#define SBP_STATUS_REQ_TYPE_NOTSUPP 169#define SBP_STATUS_SPEED_NOTSUPP 270#define SBP_STATUS_PAGE_SIZE_NOTSUPP 371#define SBP_STATUS_ACCESS_DENIED 472#define SBP_STATUS_LUN_NOTSUPP 573#define SBP_STATUS_PAYLOAD_TOO_SMALL 674/* 7 is reserved */75#define SBP_STATUS_RESOURCES_UNAVAIL 876#define SBP_STATUS_FUNCTION_REJECTED 977#define SBP_STATUS_LOGIN_ID_UNKNOWN 1078#define SBP_STATUS_DUMMY_ORB_COMPLETE 1179#define SBP_STATUS_REQUEST_ABORTED 1280#define SBP_STATUS_UNSPECIFIED_ERROR 0xff81 82#define AGENT_STATE_RESET 083#define AGENT_STATE_ACTIVE 184#define AGENT_STATE_SUSPENDED 285#define AGENT_STATE_DEAD 386 87struct sbp2_pointer {88 __be32 high;89 __be32 low;90};91 92struct sbp_command_block_orb {93 struct sbp2_pointer next_orb;94 struct sbp2_pointer data_descriptor;95 __be32 misc;96 u8 command_block[12];97};98 99struct sbp_page_table_entry {100 __be16 segment_length;101 __be16 segment_base_hi;102 __be32 segment_base_lo;103};104 105struct sbp_management_orb {106 struct sbp2_pointer ptr1;107 struct sbp2_pointer ptr2;108 __be32 misc;109 __be32 length;110 struct sbp2_pointer status_fifo;111};112 113struct sbp_status_block {114 __be32 status;115 __be32 orb_low;116 u8 data[24];117};118 119struct sbp_login_response_block {120 __be32 misc;121 struct sbp2_pointer command_block_agent;122 __be32 reconnect_hold;123};124 125struct sbp_login_descriptor {126 struct sbp_session *sess;127 struct list_head link;128 129 u32 login_lun;130 131 u64 status_fifo_addr;132 int exclusive;133 u16 login_id;134 135 struct sbp_target_agent *tgt_agt;136};137 138struct sbp_session {139 spinlock_t lock;140 struct se_session *se_sess;141 struct list_head login_list;142 struct delayed_work maint_work;143 144 u64 guid; /* login_owner_EUI_64 */145 int node_id; /* login_owner_ID */146 147 struct fw_card *card;148 int generation;149 int speed;150 151 int reconnect_hold;152 u64 reconnect_expires;153};154 155struct sbp_tpg {156 /* Target portal group tag for TCM */157 u16 tport_tpgt;158 /* Pointer back to sbp_tport */159 struct sbp_tport *tport;160 /* Returned by sbp_make_tpg() */161 struct se_portal_group se_tpg;162};163 164struct sbp_tport {165 /* Target Unit Identifier (EUI-64) */166 u64 guid;167 /* Target port name */168 char tport_name[SBP_NAMELEN];169 /* Returned by sbp_make_tport() */170 struct se_wwn tport_wwn;171 172 struct sbp_tpg *tpg;173 174 /* FireWire unit directory */175 struct fw_descriptor unit_directory;176 177 /* SBP Management Agent */178 struct sbp_management_agent *mgt_agt;179 180 /* Parameters */181 int enable;182 s32 directory_id;183 int mgt_orb_timeout;184 int max_reconnect_timeout;185 int max_logins_per_lun;186};187 188static inline u64 sbp2_pointer_to_addr(const struct sbp2_pointer *ptr)189{190 return (u64)(be32_to_cpu(ptr->high) & 0x0000ffff) << 32 |191 (be32_to_cpu(ptr->low) & 0xfffffffc);192}193 194static inline void addr_to_sbp2_pointer(u64 addr, struct sbp2_pointer *ptr)195{196 ptr->high = cpu_to_be32(addr >> 32);197 ptr->low = cpu_to_be32(addr);198}199 200struct sbp_target_agent {201 spinlock_t lock;202 struct fw_address_handler handler;203 struct sbp_login_descriptor *login;204 int state;205 struct work_struct work;206 u64 orb_pointer;207 bool doorbell;208};209 210struct sbp_target_request {211 struct sbp_login_descriptor *login;212 u64 orb_pointer;213 struct sbp_command_block_orb orb;214 struct sbp_status_block status;215 struct work_struct work;216 217 struct se_cmd se_cmd;218 struct sbp_page_table_entry *pg_tbl;219 void *cmd_buf;220 221 unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];222};223 224struct sbp_management_agent {225 spinlock_t lock;226 struct sbp_tport *tport;227 struct fw_address_handler handler;228 int state;229 struct work_struct work;230 u64 orb_offset;231 struct sbp_management_request *request;232};233 234struct sbp_management_request {235 struct sbp_management_orb orb;236 struct sbp_status_block status;237 struct fw_card *card;238 int generation;239 int node_addr;240 int speed;241};242 243#endif244