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