xref: /openbsd-src/sys/dev/ic/qlwvar.h (revision 7380a3a4a351f983b5d3883fb573b3d8305f20b9)
1*7380a3a4Skrw /*	$OpenBSD: qlwvar.h,v 1.11 2020/07/22 13:16:04 krw Exp $ */
2c0265cf2Skettenis 
3c0265cf2Skettenis /*
4c0265cf2Skettenis  * Copyright (c) 2013, 2014 Jonathan Matthew <jmatthew@openbsd.org>
5c0265cf2Skettenis  * Copyright (c) 2014 Mark Kettenis <kettenis@openbsd.org>
6c0265cf2Skettenis  *
7c0265cf2Skettenis  * Permission to use, copy, modify, and distribute this software for any
8c0265cf2Skettenis  * purpose with or without fee is hereby granted, provided that the above
9c0265cf2Skettenis  * copyright notice and this permission notice appear in all copies.
10c0265cf2Skettenis  *
11c0265cf2Skettenis  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12c0265cf2Skettenis  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13c0265cf2Skettenis  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14c0265cf2Skettenis  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15c0265cf2Skettenis  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16c0265cf2Skettenis  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17c0265cf2Skettenis  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18c0265cf2Skettenis  */
19c0265cf2Skettenis 
2077bba8c0Skettenis #include <sys/task.h>
21c0265cf2Skettenis 
22c0265cf2Skettenis #define QLW_MAX_TARGETS			16
23c0265cf2Skettenis #define QLW_MAX_LUNS			8
24c0265cf2Skettenis 
25c0265cf2Skettenis /* maximum number of segments allowed for in a single io */
26c0265cf2Skettenis #define QLW_MAX_SEGS			16
27c0265cf2Skettenis 
28c0265cf2Skettenis struct qlw_softc;
29c0265cf2Skettenis 
30c0265cf2Skettenis enum qlw_isp_gen {
31e753b624Skettenis 	QLW_GEN_ISP1000 = 1,
32e753b624Skettenis 	QLW_GEN_ISP1040,
33c0265cf2Skettenis 	QLW_GEN_ISP1080,
34c0265cf2Skettenis 	QLW_GEN_ISP12160,
35c0265cf2Skettenis };
36c0265cf2Skettenis 
37c0265cf2Skettenis enum qlw_isp_type {
38e753b624Skettenis 	QLW_ISP1000 = 1,
39e753b624Skettenis 	QLW_ISP1020,
40fdfcaeaeSkettenis 	QLW_ISP1020A,
41fdfcaeaeSkettenis 	QLW_ISP1040,
42fdfcaeaeSkettenis 	QLW_ISP1040A,
43fdfcaeaeSkettenis 	QLW_ISP1040B,
44fdfcaeaeSkettenis 	QLW_ISP1040C,
45c0265cf2Skettenis 	QLW_ISP1240,
46c0265cf2Skettenis 	QLW_ISP1080,
47c0265cf2Skettenis 	QLW_ISP1280,
48e9591857Skettenis 	QLW_ISP10160,
49c0265cf2Skettenis 	QLW_ISP12160,
50c0265cf2Skettenis };
51c0265cf2Skettenis 
52c0265cf2Skettenis /* request/response queue stuff */
53c0265cf2Skettenis #define QLW_QUEUE_ENTRY_SIZE		64
54c0265cf2Skettenis 
55c0265cf2Skettenis struct qlw_ccb {
56c0265cf2Skettenis 	struct qlw_softc 	*ccb_sc;
57c0265cf2Skettenis 	int			ccb_id;
58c0265cf2Skettenis 	struct scsi_xfer	*ccb_xs;
59c0265cf2Skettenis 
60c0265cf2Skettenis 	bus_dmamap_t		ccb_dmamap;
61c0265cf2Skettenis 
62c0265cf2Skettenis 	SIMPLEQ_ENTRY(qlw_ccb)	ccb_link;
63c0265cf2Skettenis };
64c0265cf2Skettenis 
65c0265cf2Skettenis SIMPLEQ_HEAD(qlw_ccb_list, qlw_ccb);
66c0265cf2Skettenis 
67c0265cf2Skettenis struct qlw_dmamem {
68c0265cf2Skettenis 	bus_dmamap_t		qdm_map;
69c0265cf2Skettenis 	bus_dma_segment_t	qdm_seg;
70c0265cf2Skettenis 	size_t			qdm_size;
71c0265cf2Skettenis 	caddr_t			qdm_kva;
72c0265cf2Skettenis };
73c0265cf2Skettenis #define QLW_DMA_MAP(_qdm)	((_qdm)->qdm_map)
74c0265cf2Skettenis #define QLW_DMA_LEN(_qdm)	((_qdm)->qdm_size)
75c0265cf2Skettenis #define QLW_DMA_DVA(_qdm)	((u_int64_t)(_qdm)->qdm_map->dm_segs[0].ds_addr)
76c0265cf2Skettenis #define QLW_DMA_KVA(_qdm)	((void *)(_qdm)->qdm_kva)
77c0265cf2Skettenis 
78c0265cf2Skettenis struct qlw_target {
79c0265cf2Skettenis 	u_int16_t		qt_params;
80c0265cf2Skettenis 	u_int8_t		qt_exec_throttle;
81c0265cf2Skettenis 	u_int8_t		qt_sync_period;
82c0265cf2Skettenis 	u_int8_t		qt_sync_offset;
83c0265cf2Skettenis };
84c0265cf2Skettenis 
85c0265cf2Skettenis struct qlw_softc {
86c0265cf2Skettenis 	struct device		sc_dev;
87c0265cf2Skettenis 
881d0a0664Skettenis 	int			sc_flags;
891d0a0664Skettenis #define QLW_FLAG_INITIATOR	0x0001
901d0a0664Skettenis 
91c0265cf2Skettenis 	bus_space_tag_t		sc_iot;
92c0265cf2Skettenis 	bus_space_handle_t	sc_ioh;
93c0265cf2Skettenis 	bus_size_t		sc_ios;
94c0265cf2Skettenis 	bus_dma_tag_t		sc_dmat;
95c0265cf2Skettenis 
96c0265cf2Skettenis 	struct scsibus_softc	*sc_scsibus[2];
97c0265cf2Skettenis 	int			sc_running;
98c0265cf2Skettenis 
99c0265cf2Skettenis 	enum qlw_isp_type	sc_isp_type;
100c0265cf2Skettenis 	enum qlw_isp_gen	sc_isp_gen;
101c0265cf2Skettenis 	const u_int16_t		*sc_firmware;
102c0265cf2Skettenis 	int			sc_numbusses;
103c0265cf2Skettenis 	int			sc_clock;
104c0265cf2Skettenis 
105e753b624Skettenis 	int			sc_host_cmd_ctrl;
106e753b624Skettenis 	int			sc_mbox_base;
107c0265cf2Skettenis 	u_int16_t		sc_mbox[8];
108c0265cf2Skettenis 	int			sc_mbox_pending;
109c0265cf2Skettenis 
11051fb3575Skettenis 	int			sc_maxrequests;
111c0265cf2Skettenis 	struct qlw_dmamem	*sc_requests;
11251fb3575Skettenis 	int			sc_maxresponses;
113c0265cf2Skettenis 	struct qlw_dmamem	*sc_responses;
11492d24382Skettenis 	int			sc_maxccbs;
115c0265cf2Skettenis 	struct qlw_ccb		*sc_ccbs;
116c0265cf2Skettenis 	struct qlw_ccb_list	sc_ccb_free;
117c0265cf2Skettenis 	struct mutex		sc_ccb_mtx;
118c0265cf2Skettenis 	struct mutex		sc_queue_mtx;
119c0265cf2Skettenis 	struct scsi_iopool	sc_iopool;
120c0265cf2Skettenis 	u_int16_t		sc_next_req_id;
121c0265cf2Skettenis 	u_int16_t		sc_last_resp_id;
122c0265cf2Skettenis 	int			sc_marker_required[2];
12377bba8c0Skettenis 	u_int			sc_update_required[2];
12477bba8c0Skettenis 	struct task		sc_update_task;
125c0265cf2Skettenis 
126c0265cf2Skettenis 	struct qlw_nvram	sc_nvram;
127c0265cf2Skettenis 	int			sc_nvram_size;
128c0265cf2Skettenis 	int			sc_nvram_minversion;
129c0265cf2Skettenis 
130fdfcaeaeSkettenis 	u_int16_t		sc_isp_config;
131d28ac15bSkettenis 	u_int16_t		sc_fw_features;
132fdfcaeaeSkettenis 
13342de16feSkettenis 	u_int8_t		sc_initiator[2];
134c0265cf2Skettenis 	u_int8_t		sc_retry_count[2];
135c0265cf2Skettenis 	u_int8_t		sc_retry_delay[2];
136c0265cf2Skettenis 	u_int8_t		sc_reset_delay[2];
137d28ac15bSkettenis 	u_int8_t		sc_tag_age_limit[2];
138c0265cf2Skettenis 	u_int16_t		sc_selection_timeout[2];
139c0265cf2Skettenis 	u_int16_t		sc_max_queue_depth[2];
140c0265cf2Skettenis 	u_int8_t		sc_async_data_setup[2];
141c0265cf2Skettenis 	u_int8_t		sc_req_ack_active_neg[2];
142c0265cf2Skettenis 	u_int8_t		sc_data_line_active_neg[2];
143c0265cf2Skettenis 	struct qlw_target	sc_target[2][QLW_MAX_TARGETS];
144c0265cf2Skettenis };
145c0265cf2Skettenis #define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname)
146c0265cf2Skettenis 
147c0265cf2Skettenis int	qlw_attach(struct qlw_softc *);
148c0265cf2Skettenis int	qlw_detach(struct qlw_softc *, int);
149c0265cf2Skettenis 
150c0265cf2Skettenis int	qlw_intr(void *);
151