1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
- configuration rom
- p1212 takes care of this, though it might be useful to compile the info into
a direct usable form (a struct)
- access control
- target login_descriptors : context of a login
- lun
- login_owner_id
- login_owner_EUI_64
- status_fifo_addr
- exclusive_flag
- fetch_agent_csr
- login_id
- reconnect_hold
- login procedure
- 8-byte (login_request_addr) block-write transaction to the
management_agent_csr
- target reads the initiator's EUI64 with 2 quadlet-read transactions
- target reads the login_request_orb at login_request_addr
- if initiator's EUI64 exists in login_owner_EUI_64 : access denied
- if initiator wants exclusive and lun already used : access denied
- if exclusive_flag set on lun's login_descriptor : access denied
- if no login_descriptor is available : resources unavailable
- if it's ok, target return a valid login_response
- reconnection procedure
- 8-byte (reconnect_request_addr) block-write transaction to the
management_agent_csr
- target reads the initiator's EUI64 with 2 quadlet-read transactions
- target reads the reconnect_request_orb at reconnect_request_addr
- a completion status is sent back to the initiator
- logout procedure
- 8-byte (logout_request_addr) block-write transaction to the
management_agent_csr
- a completion status is sent back to the initiator
- command execution
- requests and request-lists
- fetch agent initialization
- initiator allocates a dummy_orb, with a null pointer as next_orb,
of at least the minimum orb size
- initiator resets target fetch agent with a quadlet-write to
AGENT_RESET register
- initiator writes dummy_orb_addr with 8-byte block-write to
ORB_POINTER register
- fetch agent transition to ACTIVE state
- fetch agent reads the terminating dummy_orb and transition to
SUSPENDED state
- dynamic appends to request lists
- initiator constructs a linked-list of orbs in system memory, the
last orb's next_orb is null
- initiator updates the current last orb's next_orb to the first orb
of the linked-list
- initiator transmits a quadlet-write to the target's DOORBELL register
if the target is already in SUSPENDED state, the initiator may write
the first orb to ORB_POINTER register, and no DOORBELL is necessary
- data transfer
- completion status
- unsolicited status
- task management
- task sets
- basic task management model
- all tasks in a task set share the same execution characteristics :
reorderable/ordered
- reorderable/ordered feature is target dependent, see config_rom
- each task is identified by its orb's serial bus address
- all targets must at least implement the abort task, abort task set and
target reset management functions
- error conditions : entire task set is cleared on error condition
- fetch agent transitions to dead state
- target waits for sent status completion of all the completed tasks
- then target sends status completion for the faulty task, with dead bit
- task management requests
- abort task
- modify the rq_fmt to 3 in the task to be aborted's orb
- setup an ABORT_TASK management orb with the task orb's serial bus addr
- if target fetch an aborted task, sends REQUEST_COMPLETE on dummy_orb
- initiator may not reuse the memory of the task to abort until
completion has been received
- abort task set
- initiator sends an ABORT_TASK_SET management orb with login_id to target
- fetch agent transitions to dead state
- target waits for sent status completion of all the completed tasks
- then target sends status completion into the supplied status buffer
- initiator may not reuse the memory of any task in the task set until
a completion status is received for the abort task set management task
- logical unit reset (optional)
- initiator sends a LOGICAL_UNIT_RESET management orb with login_id to
target
- fetch agent transitions to dead state for all the lun's fetch agents
- target creates a logical unit attention condition to all the initiators
logged in to that lun (except the one initiating the reset)
- then target sends status completion into the supplied status buffer
- initiator may not reuse the memory of any task in the task set until
a completion status is received for the logical unit reset management
task
- target reset
- initiator sends a TARGET_RESET management orb with login_id to target
- fetch agent transitions to dead state for all the fetch agents
- target creates a logical unit attention condition to all the initiators
except the one initiating the reset
- then target sends status completion into the supplied status buffer
- initiator may not reuse the memory of any task in the task set until
a completion status is received for the target reset management task
- data structures
- ORB : rq_fmt_dep:128|notify:1|rq_fmt:2|rq_fmt_dep:29|rq_fmt_dep:nq
rq_fmt = 0|std, 1|rsvd, 2|vend, 3|nop
- Dummy ORB : next_ORB:64|ignore:64|notify:1|3:2|ignore:29|ignore:nq
- Command ORB : next_ORB:64|data_descr:64|notify:1|0:2|rsvd:1|direction:1|
speed:3|max_payload:4|page_table_present:1|page_size:3|
data_size:16|command_block:nq
speed = 0|S100, 1|S200, 2|S400, 3|S800, 4|S1600, 5|S3200
max payload = 2 ^ (max_payload + 2)
page size = 2 ^ (page_size + 8), if page_size != 0
(page_table_present):(page_size == 0)?unrestricted:normalized
(page_table_present):data_size = # of table elements
?data_size = data_descriptor size
- Management ORB : func_dep:128|notify:1|0:2|rsvd:9|function:4|func_dep:16|
func_dep:32|status_fifo:64
function = 0|LOGIN, 1|QUERY_LOGINS, 3|RECONNECT, 4|SET_PASSWORD,
7|LOGOUT, B|ABORT_TASK, C|ABORT_TASK_SET,
E|LOGICAL_UNIT_RESET, F|TARGET_RESET
- Access ORB
- LOGIN ORB : password:64|login_response:64|notify:1|0:2|exclusive:1|
rsvd:4|reconnect:4|0:4|lun:16|password_length:16|
login_response_length:16|status_fifo:64
login_response_length >= 12
reconnect timeout = 2 ^ reconnect
- login response : length:16|login_ID:16|command_block_agent:64|
rsvd:16|reconnect_hold:16
reconnect_hold <= 2 ^ reconnect - 1
- QUERY_LOGINS ORB : rsvd:64|query_response:64|n0..1:16|lun:16|rsvd:16|
query_response_length:16|status_fifo:64
- query response : length:16|max_logins:16|
(node_ID:16|login_ID:16|initiator_EUI_64:64)*n
- RECONNECT ORB : rsvd:128|n0..3:16|login_ID:16|rsvd:32|status_fifo:64
- LOGOUT ORB : rsvd:128|n0..7:16|login_ID:16|rsvd:32|status_fifo:64
- Task Management ORB : ORB_offset:064|rsvd:64|n0..fn:16|login_ID:16|
rsvd:32|status_fifo:64
fn = B|ABORT_TASK, C|ABORT_TASK_SET,
E|LOGICAL_UNIT_RESET, F|TARGET_RESET
if ABORT_TASK, ORB_offset is relevant
- page tables
- unrestricted page table : segment_length:16|segment_base:48
- normalized page table : segment_length:16|segment_base..segment_offset:48
- status block : src:2|resp:2|dead:1|len:3|sbp_status:8|ORB_offset:48|cmd_dep
- address pointer : node_ID:16|offset:46|rsvd:2
- ORB pointer : null:1|rsvd:15|offset:46|rsvd:2
- CSR
|