4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_IB_MGT_IBDM_IBDM_IMPL_H
27 #define _SYS_IB_MGT_IBDM_IBDM_IMPL_H
32 * This file contains definitions of the data structures, macros etc
33 * related to the IBDM module.
36 #include <sys/ib/mgt/ibdm/ibdm_ibnex.h>
37 #include <sys/ib/ibtl/impl/ibtl_util.h>
43 /* values for "cb_req_type" */
44 #define IBDM_REQ_TYPE_INVALID 0x0
45 #define IBDM_REQ_TYPE_CLASSPORTINFO 0x1
46 #define IBDM_REQ_TYPE_IOUINFO 0x2
47 #define IBDM_REQ_TYPE_IOCINFO 0x4
48 #define IBDM_REQ_TYPE_SRVENTS 0x8
49 #define IBDM_REQ_TYPE_IOU_DIAGCODE 0x10
50 #define IBDM_REQ_TYPE_IOC_DIAGCODE 0x20
52 typedef struct ibdm_taskq_args_s
{
53 ibmf_handle_t tq_ibmf_handle
;
54 ibmf_msg_t
*tq_ibmf_msg
;
57 _NOTE(SCHEME_PROTECTS_DATA("unique per call", ibdm_taskq_args_t
))
58 _NOTE(SCHEME_PROTECTS_DATA("unique per call", ib_mad_hdr_t
))
59 _NOTE(SCHEME_PROTECTS_DATA("unique per call", ibmf_msg_t
))
61 #define IBDM_GID_PRESENT 0x1
62 #define IBDM_GID_NOT_PRESENT 0x0
64 #define IBDM_IBMF_PKT_DUP_RESP 0x1
65 #define IBDM_IBMF_PKT_REUSED 0x2
66 #define IBDM_IBMF_PKT_UNEXP_RESP 0x4
68 #define IBDM_MAX_SERV_ENTRIES_PER_REQ 4
70 typedef struct ibdm_gid_s
{
73 struct ibdm_gid_s
*gid_next
;
76 #define IBDM_GID_PROBE_NOT_DONE 0x00
77 #define IBDM_GET_CLASSPORTINFO 0x01
78 #define IBDM_GET_IOUNITINFO 0x02
79 #define IBDM_GET_IOC_DETAILS 0x04
80 #define IBDM_GID_PROBING_COMPLETE 0x08
81 #define IBDM_GID_PROBING_SKIPPED 0x10
82 #define IBDM_GID_PROBING_FAILED 0x20
83 #define IBDM_SET_CLASSPORTINFO 0x40
86 * Identifiers to distinguish a Cisco FC GW from others.
87 * Used to filter a setclassportinfo request.
89 #define IBDM_CISCO_COMPANY_ID (0x5ad)
90 #define IBDM_CISCO_DEVICE_ID (0xa87c)
93 * the bit-shift value for OUI in GUID
94 * A 64 bit globally unique identifier (GUID) composed of a 24 bit company id
95 * and an 48 bit extension identifier, and this value is used to extract
96 * the company id from the GUID.
98 #define IBDM_OUI_GUID_SHIFT (40)
101 * The state diagram for the gl_state
103 * (in case of Cisco FC GW)
104 * IBDM_GID_PROBE_NOT_DONE ---------- 40 -> IBDM_SET_CLASSPORTINFO
109 * | | `-------------. |
111 * | | IBDM_GET_CLASSPORTINFO
117 * | IBDM_GID_PROBING_FAILED IBDM_GET_IOUNITINFO
122 * IBDM_GID_PROBING_SKIPPLED IBDM_GET_IOC_DETAILS
127 * IBDM_GID_PROBE_COMPLETE
129 * Initial state : IBDM_GID_PROBE_NOT_DONE
130 * 40 = Port sends setClassPortInfo to activate Cisco FC GW
131 * 1 = Port supports DM MAD's and a request to ClassportInfo is sent
132 * 3 = Received ClassPortInfo and sent IOUnitInfo
133 * 4 = Recevied IOUunitInfo and sent IOC profile, diagcodes, and
134 * service entries requests
135 * 5 = Received all the IOC information
136 * 2 = Failed to probe the GID
137 * Port does not support DM MAD's
138 * Port did not respond property
139 * 6 = A different GID for the same port, skip the probe
141 * Reprobe state transition :
143 * IBDM_GID_PROBE_COMPLETE
148 * IBDM_GET_IOC_DETAILS
153 * IBDM_GID_PROBE_COMPLETE
155 * 7 = Reprobe request for one or more IOCs initiated.
156 * 8 = Reprobe done(IOC COntroller Profile & Service entries)
159 typedef struct ibdm_dp_gidinfo_s
{
162 int gl_reprobe_flag
; /* pass this to taskq */
163 struct ibdm_dp_gidinfo_s
*gl_next
;
164 struct ibdm_dp_gidinfo_s
*gl_prev
;
165 ibdm_iou_info_t
*gl_iou
;
167 ibmf_qp_handle_t gl_qp_hdl
;
168 uint64_t gl_transactionID
;
169 ibdm_timeout_cb_args_t gl_iou_cb_args
;
176 ib_guid_t gl_nodeguid
;
177 ib_guid_t gl_portguid
;
179 boolean_t gl_is_dm_capable
;
180 boolean_t gl_redirected
;
181 uint32_t gl_redirect_dlid
;
182 uint32_t gl_redirect_QP
;
183 ib_pkey_t gl_redirect_pkey
;
184 ib_qkey_t gl_redirect_qkey
;
185 uint64_t gl_redirectGID_hi
;
186 uint64_t gl_redirectGID_lo
;
187 ibmf_handle_t gl_ibmf_hdl
;
188 ibmf_saa_handle_t gl_sa_hdl
;
189 timeout_id_t gl_timeout_id
;
190 ibdm_timeout_cb_args_t gl_cpi_cb_args
;
193 uint32_t gl_resp_timeout
;
195 ibdm_hca_list_t
*gl_hca_list
;
197 uint64_t gl_min_transactionID
;
198 uint64_t gl_max_transactionID
;
199 ibdm_iou_info_t
*gl_prev_iou
;
200 uint16_t gl_devid
; /* device ID info */
201 kcondvar_t gl_probe_cv
; /* sync for Cisco FC GW */
203 uint8_t gl_SL
:4; /* SL from path_record */
204 uint8_t gl_redirectSL
:4; /* SL from redirection */
206 _NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex
,
207 ibdm_dp_gidinfo_s::{gl_state gl_timeout_id gl_pending_cmds
}))
208 _NOTE(SCHEME_PROTECTS_DATA("Serialized access by cv", ibdm_dp_gidinfo_s
))
209 _NOTE(DATA_READABLE_WITHOUT_LOCK(ibdm_dp_gidinfo_s::{gl_ibmf_hdl gl_sa_hdl
}))
210 _NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex
,
211 ibdm_ioc_info_s::{ioc_timeout_id ioc_dc_timeout_id
}))
212 _NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex
,
213 ibdm_srvents_info_s::se_timeout_id
))
216 * The transaction ID for the GID contains of two parts :
217 * 1. Upper 32 bits which is unique for each GID.
218 * 2. Lower 32 bits which is unique for each MAD.
219 * The assumptions are :
220 * 1. At most 2 power 32 DM capable GIDs on the IB fabric
221 * 2. IBDM sends maximum of 2 power 32 MADs to the same DM GID
222 * The limits are sufficient for practical configurations.
224 #define IBDM_GID_TRANSACTIONID_SHIFT ((ulong_t)32)
225 #define IBDM_GID_TRANSACTIONID_MASK 0xFFFFFFFF00000000ULL
227 typedef struct ibdm_s
{
228 /* Protects IBDM's critical data */
230 uint32_t ibdm_hca_count
;
231 kmutex_t ibdm_hl_mutex
;
232 kmutex_t ibdm_ibnex_mutex
;
233 ibdm_hca_list_t
*ibdm_hca_list_head
;
234 ibdm_hca_list_t
*ibdm_hca_list_tail
;
236 ibdm_dp_gidinfo_t
*ibdm_dp_gidlist_head
;
237 ibdm_dp_gidinfo_t
*ibdm_dp_gidlist_tail
;
239 kcondvar_t ibdm_probe_cv
;
240 kcondvar_t ibdm_busy_cv
;
241 kcondvar_t ibdm_port_settle_cv
;
242 uint32_t ibdm_ngid_probes_in_progress
;
243 uint64_t ibdm_transactionID
;
247 ibt_clnt_hdl_t ibdm_ibt_clnt_hdl
;
250 * These are callback routines registered by the IB nexus driver.
251 * These callbacks are used to inform the IB nexus driver about
252 * the arrival/removal of HCA and IOC's
254 ibdm_callback_t ibdm_ibnex_callback
;
256 /* Flag indicating - prev_iou during sweep */
259 _NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_mutex
, ibdm_s::{ibdm_ibt_clnt_hdl
260 ibdm_busy ibdm_state
}))
261 _NOTE(DATA_READABLE_WITHOUT_LOCK(ibdm_s::ibdm_ibt_clnt_hdl
))
262 _NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_hl_mutex
,
263 ibdm_s::{ibdm_hca_list_head ibdm_hca_list_tail
}))
264 _NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_ibnex_mutex
,
265 ibdm_s::ibdm_ibnex_callback
))
266 _NOTE(SCHEME_PROTECTS_DATA("Serialized access by cv", ibdm_s
))
267 _NOTE(LOCK_ORDER(ibdm_s::ibdm_mutex
ibdm_dp_gidinfo_s::gl_mutex
))
269 /* valid values for ibdm_state */
270 #define IBDM_LOCKS_ALLOCED 0x01 /* global locks alloced */
271 #define IBDM_CVS_ALLOCED 0x02 /* global "cv"s alloced */
272 #define IBDM_IBT_ATTACHED 0x04 /* ibt_attach() called */
273 #define IBDM_HCA_ATTACHED 0x08 /* ibdm_handle_hca() called */
275 #define IBDM_8_BIT_MASK 0x00FF
276 #define IBDM_16_BIT_MASK 0xFFFF
277 #define IBDM_RETRY_COUNT 0x2
279 #define IBDM_BUSY 0x1
280 #define IBDM_PROBE_IN_PROGRESS 0x2
281 #define IBDM_CISCO_PROBE 0x4
282 #define IBDM_CISCO_PROBE_DONE 0x8
285 * Device Management MAD packet format
286 * +--------+------------+------------+------------+------------+
287 * | offset | byte 0 | byte 1 | byte 2 | byte 3 |
288 * +--------+------------+------------+------------+------------+ --
290 * +--------+ | sizeof(
291 * | ... | Common MAD Header | ib_mad_hdr_t)
294 * +--------+------------+------------+------------+------------+ --
297 * | ... | RMPP Header | |
300 * +--------+------------+------------+------------+------------+ |
302 * +--------+ Access_Key |
303 * | 40 | | IBDM_DM_MAD_
304 * +--------+------------+------------+------------+------------+ HDR_SZ
305 * | 44 | KeyType | reserved | (B)
306 * +--------+------------+------------+------------+------------+ |
309 * | 52 | Reserved | |
312 * +--------+------------+------------+------------+------------+ |
313 * | 60 | Change_ID | ComponentMask | v
314 * +--------+------------+------------+------------+------------+ --
316 * +--------+ | IBDM_MAD_SIZE
317 * | ... | Device Management Data | - (A) - (B)
320 * +--------+------------+------------+------------+------------+ --
322 #define IBDM_MAD_SIZE 256
323 #define IBDM_DM_MAD_HDR_SZ 40
325 #define IBDM_DFT_TIMEOUT 4
326 #define IBDM_DFT_NRETRIES 3
328 #define IBDM_ENABLE_TASKQ_HANDLING 1
329 #define IBDM_DISABLE_TASKQ_HANLDING 0
331 typedef struct ibdm_saa_event_arg_s
{
332 ibmf_saa_handle_t ibmf_saa_handle
;
333 ibmf_saa_subnet_event_t ibmf_saa_event
;
334 ibmf_saa_event_details_t event_details
;
336 } ibdm_saa_event_arg_t
;
338 #define IBDM_TIMEOUT_VALUE(t) (drv_usectohz(t * 1000000))
340 #define IBDM_OUT_IBMFMSG_MADHDR(msg)\
341 (msg->im_msgbufs_send.im_bufs_mad_hdr)
343 #define IBDM_IN_IBMFMSG_MADHDR(msg)\
344 (msg->im_msgbufs_recv.im_bufs_mad_hdr)
346 #define IBDM_IN_IBMFMSG_STATUS(msg)\
347 b2h16(msg->im_msgbufs_recv.im_bufs_mad_hdr->Status)
349 #define IBDM_IN_IBMFMSG_ATTR(msg)\
350 b2h16(msg->im_msgbufs_recv.im_bufs_mad_hdr->AttributeID)
352 #define IBDM_IN_IBMFMSG_ATTRMOD(msg)\
353 b2h32(msg->im_msgbufs_recv.im_bufs_mad_hdr->AttributeModifier)
355 #define IBDM_IN_IBMFMSG2IOU(msg) (ib_dm_io_unitinfo_t *)\
356 (msg->im_msgbufs_recv.im_bufs_cl_data)
358 #define IBDM_IN_IBMFMSG2IOC(msg) (ib_dm_ioc_ctrl_profile_t *)\
359 (msg->im_msgbufs_recv.im_bufs_cl_data)
361 #define IBDM_IN_IBMFMSG2SRVENT(msg) (ib_dm_srv_t *)\
362 (msg->im_msgbufs_recv.im_bufs_cl_data)
364 #define IBDM_IN_IBMFMSG2DIAGCODE(msg) (uint32_t *)\
365 (msg->im_msgbufs_recv.im_bufs_cl_data)
367 #define IBDM_GIDINFO2IOCINFO(gid_info, idx) \
368 (ibdm_ioc_info_t *)&gid_info->gl_iou->iou_ioc_info[idx];
370 #define IBDM_IS_IOC_NUM_INVALID(ioc_no, gid_info)\
371 ((ioc_no < 1) || (ioc_no >\
372 gid_info->gl_iou->iou_info.iou_num_ctrl_slots))
374 #define IBDM_INVALID_PKEY(pkey) \
375 (((pkey) == IB_PKEY_INVALID_FULL) || \
376 ((pkey) == IB_PKEY_INVALID_LIMITED))
380 void ibdm_dump_mad_hdr(ib_mad_hdr_t
*);
381 void ibdm_dump_ibmf_msg(ibmf_msg_t
*, int);
382 void ibdm_dump_path_info(sa_path_record_t
*);
383 void ibdm_dump_classportinfo(ib_mad_classportinfo_t
*);
384 void ibdm_dump_iounitinfo(ib_dm_io_unitinfo_t
*);
385 void ibdm_dump_ioc_profile(ib_dm_ioc_ctrl_profile_t
*);
386 void ibdm_dump_service_entries(ib_dm_srv_t
*);
387 void ibdm_dump_sweep_fabric_timestamp(int);
389 #define ibdm_dump_mad_hdr(a) ibdm_dump_mad_hdr(a)
390 #define ibdm_dump_ibmf_msg(a, b) ibdm_dump_ibmf_msg(a, b)
391 #define ibdm_dump_path_info(a) ibdm_dump_path_info(a)
392 #define ibdm_dump_classportinfo(a) ibdm_dump_classportinfo(a)
393 #define ibdm_dump_iounitinfo(a) ibdm_dump_iounitinfo(a)
394 #define ibdm_dump_ioc_profile(a) ibdm_dump_ioc_profile(a)
395 #define ibdm_dump_service_entries(a) ibdm_dump_service_entries(a)
399 #define ibdm_dump_mad_hdr(a)
400 #define ibdm_dump_ibmf_msg(a, b)
401 #define ibdm_dump_path_info(a)
402 #define ibdm_dump_classportinfo(a)
403 #define ibdm_dump_iounitinfo(a)
404 #define ibdm_dump_ioc_profile(a)
405 #define ibdm_dump_service_entries(a)
406 #define ibdm_dump_sweep_fabric_timestamp(a)
414 #endif /* _SYS_IB_MGT_IBDM_IBDM_IMPL_H */