xref: /openbsd/sys/dev/ic/qlavar.h (revision 7380a3a4)
1 /*	$OpenBSD: qlavar.h,v 1.12 2020/07/22 13:16:04 krw Exp $ */
2 
3 /*
4  * Copyright (c) 2013, 2014 Jonathan Matthew <jmatthew@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/task.h>
20 
21 #define QLA_DEFAULT_PORT_NAME		0x400000007F000003ULL /* from isp(4) */
22 
23 #define QLA_WAIT_FOR_LOOP		10
24 
25 /* maximum number of segments allowed for in a single io */
26 #define QLA_MAX_SEGS			16
27 
28 struct qla_softc;
29 
30 enum qla_isp_gen {
31 	QLA_GEN_ISP2100 = 1,
32 	QLA_GEN_ISP2200,
33 	QLA_GEN_ISP23XX,
34 };
35 
36 enum qla_isp_type {
37 	QLA_ISP2100 = 1,
38 	QLA_ISP2200,
39 	QLA_ISP2300,
40 	QLA_ISP2312,
41 	QLA_ISP2322
42 };
43 
44 struct qla_regs {
45 	u_int16_t	(*read)(struct qla_softc *, bus_size_t);
46 	int		(*read_isr)(struct qla_softc *,
47 			    u_int16_t *, u_int16_t *);
48 
49 	bus_size_t	req_in;
50 	bus_size_t	req_out;
51 	bus_size_t	res_in;
52 	bus_size_t	res_out;
53 };
54 
55 /* port database things */
56 #define QLA_SCRATCH_SIZE		0x1000
57 
58 enum qla_port_disp {
59 	QLA_PORT_DISP_NEW,
60 	QLA_PORT_DISP_GONE,
61 	QLA_PORT_DISP_SAME,
62 	QLA_PORT_DISP_CHANGED,
63 	QLA_PORT_DISP_MOVED,
64 	QLA_PORT_DISP_DUP
65 };
66 
67 #define QLA_LOCATION_LOOP		(1 << 24)
68 #define QLA_LOCATION_FABRIC		(2 << 24)
69 #define QLA_LOCATION_LOOP_ID(l)		(l | QLA_LOCATION_LOOP)
70 #define QLA_LOCATION_PORT_ID(p)		(p | QLA_LOCATION_FABRIC)
71 
72 struct qla_fc_port {
73 	TAILQ_ENTRY(qla_fc_port) ports;
74 	TAILQ_ENTRY(qla_fc_port) update;
75 
76 	u_int64_t	node_name;
77 	u_int64_t	port_name;
78 	u_int32_t	location;	/* port id or loop id */
79 
80 	int		flags;
81 #define QLA_PORT_FLAG_IS_TARGET		1
82 #define QLA_PORT_FLAG_NEEDS_LOGIN	2
83 
84 	u_int32_t	portid;
85 	u_int16_t	loopid;
86 };
87 
88 
89 /* request/response queue stuff */
90 #define QLA_QUEUE_ENTRY_SIZE		64
91 
92 struct qla_ccb {
93 	struct qla_softc 	*ccb_sc;
94 	int			ccb_id;
95 	struct scsi_xfer	*ccb_xs;
96 
97 	bus_dmamap_t		ccb_dmamap;
98 
99 	struct qla_iocb_seg	*ccb_t4segs;
100 	u_int64_t		ccb_seg_offset;
101 	u_int64_t		ccb_seg_dva;
102 
103 	SIMPLEQ_ENTRY(qla_ccb)	ccb_link;
104 };
105 
106 SIMPLEQ_HEAD(qla_ccb_list, qla_ccb);
107 
108 struct qla_dmamem {
109 	bus_dmamap_t		qdm_map;
110 	bus_dma_segment_t	qdm_seg;
111 	size_t			qdm_size;
112 	caddr_t			qdm_kva;
113 };
114 #define QLA_DMA_MAP(_qdm)	((_qdm)->qdm_map)
115 #define QLA_DMA_LEN(_qdm)	((_qdm)->qdm_size)
116 #define QLA_DMA_DVA(_qdm)	((u_int64_t)(_qdm)->qdm_map->dm_segs[0].ds_addr)
117 #define QLA_DMA_KVA(_qdm)	((void *)(_qdm)->qdm_kva)
118 
119 struct qla_softc {
120 	struct device		sc_dev;
121 
122 	bus_space_tag_t		sc_iot;
123 	bus_space_handle_t	sc_ioh;
124 	bus_size_t		sc_ios;
125 	bus_dma_tag_t		sc_dmat;
126 
127 	struct scsibus_softc	*sc_scsibus;
128 
129 	enum qla_isp_type	sc_isp_type;
130 	enum qla_isp_gen	sc_isp_gen;
131 	int			sc_port;
132 	int			sc_expanded_lun;
133 	int			sc_fabric;
134 	int			sc_2k_logins;
135 
136 	const struct qla_regs	*sc_regs;
137 
138 	int			sc_mbox_base;
139 	u_int16_t		sc_mbox[12];
140 	int			sc_mbox_pending;
141 	struct mutex		sc_mbox_mtx;
142 
143 	int			sc_loop_up;
144 	int			sc_topology;
145 	int			sc_loop_id;
146 	int			sc_port_id;
147 	int			sc_loop_max_id;
148 	u_int64_t		sc_sns_port_name;
149 
150 	struct mutex		sc_port_mtx;
151 	TAILQ_HEAD(, qla_fc_port) sc_ports;
152 	TAILQ_HEAD(, qla_fc_port) sc_ports_new;
153 	TAILQ_HEAD(, qla_fc_port) sc_ports_gone;
154 	TAILQ_HEAD(, qla_fc_port) sc_ports_found;
155 	struct qla_fc_port	*sc_targets[QLA_2KL_BUSWIDTH];
156 
157 	struct taskq		*sc_update_taskq;
158 	struct task		sc_update_task;
159 	int			sc_update;
160 	int			sc_update_tasks;
161 #define QLA_UPDATE_TASK_CLEAR_ALL	0x00000001
162 #define QLA_UPDATE_TASK_SOFTRESET	0x00000002
163 #define QLA_UPDATE_TASK_UPDATE_TOPO	0x00000004
164 #define QLA_UPDATE_TASK_GET_PORT_LIST	0x00000008
165 #define QLA_UPDATE_TASK_PORT_LIST	0x00000010
166 #define QLA_UPDATE_TASK_SCAN_FABRIC	0x00000020
167 #define QLA_UPDATE_TASK_SCANNING_FABRIC	0x00000040
168 #define QLA_UPDATE_TASK_FABRIC_LOGIN	0x00000080
169 #define QLA_UPDATE_TASK_FABRIC_RELOGIN	0x00000100
170 #define QLA_UPDATE_TASK_DETACH_TARGET	0x00000200
171 #define QLA_UPDATE_TASK_ATTACH_TARGET	0x00000400
172 
173 	int			sc_maxcmds;
174 	struct qla_dmamem	*sc_requests;
175 	struct qla_dmamem	*sc_responses;
176 	struct qla_dmamem	*sc_segments;
177 	struct qla_dmamem	*sc_scratch;
178 	struct qla_ccb		*sc_ccbs;
179 	struct qla_ccb_list	sc_ccb_free;
180 	struct mutex		sc_ccb_mtx;
181 	struct mutex		sc_queue_mtx;
182 	struct scsi_iopool	sc_iopool;
183 	u_int16_t		sc_next_req_id;
184 	u_int16_t		sc_last_resp_id;
185 	int			sc_marker_required;
186 
187 	struct qla_nvram	sc_nvram;
188 	int			sc_nvram_valid;
189 	u_int64_t		sc_node_name;
190 	u_int64_t		sc_port_name;
191 };
192 #define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname)
193 
194 int	qla_attach(struct qla_softc *);
195 int	qla_detach(struct qla_softc *, int);
196 
197 int	qla_intr(void *);
198