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