1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_FC_FCAIF_H
27 #define	_FC_FCAIF_H
28 
29 
30 #include <sys/note.h>
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Version for FCA vectors
38  */
39 #define	FCTL_FCA_MODREV_1	1
40 #define	FCTL_FCA_MODREV_2	2
41 #define	FCTL_FCA_MODREV_3	3
42 #define	FCTL_FCA_MODREV_4	4
43 #define	FCTL_FCA_MODREV_5	5
44 
45 /*
46  * State change codes
47  */
48 #define	FC_SC_OFFLINE		0
49 #define	FC_SC_ONLINE		1
50 
51 /*
52  * pm_cmd_flag definitions
53  */
54 #define	FC_FCA_PM_NOP		0x00
55 #define	FC_FCA_PM_READ		0x01
56 #define	FC_FCA_PM_WRITE		0x02
57 #define	FC_FCA_PM_RW		(FC_FCA_PM_READ | FC_FCA_PM_WRITE)
58 
59 /*
60  *  Command codes for fca_reset()
61  */
62 #define	FC_FCA_LINK_RESET	0x01
63 #define	FC_FCA_CORE		0x02
64 #define	FC_FCA_RESET_CORE	0x03
65 #define	FC_FCA_RESET		0x04
66 
67 /*
68  * fca_port_manage() command codes
69  */
70 #define	FC_PORT_BYPASS		0x01
71 #define	FC_PORT_UNBYPASS	0x02
72 #define	FC_PORT_DIAG		0x03
73 #define	FC_PORT_ERR_STATS	0x04
74 #define	FC_PORT_GET_FW_REV	0x05
75 #define	FC_PORT_GET_FCODE_REV	0x06
76 #define	FC_PORT_GET_DUMP_SIZE	0x07
77 #define	FC_PORT_FORCE_DUMP	0x08
78 #define	FC_PORT_GET_DUMP	0x09
79 #define	FC_PORT_LOOPBACK	0x0A
80 #define	FC_PORT_LINK_STATE	0x0B
81 #define	FC_PORT_INITIALIZE	0x0C
82 #define	FC_PORT_DOWNLOAD_FW	0x0D
83 #define	FC_PORT_RLS		0x0E
84 #define	FC_PORT_DOWNLOAD_FCODE	0x0F
85 #define	FC_PORT_GET_NODE_ID	0x10
86 #define	FC_PORT_SET_NODE_ID	0x11
87 #define	FC_PORT_GET_P2P_INFO	0x12
88 
89 /*
90  * FCA capability strings
91  */
92 #define	FC_NODE_WWN			"FCA node WWN"
93 #define	FC_LOGIN_PARAMS			"FCA login parameters"
94 #define	FC_CAP_UNSOL_BUF		"number of unsolicited bufs"
95 #define	FC_CAP_PAYLOAD_SIZE		"exchange payload max"
96 #define	FC_CAP_POST_RESET_BEHAVIOR	"port reset behavior"
97 #define	FC_CAP_NOSTREAM_ON_UNALIGN_BUF	"no dma streaming on unaligned buf"
98 #define	FC_CAP_FCP_DMA			"FCP cmd response in DVMA space"
99 
100 typedef struct fc_fca_bind {
101 	int 			port_num;
102 	opaque_t 		port_handle;
103 	void (*port_statec_cb) (opaque_t port_handle, uint32_t state);
104 	void (*port_unsol_cb) (opaque_t port_handle,
105 		fc_unsol_buf_t *buf, uint32_t type);
106 	la_wwn_t		port_nwwn;	/* virtual port pwwn */
107 	la_wwn_t		port_pwwn;	/* virtual port nwwn */
108 	int			port_npiv;	/* virtual port flag */
109 } fc_fca_bind_info_t;
110 
111 typedef struct fc_fca_rnid {
112 	int		status;
113 	fc_rnid_t	params;
114 }fc_fca_rnid_t;
115 
116 typedef struct fc_fca_port_info {
117 	uchar_t			pi_topology;	/* Unused */
118 	uint32_t		pi_error;
119 	uint32_t		pi_port_state;
120 	fc_portid_t		pi_s_id;	/* Unused */
121 	fc_hardaddr_t		pi_hard_addr;	/* Hard address */
122 	la_els_logi_t		pi_login_params;
123 	fc_fca_rnid_t		pi_rnid_params;
124 	fca_port_attrs_t	pi_attrs;
125 } fc_fca_port_info_t;
126 
127 typedef struct fc_fca_pm {
128 	uint32_t	pm_cmd_code;	/* port manage command */
129 	uint32_t	pm_cmd_flags;	/* READ/WRITE */
130 	size_t		pm_cmd_len;	/* cmd buffer length */
131 	caddr_t		pm_cmd_buf;	/* cmd buffer */
132 	size_t		pm_data_len;	/* data buffer length */
133 	caddr_t		pm_data_buf;	/* data buffer */
134 	size_t		pm_stat_len;	/* status buffer length */
135 	caddr_t		pm_stat_buf;	/* status buffer */
136 } fc_fca_pm_t;
137 
138 typedef struct fc_fca_p2p_info {
139 	uint32_t	fca_d_id;	/* HBA port D_ID */
140 	uint32_t	d_id;		/* Remote port D_ID */
141 	la_wwn_t	pwwn;		/* Remote port PWWN */
142 	la_wwn_t	nwwn;		/* Remote port NWWN */
143 } fc_fca_p2p_info_t;
144 
145 typedef struct fca_tran {
146 	int				fca_version;
147 	int				fca_numports;
148 	int				fca_pkt_size;
149 	uint32_t			fca_cmd_max;
150 	ddi_dma_lim_t			*fca_dma_lim;
151 	ddi_iblock_cookie_t		*fca_iblock;
152 	ddi_dma_attr_t			*fca_dma_attr;
153 	ddi_dma_attr_t			*fca_dma_fcp_cmd_attr;
154 	ddi_dma_attr_t			*fca_dma_fcp_rsp_attr;
155 	ddi_dma_attr_t			*fca_dma_fcp_data_attr;
156 	ddi_dma_attr_t			*fca_dma_fcip_cmd_attr;
157 	ddi_dma_attr_t			*fca_dma_fcip_rsp_attr;
158 	ddi_dma_attr_t			*fca_dma_fcsm_cmd_attr;
159 	ddi_dma_attr_t			*fca_dma_fcsm_rsp_attr;
160 	ddi_device_acc_attr_t		*fca_acc_attr;
161 	int				fca_num_npivports;
162 		/* number of virtual ports supported, 0 means unsupported */
163 	la_wwn_t			fca_perm_pwwn;
164 		/* permanent port wwn for the port */
165 
166 	opaque_t (*fca_bind_port) (dev_info_t *dip,
167 	    fc_fca_port_info_t *port_info, fc_fca_bind_info_t *bind_info);
168 
169 	void (*fca_unbind_port) (opaque_t fca_handle);
170 
171 	int (*fca_init_pkt) (opaque_t fca_handle, fc_packet_t *pkt, int sleep);
172 
173 	int (*fca_un_init_pkt) (opaque_t fca_handle, fc_packet_t *pkt);
174 
175 	int (*fca_els_send) (opaque_t fca_handle, fc_packet_t *pkt);
176 
177 	int (*fca_get_cap) (opaque_t fca_handle, char *cap, void *ptr);
178 
179 	int (*fca_set_cap) (opaque_t fca_handle, char *cap, void *ptr);
180 
181 	int (*fca_getmap) (opaque_t fca_handle, fc_lilpmap_t *map);
182 
183 	int (*fca_transport) (opaque_t fca_handle, fc_packet_t *pkt);
184 
185 	int (*fca_ub_alloc) (opaque_t fca_handle, uint64_t *tokens,
186 	    uint32_t ub_size, uint32_t *ub_count, uint32_t type);
187 
188 	int (*fca_ub_free) (opaque_t fca_handle, uint32_t count,
189 	    uint64_t tokens[]);
190 
191 	int (*fca_ub_release) (opaque_t fca_handle, uint32_t count,
192 	    uint64_t tokens[]);
193 
194 	int (*fca_abort) (opaque_t fca_handle, fc_packet_t *pkt, int flags);
195 
196 	int (*fca_reset) (opaque_t fca_handle, uint32_t cmd);
197 
198 	int (*fca_port_manage) (opaque_t fca_port, fc_fca_pm_t *arg);
199 
200 	opaque_t (*fca_get_device) (opaque_t fca_port, fc_portid_t d_id);
201 
202 	int (*fca_notify) (opaque_t fca_handle, uint32_t cmd);
203 
204 } fc_fca_tran_t;
205 
206 void fc_fca_init(struct dev_ops *fca_devops_p);
207 int fc_fca_attach(dev_info_t *, fc_fca_tran_t *);
208 int fc_fca_detach(dev_info_t *fca_dip);
209 int fc_fca_update_errors(fc_packet_t *pkt);
210 int fc_fca_error(int fc_errno, char **errmsg);
211 int fc_fca_pkt_error(fc_packet_t *pkt, char **state, char **reason,
212     char **action, char **expln);
213 
214 #if	!defined(__lint)
215 _NOTE(SCHEME_PROTECTS_DATA("unique per fca_bind", fc_fca_port_info))
216 _NOTE(SCHEME_PROTECTS_DATA("unique per fca_bind", fc_fca_bind))
217 _NOTE(SCHEME_PROTECTS_DATA("stable data", fca_tran))
218 #endif /* __lint */
219 
220 #ifdef	__cplusplus
221 }
222 #endif
223 
224 #endif	/* _FC_FCAIF_H */
225