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