1 /* $OpenBSD: qlavar.h,v 1.10 2014/05/17 11:51:21 jmatthew 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 102 SIMPLEQ_ENTRY(qla_ccb) ccb_link; 103 }; 104 105 SIMPLEQ_HEAD(qla_ccb_list, qla_ccb); 106 107 struct qla_dmamem { 108 bus_dmamap_t qdm_map; 109 bus_dma_segment_t qdm_seg; 110 size_t qdm_size; 111 caddr_t qdm_kva; 112 }; 113 #define QLA_DMA_MAP(_qdm) ((_qdm)->qdm_map) 114 #define QLA_DMA_LEN(_qdm) ((_qdm)->qdm_size) 115 #define QLA_DMA_DVA(_qdm) ((u_int64_t)(_qdm)->qdm_map->dm_segs[0].ds_addr) 116 #define QLA_DMA_KVA(_qdm) ((void *)(_qdm)->qdm_kva) 117 118 struct qla_softc { 119 struct device sc_dev; 120 121 bus_space_tag_t sc_iot; 122 bus_space_handle_t sc_ioh; 123 bus_size_t sc_ios; 124 bus_dma_tag_t sc_dmat; 125 126 struct scsi_link sc_link; 127 128 struct scsibus_softc *sc_scsibus; 129 130 enum qla_isp_type sc_isp_type; 131 enum qla_isp_gen sc_isp_gen; 132 int sc_port; 133 int sc_expanded_lun; 134 int sc_fabric; 135 int sc_2k_logins; 136 137 const struct qla_regs *sc_regs; 138 139 int sc_mbox_base; 140 u_int16_t sc_mbox[12]; 141 int sc_mbox_pending; 142 struct mutex sc_mbox_mtx; 143 144 int sc_loop_up; 145 int sc_topology; 146 int sc_loop_id; 147 int sc_port_id; 148 int sc_loop_max_id; 149 u_int64_t sc_sns_port_name; 150 151 struct mutex sc_port_mtx; 152 TAILQ_HEAD(, qla_fc_port) sc_ports; 153 TAILQ_HEAD(, qla_fc_port) sc_ports_new; 154 TAILQ_HEAD(, qla_fc_port) sc_ports_gone; 155 TAILQ_HEAD(, qla_fc_port) sc_ports_found; 156 struct qla_fc_port *sc_targets[QLA_2KL_BUSWIDTH]; 157 158 struct taskq *sc_update_taskq; 159 struct task sc_update_task; 160 int sc_update; 161 int sc_update_tasks; 162 #define QLA_UPDATE_TASK_CLEAR_ALL 0x00000001 163 #define QLA_UPDATE_TASK_SOFTRESET 0x00000002 164 #define QLA_UPDATE_TASK_UPDATE_TOPO 0x00000004 165 #define QLA_UPDATE_TASK_GET_PORT_LIST 0x00000008 166 #define QLA_UPDATE_TASK_PORT_LIST 0x00000010 167 #define QLA_UPDATE_TASK_SCAN_FABRIC 0x00000020 168 #define QLA_UPDATE_TASK_SCANNING_FABRIC 0x00000040 169 #define QLA_UPDATE_TASK_FABRIC_LOGIN 0x00000080 170 #define QLA_UPDATE_TASK_FABRIC_RELOGIN 0x00000100 171 #define QLA_UPDATE_TASK_DETACH_TARGET 0x00000200 172 #define QLA_UPDATE_TASK_ATTACH_TARGET 0x00000400 173 174 int sc_maxcmds; 175 struct qla_dmamem *sc_requests; 176 struct qla_dmamem *sc_responses; 177 struct qla_dmamem *sc_segments; 178 struct qla_dmamem *sc_scratch; 179 struct qla_ccb *sc_ccbs; 180 struct qla_ccb_list sc_ccb_free; 181 struct mutex sc_ccb_mtx; 182 struct mutex sc_queue_mtx; 183 struct scsi_iopool sc_iopool; 184 u_int16_t sc_next_req_id; 185 u_int16_t sc_last_resp_id; 186 int sc_marker_required; 187 188 struct qla_nvram sc_nvram; 189 int sc_nvram_valid; 190 u_int64_t sc_node_name; 191 u_int64_t sc_port_name; 192 }; 193 #define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname) 194 195 int qla_attach(struct qla_softc *); 196 int qla_detach(struct qla_softc *, int); 197 198 int qla_intr(void *); 199